CentOS 7 - Securing OpenSSH(一)

Securing OpenSSH

事实上,OpenSSH(或 Secure SHell)已经成为取代 telnet 协议的远程访问的标准。SSH 使得 telnet 这样的协议变得多余,这在很大程度上是因为连接是加密的,密码不再以明文的形式发送给所有人看。

但是,SSH 的默认安装并不完美,在运行 SSH 服务器时,有几个简单的步骤可以显著加强安装。

1. 使用强密码或用户名

如果你让 SSH 运行并暴露在外部世界,你首先会注意到的一件事是,你的服务器可能会记录到有黑客尝试猜测你的用户名和密码。通常,黑客会扫描 22 端口(SSH 服务侦听的默认端口),以找到运行 SSH 的机器,然后尝试对其进行强力攻击。使用适当的强密码,任何攻击都有可能在成功之前被记录下来并被注意到。

希望你已经使用了强密码,但如果你还没有,那么尝试选择包含:

  • 最少 8 字符
  • 大小写字母混合
  • 字母与数字混合
  • 包含特殊字符,例如:! " £ $ % ^ 等

强密码的好处并不是 SSH 特有的,而是对系统安全性的各个方面都有影响。

如果你不能绝对地阻止你的用户选择一个弱密码,那么考虑为你的用户账户使用一个随机生成或难以猜测的用户名。如果坏人无法猜出用户名,那么他们就无法暴力破解密码。这在一定程度上是安全的,然而,须知用户名的信息可能通过其他方式泄露,例如电子邮件。

2. 禁止超级用户登录

SSH 服务器设置存储在 /etc/ssh/sshd_config 文件中。要禁止超级用户通过 SSH 客户端登录,请确保你拥有以下条目:

# Prevent root logins:
PermitRootLogin no

重启 sshd 服务:

systemctl restart sshd

如果你需要超级用户权限,请使用普通用户登录,并使用 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. 使用一个非标准的端口

默认情况下,SSH 监听 22 端口上传入的连接。黑客通过扫描 22 端口判断你的机器上是否运行 SSH 服务。一种有效的方法是在非标准端口上运行 SSH。任何未使用的端口都可以,不过大于 1024 的端口更合适。许多人选择 2222 作为替代端口(因为很容易记住),就像 8080 通常被称为替代 HTTP 端口一样。正因为这个原因,它可能不是最好的选择,因为任何扫描 22 端口的黑客也可能扫描 2222 端口。最好是随机选择一些不用于任何已知服务的端口。然后,可以在 /etc/ssh/sshd_config 配置文件中添加这样的一行进行修改:

# Run ssh on a non-standard port:
Port 2345

不要忘记对路由器的端口转发和任何适用的防火墙规则进行必要的更改。修改防火墙的 SSH 服务,复制 /usr/lib/firewalld/services/ssh.xml 文件到 /etc/firewalld/services/ 目录下:

$ cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/ssh-custom.xml

接着,修改 /etc/firewalld/services/ssh-custom.xml 文件中的端口配置,使其与 sshd_config 配置文件一致:

<port protocol="tcp" port="2345"/>

然后,移除 ssh 服务,添加 ssh-custom 服务,并重新加载防火墙规则使其生效:

$ firewall-cmd --permanent --remove-service='ssh'
$ firewall-cmd --permanent --add-service='ssh-custom'
$ firewall-cmd --reload

在 CentOS 6 之后,您还应该更新 selinux,正确标记所选择的端口,否则 sshd 将无法访问它。例如:

$ semanage port -a -t ssh_port_t -p tcp 2345

如果在执行以上命令时提示 -bash: semanage: command not found,那么你需要安装 semanage

通过执行 yum whatprovides semanage 命令可以找出哪些包提供 semanage

$ yum whatprovides semanage
Loaded plugins: fastestmirror
Determining fastest mirrors
 * base: mirrors.ustc.edu.cn
 * extras: mirrors.ustc.edu.cn
 * updates: mirrors.ustc.edu.cn
base                                                                  | 3.6 kB  00:00:00     
extras                                                                | 2.9 kB  00:00:00     
updates                                                               | 2.9 kB  00:00:00     
(1/4): extras/7/x86_64/primary_db                                     | 222 kB  00:00:03     
(2/4): base/7/x86_64/group_gz                                         | 153 kB  00:00:04     
(3/4): updates/7/x86_64/primary_db                                    | 4.7 MB  00:00:08     
(4/4): base/7/x86_64/primary_db                                       | 6.1 MB  00:00:12     
base/7/x86_64/filelists_db                                            | 7.2 MB  00:00:03     
extras/7/x86_64/filelists_db                                          | 224 kB  00:00:00     
updates/7/x86_64/filelists_db                                         | 2.7 MB  00:00:01     
policycoreutils-python-2.5-34.el7.x86_64 : SELinux policy core python utilities
Repo        : base
Matched from:
Filename    : /usr/sbin/semanage

从以上查找结果(第 17 行)可知,policycoreutils-python 中包含 semanage。接下来,安装 policycoreutils-python

$ yum install policycoreutils-python

安装完成之后,记得更新 selinux,正确标记所选择的端口。

最后,重启 sshd 服务。

以后,你再通过 SSH 客户端连接 SSH 服务器,就需要明确地指定端口了。

参考

Securing OpenSSH

Linux Troubleshooting – semanage command not found in CentOS 7/8 And RHEL 7/8

猜你喜欢

转载自blog.csdn.net/qq_29761395/article/details/111937298