模拟远程服务器-SSH 安全配置

741 阅读4分钟

上一篇笔记中我们在服务器上成功搭建的 SSH 服务,但并没有进行任何配置。在本篇笔记中我们将在安全方面对我们的 SSH 服务进行一些配置,让我们的服务器更加健壮。

修改端口

SSH 默认监听的端口是 22,许多恶意脚本会对该端口进行暴力登录,即通过密码本等方式尝试猜出账户密码。因此配置 SSH 访问网络安全时,往往首先会对 SSH 监听端口进行自定义。(要真正实现 SSH 访问网络安全需要进行大量配置,例如 fail2ban、防火墙、DMZ、IDS等等,这些已经超出我目前的知识范围了……)

配置

  1. 在服务端添加 SSH 自定义配置文件:/etc/ssh/sshd_config.d/custom.conf
  2. 在配置文件中修改 SSH 监听端口:Port 19512
  3. 服务端 SSH 服务重新读取配置:sudo systemctl reload sshd
  4. 客户端登录时指定端口:ssh -p 19512 <user_name>@<IP>

端口-修改.png

测试

可以看到修改服务端 SSH 监听端口后,客户端若不指定正确端口将无法登录。

端口-测试.png

用户权限

默认配置下,服务器上所有用户都有进行 SSH 登录的权限。我们可以在服务器上创建一个用户组,并只将真正需要 SSH 登录的用户放入该用户组中,这样既有利于权限分级管理又有利于出现问题后迅速定位。

配置

  1. 在自定义配置文件 /etc/ssh/sshd_config.d/custom.conf 中添加 AllowGroups ssh_group

  2. 服务端 SSH 服务重新读取配置:sudo systemctl reload sshd

  3. 在服务端创建对应 SSH 登录权限用户组

    1. 创建用户组:sudo groupadd ssh_group
    2. 将用户添加进用户组:sudo gpasswd -a <user_name> ssh_group
    3. 查看是否添加成功:sudo getent group ssh_group

用户组-配置.png

测试

从下图中可以看到:因为没有被添加进 SSH 登录权限用户组,用户第一次通过 SSH 登录失败。只有在服务端被添加进 SSH 登录权限用户组后,用户才能重新成功登录。

用户组-连接.png

密钥管理

我们先来复习一下密钥登录的整体结构:用户将表明身份的私钥放置在本地,将验证身份的公钥放置在服务器。除了第一次放置公钥时需要通过服务器账号密码验证用户身份外,之后都是用私钥和公钥配对来验证身份。也就是说可以简单地认为密钥与用户账号密码对应。

这就存在一个问题:用户虽然在服务器上只有一个账户并对应一个密码,但可以创建无数个密钥对,每一个密钥对都可以对应该用户在服务器上的账号密码。这就好比一个账户有多个密码,显然是十分不利于登录安全管理的。因此许多 SSH 密钥管理体系构建的第一步就是将密钥集中管理

当然在实际的 SSH 应用中不仅要实行密钥统一管理,还要对用户访问权限的授予和收回每一次远程登陆的申请和终止,制定对应的流程规范。

为了进一步提升安全性,SSH 还可以引入数字证书认证机构(CA,Certificate Authority),并基于证书进行 SSH 管理。

我们接下来配置的是非常简单的 SSH 密钥管理体系:将密钥交由 root 用户统一管理

配置

  1. 由 root 用户创建统一用户密钥管理目录:sudo mkdir -v /etc/ssh/user_keys
  2. 为每个拥有远程登录权限的用户创建子文件夹,并以用户名称命名:sudo mkdir -v /etc/ssh/user_keys/<user_name>
  3. 将各用户的公钥文件 authorized_keys 移动到对应文件夹下:sudo cp -ai /home/<user_name>/.ssh/authorized_keys /etc/ssh/user_keys/<user_name>/
  4. 在自定义配置文件 /etc/ssh/sshd_config.d/custom.conf 中添加 AuthorizedKeysFile /etc/ssh/user_keys/%u/authorized_keys
  5. 服务端 SSH 服务重新读取配置:sudo systemctl reload sshd

集中-配置.png

验证

我们按照上一篇笔记中的步骤创建密钥 test 并发送到服务端:/home/<user_name>/.ssh/authorized_keys

集中-传送.png

可以看到密钥已经成功传送到服务端用户文件夹下了

接下来我们使用新创建的密钥进行登录:

集中-失败.png

可以发现密钥登录失败,提示使用密码登录。这是因为此时用户登录密钥由 root 集中管理于 /etc/ssh/user_keys/%u/authorized_keys。只有当 root 将用户新添加的密钥拷贝至对应文件夹后,该密钥才能生效。

集中-管理.png

可以看到用户新添加的密钥已经被成功拷贝到 /etc/ssh/user_keys/%u/authorized_keys。接下来我们再次尝试使用新添加的 test 密钥登录,发现登录成功:

集中-成功.png

总结

在本篇笔记中,我们为服务器上的 SSH 服务配置了自定义端口、访问权限用户组和密钥集中管理,让我们的服务器更“健壮”了一些。虽然这些配置相对真正的 SSH 安全来说充其量是“玩具”,但这个尝试将安全纳入开发的过程还是十分有趣的:)