2、操作系统安全加固:Linux内核参数优化、最小化安装原则、不必要的服务禁用、账户与权限管理
好,咱们进入第二个大块——操作系统安全加固。说实话,POS终端最容易被忽视的就是操作系统层面。很多人觉得,我应用层做好了加密,网络层有防火墙,系统层随便搞搞就行。嗯,这个想法很危险。我见过太多案例,应用层固若金汤,结果被人从系统层直接提权,整个POS机成了别人的跳板。
操作系统安全加固,说白了就是四个字:瘦身、锁门。瘦身就是砍掉一切不需要的东西,锁门就是把该关的口子全部堵死。下面我一个个拆开讲。
2.1 Linux内核参数优化
内核参数优化,很多人一听就觉得是高端操作。其实没那么玄乎。你想想看,POS终端本质上就是一个专用设备,它不需要像通用服务器那样处理各种复杂网络场景。所以我们要做的,就是把那些不必要的网络功能、资源限制给收紧。
我个人习惯,拿到一台POS终端后,第一件事就是调整 /etc/sysctl.conf。这里我列几个最关键的参数:
| 参数 | 推荐值 | 说明 |
|---|---|---|
net.ipv4.tcp_syncookies |
1 | 开启SYN Cookie,防止SYN Flood攻击 |
net.ipv4.ip_forward |
0 | 禁止IP转发,POS终端不需要做路由器 |
net.ipv4.conf.all.accept_source_route |
0 | 禁止接受源路由包,防止路由欺骗 |
net.ipv4.conf.all.rp_filter |
1 | 开启反向路径过滤,防止IP欺骗 |
kernel.exec-shield |
1 | 开启执行保护,防止缓冲区溢出攻击 |
kernel.randomize_va_space |
2 | 开启ASLR(地址空间布局随机化) |
核心原则:POS终端不是通用服务器,能关的功能全部关掉。你多开一个功能,就多一个被攻击的入口。
我记得有一次,一个客户反馈他们的POS终端经常被扫描到开放了某个高危端口。排查了半天,发现是内核参数 net.ipv4.conf.all.accept_redirects 没关,导致ICMP重定向攻击有机可乘。从那以后,我每次做内核加固都会把这条加进去。
配置完参数后,记得执行 sysctl -p 使其生效。嗯,这里要注意,有些参数修改后需要重启才能完全生效,比如 kernel.exec-shield。建议你在终端上线前统一做一次重启验证。
2.2 最小化安装原则
最小化安装,这个原则听起来简单,做起来其实挺考验功力的。什么叫最小化?就是只装POS业务必须的软件包,多一个都不要。
我见过很多POS终端,出厂时预装了一堆东西:Apache、MySQL、FTP、甚至还有桌面环境。你想想看,一个POS机要Apache干什么?要MySQL干什么?这些东西不仅占用资源,更重要的是它们带来了大量的攻击面。
具体怎么做?我建议从这几个方面入手:
- 操作系统选择:优先使用专为嵌入式设计的Linux发行版,比如Yocto、Buildroot构建的定制系统。如果必须用通用发行版,选最小化安装选项。
- 软件包管理:安装完成后,用
rpm -qa或dpkg -l列出所有已安装的包,逐项审查。不确定用途的包,一律先查清楚再决定是否保留。 - 开发工具链:GCC、Make、Perl、Python等开发工具,在POS终端上完全不需要。生产环境必须移除。
- 文档和示例:系统自带的man手册、示例配置文件、HTML文档等,全部删除。
我的经验:我曾经接手过一个项目,POS终端上居然装了X11图形界面。问原因,说是为了方便调试。结果呢?调试没用到几次,反而被人利用X11的漏洞搞了一次提权。所以,调试工具只在调试阶段存在,上线前必须清理干净。
这里我提供一个简单的检查脚本思路:
#!/bin/bash
# 列出所有非系统核心包,供人工审查
rpm -qa --queryformat '%{NAME}\n' | sort > /tmp/all_packages.txt
# 对比白名单,输出可疑包
comm -23 /tmp/all_packages.txt /etc/security/whitelist_packages.txt
白名单文件需要你自己维护,里面只放POS业务必须的包名。其他的一律视为可疑。
2.3 不必要的服务禁用
服务禁用,是最容易出效果的一步。你想想看,一个POS终端需要哪些服务?基本上就是:网络通信服务(比如SSH用于远程维护)、POS应用服务、日志服务。其他的,比如打印服务(除非是专用票据打印机)、蓝牙服务、NFS、Samba、Telnet、FTP,统统禁用。
我建议用 systemctl list-unit-files --type=service 列出所有服务,然后逐个检查。下面是我常用的禁用清单:
- 远程管理类:Telnet(明文传输,绝对不能用)、FTP(同上)、rsh/rlogin(老旧协议)
- 文件共享类:NFS、Samba、NetBIOS
- 打印类:CUPS(除非POS需要本地打印)
- 蓝牙/红外:bluetooth、irda
- 自动挂载:autofs、udisks2
- 其他:Avahi(mDNS)、NTP(如果POS不需要精确时间同步)
警告:禁用服务前,一定要确认该服务不是POS业务依赖的。我曾经见过有人把SSH禁用了,结果远程维护通道全断,最后只能派人去现场一台台恢复。建议先做影响评估,再动手。
禁用服务的命令很简单:
systemctl stop <service_name>
systemctl disable <service_name>
但这里有个坑——有些服务是其他服务的依赖,你禁用了它,可能导致连锁反应。所以我的习惯是:先 systemctl mask 而不是直接 disable。mask 会创建一个指向 /dev/null 的符号链接,彻底阻止服务启动,但不会影响依赖关系检查。等确认没问题了,再改成 disable。
2.4 账户与权限管理
账户和权限,这是操作系统安全最后一道防线。POS终端上,账户管理要遵循一个原则:最小权限、最小数量。
具体来说:
- 删除不必要的账户:系统安装时默认创建的那些账户,比如games、ftp、nobody(如果不用)、lp等,全部删除或锁定。
- root账户管理:禁止root直接SSH登录。POS终端日常运维应该使用普通账户,需要提权时用sudo。
- 密码策略:设置密码复杂度、过期时间、失败锁定。POS终端的密码策略可以比通用服务器更严格,因为它的使用场景更可控。
- sudo权限控制:只给运维人员必要的sudo权限,不要给ALL。比如,只允许执行特定的维护脚本。
我举个例子,sudo权限配置:
# 在 /etc/sudoers.d/ 下创建专用文件
# 允许 posadmin 用户执行重启和日志查看命令
posadmin ALL=(ALL) /sbin/reboot, /bin/systemctl restart pos-app, /bin/journalctl
权限管理方面,重点检查SUID/SGID文件。这些文件允许普通用户以文件所有者的权限执行,是提权攻击的常见目标。用以下命令扫描:
find / -perm -4000 -o -perm -2000 2>/dev/null
扫描结果中,只保留确实需要SUID的程序(比如 sudo、passwd),其他的全部去掉SUID位。
避坑指南:我曾经在一个项目中,发现POS终端上有个 /usr/bin/at 命令居然带着SUID位。这个命令在POS场景下根本用不到,但攻击者可以利用它来定时执行恶意任务。去掉SUID位后,这个风险点就消除了。
最后,别忘了检查umask值。POS终端的umask建议设置为 0027 或更严格,确保新建文件和目录默认不给其他用户读写权限。
好了,操作系统安全加固这块就讲到这里。这四个方面——内核参数、最小化安装、服务禁用、账户权限——是环环相扣的。你只做其中一两个,效果会大打折扣。只有全部做到位,才能说你的POS终端在操作系统层面是安全的。