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


16

環境を監視するためにZabbixを使用しておりzabbix_agentd、ユーザーとしてzabbix60秒ごとに1つのカスタムスクリプトを実行しています。sudoこのスクリプトをとして実行するために使用しますroot

では/var/log/auth.logI 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

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

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

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

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


フィルタリングをサポートし、フィルタリングを使用すると動作します。私はそれを試しましたが、フィルタリングは普遍的な方法ではないため、私はそれが好きではありません。ある日、メッセージ内の一部の文字が変更されるか、何かが変更され、フィルターが失敗します。すべての場合でこれが停止することを確認するために、構成パラメーター、ディレクティブ、または同様のものを使用してソリューションを検索しています。そして、メッセージにはsession closed for user root、実際にフィルタリングすると、すべてのメッセージがフィルタリングされます。私は、メッセージに記載されていない特定のユーザーのためにしたいと私はその名前でフィルタリングすることができません...
inivanoff1

回答:


11

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

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

rootだけでなく、ユーザーになることuid = 0について静かにしたい場合は、上記のテストを削除しますzabbix

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


1
ありがとうございました!それが私が探しているものです。パーフェクト!そして、削除する提案をありがとうservice in sudo
inivanoff1

1
[user] : TTY=unknown ; PWD=... ; USER=root ; COMMAND=...ログから行も削除したい場合は、これをsudoers.d /ファイルに追加できます:(必要に応じてDefaults:[user] !logfile, !syslog置き換え[user]ます)
-thom_nic

@thom_nicそのファイルへのパスは何ですか?
not2qubit

任意のファイル/etc/sudoers.d/-これが適用されるユーザー、グループ、またはアプリケーションの名前を使用することを好みます。sudo.ws/man/1.8.15/sudoers.man.html
thom_nic

@thom_nic回答としてこれをもう少し拡張して投稿してください。上記で提案した形式が表示されません。さらに、私はそこにあるとは思わない:。そして、logfiles明示的または何か置き換える必要がありますか?
-not2qubit

3

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ルールを追加したいかもしれない他のパッケージでうまく動作するように私の変更を取得する方法は?さらに、このように/etc/pam.d/sudo2つ@includeの間に行を追加することはできないように思えました。

##### 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: 2562番目になります。)また、他の構成にも含まれservice = sudoているcommon-session-noninteractive可能性があるため、述語を残したことに注意してくださいsudo

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

警告...

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

ボーナス:sudoログ出力も削除する方法

session openened|closedPAMが発行する行に加えて、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またはsudolog to stdoutまたはstderrデフォルトでログインしているように見えます。だから私にとっては、これは私のサービスのjournaldログに表示されていたのであり、例えば/var/log/auth.logアプリケーションログに混入しない場所ではありませんでした。sudoロギングを削除するには、次のように追加して、次の/etc/sudoers.d/10_myuserようにします。

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

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


「セッションを開いた/閉じた」ものを実装した方法は、私にとってはうまくいきませんでした。次の2つの理由があります。(1)を使用するように指定しなかったsuccess=1(次の句をスキップする)、および(2)指定した方法のためservice = sudo、実行中のCRONジョブはすべてになりrequirement "service = sudo" not met by user "root"ます。(そして、おそらく他の副作用も。)しかし、あなたのボーナスのものは素晴らしく機能しました!ありがとうございました。
not2qubit

どのようにあなたのんpostinstprermスクリプトが見えますか?
-not2qubit

@ not2qubit re:success=1- pam_unix完全にスキップしたくない。[default=ignore]pam_unixをスキップせずにうまくいくように見える出力のロギングを停止したいだけです。
thom_nic

re:cronjobs and service = sudo:cronジョブが非特権ユーザーとして実行されている可能性はありますsudoが、cronジョブの一部として呼び出していませんか?
thom_nic

2

かなりの恐ろしいテストと研究の後、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 / suの使用をロックアウトできます。したがって、設定を元に戻す前に、新しい設定をテストしたことを確認してください。(デフォルトは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

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

行って -すぐにモジュールスタックと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、ユーザー名です。)


1
> /etc/pam.d/内のファイルを編集するときは、最初にワールド書き込み許可を変更してsudo su - ください。代わりに、rootとして別のターミナルセッションを実行することを強くお勧めします。戻ってきた。
thom_nic

@thom_nicこれをテストしましたか?私の推測では、PAMでsudo / suの使用を誤ってブロックすると、ルートシェルであっても、何をしてもエラーが発生します。そうでない場合、PAMはおそらく正常に機能していません。
not2qubit

-2

あなたが取得します:

pam_succeed_if(sudo:session): unknown attribute "ruser"

あなたの答えで。

#%PAM-1.0

@include common-auth
@include common-account
@include common-session-noninteractive
session     [success=1 default=ignore] pam_succeed_if.so service in zabbix quiet use_uid
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid

動作しますが、まだ取得できます:

pam_unix(sudo:session): session opened for user root by (uid=0)

あなたのログに。


1
以下を指定してください:1.編集中のファイル、2。「あなた」とは何か、そしてそれが解決するもの。
not2qubit
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.