Linux 服务器安全加固

适用系统:CentOS 7 / Rocky Linux 9 / Ubuntu 20.04+ / Debian 11+

适用人群:运维工程师 / DevOps / 安全工程师 / 服务器管理员

加固级别:生产环境标准


一、安全加固总览

1.1 为什么要做安全加固?

互联网威胁统计(2024年):
├── 暴力破解 SSH → 每天全球约 3,000 万次尝试
├── 漏洞利用攻击 → Log4j/Heartbleed 等高危漏洞广泛扫描
├── 弱口令泄露   → 85% 的数据泄露源于弱密码
├── 未授权访问   → 默认端口+默认账号是主要入口
└── 挖矿木马     → 算力服务器是重点攻击目标

1.2 加固检查清单速览

序号加固项优先级预计耗时
1禁止 root 直接登录🔴 高5 分钟
2SSH 密钥认证 + 禁用密码🔴 高10 分钟
3更换 SSH 默认端口🟡 中5 分钟
4配置防火墙(iptables/firewalld)🔴 高15 分钟
5关闭不需要的系统服务🟡 中10 分钟
6配置 SELinux / AppArmor🟡 中15 分钟
7设置用户密码策略🟡 中10 分钟
8配置 fail2ban 防暴力破解🟡 中10 分钟
9配置 auditd 审计日志🟡 中15 分钟
10配置 AIDE 文件完整性监控🟢 低20 分钟
11安装配置 ClamAV 病毒扫描🟢 低15 分钟
12内核参数加固🟡 中10 分钟
13禁止敏感命令历史记录🟢 低5 分钟

二、账户与认证管理

2.1 账户安全基本原则

✅ 原则 1:最小权限 — 只授予完成任务所需的最小权限
✅ 原则 2:唯一管理员 — 每个管理员使用独立账号
✅ 原则 3:定期轮换 — 密码/密钥定期更换(90天)
✅ 原则 4:记录审计 — 所有提权操作可追溯

2.2 创建特权管理员账户

# 1. 创建普通用户
# CentOS / Rocky
sudo useradd -m -s /bin/bash admin
sudo usermod -aG wheel admin

# Ubuntu / Debian
sudo useradd -m -s /bin/bash admin
sudo usermod -aG sudo admin

# 2. 设置强密码(需包含:大小写+数字+特殊字符,长度≥12位)
sudo passwd admin

# 3. 验证 sudo 权限
su - admin
sudo whoami
# 正确配置应返回:root

# 4. 查看所有用户
cat /etc/passwd | grep -v '/nologin\|/false' | awk -F: '{print $1, $7}'

# 5. 删除不需要的系统账户
sudo userdel -r games
sudo userdel -r news
sudo userdel -r lp

2.3 禁止 root 直接登录

# 方法一:修改 sshd_config(推荐)
sudo vi /etc/ssh/sshd_config

# 修改以下配置
PermitRootLogin no              # 禁止 root 登录
PermitEmptyPasswords no         # 禁止空密码
PasswordAuthentication no        # 禁止密码认证(配合密钥使用)
PubkeyAuthentication yes         # 允许公钥认证

# 方法二:仅允许特定用户 SSH 登录
AllowUsers admin deployer

# 方法三:通过 PAM 限制
sudo vi /etc/security/access.conf
# 添加:-:root:ALL EXCEPT 192.168.1.0/24

2.4 SSH 公钥认证配置

# 1. 在本地机器生成 SSH 密钥对(不要设置密码短语以便自动化)
ssh-keygen -t ed25519 -C "admin@workstation" -f ~/.ssh/id_ed25519

# 2. 上传公钥到服务器
ssh-copy-id -i ~/.ssh/id_ed25519.pub admin@<服务器IP>

# 3. 登录测试(确认不再提示输入密码)
ssh -i ~/.ssh/id_ed25519 admin@<服务器IP>

# 4. 确认公钥已写入
cat ~/.ssh/authorized_keys

# 5. 设置正确权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chown -R admin:admin ~/.ssh

# 6. 验证配置无误后,重启 SSH 服务
# CentOS / Rocky
sudo systemctl restart sshd

# Ubuntu / Debian
sudo systemctl restart ssh

2.5 更换 SSH 默认端口

sudo vi /etc/ssh/sshd_config

