openssh 默认暴露服务端 banner 和版本号,需通过修改 /etc/issue.net 设置登录前提示、源码编译禁用 ssh_disable_version_string 隐藏版本号,并关闭 debianbanner、printmotd 等泄露项来加固。

OpenSSH 默认会在连接时显示服务端 Banner 和版本号(如 SSH-2.0-OpenSSH_9.2p1 Ubuntu-2),这会暴露系统信息,增加被针对性攻击的风险。修改 Banner 并隐藏真实版本号是基础安全加固措施。
一、修改登录前 Banner 文本
这个 Banner 是用户在输入密码前看到的提示信息,由 sshd_config 中的 Banner 指令控制。
- 编辑配置文件:sudo nano /etc/ssh/sshd_config
- 取消注释或新增一行:Banner /etc/issue.net
- 创建或编辑 Banner 文件:sudo nano /etc/issue.net,写入自定义内容(例如:Unauthorized access prohibited. All activities logged.)
- 保存后重启服务:sudo systemctl restart ssh
注意:该 Banner 仅对未认证用户可见,且不支持转义字符或动态内容。
二、隐藏 OpenSSH 版本号(关键步骤)
默认 SSH 协议握手阶段会明文发送服务版本标识,必须通过重新编译 OpenSSH 才能彻底隐藏。Debian/Ubuntu 官方包不提供此选项,需源码编译。
- 安装编译依赖:sudo apt update && sudo apt install -y build-essential libssl-dev zlib1g-dev libpam0g-dev
- 下载对应版本源码(例如 9.2p1):wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.2p1.tar.gz
- 解压并进入目录:tar -xzf openssh-9.2p1.tar.gz && cd openssh-9.2p1
- 配置编译参数,禁用版本暴露:./configure --with-pam --sysconfdir=/etc/ssh --without-openssl-header-check CFLAGS="-DSSH_DISABLE_VERSION_STRING"
- 编译安装:make && sudo make install
- 确认新版生效:sudo /usr/local/bin/sshd -t(检查配置语法),再重启服务
成功后,使用 nc your-server-ip 22 测试,应看到类似 SSH-2.0-OpenSSH(无版本号和系统后缀)。
三、可选:禁用其他泄露信息的配置项
配合 Banner 修改,进一步减少指纹暴露:
- PrintMotd no:避免显示 /etc/motd 内容(可能含系统信息)
- DebianBanner no(仅 Debian/Ubuntu):关闭 Debian 特有的 banner 追加行为
- UseDNS no:防止反向 DNS 查询泄露主机名
- 所有修改后务必运行 sudo sshd -t 验证配置,再重启服务
四、验证是否生效
不要只看登录界面,重点验证协议层真实响应:
- 本地测试命令:ssh -v user@localhost 2>&1 | grep "debug1: Remote protocol version"
- 或用 telnet/netcat:nc your-server 22,观察首行输出
- 也可用在线扫描工具(如 SSL Labs SSH Test)辅助检测
若仍显示完整版本号,说明编译未生效或服务未使用新二进制文件,请检查 which sshd 和 ps aux | grep sshd 确认路径。










