重复使用远程 ssh 连接并减少命令/会话日志的详细程度?

重复使用远程 ssh 连接并减少命令/会话日志的详细程度?

我有许多系统依赖于应用程序级镜像到辅助服务器。辅助服务器通过在主服务器上执行一系列远程 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参数。

相关内容