# 找到 #Port 22,修改为(建议使用 50000-65535 之间的高端口)
Port 22222

# 如果服务器在云上,需同步修改安全组规则!

# 重启 SSH 服务(建议先开一个会话测试,防止断开)
sudo systemctl restart sshd

# 测试新端口连接
ssh -p 22222 admin@<服务器IP>

2.6 用户密码策略

# CentOS / Rocky — 使用 pam_pwquality
sudo vi /etc/security/pwquality.conf
# /etc/security/pwquality.conf
minlen = 12                # 最小密码长度
minclass = 4               # 密码必须包含4种字符类
maxrepeat = 2               # 同一字符最多连续出现2次
dcredit = -1               # 至少1个数字
ucredit = -1               # 至少1个大写字母
lcredit = -1               # 至少1个小写字母
ocredit = -1               # 至少1个特殊字符
difok = 3                  # 新旧密码至少3个字符不同
# 设置密码过期策略
sudo vi /etc/login.defs
PASS_MAX_DAYS   90      # 密码最长使用 90 天
PASS_MIN_DAYS   7       # 密码最短使用 7 天
PASS_WARN_AGE   14      # 密码过期前 14 天警告
# 为现有用户设置密码过期
# 查看用户密码状态
sudo chage -l admin

# 设置密码 90 天后过期
sudo chage -M 90 admin

# 设置账户到期日期(推荐)
sudo chage -E 2025-12-31 admin

# 强制用户首次登录修改密码
sudo chage -d 0 admin
# Ubuntu — 配置 password quality
sudo apt install libpam-pwquality
sudo vi /etc/pam.d/common-password
# 找到 password requisite,添加:
# password requisite pam_pwquality.so retry=3 minlen=12 lcredit=-1 ucredit=-1 dcredit=-1 ocredit=-1

三、防火墙配置

3.1 iptables 基础加固

# 清空现有规则(生产环境慎用!)
sudo iptables -F
sudo iptables -X
sudo iptables -Z

# 设置默认策略:拒绝所有入站,允许所有出站
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT

# 允许回环接口(本地通信必须)
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT

# 允许已建立的连接
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 允许 SSH(自定义端口)
sudo iptables -A INPUT -p tcp --dport 22222 -j ACCEPT

# 允许 HTTP / HTTPS
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# 允许 Ping(可防御性关闭)
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

# 允许特定 IP 段访问管理端口(如内网)
sudo iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 22222 -j ACCEPT

# 记录被拒绝的连接(排查用)
sudo iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables-dropped: " --log-level 4

# 查看规则
sudo iptables -L -n -v --line-numbers

# 保存规则
# CentOS
sudo service iptables save

# Ubuntu
sudo apt install iptables-persistent
sudo netfilter-persistent save

3.2 firewalld 配置(CentOS/Rocky)

# 启动并设置开机自启
sudo systemctl start firewalld
sudo systemctl enable firewalld

# 查看默认 zone
sudo firewall-cmd --get-default-zone

# 查看活动 zone
sudo firewall-cmd --get-active-zones

# 放行 SSH(自定义端口)
sudo firewall-cmd --permanent --zone=public --add-port=22222/tcp

# 放行 HTTP/HTTPS
sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https

# 限制来源 IP(仅允许内网访问管理端口)
sudo firewall-cmd --permanent --zone=public --add-source=192.168.1.0/24

# 富规则:允许特定 IP 进行 SSH,限制其他 IP
sudo firewall-cmd --permanent --zone=public \
    --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="22222" protocol="tcp" accept'

# 拒绝所有来自特定 IP 的访问(封禁 IP)
sudo firewall-cmd --permanent --zone=public \
    --add-rich-rule='rule family="ipv4" source address="1.2.3.4" reject'

# 应用配置
sudo firewall-cmd --reload

# 查看所有规则
sudo firewall-cmd --list-all

# 查看已开放端口
sudo firewall-cmd --list-ports

# 查看已开放服务
sudo firewall-cmd --list-services

3.3 UFW 配置(Ubuntu)

# 启动 UFW
sudo ufw enable
sudo systemctl enable ufw

# 查看状态
sudo ufw status verbose

# 设置默认策略
sudo ufw default deny incoming
sudo ufw default allow outgoing

