【学习笔记】Linux系统中SSH服务安全配置

一、背景知识

以ubuntu为例,查看ssh服务是否安全并配置,执行

bash 复制代码
ssh -V

ssh的配置文件路径:/etc/ssh/sshd_config

二、SSH服务配置文件

1.端口和监听设置

  • Port 22

    • 含义:指定SSH服务监听的端口号(默认是22)。

    • 解释:从安全角度,默认端口22容易成为攻击目标,建议改为非标准端口以减少扫描风险。从功能角度,如果启用(如Port 2222),则会改变连接端口。

  • AddressFamily any

    • 含义:控制SSH服务支持的网络地址族(如IPv4或IPv6)。any表示同时支持IPv4和IPv6。

    • 解释:从兼容性角度,启用该配置可以确保服务在现代网络中正常工作。从安全角度,如果只使用IPv4,可以设为inet以减少潜在攻击面。

  • ListenAddress 0.0.0.0

    • 含义:指定SSH服务监听的IPv4地址(0.0.0.0表示所有可用IPv4接口)。

    • 解释:从安全角度,绑定到特定IP(如192.168.1.100)可以减少暴露面。从功能角度,默认设置方便多网卡环境。

  • ListenAddress : :

    • 含义:指定SSH服务监听的IPv6地址(::表示所有可用IPv6接口)。

    • 解释:类似IPv4设置,默认启用所有接口便于访问,但从安全角度,建议根据网络需求定制。


2.主机密钥设置

  • HostKey /etc/ssh/ssh_host_rsa_key

    • 含义:指定RSA算法的主机密钥文件路径,用于服务器身份验证。

    • 解释:从安全角度,RSA密钥提供强加密,是现代SSH的推荐设置。默认路径确保密钥存储可靠。

  • HostKey /etc/ssh/ssh_host_dsa_key

    • 含义:指定DSA算法的主机密钥文件路径。

    • 解释:从安全角度,DSA已过时且易受攻击,不建议启用。功能角度,兼容旧系统,但默认禁用是好的做法。

  • HostKey /etc/ssh/ssh_host_ecdsa_key

    • 含义:指定ECDSA算法的主机密钥文件路径,提供更强的安全性和效率。

    • 解释:从性能角度,ECDSA比RSA更快速;从安全角度,它基于椭圆曲线密码学,推荐用于现代系统。

  • HostKey /etc/ssh/ssh_host_ed25519_key

    • 含义:指定Ed25519算法的主机密钥文件路径,这是一种高性能且安全的密钥类型。

    • 解释:从安全角度,Ed25519提供顶级保护;从功能角度,它适合高安全环境,如云服务器。


3.加密和密钥设置(Ciphers and Keying)

  • RekeyLimit default none

    • 含义:定义会话密钥重新生成的限制(如数据量或时间),default表示使用系统默认值,none表示不限制。

    • 解释:从安全角度,定期重新密钥可防止长期攻击;从性能角度,限制过多可能影响连接速度。默认值通常在安全性和效率间平衡。


4.日志设置

  • SyslogFacility AUTH

    • 含义:指定日志消息的Syslog工具(facility),AUTH用于认证相关消息。

    • 解释:从审计角度,启用此配置可帮助记录认证事件,但默认未设置,需结合其他配置。

  • SyslogFacility AUTHPRIV

    • 含义:指定日志消息的Syslog工具为AUTHPRIV(私有认证消息),提供更安全的日志记录。

    • 解释:从安全角度,AUTHPRIV比AUTH更安全,因为它限制日志访问权限;从功能角度,便于管理员审计SSH事件。

  • LogLevel INFO

    • 含义:设置日志详细级别,INFO显示常规信息(如连接和认证)。

    • 解释:从监控角度,INFO级足够日常使用;从性能角度,更高级别(如DEBUG)可能产生大量日志,影响磁盘空间。


