printmotd no 仅禁用登录后 /etc/motd 输出,不隐藏 /etc/issue、/etc/issue.net 中的内核版本转义符,也不影响 ssh 握手字符串;需同步配置 debianbanner no、versionaddendum none,并清空锁定 issue 文件才能有效收敛信息泄露。

仅设 PrintMotd no 本身不能隐藏内核详细版本信息,它只阻止显示 /etc/motd 文件内容。真正暴露内核版本的地方是 /etc/issue、/etc/issue.net 和 SSH 协议握手字符串(如 SSH-2.0-OpenSSH_9.2p1 Debian-2+deb12u2),这些必须同步处理才能有效收敛信息边界。
PrintMotd no 的真实作用和局限
该配置项仅控制用户成功登录 SSH 后,是否自动输出 /etc/motd(Message of the Day)内容。Ubuntu 等系统常通过脚本动态往 motd 写入内核版本摘要、更新提示等,但这些属于“登录后”行为,不影响未认证阶段的指纹暴露。
- 如果
/etc/motd是空的或静态文本,PrintMotd no 几乎无实际效果 - 它不干预
/etc/issue、/etc/issue.net中的\r(内核版本)、\s(系统名)等转义符 - 完全不影响 SSH 握手时返回的
SSH-2.0-OpenSSH_X.Yp1 XXX-xxx字符串
必须同步清理的三个核心泄露点
要真正隐藏内核详细版本,需覆盖协议层、登录前横幅、登录后消息三类入口:
-
协议握手层:编辑
/etc/ssh/sshd_config,添加或确认以下两行:DebianBanner no(Debian/Ubuntu 必须)VersionAddendum none(OpenSSH 6.9+ 支持,抹掉括号内所有附加信息) -
登录前横幅文件:清空并锁定
/etc/issue和/etc/issue.net:sudo truncate -s 0 /etc/issue /etc/issue.net && sudo chmod 444 /etc/issue /etc/issue.net
若需保留法律提示,仅向/etc/issue.net写纯文本(不含\r、\m等转义符) -
登录后 motd 输出:除
PrintMotd no外,还需清空 motd 主文件:sudo truncate -s 0 /etc/motd
Ubuntu 用户建议额外停用动态生成服务:sudo systemctl disable motd-news.timer
验证是否真正生效的关键方法
不要依赖登录界面观察,而要看原始协议响应:
- 在另一台机器运行:
nc -v your-server-ip 22,首行应仅显示类似SSH-2.0-OpenSSH_9.2p1,不含Debian、Ubuntu、5.15.0-107-generic等字样 - 检查 SSH 登录前横幅:新建连接,看密码提示前是否只剩一句简洁文字(如 “Authorized access only.”),无内核/发行版痕迹
- 登录成功后执行
uname -r仍会显示内核版本——这是正常且无法也不应屏蔽的;Banner 隐藏目标是防止攻击者**未经交互即可批量探测**,而非限制已授权用户的本地命令