# 开放端口
sudo ufw allow 22222/tcp comment 'SSH'
sudo ufw allow 80/tcp comment 'HTTP'
sudo ufw allow 443/tcp comment 'HTTPS'

# 限制访问频率(防止暴力破解 SSH)
sudo ufw limit 22222/tcp

# 允许特定 IP
sudo ufw allow from 192.168.1.0/24 to any port 22222

# 删除规则
sudo ufw delete allow 22222/tcp

# 查看规则编号
sudo ufw status numbered
sudo ufw delete 3

四、SELinux / AppArmor 配置

4.1 SELinux 配置(CentOS / Rocky)

# 查看 SELinux 状态
getenforce
sestatus

# 临时关闭(调试用,不推荐生产环境)
sudo setenforce 0

# 永久配置
sudo vi /etc/selinux/config
SELINUX=enforcing          # 强制模式(推荐):阻止违规行为
# SELINUX=permissive      # 宽松模式:仅记录,不阻止
# SELINUX=disabled        # 禁用(不推荐)
SELINUXTYPE=targeted       # 仅保护指定目标进程
# 安装 SELinux 管理工具
sudo yum install -y policycoreutils policycoreutils-python

# 查看 SELinux 上下文
ls -Z /var/www/html/
ps auxZ | grep nginx

# 修复文件上下文(Web 目录示例)
sudo semanage fcontext -a -t httpd_sys_content_t "/var/www/html(/.*)?"
sudo restorecon -Rv /var/www/html/

# 允许服务使用特定端口
sudo semanage port -a -t http_port_t -p tcp 8888

# 查看当前端口映射
sudo semanage port -l | grep http_port_t

# 安装 Nginx 后允许 Nginx 服务
sudo setsebool -P httpd_can_network_connect on

# 查看/修改布尔值
sudo getsebool -a | grep httpd
sudo setsebool -P nis_enabled on

4.2 AppArmor 配置(Ubuntu)

# 查看 AppArmor 状态
sudo aa-status

# 查看已加载配置文件
sudo ls /etc/apparmor.d/

# 安装 AppArmor 管理工具
sudo apt install -y apparmor-utils

# 启用 AppArmor
sudo systemctl enable apparmor
sudo systemctl start apparmor

# 为 Nginx 创建自定义配置文件
sudo aa-genprof nginx

# 切换配置文件为强制模式
sudo aa-enforce /etc/apparmor.d/usr.sbin.nginx

# 切换为投诉模式(仅记录)
sudo aa-complain /etc/apparmor.d/usr.sbin.nginx

# 查看投诉日志
sudo aa-logprof

五、服务与进程加固

5.1 停止不需要的服务

# 查看所有运行中的服务
sudo systemctl list-units --type=service --state=running

# 停止并禁用不需要的服务
sudo systemctl stop telnet.socket
sudo systemctl disable telnet.socket

sudo systemctl stop vsftpd
sudo systemctl disable vsftpd

sudo systemctl stop rsh.socket
sudo systemctl disable rsh.socket

sudo systemctl stop rlogin.socket
sudo systemctl disable rlogin.socket

sudo systemctl stop cups                # 打印服务(通常不需要)
sudo systemctl disable cups

sudo systemctl stop bluetooth.target
sudo systemctl disable bluetooth.target

# 查看开机启动项
sudo systemctl list-unit-files --state=enabled

5.2 网络服务加固

5.2.1 NTP 时间同步

# 安装 Chrony(推荐,比 ntpd 更快)
# CentOS / Rocky
sudo yum install -y chrony
sudo systemctl start chronyd
sudo systemctl enable chronyd

# Ubuntu
sudo apt install -y chrony
sudo systemctl enable chrony

# 配置 Chrony(使用内网 NTP 服务器更安全)
sudo vi /etc/chrony/chrony.conf
# CentOS / Rocky
# 使用阿里云公共 NTP
server ntp.aliyun.com iburst
server ntp1.aliyun.com iburst

# 允许内网查询
allow 192.168.1.0/24

# 禁止Chrony主动修改时间(仅接受NTP服务器推送)
rtcsync
# 查看同步状态
chronyc sources -v
chronyc tracking

5.2.2 DNS 解析安全

