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资源限制,就能在不额外安装安全软件的情况下实现内核级的服务隔离。关键是按服务安全等级分级配置,不要一刀切,同时做好验证和监控。这套方案适合中小企业和运维团队快速落地,不需要复杂的安全设备投入,就能把系统安全基线拉到一个相当高的水平。
