CentOS系统的安全加固不是简单地关几个端口、改几个密码就完事了,真正的企业级安全需要从内核参数、资源调度、进程隔离等多个维度构建防线。tuned-adm是CentOS 7/8/9自带的动态系统调优工具,它不仅能优化性能,更关键的是可以通过profile配置文件实现安全策略的隔离运行。所谓"隔离运行环境",就是把不同安全等级的服务放进不同的tuned profile里,用内核级参数把它们隔开,防止一个服务被攻破后横向扩散。这篇文章直接讲怎么干、怎么配、怎么验证,不绕弯子。

一、tuned-adm到底是什么,为什么能做安全隔离

tuned-adm是CentOS系统中一个后台守护进程,它根据预设的profile文件动态调整内核参数、CPU调度策略、磁盘I/O策略、网络参数等。很多人只把它当性能优化工具用,其实它的profile机制天然适合做安全分层。每个profile就是一组内核参数的集合,你可以创建一个"高安全"profile、一个"普通业务"profile、一个"隔离沙箱"profile,然后把不同的服务绑定到不同的profile上。这样做的好处是:参数级别的隔离,不是简单的用户权限隔离,而是从内核层面限制进程能做什么、不能做什么。

二、查看和管理现有的tuned profile

先看系统里已经有哪些profile:

tuned-adm list

你会看到类似throughput-performance、latency-performance、virtual-guest这些默认profile。要看当前激活的是哪个:

tuned-adm active

要看某个profile的具体参数内容:

tuned-adm profile_info virtual-guest

这些命令是基础,后面所有操作都建立在这个认知上。默认情况下CentOS用的是throughput-performance,这个profile偏向性能,安全参数几乎没有,必须自己建。

三、创建安全专用的tuned profile

创建一个名为security-hardened的profile:

tuned-adm profile security-hardened

然后编辑这个profile的配置文件,路径在/etc/tune/security-hardened.tuned:

[main]
summary=Security hardened profile for CentOS

[cpu]
governor=performance
energy_perf_bias=performance

[vm]
transparent_hugepages=never
dirty_ratio=10
dirty_background_ratio=5
swappiness=10

[sysctl]
kernel.randomize_va_space=2
kernel.kptr_restrict=2
kernel.dmesg_restrict=1
kernel.yama.ptrace_scope=1
kernel.unprivileged_bpf_disabled=1
net.ipv4.conf.all.rp_filter=1
net.ipv4.conf.default.rp_filter=1
net.ipv4.conf.all.accept_redirects=0
net.ipv4.conf.default.accept_redirects=0
net.ipv4.conf.all.send_redirects=0
net.ipv4.conf.all.accept_source_route=0
net.ipv4.conf.default.accept_source_route=0
net.ipv4.icmp_echo_ignore_broadcasts=1
net.ipv4.conf.all.log_martians=1
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_max_syn_backlog=4096
net.core.somaxconn=65535

[disk]
elevator=noop

这个配置里每一项都有明确的安全意图。transparent_hugepages设为never是防止THP漏洞被利用;swappiness设为10减少swap使用,降低内存信息泄露风险;kptr_restrict=2让内核指针对非root用户不可见;ptrace_scope=1限制进程追踪,防止恶意程序调试其他进程;unprivileged_bpf_disabled=1禁用非特权BPF,堵住一个常见的提权通道。网络参数那一堆都是防IP欺骗、防SYN洪水、防ICMP广播攻击的。

四、创建隔离沙箱专用profile

对于那些不太信任的应用,比如第三方部署的服务、测试环境的程序,需要更严格的隔离。再建一个profile叫sandbox-isolation:

tuned-adm profile sandbox-isolation

编辑/etc/tune/sandbox-isolation.tuned:

[main]
summary=Sandbox isolation profile for untrusted workloads

[cpu]
governor=powersave
energy_perf_bias=balance_power

[vm]
transparent_hugepages=never
dirty_ratio=5
dirty_background_ratio=3
swappiness=1
vm.overcommit_memory=2

[sysctl]
kernel.randomize_va_space=2
kernel.kptr_restrict=2
kernel.dmesg_restrict=1
kernel.yama.ptrace_scope=1
kernel.unprivileged_bpf_disabled=1
kernel.exec-shield=1
net.ipv4.conf.all.rp_filter=1
net.ipv4.conf.default.rp_filter=1
net.ipv4.conf.all.accept_redirects=0
net.ipv4.conf.default.accept_redirects=0
net.ipv4.conf.all.send_redirects=0
net.ipv4.conf.all.accept_source_route=0
net.ipv4.conf.default.accept_source_route=0
net.ipv4.icmp_echo_ignore_broadcasts=1
net.ipv4.conf.all.log_martians=1
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_max_syn_backlog=2048
net.core.somaxconn=32768
net.ipv4.ip_forward=0

[disk]
elevator=deadline

