2、操作系统安全基线(Linux):账户策略、SSH加固、最小化安装、文件权限管理
Linux系统在工业物联网里有多普遍?这么说吧,我经手的项目,十有八九底层都是Linux。不管是网关、边缘计算盒子,还是PLC的上位机,跑的都是它。但问题也出在这——很多人拿过来就用,默认配置一挂,就扔进产线了。嗯,这其实挺危险的。
今天这一章,咱们就聚焦在四个最基础、也最容易被忽视的点上:账户策略、SSH加固、最小化安装、文件权限管理。说白了,就是把你系统的“门锁”换一遍,把“窗户”焊死,再把屋里不该有的杂物清出去。
2.1 账户策略:谁在用你的系统?
我遇到过一家工厂,他们的Linux网关居然有6个共享账户,密码都是“admin123”。问他们为什么,答曰“方便”。方便是方便了,但一旦出事,连谁干的都查不出来。
账户策略的核心就三件事:最小化、强密码、可审计。
2.1.1 删除或锁定不必要的账户
安装完系统后,第一件事就是检查 /etc/passwd。很多默认账户(比如 games、ftp、lp)在工业场景下根本用不到。
# 查看所有可登录账户
awk -F: '$7 ~ /bash|sh/ {print $1}' /etc/passwd
# 锁定无用账户(不要直接删除,防止某些服务依赖)
usermod -L games
usermod -L lp
usermod -L uucp
cat /etc/passwd | grep -v nologin,把能登录的账户列出来。然后一个一个问项目负责人:“这个账户谁在用?” 答不上来的,一律锁定。
2.1.2 密码策略:别让密码成为摆设
密码策略不是设个复杂密码就完事了。你得管它的生命周期。我建议直接在 /etc/login.defs 和 /etc/pam.d/system-auth 里动手。
| 参数 | 推荐值 | 说明 |
|---|---|---|
| PASS_MAX_DAYS | 90 | 密码最长使用天数,工业环境建议90天轮换 |
| PASS_MIN_DAYS | 7 | 密码最短使用天数,防止频繁修改 |
| PASS_MIN_LEN | 12 | 密码最小长度,12位起步 |
| PASS_WARN_AGE | 14 | 密码过期前14天开始警告 |
另外,别忘了在PAM里开启密码复杂度要求:
# 在 /etc/pam.d/system-auth 中添加
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= minlen=12 dcredit=-1 ucredit=-1 ocredit=-1 lcredit=-1
这个配置的意思是:密码至少12位,必须包含数字、大写字母、小写字母、特殊字符各至少1个。
2.2 SSH加固:把大门守好
SSH是远程管理Linux的命脉。但默认配置下的SSH,就像把家门钥匙挂在门把手上。你想想看,默认端口22、允许root登录、允许密码认证……这不等于请黑客来串门吗?
2.2.1 核心加固项
直接改 /etc/ssh/sshd_config,改完记得 systemctl restart sshd。
# 1. 改端口(避开默认的22)
Port 2222
# 2. 禁止root直接登录
PermitRootLogin no
# 3. 仅允许密钥认证
PasswordAuthentication no
PubkeyAuthentication yes
# 4. 限制可登录用户
AllowUsers ops_admin monitor_user
# 5. 空闲超时断开
ClientAliveInterval 300
ClientAliveCountMax 2
这里我特别想强调一下改端口这件事。有人说这是“安全通过模糊化”,不靠谱。但我在实际项目里发现,改掉22端口至少能挡住90%的自动化扫描攻击。它不是银弹,但成本极低,为什么不做?
2.2.2 密钥管理:别把钥匙乱放
既然用了密钥认证,那密钥本身的安全就至关重要。我个人习惯的做法是:
- 每个设备用独立的密钥对,不要一把钥匙开所有锁。
- 私钥设置密码短语(passphrase),就算私钥泄露,对方也还需要密码。
- 公钥加入
authorized_keys时,限制来源IP和执行的命令。
# 在 authorized_keys 中限制来源IP和命令
from="192.168.1.100",command="/usr/bin/check_status.sh" ssh-rsa AAAAB3NzaC1yc2E... user@monitor
authorized_keys 里给每个公钥加上注释,标明“谁在用、哪台设备、什么时候添加的”。半年后回头看,你会感谢自己这个习惯。
2.3 最小化安装:少即是多
这是我最想强调的一点。很多人在装Linux时,图省事直接选了“带图形界面的服务器”或者“开发工具包”。结果系统里装了一大堆用不上的软件包。
为什么说这很危险?你想想看,每一个额外的软件包,都是一个潜在的攻击入口。那个你从来没打开过的打印服务,可能就藏着CVE漏洞。
2.3.1 安装时的选择
如果是从头安装,我强烈建议选择最小化安装(Minimal Install)。以CentOS/RHEL为例,安装时只选“基本功能”和“标准系统工具”,其他一概不选。
装完之后,用这个命令看看系统里到底开了哪些端口:
ss -tlnp
理想情况下,应该只有SSH(如果你改了端口,就是新端口)和可能需要的工业协议端口(如Modbus TCP 502)。如果看到什么 httpd、cupsd、rpcbind,嗯,该清理了。
2.3.2 清理不必要的服务
# 查看所有正在运行的服务
systemctl list-units --type=service --state=running
# 禁用不必要的服务
systemctl disable cups.service
systemctl disable avahi-daemon.service
systemctl disable postfix.service
rpcbind,你把它关了,产线可能就停了。我建议先查清楚每个服务的用途,再动手。
2.4 文件权限管理:谁可以碰什么?
文件权限这件事,说简单也简单,说复杂也复杂。但工业环境里,我见过太多“chmod 777”解决问题的情况了。每次看到我都想叹气——这等于把保险柜的门拆了,然后说“这样拿东西方便”。
2.4.1 核心目录权限
| 目录/文件 | 推荐权限 | 说明 |
|---|---|---|
| /etc/shadow | 600 (rw-------) | 密码哈希文件,只有root能读 |
| /etc/ssh/sshd_config | 600 (rw-------) | SSH配置,包含密钥路径 |
| /var/log/ | 750 (rwxr-x---) | 日志目录,运维组可读 |
| /home/ | 755 (rwxr-xr-x) | 用户家目录,但每个用户的家目录应为700 |
| /tmp/ | 1777 (rwxrwxrwt) | 粘滞位,防止用户删除彼此的文件 |
2.4.2 SUID/SGID 排查
SUID和SGID位是权限管理的“特例”。设置了SUID的程序,任何用户运行它时,都会以文件所有者的身份执行。这很危险。
# 查找所有设置了SUID的文件
find / -perm -4000 -type f 2>/dev/null
# 查找所有设置了SGID的文件
find / -perm -2000 -type f 2>/dev/null
检查结果,如果看到不熟悉的程序有SUID位,比如某个自定义脚本或者第三方工具,一定要问清楚:它真的需要这个权限吗?
2.5 本章知识体系
下面这张图,把这一章的核心逻辑串起来了。你可以把它当作一个检查清单,每次部署新设备时,对着过一遍。
好了,这一章的内容就这些。账户策略、SSH加固、最小化安装、文件权限管理——这四个点看起来简单,但每一条背后都有血的教训。我建议你下次部署设备时,把这四个点做成一个检查清单,每做完一项就打勾。养成习惯后,你会发现系统的“体质”明显不一样了。