Linux服务器的基线安全,核心在前置加固。与其等基线扫描扫出一堆高危项再熬夜整改,不如在系统初始化、上线前就按标准闭环配置,从源头把风险堵死。本文聚焦前期必做的基线加固动作,覆盖安装、账户、权限、网络、内核、日志、补丁全环节,附带具体操作步骤、命令及配置修改细节,兼顾CentOS(7/8)、Ubuntu(20.04/22.04)主流发行版,做到一次配置、长期合规,彻底杜绝后期基线扫描隐患。
1、账户与认证
账户安全是基线必查项(高频告警:root远程登录、弱密码、无用账户),前期收紧配置。
禁用root远程登录
# 禁止root直接远程SSH登录,仅允许普通用户通过sudo提权,所有发行版通用# 先创建一个普通管理员账户(避免禁用root后无法登录)useradd yw# 设置用户密码passwd yw# 配置sudo权限,wheel组默认有sudo权限usermod -aG wheel yw# Ubuntu配置sudousermod -aG sudo yw# 修改SSH配置文件,禁用root远程登录vi /etc/ssh/sshd_configPermitRootLogin no # 禁用root远程登录PermitEmptyPasswords no # 禁止空密码登录PasswordAuthentication yes # 暂时保留密码登录(配置完密钥后可改为no)AllowUsers yw # 仅允许yw用户远程登录(可选,更严格,多个用户用空格分隔)systemctl restart sshd
强密码策略
配置密码复杂度、有效期、锁定策略,杜绝弱密码
# CentOS系统(通过pam模块配置)# 编辑密码策略配置文件vi /etc/pam.d/system-auth# 在文件中添加/修改以下内容(确保在password sufficient pam_unix.so行之前)# 密码复杂度:至少1位大写、1位小写、1位数字、1位特殊符号,长度≥12位password requisite pam_cracklib.so try_first_pass retry=3 minlen=12 dcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1# 密码历史:禁止重复使用前5次密码password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=5# 编辑账户有效期配置文件vi /etc/login.defs# 修改以下参数(无则添加)PASS_MAX_DAYS 90 # 密码有效期90天PASS_MIN_DAYS 7 # 密码最小修改间隔7天(防止频繁改密码绕过历史限制)PASS_WARN_AGE 7 # 密码过期前7天提醒UID_MIN 1000 # 普通用户UID从1000开始(避免与系统用户冲突)# 配置登录失败锁定(编辑sshd配置文件)vi /etc/pam.d/sshd# 添加以下内容(登录连续3次失败,锁定10分钟)auth required pam_tally2.so deny=3 unlock_time=600 even_deny_root root_unlock_time=600# Ubuntu系统(通过pam模块配置)# 安装密码复杂度工具(若未安装)apt install -y libpam-cracklib# 编辑密码策略配置文件vi /etc/pam.d/common-password# 添加/修改以下内容(在password [success=1 default=ignore] pam_unix.so行之前)password requisite pam_cracklib.so try_first_pass retry=3 minlen=12 dcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1password [success=1 default=ignore] pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=5# 编辑账户有效期配置文件(与CentOS一致)vi /etc/login.defs# 修改参数同CentOS:PASS_MAX_DAYS 90、PASS_MIN_DAYS 7、PASS_WARN_AGE 7、UID_MIN 1000# 配置登录失败锁定(编辑sshd配置文件)vi /etc/pam.d/sshd# 添加内容同CentOS:auth required pam_tally2.so deny=3 unlock_time=600 even_deny_root root_unlock_time=600
清理无用账户
删除系统默认冗余账户、无业务用途账户,禁用无交互shell账户
# 查看所有系统账户(UID<1000的为系统账户,除root外,按需清理)cat /etc/passwd | cut -d: -f1,3# 删除无用系统账户(示例:删除lp、games、ftp等无业务用途账户,确认无依赖后执行)userdel -r lpuserdel -r gamesuserdel -r ftpuserdel -r nobody # 谨慎:部分服务依赖nobody,无业务依赖再删除# 禁用无交互shell账户(无法登录,仅用于服务运行,如nfsnobody)usermod -s /sbin/nologin nfsnobody# 验证:查看账户shell,确认已改为/sbin/nologincat /etc/passwd | grep nfsnobody# 禁止非必要用户登录(临时禁用,无需删除)usermod -L test # 锁定test用户(解锁:usermod -U test)
最小化sudo授权
禁止sudo泛授权(如ALL=(ALL) ALL),精准配置命令权限
# 编辑sudo配置文件(必须用visudo,防止语法错误导致sudo失效)visudo# 注释/删除泛授权行(若存在)以及先前指定wheel组的用户,按需求来确认是放开组还是单独配置# %wheel ALL=(ALL) ALL # CentOS默认泛授权,注释掉# %sudo ALL=(ALL:ALL) ALL # Ubuntu默认泛授权,注释掉# 精准配置yw用户的sudo权限(示例:仅允许yw执行重启、查看日志命令)yw ALL=(ALL) /usr/bin/systemctl restart sshd,/usr/bin/tail,/usr/bin/less,/usr/bin/cat# 配置sudo操作日志(添加以下内容,记录所有sudo操作)Defaults logfile="/var/log/sudo.log"Defaults loglinelen=0# 保存退出后,验证sudo权限su - ywsudo systemctl restart sshd # 可正常执行sudo rm -rf /# 查看sudo日志(验证日志是否正常记录)cat /var/log/sudo.log
登录安全
设置终端闲置自动登出,限制SSH登录用户与来源IP
# 编辑全局配置文件vi /etc/profile# 在文件末尾添加以下内容(闲置10分钟自动登出,单位:秒)TMOUT=600export TMOUT# 保存退出后,生效配置source /etc/profile# 验证:闲置10分钟后,终端自动断开连接`# 限制SSH登录来源IP(仅允许指定IP登录,更严格,可选)vi /etc/ssh/sshd_config# 添加以下内容(替换为允许登录的IP,多个IP用空格分隔,0.0.0.0/0表示所有IP,不限制)AllowUsers yw@192.168.1.100 yw@192.168.1.101# 重启SSH服务生效systemctl restart sshd
文件与权限
基线高频告警:关键文件权限过松、SUID/SGID程序过多,固化权限,一劳永逸
关键文件权限加固
限制普通用户对账户、sudo配置文件的读取/修改权限
# 加固账户配置文件权限chmod 644 /etc/passwd # 所有用户可读,仅root可写chmod 000 /etc/shadow # 仅root可读可写(普通用户无法读取密码哈希)chmod 440 /etc/sudoers # 仅root和wheel组可读,仅root可写chmod 700 /etc/sudoers.d/ # sudo补充配置目录,仅root可操作# 加固系统配置文件权限chmod 600 /etc/ssh/sshd_config # SSH配置文件,仅root可读写chmod 600 /etc/sysctl.conf # 内核配置文件,仅root可读写chmod 700 /root/ # root家目录,仅root可操作# 验证权限(查看权限是否正确)ls -l /etc/passwd /etc/shadow /etc/sudoers /etc/ssh/sshd_config
锁定系统文件
用chattr命令锁定核心配置文件,防止误改、恶意篡改
# 锁定关键配置文件(添加i属性,无法修改、删除、重命名)chattr +i /etc/passwdchattr +i /etc/shadowchattr +i /etc/sudoerschattr +i /etc/ssh/sshd_configchattr +i /etc/sysctl.conf# 解锁文件(需修改文件时执行,修改完成后重新锁定)chattr -i /etc/passwd # 解锁# 修改文件后,重新锁定chattr +i /etc/passwd# 验证文件锁定状态(查看文件属性,含i表示已锁定)lsattr /etc/passwd
默认umask设置
全局配置umask,确保新建文件/目录默认权限最小化
# 编辑全局umask配置文件vi /etc/profile# 找到umask相关行,修改为027(新建目录权限750,新建文件权限640)umask 027# 编辑用户默认umask配置文件,确保所有用户生效vi /etc/bashrcumask 027# 生效配置source /etc/profilesource /etc/bashrc# 验证umask(查看当前umask值)umask# 测试:新建目录和文件,查看权限mkdir test_dirtouch test_filels -l test_dir test_file# 应显示drwxr-x---(目录)、-rw-r--r--(文件)
清理SUID/SGID风险
SUID/SGID程序允许普通用户临时获得root权限,卸载非必要程序
# 查找系统中所有SUID/SGID程序find / -perm -4000 -o -perm -2000 2>/dev/null# 清理非必要SUID/SGID程序(卸载sudo以外的SUID程序,确认无业务依赖后执行)# 先查看程序用途,避免误删which passwd # 查看passwd程序路径which sudo # 查看sudo程序路径# 卸载无用SUID程序(删除find命令的SUID权限,或直接卸载程序)chmod -s /usr/bin/find # 移除SUID权限(-s:删除SUID/SGID权限)# 若程序无用,直接卸载yum remove -y findutils # CentOSapt remove -y findutils # Ubuntu# 验证:重新查找SUID/SGID程序,确认无多余程序find / -perm -4000 -o -perm -2000 2>/dev/null
3、网络与端口
基线高频告警:端口开放过多、SSH弱配置、不安全协议启用,前期收敛即可避免
防火墙默认拒绝
启用防火墙,默认拒绝所有入站连接,仅放行业务必需端口
# CentOS系统(firewalld防火墙)# 启动并设置firewalld开机自启systemctl start firewalldsystemctl enable firewalld# 验证防火墙状态(确保active)systemctl status firewalld# 配置默认策略(默认拒绝入站,允许出站)firewall-cmd --permanent --set-default-zone=drop# 重新加载防火墙生效firewall-cmd --reload# 开放必需端口(开放SSH端口22、HTTP端口80、HTTPS端口443,根据业务调整)firewall-cmd --permanent --add-port=22/tcpfirewall-cmd --permanent --add-port=80/tcpfirewall-cmd --permanent --add-port=443/tcp# 重新加载生效firewall-cmd --reload# 验证开放的端口firewall-cmd --list-ports# 验证默认策略firewall-cmd --get-default-zone # 应显示drop
# Ubuntu系统(ufw防火墙)# 启动并设置ufw开机自启ufw enable# 验证防火墙状态(确保active)ufw status# 配置默认策略(默认拒绝入站,允许出站)ufw default deny incomingufw default allow outgoing# 开放必需端口(示例:开放22、80、443端口)ufw allow 22/tcpufw allow 80/tcpufw allow 443/tcp# 验证开放的端口和策略ufw status verbose
SSH深度加固
修改默认端口、禁用密码登录、强制密钥认证
# 修改SSH默认端口(避免暴力破解,自定义端口,如2222):vi /etc/ssh/sshd_config# 找到Port参数,修改为自定义端口(如2222,建议10000-65535之间)Port 2222# 保存退出后,重启SSH服务systemctl restart sshd# 验证SSH端口(确认监听在自定义端口)netstat -tulnp | grep sshd # 需安装net-tools:yum install -y net-tools / apt install -y net-tools# 注意:防火墙需开放自定义SSH端口(如2222),否则无法登录# CentOS:firewall-cmd --permanent --add-port=2222/tcp && firewall-cmd --reload# Ubuntu:ufw allow 2222/tcp# 配置SSH密钥登录(禁用密码登录,更安全)可选# 在本地机器(如Windows/Xshell、Linux终端)生成密钥对(无需登录服务器)ssh-keygen -t rsa -b 4096 # 生成RSA密钥对,按回车默认路径,无需设置密码(或设置密钥密码)# 生成后,本地密钥路径:~/.ssh/id_rsa(私钥,妥善保管)、~/.ssh/id_rsa.pub(公钥,上传服务器)# 将本地公钥上传到服务器yw用户家目录# 本地执行(替换yw、服务器IP、自定义SSH端口)ssh-copy-id -p 2222 yw@192.168.1.100# 输入yw用户密码,上传成功后,公钥会保存到服务器~/.ssh/authorized_keys# 服务器端配置密钥登录(确保权限正确)su - ywchmod 700 ~/.ssh/chmod 600 ~/.ssh/authorized_keys# 回到root用户,编辑SSH配置文件vi /etc/ssh/sshd_config# 修改以下参数(禁用密码登录,强制密钥登录)PasswordAuthentication noPubkeyAuthentication yesAuthorizedKeysFile .ssh/authorized_keys # 公钥文件路径(默认,无需修改)# 重启SSH服务生效systemctl restart sshd# 验证:本地用密钥登录(无需输入密码)ssh -p 2222 yw@192.168.1.100# 验证密码登录:用其他机器尝试密码登录,应提示“Permission denied”`# 限制SSH登录并发数(可选,防止暴力破解):# 编辑SSH配置文件vi /etc/ssh/sshd_config# 添加以下内容(限制并发登录数为3)MaxStartups 3# 重启SSH服务生效systemctl restart sshd
关闭无用网络服务
停用ftp、tftp、rsh等不安全协议,关闭ipv6(无业务需求时
# 查看当前运行的网络服务systemctl list-unit-files --type=service --state=enabled | grep -E "ftp|tftp|rsh|telnet|rpcbind"# 禁用并停止无用网络服务systemctl stop rpcbindsystemctl disable rpcbindsystemctl mask rpcbind # 屏蔽服务,防止误启动# 批量禁用(确认无业务依赖后执行)for service in ftp tftp rsh telnet rpcbind; do systemctl stop $service && systemctl disable $service && systemctl mask $servicedone# 关闭ipv6(无业务需求时,避免ipv6漏洞)vi /etc/sysctl.conf# 添加以下内容net.ipv6.conf.all.disable_ipv6 = 1net.ipv6.conf.default.disable_ipv6 = 1net.ipv6.conf.lo.disable_ipv6 = 1# 生效配置sysctl -p# 验证:查看ipv6是否关闭(无输出即关闭成功)ip addr | grep inet6
防扫描与洪水
通过内核参数配置,防止SYN洪水、广播ping探测
# 编辑内核配置文件vi /etc/sysctl.conf# 添加以下内核安全参数net.ipv4.tcp_syncookies = 1 # 启用SYN洪水防护net.ipv4.icmp_echo_ignore_broadcasts = 1 # 忽略广播ping(防止ping扫描)net.ipv4.icmp_ignore_bogus_error_responses = 1 # 忽略虚假ICMP错误响应net.ipv4.conf.all.log_martians = 1 # 记录异常IP包(便于审计)net.ipv4.tcp_max_syn_backlog = 1024 # 增大SYN队列长度net.ipv4.tcp_synack_retries = 2 # 减少SYN-ACK重试次数# 生效配置sysctl -p# 验证:查看内核参数是否生效(示例:查看SYN洪水防护)sysctl net.ipv4.tcp_syncookies # 应显示1
4、内核与服务
内核参数、无用服务、安全模块
内核安全参数
优化/etc/sysctl.conf,关闭IP转发、限制内核信息泄露
# 编辑内核配置文件vi /etc/sysctl.conf# 补充以下关键参数(已有的无需重复添加)net.ipv4.ip_forward = 0 # 关闭IP转发(非路由服务器禁用)net.ipv4.conf.all.accept_source_route = 0 # 禁止源路由(防止IP欺骗)net.ipv4.conf.all.accept_redirects = 0 # 禁止ICMP重定向(防止中间人攻击)net.ipv4.conf.all.send_redirects = 0 # 禁止发送ICMP重定向kernel.kptr_restrict = 2 # 限制内核符号信息泄露(避免漏洞利用)kernel.dmesg_restrict = 1 # 限制普通用户读取dmesg日志(防止内核信息泄露)fs.protected_symlinks = 1 # 保护符号链接(防止权限绕过)fs.protected_hardlinks = 1 # 保护硬链接(防止权限绕过)# 生效配置sysctl -p# 验证:查看所有内核安全参数sysctl -a | grep -E "ip_forward|accept_source_route|kptr_restrict|dmesg_restrict"
关闭无用服务
禁用非业务必需的开机启动服务,减少攻击面
# 查看所有开机启动服务systemctl list-unit-files --type=service --state=enabled# 禁用无用服务(示例:禁用打印服务、邮件服务、蓝牙服务等)# CentOS系统systemctl stop cups postfix bluetoothsystemctl disable cups postfix bluetoothsystemctl mask cups postfix bluetooth# Ubuntu系统systemctl stop cups postfix bluetooth avahi-daemonsystemctl disable cups postfix bluetooth avahi-daemonsystemctl mask cups postfix bluetooth avahi-daemon# 批量禁用无用服务(谨慎,确认无业务依赖)# 查看无用服务列表(筛选出非业务服务)systemctl list-unit-files --type=service --state=enabled | grep -v "sshd|firewalld|network|crond"# 禁用筛选出的服务(替换service_name为实际服务名)for service in 服务名1 服务名2; do systemctl stop $service && systemctl disable $service && systemctl mask $servicedone# 验证:查看剩余开机启动服务,确认无无用服务systemctl list-unit-files --type=service --state=enabled
启用安全模块
开启SELinux(CentOS)/AppArmor(Ubuntu),增强系统安全
# CentOS系统(SELinux)# 查看SELinux状态(默认可能为enforcing/enabled,若为disabled则开启)getenforce # 显示Enforcing/Permissive/Disabledsestatus# 开启SELinux(若当前为Disabled)vi /etc/selinux/config# 修改SELINUX参数为permissive(宽容模式,先审计不阻断,后续可改为enforcing)SELINUX=permissiveSELINUX_TYPE=targeted # 目标模式,仅保护关键服务# 保存退出后,重启服务器生效(必须重启)reboot# 重启后验证getenforce # 应显示Permissive# 查看SELinux审计日志(确认无异常阻断)grep "SELinux is preventing" /var/log/audit/audit.log# 生产环境稳定后,可改为enforcing模式(强制阻断)setenforce 1 # 临时生效# 永久生效:修改/etc/selinux/config,SELINUX=enforcing,重启服务器
# Ubuntu系统(AppArmor)# 查看AppArmor状态(默认已启用)aa-status# 启用AppArmor(若未启用)systemctl start apparmorsystemctl enable apparmor# 查看AppArmor配置文件(默认已配置关键服务防护)ls /etc/apparmor.d/# 启用特定服务的AppArmor防护(示例:启用SSH服务防护)aa-enforce /etc/apparmor.d/usr.sbin.sshd# 验证:查看AppArmor运行状态,确认防护已启用aa-status | grep "profiles are in enforce mode"
5、日志与审计:全流程可追溯
基线必查:日志缺失、权限不当、无审计,
启用系统日志
确保rsyslog/syslog-ng开机自启,记录关键操作日志
# CentOS系统(rsyslog)# 启动并设置rsyslog开机自启systemctl start rsyslogsystemctl enable rsyslog# 验证日志服务状态systemctl status rsyslog# 查看日志文件(确认日志正常记录)ls -l /var/log/ # 关键日志:/var/log/messages(系统日志)、/var/log/secure(认证日志)# Ubuntu系统(默认rsyslog,部分版本用syslog-ng)# 启动并设置rsyslog开机自启systemctl start rsyslogsystemctl enable rsyslog# 验证状态systemctl status rsyslog# 查看日志文件(关键日志:/var/log/syslog(系统日志)、/var/log/auth.log(认证日志))ls -l /var/log/
开启审计服务
启动auditd,监控关键目录修改、用户登录、权限变更
# 安装auditd(若未安装)yum install -y audit # CentOSapt install -y auditd # Ubuntu# 启动并设置auditd开机自启systemctl start auditdsystemctl enable auditd# 验证审计服务状态systemctl status auditd# 配置审计规则(监控关键目录和操作)vi /etc/audit/rules.d/audit.rules# 添加以下审计规则(监控/etc目录修改、用户登录、sudo操作)-w /etc/ -p wa -k etc_modify # 监控/etc目录的写、属性修改,标记为etc_modify-w /var/log/ -p wa -k log_modify # 监控日志目录修改-w /usr/bin/sudo -p x -k sudo_exec # 监控sudo执行-a always,exit -F arch=b64 -S execve -F euid=0 -k root_exec # 监控root用户执行命令# 加载审计规则生效augenrules --load# 查看审计规则(确认配置生效)auditctl -l# 查看审计日志(验证日志记录)ausearch -k etc_modify # 查看/etc目录修改日志
日志权限与轮转
限制日志权限,配置日志轮转,防止日志泄露、占满磁盘
# 日志权限加固# 仅root可读写日志文件,普通用户无权限chmod -R 600 /var/log/# 日志目录权限加固(仅root可操作)chmod 700 /var/log/# 验证权限ls -l /var/log/`# 配置日志轮转(防止日志占满磁盘)# 编辑日志轮转配置文件vi /etc/logrotate.conf# 修改以下参数(根据需求调整)weekly # 每周轮转一次rotate 4 # 保留4份轮转日志create # 轮转后创建新日志文件dateext # 日志文件名添加日期后缀(便于区分)compress # 压缩旧日志(节省磁盘空间)# 为关键日志配置单独轮转规则vi /etc/logrotate.d/rsyslog# 添加以下内容(针对/var/log/secure、/var/log/messages)/var/log/secure/var/log/messages { daily rotate 7 compress missingok notifempty create 0600 root root}# 验证日志轮转(手动执行一次轮转测试)logrotate -f /etc/logrotate.conf# 查看轮转后的日志(确认生成压缩旧日志)ls -l /var/log/ | grep .gz`
自动化加固与前置核查
避免人工遗漏,用工具与脚本实现一键加固、前置扫描,所有发行版通用。(脚本不够完善,视情况而定吧~~没到无脑执行的地步)
1、脚本化加固
# 创建自动化加固脚本(示例:linux_baseline_harden.sh)vi linux_baseline_harden.sh# 脚本内容(复制以下内容,根据发行版调整命令,添加执行权限)#!/bin/bash# 定义颜色(便于查看输出)red='\033[0;31m'green='\033[0;32m'yellow='\033[1;33m'clear='\033[0m'echo -e "${yellow}=== 开始执行Linux基线前置加固 ===${clear}"# 1. 系统初始更新echo -e "${green}1. 执行系统安全更新...${clear}"if [ -f /etc/redhat-release ]; then # CentOS系统 yum clean all && yum makecache && yum update -y && yum install -y net-tools rkhunter auditelif [ -f /etc/lsb-release ]; then # Ubuntu系统 apt update && apt upgrade -y && apt install -y net-tools rkhunter auditd libpam-cracklibfi# 2. 创建普通管理员账户echo -e "${green}2. 创建普通管理员账户yw...${clear}"useradd ywecho "yw@123456!" | passwd --stdin yw # 密码可自定义,建议合规密码if [ -f /etc/redhat-release ]; then usermod -aG wheel ywelif [ -f /etc/lsb-release ]; then usermod -aG sudo ywfi# 3. 禁用root远程登录、修改SSH端口(后续可补充其他SSH加固步骤)echo -e "${green}3. SSH安全加固...${clear}"sed -i 's/^PermitRootLogin yes/PermitRootLogin no/' /etc/ssh