# CentOS / Rocky — 配置 systemd-resolved
sudo vi /etc/systemd/resolved.conf
[Resolve]
DNS=223.5.5.5 119.29.29.29      # 阿里云/腾讯云 DNS
DNSOverTLS=no
Cache=yes
CacheFromLocalhost=no
# 设置 DNS 搜索顺序
sudo vi /etc/resolv.conf
# nameserver 223.5.5.5
# nameserver 119.29.29.29

# 锁定 DNS 配置不被修改
sudo chattr +i /etc/resolv.conf

5.2.3 禁用 IPv6(如不需要)

# 临时禁用
sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1
sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1

# 永久禁用
sudo vi /etc/sysctl.d/99-disable-ipv6.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
sudo sysctl -p /etc/sysctl.d/99-disable-ipv6.conf

六、内核参数加固

6.1 网络安全参数

sudo vi /etc/sysctl.d/99-security.conf
# ── 网络基础防护 ──────────────────────────────────────────

# 关闭 IP 转发(服务器如果不是路由器)
net.ipv4.ip_forward = 0
net.ipv6.conf.all.forwarding = 0

# 开启 SYN Cookie(防止 SYN Flood 攻击)
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_synack_retries = 2

# 禁止 IP 源路由(防止 IP 欺骗)
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0
net.ipv6.conf.default.accept_source_route = 0

# 开启 ICMP 重定向保护
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0

# 开启 IP 路由记录(防止路由欺骗)
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0

# 忽略 ICMP ping 请求(可选,隐藏服务器)
net.ipv4.icmp_echo_ignore_all = 0          # 建议保持开启,便于运维监控
# net.ipv4.icmp_echo_ignore_broadcasts = 1  # 已默认开启,忽略广播 ping

# ── 内存与缓冲区防护 ───────────────────────────────────────

# 关闭 ICMP 重定向
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0

# 忽略 ICMP 重定向
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1         # 开启反向路径过滤

# 禁用 IPv6 路由公告(防止路由器欺骗)
net.ipv6.conf.all.accept_ra = 0
net.ipv6.conf.default.accept_ra = 0

# 关闭 IPv6 隐私扩展
net.ipv6.conf.all.use_tempaddr = 0
net.ipv6.conf.default.use_tempaddr = 0

# ── 文件描述符与连接数 ─────────────────────────────────────

fs.file-max = 6553600                        # 全局最大文件描述符
fs.suid_dumpable = 0                        # 不生成 core dump(防止信息泄露)

# ── 网络缓冲区 ────────────────────────────────────────────

net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# 应用配置(无需重启)
sudo sysctl -p /etc/sysctl.d/99-security.conf

# 查看所有内核参数
sysctl -a | grep net.ipv4

6.2 用户权限限制(pam_limits)

sudo vi /etc/security/limits.conf
# 限制最大打开文件描述符
*               soft    nofile          65535
*               hard    nofile          65535

# 限制最大进程数
*               soft    nproc           4096
*               hard    nproc           8192

# root 用户不受限制
root            soft    nofile          unlimited
root            hard    nofile          unlimited

# 限制普通用户 coredump 大小
*               soft    core            0
*               hard    core            0
# 验证
ulimit -n

七、fail2ban 防暴力破解

7.1 安装与启动

# CentOS / Rocky(需安装 EPEL 源)
sudo yum install -y epel-release
sudo yum install -y fail2ban
sudo systemctl start fail2ban
sudo systemctl enable fail2ban

# Ubuntu / Debian
sudo apt install -y fail2ban
sudo systemctl start fail2ban
sudo systemctl enable fail2ban

# 查看状态
sudo systemctl status fail2ban
sudo fail2ban-client status

7.2 配置 SSH 防暴力破解

# 创建本地配置(覆盖默认配置)
sudo vi /etc/fail2ban/jail.local
[DEFAULT]
# 封禁时间(秒):10分钟
bantime = 600
# 查找时间窗口(秒):10分钟内
findtime = 600
# 最大失败次数
maxretry = 5
# 忽略指定 IP
ignoreip = 127.0.0.1/8 192.168.1.0/24

# ── SSH 防护 ───────────────────────────────────────────────

[sshd]

enabled = true port = 22222 action = iptables-multiport logpath = /var/log/secure # CentOS/Rocky # logpath = /var/log/auth.log # Ubuntu/Debian maxretry = 3 # 3次失败即封禁 # ── HTTP 认证防护 ──────────────────────────────────────────

[apache-auth]

