我使用 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
然后消息就消失了。
但问题是就是这样,当有人使用sudo
as执行脚本时,我抑制了每条 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 上以稍微不同的方式进行配置的方法。有关上下文,请参阅:
- https://manpages.debian.org/stretch/libpam-runtime/pam-auth-update.8.en.html
- https://wiki.ubuntu.com/PAMConfigFrameworkSpec
所以 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
Session
并Session-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|closed
PAM 发出的行之外,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_input
,log_output
但(可能)更重要的是,syslog
和logfile
。在我看来,在最新版本的 Debian 中,默认情况下要么是 rsyslog,要么是sudo
log 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 文档非常多,因此大多数内容都非常长。
- 您可以添加自定义字符串过滤器系统日志 在:
/etc/rsyslog.d/anyname.conf
通过使用:
:msg, contains, "session opened for user root by pi" stop
- 可以直接编辑
/etc/pam.d/sudo
- 您可以通过在以下位置创建自定义 PAM 配置文件来以正确的方式完成此操作:
/usr/share/pam-configs/
- 您可以通过创建自定义来完成一些操作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)
在你的日志中。