• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 在 centOS 上设置 SSH 服务配置(远程服务端)

    SSH 是一种网络协议,用于计算机之间的加密登录。如果一个用户从本地计算机,使用 SSH 协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露。最早的时候,互联网通信都是明文通信,一旦被截获,内容就暴露无疑。1995年,芬兰学者 Tatu Ylonen 设计了SSH 协议,将登录信息全部加密,成为互联网安全的一个基本解决方案,迅速在全世界获得推广,目前已经成为 Linux 系统的标准配置。

    SSH 只是一种协议,存在多种实现,既有商业实现,也有开源实现。本文针对的实现是 OpenSSH,它是自由软件,应用非常广泛。所有 ssh 客户端工具,包括 ssh 命令,scp、sftp、ssh-copy-id 等命令都是借助于 ssh 连接来完成任务的。


    卸载并重装 SSH 服务

    若使用 SSH 连接,那么本机客户端和远程服务端,都需要安装 SSH 服务。

    #查看 openssh 安装情况
    rpm -qa openssh*
    
    #卸载
    dnf remove openssh*
    
    #重装
    dnf -y install openssl openssh
    
    #查看版本
    ssh -V
    
    • SSH 服务配置文件:/etc/ssh/sshd_config。服务器端 SSH 服务运行的系统配置。
    • 全局用户配置文件:/etc/ssh/ssh_config。此是客户端,进行 SSH 连接的选项配置。是全局的。
    • 当前用户配置文件:~/.ssh/config。此是客户端,进行 SSH 连接的选项配置。是当前用户的配置。它优先于全局的配置。若 root 用户,配置文件路径是/root/.ssh/config。其他用户,比如自设置 git 用户,配置文件路径是/home/git/.ssh/config
    #设置开机自启
    systemctl enable sshd
    
    #启动
    systemctl start sshd
    
    #重启
    systemctl restart sshd
    
    #停止
    systemctl stop sshd
    
    #检查 sshd 服务是否已经启动
    ps -e | grep sshd
    


    开启防火墙的 SSH 端口

    SSH 默认端口是 22

    #永久放开 22 端口,然后重新载入,使其生效
    firewall-cmd --permanent --zone=public --add-port=22/tcp 
    firewall-cmd --reload
    
    #查看所有打开的端口
    firewall-cmd --zone=public --list-ports
    
    #重启 firewalld
    systemctl restart firewalld
    
    #查询当前程序运行端口号
    netstat -anpl | grep sshd
    


    配置 SSH

    SSH 配置文件,位于/etc/ssh/sshd_config

    vim /etc/ssh/sshd_config
    
    # 允许 root 用户登录
    PermitRootLogin yes
    
    # 开启 RSA 算法验证,新版中已经淘汰此选项
    RSAAuthentication yes
    
    # 使用公钥验证
    PubkeyAuthentication yes
    
    # 公钥保存位置
    AuthorizedKeysFile .ssh/authorized_keys
    
    # 允许密码登录,默认值 yes。当设置为 no,则会禁止密码登录。
    PasswordAuthentication yes
    
    # Pam 认证,默认值 no,不开启。
    UsePAM no
    
    # GSSAPIAuthentication 认证,默认值 no,不开启。
    GSSAPIAuthentication no
    
    # DNS 反向解析。默认 no,不开启
    UseDNS no
    
    # 客户端响应时长
    ClientAliveInterval 60
    
    # 客户端响应最大次数
    ClientAliveCountMax 3
    

    SSH 版本不同,默认值会不同。此处是版本:OpenSSH_8.7p1, OpenSSL 3.0.7 1 Nov 2022

    开启公钥验证和密码验证,如此即可以使用密码口令登录,也可以使用密钥登录,避免总输入密码的麻烦。不开启 PAM 认证,因为当UsePAM yes,开启 UsePAM 的时候,panm 认证机制会先去找验证模块,由验证模块决定下一步的验证。PAM 检验的优先级高于 PasswordAuthentication(密码验证),若 pam 认证失败,密码登录也不能使用。不开启 GSSAPIAuthentication 认证

    PAM:插入式验证模块(Pluggable Authentication Module,PAM),简单来说,就是提供了一组身份验证、密码验证的统一抽象接口,应用程序员可以使用这些API接口来实现与安全性相关的功能。

    GSSAPI:Generic Security Services Application Program Interface,GSSAPI 是一套通用网络安全系统接口。该接口是对各种不同的客户端服务器安全机制的封装,以消除安全接口的不同,降低编程难度。GSSAPI 本身是一套 API,由 IETF 标准化。其最主要也是著名的实现是基于 Kerberos 的。一般说到 GSSAPI 都暗指 Kerberos 实现。


    另外,本机客户端进行 SSH 连接时,认证方法顺序,也需要设置为:PreferredAuthentications publickey,password


    • UseDNS:由于远程目标 server 服务器,若启用 DNS 反向解析:远程目标 server 服务器验证登录 IP,它根据用户输入的 IP,使用反向 DNS 找到主机名,再使用 DNS 找到 IP 地址,最后匹配一下登录的 IP 是否合法。如果客户机的 IP 没有域名,或者 DNS 服务器很慢或不通,那么登录就会很花时间。
    • GSSAPIAuthentication:由于远程目标 server 服务器,若启用 GSSAPI 用户认证。GSSAPIAuthentication 是基于 GSSAPI 的用户认证,登陆的时候客户端需要对服务器端的 IP 地址进行反解析,如果服务器的 IP 地址没有配置 PTR 记录,那么就会在这里卡住。
    • ClientAliveCountMax:sshd 在未收到任何客户端回应前最多允许发送多少个"alive"消息。默认值是 3 。到达这个上限后,sshd 将强制断开连接、关闭会话。需要注意的是,"alive"消息与 TCPKeepAlive 有很大差异。"alive"消息是通过加密连接发送的,因此不会被欺骗;而 TCPKeepAlive 却是可以被欺骗的。如果 ClientAliveInterval 被设为 15 并且将 ClientAliveCountMax 保持为默认值,那么无应答的客户端大约会在45秒后被强制断开。这个指令仅可以用于SSH-2协议。
    • ClientAliveInterval:设置一个以秒记的时长,如果超过这么长时间没有收到客户端的任何数据, sshd 将通过安全通道向客户端发送一个"alive"消息,并等候应答。默认值 0 表示不发送"alive"消息。这个选项仅对SSH-2有效。


    更改保存 sshd_config 文件后,重启 SSH 服务。

    systemctl restart sshd
    


    SSH 登录异常

    Connection reset by peer

    在本机,SSH 连接远程连接服务器的时候,出现:
    kex_exchange_identification: read: Connection reset by peer
    Connection reset by xxxxxx port 22
    Connection close

    vim /etc/ssh/sshd_config
    
    #修改 sshd_config 配置
    MaxSessions 20
    MaxStartups 20:30:10
    
    #修改完毕后,重启 sshd 服务
    systemctl restart sshd
    
    • MaxSessions,每个连接可以并行开启多少个会话(session),默认值是 10。
    • MaxStartups,这个是限制处于联机页面的连接数,默认值 10。联机页面就是当你登录 ssh 时,还没输入密码的页面。即控制并发初始化连接的个数,初始化连接即还未到认证层面的连接。默认值是三元组形式10:30:100,表示如果超过 10 个并发初始化连接,则后续的连接由 30%的几率直接被关闭,如果超过 100 个连接,则所有新的连接 100%直接关闭。


    Software caused connection abort

    本地之前正常访问服务器 ssh 的 22 端口。连接 SSH 即使密码正确也连接不上,等待几秒钟之后提示:FATAL ERROR: Network error: Network error: Software caused connection abort,根本无法正常的连接。

    vim /etc/ssh/sshd_config
    
    #修改 sshd_config 配置
    LoginGraceTime 0
    TCPKeepAlive yes
    
    #修改完毕后,重启 sshd 服务
    systemctl restart sshd
    


    Host key verification failed

    本机~/.ssh/known_hosts服务端发过来的服务端公钥储存文件:A 通过 ssh 首次连接到 B,B 会将公钥1(host key)传递给 A,A 将公钥 1 存入 known_hosts文件中,以后 A 再连接 B 时,B 依然会传递给 A 一个公钥 2,OpenSSH 会核对公钥,通过对比公钥 1 与公钥 2 是否相同来进行简单的验证,如果公钥不同,OpenSSH 会发出警告,避免你受到 DNS Hijack之类的攻击。

    A 通过 ssh 登陆 B 时提示:Host key verification failed.。原因:A 的 known_hosts 文件中记录的 B 的公钥 1 与连接时 B 传过来的公钥 2 不匹配。解决方法:删除 A 的 known_hosts 文件中记录的 B 的公钥(手动进行,不适用于自动化部署情形)。