enabled = true port = http,https logpath = /var/log/httpd/ssl_error_ssl_log # CentOS # logpath = /var/log/apache2/error.log # Ubuntu # ── Nginx 防护 ─────────────────────────────────────────────

[nginx-http-auth]

enabled = true port = http,https logpath = /var/log/nginx/error.log

# 重启生效
sudo systemctl restart fail2ban

# 查看 SSH 封禁状态
sudo fail2ban-client status sshd

# 查看已封禁 IP
sudo iptables -L f2b-sshd -n -v

7.3 手动解封 IP

# 解封指定 IP
sudo fail2ban-client set sshd unbanip 1.2.3.4

# 查看当前封禁列表
sudo fail2ban-client banned

八、日志审计(auditd)

8.1 安装与配置

# 安装 auditd
sudo yum install -y audit          # CentOS/Rocky
sudo apt install -y auditd         # Ubuntu/Debian

# 启动并设置开机自启
sudo systemctl start auditd
sudo systemctl enable auditd

# 查看审计状态
sudo auditctl -s
sudo auditctl -l

8.2 关键审计规则

# 创建审计规则文件
sudo vi /etc/audit/rules.d/audit.rules
# ── 文件完整性审计 ────────────────────────────────────────

# 监控 /etc/passwd 修改(用户账户)
-w /etc/passwd -p wa -k passwd_changes

# 监控 /etc/shadow 修改(密码文件)
-w /etc/shadow -p wa -k shadow_changes

# 监控 /etc/group 修改(用户组)
-w /etc/group -p wa -k group_changes

# 监控 /etc/sudoers 修改
-w /etc/sudoers -p wa -k sudoers_changes
-w /etc/sudoers.d/ -p wa -k sudoers_changes

# 监控 SSH 配置修改
-w /etc/ssh/sshd_config -p wa -k sshd_config_changes

# ── 命令执行审计 ───────────────────────────────────────────

# 监控所有用户的 su 命令
-w /usr/bin/su -p x -k privileged_user

# 监控 sudo 命令执行
-w /usr/bin/sudo -p x -k sudo_exec

# 监控 passwd 命令执行
-w /usr/bin/passwd -p x -k passwd_exec

# 监控 crontab
-w /usr/bin/crontab -p x -k cron_exec

# ── 网络配置审计 ───────────────────────────────────────────

# 监控 iptables/firewalld 调用
-w /usr/sbin/iptables -p x -k iptables_exec
-w /usr/sbin/firewall-cmd -p x -k firewall_cmd_exec

# ── 敏感目录监控 ───────────────────────────────────────────

# 监控 /root 目录
-w /root -p wa -k admin_home_access

# 监控 /var/log
-w /var/log/ -p wa -k log_access
# 加载规则
sudo auditctl -R /etc/audit/rules.d/audit.rules

# 验证规则
sudo auditctl -l

# 永久生效(重启后自动加载)
sudo vi /etc/audit/auditd.conf
# /etc/audit/auditd.conf
num_logs = 10                    # 保留 10 个日志文件
max_log_file = 100               # 每个日志最大 100MB
max_log_file_action = ROTATE     # 达到上限时轮转
space_left = 1024                # 磁盘空间不足时触发(MB)
space_left_action = SYSLOG       # 磁盘空间不足时写入 syslog
admin_space_left_action = SUSPEND # 严重不足时停止审计
disk_full_action = SUSPEND        # 磁盘满时停止审计

8.3 查询审计日志

# 查看所有审计事件
sudo ausearch -k passwd_changes

# 查看特定用户的操作
sudo ausearch -u admin -k sudo_exec

# 查看特定时间范围内的事件
sudo ausearch -ts 14:00 -te 15:00 -k sshd_config_changes

# 查看失败的系统调用
sudo ausearch -sf permission denied

# 生成审计报告
sudo aureport -ts recent

# 用户登录报告
sudo aureport -t -i login

九、文件完整性监控(AIDE)

9.1 安装与初始化

# CentOS / Rocky
sudo yum install -y aide

# Ubuntu / Debian
sudo apt install -y aide

# 初始化数据库(首次运行)
sudo aide --init

# 重命名数据库
sudo mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz

# 更新数据库
sudo aide --update
sudo mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz

9.2 配置监控规则

