Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 
当前位置 :首页 ->Linux技术 ->系统管理 ->正文

SSH进阶(一):编写批量和自动执行的脚本

来源:Linux-cn.com 作者:Webmaster 时间:2007-05-05 点击: [收藏] [投稿]

  SSH是传统的telnet的一个替代,它不但是一个很好的交互工具,而且可以用来完成其它复杂的工作,以及和其它应用程序协同工作。本文将介绍一些SSH高级应用。

简介

  SSH除了能够执行平常的交互操作外,还可以用来自动地执行一些脚本和自动任务,为这些任务提供优秀的安全保护。不过要做到这些有一个最大的障碍,就是客户的认证:在无人输入的情况下,如何获得用户的认证信息(用户名和密码)?这里,我们将讨论如何实现ssh的非交互认证。

  注意任何非交互认证都存在安全问题,即使SSH也不例外,因此一定要慎重考虑。在无人参与的情况下,认证所需的凭证(例如:密码)都要放在主机的某个地方,这样只要攻击者获得了主机的root权限,就可以访问保存在主机上的所有认证凭证。总之,在在选择使用的方法之前,你一定要权衡每种实现方式的优、缺点。选择危害较请的实现方法。如果你不想降低系统的安全性,那就不要使用批量和定时的远程作业。

1.密码认证

  这种认证方式的安全系数是最底的。因为为了使用密码认证,你必需把密码潜入到要执行的脚本或者放到一个脚本能够读到的文件中。无论你采取什么措施,具有脚本读权限的任何人都会获得密码。因此,我们不建议使用这种技术,相对来说,选择公开密钥认证要安全的多。

2.公开密钥认证

  在公开密钥认证中,私钥是客户的认证凭证。因此,脚本需要访问这个密钥,必须保存在脚本能够访问到的地方。保存密钥的地方可以有三个选择,后面我们将会分别讨论:

  • 把加密后的密钥和访问这个密钥的口令保存到文件系统。
  • 把明文(未加密的)私钥保存到文件系统,因此不需要口令的保护。
  • 使用ssh代理管理密钥,这种方式比直接保存到文件系统要安全一些,只是在系统启动时需要人工解密这个密钥。

2.1.在文件系统中保存口令加密过的密钥

  这种保存方式是在文件系统中保存加密的密钥和访问这个密钥的口令。不过,我们不建议使用这种方式,因为它并不比直接保存明文密钥更安全,它们的安全性都依赖于对文件系统的保护。而且,如果使用这种方式还比较麻烦。

2.2.保存明文密钥(私钥)

  使用这种保存方式不需要密钥的口令。用户可以使用OpenSSH套件的ssh-keygen命令产生新的私钥和维护原由的私钥。在ssh-genkey提示输入私钥的保护口令时,就可以产生一个明文保存的私钥;另外使用ssh-genkey -p命令可以去掉私钥的保护口令。然后,你可以使用ssh命令的-i选项指定私钥文件的位置,或者在客户配置文件中使用IdentityFile关键词指定私钥文件的位置。

  明文密钥不太安全的,相当于把密码放到帐户的一个文件中。不适合交互登录的情况下采用这种密钥保存方式,而使用SSH代理管理密钥可以更安全一些。不过,对于自动登录,这种方式还是可以使用的。从安全角度看,以上三种情况:明文密钥、使用口令加密的密钥和密钥的安全性是一样的。但是,有三个理由使我们采用明文密钥的认证方式:

  • 在服务器端,使用公开密钥认证更有利于帐户的管理,尤其是在建立批量作业时。
  • 公开密钥认证不会被恶意服务器窃取认证机密。

  从一个程序向SSH提供一个密码比较困难。SSH不是从标准输入获得用户的密码,它是直接从与用户进行交互的控制终端获得密码。为了在应用程序和SSH之间传递密码,你需要使用一个伪终端和SSH进行交互(例如:使用expect等工具)。

  明文密钥还是比较让人担心的。攻击者只要突破文件系统的保护,就可以获得他需要的东西。因此,我们建议使用下面的认证方式。

2.3.使用代理(agent)管理密钥

  在ssh套件中,ssh-agent程序能够提供更为安全的密钥管理。用户只要运行一个代理(详细用法请参考ssh-agent的手册页)并从一个口令保护的文件中加载需要的密钥,然后就可以使用这个长期运行的代理进行认证了。

  在这种情况下,密钥也是以明文保存的,不过不是在磁盘的文件上,而是在内存空间。从实际攻击的角度看,从一个进程的内存空间提取某个数据结构比获得一个文件的访问权要困难的多。

  使用这种认证方式,虽然使攻击者难以通过突破文件系统的保护获得密钥,但是仍然存在其它的安全隐患。ssh-agent程序提供了一个UNIX-DOMAIN套接字用于和应用程序之间的通讯,而这个套接字看起来就是一个文件系统的节点。可以读写这个套接字的任何人都能够迫使代理发出认证请求,从而获得密钥的使用权。不过,出现这种情况的危害不是很大,因为攻击者无法通过这种攻击凡是获得用户的私钥,只能在代理运行期间使用私钥。

  虽然使用私钥代理可以提高系统的安全性,但是使用这种方式有一些不便,如果系统重启,所有的批量和定时作业都将无法进行,直到有人输入了保护私钥的口令,从文件中把私钥加载到代理中。为了提高系统的安全性,这点代价还是值得的。

  在使用私钥代理来提供认证时,还有一点麻烦就是需要使应用程序能够发现私钥代理。SSH客户程序需要SSH_AU_SOCK环境变量来寻找和私钥代理通讯的套接字。当启动一个提供认证服务的私钥代理时,你应该记录下它的输出,以便导出相关环境变量。例如:如果作业是一个shell脚本,你可以把输出保存到一个文件中:

[nixe0n@localhost nixe0n]$ssh-agent |head -2>~/agent-info
[nixe0n@localhost nixe0n]$cat ~/agent-info
SSH_AUTH_SOCK=/tmp/ssh-XXsAV98A/agent.738; export SSH_AUTH_SOCK;
SSH_AGENT_PID=739; export SSH_AGENT_PID;

  你可以把需要的密钥加载给代理:

[nixe0n@localhost nixe0n]source ~/agent-info <--从上面产生的文件中导出环境变量
[nixe0n@localhost nixe0n]ssh-add batch-key <--假设你已经使用ssh-keygen命令产生了一对保存在~/batch-key目录下的密钥
Need passphrase for batch-key
Enter passhrase for nixe0n@localhost <--输入私钥保护口令

  然后,你可以把上面的脚本嵌入到自己的脚本中,导出需要的环境变量,例如:

#!/bin/bash
# Source the agent-info file to get access to our ssh-agent.
agent = ~/agent-info
if [-r $agent] then

 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<



上一篇:SSH进阶(二):FTP转发   下一篇:Apache完全安装指南

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章
Power by linux-cn.com 粤ICP备05006655号