如何停止特定用户的 auth.log 中的 sudo PAM 消息?

如何停止特定用户的 auth.log 中的 sudo PAM 消息?

我使用 Zabbix 来监控我的环境,并zabbix_agentd以用户身份每 60 秒执行zabbix一个自定义脚本;它用于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

然后消息就消失了。

但问题是就是这样,当有人使用sudoas执行脚本时,我抑制了每条 PAM 消息root

我只想为用户zabbix(而不是所有其他用户)停止该消息。sudo知道zabbix用户想要以特权执行脚本root,有什么方法可以告诉 PAM 吗?如何告诉 PAM 在使用时不要为特定用户登录sudo

笔记:我尝试过滤系统日志中的消息;虽然这可行,但它有与上面相同的问题,即它太不加区别,因为日志消息没有表明哪个用户正在成为 root。

答案1

您似乎与 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(但没有其他转换)时,这将抑制下一个测试。我已经与我自己的一对用户对此进行了测试。

uid = 0如果您不想zabbix成为任何用户(而不仅仅是 root 用户),请删除上面的测试。

我删除了service in sudo测试:鉴于此行位于/etc/pam.d/sudo.

答案2

根据 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/sudo在两个 s 之间添加一行。@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并具有 a Priority: 256,因此它最终位于第二位。)另请注意,我留下了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 选项部分。有趣的部分包括log_inputlog_output但(可能)更重要的是,sysloglogfile。在我看来,在最新版本的 Debian 中,默认情况下要么是 rsyslog,要么是sudolog tostdout或log。stderr所以对我来说,这显示在我的服务的日志日志中,而不是例如/var/log/auth.log它不会混合到我的应用程序日志中的地方。为了删除 sudo 日志记录,我添加了以下内容,/etc/sudoers.d/10_myuser如下所示:

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

YMMV,如果您觉得禁用日志记录会导致安全审核出现问题,您也可以尝试通过 rsyslog 过滤器来解决此问题。

答案3

经过大量可怕的测试和研究后,我找到了 Debian Stretch(在 Raspberry 上)的可行解决方案。肯定有不止一种方法可以实现 OP 的要求。但是 PAM 文档非常多,因此大多数内容都非常长。

  1. 您可以添加自定义字符串过滤器系统日志 在:/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/在未首先更改其全局写入权限的情况下,请勿编辑任何文件。如果您不这样做并且犯了错误,您可能会被禁止在以后使用须藤/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

忽略 - 当与模块堆栈一起使用时,模块的返回状态不会影响应用程序获取的返回代码。

完毕 - 相当于 ok,但具有终止模块堆栈和 PAM 立即返回应用程序的副作用。

- 相当于 ok,但具有跳过堆栈中接下来的 N 个模块的副作用。

接下来,重新启动并让它运行几个小时(例如检查 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

就我而言,这是由正在运行的 IDS 脚本生成的arp 扫描每隔几分钟。要将其从日志中删除,请创建以下文件:

# 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是用户名。)

答案4

你会得到:

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)

在你的日志中。

相关内容