在Ubuntu系统中,/etc/issue文件默认会显示系统发行版本、内核版本等敏感信息,任何在登录界面或SSH连接前的用户都能看到这些内容。要隐藏这些信息,最直接的方法就是编辑或清空/etc/issue文件,同时还要注意/etc/issue.net这个关联文件,以及SSH的Banner配置。下面我会把每一步操作、每一个相关文件、每一种场景都讲清楚,让你一次搞定,不留安全隐患。
为什么要隐藏/etc/issue中的系统信息
很多人觉得"我的服务器又没人攻击,显示个版本号有什么关系"。这种想法在安全领域是非常危险的。攻击者在渗透之前,第一步就是信息收集。/etc/issue文件暴露的内容包括:Ubuntu的具体版本号(比如22.04 LTS)、内核版本(比如5.15.0-xx)、系统架构等。攻击者拿到这些信息后,可以直接去查找对应版本的已知漏洞(CVE),针对性地发起攻击。隐藏发行信息是安全加固的基础步骤之一,属于"减少攻击面"的核心操作,成本几乎为零,但收益非常大。
/etc/issue和/etc/issue.net的区别
在动手之前,你需要搞清楚这两个文件的作用。/etc/issue是本地终端登录前显示的欢迎信息,也就是你直接在服务器控制台或者通过TTY登录时看到的那一行字。/etc/issue.net则是远程登录(比如telnet、SSH连接前的Banner)时显示的内容。在现代Ubuntu系统中,SSH默认不再使用/etc/issue.net,而是用/etc/ssh/sshd_config中的Banner配置。但为了彻底安全,两个文件都要处理。
第一步:查看当前/etc/issue的内容
在修改之前,先看一下你的系统现在显示什么。打开终端,输入以下命令:
cat /etc/issue
你会看到类似这样的输出:
Ubuntu 22.04.3 LTS \n \l
这里的\n是换行符,\l表示当前终端设备名。这些信息全部暴露在外,必须处理。
第二步:编辑/etc/issue文件隐藏信息
使用你熟悉的文本编辑器打开文件。这里推荐用nano,因为操作简单:
sudo nano /etc/issue
打开后,你有两种选择。第一种是完全清空内容,把里面所有文字删掉,保存为空文件。第二种是替换成一段自定义的、不包含任何系统信息的欢迎语,比如:
Authorized access only. All activities are monitored.
这种做法有两个好处:一是隐藏了系统信息,二是起到了法律威慑作用,告诉未经授权的人不要继续操作。修改完成后,按Ctrl+O保存,Ctrl+X退出。注意,文件权限建议保持644(rw-r--r--),不要改成可执行。
第三步:处理/etc/issue.net文件
同样的操作应用到/etc/issue.net:
sudo nano /etc/issue.net
清空或者替换成不含系统信息的内容。如果你的系统没有这个文件,可以直接创建一个空文件:
sudo touch /etc/issue.net sudo chmod 644 /etc/issue.net
第四步:配置SSH Banner(关键步骤)
前面说了,现代Ubuntu的SSH登录Banner不再读取/etc/issue.net,而是由sshd_config控制。你需要检查这个配置文件:
sudo nano /etc/ssh/sshd_config
找到Banner这一行,如果被注释掉了(前面有#号),就取消注释并指向一个自定义的Banner文件:
Banner /etc/ssh/ssh_banner
然后创建这个Banner文件:
sudo nano /etc/ssh/ssh_banner
写入你的自定义警告信息,同样不要包含任何系统版本信息。保存后,重启SSH服务使配置生效:
sudo systemctl restart sshd
第五步:验证修改是否生效
修改完成后,你需要验证效果。最简单的方法是打开一个新的终端窗口,或者重新登录TTY,看看登录前显示的内容是否已经改变。对于SSH,你可以从另一台机器连接测试:
ssh user@your_server_ip
连接时应该只看到你设置的Banner信息,而不是Ubuntu版本号。如果还是显示原来的内容,检查一下sshd_config中Banner路径是否正确,以及文件权限是否为644。
第六步:防止系统更新覆盖你的修改
这是很多人忽略的问题。Ubuntu系统更新时,可能会重新生成/etc/issue文件,把你的修改覆盖掉。解决办法有两种。第一种是将文件设为不可变属性(immutable):
sudo chattr +i /etc/issue sudo chattr +i /etc/issue.net
这样即使系统更新尝试修改文件,也会被拒绝。需要修改时,先用chattr -i解锁。第二种方法是在/etc/issue中使用静态文本而不是动态变量(如\v、\r等),因为系统更新通常只替换包含动态变量的默认模板。
进阶:其他需要隐藏的系统信息位置
只改/etc/issue是不够的,一个真正做安全加固的管理员,还需要关注以下几个地方。第一是/etc/os-release文件,这个文件包含详细的系统标识信息,虽然默认权限是644,普通用户可以读取,但建议改为:
sudo chmod 640 /etc/os-release
第二是/proc/version文件,这个是内核运行时信息,无法直接修改,但可以通过内核参数限制非特权用户访问/proc文件系统。第三是SSH的版本信息,在sshd_config中设置:
ServerAliveInterval 60 ServerAliveCountMax 3 # 确保没有暴露SSH协议版本的其他配置
实际上,OpenSSH默认不会在Banner中暴露版本号,但你可以在sshd_config中显式确认:
DebianBanner no
不过Ubuntu默认就是no,这一项通常不需要改。
关于法律合规的提醒
在设置SSH Banner时,很多安全规范建议加上类似"Unauthorized access is prohibited"的警告语。这不仅仅是安全措施,在很多国家和地区,这是法律要求。如果有人在看到警告后仍然继续尝试登录,你在法律上会处于更有利的位置。所以建议Banner内容既要简洁,又要有明确的法律声明。
常见问题排查
有些用户修改后发现登录界面还是显示旧信息,原因通常有以下几个。第一,没有重启相关服务,比如SSH服务没重启。第二,文件权限不对,导致系统读取了缓存或者fallback文件。第三,使用了getty服务的情况下,可能需要重启getty而不仅仅是sshd。可以用以下命令重启getty:
sudo systemctl restart getty@tty1
第四,如果你用的是图形界面登录(GDM/LightDM),/etc/issue不会显示,但/etc/issue.net可能被GDM读取,需要确认显示管理器的配置。
总结与最佳实践
隐藏/etc/issue中的系统发行信息是Ubuntu安全加固的入门级操作,但也是最容易被忽视的操作之一。完整的流程包括:编辑/etc/issue、编辑/etc/issue.net、配置SSH Banner、设置文件不可变属性防止覆盖、验证效果。整个过程不超过五分钟,但能有效减少信息泄露风险。建议把这个操作纳入你的服务器初始化脚本或者自动化部署流程中,确保每一台新上线的服务器都默认执行。
安全从来不是一步到位的事情,隐藏系统信息只是第一层。后续你还需要做SSH密钥认证、禁用root密码登录、配置防火墙规则、定期更新补丁等一系列操作。但不管怎样,先把/etc/issue这个"大喇叭"关掉,是所有安全工作的起点。