5.认证设置(Authentication)

  • LoginGraceTime 2m

    • 含义:定义用户登录尝试的超时时间(默认2分钟),超时后连接关闭。

    • 解释:从安全角度,短超时(如1分钟)可防暴力攻击;从可用性角度,默认值避免合法用户因延迟被踢出。

  • PermitRootLogin yes

    • 含义:控制是否允许root用户直接登录。yes表示允许。

    • 解释:从安全角度,设为no或without-password(仅密钥登录)可大幅降低风险;从管理角度,默认可能允许root登录,但不推荐。

  • StrictModes yes

    • 含义:检查用户密钥文件的权限(如.ssh目录必须为700),防止未授权访问。

    • 解释:从安全角度,启用此选项可防止密钥泄露;功能角度,确保文件权限正确。

  • MaxAuthTries 6

    • 含义:设置每个连接允许的最大认证尝试次数(默认6次)。

    • 解释:从安全角度,减少此值(如3次)可防暴力破解;从误操作角度,默认值避免合法用户被锁出。

  • MaxSessions 10

    • 含义:限制每个网络连接允许的并发会话数(默认10)。

    • 解释:从资源角度,控制会话数可防DoS攻击;从功能性角度,默认值适合多数场景。

  • PubkeyAuthentication yes

    • 含义:启用公钥认证(基于密钥对登录)。

    • 解释:从安全角度,公钥认证比密码更安全;功能角度,它是SSH的主要登录方式。

  • AuthorizedKeysFile .ssh/authorized_keys

    • 含义:指定用户公钥存储文件的位置(默认.ssh/authorized_keys)。

    • 解释:从安全角度,固定路径便于管理;功能角度,简化密钥部署。

  • AuthorizedPrincipalsFile none

    • 含义:定义基于角色的认证文件(如用于多用户管理),none表示禁用。

    • 解释:从管理角度,此配置适用于复杂环境;安全角度,默认禁用减少攻击面。

  • AuthorizedKeysCommand none

    • 含义:指定外部命令来获取授权密钥,none表示禁用。

    • 解释:功能角度,启用此选项可实现动态密钥管理;安全角度,外部命令可能引入风险。

  • AuthorizedKeysCommandUser nobody

    • 含义:设置运行AuthorizedKeysCommand的用户(默认nobody)。

    • 解释:从权限角度,指定低权限用户可增强安全;默认未启用,因为主命令未启用。

  • HostbasedAuthentication no

    • 含义:控制基于主机的认证(信任其他主机),no表示禁用。

    • 解释:从安全角度,此方法风险高(易受IP欺骗),不建议启用;功能角度,仅用于特殊信任环境。

  • IgnoreUserKnownHosts no

    • 含义:是否忽略用户的~/.ssh/known_hosts文件(用于主机验证),no表示不忽略。

    • 解释:从安全角度,启用此选项(设为yes)可防某些攻击,但会降低便利性;功能角度,默认保持主机验证。

  • IgnoreRhosts yes

    • 含义:是否忽略用户的.rhosts和.shosts文件(旧式认证),yes表示忽略。

    • 解释:从安全角度,这些文件易被滥用,默认忽略是好的;历史兼容角度,仅在旧系统可能启用。

  • PasswordAuthentication yes

    • 含义:启用密码认证(用户输入密码登录)。

    • 解释:冗余行,实际设置由未注释行控制。

  • PasswordAuthentication yes

    • 含义:启用密码认证。

    • 解释:从安全角度,密码认证易受暴力破解,建议禁用(设为no)并改用密钥;从可用性角度,启用便于用户初始登录。

  • PermitEmptyPasswords no

    • 含义:禁止空密码登录,no表示不允许。

    • 解释:从安全角度,空密码是严重漏洞,默认禁用是必须的。

  • ChallengeResponseAuthentication yes

    • 含义:启用挑战-响应认证(如一次性密码)。

    • 解释:冗余行,实际设置由未注释行控制。

  • ChallengeResponseAuthentication no

    • 含义:禁用挑战-响应认证。

    • 解释:从安全角度,禁用此选项可简化认证流程;功能角度,如果启用,需额外配置(如PAM)。

  • GSSAPIAuthentication yes

    • 含义:启用GSSAPI认证(基于Kerberos或类似协议)。

    • 解释:从安全角度,GSSAPI提供强企业级认证;从集成角度,适用于Active Directory环境。

  • GSSAPICleanupCredentials no

    • 含义:控制是否在会话结束时清理GSSAPI凭据,no表示不清理。

    • 解释:从安全角度,清理凭据可防泄露;功能角度,设为no可能提高便利性(如保持单点登录)。

  • GSSAPIStrictAcceptorCheck yes

    • 含义:严格检查GSSAPI服务名称,yes表示启用严格模式。

    • 解释:从安全角度,启用可防中间人攻击;性能角度,严格检查可能增加开销。

  • GSSAPIKeyExchange no 和 GSSAPIEnablek5users no

    • 含义:控制GSSAPI在密钥交换或用户映射中的使用,no表示禁用。

    • 解释:功能角度,仅在需要Kerberos集成时启用;安全角度,默认禁用避免复杂配置错误。


