SSH基本安全措施
使用自定义 SSH 增量配置文件的维护方案
在进行 SSH 相关配置时,不直接编辑/etc/ssh/sshd_config,避免 OpenSSH 更新后的配置冲突。
在/etc/ssh/sshd_config.d/创建一个.conf文件进行自定义 sshd 配置:
sudo mkdir /etc/ssh/sshd_config.d/
sudo touch /etc/ssh/sshd_config.d/sshd.conf
sudo chmod 600 /etc/ssh/sshd_config.d/sshd.conf
之后编辑此自定义配置文件,在里面写入相关配置。
sudo vim /etc/ssh/sshd_config.d/sshd.conf
配置完成后,可以使用``命令确认配置是否写入。例如端口修改后进行确认:
sudo sshd -T | grep -i "port"
安全管理系统
创建非root用户
使用以下命令创建一个具有提权能力的账户:
# Debian/Ubuntu
useradd -m -G sudo -s /bin/bash 用户名
# Red Hat/CentOS/Fedora
useradd -m -G wheel -s /bin/bash 用户名
为此用户设置一个至少为 16 位的随机大小写字母 + 数字的密码
# 生成随机密码
# tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 16
passwd 用户名
禁用root用户通过SSH密码登录
关闭远程密码登录,只允许 root 用户通过本地密码登录。加强安全性的同时,也保留紧急救援的手段。
在 SSH 配置中进行如下设置:
# 禁止 Root 用户通过密码远程登录
PermitRootLogin prohibit-password
配置文件保存后,可以通过命令确认配置是否生效:
sudo sshd -T | grep -i "PermitRootLogin"
注意prohibit-password是without-password的别名,所以如果返回结果中显示without-password是正常现象。
新的配置在重启 SSH 服务后生效:
sudo systemctl restart sshd
修改SSH端口号
同样使用自定义配置文件修改端口号。编辑配置文件写入端口号配置:
# 设置 SSH端口
Port 自拟高位端口
通过命令确认配置是否生效:
sudo sshd -T | grep -i "port"
新的配置在重启 SSH 服务后生效:
sudo systemctl restart sshd
在Ubuntu 22.10或更高版本中 SSH 默认通过套接字激活,端口修改方法请参阅相关资料。
设置使用密钥登录
首先在Windows电脑上生成 SSH 密钥,在 Windows 客户端电脑上打开 powershell 并运行命令生成密钥。
ssh-keygen -t ed25519 -C "选填注释信息"
可以使用默认的密钥路径进行生成。密码可以按需配置或直接留空。
Generating public/private ed25519 key pair.
Enter file in which to save the key (C:\Users\<user>/.ssh/id_ed25519): # 直接回车以使用默认路径
Enter passphrase (empty for no passphrase): # 可以留空或按需设置
Enter same passphrase again: # 重复输入密码配置
打开 Windows 上的C:\Users<user>/.ssh/id_ed25519.pub文件,复制密钥文本。
切换到 Linux 服务器操作,编辑登录账户的 SSH 授权密钥文件:
su - 用户名
sudo vim ~/.ssh/authorized_keys
将前面复制的密钥文本内容粘贴到此文件中。
之后使用自定义 SSH 配置文件修改登录设置。编辑自定义配置文件:
sudo vim /etc/ssh/sshd_config.d/sshd.conf
进行如下设置:
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication no
新的配置在重启 SSH 服务后生效:
sudo systemctl restart sshd
之后可以使用密钥鉴权进行 SSH 连接,在 SSH 工具中使用之前生成的私钥C:\Users<user>/.ssh/id_ed25519进行连接。
禁止ping服务器
对于使用firewalld防火墙的操作系统,可以方便地禁止 ping 服务器:
sudo firewall-cmd --permanent --add-icmp-block=echo-request
sudo firewall-cmd --reload
对于使用ufw管理防火墙规则的操作系统,可以在/etc/ufw/before.rules增加配置:
-A ufw-before-input -p icmp --icmp-type echo-request -j DROP
-A ufw-before-forward -p icmp --icmp-type echo-request -j DROP
如果还需要在ipv6侧进行禁 ping 配置,则修改/etc/ufw/before6.rules文件:
-A ufw6-before-output -p icmpv6 --icmpv6-type echo-request -j DROP
-A ufw6-before-output -p icmpv6 --icmpv6-type echo-reply -j DROP
限制特定用户只能从特定 IP 登录
除了直接通过防火墙限制 SSH 的登录 IP 地址,还可以在 SSH的配置文件限制特定用户只能从特定 IP 登录。
在 SSH 配置文件中增加AllowUsers配置,其中 IP 地址支持通配符*但不支持 CIDR 表示法:
AllowUsers user1@192.168.1.100 user2@10.0.0.* user3@192.168.1.101
注意:
- 新的配置在重启 SSH 服务后生效
- 配置后,只有明确允许的用户+IP组合才能登录
- 务必确保当前用户和 IP 在允许列表中,否则会被锁定
- 建议保持一个已登录的会话进行测试