it-swarm-ja.com

特定のユーザーのauth.logでSudo PAMメッセージを停止する方法は?

私は自分の環境を監視するためにZabbixを使用しており、zabbix_agentdはユーザーとして実行されますzabbix 60秒ごとに1つのカスタムスクリプト。 Sudoを使用して、このスクリプトをrootとして実行します。

/var/log/auth.logでは60秒ごとに表示されます:

Aug 11 17:40:32 my-server Sudo: pam_unix(Sudo:session): session opened for user root by (uid=0)
Aug 11 17:40:32 my-server Sudo: pam_unix(Sudo:session): session closed for user root

このメッセージがログに殺到するのを防ぎたいのですが。次の行を/etc/pam.d/Sudoファイルのsession required pam_unix.soの直前に追加しました。

session [success=1 default=ignore] pam_succeed_if.so service in Sudo quiet uid = 0

そしてメッセージは消えた。

しかし問題は、誰かがSudorootとしてスクリプトを実行しているときに、すべてのPAMメッセージを抑制したことです。

ユーザーzabbix(他のすべてのユーザーではない)に対してのみメッセージを停止します。 Sudoは、zabbixユーザーがroot特権でスクリプトを実行したいことを知っており、PAMにそれを伝える方法はありますか? Sudoを使用するときに、特定のユーザーのログを記録しないようにPAMに指示するにはどうすればよいですか?

:syslogのメッセージをフィルタリングしてみました。これは機能しますが、上記と同じ問題があります。つまり、どのユーザーがrootになっているのかをログメッセージが示していないため、無差別すぎます。

16
inivanoff1

あなたはあなたのPAM conf行にかなり近いようです:

session [success=1 default=ignore] pam_succeed_if.so service in Sudo quiet uid = 0

pam_succeed_ifのマニュアルページを見て、要求しているユーザー(ruser)がzabbixであることをテストしたいと思います。

だから私はお勧めします:

session [success=1 default=ignore] pam_succeed_if.so quiet uid = 0 ruser = zabbix

これにより、ユーザーzabbixrootになったときに次のテストが抑制されます(他の遷移はありません)。私は自分のユーザーのペアでこれをテストしました。

Rootだけでなく、zabbixがユーザーにならないようにする場合は、上記のuid = 0テストを削除してください。

service in Sudoテストを削除しました。この行が/etc/pam.d/Sudoにあるとすると、冗長です。

11
Toby Speight

Tobyの回答に基づいて、Debian/Ubuntuでこれを少し異なる方法で構成する方法を見つけました。コンテキストについては、以下を参照してください。

Debian/Ubuntuにはこのpam-auth-updateコマンドがあり、/etc/pam.d/Sudoを見ると次のようになります。

#%PAM-1.0

@include common-auth
@include common-account
@include common-session-noninteractive

そして/etc/pam.d/common-session-noninteractiveは次のようになります:

#
# /etc/pam.d/common-session-noninteractive - session-related modules
# common to all non-interactive services
#
# This file is included from other service-specific PAM config files,
# and should contain a list of modules that define tasks to be performed
# at the start and end of all non-interactive sessions.
#
# As of pam 1.0.1-6, this file is managed by pam-auth-update by default.
# To take advantage of this, it is recommended that you configure any
# local modules either before or after the default block, and use
# pam-auth-update to manage selection of other modules.  See
# pam-auth-update(8) for details.

# here are the per-package modules (the "Primary" block)
session [default=1]         pam_permit.so
# here's the fallback if no module succeeds
session requisite           pam_deny.so
# prime the stack with a positive return value if there isn't one already;
# this avoids us returning an error just because nothing sets a success code
# since the modules above will each just jump around
session required            pam_permit.so
# and here are more per-package modules (the "Additional" block)
session required    pam_unix.so
# end of pam-auth-update config

確かに、私は上記のファイルのいずれかを編集することができますが、明らかに、ここには「より高い能力」が働いています。 pamルールを追加する可能性のある他のパッケージで、Niceを変更する方法を教えてください。さらに、このように2つの/etc/pam.d/Sudoの間に@includeを1行追加することはできないようです。

##### THIS DIDN'T WORK :( ######
@include common-auth
@include common-account
session [default=ignore] pam_succeed_if.so quiet_success service = Sudo uid = 0 ruser = myappuser
@include common-session-noninteractive

上記のリンクと他の例(/usr/share/pam-configs/unixを参照)を読んだ後、これを/usr/share/pam-configs/myappで思いついた:

# Don't log "session opened" messages for myapp user
# See: https://wiki.ubuntu.com/PAMConfigFrameworkSpec
#      https://manpages.debian.org/stretch/libpam-modules/pam_succeed_if.8.en.html
Name: myapp disable session logging
Default: yes
Priority: 300
Session-Type: Additional
Session:
    [default=ignore] pam_succeed_if.so quiet_success service = Sudo uid = 0 ruser = myappuser

SessionSession-Typeはどのファイルを編集するかを制御し、Priorityはファイルの順序を定義します。そのファイルを追加してpam-auth-updateを実行すると、/etc/pam.d/common-session-noninteractiveは次のようになりますこれ(下部):

#... omitted
session required            pam_permit.so
# and here are more per-package modules (the "Additional" block)
session [default=ignore] pam_succeed_if.so quiet_success service = Sudo uid = 0 ruser = myappuser
session required pam_unix.so 
# end of pam-auth-update config

...これは、pam_succeed_if行がsession required pam_unix.soの前にある必要があるためです。 (この行は/use/share/pam-configs/unixからのものであり、Priority: 256があるため、2番目に終わります。)service = Sudoは他の構成にも含まれている可能性があるため、common-session-noninteractive述語を残したことにも注意してください。 Sudo以外にも。