6.PAM设置

  • UsePAM yes

    • 含义:启用PAM认证框架,允许集成系统级认证策略。

    • 解释:从安全角度,PAM支持多因子认证和账户锁定;从功能性角度,它覆盖密码和挑战响应认证(如文本中警告所述),并处理账户与会话管理。警告提到在Red Hat系统中禁用PAM可能导致问题,因此启用是推荐的。


7.转发和X11设置

  • AllowAgentForwarding yes

    • 含义:允许SSH代理转发(转发本地密钥到远程主机)。

    • 解释:从便利角度,转发便于跳板机访问;安全角度,可能被滥用,建议在受控环境启用。

  • AllowTcpForwarding yes

    • 含义:允许TCP端口转发(创建隧道)。

    • 解释:功能角度,启用便于VPN-like功能;安全角度,转发可能被用于绕过防火墙。

  • GatewayPorts no

    • 含义:控制转发端口是否绑定到所有接口(no表示仅本地)。

    • 解释:从安全角度,设为no可防止外部访问转发端口;功能角度,设为yes允许远程共享端口。

  • X11Forwarding yes

    • 含义:启用X11图形界面转发(显示远程GUI应用)。

    • 解释:从功能性角度,便于远程桌面;安全角度,X11转发有历史漏洞,建议仅在需要时启用。

  • X11DisplayOffset 10

    • 含义:设置X11显示端口的偏移量(默认10)。

    • 解释:功能角度,偏移防止端口冲突;性能角度,默认值通常足够。

  • X11UseLocalhost yes

    • 含义:绑定X11转发到localhost(仅本地访问)。

    • 解释:安全角度,绑定localhost可减少网络暴露;默认启用是好的。

  • PermitTTY yes

    • 含义:允许分配TTY(终端)

三、SSH服务安全配置

1.基础安全配置

(1)修改默认端口

将默认 22 端口改为高位端口(如 1024 以上),降低扫描攻击风险

Port 2222 # 在 /etc/ssh/sshd_config 中修改

(2)强制使用 SSH-2 协议

禁用不安全的 SSH-1,仅保留最新协议版本:Protocol 2

(3)限制监听地址

仅绑定必要的内网或特定 IP,减少暴露面:

ListenAddress 192.168.1.100 # 非必要不监听 0.0.0.0

2.认证机制强化

(1)禁用密码认证

全面启用密钥认证,规避暴力破解风险

PasswordAuthentication no

PubkeyAuthentication yes

(2)双因素认证(2FA)

结合 Google Authenticator 等工具实现动态验证码+密钥的双重验证

安装 libpam-google-authenticator 后配置

ChallengeResponseAuthentication yes AuthenticationMethods publickey,keyboard-interactive

(3)禁止 root 直接登录

强制使用普通用户登录后提权:

PermitRootLogin no

3.访问控制策略

(1)用户/IP 白名单

仅允许指定用户或 IP 段访问,例如:

AllowUsers user1 user2@192.168.*.* # 支持通配符

(2)防火墙规则

使用云平台安全组或 ufw/iptables 限制 SSH 端口的来源 IP:

sudo ufw allow from 192.168.1.0/24 to any port 2222

(3)登录频率限制

通过 Fail2ban 自动封禁异常 IP(如 30 秒内 3 次失败尝试)

4.高级安全参数

(1)会话超时控制

自动断开无响应连接,防止闲置会话占用资源:

ClientAliveInterval 300 # 300 秒检测一次

ClientAliveCountMax 3

(2)权限分离与日志监控

UsePrivilegeSeparation yes # 隔离特权操作

LogLevel VERBOSE # 记录详细日志

(3)禁用非必要功能

关闭图形转发和空密码登录:

X11Forwarding no

PermitEmptyPasswords no

5.密钥管理与维护

(1)密钥生成规范

使用高强度算法生成密钥对:

ssh-keygen -t ed25519 -a 100 # 或 RSA-4096

(2)密钥定期轮换

建议每 6-12 个月更换一次密钥,并清理废弃公钥。

(3)文件权限控制

chmod 600 ~/.ssh/authorized_keys # 用户密钥严格权限

(4)补充工具推荐

SSH 客户端安全配置:在 ~/.ssh/config 中指定私钥路径和保活参数:

ServerAliveInterval 60 # 防止 NAT 超时

SELinux/AppArmor:启用强制访问控制框架限制 SSH 进程权限


参考文献:

Linux系统中的SSH服务配置详解与安全配置