SSH:最佳做法
介绍
您是否以最佳方式使用SSH? 您是否将其配置为尽可能有限和安全? 本文档的目标是通过SSH的一些最佳实践来崭新的一年:为什么要使用它们,如何设置它们以及如何验证它们是否到位。
以下所有示例都假设您正在使用EnGarde Secure Linux,但任何现代的Linux发行版都会做得很好,因为据我所知,每个人都会运行OpenSSH。
SSHv2与SSHv1
使用最新版本的SSH协议(版本2)与旧版本的版本1有很多好处,我不会在这里看到很多关于这些优点的详细信息 - 如果您有兴趣,请参阅以下参考或Google。 话虽如此,如果您没有明确的理由使用旧版本1,则应始终使用版本2。
要默认使用SSHv2,但允许SSHv1,请在sshd_config文件中找到“协议”行,并将其更改为:
Protocol 2,1
当做2,1请注意,协议选择留给客户端。 大多数客户端将默认为v2,并且“退回”到v1,而旧版客户端可能会继续使用v1。 要强制所有人使用SSHv2,请将其更改为:
Protocol 2
当您进行此更改时,请勿忘记生成相应的HostKey! SSHv2需要以下密钥:
# HostKeys for protocol version 2 HostKey /etc/ssh/ssh_host_rsa_key HostKey /etc/ssh/ssh_host_dsa_key
而SSHv1需要:
# HostKey for protocol version 1 HostKey /etc/ssh/ssh_host_key
完成更改后,重新启动SSH守护程序:
# /etc/init.d/sshd restart
[ SUCCESSFUL ] Secure Shell Daemon
[ SUCCESSFUL ] Secure Shell Daemon
从另一台机器上,尝试使用SSH.in。您可以使用-v选项
查看正在使用的协议,还可以使用'-oProtocol ='选项来强制执行一个或另一个 - 例如“ssh -v -oProtocol = 2 “将强制协议版本2。
绑定到特定地址或非标准端口
如果您在内部防火墙工作站上运行SSH,那么您可以跳过此部分,但如果您在防火墙或具有两个网络接口的计算机上运行SSH,则此部分适用于您。
开箱即用OpenSSH将绑定到每个可用的网络地址; 同时方便,适合大多数安装,这是远非最佳的。 如果您的机器有两个或更多接口,则可能有一个是“可信任”,另一个是“不信任”。 如果是这种情况,并且您不需要也不希望在不受信任的接口上进入SSH访问,那么您应该配置OpenSSH来监听特定的接口。
要使OpenSSH仅绑定到您的内部接口,在下面的示例中为192.168.0.1,请在sshd_config文件中找到以下行:
ListenAddress 0.0.0.0
并将0.0.0.0更改为192.168.0.1:
ListenAddress 192.168.0.1
要验证是否需要更改,请重新启动OpenSSH并查看netstat:
# /etc/init.d/sshd restart
[ SUCCESSFUL ] Secure Shell Daemon
[ SUCCESSFUL ] Secure Shell Daemon
# netstat -anp | grep sshd
tcp 0 0 192.168.0.1:22 0.0.0.0:* LISTEN 7868/sshd
你可以看到,sshd守护进程现在只在192.168.0.1上监听。 任何其他界面中的 SSH请求将被忽略。
同样,您可能希望更改SSH守护程序绑定到的端口。 有时候这是一个功能上的需要(即你的雇主阻止了22 / tcp的出站),但是在这方面也有安全隐患的价值。 虽然没有为确定的攻击者提供任何真正的安全性好处,但将SSH守护程序从端口22移除,可以保护您免受假定守护程序在端口22上运行的自动攻击。
要使OpenSSH绑定到以下示例中的端口22,31337以外的端口,请在sshd_config文件中找到以下行:
Port 22
并将22改为31337:
Port 31337
要验证是否需要进行此更改,请重新启动OpenSSH,再次查看netstat:
# netstat -anp | grep sshd
tcp 0 0 192.168.0.1:31337 0.0.0.0:* LISTEN 330/sshd
最后,要SSH登录到SSH守护程序正在非标准端口上监听的主机,请使用-p选项:
ssh -p 31337 user@192.168.0.1
使用TCP包装器
TCP Wrappers用于限制对您机器上TCP服务的访问。 如果您没有听说过TCP Wrappers,您可能听说过/etc/hosts.allow和/etc/hosts.deny:这些是TCP Wrappers的两个配置文件。 在SSH的上下文中,TCP Wrappers允许您确定具体的地址或网络是否可以访问SSH服务。
要使用带有SSH的TCP Wrappers,您需要确保使用-with-tcp-wrappers构建OpenSSH。 在任何现代分配情况下都是这样。
如前所述,TCP Wrappers通过编辑/etc/hosts.deny和/etc/hosts.allow文件进行配置。 通常你告诉hosts.deny否认一切,然后添加条目到hosts.allow允许特定的主机访问特定的服务。
一个例子:
# # hosts.deny This file describes the names of the hosts which are # *not* allowed to use the local INET services, as decided # by the '/usr/sbin/tcpd' server. # ALL: ALL # # hosts.allow This file describes the names of the hosts which are # allowed to use the local INET services, as decided # by the '/usr/sbin/tcpd' server.
# sshd: 207.46.236. 198.133.219.25
在上面的示例中,访问SSH仅限于网络207.46.236.0/24和地址198.133.219.25。 在任何其他地址的任何其他服务的请求被hosts.deny中的“ALL:ALL”拒绝。 如果您尝试SSH进入机器,并且TCP Wrappers拒绝您的访问,您会看到如下:
ssh_exchange_identification: Connection closed by remote host
这种简单的配置更改会显着加强您的安装,因为在适当的情况下,来自恶意客户端的数据包将在TCP会话早期被丢弃,并且在可能对潜在的弱势守护进程造成任何实际损害之前。
公钥认证
我将介绍的最后一个项目是公钥认证。 您可以采取的最好的措施之一是收紧SSH安装的安全性,即禁用密码验证,并改用公钥验证。 因为许多原因,密码认证是次优的,但主要是因为人们选择不良密码,攻击者常常尝试强制使用密码。 如果系统管理员选择了错误的密码,并且他允许root登录...游戏结束。
公钥认证不是银弹 - 同样的人也可以生成密码短语,或者让他们不要运行ssh代理,但是在我看来,这是一个更好的选择。
关于每个配送公司都会启用公钥认证,但首先要确定:
RSAAuthentication yes PubkeyAuthentication yes
这两个选项默认为“yes”,“RSAAuthentication”选项用于SSHv1,“PubkeyAuthentication”选项用于SSHv2。 如果您计划专门使用此身份验证方法,那么您可能需要禁用密码验证:
PasswordAuthentication no
在继续之前,请确保您的目标机器上有一个终端打开。 一旦您重新启动SSH守护程序,您将无法再登录没有密钥...我们还没有生成!
一旦你确定,重新启动SSH守护进程:
# /etc/init.d/sshd restart
[ SUCCESSFUL ] Secure Shell Daemon
[ SUCCESSFUL ] Secure Shell Daemon
现在,从桌面上,尝试SSH到目标机器:
$ ssh rwm@brainy
Permission denied (publickey,keyboard-interactive).
我们被锁定了 这是一件好事。 在桌面上的下一步是生成一个键:
$ ssh-keygen -t dsa -C "Ryan's SSHv2 DSA Key (Jan 2008)"
Generating public/private dsa key pair.
Enter file in which to save the key (/home/rwm/.ssh/id_dsa):
Enter passphrase (empty for no passphrase): **********
Enter same passphrase again: **********
Your identification has been saved in /home/rwm/.ssh/id_dsa.
Your public key has been saved in /home/rwm/.ssh/id_dsa.pub.
The key fingerprint is:
98:4d:50:ba:ee:8b:79:be:b3:36:75:8a:c2:4a:44:4b Ryan's SSHv2 DSA Key (Jan 2008)
几点注意:
- 您可以生成DSA(-t dsa),RSA(-t rsa)或SSHv1(-t rsa1)密钥。 在上面的例子中,我使用dsa。
- 我喜欢把日期生成的关键在评论(-C)字段中,这样我可以每隔一段时间更改它。
- 您正在输入密码,而不是密码。 使用长空格和标点符号。 越长越复杂越好!
您刚刚运行的命令生成了两个文件 - id_dsa,您的私钥和id_dsa.pub,您的公钥。 保持私有密钥至关重要,但您可以将公钥分发到您要访问的任何计算机。
现在您已经生成了密钥,我们需要将公钥存入目标机器上的〜/ .ssh / authorized_keys文件中。 最好的方法是复制粘贴它 - 首先连接公钥文件:
$ cat .ssh/id_dsa.pub
ssh-dss AAAAB3NzaC1kc3MAAACBAL7p6bsg5kK4ES9BWLPCNABl20iQQB3R0ymaPMHK...
... ds= Ryan's SSHv2 DSA Key (Jan 2008)
这是一个非常长的字符串。 确保您复制所有它 ,并且不要在最后复制换行符。 换句话说,从“ssh”复制到“2008”),但不是过去。
下一步是将此密钥附加到目标计算机上〜/ .ssh / authorized_keys文件的末尾。 请记住,终端我告诉你几步前开放吗? 在其中键入以下命令,将刚刚复制的密钥粘贴到注释的区域中:
echo "KEY" >> ~/.ssh/authorized_keys
例如:
echo "ssh-dss AAAA5kS9BWLPCN...s= Ryan's SSHv2 DSA Key (Jan 2008)" >> ~/.ssh/authorized_keys
现在,再试一次SSH。 如果您正确执行此过程,而不是被拒绝访问,系统将提示您输入密码:
$ ssh rwm@brainy
Enter passphrase for key '/home/rwm/.ssh/id_dsa':
Last login: Thu Jan 10 14:37:14 2008 from papa.engardelinux.org
[rwm@brainy ~]$
中提琴! 您现在使用公钥身份验证而不是密码身份验证登录。
综上所述...
SSH是一个奇妙的工具,是每个系统管理员第二好友(Perl,当然是第一个:)。 它允许您从任何地方阅读您的电子邮件,前提是您仍然使用基于终端的邮件阅读器。 它允许您在工作时将xterm或X11应用程序从家庭服务器隧道传输到桌面。 它为您提供了在SFTP和SCP中远远优于FTP的替代方案。
SSH是伟大的,但就像任何工具,它只有你使用它一样好。 我希望你在一些最好的做法中找到价值,如果你有任何自己的优点,请留下他们的意见!
在我去之前,这里有一些额外的SSH资源: