重复使用远程SSH连接并减less命令/会话日志冗长?

我有许多依赖于应用程序级镜像到辅助服务器的系统。 辅助服务器通过在主服务器上执行的一系列远程SSH命令来提取数据。 该应用程序是一个黑盒子,我可能无法修改所使用的脚本。

我的问题是,/ var / log / secure中的日志logging绝对是来自服务用户admin请求。 这些命令每秒发生多次,并对日志产生相应的影响。 他们依靠密码更less的密钥交换。 涉及的操作系统是EL5和EL6。 下面的例子。

  • 有什么办法可以减less这些操作的日志logging量。 (按用户?按来源?)
  • 有没有一种更清洁的方式让开发人员执行这些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 

具体回答是否有可能减less产生更多SSH连接的开销:是的。 您可以使用自OpenSSH 5.5以来提供的ControlMasterfunction。 这个博客文章将有更多的细节: http : //puppetlabs.com/blog/speed-up-ssh-by-reusing-connections

我不确定这是否会影响logging的发生。 但是,根据应用程序的编写方式,可以在不实际修改应用程序的情况下使用此function,只需重新configurationOpenSSH即可。 假设它甚至使用OpenSSH作为客户端,或使用此支持的其他客户端。 这里没有足够的信息来确认。

既然你使用的是rsyslog,你可以select很容易地过滤消息。 丢弃消息的基本示例是:

 #/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 

代字号~是丢弃包含前一个string的消息的指令。

稍微更高级和更好的语法(未经testing)是:

 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语句都在一行中。

这个更新…

我已经通过启用SSH ControlMasterfunction在RHEL / CentOS EL6系统上解决了这个问题:

在连接主机的/home/username/.ssh/config文件中:

 Host * ControlMaster auto ControlPath ~/.ssh/sockets/%r@%h-%p #ControlPersist 600 

需要手动创build~/.ssh/sockets/目录。

ControlPersist指令是一个持久性function, 没有被反向移植到EL6中的OpenSSH中 。 我希望它,因为没有它,多路复用连接终止,一旦初始连接死亡。

我已经在连接主机上用一个快速而又脏兮兮的Monit脚本来规避这个问题。

 check process ssh-control matching "MNn" start program = "/usr/bin/ssh -MNn destination" as uid username stop program = "/usr/bin/pkill -u username ssh" 

我要连接的系统在哪里,并且是应用程序复制系统的服务帐户(在这种情况下是admin )。

ssh -M用于主模式和SSH连接共享。

-M将SSH客户端设置为“主”模式进行连接共享。 多个-M选项将ssh置于“主”模式,并在从属连接被接受之前进行确认。

所有这些的结果是干净的日志 …并且由复制服务器启动的ssh命令乱七八糟,都重复使用由主连接创build的开放套接字。

一旦这个特性进入EL6 OpenSSH包,我将能够摆脱Monit脚本,并使用ControlPersist参数。