SSH 是我们经常要和远程服务器交互使用的工具。
下面是一些实践中总结的 SSH 操作经验:
一、 如何选择 SSH key 的加密算法?
从安全性和性能上综合考虑,我们建议:
- 如果 ssh 支持
ed25519
,则使用ed25519
- 否则,建议使用
rsa
, 位数选择4096
二、 如何生成 SSH key?
通过ssh-keygen
工具生成 SSH key。
根据上面的建议,我们推荐你选第一个命令。
如果不支持ed25519
,则使用第二个命令。
ssh-keygen -t ed25519 -C "user@example.com"
ssh-keygen -t rsa -b 4096 -C "user@example.com"
ssh-keygen -t ecdsa -b 521 -C "user@example.com"
ssh-keygen -t dsa -C "user@example.com"
关于密钥密码(passphrase):
- 如果想要便利操作,不设置密钥密码,直接跳过。
- 如果想要更安全,建议设置密钥密码。
三、如何在本地电脑免密码使用 SSH
在上面创建 SSH key 的时候,如果设置了密码。
那么,以后每次在电脑上使用 SSH 论证的时候,都会提示你输入秘钥密码,非常麻烦。
如果本地电脑安全的话,建议让电脑系统保存 SSH 秘钥密码,避免频繁输入密码。
在~/.ssh
目录下创建config
文件,内容如下:
Host *
UseKeychain yes
AddKeysToAgent yes
四、拷贝 SSH 公钥到远程服务器
使用以下命令(ssh-copy-id
)将 ssh 公钥 拷贝到远程服务器。
以后就可以通过 ssh 公钥密钥来认证登录远程服务器了。
代码语言:javascript复制 ssh-copy-id -i ~/.ssh/id_ed25519.pub root@127.0.0.1
ssh-copy-id -i ~/.ssh/id_rsa.pub root@127.0.0.1
ssh-copy-id -i ~/.ssh/id_ecdsa.pub root@127.0.0.1
ssh-copy-id -i ~/.ssh/id_dsa.pub root@127.0.0.1
请根据 SSH key 加密算法类型,具体选择其中一条命令。 其中, root@127.0.0.1
是远程服务器的公网 IP 地址和登录用户名,请根据实际情况修改。
这条命令的作用就是: 将本地 SSH 客户端的公钥,拷贝到远程服务器的~/.ssh/authorized_keys
文件中。
五、修改 SSH 的默认端口
SSH 的默认端口 22,很容易被攻击。
建议将该端口修改为0~65535的非常规端口,比如:3576
编辑 SSH 服务端配置文件:
代码语言:javascript复制Port 3576
保存退出。
如果服务器启用了 SELinux,则还需进行额外配置。
首先,确认 SELinux 是否启用:
代码语言:javascript复制sestatus 2> /dev/null | grep -E -q 'SELinux status:s enabled' && echo yes || echo no
输出 yes 即表示启用了 SELinux,那么就需要再对 SELinux 进行配置:
代码语言:javascript复制semanage port -a -t ssh_port_t -p tcp 3576
请注意把 3576
替换为实际配置的端口。
如果服务器启用了防火墙firewalld,则还需进行额外配置。
首先,确认 firewalld 是否启用:
代码语言:javascript复制systemctl status firewalld
输出日志中含有Active: active (running)
字样,那么还需要对firewalld进行配置:
firewall-cmd --permanent --zone=public --add-port=3576/tcp
firewall-cmd --reload
(后面对于 SSH 服务端配置文件的修改,最好也需要测试,并重启一下 sshd,保证修改生效。)
测试一下,设置是否正确:
代码语言:javascript复制sshd -t
代码语言:javascript复制WARNING: 'UsePAM no' is not supported in Fedora and may cause several problems.
根据提示修正错误和警告,直到测试通过。
重启 sshd 服务
代码语言:javascript复制systemctl restart sshd
六、启用 RSA验证,公钥验证
代码语言:javascript复制 RSAAuthentication yes #是否允许RSA验证
PubkeyAuthentication yes #是否允许公钥验证
AuthorizedKeysFile .ssh/authorized_keys #公钥文件存放的位置
七、禁止密码安全验证
代码语言:javascript复制 ChallengeResponseAuthentication no #设置是否允许使用提示应答式认证。sshd支持login.conf文件中定义的所有认证类型
PasswordAuthentication no #设置是否需要口令验证,默认为yes
PermitEmptyPasswords no #设置是否允许用空口令登录
UsePAM yes #是否启用PAM插件式认证模块,默认为yes
注:在 RHEL 系列(RHEL,Fedora,CentOS 等)中不允许设置 UsePAM no
,否则可能出现下面的警告和问题。
WARNING: 'UsePAM no' is not supported in Fedora and may cause several problems.
八、允许/禁止 Root 用户通过 SSH 登录系统
根据实际情况来设置是否允许 root 用户通过 SSH 登录系统。
代码语言:javascript复制 PermitRootLogin yes #如果为yes则允许root用户使用ssh登录,为no则表示不允许root进行ssh登录,为without-password则表示禁止 root 账户通过密码登入,但仍可以通过公私钥对登入。
九、限制通过 SSH 方式的用户登录
9.1 只允许指定用户进行登录(白名单):
代码语言:javascript复制AllowUsers aliyun test@192.168.1.1 # 允许 aliyun 和从 192.168.1.1 登录的 test 帐户通过 SSH 登录系统。
9.2 只拒绝指定用户进行登录(黑名单):
代码语言:javascript复制DenyUsers d4rksec aliyun #Linux系统账户 # 拒绝 d4rksec、aliyun 帐户通过 SSH 登录系统
十、 其他优化和安全配置
代码语言:javascript复制 LoginGraceTime 120 #设置如果用户不能成功登录,sshd将会在这个配置参数指定的时间过后断开连接(单位为秒)
MaxAuthTries 6 #指定每个连接最大允许的认证次数。默认值是6.如果失败认证的次数超过这个数值的一半,连接将被强制断开。且会生成额外的失败日志消息。
MaxSessions 10 #指定每个网络连接允许打开会话的最大数目。默认值为10
StrictModes yes #设置sshd在接受登录请求前是否检查用户的主目录以及rhosts文件的权限和所有者等信息。防止目录和文件设成任何人都有写权限
以上配置编辑SSHD 配置文件,/etc/ssh/sshd_config
十一、限制来自指定 IP 通过SSH 方式的用户登录
11.1 允许指定 IP 或者 IP 范围的用户进行登录(白名单):
编辑配置文件:
代码语言:javascript复制vi /etc/hosts.allow
代码语言:javascript复制sshd:192.168.0.1:allow #允许 192.168.0.1 这个 IP 地址 ssh 登录
sshd:192.168.0.1/24:allow #允许 192.168.0.1/24 这段 IP 地址的用户登录
sshd:ALL # 允许全部的 ssh 登录
11.2 禁止指定 IP 或者 IP 范围的用户进行登录(黑名单):
编辑配置文件:
代码语言:javascript复制vi /etc/hosts.deny
代码语言:javascript复制sshd:192.168.0.1:deny #禁止 192.168.0.1 这个 IP 地址 ssh 登录
sshd:192.168.0.1/24:deny #禁止 192.168.0.1/24 这段 IP 地址的用户登录
sshd:ALL # 禁止全部的 ssh 登录
注:同时设置上述两个文件时,hosts.allow文件中规则的优先级更高。
十二、 通过Fail2Ban 和 iptables 配置,防止服务器被恶意扫描
本文不展开,请阅读下面的参考文档,进一步了解相关内容。
十三、参考文档
- 選擇 SSH key 的加密演算法
- Linux 中提高的 SSH 的安全性
- SSH 安全加固的一些措施
- SSH 安全加固
- 安全运维那些事之SSH
- ssh安全加固
- SSH登陆失败的日志查看与攻击预防
- CentOS7下安装和使用Fail2ban
- Linux实例如何限制指定用户或IP地址通过SSH登录
- Top 20 OpenSSH Server Best Security Practices
- fail2ban的使用以及防暴力破解与邮件预警
- Fail2Ban 高级配置 保护 Nginx 服务