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


16

我正在使用Zabbix监视环境,并每60秒zabbix_agentd以用户身份执行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

注意:我尝试过滤syslog中的消息。尽管这有效,但是它具有与上述相同的问题,即它太乱了,因为日志消息没有指出哪个用户正在成为root用户。


它支持过滤,并且可以过滤。我尝试过,但是我不喜欢它,因为过滤不是通用的方法。有一天,消息中的某些字符将更改,或者某些内容将更改,并且我的过滤器将失败。我正在寻找具有配置参数,指令或类似内容的解决方案,以确保在所有情况下都将停止该解决方案。消息说session closed for user root,如果我过滤了它,实际上是在过滤所有消息。我想要消息中未提及的特定用户,因此无法按名称过滤...
inivanoff1 2015年

Answers:


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

uid = 0如果您想对zabbix成为任何用户(而不只是root用户)保持沉默,请删除上述测试。

我删除了service in sudo测试:鉴于此行位于中,因此是多余的/etc/pam.d/sudo


1
谢谢!那就是我要找的东西。完善!并且感谢您提出删除建议service in sudo
inivanoff1 2015年

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/sudo在两者之间添加一行@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: 256因此第二结束。)另请注意,我离开了service = sudo谓词,因为common-session-noninteractive也可能是包含在除此之外其它CONFIGS sudo

就我而言,我已经打包我的代码作为一个.deb安装,所以我加入了/usr/share/pam-configs/myapp文件,并添加pam-auth-update --package到我postinstprerm剧本,我好去!

警告...

如果您阅读我上面链接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或sudo登录到stdoutstderr默认为。因此,对我而言,这显示在我的服务的日志日志中,而不是例如/var/log/auth.log不会混入我的应用程序日志的地方。为了删除sudo日志记录,我向其中添加了以下内容/etc/sudoers.d/10_myuser

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

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


您实现“会话打开/关闭”的方式对我不起作用。有两个原因:(1)您未指定使用success=1,(将跳过下一个子句),以及(2)由于您指定的方式service = sudo,任何正在运行的CRON作业都会导致requirement "service = sudo" not met by user "root"。(可能还有其他副作用。)但是,您的Bonus效果很好!谢谢。
not2qubit

postinstprerm脚本的外观如何?
not2qubit

@ not2qubit回复:success=1-我不想pam_unix完全跳过。我只想停止记录输出,而这[default=ignore]似乎无需跳过pam_unix就可以了。
thom_nic

re:cronjobs和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立即返回应用程序的副作用。

N- 相当于可以跳过堆栈中的下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

就我而言,这是由每隔几分钟运行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 - 那你就不必设置危险权限和风险忘记改变回来了。
thom_nic

@thom_nic你测试过了吗?我的猜测是,如果您不小心阻止了PAM中sudo / su的使用,那么无论您做什么,即使在root shell中也将产生错误。如果不是,则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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.