这个profile比上一个更狠。overcommit_memory=2意味着严格限制内存分配,不允许过度承诺,防止内存耗尽攻击。ip_forward=0直接关掉IP转发,沙箱里的进程别想当路由器。CPU governor用powersave降低功耗的同时也限制了突发计算能力,防止恶意程序消耗过多资源。

五、把profile绑定到具体的服务或cgroup

tuned-adm本身不直接绑定服务,但可以通过systemd的slice和cgroup配合实现。先创建一个systemd slice给高安全服务:

mkdir -p /etc/systemd/system/high-security.slice.d

创建override.conf:

[Slice]
CPUQuota=50%
MemoryMax=2G
TasksMax=100

然后把需要高安全保护的服务放进去,比如sshd:

systemctl edit sshd

在编辑界面加入:

[Service]
Slice=high-security.slice

重启服务后,sshd就被限制在50%CPU、2G内存、100个任务以内。同时系统整体运行在security-hardened profile下,内核参数层面已经做了加固。对于沙箱服务,创建另一个slice:

mkdir -p /etc/systemd/system/sandbox.slice.d
[Slice]
CPUQuota=20%
MemoryMax=512M
TasksMax=50
IOReadBandwidthMax=/dev/sda 10M
IOWriteBandwidthMax=/dev/sda 5M

这样沙箱里的程序不仅CPU和内存被限制,磁盘I/O也被限速了。这就是真正的隔离运行环境——内核参数层面的tuned profile加上cgroup资源限制,双重隔离。

六、激活profile并设置开机自启

创建好profile后需要激活:

tuned-adm profile security-hardened

验证是否生效:

sysctl -a | grep kptr_restrict

应该看到kernel.kptr_restrict = 2。设置开机默认使用这个profile:

tuned-adm profile security-hardened

确认:

tuned-adm active

如果要切换到沙箱profile做测试:

tuned-adm profile sandbox-isolation

生产环境建议永远用security-hardened,沙箱profile只在测试或隔离环境用。

七、验证安全配置是否真正生效

光配置完不验证等于白干。几个关键检查点:

cat /proc/sys/kernel/kptr_restrict

值为2表示内核指针已隐藏。检查ASLR:

cat /proc/sys/kernel/randomize_va_space

值为2表示完全随机化。检查THP:

cat /sys/kernel/mm/transparent_hugepage/enabled

应该显示[never]。检查IP转发是否关闭:

sysctl net.ipv4.ip_forward

值为0才对。检查cgroup限制是否生效:

systemctl show sshd | grep Slice

应该显示Slice=high-security.slice。这些检查建议写成脚本定期跑,纳入运维监控体系。

八、实际部署中的注意事项和坑

第一,不要一上来就把所有服务都塞进高安全profile。有些服务比如数据库需要较高的swappiness和dirty_ratio来保证性能,强制用安全参数会导致性能严重下降。正确做法是按服务安全等级分级,核心数据库用中等安全profile,对外暴露的Web服务用高安全profile,不信任的第三方程序用沙箱profile。

第二,tuned profile里的sysctl参数会覆盖/etc/sysctl.conf里的设置。如果两处有冲突,tuned的优先级更高。所以建议把所有内核参数统一放在tuned profile里管理,不要两边同时配,容易出问题。

第三,CentOS 8和9用的是tuned 2.x版本,和CentOS 7的tuned 1.x有差异。CentOS 9的profile文件格式略有变化,但核心逻辑一样。如果你用的是Rocky Linux或AlmaLinux,tuned完全兼容,直接照搬。

第四,创建自定义profile后要记得用tuned-adm verify检查语法是否正确:

tuned-adm verify security-hardened

有错误它会提示,别跳过这步。

九、进阶:结合SELinux和防火墙做纵深防御

tuned-adm做的是内核参数层面的加固,但安全是纵深的。建议同时开启SELinux enforcing模式:

setenforce 1
sed -i 's/SELINUX=permissive/SELINUX=enforcing/' /etc/selinux/config

防火墙用firewalld配合tuned的网络参数:

firewall-cmd --permanent --add-service=ssh
firewall-cmd --permanent --add-service=https
firewall-cmd --reload

tuned里已经设了rp_filter、accept_redirects=0这些参数,再加上firewalld的端口白名单,网络层面基本锁死了。三层叠加:tuned内核参数 + SELinux强制访问控制 + firewalld端口过滤,这才是完整的安全体系。

十、总结

CentOS的tuned-adm不只是性能工具,它的profile机制是实现安全隔离运行环境的低成本高效方案。创建security-hardened和sandbox-isolation两个profile,配合systemd slice的cgroup资源限制,就能在不额外安装安全软件的情况下实现内核级的服务隔离。关键是按服务安全等级分级配置,不要一刀切,同时做好验证和监控。这套方案适合中小企业和运维团队快速落地,不需要复杂的安全设备投入,就能把系统安全基线拉到一个相当高的水平。