
新交付的Linux服务器默认是易于使用的而不是抗攻击的,在生产环境中公开网络之后,自动扫描和暴力破解会在几分钟内开始。安全基线并不是要增加更多的参数来防御攻击,而是要把攻击面缩小到业务所必需的最小范围,并且建立起可以审计、可以重现、可以回滚的安全收敛机制。
安装的时候要注意安全,要从镜像做起
- 发行版与镜像:固定使用企业级LTS版本(RHEL/Rocky/Alma、Debian Stable、Ubuntu LTS),通过内部黄金镜像或PXE/Kickstart/Ansible统一分发,避免手工差异。
- 最小化安装:仅选“Base System + 必要工具”,不装桌面、打印、邮件、编译链(生产无构建需求时移除gcc/make)。
- 磁盘与分区:
- 单独挂载
/、/boot、/var、/tmp、/home、/var/log - 在物理机或者符合规定的情况下使用LUKS对整个磁盘进行加密
/tmp、/var/tmp、/dev/shm 等目录的挂载参数中包含了 nodev,nosuid,noexec- 引导防护:设置GRUB密码,限制单用户模式;云主机配合平台“串行控制台”应急。
- 时区与时钟:
timedatectl set-ntp true,chrony/ntpd同步,日志时间戳准确是审计前提。
系统补丁和内核参数
系统落地之后第一个操作并不是修改配置,而是填补漏洞:
# Debian/Ubuntu
apt update && apt full-upgrade -y
apt install -y unattended-upgrades
dpkg-reconfigure --priority=low unattended-upgrades
# RHEL/Rocky
dnf update -y
dnf install -y dnf-automatic
systemctl enable --now dnf-automatic.timer
开启自动安全更新功能,但是内核的大版本更新采用灰色重启的方式。
内核收敛(/etc/sysctl.d/99-hardening.conf):
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
kernel.randomize_va_space = 2
kernel.kptr_restrict = 2
kernel.dmesg_restrict = 1
fs.protected_symlinks = 1
fs.protected_hardlinks = 1
fs.suid_dumpable = 0
非路由节点要关掉IP转发功能,IPv6不使用的话要把整个协议栈都关掉而不仅仅是关闭网卡。
账户体系和权限收束
1. 禁止使用共享的root账户,创建有名字的账户
adduser deploy
usermod -aG sudo deploy
passwd -l root # 锁root密码
- 不允许多人使用同一个账户,每个人都有自己的标识符,方便进行审计和追踪
- 查看有异常权限的用户:
awk -F: '$3==0' /etc/passwd - 删除无用的账户,把休眠的账户锁起来
2. 最小化sudo权限
不允许使用 ALL=(ALL) NOPASSWD: ALL 命令,把文件放到 /etc/sudoers.d/ 中:
# /etc/sudoers.d/deploy
Cmnd_Alias DEPLOY_CMDS = /usr/bin/systemctl restart nginx, \
/usr/bin/journalctl, \
/usr/bin/tail /var/log/*
deploy ALL=(ALL) PASSWD: DEPLOY_CMDS
Defaults logfile=/var/log/sudo.log
Defaults timestamp_timeout=5
- 提权要输入密码
- 不允许使用可以跳出shell的命令,如
su、visudo、vi等 - 所有的sudo命令都要记录到日志中
3. 密码和当地策略
/etc/login.defs 和 PAM pam_pwquality
- 最少要有12到14个字符
- 90-180天轮转(以密钥为主可以放宽)
- 失败锁定用
pam_faillock - 会话空闲超时:
TMOUT=900
SSH:关闭最容易被攻破的地方
采用drop-in的方式而不是修改主配置文件:
# /etc/ssh/sshd_config.d/99-hardening.conf
Port 22222
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
LoginGraceTime 30
X11Forwarding no
AllowTcpForwarding no
ClientAliveInterval 300
ClientAliveCountMax 2
AllowUsers deploy
采用Ed25519算法
ssh-keygen -t ed25519 -C "deploy@host"
公钥权限:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
修改之后要开启一个新的会话来测试一下,然后断开原来的连接。可以加上fail2ban或者在ssh前面加一个防火墙限制速度:
# fail2ban jail.local
[sshd]
enabled = true maxretry = 3 bantime = 3600
网络边界和最小化服务
主机防火墙默认不允许外部连接,只允许内部访问:
# ufw
ufw default deny incoming
ufw default allow outgoing
ufw allow from 10.0.1.0/24 to any port 22222 proto tcp
ufw allow 80,443/tcp
ufw enable
# firewalld
firewall-cmd --permanent --set-default-zone=drop
firewall-cmd --permanent --add-port=22222/tcp
firewall-cmd --permanent --add-service={http,https}
firewall-cmd --reload
服务收敛:
systemctl list-unit-files --state=enabled
systemctl disable --now cups bluetooth avahi-daemon rpcbind postfix
数据库和缓存(MySQL/Redis/Mongo)只能绑定到127.0.0.1或者内网网卡上,不能对外公开访问。
使用 ss -tlnp 来检查监听端口,没有说明的端口就关闭掉。
强制访问控制和文件系统的关系
- RHEL系列:SELinux开启模式为
enforcing(修改/etc/selinux/config文件、执行setenforce 1命令) - Debian/Ubuntu: AppArmor
aa-enforce全部配置文件 - 不允许为了图方便而设置
permissive或者setenforce 0,异常情况要走审计规则、白名单
文件系统:
# 排查危险SUID/SGID
find / -xdev -perm /6000 -type f
# 默认umask
echo "umask 027" > /etc/profile.d/umask.sh
关键文件权限:
- /etc/shadow → 640 root:shadow
- SSH私钥 → 600
- 配置文件目录→644/755,敏感信息更加严格
审计、日志和完整性
安装auditd
apt install -y auditd # 或 dnf install -y audit
规则示例(/etc/audit/rules.d/security.rules):
-w /etc/passwd -p wa -k passwd_changes
-w /etc/shadow -p wa -k shadow_changes
-w /etc/sudoers -p wa -k sudoers_changes
-w /etc/ssh/sshd_config -p wa -k sshd_config
-a always,exit -F arch=b64 -S execve -F euid=0 -k root_exec
日志要发送到外部:rsyslog、filebeat等工具可以将日志推送到远程的SIEM或者日志集群中,本地的日志也可以被清除掉。
journald 持久化:
# /etc/systemd/journald.conf
Storage=persistent
SystemMaxUse=1G
文件完整性用 AIDE 或 Wazuh:
aideinit
aide --check
每天对 /etc、/usr/bin、/usr/sbin 进行对比。
验收和持续收敛
上线之前要进行基线扫描
- Lynis:
lynis audit system(目标评分 80+) - CIS Benchmark:用 OpenSCAP / CIS-CAT 对齐 Level 1
- 自研脚本核对:SSH、防火墙、SELinux、sudo、审计、端口、账号
将整个安装过程做成Ansible Role,在装机模板中自动注入,每周一执行一次来防止配置发生变动。
运维节奏:
- 每月:端口/服务/账号复查
- 每三个月进行一次:Lynis、CIS和权限回收
- 发生重大变化之后马上重新扫描基线
总结
Linux的安全基线并不是简单地更改一些设置,而是包括镜像、补丁、账户、SSH、网络、内核以及审计等在内的一个完整的链条。其中最重要的就是:能够不安装的就不要安装,可以隐藏起来就不要暴露出来,有权限的地方都要留下痕迹。在初始化阶段控制好权限要比后来去补救要便宜得多。