2、操作系统安全基线(Linux):账户策略、SSH加固、最小化安装、文件权限管理

Linux系统在工业物联网里有多普遍?这么说吧,我经手的项目,十有八九底层都是Linux。不管是网关、边缘计算盒子,还是PLC的上位机,跑的都是它。但问题也出在这——很多人拿过来就用,默认配置一挂,就扔进产线了。嗯,这其实挺危险的。

今天这一章,咱们就聚焦在四个最基础、也最容易被忽视的点上:账户策略、SSH加固、最小化安装、文件权限管理。说白了,就是把你系统的“门锁”换一遍,把“窗户”焊死,再把屋里不该有的杂物清出去。

核心原则: 工业环境里的Linux,不是开发机,更不是桌面机。它的第一要务是稳定、安全、可追溯。任何多余的账户、开放的服务、宽松的权限,都是潜在的攻击面。

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个。

我曾经踩过的坑: 有一次在产线设备上改了密码策略,结果第二天操作员登录不上去了。后来发现是PAM配置写错了,导致密码验证直接跳过。从那以后,我每次改PAM配置都会先开一个root会话窗口不关,确认没问题再退出。

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
注意: 禁用服务前,一定要确认它不影响工业应用。比如有些老旧的PLC通信依赖 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位,比如某个自定义脚本或者第三方工具,一定要问清楚:它真的需要这个权限吗?

我的经验: 有一次我发现一个工控软件的数据采集程序居然有SUID位,而且是root。后来查代码发现,它只是为了读一个硬件设备文件。解决方案很简单:把那个设备文件的权限改成660,然后把采集程序加入专门的组。SUID位就去掉了。

2.5 本章知识体系

下面这张图,把这一章的核心逻辑串起来了。你可以把它当作一个检查清单,每次部署新设备时,对着过一遍。

Linux 安全基线核心逻辑 目标:最小攻击面 + 可审计 + 高可用 账户策略 SSH 加固 最小化安装 文件权限 账户策略 · 删除无用账户 · 密码复杂度 & 生命周期 · PAM 配置 SSH 加固 · 改端口、禁root · 密钥认证 + 限制来源 · 空闲超时断开 最小化安装 · 安装时选 Minimal · 清理多余服务 · 检查开放端口 文件权限 · 核心文件 600/750 · 排查 SUID/SGID · 避免 777 权限 输出:安全合规的工业 Linux 系统 说明:这四块是基础中的基础。做完这些,你的系统已经能挡住大部分自动化攻击和误操作了。

好了,这一章的内容就这些。账户策略、SSH加固、最小化安装、文件权限管理——这四个点看起来简单,但每一条背后都有血的教训。我建议你下次部署设备时,把这四个点做成一个检查清单,每做完一项就打勾。养成习惯后,你会发现系统的“体质”明显不一样了。