SSH 操作实践指南

2020-05-11 15:09:39 浏览数 (1)

SSH 是我们经常要和远程服务器交互使用的工具。

下面是一些实践中总结的 SSH 操作经验:

一、 如何选择 SSH key 的加密算法?

从安全性和性能上综合考虑,我们建议:

  1. 如果 ssh 支持ed25519,则使用 ed25519
  2. 否则,建议使用 rsa, 位数选择4096

二、 如何生成 SSH key?

通过ssh-keygen工具生成 SSH key。

根据上面的建议,我们推荐你选第一个命令。

如果不支持ed25519,则使用第二个命令。

代码语言:javascript复制
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):

  1. 如果想要便利操作,不设置密钥密码,直接跳过。
  2. 如果想要更安全,建议设置密钥密码。

三、如何在本地电脑免密码使用 SSH

在上面创建 SSH key 的时候,如果设置了密码。

那么,以后每次在电脑上使用 SSH 论证的时候,都会提示你输入秘钥密码,非常麻烦。

如果本地电脑安全的话,建议让电脑系统保存 SSH 秘钥密码,避免频繁输入密码。

~/.ssh目录下创建config文件,内容如下:

代码语言:javascript复制
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进行配置:

代码语言:javascript复制
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,否则可能出现下面的警告和问题。

代码语言:javascript复制
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 配置,防止服务器被恶意扫描

本文不展开,请阅读下面的参考文档,进一步了解相关内容。

十三、参考文档

  1. 選擇 SSH key 的加密演算法
  2. Linux 中提高的 SSH 的安全性
  3. SSH 安全加固的一些措施
  4. SSH 安全加固
  5. 安全运维那些事之SSH
  6. ssh安全加固
  7. SSH登陆失败的日志查看与攻击预防
  8. CentOS7下安装和使用Fail2ban
  9. Linux实例如何限制指定用户或IP地址通过SSH登录
  10. Top 20 OpenSSH Server Best Security Practices
  11. fail2ban的使用以及防暴力破解与邮件预警
  12. Fail2Ban 高级配置 保护 Nginx 服务

0 人点赞