私の場合、コードはすでに.debインストーラーとしてパッケージ化しているので、/usr/share/pam-configs/myappファイルを追加し、postinstおよびprermスクリプトにpam-auth-update --packageを追加しました。行ってよかった!

警告...

上記でリンクしたPAMConfigFrameworkSpecの記事 を読んだ場合、Session-Interactive-Onlyオプションが定義されていますが、非対話型ルールのみを指定する方法はありません。したがって、/etc/pam.d/common-session更新されました。これを回避する方法はないと思います。そのユーザーの対話型セッションがログに記録されていなくても問題ない場合(ISサービスアカウントですよね?)

おまけ:Sudoログ出力も削除する方法

PAMが発行するsession openened|closed行に加えて、Sudoは実行されたコマンドに関する追加情報を記録します。次のようになります。

[user] : TTY=unknown ; PWD=... ; USER=root ; COMMAND=...

またそれを削除したい場合は、このリンクを開いて、以下に進んでください...

ですから、いくつかのアクションにスーパーユーザー特権を必要とするサービスアカウントに対して、次のような典型的な/etc/sudoers.d/___設定に慣れていると思います。

myuser ALL=(ALL) NOPASSWD: /bin/ping

/etc/sudoers.d/10_myuserになる可能性があります。まあ、とりわけ Defaults を指定することもできます。特にこの構文'Defaults' ':' User_Listに注意してください

次に、 SUDOERS OPTIONSセクション を見てください。興味深いビットには、log_inputlog_outputが含まれますが、(おそらく)より重要なのは、sysloglogfileです。最近のバージョンのDebianでは、デフォルトでrsyslogまたはSudostdoutまたはstderrにログを記録しているようです。したがって、私にとっては、これは私のサービスのジャーナルログに表示されていました。 /var/log/auth.logの場合、アプリケーションログに混入しません。 Sudoログを削除するために、次のように/etc/sudoers.d/10_myuserに追加しました。

Defaults:myuser !logfile, !syslog
myuser ALL=(ALL) NOPASSWD: /bin/ping

YMMV、ロギングを無効にするとセキュリティ監査で問題が発生すると思われる場合は、rsyslogフィルターを使用してこれを解決することもできます。

4
thom_nic

かなり恐ろしいテストと調査の結果、Debian Stretch(Raspberry)の実用的な解決策を見つけました。 OPが求めることを達成する方法は確かに複数あります。しかし、PAMのドキュメントは圧倒的であるため、ほとんどのものは実際にはTL; DRです。

  1. rsyslogのカスタム文字列フィルターを次のように追加できます:/etc/rsyslog.d/anyname.conf
    :msg, contains, "session opened for user root by pi" stop
  2. /etc/pam.d/Sudoを直接編集できます
  3. 次の場所にカスタムPAM構成ファイルを作成することにより、正しい方法で行うことができます:/usr/share/pam-configs/
  4. カスタムsudoersファイルを/etc/sudoers.d/020_piに作成することで、いくつかを実行できます。

(2)と(4)の方法を紹介します。

[〜#〜]警告[〜#〜]

/etc/pam.d/内のファイルを編集する場合は、最初にファイルの書き込み権限を変更しないでください。そうしないと、間違えた場合、将来Sudo/sを使用できなくなる可能性があります。したがって、元に戻す前に、新しい設定をテストしたことを確認してください。 (デフォルトは644


「セッションのオープン/クローズ」を取り除くには:

次の/var/log/auth.logスパムを削除したい:

May 10 11:28:03 xxx Sudo[26437]: pam_unix(Sudo:session): session opened for user root by (uid=0)
May 10 11:28:07 xxx Sudo[26437]: pam_unix(Sudo:session): session closed for user root

これを行う:

# Sudo chmod 666 /etc/pam.d/Sudo
# Sudo cat /etc/pam.d/Sudo

#%PAM-1.0

@include common-auth
@include common-account
session [success=1 default=ignore] pam_succeed_if.so quiet_success uid = 0 ruser = pi
@include common-session-noninteractive

ここで非常に重要なのは、成功した場合、success=1は次の1句(またはPAMの用語では「スタック内の次のモジュールにジャンプする」)をスキップすることです。

man pam.confから:

ignore-モジュールのスタックで使用した場合、モジュールの戻りステータスは、アプリケーションが取得する戻りコードには影響しません。

done-モジュールスタックを終了し、PAMがすぐにアプリケーションに戻るという副作用のあるokと同等です。

[〜#〜] n [〜#〜]-スタック内の次のN個のモジュールを飛び越すという副作用があるokと同等です。

次に、再起動し、数時間実行して(たとえば、cronジョブを確認するため)、これが機能することをテストします。次に、ファイルのアクセス許可を元に戻します。そうしないと、システムに大きなセキュリティホールができます。 (Sudo chmod 644 /etc/pam.d/Sudo


繰り返される「TTY PWD COMMAND」メッセージを取り除くには:

次のようなメッセージも削除したいと思います。

May 11 18:23:20 xxx Sudo:       pi : TTY=unknown ; PWD=... ; USER=root ; COMMAND=/usr/bin/arp-scan -q -l

私の場合、これは数分ごとにarp-scan実行されていたIDSスクリプトによって生成されました。ログに表示されないようにするには、次のファイルを作成します。

# Sudo nano /etc/sudoers.d/020_pi
# Sudo cat /etc/sudoers.d/020_pi

Defaults:pi     !logfile, !syslog
pi xxx = (root) NOPASSWD: /usr/bin/arp-scan

(ここでxxxはマシン名、piはユーザー名です。)

2
not2qubit