SSH服务配置完全解析:sshd -T 逐项详解
前言
sshd -T 是OpenSSH提供的一个诊断命令,用于显示SSH服务当前实际生效的完整运行时配置。与直接查看 /etc/ssh/sshd_config 文件不同,该命令输出的配置是经过解析、合并默认值、应用Include指令后的最终结果,是排查SSH问题的黄金参考。
本文基于以下 sshd -T 输出进行逐项解析,共 95项配置,覆盖网络、认证、加密、会话、转发、日志、子系统等全部维度,并对每一项配置进行完整、详细的解释。
port 22
addressfamily any
listenaddress [::]:22
listenaddress 0.0.0.0:22
usepam yes
logingracetime 120
x11displayoffset 10
maxauthtries 6
maxsessions 10
clientaliveinterval 60
clientalivecountmax 3
requiredrsasize 1024
streamlocalbindmask 0177
unusedconnectiontimeout none
permitrootlogin yes
ignorerhosts yes
ignoreuserknownhosts no
hostbasedauthentication no
hostbasedusesnamefrompacketonly no
pubkeyauthentication yes
kerberosauthentication no
kerberosorlocalpasswd yes
kerberosticketcleanup yes
gssapiauthentication no
gssapicleanupcredentials yes
gssapikeyexchange no
gssapistrictacceptorcheck yes
gssapistorecredentialsonrekey no
gssapikexalgorithms gss-group14-sha256-,gss-group16-sha512-,gss-nistp256-sha256-,gss-curve25519-sha256-,gss-group14-sha1-,gss-gex-sha1-
passwordauthentication yes
kbdinteractiveauthentication no
printmotd no
printlastlog yes
x11forwarding yes
x11uselocalhost yes
permittty yes
permituserrc yes
strictmodes yes
tcpkeepalive yes
permitemptypasswords no
compression yes
gatewayports no
usedns no
allowtcpforwarding yes
allowagentforwarding yes
disableforwarding no
allowstreamlocalforwarding yes
streamlocalbindunlink no
fingerprinthash SHA256
exposeauthinfo no
debianbanner yes
pidfile /run/sshd.pid
modulifile /etc/ssh/moduli
xauthlocation /usr/bin/xauth
ciphers chacha20-poly1305@openssh.com,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com
macs umac-64-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha1-etm@openssh.com,umac-64@openssh.com,umac-128@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-sha1
banner none
forcecommand none
chrootdirectory none
trustedusercakeys none
revokedkeys none
securitykeyprovider internal
authorizedprincipalsfile none
versionaddendum none
authorizedkeyscommand none
authorizedkeyscommanduser none
authorizedprincipalscommand none
authorizedprincipalscommanduser none
hostkeyagent none
kexalgorithms sntrup761x25519-sha512@openssh.com,curve25519-sha256,curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,diffie-hellman-group14-sha256
casignaturealgorithms ssh-ed25519,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,sk-ssh-ed25519@openssh.com,sk-ecdsa-sha2-nistp256@openssh.com,rsa-sha2-512,rsa-sha2-256
hostbasedacceptedalgorithms ssh-ed25519-cert-v01@openssh.com,ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp521-cert-v01@openssh.com,sk-ssh-ed25519-cert-v01@openssh.com,sk-ecdsa-sha2-nistp256-cert-v01@openssh.com,rsa-sha2-512-cert-v01@openssh.com,rsa-sha2-256-cert-v01@openssh.com,ssh-ed25519,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,sk-ssh-ed25519@openssh.com,sk-ecdsa-sha2-nistp256@openssh.com,rsa-sha2-512,rsa-sha2-256
hostkeyalgorithms ssh-ed25519-cert-v01@openssh.com,ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp521-cert-v01@openssh.com,sk-ssh-ed25519-cert-v01@openssh.com,sk-ecdsa-sha2-nistp256-cert-v01@openssh.com,rsa-sha2-512-cert-v01@openssh.com,rsa-sha2-256-cert-v01@openssh.com,ssh-ed25519,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,sk-ssh-ed25519@openssh.com,sk-ecdsa-sha2-nistp256@openssh.com,rsa-sha2-512,rsa-sha2-256
pubkeyacceptedalgorithms ssh-ed25519-cert-v01@openssh.com,ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp521-cert-v01@openssh.com,sk-ssh-ed25519-cert-v01@openssh.com,sk-ecdsa-sha2-nistp256-cert-v01@openssh.com,rsa-sha2-512-cert-v01@openssh.com,rsa-sha2-256-cert-v01@openssh.com,ssh-ed25519,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,sk-ssh-ed25519@openssh.com,sk-ecdsa-sha2-nistp256@openssh.com,rsa-sha2-512,rsa-sha2-256
loglevel INFO
syslogfacility AUTHPRIV
authorizedkeysfile .ssh/authorized_keys .ssh/authorized_keys2
hostkey /etc/ssh/ssh_host_rsa_key
hostkey /etc/ssh/ssh_host_ecdsa_key
hostkey /etc/ssh/ssh_host_ed25519_key
acceptenv LANG
acceptenv LC_*
authenticationmethods any
channeltimeout none
subsystem sftp /usr/lib/openssh/sftp-server
maxstartups 10:30:100
persourcemaxstartups none
persourcenetblocksize 32:128
permittunnel no
ipqos lowdelay throughput
rekeylimit 0 0
permitopen any
permitlisten any
permituserenvironment no
pubkeyauthoptions none
第一部分:网络与地址配置(4项)
第1项:port 22
配置值:22
含义:SSH服务监听的TCP端口号。
详细解释:
- 22是IANA(互联网号码分配机构)官方分配的SSH协议端口号
- 这是SSH客户端的默认连接端口,如果不指定端口,客户端默认连接22端口
- 修改为其他端口(如2222、8022等)可以:
- 减少自动化扫描工具的暴力破解尝试
- 降低被随机端口扫描发现的概率
- 但修改端口也有代价:
- 客户端每次连接都必须使用
-p参数指定端口 - 某些企业防火墙或代理服务器可能只允许22端口出站
- 安全增强效果有限,真正的安全依赖于认证机制强度
- 客户端每次连接都必须使用
- 修改方法:在
/etc/ssh/sshd_config中设置Port 2222,然后重启服务
第2项:addressfamily any
配置值:any
含义:指定SSH服务使用的IP地址族(Address Family)。
详细解释:
any:同时监听IPv4和IPv6协议栈(这是默认值)inet:仅监听IPv4协议栈inet6:仅监听IPv6协议栈- 如果系统未配置IPv6网络,建议设置为
inet,避免创建不必要的IPv6监听套接字 - 该配置与
ListenAddress指令协同工作
第3项:listenaddress [::]:22
配置值:[::]:22
含义:绑定到所有IPv6地址的22端口。
详细解释:
[::]是IPv6的”所有地址”表示方式,等同于IPv4中的0.0.0.0- 这表示SSH服务会监听本机所有IPv6网络接口的22端口
- 如果
addressfamily设置为inet6或any,此项生效 - 若只想让SSH服务监听特定的IPv6地址,可配置为具体IPv6地址
第4项:listenaddress 0.0.0.0:22
配置值:0.0.0.0:22
含义:绑定到所有IPv4地址的22端口。
详细解释:
0.0.0.0表示本机所有IPv4网络接口(包括127.0.0.1、内网IP、公网IP等)- 如果只想让SSH服务于特定网卡,可配置为具体的IP地址,如
ListenAddress 192.168.1.10:22 - 绑定到
127.0.0.1:22时,SSH服务仅能被本机访问,外部网络无法连接 - 安全提示:绑定到
0.0.0.0意味着任何能路由到该主机的客户端均可尝试连接,应配合防火墙使用
第二部分:认证方式配置(17项)
第5项:usepam yes
配置值:yes
含义:是否启用PAM(可插拔认证模块,Pluggable Authentication Modules)进行认证。
详细解释:
yes:启用PAM认证(默认值)no:禁用PAM认证,使用SSH内置的密码验证机制
PAM是什么:
PAM是Linux系统中一个灵活、模块化的认证框架。它允许系统管理员配置多种认证方式,而无需修改应用程序本身的源代码。SSH通过PAM可以实现以下功能:
| 功能 | 说明 |
|---|---|
| 密码认证 | 通过 /etc/pam.d/sshd 配置调用系统密码验证(/etc/shadow) |
| 账户状态检查 | 检查账户是否过期、是否被锁定、登录时间是否允许 |
| 资源限制 | 通过 pam_limits.so 模块设置用户资源限制(如打开文件数) |
| 双因素认证 | 集成Google Authenticator等MFA方案,实现两步验证 |
| LDAP/AD认证 | 通过 pam_ldap.so 或 pam_winbind.so 实现集中式认证 |
| 审计日志 | 通过 pam_unix.so 模块记录详细的认证日志 |
usepam yes 的实际影响:
- 密码认证流程变化:即使
PasswordAuthentication yes,实际的密码验证也是通过PAM进行的,而不是SSH直接读取/etc/shadow - 账户状态检查:PAM会检查账户是否过期、密码是否过期、登录时间限制等
- 会话管理:PAM可以执行登录前和登录后的钩子脚本
- 扩展性:可以轻松添加新的认证方式而无需修改SSH源码
usepam no 的影响:
- SSH使用内置的密码验证机制(直接读取
/etc/shadow文件) - 无法使用PAM提供的账户状态检查、双因素认证、LDAP集成等扩展功能
- 不推荐禁用
相关配置文件:
| 文件路径 | 作用 |
|---|---|
/etc/pam.d/sshd | SSH服务的PAM配置,决定认证流程 |
/etc/pam.d/system-auth | 系统级认证配置(Red Hat/CentOS系列) |
/etc/pam.d/common-auth | 系统级认证配置(Debian/Ubuntu系列) |
/etc/security/limits.conf | 用户资源限制配置文件 |
/usr/lib64/security/ | PAM模块目录(Red Hat/CentOS系列) |
/usr/lib/x86_64-linux-gnu/security/ | PAM模块目录(Debian/Ubuntu系列) |
第6项:permitrootlogin yes
配置值:yes
含义:是否允许root用户直接通过SSH登录。
详细解释:
yes:允许root用户直接登录(默认值),输入root密码或使用root密钥即可登录prohibit-password(或同义的without-password):仅允许root使用密钥认证登录,禁止密码认证no:完全禁止root用户通过SSH登录
安全建议:
- 允许root登录简化了管理操作,但root账户是暴力破解的首要目标
- 最佳实践:使用普通用户登录服务器,然后通过
sudo或su -命令切换到root执行管理任务 - 如果必须允许root登录,强烈建议:
- 使用密钥认证(
PermitRootLogin prohibit-password) - 禁用密码认证(
PasswordAuthentication no) - 配置
fail2ban防止暴力破解
- 使用密钥认证(
第7项:passwordauthentication yes
配置值:yes
含义:是否允许使用密码进行认证。
详细解释:
yes:允许用户使用密码登录(默认值)no:禁用密码认证,仅允许公钥认证或其他认证方式
安全考量:
- 密码认证是最容易被暴力破解的认证方式
- 在公网环境中,如果启用密码认证,强烈建议配合
fail2ban使用 - 更安全的实践是:
PasswordAuthentication no+PubkeyAuthentication yes - 密码在通过网络传输时是加密的(SSH协议加密),但密码本身的强度依赖于用户习惯
- 弱密码(如
123456、password)是安全漏洞的主要来源
第8项:pubkeyauthentication yes
配置值:yes
含义:是否允许公钥认证。
详细解释:
yes:用户可以使用SSH密钥对进行登录认证(默认值)no:禁用密钥认证
SSH密钥认证的工作原理:
- 用户生成一对密钥:私钥(保密)和公钥(公开)
- 将公钥内容添加到服务器
~/.ssh/authorized_keys文件中 - 登录时,客户端使用私钥对特定数据进行签名
- 服务器用公钥验证签名的正确性,从而确认用户身份
密钥认证的安全性优势:
- 私钥由客户端保管,不经过网络传输,不存在被中间人截获的风险
- 可以设置私钥密码(passphrase),即使私钥泄露也有第二层保护
- 支持在公钥前添加限制选项:
command="/usr/bin/command":限制执行特定命令from="192.168.1.*":限制来源IP地址no-port-forwarding:禁止端口转发no-X11-forwarding:禁止X11转发no-agent-forwarding:禁止代理转发
密钥类型推荐:
- Ed25519(推荐,安全性高、性能好、密钥短)
- RSA 2048位或更高(兼容性最好)
- ECDSA(兼容性较好)
第9项:kbdinteractiveauthentication no
配置值:no
含义:是否启用键盘交互式认证。
详细解释:
- 键盘交互式认证(Keyboard Interactive Authentication)允许SSH服务器向客户端发出多个提示(类似挑战-响应机制)
- 常见的应用场景:
- 双因素认证(2FA):如Google Authenticator的动态验证码
- PAM模块交互:某些PAM模块需要与用户进行多步交互
- 一次性密码(OTP):如S/Key认证
- 与密码认证的区别:密码认证是一次性输入,键盘交互式认证可以有多轮问答
no表示未启用此方式- 如需启用,可设置为
yes并配置相应的PAM模块
第10项:gssapiauthentication no
配置值:no
含义:是否启用GSSAPI(通用安全服务应用程序接口)认证。
详细解释:
- GSSAPI是一个通用的安全服务接口,主要用于实现Kerberos认证
- Kerberos是一种网络认证协议,由MIT开发,使用票据(ticket)机制实现单点登录(SSO)
- GSSAPI认证的典型场景:
- Windows Active Directory域环境中的Linux服务器
- 企业内部使用Kerberos进行统一身份认证
no表示未启用GSSAPI认证- 启用方法:在配置文件中设置
GSSAPIAuthentication yes - 启用后需要配置
/etc/krb5.conf文件,指定KDC服务器和域名
第11项:gssapicleanupcredentials yes
配置值:yes
含义:GSSAPI认证完成后是否清理凭据缓存。
详细解释:
yes(默认值):认证完成后清理GSSAPI临时凭据,释放资源no:保留凭据缓存,可能用于后续单点登录,但会占用资源- 仅当
GSSAPIAuthentication yes时此配置才生效 - 建议保持默认
yes,避免凭据残留带来的安全风险
第12项:gssapikeyexchange no
配置值:no
含义:是否允许使用GSSAPI进行密钥交换。
详细解释:
no(默认值):使用标准的密钥交换(KEX)算法yes:允许通过GSSAPI协商共享密钥- 在Kerberos环境中,启用此选项可以让SSH利用Kerberos票据进行密钥协商
- 较少使用,仅在特定环境(如需要完全集成Kerberos认证)时启用
第13项:gssapistrictacceptorcheck yes
配置值:yes
含义:GSSAPI认证时是否严格检查接受者(Acceptor)。
详细解释:
yes(默认值):验证服务主体名称(service principal name)是否完全匹配no:放宽检查,允许一定程度的主机名不匹配- 建议保持
yes,因为放宽检查可能导致安全风险 - 仅当
GSSAPIAuthentication yes时生效
第14项:gssapistorecredentialsonrekey no
配置值:no
含义:重新密钥交换时是否存储GSSAPI凭据。
详细解释:
no(默认值):不存储GSSAPI凭据yes:在重新密钥交换时存储凭据以便重用- 仅在长时间连接且需要持续Kerberos认证的场景下考虑启用
- 启用可减少认证开销,但会增加凭据管理复杂度
第15项:gssapikexalgorithms gss-group14-sha256-,gss-group16-sha512-,gss-nistp256-sha256-,gss-curve25519-sha256-,gss-group14-sha1-,gss-gex-sha1-
配置值:gss-group14-sha256-,gss-group16-sha512-,gss-nistp256-sha256-,gss-curve25519-sha256-,gss-group14-sha1-,gss-gex-sha1-
含义:GSSAPI密钥交换允许的算法列表。
详细解释:
- 以
gss-开头的算法通过GSSAPI框架实现密钥交换 - 算法名称末尾的
-表示该算法可用 - 各算法含义:
| 算法 | 说明 |
|---|---|
| gss-group14-sha256 | 基于Diffie-Hellman group14 + SHA256哈希 |
| gss-group16-sha512 | 基于Diffie-Hellman group16 + SHA512哈希 |
| gss-nistp256-sha256 | 基于NIST P256椭圆曲线 + SHA256 |
| gss-curve25519-sha256 | 基于Curve25519椭圆曲线 + SHA256 |
| gss-group14-sha1 | 旧算法,DH group14 + SHA1(兼容性保留) |
| gss-gex-sha1 | 旧算法,可交换DH组 + SHA1(兼容性保留) |
- 该列表仅在
GSSAPIKeyExchange yes时生效 - 算法优先级从左到右递减
第16项:kerberosauthentication no
配置值:no
含义:是否启用Kerberos认证。
详细解释:
- Kerberos是MIT开发的网络认证协议,使用对称密钥加密和可信第三方(KDC)机制
- 在企业单点登录(SSO)环境中广泛应用
no表示未启用Kerberos认证- 启用方法:
KerberosAuthentication yes - 启用后需配置:
/etc/krb5.conf:Kerberos配置文件kinit命令获取票据
- KDC(Key Distribution Center)服务器可达
第17项:kerberosorlocalpasswd yes
配置值:yes
含义:Kerberos认证失败后是否回退到本地密码认证。
详细解释:
yes(默认值):如果Kerberos认证失败(如票据过期、KDC不可达),尝试使用/etc/shadow中的本地密码进行认证no:Kerberos认证失败后直接拒绝连接,不回退到本地密码- 该配置仅在
KerberosAuthentication yes时生效 - 在纯Kerberos环境中,建议设置为
no以强制使用Kerberos认证
第18项:kerberosticketcleanup yes
配置值:yes
含义:会话结束后是否清理Kerberos票据缓存。
详细解释:
yes(默认值):用户注销后清理Kerberos票据缓存文件no:保留票据缓存,可能用于后续其他服务的单点登录- 建议保持默认
yes,避免票据泄露和缓存文件积累 - 仅在
KerberosAuthentication yes时生效
第19项:hostbasedauthentication no
配置值:no
含义:是否启用基于主机的认证。
详细解释:
- 基于主机的认证是一种信任特定主机的认证方式
- 工作原理:如果客户端主机名在服务器的信任列表中,则该主机上的任何用户都可以登录
- 依赖的配置文件:
/etc/hosts.equiv:系统级信任主机列表~/.shosts:用户级信任主机列表
no表示禁用此认证方式(默认值,安全)- 安全风险:如果信任主机被攻破,攻击者可访问所有信任该主机的服务器
- 除非在高度受控的内网环境,否则不建议启用
第20项:hostbasedusesnamefrompacketonly no
配置值:no
含义:基于主机的认证中,是否仅使用数据包中的主机名。
详细解释:
no:服务器会结合DNS反向解析来验证客户端提供的主机名yes:完全信任客户端提供的反向DNS主机名,不做验证- 安全风险:如果设置为
yes,攻击者可以伪造主机名绕过认证 - 建议保持
no - 仅在
HostbasedAuthentication yes时生效
第21项:ignorerhosts yes
配置值:yes
含义:是否忽略 /etc/hosts.equiv 和 ~/.rhosts 文件。
详细解释:
yes:忽略这些文件中的信任配置(更安全,默认)no:允许使用这些文件进行基于rhosts的认证~/.rhosts和/etc/hosts.equiv是旧式Unix认证机制,允许特定主机上的特定用户无需密码登录- 这种认证方式极不安全,已被现代SSH默认禁用
- 建议保持
yes
第三部分:认证限制配置(5项)
第22项:maxauthtries 6
配置值:6
含义:允许的最大认证尝试次数。
详细解释:
- 用户登录失败达到该次数后,SSH将断开连接并拒绝后续尝试
- 默认值为6次
- 每次失败尝试都会记录到系统日志(
/var/log/secure或/var/log/auth.log) - 这是防御暴力破解的重要参数
- 设置建议:
- 过小(如3次):容易误杀合法用户(输错密码)
- 过大(如20次):给暴力破解更多尝试机会
- 常规推荐:5-6次
第23项:maxsessions 10
配置值:10
含义:单个SSH连接允许的最大并发会话数。
详细解释:
- SSH支持连接复用(多路复用),一个TCP连接可以承载多个会话通道
- 示例场景:
- 同时开启多个终端窗口(shell会话)
- 同时执行多个SFTP文件传输操作
- 同时建立多个端口转发通道
- 默认值为10
- 设置为
0可完全禁用多路复用 - 该限制主要防止单个连接消耗过多服务器资源
第24项:maxstartups 10:30:100
配置值:10:30:100
含义:并发连接数的速率限制控制(DDoS防护机制)。
详细解释:
- 格式为
start:rate:full,三个参数的含义:
| 参数 | 当前值 | 含义 |
|---|---|---|
| start | 10 | 连接数在10以内时,全部接受(无条件) |
| rate | 30 | 连接数超过10后,新连接有30%的概率被拒绝 |
| full | 100 | 连接数达到100时,所有新连接被拒绝 |
工作原理解释:
- 阶段一(连接数 ≤ 10):所有连接请求都接受
- 阶段二(10 < 连接数 < 100):新连接有30%的概率被拒绝(随机决策)
- 阶段三(连接数 ≥ 100):所有新连接被拒绝
设计思想:
- 使用概率性拒绝而非硬阈值,避免突然拒绝所有连接
- 在大量并发连接时仍保留部分服务能力
- 可防止DDoS攻击或误配置导致的资源耗尽
第25项:persourcemaxstartups none
配置值:none
含义:单个源IP地址的最大并发连接数限制。
详细解释:
none:对单个源IP不设限制- 可设置具体数值,如
persourcemaxstartups 5,限制单个IP最多5个并发连接 - 这是防御单IP暴力破解的补充措施
- 与
maxstartups配合使用,实现多维度保护 - 在公网环境中建议设置合理值(如5-10),防止单个IP耗尽连接资源
第26项:persourcenetblocksize 32:128
配置值:32:128
含义:源IP网络块大小的限制配置。
详细解释:
- 格式为
IPv4前缀长度:IPv6前缀长度 32:128表示:- IPv4按
/32(单个IP地址)进行限制 - IPv6按
/128(单个IP地址)进行限制
- IPv4按
- 可调整为更宽松的网段限制:
24:64:限制整个C类子网(IPv4 /24)或IPv6 /64子网- 与
persourcemaxstartups配合使用,决定限制的粒度
第四部分:加密算法配置(7项)
第27项:ciphers chacha20-poly1305@openssh.com,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com
配置值:chacha20-poly1305@openssh.com,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com
含义:允许的对称加密算法列表(按优先级从高到低排序)。
详细解释:
- 客户端和服务器进行加密算法协商时,选择双方都支持且优先级最高的算法
- 当前配置的算法及其特点:
| 算法 | 类型 | 密钥长度 | 特点 |
|---|---|---|---|
| chacha20-poly1305@openssh.com | 流加密 + AEAD | 256位 | 软件实现速度快,无硬件依赖,推荐 |
| aes128-ctr | AES-CTR模式 | 128位 | 硬件加速支持好 |
| aes192-ctr | AES-CTR模式 | 192位 | 安全性比AES128略高 |
| aes256-ctr | AES-CTR模式 | 256位 | 最安全的AES-CTR |
| aes128-gcm@openssh.com | AES-GCM(AEAD) | 128位 | 同时加密和认证 |
| aes256-gcm@openssh.com | AES-GCM(AEAD) | 256位 | 最安全的AES-GCM |
关键概念解释:
- CTR模式:计数器模式,将块加密转换为流加密。比CBC模式更安全(不存在BEAST、Lucky13等Padding Oracle攻击)
- AEAD:带关联数据的认证加密(Authenticated Encryption with Associated Data),同时提供加密和完整性验证
- GCM:伽罗瓦/计数器模式,一种AEAD实现
- ChaCha20-Poly1305:Google开发的流加密算法,在无硬件AES加速的CPU上性能优异
安全建议:当前配置安全性较高,无需修改。
第28项:macs umac-64-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha1-etm@openssh.com,umac-64@openssh.com,umac-128@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-sha1
配置值:umac-64-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha1-etm@openssh.com,umac-64@openssh.com,umac-128@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-sha1
含义:允许的消息认证码(MAC)算法列表(按优先级从高到低排序)。
详细解释:
- MAC算法用于验证SSH数据包的完整性和真实性,防止数据被篡改
| 算法 | 说明 |
|---|---|
| umac-64-etm@openssh.com | 64位UMAC + Encrypt-then-MAC模式 |
| umac-128-etm@openssh.com | 128位UMAC + ETM模式 |
| hmac-sha2-256-etm@openssh.com | HMAC-SHA256 + ETM模式 |
| hmac-sha2-512-etm@openssh.com | HMAC-SHA512 + ETM模式 |
| hmac-sha1-etm@openssh.com | HMAC-SHA1 + ETM模式(兼容性保留) |
| umac-64@openssh.com | 64位UMAC(非ETM) |
| umac-128@openssh.com | 128位UMAC(非ETM) |
| hmac-sha2-256 | 标准HMAC-SHA256(非ETM) |
| hmac-sha2-512 | 标准HMAC-SHA512(非ETM) |
| hmac-sha1 | 旧版SHA-1 HMAC(已不推荐) |
重要概念:
- ETM(Encrypt-then-MAC):先加密再计算MAC,比MAC-then-Encrypt(先MAC再加密)更安全,能有效防御Padding Oracle攻击
- 当前配置中ETM算法优先级高于非ETM算法,安全配置良好
第29项:kexalgorithms sntrup761x25519-sha512@openssh.com,curve25519-sha256,curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,diffie-hellman-group14-sha256
配置值:sntrup761x25519-sha512@openssh.com,curve25519-sha256,curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,diffie-hellman-group14-sha256
含义:密钥交换(Key Exchange)算法列表(按优先级从高到低排序)。
详细解释:
- 密钥交换算法用于在SSH连接建立时安全地协商共享密钥
| 算法 | 说明 |
|---|---|
| sntrup761x25519-sha512@openssh.com | 后量子安全 + Curve25519 混合算法(前沿) |
| curve25519-sha256 | 基于Curve25519椭圆曲线的密钥交换(推荐) |
| curve25519-sha256@libssh.org | Curve25519的libssh实现版本 |
| ecdh-sha2-nistp256 | NIST P256椭圆曲线密钥交换 |
| ecdh-sha2-nistp384 | NIST P384椭圆曲线密钥交换 |
| ecdh-sha2-nistp521 | NIST P521椭圆曲线密钥交换 |
| diffie-hellman-group-exchange-sha256 | 可自定义DH组的密钥交换 |
| diffie-hellman-group16-sha512 | DH group16(2048位素数) |
| diffie-hellman-group18-sha512 | DH group18(4096位素数) |
| diffie-hellman-group14-sha256 | DH group14(2048位素数) |
关键概念:
- Curve25519:目前推荐的椭圆曲线算法,安全性高、性能好
- 后量子算法:sntrup761是NIST后量子密码标准化候选算法,与经典椭圆曲线混合使用以抵抗量子计算攻击
- 当前配置安全性较高
第30项:hostkeyalgorithms ssh-ed25519-cert-v01@openssh.com,ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp521-cert-v01@openssh.com,sk-ssh-ed25519-cert-v01@openssh.com,sk-ecdsa-sha2-nistp256-cert-v01@openssh.com,rsa-sha2-512-cert-v01@openssh.com,rsa-sha2-256-cert-v01@openssh.com,ssh-ed25519,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,sk-ssh-ed25519@openssh.com,sk-ecdsa-sha2-nistp256@openssh.com,rsa-sha2-512,rsa-sha2-256
配置值:ssh-ed25519-cert-v01@openssh.com,ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp521-cert-v01@openssh.com,sk-ssh-ed25519-cert-v01@openssh.com,sk-ecdsa-sha2-nistp256-cert-v01@openssh.com,rsa-sha2-512-cert-v01@openssh.com,rsa-sha2-256-cert-v01@openssh.com,ssh-ed25519,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,sk-ssh-ed25519@openssh.com,sk-ecdsa-sha2-nistp256@openssh.com,rsa-sha2-512,rsa-sha2-256
含义:服务器主机密钥的算法列表(按优先级从高到低排序)。
详细解释:
- 服务器使用主机密钥向客户端证明自己的身份(服务器认证)
| 算法类型 | 说明 |
|---|---|
| ssh-ed25519 | Ed25519椭圆曲线主机密钥(推荐) |
| ecdsa-sha2-nistp256/384/521 | NIST标准椭圆曲线主机密钥 |
| sk-ssh-ed25519 | FIDO2/U2F安全密钥(硬件令牌)支持Ed25519 |
| sk-ecdsa-sha2-nistp256 | FIDO2/U2F安全密钥支持ECDSA |
| rsa-sha2-512 | RSA主机密钥,使用SHA-2签名(RSA 4096位) |
| rsa-sha2-256 | RSA主机密钥,使用SHA-2签名(RSA 2048位) |
证书格式说明:
*-cert-v01@openssh.com:表示OpenSSH证书格式,支持CA签发的证书认证- 非cert版本:使用原始密钥文件进行认证
第31项:casignaturealgorithms ssh-ed25519,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,sk-ssh-ed25519@openssh.com,sk-ecdsa-sha2-nistp256@openssh.com,rsa-sha2-512,rsa-sha2-256
配置值:ssh-ed25519,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,sk-ssh-ed25519@openssh.com,sk-ecdsa-sha2-nistp256@openssh.com,rsa-sha2-512,rsa-sha2-256
含义:证书颁发机构(CA)签名算法列表。
详细解释:
- 用于SSH证书认证场景,指定CA证书的签名算法
- 当使用
ssh-ca签发用户证书时,CA的签名算法必须在此列表中 - 与
hostkeyalgorithms的区别:hostkeyalgorithms:服务器的原始主机密钥算法casignaturealgorithms:CA签发证书时使用的签名算法
- 列表少了
*-cert-v01算法,因为CA算法是签名算法而非证书算法 sk-前缀支持FIDO2/U2F硬件安全密钥
第32项:pubkeyacceptedalgorithms ssh-ed25519-cert-v01@openssh.com,ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp521-cert-v01@openssh.com,sk-ssh-ed25519-cert-v01@openssh.com,sk-ecdsa-sha2-nistp256-cert-v01@openssh.com,rsa-sha2-512-cert-v01@openssh.com,rsa-sha2-256-cert-v01@openssh.com,ssh-ed25519,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,sk-ssh-ed25519@openssh.com,sk-ecdsa-sha2-nistp256@openssh.com,rsa-sha2-512,rsa-sha2-256
配置值:ssh-ed25519-cert-v01@openssh.com,ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp521-cert-v01@openssh.com,sk-ssh-ed25519-cert-v01@openssh.com,sk-ecdsa-sha2-nistp256-cert-v01@openssh.com,rsa-sha2-512-cert-v01@openssh.com,rsa-sha2-256-cert-v01@openssh.com,ssh-ed25519,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,sk-ssh-ed25519@openssh.com,sk-ecdsa-sha2-nistp256@openssh.com,rsa-sha2-512,rsa-sha2-256
含义:服务器接受的客户端公钥算法列表。
详细解释:
- 用途与
hostkeyalgorithms不同:hostkeyalgorithms:服务器向客户端证明自己身份(服务器认证)pubkeyacceptedalgorithms:客户端向服务器证明用户身份(用户认证)
- 内容与
hostkeyalgorithms基本一致 - 算法优先级从左到右递减
- 支持证书格式(
*-cert-v01)和原始密钥格式 - 支持FIDO2/U2F硬件安全密钥(
sk-前缀)
第33项:hostbasedacceptedalgorithms ssh-ed25519-cert-v01@openssh.com,ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp521-cert-v01@openssh.com,sk-ssh-ed25519-cert-v01@openssh.com,sk-ecdsa-sha2-nistp256-cert-v01@openssh.com,rsa-sha2-512-cert-v01@openssh.com,rsa-sha2-256-cert-v01@openssh.com,ssh-ed25519,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,sk-ssh-ed25519@openssh.com,sk-ecdsa-sha2-nistp256@openssh.com,rsa-sha2-512,rsa-sha2-256
配置值:ssh-ed25519-cert-v01@openssh.com,ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp521-cert-v01@openssh.com,sk-ssh-ed25519-cert-v01@openssh.com,sk-ecdsa-sha2-nistp256-cert-v01@openssh.com,rsa-sha2-512-cert-v01@openssh.com,rsa-sha2-256-cert-v01@openssh.com,ssh-ed25519,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,sk-ssh-ed25519@openssh.com,sk-ecdsa-sha2-nistp256@openssh.com,rsa-sha2-512,rsa-sha2-256
含义:基于主机的认证中接受的算法列表。
详细解释:
- 与
hostbasedauthentication配合使用 - 当
HostbasedAuthentication yes时,该列表决定哪些主机密钥算法被接受 - 内容与
pubkeyacceptedalgorithms相同 - 算法优先级从左到右递减
第五部分:主机密钥配置(4项)
第34项:requiredrsasize 1024
配置值:1024
含义:接受RSA密钥的最小位数要求。
详细解释:
- 当前设置为1024位
- 安全警告:1024位RSA密钥已被认为不够安全,推荐至少使用2048位
- 该配置影响以下场景:
- 客户端使用RSA主机密钥连接时
- 用户使用RSA公钥进行认证时
- 安全建议:至少升级到2048位,推荐3072位或4096位
- 升级方法:
- 生成新的RSA主机密钥:
ssh-keygen -t rsa -b 4096 -f /etc/ssh/ssh_host_rsa_key - 更新客户端
~/.ssh/authorized_keys中的RSA公钥(如有)
第35项:hostkey /etc/ssh/ssh_host_rsa_key
配置值:/etc/ssh/ssh_host_rsa_key
含义:RSA主机私钥文件路径。
详细解释:
- RSA是目前最广泛兼容的主机密钥类型
- 生成命令:
ssh-keygen -t rsa -b 4096 -f /etc/ssh/ssh_host_rsa_key - 对应公钥文件:
/etc/ssh/ssh_host_rsa_key.pub - 客户端首次连接时,会将该公钥的指纹保存到
~/.ssh/known_hosts - 支持所有SSH客户端版本
第36项:hostkey /etc/ssh/ssh_host_ecdsa_key
配置值:/etc/ssh/ssh_host_ecdsa_key
含义:ECDSA主机私钥文件路径。
详细解释:
- ECDSA(椭圆曲线数字签名算法)使用NIST标准曲线(P256、P384、P521)
- 生成命令:
ssh-keygen -t ecdsa -b 521 -f /etc/ssh/ssh_host_ecdsa_key - 密钥短、性能高、安全性好
- 兼容性:OpenSSH 5.0+ 支持
- 相比Ed25519,兼容性略好但算法设计上Ed25519更优
第37项:hostkey /etc/ssh/ssh_host_ed25519_key
配置值:/etc/ssh/ssh_host_ed25519_key
含义:Ed25519主机私钥文件路径。
详细解释:
- Ed25519是目前推荐的椭圆曲线主机密钥算法
- 生成命令:
ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key - 优势:
- 安全性高(基于Curve25519)
- 密钥短(32字节私钥、32字节公钥)
- 签名速度快
- 抗侧信道攻击
- 兼容性:OpenSSH 6.5+ 支持,现代客户端普遍支持
- 生产环境推荐至少保留Ed25519 + RSA两种密钥类型,平衡安全与兼容性
第六部分:会话管理配置(7项)
第38项:logingracetime 120
配置值:120
含义:登录宽限期(秒)。
详细解释:
- 用户从建立TCP连接到完成SSH认证的最大允许时间
- 当前值120秒(2分钟)
- 超时后SSH将断开连接
- 默认值为120秒
- 在以下情况可能需要增加:
- 网络延迟较高
- 使用键盘交互式认证(需要多次交互)
- 使用Kerberos等需要多次往返的认证方式
- 设置过短(如10秒)可能导致正常用户在慢速网络下无法完成认证
第39项:clientaliveinterval 60
配置值:60
含义:服务器向客户端发送保活探测包的时间间隔(秒)。
详细解释:
- 当前设置为60秒,表示服务器每隔60秒发送一个空的SSH消息给客户端
0表示禁用服务器端主动探测(默认值)- 与TCP KeepAlive的区别:
| 特性 | ClientAliveInterval | TCP KeepAlive |
|---|---|---|
| 控制层 | SSH应用层 | 内核TCP层 |
| 探测间隔 | 可自定义(秒) | 默认约2小时 |
| 可配置性 | 灵活 | 需修改系统参数 |
- 设置建议:
- 内网环境:可设为
60-120秒 - 公网环境:建议
60-300秒 - 移动网络:可适当增加到
300秒,避免频繁探测导致额外流量
- 内网环境:可设为
- 与
ClientAliveCountMax配合使用,决定断开的判定条件
第40项:clientalivecountmax 3
配置值:3
含义:在未收到客户端响应的情况下,最大连续探测次数。
详细解释:
- 当
ClientAliveInterval为正数时生效 - 默认值为3
- 总超时时间 =
ClientAliveInterval × ClientAliveCountMax - 当前配置:60秒 × 3次 = 180秒(3分钟)后断开无响应的连接
- 如果客户端由于网络故障、电源关闭、程序崩溃等原因未响应,服务器会在180秒后清理会话
- 这有助于减少残留会话
第41项:unusedconnectiontimeout none
配置值:none
含义:空闲连接的超时时间。
详细解释:
none:不设空闲超时限制- 可设置为具体值,如
unusedconnectiontimeout 300s(5分钟)、1h(1小时) - 与
ClientAliveInterval的区别:ClientAliveInterval:检测客户端是否存活(有无响应),只要有响应就不超时unusedconnectiontimeout:检测连接是否空闲(有无数据传输),即使连接存活但无数据传输也会超时
- 设置建议:
- 安全要求高的环境:可设置1小时
- 长时间运行的SSH任务:建议保持
none或设置较大值
第42项:channeltimeout none
配置值:none
含义:通道超时时间。
详细解释:
none:不设通道超时限制- 可设置
channeltimeout 10m(10分钟)、1h(1小时) - 通道(Channel)是SSH连接中的逻辑通信单元,每个会话(shell、SFTP、端口转发)都是一个独立的通道
- 该配置限制每个通道的绝对存活时间
- 与
unusedconnectiontimeout的区别:channeltimeout:通道建立后的绝对超时,不管有无活动unusedconnectiontimeout:基于空闲时间的超时
第43项:rekeylimit 0 0
配置值:0 0
含义:密钥重新交换的触发阈值。
详细解释:
- 格式:
<数据量(MB)> <时间(秒)> 0 0表示使用默认值(1GB数据或1小时,任一条件满足即触发)- 重新密钥交换是指在SSH会话期间定期重新协商加密密钥
- 安全意义:防范密码分析攻击,限制单个密钥加密的数据量
- 常见设置:
rekeylimit 1G 3600:1GB数据或1小时后重新交换rekeylimit 100M 1800:100MB数据或30分钟后重新交换- 设置过小会增加CPU开销,设置过大会降低安全性
第44项:compression yes
配置值:yes
含义:是否允许数据压缩。
详细解释:
yes:允许压缩(默认值)no:禁用压缩- 压缩原理:使用zlib压缩算法在传输前压缩数据,接收后解压
- 优缺点分析:
| 优点 | 缺点 |
|---|---|
| 减少网络流量 | 增加CPU计算开销 |
| 提高慢速网络下的响应速度 | 对已压缩的数据(如图片、视频)效果有限 |
| 可降低带宽费用 | 可能增加压缩相关安全漏洞的风险(如CRIME攻击) |
- 建议:
- 慢速网络(如通过VPN远程连接):启用
- 高速网络(如IDC内网):可禁用
- 高安全环境:可禁用(CRIME攻击虽主要影响TLS,但SSH的压缩也需谨慎)
第七部分:X11转发配置(5项)
第45项:x11forwarding yes
配置值:yes
含义:是否启用X11图形转发功能。
详细解释:
yes:允许用户在远程服务器上运行X11图形程序,并将图形界面显示到本地no:禁用X11转发
工作原理:
- 客户端连接时请求X11转发(需使用
ssh -X或ssh -Y) - 服务器在本地回环地址(127.0.0.1)上分配一个显示端口(从6010开始)
- 服务器上的X11程序连接到该显示端口
- SSH将X11协议数据加密后转发到客户端
重要说明(关联本次排查):
- 当启用
X11Forwarding yes时,每个SSH登录会话会创建一个X11转发通道 - 这些通道监听在
127.0.0.1:6010、127.0.0.1:6011、127.0.0.1:6012等端口上 - 每个登录会话对应一个递增的端口号
- 这些端口是动态分配的子进程端口,永远不会出现在
sshd_config配置文件中 - 它们监听在本地回环地址,外部网络无法访问,不存在安全风险
这就是安全扫描工具产生”异常端口”告警的根本原因:
- 安全扫描工具使用
ps | grep sshd找到所有sshd进程 - 发现这些子进程监听6010-6012端口
- 检查
sshd_config中未配置这些端口,于是报告”异常” - 但这是X11转发的正常行为,是误报
配置建议:
- 如果您的应用不需要在远程服务器上运行图形界面(大多数服务器场景),可以设置为
no以减少攻击面 - 但禁用后不会消除已存在的会话端口,只会阻止新会话创建转发通道
第46项:x11uselocalhost yes
配置值:yes
含义:X11转发绑定的网络地址。
详细解释:
yes:绑定到127.0.0.1(本地回环地址)no:绑定到0.0.0.0(所有网络接口)
安全考量:
yes(推荐):仅允许本地连接,外部网络无法访问X11转发端口,安全no:允许来自任何IP的连接,如果攻击者能访问该端口,可以截获X11通信,存在安全风险- 除非有特殊需求,强烈建议保持
yes
第47项:x11displayoffset 10
配置值:10
含义:X11显示编号的偏移量。
详细解释:
- X11显示编号从
:10.0开始(偏移量为10) - 这样做的目的是避免与本地已有的X服务器(通常使用
:0.0)冲突 - 每个会话的显示编号递增:
- 第一个X11转发会话:
:10.0 - 第二个X11转发会话:
:11.0 - 第三个X11转发会话:
:12.0
- 第一个X11转发会话:
- 通常无需修改此参数
第48项:xauthlocation /usr/bin/xauth
配置值:/usr/bin/xauth
含义:xauth 命令的完整路径。
详细解释:
xauth是一个用于管理X11认证密钥的工具- 它维护
.Xauthority文件,存储X11连接的cookie(认证令牌) - SSH使用
xauth生成和管理X11转发的认证cookie - 如果
xauth不在/usr/bin/xauth路径,需要修改此配置 - 查看
xauth实际位置:which xauth
第49项:exposeauthinfo no
配置值:no
含义:是否在连接过程中暴露认证信息。
详细解释:
no(默认):不暴露认证信息yes:在调试场景中会暴露认证信息(如X11 cookie、用户名等)- 安全警告:设置为
yes会导致认证信息在日志中可见,存在泄露风险 - 仅在调试SSH问题且确信安全的情况下临时启用
- 建议保持
no
第八部分:转发与隧道配置(10项)
第50项:allowtcpforwarding yes
配置值:yes
含义:是否允许TCP端口转发。
详细解释:
yes:允许用户建立TCP端口转发隧道(默认)no:完全禁用TCP转发
TCP端口转发的三种类型:
| 类型 | SSH参数 | 作用 |
|---|---|---|
| 本地转发 | -L | 将本地端口转发到远程目标 |
| 远程转发 | -R | 将远程端口转发到本地目标 |
| 动态转发 | -D | SOCKS代理,动态转发 |
- 禁用会影响上述所有转发功能
- 如果服务器不需要提供转发功能,建议设置为
no以减少攻击面
第51项:allowagentforwarding yes
配置值:yes
含义:是否允许SSH代理转发。
详细解释:
yes:允许ssh-agent转发(默认)no:禁用代理转发
工作原理:
- 用户在客户端运行
ssh-agent管理私钥 - 通过代理转发,用户可以从中转服务器继续SSH到其他服务器,而无需再次输入密码或重新加载私钥
安全风险:
- 攻击者如果获得中转服务器的root权限,可以访问转发的agent socket
- 使用转发的agent在跳板机上认证,攻击者可以冒充用户跳转到其他服务器
- 建议:除非确实需要在跳板机场景中使用,否则建议设置为
no
第52项:disableforwarding no
配置值:no
含义:是否完全禁用所有转发功能。
详细解释:
no:不禁用转发yes:禁用所有类型的转发(覆盖所有allow*转发配置)
该配置的作用:
- 是
allowtcpforwarding、allowagentforwarding、allowstreamlocalforwarding等的总开关 - 如果设置了
disableforwarding yes,所有转发相关的allow*配置都失效 - 全局禁用转发的快捷方式
第53项:allowstreamlocalforwarding yes
配置值:yes
含义:是否允许Unix域套接字转发。
详细解释:
yes:允许Unix域套接字转发(默认)no:禁用
Unix域套接字转发:
- SSH 6.7+ 新增功能
- 允许在Unix域套接字之间建立隧道
- 常用于转发本地Unix socket到远程Unix socket
- 示例:
ssh -L /local/socket:/remote/socket user@host
第54项:streamlocalbindmask 0177
配置值:0177
含义:Unix域套接字绑定时的权限掩码。
详细解释:
0177表示只有套接字所有者可以读写(权限为drwx------)- 这是一个八进制权限掩码
权限掩码计算说明:
- 默认创建套接字时的权限为
0666(rw-rw-rw-) - 应用掩码
0177后:0666 & ~0177 = 0600(rw——-) - 结果:只有所有者可读写
| 常用掩码值 | 对应的套接字权限 |
|---|---|
| 0177 | rw——-(仅所有者) |
| 0177(默认) | rw——- |
| 0111 | rw-rw-rw-(所有人可读写) |
第55项:streamlocalbindunlink no
配置值:no
含义:绑定Unix域套接字前是否删除已存在的套接字文件。
详细解释:
no:不删除(如果套接字文件已存在,绑定失败并报错)yes:先删除已存在的套接字文件,再绑定
使用场景:
- 如果之前的SSH会话异常退出,可能残留套接字文件
- 设置
yes可以避免因残留文件导致的绑定失败 - 默认
no是出于安全考虑,防止意外删除其他进程的套接字文件
第56项:gatewayports no
配置值:no
含义:是否允许远程主机连接到转发的端口。
详细解释:
no(默认):转发端口绑定到127.0.0.1,仅本地可访问yes:转发端口绑定到0.0.0.0,远程主机也可访问
安全警告:
- 设置为
yes意味着任何能连接到该服务器的主机都可以使用转发的端口 - 可能将内部服务暴露给外部网络
- 除非有明确的共享需求,强烈建议保持
no
第57项:permittunnel no
配置值:no
含义:是否允许网络隧道(VPN over SSH)功能。
详细解释:
no(默认):禁用VPN over SSH功能yes:允许使用ssh -w选项创建TUN/TAP网络隧道
VPN over SSH工作原理:
- 在客户端和服务器之间创建虚拟网络接口(TUN/TAP)
- 通过SSH加密传输IP数据包,实现VPN功能
- 支持点对点和以太网隧道
第58项:permitopen any
配置值:any
含义:远程转发允许的目标地址。
详细解释:
any:允许转发到任意目标地址和端口- 可限制为特定目标:
permitopen host:port
使用示例:
PermitOpen 192.168.1.10:3306:只允许转发到MySQL服务端口PermitOpen 10.0.0.0/8:8080:允许转发到10.0.0.0/8网段的8080端口- 多个目标可以用空格分隔
安全价值:
- 细粒度控制SSH隧道的目标
- 防止用户将隧道转发到未经授权的内部服务
第59项:permitlisten any
配置值:any
含义:远程转发监听的本地地址。
详细解释:
any:允许监听所有本地地址- 可限制为特定地址:
permitlisten 127.0.0.1:8080
使用示例:
PermitListen 127.0.0.1:8080:只允许监听本地8080端口PermitListen 192.168.1.10:80:只允许监听内网IP的80端口
安全价值:
- 限制用户可以将远程转发绑定到哪些本地端口和IP
- 防止用户绑定到特权端口(1024以下)或暴露服务到外部接口
第九部分:权限与安全配置(9项)
第60项:strictmodes yes
配置值:yes
含义:是否对用户主目录和 .ssh 目录进行权限严格检查。
详细解释:
yes(默认):启用严格权限检查no:跳过权限检查
严格检查的内容:
| 检查对象 | 要求的权限 |
|---|---|
| 用户主目录(~) | 不能被其他用户写入(权限不超过755) |
~/.ssh/ 目录 | 权限不超过700 |
~/.ssh/authorized_keys | 权限不超过600 |
~/.ssh/known_hosts | 权限不超过644 |
~/.ssh/config | 权限不超过644 |
安全价值:
- 防止权限过宽导致的安全问题
- 如果
.ssh目录权限为777,其他用户可能修改authorized_keys添加自己的公钥 - 强烈建议保持
yes
第61项:tcpkeepalive yes
配置值:yes
含义:是否启用TCP层的KeepAlive机制。
详细解释:
yes:启用TCP KeepAlive(默认)no:禁用TCP KeepAlive
与 ClientAliveInterval 的区别:
| 特性 | TCP KeepAlive | ClientAliveInterval |
|---|---|---|
| 控制层 | 内核TCP层 | SSH应用层 |
| 探测间隔 | 默认约2小时 | 自定义(秒级) |
| 协议开销 | TCP层数据包 | SSH加密数据包 |
| 可配置性 | 需修改系统参数 | 可在sshd_config中配置 |
建议:
- 两者可以同时启用,互相补充
- 如果
ClientAliveInterval已启用,TCP KeepAlive不是必需的
第62项:permitemptypasswords no
配置值:no
含义:是否允许空密码登录。
详细解释:
no:拒绝空密码登录(安全)yes:允许空密码登录
安全风险:
- 如果允许空密码,用户账户没有设置密码(或密码为空字符串)时可以登录
- 这是严重的安全漏洞
- 强烈建议保持
no
第63项:permituserrc yes
配置值:yes
含义:是否允许执行 ~/.ssh/rc 文件。
详细解释:
~/.ssh/rc是用户级别的SSH初始化脚本- 它在用户登录成功之后、shell启动之前执行
- 如果文件不存在,系统会尝试执行
/etc/ssh/sshrc(全局初始化脚本)
常见用途:
- 设置用户特定的环境变量
- 启动screen/tmux会话
- 执行用户自定义的初始化命令
yes:允许执行(默认)no:禁止执行
第64项:permituserenvironment no
配置值:no
含义:是否允许用户在 ~/.ssh/environment 中设置环境变量。
详细解释:
no:禁止使用~/.ssh/environment设置环境变量(默认)yes:允许使用
安全风险:
- 用户可以设置
LD_PRELOAD、LD_LIBRARY_PATH等危险环境变量 - 可能绕过系统安全限制或执行恶意代码
- 强烈建议保持
no
安全替代方案:
- 使用
AcceptEnv从客户端接受特定环境变量 - 管理员控制可以传递哪些环境变量
第65项:permittty yes
配置值:yes
含义:是否分配TTY(终端)。
详细解释:
yes:允许分配TTY(默认)no:不允许分配TTY
TTY分配的影响:
- 分配TTY后,用户可以获得交互式shell(命令行界面)
- 不分配TTY时,只能执行命令(适用于自动化脚本、SCP/SFTP)
应用场景:
- 交互式登录:需要
yes - 仅执行命令的脚本:可设置为
no - SFTP-only用户:通常需要
no(配合ForceCommand internal-sftp)
第66项:ignoreuserknownhosts no
配置值:no
含义:是否忽略用户级别的 ~/.ssh/known_hosts 文件。
详细解释:
no:正常使用用户级known_hosts(默认)yes:忽略用户级known_hosts,只使用系统级known_hosts(/etc/ssh/ssh_known_hosts)
使用场景:
- 测试环境:设置为
yes可以避免频繁更新known_hosts - 企业环境:使用系统级known_hosts集中管理信任的主机密钥
第67项:pubkeyauthoptions none
配置值:none
含义:公钥认证的附加选项。
详细解释:
none:无附加选项- 可配置的选项包括:
verify-required:要求FIDO密钥验证用户在场(需要触摸硬件令牌)- 仅对
sk-*算法(安全密钥)生效
第68项:fingerprinthash SHA256
配置值:SHA256
含义:显示主机密钥指纹时使用的哈希算法。
详细解释:
SHA256(默认):使用SHA-256哈希,输出为Base64编码MD5:使用MD5哈希,输出为冒号分隔的十六进制
格式对比:
- SHA256格式:
SHA256:8tA7fV...(长字符串) - MD5格式:
MD5:44:38:2a:...(16组十六进制)
影响范围:
ssh-keygen -l命令的输出格式- 客户端连接时的指纹显示
第十部分:日志与调试配置(6项)
第69项:loglevel INFO
配置值:INFO
含义:SSH服务的日志记录级别。
详细解释:
| 日志级别 | 记录内容 | 适用场景 |
|---|---|---|
| QUIET | 仅记录致命错误 | 极少使用 |
| FATAL | 致命错误 | 极少使用 |
| ERROR | 错误信息 | 排查配置问题 |
| INFO | 正常登录/注销/认证失败(默认) | 生产环境 |
| VERBOSE | INFO + 连接详情、公钥指纹 | 安全审计、连接问题排查 |
| DEBUG | 详细调试信息(可能泄露敏感数据) | 开发调试 |
| DEBUG1-3 | 更详细的调试信息 | 深度调试 |
INFO级别记录的内容:
- 连接建立时间
- 客户端IP地址
- 用户名
- 认证方式
- 认证成功/失败
- 登录/注销时间
- 会话时长
安全建议:生产环境保持 INFO,调试完成后及时切回。
第70项:syslogfacility AUTHPRIV
配置值:AUTHPRIV
含义:日志使用的syslog设施(facility)。
详细解释:
AUTHPRIV是专门为认证相关的日志设计的设施
| 操作系统 | 日志文件路径 |
|---|---|
| Red Hat / CentOS / RHEL | /var/log/secure |
| Debian / Ubuntu | /var/log/auth.log |
| SUSE / openSUSE | /var/log/messages |
其他可用的设施值:
AUTH:标准认证日志(可能对普通用户可读)DAEMON:通用守护进程日志USER:用户级日志LOCAL0至LOCAL7:自定义本地设施
AUTHPRIV 相比 AUTH 的权限更严格,通常仅允许root读取。
第71项:printmotd no
配置值:no
含义:登录成功后是否显示 /etc/motd(Message of the Day)文件的内容。
详细解释:
yes:登录成功后显示/etc/motd文件内容no:不显示
MOTD的用途:
- 系统公告
- 法律警告(如”未经授权禁止访问”)
- 系统维护通知
- 欢迎信息
为什么不显示:
- 当前配置为
no,可能因为: - 容器环境(没有MOTD内容)
- 自动化环境(避免干扰脚本输出)
- 安全考虑(减少信息泄露)
第72项:printlastlog yes
配置值:yes
含义:登录成功后是否显示上次登录时间/位置。
详细解释:
yes:显示上次登录信息(默认)no:不显示
显示信息包含:
- 上次登录的时间
- 上次登录的IP地址或主机名
- 上次登录的终端
安全价值:
- 用户可以检查是否有异常登录
- 如果发现上次登录时间、IP不符,可能表明账户被入侵
- 建议保持启用
第73项:usedns no
配置值:no
含义:是否对客户端IP进行DNS反向解析。
详细解释:
no:不进行DNS反向解析(推荐)yes:对客户端IP进行反向DNS解析
影响:
no:连接速度快,日志中记录IP地址yes:- 增加连接延迟(等待DNS响应)
- 如果DNS服务不可用,可能导致连接延迟或失败
- 日志中记录主机名
日志区别:
usedns no:日志记录为from 192.168.1.100usedns yes:日志记录为from host.example.com (192.168.1.100)
建议:除非需要主机名用于日志分析或基于主机的认证,否则建议保持 no。
第74项:debianbanner yes
配置值:yes
含义:是否在连接时显示Debian版本横幅。
详细解释:
- 这是Debian/Ubuntu系统特有的配置项
- 在SSH横幅中显示完整的操作系统版本信息
显示内容(启用时):
SSH-2.0-OpenSSH_8.9p1 Ubuntu-3ubuntu0.1
禁用时的显示:
SSH-2.0-OpenSSH_8.9
安全价值:
- 隐藏操作系统版本可以减少信息泄露
- 攻击者无法通过横幅信息判断系统类型和版本
- 建议:高安全环境可设置为
no
第十一部分:文件路径配置(16项)
第75项:pidfile /run/sshd.pid
配置值:/run/sshd.pid
含义:PID(进程ID)文件的存储路径。
详细解释:
- 存储sshd主进程的进程ID(PID)
- 用于服务管理脚本(如
systemctl、service) /run目录是tmpfs(内存文件系统),系统重启后内容清空- 该文件是服务状态检测的重要依据
第76项:modulifile /etc/ssh/moduli
配置值:/etc/ssh/moduli
含义:Diffie-Hellman(DH)模数文件路径。
详细解释:
- 存储用于DH密钥交换的素数模数
- 文件包含多组不同位数(大小)的素数
文件内容格式:
# Time Type Tests Tries Size Generator Modulus
20240721000000 2 3 100 2048 2 ......
生成方法:
- 生成候选素数:
ssh-keygen -G moduli.candidates -b 2048 - 测试素数:
ssh-keygen -T moduli.candidates -f moduli - 替换原文件:
cp moduli /etc/ssh/moduli
安全建议:
- 包含2048位及以上的模数
- 定期更新(每年一次)
第77项:authorizedkeysfile .ssh/authorized_keys .ssh/authorized_keys2
配置值:.ssh/authorized_keys .ssh/authorized_keys2
含义:用户公钥文件的位置(相对路径)。
详细解释:
.ssh/authorized_keys:主要公钥文件(优先).ssh/authorized_keys2:备选公钥文件(旧版本兼容)
文件格式:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... user@host
绝对路径示例:
/root/.ssh/authorized_keys/home/user/.ssh/authorized_keys
安全要求:
- 文件所有者必须是用户本人
- 权限不超过600(
-rw-------) - 目录权限不超过700(
drwx------)
第78项:banner none
配置值:none
含义:认证前的横幅文件路径。
详细解释:
none:不显示横幅- 可设置文件路径,如
banner /etc/ssh/sshd-banner
与MOTD的区别:
| 特性 | Banner | MOTD |
|---|---|---|
| 显示时机 | 认证前(密码输入前) | 认证后(登录成功后) |
| 配置项 | Banner | PrintMotd |
| 适用场景 | 法律警告、授权声明 | 系统公告、欢迎信息 |
法律警告示例:
==================================================================
未经授权禁止访问本系统!
所有操作将被记录并监控。
==================================================================
第79项:forcecommand none
配置值:none
含义:强制执行的命令。
详细解释:
none:不强制任何命令,用户执行自己请求的命令- 可设置为具体命令,如
ForceCommand /usr/bin/screen
常见用途:
| 设置 | 效果 |
|---|---|
ForceCommand internal-sftp | 限制用户只能使用SFTP,无法获得shell |
ForceCommand /usr/bin/screen -R | 强制使用screen会话 |
ForceCommand /bin/bash --restricted | 使用受限shell |
工作原理:
- 无论用户请求执行什么命令,都会被替换为
ForceCommand指定的命令 - 用户无法绕过此限制
第80项:chrootdirectory none
配置值:none
含义:Chroot目录路径。
详细解释:
none:不启用chroot- 可设置目录路径,如
ChrootDirectory /var/sftp/%u
Chroot的作用:
- 将用户限制在指定的目录内,用户无法访问该目录以外的文件系统
- 常用作SFTP-only用户的沙盒环境
使用要求:
- Chroot目录必须由root用户拥有
- Chroot目录不可被其他用户写入
- 建议在chroot目录内创建必要的子目录(如
upload、download)
第81项:trustedusercakeys none
配置值:none
含义:受信任的用户证书CA公钥文件路径。
详细解释:
none:未配置- 可设置文件路径,如
TrustedUserCAKeys /etc/ssh/trusted-user-ca-keys.pub
用途:
- 用于SSH用户证书认证场景
- 文件内容为CA的公钥列表
- 凡持有由该CA签发的证书的用户均可登录
第82项:revokedkeys none
配置值:none
含义:撤销密钥文件路径(KRL)。
详细解释:
none:未配置- 可设置文件路径,如
RevokedKeys /etc/ssh/revoked-keys.krl
KRL(Key Revocation List):
- 用于吊销已泄露或不再信任的SSH密钥
- 列入KRL的密钥将无法登录服务器
生成KRL文件:
ssh-keygen -k -f revoked-keys.krl -u -s <ca-key> user-key.pub
第83项:authorizedprincipalsfile none
配置值:none
含义:授权主体(Principals)文件路径。
详细解释:
none:未配置- 可设置文件路径,如
AuthorizedPrincipalsFile /etc/ssh/principals/%u
用途:
- 用于SSH证书认证
- 限制哪些证书主体(用户名)被允许登录
- 每行一个主体名称
第84项:versionaddendum none
配置值:none
含义:协议版本横幅中附加的自定义字符串。
详细解释:
none:不附加- 可设置自定义字符串,如
VersionAddendum Custom-1.0
显示效果:
- 无附加:
SSH-2.0-OpenSSH_8.9 - 有附加:
SSH-2.0-OpenSSH_8.9 Custom-1.0
用途:
- 内部标识(如版本号、环境标识)
- 不建议暴露过多信息
第85项:authorizedkeyscommand none
配置值:none
含义:获取公钥的外部命令路径。
详细解释:
none:未配置- 可设置命令路径,如
AuthorizedKeysCommand /usr/bin/ldap-keys-fetcher
用途:
- 从外部系统(如LDAP、数据库)动态获取用户公钥
- 避免在服务器上维护
authorized_keys文件
安全要求:
- 命令必须以绝对路径指定
- 不能包含参数
第86项:authorizedkeyscommanduser none
配置值:none
含义:执行 AuthorizedKeysCommand 的系统用户。
详细解释:
none:未配置- 可设置用户名,如
AuthorizedKeysCommandUser nobody
用途:
- 指定一个低权限用户来执行
AuthorizedKeysCommand - 减少命令执行的安全风险
- 建议使用
nobody或自定义的专用用户
第87项:authorizedprincipalscommand none
配置值:none
含义:获取授权主体的外部命令路径。
详细解释:
none:未配置- 可设置命令路径,如
AuthorizedPrincipalsCommand /usr/bin/ldap-principals-fetcher
用途:
- 从外部系统动态获取授权主体列表
- 用于证书认证场景
第88项:authorizedprincipalscommanduser none
配置值:none
含义:执行 AuthorizedPrincipalsCommand 的系统用户。
详细解释:
none:未配置- 可设置用户名,如
AuthorizedPrincipalsCommandUser nobody
用途:
- 指定低权限用户执行
AuthorizedPrincipalsCommand - 降低安全风险
第89项:hostkeyagent none
配置值:none
含义:代理主机密钥认证的socket路径。
详细解释:
none:未配置- 可设置socket路径,如
HostKeyAgent /run/hostkey-agent/socket
用途:
- 将主机密钥操作委托给外部代理(如HSM、TEE)
- 主机私钥不存储在服务器本地,提高安全性
- 适用于高安全环境
第90项:securitykeyprovider internal
配置值:internal
含义:安全密钥提供者。
详细解释:
internal:使用OpenSSH内置的FIDO2/U2F支持(默认)- 可指定外部PKCS#11模块路径,如
/usr/lib/opensc-pkcs11.so
FIDO2/U2F硬件令牌支持:
- OpenSSH 8.2+ 支持FIDO2/U2F硬件安全密钥(如YubiKey)
- 对应的密钥算法前缀为
sk- - 示例:
sk-ssh-ed25519@openssh.com、sk-ecdsa-sha2-nistp256@openssh.com
PKCS#11模块用途:
- 支持更多的硬件安全模块(HSM)
- 企业级密钥管理
第十二部分:子系统与环境变量配置(3项)
第91项:subsystem sftp /usr/lib/openssh/sftp-server
配置值:sftp /usr/lib/openssh/sftp-server
含义:SSH子系统配置。
详细解释:
- 格式:
Subsystem <子系统名称> <执行命令> sftp是最常用的子系统,用于SFTP文件传输- 每次SFTP连接会产生一个
notty会话(无终端)
两种SFTP实现:
| 实现方式 | 配置 | 特点 |
|---|---|---|
| 外部程序 | Subsystem sftp /usr/lib/openssh/sftp-server | 独立进程,兼容性好 |
| 内部实现 | Subsystem sftp internal-sftp | 集成在sshd中,更安全,支持chroot |
推荐配置:
Subsystem sftp internal-sftp
多个子系统:
- 可以定义多个子系统,如
Subsystem abc /path/to/abc-server
第92项:acceptenv LANG
配置值:LANG
含义:允许从客户端接受的环境变量(第一个)。
详细解释:
LANG是语言区域设置环境变量- 客户端可以通过
SendEnv LANG将此变量传递给服务器 - 传递后,服务器上的shell会使用客户端指定的语言环境
第93项:acceptenv LC_*
配置值:LC_*
含义:允许从客户端接受的环境变量(第二个)。
详细解释:
- 所有以
LC_开头的环境变量 - 包括
LC_ALL、LC_TIME、LC_CTYPE等 - 用于传递更细粒度的区域设置信息
示例:
- 客户端:
SendEnv LANG LC_TIME - 服务器:
AcceptEnv LANG LC_TIME - 效果:服务器的日期时间显示格式与客户端一致
第十三部分:其他配置(2项)
第94项:authenticationmethods any
配置值:any
含义:允许的认证方法组合。
详细解释:
any:允许任意认证方法的组合(默认)- 可指定为特定的方法组合,如
publickey,password
多因素认证配置示例:
| 配置 | 效果 |
|---|---|
AuthenticationMethods publickey,password | 要求公钥认证 + 密码认证(双重认证) |
AuthenticationMethods publickey,keyboard-interactive | 公钥 + 键盘交互式(如2FA验证码) |
AuthenticationMethods publickey | 仅公钥认证 |
适用场景:
- 高安全环境需要多因素认证(MFA)
- 结合
pubkeyauthentication和kbdinteractiveauthentication使用
第95项:ipqos lowdelay throughput
配置值:lowdelay throughput
含义:IP服务质量(QoS)设置。
详细解释:
- 格式:
<入站QoS> <出站QoS> lowdelay:低延迟优先(适用于交互式SSH会话)throughput:吞吐量优先(适用于批量数据传输)
实现方式:
- 设置IP头部的TOS(Type of Service)/ DSCP字段
| 取值 | 对应的DSCP | 含义 |
|---|---|---|
| lowdelay | EF(Expedited Forwarding) | 低延迟(交互式流量) |
| throughput | AF11 | 高吞吐量(批量数据) |
| af21、af31、af41 | 确保转发 | 不同程度的服务质量保证 |
| cs0、cs1 | 默认服务类 | 标准优先级 |
适用场景:
- 网络带宽有限的环境
- 需要保证SSH交互响应速度的场景
配置项完整清单总览
| 分类 | 序号 | 数量 |
|---|---|---|
| 网络与地址 | 1-4 | 4 |
| 认证方式 | 5-21 | 17 |
| 认证限制 | 22-26 | 5 |
| 加密算法 | 27-33 | 7 |
| 主机密钥 | 34-37 | 4 |
| 会话管理 | 38-44 | 7 |
| X11转发 | 45-49 | 5 |
| 转发与隧道 | 50-59 | 10 |
| 权限与安全 | 60-68 | 9 |
| 日志与调试 | 69-74 | 6 |
| 文件路径 | 75-90 | 16 |
| 子系统与环境变量 | 91-93 | 3 |
| 其他 | 94-95 | 2 |
| 总计 | 95 |
结语
本文逐一解析了 sshd -T 输出的全部 95项配置,涵盖了SSH服务的网络层、认证层、加密层、会话层、转发层、权限层、日志层、子系统层等全部维度。
sshd -T 是OpenSSH最强大的诊断命令之一,它显示的每一行配置都对应着SSH服务的某个运行时行为。理解这些配置的含义,是系统管理员排查SSH问题、优化安全配置的基础。
通过本次解析,读者应能够:
- 理解每一项SSH配置的含义和作用
- 在遇到安全扫描告警时,能独立判断是否为误报
- 根据实际需求,有针对性地调整SSH配置
- 从配置文件层面理解和优化SSH服务
SSH是现代Linux运维的基石,掌握其配置细节,是每一位运维工程师的必修课。