我有许多系统依赖于应用程序级镜像到辅助服务器。辅助服务器通过在主服务器上执行一系列远程 SSH 命令来提取数据。应用程序有点像黑匣子,我可能无法对所使用的脚本进行修改。
我的问题是 /var/log/secure 中的日志绝对充斥着来自服务用户的请求。admin
这些命令每秒发生多次,并对日志产生相应的影响。它们依赖于无密码密钥交换。涉及的操作系统是 EL5 和 EL6。示例如下。
- 有什么方法可以减少这些操作的日志记录量。(按用户?按来源?)
- 有没有一种更简洁的方法让开发人员执行这些 ssh 操作,而不会产生那么多会话?似乎效率低下。我可以重用现有的连接吗?
日志输出示例:
Jul 24 19:08:54 Cantaloupe sshd[46367]: pam_unix(sshd:session): session closed for user admin
Jul 24 19:08:54 Cantaloupe sshd[46446]: Accepted publickey for admin from 172.30.27.32 port 33526 ssh2
Jul 24 19:08:54 Cantaloupe sshd[46446]: pam_unix(sshd:session): session opened for user admin by (uid=0)
Jul 24 19:08:54 Cantaloupe sshd[46446]: pam_unix(sshd:session): session closed for user admin
Jul 24 19:08:54 Cantaloupe sshd[46475]: Accepted publickey for admin from 172.30.27.32 port 33527 ssh2
Jul 24 19:08:54 Cantaloupe sshd[46475]: pam_unix(sshd:session): session opened for user admin by (uid=0)
Jul 24 19:08:54 Cantaloupe sshd[46475]: pam_unix(sshd:session): session closed for user admin
Jul 24 19:08:54 Cantaloupe sshd[46504]: Accepted publickey for admin from 172.30.27.32 port 33528 ssh2
Jul 24 19:08:54 Cantaloupe sshd[46504]: pam_unix(sshd:session): session opened for user admin by (uid=0)
Jul 24 19:08:54 Cantaloupe sshd[46504]: pam_unix(sshd:session): session closed for user admin
Jul 24 19:08:54 Cantaloupe sshd[46583]: Accepted publickey for admin from 172.30.27.32 port 33529 ssh2
Jul 24 19:08:54 Cantaloupe sshd[46583]: pam_unix(sshd:session): session opened for user admin by (uid=0)
Jul 24 19:08:54 Cantaloupe sshd[46583]: pam_unix(sshd:session): session closed for user admin
Jul 24 19:08:54 Cantaloupe sshd[46612]: Accepted publickey for admin from 172.30.27.32 port 33530 ssh2
Jul 24 19:08:54 Cantaloupe sshd[46612]: pam_unix(sshd:session): session opened for user admin by (uid=0)
Jul 24 19:08:54 Cantaloupe sshd[46612]: pam_unix(sshd:session): session closed for user admin
Jul 24 19:08:55 Cantaloupe sshd[46641]: Accepted publickey for admin from 172.30.27.32 port 33531 ssh2
Jul 24 19:08:55 Cantaloupe sshd[46641]: pam_unix(sshd:session): session opened for user admin by (uid=0)
Jul 24 19:08:55 Cantaloupe sshd[46641]: pam_unix(sshd:session): session closed for user admin
Jul 24 19:08:55 Cantaloupe sshd[46720]: Accepted publickey for admin from 172.30.27.32 port 33532 ssh2
Jul 24 19:08:55 Cantaloupe sshd[46720]: pam_unix(sshd:session): session opened for user admin by (uid=0)
Jul 24 19:08:55 Cantaloupe sshd[46720]: pam_unix(sshd:session): session closed for user admin
Jul 24 19:08:55 Cantaloupe sshd[46749]: Accepted publickey for admin from 172.30.27.32 port 33533 ssh2
Jul 24 19:08:55 Cantaloupe sshd[46749]: pam_unix(sshd:session): session opened for user admin by (uid=0)
Jul 24 19:08:55 Cantaloupe sshd[46749]: pam_unix(sshd:session): session closed for user admin
Jul 24 19:08:55 Cantaloupe sshd[46778]: Accepted publickey for admin from 172.30.27.32 port 33534 ssh2
Jul 24 19:08:55 Cantaloupe sshd[46778]: pam_unix(sshd:session): session opened for user admin by (uid=0)
Jul 24 19:08:55 Cantaloupe sshd[46778]: pam_unix(sshd:session): session closed for user admin
Jul 24 19:08:55 Cantaloupe sshd[46857]: Accepted publickey for admin from 172.30.27.32 port 33535 ssh2
答案1
具体回答关于是否有可能减少生成更多 SSH 连接的开销的问题:是的。您可以使用自 OpenSSH 5.5 以来提供的 ControlMaster 功能。这篇博客文章将有更多详细信息:http://puppetlabs.com/blog/speed-up-ssh-by-reusing-connections
我不确定这是否会影响日志记录的数量。但是,根据应用程序的编写方式,可能无需实际修改应用程序即可使用此功能,只需重新配置 OpenSSH。假设它甚至使用 OpenSSH 作为客户端,或使用具有此支持的其他客户端。这里没有足够的信息来确定。
答案2
由于你正在使用 rsyslog,你可以选择筛选消息很容易。丢弃消息的一个基本示例如下:
#/etc/rsyslog.cof
# this is original log file including all authpriv messages regarding admin
authpriv.* /var/log/secure.admin
# These rules filter the remote key based logins for admin
:msg, contains, "Accepted publickey for admin from 172.30.27.32" ~
:msg, contains, "session opened for user admin" ~
:msg, contains, "session closed for user admin" ~
authpriv.* /var/log/secure
波浪号~
是丢弃包含前一个字符串的消息的指令。
稍微更高级和更好的语法(未经测试)是:
if $syslogfacility-text == 'authpriv' and
($msg contains 'for user admin' or $msg contains 'publickey for admin from 172.30.27.32')
then /var/log/secure.admin
if $syslogfacility-text == 'authpriv' and not
($msg contains 'for user admin' or $msg contains 'publickey for admin from 172.30.27.32')
then /var/log/secure
每个 if 语句占一行。
答案3
关于此事的更新...
我已经在 RHEL/CentOS EL6 系统上通过启用 SSH ControlMaster 功能解决了这个问题:
在连接主机的/home/username/.ssh/config
文件上:
Host *
ControlMaster auto
ControlPath ~/.ssh/sockets/%r@%h-%p
#ControlPersist 600
该~/.ssh/sockets/
目录需要手动创建。
该ControlPersist
指令是一个持久性功能,尚未移植到 EL6 中的 OpenSSH。我希望如此,因为如果没有它,一旦初始连接终止,多路复用连接就会终止。
我用一种快速而肮脏的方法规避了这个问题监控连接主机上的脚本。
check process ssh-control
matching "MNn"
start program = "/usr/bin/ssh -MNn destination" as uid username
stop program = "/usr/bin/pkill -u username ssh"
我连接的系统在哪里以及应用程序复制系统的服务帐户在哪里(行政在这种情况下)。
用于ssh -M
主模式和 SSH 连接共享。
-M 将 ssh 客户端置于“主”模式以进行连接共享。多个 -M 选项将 ssh 置于“主”模式,并在接受从属连接之前需要确认。
这一切的结果是清理日志...并且复制服务器发起的一系列 ssh 命令都重用了主连接创建的打开套接字。
一旦此功能进入 EL6 OpenSSH 包,我将能够摆脱 Monit 脚本并只使用该ControlPersist
参数。