Menu

目录

加固SSH服务

说明

SSH(Secure Shell)是目前较可靠,专为远程登录会话和其他网络服务提供安全性保障的协议。利用SSH协议可以有效防止远程管理过程中的信息泄露问题。透过SSH可以对所有传输的数据进行加密,并防止DNS欺骗和IP欺骗。OpenSSH是SSH协议的免费开源实现。

加固SSH服务,是指修改SSH服务中的配置来设置系统使用OpenSSH协议时的算法、认证等参数,从而提高系统的安全性。表1中详细说明了各加固项含义、建议加固值及其默认策略。

实现

服务端加固操作如下:

  1. 打开服务端SSH服务的配置文件/etc/ssh/sshd_config,在该文件中修改或添加对应加固项及其加固值。
  2. 保存/etc/ssh/sshd_config文件。
  3. 重启SSH服务,命令如下:

    systemctl restart sshd
    

客户端加固操作如下:

  1. 打开客户端SSH服务的配置文件/etc/ssh/ssh_config,在该文件中修改或添加对应加固项及其加固值。
  2. 保存/etc/ssh/ssh_config文件。
  3. 重启SSH服务,命令如下:

    systemctl restart sshd
    

加固项说明

  • 服务端加固策略

    SSH服务的所有加固项均保存在配置文件/etc/ssh/sshd_config中,服务端各加固项的含义、加固建议以及openEuler默认是否已经加固为建议加固值请参见表1

    表 1 SSH服务端加固项说明

    加固项

    加固项说明

    加固建议

    openEuler默认是否已加固为建议值

    Protocol

    设置使用SSH协议的版本

    2

    SyslogFacility

    设置SSH服务的日志类型。加固策略将其设置为“AUTH”,即认证类日志

    AUTH

    LogLevel

    设置记录sshd日志消息的层次

    VERBOSE

    X11Forwarding

    设置使用SSH登录后,能否使用图形化界面

    no

    MaxAuthTries

    最大认证尝试次数

    3

    PubkeyAuthentication

    设置是否允许公钥认证。

    yes

    RSAAuthentication

    设置是否允许只有RSA安全验证

    yes

    IgnoreRhosts

    设置是否使用rhosts文件和shosts文件进行验证。rhosts文件和shosts文件用于记录可以访问远程计算机的计算机名及关联的登录名

    yes

    RhostsRSAAuthentication

    设置是否使用基于rhosts的RSA算法安全验证。rhosts文件记录可以访问远程计算机的计算机名及关联的登录名

    no

    HostbasedAuthentication

    设置是否使用基于主机的验证。基于主机的验证是指已信任客户机上的任何用户都可以使用SSH连接

    no

    PermitRootLogin

    禁止root账户直接SSH登录系统。

    说明:

    若需要直接使用root账户通过SSH登录系统,请修改/etc/ssh/sshd_config文件的PermitRootLogin字段的值为yes。

    no

    PermitEmptyPasswords

    设置是否允许用口令为空的账号登录

    no

    PermitUserEnvironment

    设置是否解析 ~/.ssh/environment和~/.ssh/authorized_keys中设定的环境变量

    no

    Ciphers

    设置SSH数据传输的加密算法

    aes128-ctr,aes192-ctr,aes256-ctr,chacha20-poly1305@openssh.com,aes128-gcm@openssh.com,aes256-gcm@openssh.com

    ClientAliveInterval

    设置系统等待的超时时间(单位秒)。超过指定时间未收到来自客户端的数据,则断开连接

    300

    ClientAliveCountMax

    设置超时次数。服务器发出请求后,客户端没有响应的次数达到一定值,连接自动断开

    0

    Banner

    指定登录SSH前后显示的提示信息的文件

    /etc/issue.net

    MACs

    设置SSH数据校验的哈希算法

    hmac-sha2-512,hmac-sha2-512-etm@openssh.com,hmac-sha2-256,hmac-sha2-256-etm@openssh.com,hmac-sha1,hmac-sha1-etm@openssh.com

    StrictModes

    设置SSH在接收登录请求之前是否检查用户HOME目录和rhosts文件的权限和所有权

    yes

    UsePAM

    使用PAM登录认证

    yes

    AllowTcpForwarding

    设置是否允许TCP转发

    no

    Subsystem sftp /usr/libexec/openssh/sftp-server

    sftp日志记录级别,记录INFO级别以及认证日志。

    -l INFO -f AUTH

    AllowAgentForwarding

    设置是否允许SSH Agent转发

    no

    GatewayPorts

    设置是否允许连接到转发客户端端口

    no

    PermitTunnel

    Tunnel设备是否允许使用

    no

    KexAlgorithms

    设置SSH密钥交换算法

    curve25519-sha256,curve25519-sha256@@libssh.org,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group-exchange-sha256

      

    LoginGraceTime

    限制用户必须在指定的时限内认证成功,0 表示无限制。默认值是 60 秒。

    60

    说明:
    默认情况下,登录SSH前后显示的提示信息保存在/etc/issue.net文件中,/etc/issue.net默认信息为“Authorized users only. All activities may be monitored and reported.”。

  • 客户端加固策略

    SSH服务的所有加固项均保存在配置文件/etc/ssh/ssh_config中,客户端各加固项的含义、加固建议以及openEuler默认是否已经加固为建议加固值请参见表2

    表 2 SSH客户端加固项说明

    加固项

    加固项说明

    加固建议

    openEuler默认是否已加固为建议值

    KexAlgorithms

    设置SSH密钥交换算法

    ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1

    VerifyHostKeyDNS

    是否使用DNS或者SSHFP资源记录验证HostKey

    ask

    说明:
    对于使用dh算法进行密钥交换的第三方客户端和服务端工具,要求允许建立连接的最低长度为2048bits。