sudo vi /etc/aide.conf
# /etc/aide.conf
# 监控文件属性
FIPSR = p+i+n+u+g+s+m+c+md5+sha1
DIFF = p+i+n+u+g+s

# 监控关键目录
/etc            FIPSR
/boot           FIPSR
/bin            FIPSR
/sbin           FIPSR
/lib            FIPSR
/lib64          FIPSR
/usr/bin        FIPSR
/usr/sbin       FIPSR
/usr/lib        FIPSR
/usr/lib64      FIPSR

# 监控日志目录
/var/log        DIFF

# 监控 crontab
/var/spool/cron FIPSR
/var/spool/at   FIPSR

# 忽略临时文件
!/var/log/.*\.*
!/var/tmp

9.3 定期巡检

# 手动检查(首次巡检)
sudo aide --check

# 更新基准数据库
sudo aide --update

# 创建定时任务
sudo crontab -e
# 每天凌晨 3 点进行完整性检查
0 3 * * * /usr/sbin/aide --check | /usr/bin/mail -s "AIDE Report $(hostname)" admin@example.com

十、病毒扫描(ClamAV)

10.1 安装

# CentOS / Rocky(需 EPEL)
sudo yum install -y clamav clamav-update
sudo systemctl stop clamav-freshclam

# Ubuntu / Debian
sudo apt install -y clamav clamav-daemon

10.2 更新病毒库并扫描

# 更新病毒库
sudo freshclam

# 全盘扫描(排除 /proc 和 /sys)
sudo clamscan -r / --exclude-dir=/proc --exclude-dir=/sys --exclude-dir=/dev -l /var/log/clamav/scan.log --move=/var/clamav/quarantine

# 扫描指定目录
sudo clamscan -r /home -l /var/log/clamav/home_scan.log

# 扫描后自动删除感染文件(危险!慎用)
# sudo clamscan -r / --remove

10.3 定时扫描

sudo crontab -e
# 每周日凌晨 2 点全盘扫描
0 2 * * 0 /usr/bin/clamscan -r / --exclude-dir=/proc --exclude-dir=/sys -l /var/log/clamav/weekly.log | mail -s "ClamAV Weekly Report" admin@example.com

# 每天更新病毒库
0 4 * * * /usr/bin/freshclam --quiet

十一、敏感操作安全

11.1 禁止命令历史记录敏感命令

# 方法一:执行命令前加空格(仅对 zsh 生效)
#  Zsh: export HISTCONTROL=ignorespace

# 方法二:禁用某个会话的历史
unset HISTFILE

# 方法三:永久禁用 SSH 会话命令历史
sudo vi /etc/ssh/sshd_config
# 添加:
# IgnoreUserHistory yes

# 方法四:限制 history 大小
echo 'export HISTSIZE=100' >> ~/.bashrc
echo 'export HISTFILESIZE=100' >> ~/.bashrc
source ~/.bashrc

11.2 警惕 /tmp 和 /dev/shm 安全风险

# 挂载 tmpfs 并设置 noexec,nosuid,nodev(防止执行恶意脚本)
sudo vi /etc/fstab
tmpfs                   /tmp                    tmpfs   defaults,noexec,nosuid,nodev          0 0
tmpfs                   /var/tmp                tmpfs   defaults,noexec,nosuid,nodev          0 0
# 立即生效(不重启)
sudo mount -o remount,noexec,nosuid,nodev /tmp
sudo mount -o remount,noexec,nosuid,nodev /var/tmp

11.3 禁止 ICMP 重定向

sudo vi /etc/sysctl.d/99-icmp.conf
# 禁止 ICMP 重定向
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0

十二、安全巡检脚本

12.1 一键安全巡检脚本

cat << 'EOF' | sudo tee /opt/security_check.sh
#!/bin/bash
# ================================================
#  Linux 服务器安全巡检脚本
#  使用方法: sudo bash /opt/security_check.sh
# ================================================

echo "=========================================="
echo "  Linux 服务器安全巡检报告"
echo "  巡检时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo "  主机名:   $(hostname)"
echo "  系统:     $(cat /etc/redhat-release 2>/dev/null || cat /etc/os-release | grep PRETTY_NAME | cut -d'"' -f2)"
echo "=========================================="

