将 OpenSSH 巩固

将 OpenSSH 加固

OpenSSH(或者 Secure Shell)以经成为一个取代 telnet 协议作远程访问用的现有标準。SSH 已经令 telnet 等协议多余的,当中絕大部份原因是由於连接被加密,以及不再以纯文本公开地传送口令。

然而,缺省的 ssh 安装並非完美。当你营运一个 ssh 服务器时,有数个简单的步骤可以明显地加固你的安装。

 

1. 採用难猜测的口令/用戶名称

 

如果你所营运的 ssh 是对外的,你首先会发现的事情,很可能就是骇客尝试猜测用戶名称/口令的记錄。骇客一般会扫描端口 22(ssh 缺省聆听的端口)来找寻执行 ssh 的机器,然后尝试強行攻擊它。借著使用难猜测的口令,我们希望任何攻擊在成功前会被记錄底及被留意到。

盼望你已经採用了难猜测的口令。要不然,请尝试选拥有以下特征的口令:

  • 最少有 8 个字符
  • 同时有大楷和细楷字母
  • 同时有字母和数目字
  • 有非英数的字符(例如 ! " £ $ % ^ 等特別字符)

使用难测口令的好处並不止於 ssh,它更会影响到系统安全的各个范筹。有关口令的更多信息可以在 CentOS 的文档內找到:

http://www.centos.org/docs/4/html/rhel-sg-en-4/s1-wstation-pass.html

如果你完全沒法阻止你的用戶选用易猜测的口令,请考虑以随机產生或难猜测的字中作为用戶名称。如果坏人不能猜测用戶名称,他们便不能強加猜测口令。然而,这只是隐晦信息来換取安全,所以要留心用戶名称通过用戶发送的电邮等途径而被洩漏。

 

2. 停用 root 登录

 

SSH 服务器的设置都存储在 /etcshh/sshd_confg 这个文件。要停用 root 登录,请确定你有以下一行:

 

# 阻止 root 登录:
PermitRootLogin no

 

然后请重新引导 sshd 服务:

 

service sshd restart

 

你果你需要 root 的权限,请登录为一般用戶,然后使用 su 这个指令。

 

3. 限制用戶登录

 

SSH 登录可以局限给某些需要远程访问的用戶。如果你的系统有很多用戶,一个合理的个法就是局限远程访问给那真正有需要的用戶,借以減低其它用戶採用易测口令的影响。在 /etc/ssh/sshd_config 內加入 AllowUsers 一行,以空格隔开用戶名称。例如:

 

AllowUsers alice bob

 

接著请重新引导 sshd 服务。

 

4. 停用第 1 类协议

 

SSH 可以採用两款协议:第 1 类及第 2 类协议。较旧的第 1 类协议的安全性较低,因此它应该被停用,除非你知道你必须要使用它。请在 /etc/ssh/sshd_config 档內找寻以下一行,解除註释,並作出如下修改:

 

# Protocol 2,1
Protocol 2

 

然后请重新引导 sshd 服务。

 

5. 採用非标準的端口 38332

 

根据缺省值,ssh 在端口 22 聆听对內的连接。一个骇客如果要断定 ssh 是否在你的机器上运行,他最大可能就是扫描端口 22。一个有效混淆他的方法就是在非标準的端口上运行 ssh。任何未被使用的端口都可行,但首选的是 1024 以上的。很多人选用 2222 作为替换的端口(它很易记),正如 8080 经常被用作 HTTP 的替换端口。正正由於这个原因令它不是个好的选择,因为任何扫描端口 22 的骇客亦不会放过端口 2222。随机地选用一个未被使用的高位端口会比较合宜。要进行改动,请在你的 /etc/ssh/sshd_config 档內加入以下一行:

 

# 在非标準的端口上执行 ssh:
Port 38332  #修改

 

然后重新引导 sshd 服务。请勿忘记在你的路由器及相关的防火牆规则裡作出任何必要的改动。

因为 ssh 不再在标準的端口上聆听连接,你须要告诉客戶端要连接到哪个端口。在命令行上执行 ssh 客戶端时,你可以用 -p 选项来指定端口:

 

$ ssh -p 2345 myserver

 

又或著如果你使用 konqueror 的 fish 协议,你可用:

 

fish://myserver:2345/remote/dir

 

如果你觉得每次连接时都要指定端口似乎很痛苦,你只需在你个人的 ~/.ssh/config 文件裡加入一个指定端口的记錄:

 

 # 客戶端 ~/.ssh/config
Host myserver
HostName 72.232.194.162
        User bob
        Port 2345

 

~/.ssh/config 必须有以下访问权:

 

$ chmod 600 ~/.ssh/config

 

 

6. 在防火牆过滤 SSH

 

如果你只须由一个 IP 地址进行远程访问(例如由办工室进入家中的服务器),请考虑在你的路由器或 iptables 內加入一条防火牆的规则,将端口 22 的访问权限制到特定的 IP 地址,借此对连接进行过滤。举个例說,在 iptables 內你可以用这类型的规则达至这个目的:

 

iptables -A INPUT -p tcp -s 72.232.194.162 --dport 22 -j ACCEPT

 

SSH 亦对 TCP 包装函式有內置支持,因此 ssh 服务的访问权亦可同时用 host.allow 及 hosts.deny 来进行管制。

如果你不能限制来源地的 IP 地址,而必须公开 ssh 端口,那麼 iptables 依然可以通过记錄及拦截来自同一 IP 地址的重覆登录尝试,帮助你阻止強行的攻擊。例如:

 

iptables -A INPUT -p tcp --dport 22 -m recent --set --name ssh --rsource
iptables -A INPUT -p tcp --dport 22 -m recent ! --rcheck --seconds 60 --hitcount 4 --name ssh --rsource -j ACCEPT

 

第一条规则利用 recent 模块来记錄每个访问端口 22 的尝试。第二条规则检查这个 IP 地址在过去 60 移內有否尝试 4 次或以上的连接,若然沒有更接纳压缩。注意这个规则须要输入链採用 DROP 的缺省政策。

下面是另一个样例,这次採用了 iptables 的 limit 模块来限制 ssh 端口每分钟最多可以有 3 个连接:

 

iptables -A INPUT -p tcp --dport 22 --syn -m limit --limit 1/m --limit-burst 3 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 --syn -j DROP

 

第一行接纳新连接到端口 22 时,必须来自过在去一分钟內连接不多过三次的 IP 地址。如果多於三个连接尝试在过去一分钟出现过,第二行会中断这个连接。

如果你在非标準的端口上执行 ssh,请不要忘记对端口作出相应修改。情況许可的话,利用防火牆进行过滤是一个非常有效的方法来加固 ssh 服务器。 Don't forget to change the port as appropriate if you are running ssh on a non-standard port. Where possible, filtering at the firewall is an extremely effective method of securing access to an ssh server.

 

7. 採用公共/专用金钥来验证

 

採用加密金钥来验证提供两大好处。首先,如果你应用公共/专用金钥,是方便,因为你不用再输入口令(除非你用口令来保护你的金钥)。第二,当服务器能进行金钥对的验证,你便可以完全停用口令验证,意即访问时靠赖授权的金钥 —— 因此不再有猜测口令的尝试。

创建及在你的 ssh 服务器上安装金钥对是个相对地简单的过程。

首先,在你会用来连接到服务器的客戶端上创建一对金钥(你须要在每台用来连接的机器上这樣做):

 

$ ssh-keygen -t rsa

 

这樣做会在你的(隐藏了的)~/.ssh 目錄内置立两个文件,名叫 id_rsaid_rsa.pubid_rsa 是你的专用金钥,而 id_rsa.pub 是你的公共金钥。

如果你不想每次连接时都被问及口令,在创建金钥对的时候,你只按 enter 作为口令。创建金钥对时,是否以口令加密纯粹是你的決定。如何你不将金钥加密,任何人夺得你的本地机器后,便自动拥有远程服务器的 ssh 访问权。此外,本地机器上的 root 能夠访问你的金钥:但假若你不能信任 root(或者 root 已被攻佔),你已经大祸临头。将金钥加密舍棄了不用口令的 ssh 服务器,来換取额外的安全,得来的就是输入口令来使用这条金钥。

现在为你的专用金钥设置权限:

 

$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/id_rsa 

 

请将公共金钥(id_rsa.pub)复制到服务器上,然后安装它在 authorized_keys 清单內:

 

$ cat id_rsa.pub >> ~/.ssh/authorized_keys

 

註:一但你输入了公共金钥,你可以在服务器上刪除它。

最后,设置服务器上的文件权限:

 

$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys

 

如果 /etc/ssh/sshd_config 內的 StrictModes 被啟用(缺省值),以上的权限是必须的

现在当你登录服务器的时候,你便不用再输入口令(除非你在创建金钥对的时候输入了一个口令)。ssh 缺省是会先利用金钥进行验证。如何它找不到金钥,或验证失败,ssh 会回落到平常的口令验证。

一但你检查过可以用金钥对来登录服务器,你可以在你的 /etc/ssh/sshd_conf 档內加入以下设置来停用口令验证:

 

# 停用口令验证,強制使用金钥
PasswordAuthentication no

 

 

8. 常见问题(FAQ)

 

问:CentOS 採用 X 版的 OpenSSH,而最新版本是 Y 版。X 版藏有一个严重的安全性漏洞,我应否升级?

答:不应该。上游供应者有一个政策,会将最新版本的安全性修正反向移植到现有的发行版本內。只要你拥有最新的更新,你的 CentOS 发行版本已经得到全面修正。有关反向移植安全性修正的详情,请参閱这裡:

http://www.redhat.com/advice/speaks_backport.html

 

9. 连结

 

http://www.centos.org/docs/5/html/Deployment_Guide-en-US/ch-openssh.html