首页 / 资讯动态 / Centos服务器防止非法提权安全策略

Centos服务器防止非法提权安全策略

Centos服务器被提权,通常不是因为攻击者掌握了什么高深莫测的0day漏洞,而是因为运维人员在基础安全配置上的疏忽。非法提权的本质,是攻击者从一个低权限账户(如Web服务运行账户apache或nobody)突破限制,获取了root权限。要防止这种情况发生,不能只依赖单一措施,必须建立一套纵深防御体系,从系统内核、用户权限、文件系统、服务运行环境到审计监控,层层设防。

内核参数加固:阻断提权漏洞的底层路径

很多本地提权漏洞依赖于内核的特定功能或默认宽松的参数。通过调整sysctl参数,能直接封堵一大类攻击手法。首先,必须限制普通用户查看其他用户进程的权限。攻击者提权前,往往会通过ps等命令搜集运行中的服务信息,寻找漏洞突破口。

执行以下命令进行配置:

echo "kernel.kptr_restrict = 2" >> /etc/sysctl.conf
echo "kernel.dmesg_restrict = 1" >> /etc/sysctl.conf
echo "kernel.perf_event_paranoid = 3" >> /etc/sysctl.conf
echo "kernel.yama.ptrace_scope = 2" >> /etc/sysctl.conf
sysctl -p

kernel.kptr_restrict设置为2,彻底隐藏内核符号地址,让攻击者无法在/proc/kallsyms中获取编写exp所需的内核函数地址。kernel.dmesg_restrict设为1,防止普通用户通过dmesg读取内核日志,这些日志常包含敏感的内存地址信息。kernel.perf_event_paranoid设为3,禁止非特权用户使用性能监控功能,该功能曾多次被用于内核漏洞利用。kernel.yama.ptrace_scope设为2,只允许具有CAP_SYS_PTRACE能力的进程进行ptrace操作,阻止攻击者通过注入进程来提权。这些参数从信息泄露和功能滥用两个维度,大幅提高了内核漏洞利用的难度。

SUID与SGID文件管控:清除潜伏的定时炸弹

SUID(Set User ID)程序是提权攻击最常利用的目标。当一个可执行文件设置了SUID位,任何用户运行它时都会以文件所有者的权限执行。如果这个文件存在漏洞,比如缓冲区溢出或命令注入,攻击者就能瞬间获得root权限。系统管理员必须对SUID文件进行严格清理和监控。

首先,全面扫描系统中所有SUID和SGID文件:

find / -perm -4000 -type f -exec ls -la {} \; 2>/dev/null
find / -perm -2000 -type f -exec ls -la {} \; 2>/dev/null

对于不需要普通用户执行的系统命令,如passwd、su、sudo等,保留其SUID位是必要的,但务必确保它们已更新到最新版本。对于vim、less、find、nmap等工具,如果设置了SUID位,则极度危险。例如,拥有SUID权限的find命令,可以直接执行任意系统命令:

find . -exec /bin/sh -p \; -quit

这条命令会以root身份启动一个shell。必须移除这些非必要工具的SUID位:

chmod u-s /usr/bin/find
chmod u-s /usr/bin/vim.basic

更彻底的方案是,在分区挂载时添加nosuid选项。对于/tmp、/var/tmp、/dev/shm等可写目录,应在/etc/fstab中配置nosuid挂载:

tmpfs /tmp tmpfs defaults,noexec,nosuid,nodev 0 0

这样即使攻击者上传了带有SUID位的恶意程序,在这些目录中也无法生效。同时,结合自动化监控脚本,每天比对SUID文件列表的变化,一旦发现新增或修改,立即告警。

Sudo权限精细化管理:最小化特权授予

很多运维人员图省事,直接给普通用户配置NOPASSWD: ALL权限,这等于把root密码拱手相送。sudo的配置必须遵循最小权限原则,精确到具体的命令和参数,甚至限制命令的执行环境。

编辑/etc/sudoers文件时,务必使用visudo命令,它能检查语法错误,防止配置失误导致所有用户都无法获取root权限。典型的危险配置如下:

user1 ALL=(ALL) NOPASSWD: ALL

这种配置必须禁止。正确的做法是,只授予执行特定管理脚本的权限,并且禁止在sudo环境下生成子shell。例如,只允许user1执行一个系统状态收集脚本:

user1 ALL=(root) NOPASSWD: /usr/local/bin/syscheck.sh

对于需要交互式操作的场景,可以限制能够执行的命令列表,同时利用sudo的NOEXEC功能,禁止被授权的命令再调用其他程序:

Defaults env_reset
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
Cmnd_Alias ADMIN_CMDS = /usr/bin/systemctl restart nginx, /usr/bin/systemctl status php-fpm
user2 ALL=(root) NOPASSWD: ADMIN_CMDS

env_reset会重置环境变量,防止攻击者通过PYTHONPATH、LD_PRELOAD等环境变量注入恶意库来劫持sudo执行的命令。secure_path明确定义了可执行文件的搜索路径,避免攻击者利用当前目录下的同名恶意程序欺骗管理员。特别需要注意的是,像awk、vim、less这类能通过内部命令执行shell的程序,即使授予sudo权限也极其危险。例如,sudo vim后输入:!bash就能直接获得root shell。对于这类程序,可以使用rvim限制其功能,或者干脆禁止通过sudo执行。

