sshd服务器程序
sshd服务器程序的任务是监听ssh client的网络连接请求、管理验证事宜并执行客户端请求命令。它的主要配置文件位于/etc/ssh/sshd_config,此外还有一些存放密钥的特殊文件,这些密钥用于证实自己的身份,也用于加密通讯内容。每台主机,不管是服务器还是客户端,都要拥有自己的专用密钥。
OpenSSH包随附的ssh-keygen工具,可用来随机产生一组密钥。通常在安装Linux系统时,安装程序应该会自动产生一组主机密钥,并存放于/etc/ssh/ssh_host_key。Secure Shell以主机密钥来识别机器身份,所以,通常不应该随意改变主机密钥,除非你非常明确你自己在做什么。
密钥的长度至少要超过512bits。ssh-keygen默认产生的密钥长度为1024bits,而且大多数人使用默认长度。使用SSH Version 2 协议时,你“可能”产生RSA与DSA key,不过,更有可能的情况是系统安装时早已为你自动产生好了。如果有任何理由需要重新产生自己的主机密钥,参考以下命令:
#ssh-keygen -t rsa1 -f /etc/ssh/ssh_host_key -N ""
#ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ""
#ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key -N ""
如果省略-N选项,ssh-keygen会提示你输入一个“密码短语”(passphrase)。使用密码短语时,表示密钥文件内容会被加密,而解密的关键就是“密码短语”本身。你可以将“密码短语”想象成钥匙盒的钥匙。主机密钥文件本身不应该以密码短语保护,因为每当sshd需要使用主机密钥时,都要你输入“密码短语”才可以解开密钥文件。很显然地,你不可能随时在计算机帮,等待sshd提示你输入密码短语。
RSA-1 key用于SSH protocol Version 1,DSA和RSA key用于SSH protocol Version 2。建议你尽可能使用SSH protocol Version 2,因为SSH protocol Version 1的设计有缺陷,有可能遭受“中间人”(man-in-the-middle)攻击,而且RSA-1 key也被证明可以在合理时间内被破解。
每组密钥由一对公钥(public key)和私钥(private key)组成。执行ssh-keygen命令后,它会将私钥存放在-f选项所指定的文件中,将公钥存放在同主文件名,但扩展名为.pub的文件中。
准备好密钥后,下一步是让sshd知道去哪里找你产生的密钥、应该如何验证客户端身份,是否要转接X11通信等。OppenSSH的功能相当多,配置文件里的选项也很多。但对于一般应用,默认值应该足以应付了。
ssh客户端
ssh客户端不多介绍了,主配置的文件为/etc/ssh/ssh_config。可以自己创建个人home目录下的.ssh/ssh_config文件,它的优先级高于/etc/ssh/ssh_config。
远程主机的/etc/ssh/ssh_config文件应当与你的设定一致,否则就失去意义了,所以我们还是保持默认设定。
我们已经可以为每台主机生成一组代表自己身份的密钥。用户也可以用相同的命令生成自己的密钥。个人密钥默认是存放在个人目录下的.ssh/下,更具SSH protocol不同,私钥文件名可能为:identity、id_dsa或者id_rsa,并带有一个相同主文件名,扩展名为.pub的公钥文件。
照例,执行ssh-keygen会提示你输入“密码短语”,在这里使用“密码短语”是个好点子。但是如同任何加强安全性的措施一样,密码短语也会让你在使用ssh的时候麻烦些。所以,用不用密码短语,你自己决定吧!
ssh的用法
slogin、scp和ssh命令的基本用法就不做详细介绍了,自己用man命令查看。
我们用ssh来登录远程主机,当ssh连接主机时,会先取得对方主机的公钥,然后在本地的~/.ssh/known_hosts文件里搜索相符的记录,如果找不到相符者(代表你第一次登录该主机),则会显示对方公钥,并要求确认,输入yes,ssh会将对方公钥存入本地~/.ssh/known_hosts文件中(下次登录就不会出现同样的问题了),然后提示你输入你在远程主机的密码。原则上ssh会以你的用户名来登录主机,而不是你的用户ID!如果你在远程主机的帐户不同于本地帐户,那么你必须用一下方式来登录主机:
ssh username@remotehostname
或
ssh -l username remotehostname
如果远程传来的公钥不符合~/.ssh/known_hosts里的记录呢?ssh会立刻切断连接。有两种可能:第一种可能你真的遭受了所谓的“中间人攻击”;另一种可能你远程主机把主机的公钥换掉了。对于后者,你只要编辑~/.ssh/known_hosts文件,把里面的主机密钥删除就可以像首次登录该主机一样登录了。
对于scp命令只要知道它是以冒号来判断那个参数是远程主机,其他用法类似于cp和ssh的结合。
下面再说明一下ssh的远程执行结合本地处理的能力。ssh将远程主机名称之后的部分一律视为远程命令。不过,如果我们要在本地处理远程命令执行的结果,则必须以一对双引号或单引号括主远程命令。例如:
$ssh root@remotehost "tar -cf - /etc/" | tar xvf -
例子中,远程命令是tar -cf - /etc/ ,而|之后的部分仍然是由本地主机执行。要做到这种串联效果,远程命令本身要能够将执行结果送到自己的stdout,而本地的接手命令要能够受理来自stdin的数据,大多数能够接受文件参数的Linux命令,都可以让你使用-符号来表示stdout或stdin,就像此例中的tar命令一样。
ssh似乎有个共同的麻烦点,就是每次都要输入远程帐户密码。幸好SSH容许我们使用密钥验证。使用密钥验证不但可以免去每此输入密码的麻烦,还增强了ssh登录的安全性,因为它避免了远程登录密码在网络上被监听。
要让远程系统接受密钥认证,只需将你的公钥存入远程主机的~/.ssh/authorized_keys(对于SSHv1)或.ssh/authorized_keys2(对于SSHv2)文件中。举例来说,假设你使用DSA key,则你的公钥存放在本机的~/.ssh/id_dsa.pub文件中,下面的命令就能把你的公钥添加到远程主机的相应用户的认证文件中:
$cd ~/.ssh
$cat id_dsa.pub | ssh tom@remotehost "cat - >> ~/.ssh/authorized_keys2"
乖乖输入remotehost主机上的tom用户的密码后就可以“免密码”以tom身份来登录remotehost主机了。当然如果再生成你的密钥时使用了“密码短语”,在任何使用密钥时必须提供“密码短语”,在此处也不例外。
技巧:如果你本地帐户名和远程主机的帐户明相同,可以直接使用“ssh remotehost”登录主机,这和当初的rlogin命令一样方便啦!但安全方面可完全不一样哦!!
说明一下比较有用的ssh服务器的安全设定:
#ChallengeResponseAuthentication yes——设定是否允许使用密码登录,如果使用密钥认证,可以把它禁止。
#PermitRootLogin yes——是否允许root登录,建议禁止root登录,要用root只能用普通帐户登录后用su命令。
#Port 22——指定登录端口,默认TCP 22端口,可以修改成其他端口,客户端登录时用-p选项指定端口。
阅读(2224) | 评论(0) | 转发(0) |