# ── 1. 账户安全 ──────────────────────────────────────────
echo ""
echo "【1. 账户安全】"
echo "  • 能用 su 的用户(wheel/sudo组):"
grep -E '^(wheel|sudo):' /etc/group | cut -d: -f4
echo "  • 可登录的账户:"
grep '/bin/bash' /etc/passwd | awk -F: '{print "    - "$1" (UID:"$3")"}'
echo "  • UID=0 的账户:"
awk -F: '($3==0){print "    ⚠️  "$1" (UID=0)"}' /etc/passwd
echo "  • 空密码账户:"
awk -F: '($2==""){print "    ❌ "$1" has empty password!"}' /etc/shadow

# ── 2. SSH 安全 ──────────────────────────────────────────
echo ""
echo "【2. SSH 安全】"
grep "^PermitRootLogin" /etc/ssh/sshd_config 2>/dev/null || echo "    未配置(使用默认)"
grep "^PasswordAuthentication" /etc/ssh/sshd_config 2>/dev/null || echo "    未配置(使用默认)"
grep "^Port" /etc/ssh/sshd_config 2>/dev/null || echo "    ⚠️  使用默认端口 22"

# ── 3. 防火墙状态 ────────────────────────────────────────
echo ""
echo "【3. 防火墙状态】"
if systemctl is-active firewalld &>/dev/null; then
    echo "    firewalld: ✅ 运行中"
    echo "    已开放端口:"
    sudo firewall-cmd --list-ports 2>/dev/null | sed 's/^/      /'
elif systemctl is-active ufw &>/dev/null; then
    echo "    UFW: ✅ 运行中"
    sudo ufw status numbered 2>/dev/null | head -10 | sed 's/^/      /'
elif iptables -L -n &>/dev/null; then
    echo "    iptables: 运行中"
    echo "    INPUT 链规则数: $(iptables -L INPUT -n | grep -c '^[A-Z]')"
else
    echo "    ⚠️  未检测到防火墙!"
fi

# ── 4. SELinux / AppArmor ────────────────────────────────
echo ""
echo "【4. 安全模块】"
if command -v getenforce &>/dev/null; then
    SELINUX=$(getenforce 2>/dev/null)
    if [ "$SELINUX" = "Enforcing" ]; then
        echo "    SELinux: ✅ Enforcing(强制模式)"
    else
        echo "    SELinux: ⚠️  $SELINUX"
    fi
fi
if command -v aa-status &>/dev/null; then
    echo "    AppArmor: ✅ 已安装"
fi

# ── 5. 运行中的服务 ───────────────────────────────────────
echo ""
echo "【5. 危险服务检查】"
for svc in telnet vsftpd rsh rlogin finger; do
    if systemctl is-active $svc &>/dev/null; then
        echo "    ⚠️  $svc 正在运行!"
    fi
done
echo "    SSH 服务状态: $(systemctl is-active sshd 2>/dev/null || systemctl is-active ssh 2>/dev/null)"

# ── 6. 系统更新状态 ──────────────────────────────────────
echo ""
echo "【6. 系统更新】"
if command -v yum &>/dev/null; then
    UPDATES=$(yum check-update --quiet 2>/dev/null | grep -v "^$" | wc -l)
    if [ "$UPDATES" -gt 0 ]; then
        echo "    ⚠️  待更新软件包: $UPDATES 个"
    else
        echo "    ✅ 系统已是最新"
    fi
elif command -v apt &>/dev/null; then
    apt list --upgradable 2>/dev/null | grep -c upgradable || echo "    ✅ 系统已是最新"
fi

# ── 7. 失败登录统计 ──────────────────────────────────────
echo ""
echo "【7. 认证安全】"
if lastb &>/dev/null; then
    FAILED=$(lastb -n 5 2>/dev/null | wc -l)
    echo "    最近失败登录尝试数: $FAILED"
fi
echo "    最近成功登录:"
last -5 | sed 's/^/      /'

# ── 8. fail2ban 状态 ─────────────────────────────────────
echo ""
echo "【8. fail2ban 防暴力破解】"
if systemctl is-active fail2ban &>/dev/null; then
    echo "    ✅ fail2ban 运行中"
    sudo fail2ban-client status 2>/dev/null | head -5 | sed 's/^/      /'
else
    echo "    ⚠️  fail2ban 未安装或未运行"
fi

