Ton*_*ski 6 ssh pam systemd wtmp
我有一个监控服务器 (\xe2\x80\x98ClusterControl\xe2\x80\x99),它使用常规用户帐户使用\xe2\x80\x98interactive shell\xe2\x80\x99登录并运行一些 sudo 维护命令。
\n该帐户似乎每分钟通过 SSH 密钥(无密码)登录 4 次。
\n、/var/log/wtmp和充满了数千个登录和 sudo 条目/var/log/auth.log。/var/log/syslog
出现三个问题:
\n系统日志审核失败,因为/var/log/syslog如果不通过各种grep过滤器来屏蔽登录条目,则无法使用它。
系统盘空间不足。这些文件的/var/log/wtmp大小很快就会变得非常大,并导致严重的存储空间问题/var/log/auth.log。/var/log/syslog
帐户last审核命令有效地遇到拒绝服务,因为它变得不可用,因为服务帐户用户名被记录并显示数千次,并且其他帐户登录无法看到。
如何排除该用户帐户被记录?
\nsystemd [success=ok default=1] pam_succeed_if.so user in usernamePS 我已经尝试按照某些文章的指示在文件夹中的各种 pam 文件中添加 PAM 条目,/etc/pam.d但它没有起作用。
I\xe2\x80\x99m 不确定要使用哪个文件以及正确的语法应该是什么。
\n/var/log/syslog在日志行开头显示 \xe2\x80\x98systemd\xe2\x80\x99 记录的 ssh 用户名登录。
服务器是Ubuntu 18.04
\nClusterControl在登录时运行交互式 shell,如公司\xe2\x80\x99s 系统支持工程师之一在此处的博客文章中所述。然而,他们的建议仅仅是启用更频繁的日志轮换。ssh -t
有2个选择。
使用rsyslog 过滤器是迄今为止最快的解决方案,但不如使用PAM全面。
在rsyslog默认配置文件的顶部,添加您想要过滤的关键字和过滤器命令。在这种情况下,过滤器命令是删除(' ~')。
$ vi /etc/rsyslog.d/50-default.conf
:msg, contains, "clustercontrol" ~
:msg, contains, "pam_unix(sudo:session): session closed for user root" ~
:msg, contains, "Removed session" ~
Run Code Online (Sandbox Code Playgroud)
虽然我设法阻止每天在syslog&中记录数千条日志auth.log,但似乎没有办法停止将服务帐户 SSH 登录从 clustercontrol 记录到/var/log/wtmp和/var/log/lastlog文件。
为此,我们使用logrotate(见下文)。
即使是全局设置noupdate或nowtmp指令pam_lastlog.so,对我的系统也没有影响,所以我只是确保使用下面的 logrotate 配置定期压缩和旋转这些日志。
以下配置将每月或每 200Mb 轮换一次日志,以先到者为准。日志将被压缩并保留最多 12 个月:
$ vi /etc/logrotate.conf
# no packages own wtmp, or btmp -- we'll rotate them here
/var/log/wtmp {
missingok
monthly
create 0664 root utmp
rotate 12
size 200M
compress
}
/var/log/btmp {
missingok
monthly
create 0660 root utmp
rotate 12
size 200M
compress
}
Run Code Online (Sandbox Code Playgroud)
了解正在发生的情况的第一步是启用调试消息。问题是,在我的 Ubuntu 18.04 上,pam 调试消息没有被记录 - 直到我明确告诉rsyslog使用哪个文件来记录调试消息:
$ vi /etc/rsyslog.d/50-default.conf
*.debug /var/log/debug.log
$ service rsyslog restart
Run Code Online (Sandbox Code Playgroud)
这是我们将用来使用 pam 编写条件测试的 pam 模块。该文档有点不完整、干燥,并且对于规则如何工作以及所有指令的作用不是很详细。读了十几篇文章后,我整理出以下内容:
在里面/var/log/auth.log您将看到我们希望为此用户帐户停止的日志消息:
3 月 17 日 13:05:27 dev1 sshd[18833]:pam_unix(sshd:session):为用户 clustercontrol 打开的会话 (uid=0)
3 月 17 日 13:04:25 dev1 sudo: pam_unix(sudo:session): clustercontrol(uid=0) 为用户 root 打开会话
从上面的日志我们可以看出pam_unix.so是执行日志记录的 pam 身份验证模块。它由两个单独的服务sshd和sudo调用。
pam类型令牌告诉 pam 该模块将使用什么类型的身份验证。在这种情况下,会话是在用户经过身份验证之前和/或之后应该完成的事情。
pam_unix.so因此,让我们在系统配置中找到负责这些日志的 pam 模块。
$ cd /etc/pam.d
$ grep 'pam_unix.so' * -in
common-account:17:account [success=1 new_authtok_reqd=done default=ignore] pam_unix.so
common-auth:17:auth [success=1 default=ignore] pam_unix.so nullok_secure
common-password:25:password [success=1 default=ignore] pam_unix.so obscure sha512
common-session:29:session required pam_unix.so
common-session-noninteractive:30:session required pam_unix.so
runuser:5:session required pam_unix.so
Run Code Online (Sandbox Code Playgroud)
从上面,我们可以看到pam_unix.so':session' 模块位于文件的第#29common-session行。
在/etc/pam.d/sshd中找到包含该文件的行,并在其前面common-session添加自定义pam_succeed_if.so语句。
现在对/etc/pam.d/ sudo文件执行几乎完全相同的操作,但这里我们的自定义规则语法略有不同。
pam_unix.so在从文件运行规则之前@include common-session,我们放置pam_succeed.so模块规则。
$ grep -in include /etc/pam.d/sshd
5:@include common-auth
15:@include common-account
29:@include common-session
32:# This includes a dynamically generated part from /run/motd.dynamic
56:@include common-password
Run Code Online (Sandbox Code Playgroud)
在我们的例子中是第 29 行。
$ vi /etc/pam.d/sshd +29
session [success=done default=ignore] pam_succeed_if.so quiet service in sshd user = clustercontrol
# Standard Un*x session setup and teardown.
@include common-session
Run Code Online (Sandbox Code Playgroud)
如果我们从后到前阅读规则会更容易:
我们检查名为clustercontrol ( )的用户是否通过sshd ( )user = clustercontrol进行身份验证,然后该规则匹配,然后我们运行指令 ( ),这使得日志记录变得安静。service in sshdquiet
这部分[success=done 意味着,如果您获得与此规则的匹配,我们将done跳过处理下一个规则,或跳过pam 堆栈中的下一个规则。
这有效地停止了该用户的 sshd 日志记录。
为此,我将第 6行添加到/etc/pam.d/sudo:
$ vi /etc/pam.d/sudo
:set number
1 #%PAM-1.0
2
3 session required pam_env.so readenv=1 user_readenv=0
4 session required pam_env.so readenv=1 envfile=/etc/default/locale user_readenv=0
5
6 session [success=done default=ignore] pam_succeed_if.so quiet uid = 0 ruser = clustercontrol
7 @include common-auth
8 @include common-account
9 @include common-session-noninteractive
Run Code Online (Sandbox Code Playgroud)
会话 [成功 = 完成默认 = 忽略] pam_succeed_if.so 安静 uid = 0 ruser = clustercontrol
我们的语法在这里有点不同。Sudo 通常以root用户身份运行命令(除非特殊指令另有说明)。在类 Unix 系统上,用户是0。
因此,我们的自定义规则是说,如果sudo命令由远程用户 ( ruser )在 uid 0 的用户上下文中运行,在我们的例子中是clustercontrol,那么请安静地进行日志记录,我们就完成了,然后再跳过会话身份验证类型的用户的规则。
注意:
不要忘记注释掉/etc/rsyslog.d/50-default.conf中的* .debug行并使用 重新启动服务。$ service rsyslog restart
| 归档时间: |
|
| 查看次数: |
4909 次 |
| 最近记录: |