服务运行隔离:切割提权后的横向移动空间

Web服务、数据库服务等网络应用是攻击者的首要突破口。一旦这些服务被攻陷,攻击者会以服务运行账户的身份在系统中活动。如果这些服务以root身份运行,或者不同服务间没有隔离,整个系统就会瞬间沦陷。必须为每个服务创建独立的低权限运行账户,并利用SELinux或AppArmor实施强制访问控制。

以Nginx为例,绝不使用root运行worker进程。在nginx.conf中明确指定运行用户:

user nginx;
worker_processes auto;

同时确保nginx用户对网站目录只有读取权限,对需要上传的目录单独设置写入权限,并禁止执行权限:

chown -R root:root /var/www/html
find /var/www/html -type d -exec chmod 755 {} \;
find /var/www/html -type f -exec chmod 644 {} \;
chown -R nginx:nginx /var/www/html/uploads
chmod 755 /var/www/html/uploads

更进一步,使用SELinux的targeted策略,为Web服务配置合适的上下文类型。比如,静态文件设置为httpd_sys_content_t,上传目录设置为httpd_sys_rw_content_t,脚本文件设置为httpd_sys_script_exec_t。即使攻击者通过Web漏洞写入了恶意文件,由于SELinux的类型强制机制,该文件也无法在httpd_t域中执行,从而阻断了提权链条。对于使用PHP的应用,务必在php.ini中禁用危险函数:

disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source

这些函数常被用于在获得Webshell后执行系统命令。虽然这不是绝对安全的保证,但能显著增加攻击者的操作难度。

系统完整性监控与审计:让提权行为无处遁形

再严密的防御也可能存在疏漏,因此必须建立实时监控和审计机制,在攻击者提权的瞬间捕获异常,并立即触发阻断或告警。AIDE(Advanced Intrusion Detection Environment)是文件完整性检查的利器。在系统完成安全加固后,立即初始化AIDE数据库:

aide --init
cp /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz

然后配置crontab,每天对关键目录如/bin、/sbin、/usr/bin、/usr/sbin、/etc进行完整性校验:

0 3 * * * /usr/sbin/aide --check | mail -s "AIDE Report" admin@example.com

任何对系统二进制文件(如/bin/bash、/usr/bin/sudo)的篡改,都会被AIDE发现。因为攻击者替换这些文件往往是提权后的第一步操作。

审计子系统auditd是另一个核心组件。通过配置audit规则,可以精确记录所有涉及权限变更、关键系统调用和敏感文件访问的行为。在/etc/audit/rules.d/audit.rules中添加以下规则:

-a always,exit -F arch=b64 -S execve -k exec_calls
-a always,exit -F arch=b64 -S setuid -S setreuid -S setresuid -k suid_ops
-a always,exit -F arch=b64 -S setgid -S setregid -S setresgid -k sgid_ops
-w /etc/sudoers -p wa -k sudoers_change
-w /etc/shadow -p wa -k shadow_change
-w /etc/passwd -p wa -k passwd_change

这些规则会记录所有程序执行、用户ID变更、组ID变更以及对sudoers和shadow文件的修改。当攻击者利用SUID漏洞或sudo配置错误提权时,audit日志中会清晰地留下进程调用链。结合ausearch工具,可以快速检索可疑事件:

ausearch -k suid_ops --start today

对于更高级的威胁检测,可以部署osquery进行实时系统状态查询,或者使用Falco这类基于内核模块的运行时安全工具。Falco能够监控系统调用,通过预定义规则检测容器逃逸、非授权进程启动、敏感文件读取等行为。例如,当检测到在容器内启动了一个交互式shell,或者某个进程试图修改/etc/passwd时,Falco会在毫秒级内发出告警。

用户环境限制与登录安全:收紧初始访问入口

防止提权的前提是尽量增加攻击者获取初始低权限账户的难度,并在其获得账户后限制活动范围。对于必须通过SSH登录的用户,一律禁止root直接登录,并强制使用密钥认证:

PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes

同时,利用pam_tally2模块限制登录失败次数,防止暴力破解:

auth required pam_tally2.so deny=5 unlock_time=600 even_deny_root root_unlock_time=300

对于已登录的普通用户,通过/etc/security/limits.conf和/etc/profile或.bashrc设置严格的资源限制和环境变量。例如,限制用户能创建的最大进程数,防止fork炸弹耗尽系统资源:

user1 hard nproc 100

在用户的shell配置中,将PATH变量限制为安全的系统路径,并设置只读变量,防止攻击者通过修改PATH或LD_PRELOAD来劫持命令执行:

readonly PATH="/usr/local/bin:/usr/bin:/bin"
readonly LD_PRELOAD

此外,定期检查所有用户的.crontab和at任务,攻击者常通过这些定时任务维持持久化访问并尝试提权。检查目录包括/var/spool/cron和/etc/cron.*下的所有文件,确保没有异常条目。

综合来看,Centos服务器的防提权策略是一个动态的、多层次的工程。内核参数是地基,SUID管控和sudo精细化是支柱,服务隔离是防火墙,审计监控是哨兵,而用户环境限制则是最后一道防线。这些措施相互配合,才能构建起真正有效的纵深防御体系,让攻击者即使突破了外围防线,也难以跨越权限的壁垒。