# ── 9. 磁盘使用率 ────────────────────────────────────────
echo ""
echo "【9. 磁盘使用率】"
df -h | grep -v 'tmpfs\|devtmpfs' | awk 'NR>1 {
    usage=$5; gsub("%","",usage);
    if (usage>80) printf "    ⚠️  %s 使用率: %s\n", $6, $5;
    else printf "    ✅ %s 使用率: %s\n", $6, $5;
}'

# ── 10. CPU / 内存 ───────────────────────────────────────
echo ""
echo "【10. 系统资源】"
echo "    CPU 负载: $(uptime | awk -F'load average:' '{print $2}')"
echo "    内存使用: $(free -h | awk '/^Mem:/{print $3"/"$2}')"

echo ""
echo "=========================================="
echo "  巡检完成"
echo "=========================================="
EOF

chmod +x /opt/security_check.sh

# 执行巡检
sudo bash /opt/security_check.sh

十三、常见问题排错

❌ 问题 1:SSH 密钥登录失败

# 排查步骤
# 1. 检查 SSH 服务配置
sudo sshd -t

# 2. 查看 SSH 日志
# CentOS
sudo tail -f /var/log/secure
# Ubuntu
sudo tail -f /var/log/auth.log

# 3. 常见错误及解决
#    - 权限问题
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
#    - SELinux 限制
restorecon -Rv ~/.ssh
#    - OpenSSH 版本问题
ssh -vvvv user@host   # 查看详细调试信息

❌ 问题 2:firewalld 放行了端口但仍无法访问

# 排查步骤
# 1. 检查服务层是否在监听
ss -tlnp | grep <port>

# 2. 检查云服务商安全组是否放行(阿里云/腾讯云控制台)

# 3. 检查 iptables 规则是否有冲突
sudo iptables -L -n | grep <port>

# 4. 检查 SELinux 是否限制
sudo getsebool -a | grep <service>

❌ 问题 3:auditd 日志占满磁盘

# 解决方案
# 1. 调整日志轮转大小
sudo vi /etc/audit/auditd.conf
# max_log_file = 50

# 2. 清理历史日志
sudo rm -f /var/log/audit/audit.log.*
sudo systemctl restart auditd

# 3. 压缩旧日志
sudo auditd.conf

❌ 问题 4:fail2ban 启动失败

# 排查
sudo journalctl -u fail2ban -n 30

# 常见原因:Python 版本不兼容
# 解决:安装正确版本
pip3 install fail2ban

# 重启
sudo systemctl restart fail2ban

❌ 问题 5:ClamAV 扫描太慢

# 使用多线程扫描
sudo clamscan -r / --max-dir-recursion=20 --exclude-dir=/proc --exclude-dir=/sys -j 4

# 仅扫描关键目录
sudo clamscan -r /etc /home /var/www -l /var/log/clamav/quick_scan.log

十四、安全加固检查清单

✅ 账户管理
    ☐ 创建特权管理员账户(禁用 root 直接登录)
    ☐ 配置 SSH 公钥认证,禁用密码登录
    ☐ 更换 SSH 默认端口
    ☐ 配置强密码策略(长度 12+,含4种字符)
    ☐ 设置密码过期策略(90天)

✅ 防火墙
    ☐ 配置 iptables / firewalld / UFW
    ☐ 仅开放必要端口(SSH/HTTP/HTTPS)
    ☐ 限制来源 IP(内网-only 管理端口)
    ☐ 记录被拒绝的连接日志

✅ 系统加固
    ☐ 启用 SELinux / AppArmor
    ☐ 停止不必要的系统服务
    ☐ 配置内核安全参数(sysctl)
    ☐ 限制 /tmp 目录执行权限(noexec)
    ☐ 配置 NTP 时间同步

✅ 入侵检测
    ☐ 安装配置 fail2ban
    ☐ 配置 auditd 审计规则
    ☐ 配置 AIDE 文件完整性监控
    ☐ 配置 ClamAV 定时扫描

✅ 日志与监控
    ☐ 配置日志集中收集
    ☐ 设置日志轮转(logrotate)
    ☐ 配置磁盘使用率告警

✅ 定期维护
    ☐ 设置自动安全更新
    ☐ 定期执行安全巡检脚本
    ☐ 定期更新病毒库
    ☐ 定期备份 /etc 关键配置
© 版权声明
THE END
喜欢就支持一下吧
点赞7 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容