其他安全建议

  • SSH服务仅侦听指定IP地址

    出于安全考虑,建议用户在使用SSH服务时,仅在必需的IP上进行绑定侦听,而不是侦听0.0.0.0,可修改/etc/ssh/sshd_config文件中的ListenAddress配置项。

    1. 打开并修改/etc/ssh/sshd_config文件

      vi /etc/ssh/sshd_config
      

      修改内容如下,表示绑定侦听IP为 _192.168.1.100_,用户可根据实际情况修改需要侦听的IP

      ...
      ListenAddress 192.168.1.100
      ...
      
    2. 重启SSH服务

      systemctl restart sshd.service
      
  • 限制SFTP用户向上跨目录访问

    SFTP是FTP over SSH的安全FTP协议,对于访问SFTP的用户建议使用专用账号,只能上传或下载文件,不能用于SSH登录,同时对SFTP可以访问的目录进行限定,防止目录遍历攻击,具体配置如下:

    说明:
    sftpgroup为示例用户组,sftpuser为示例用户名。

    1. 创建SFTP用户组

      groupadd sftpgroup
      
    2. 创建SFTP根目录

      mkdir /sftp
      
    3. 修改SFTP根目录属主和权限

      chown root:root /sftp
      chmod 755 /sftp
      
    4. 创建SFTP用户

      useradd -g sftpgroup -s /sbin/nologin sftpuser
      
    5. 设置SFTP用户的口令

      passwd sftpuser
      
    6. 创建SFTP用户上传目录

      mkdir /sftp/sftpuser
      
    7. 修改SFTP用户上传目录属主和权限

      chown root:root /sftp/sftpuser
      chmod 755 /sftp
      
    8. 修改/etc/ssh/sshd_config文件

      vi /etc/ssh/sshd_config
      

      修改内容如下:

      #Subsystem sftp /usr/libexec/openssh/sftp-server -l INFO -f AUTH
      Subsystem sftp internal-sftp -l INFO -f AUTH
      ...
               
      Match Group sftpgroup                  
          ChrootDirectory /sftp/%u
          ForceCommand internal-sftp
      

      说明:
      - %u代表当前sftp用户的用户名,这是一个通配符,用户原样输入即可。
      - 以下内容必须加在/etc/ssh/sshd_config文件的末尾。

           Match Group sftpgroup                    
             ChrootDirectory /sftp/%u  
             ForceCommand internal-sftp  
      
    9. 重启SSH服务

      systemctl restart sshd.service
      
  • SSH远程执行命令

    OpenSSH通用机制,在远程执行命令时,默认不开启tty,如果执行需要密码的命令,密码会明文回显。出于安全考虑,建议用户增加-t选项,确保密码输入安全。如下:

    ssh -t testuser@192.168.1.100 su
    

    说明:
    192.168.1.100为示例IP,testuser为示例用户。