在数字化浪潮席卷全球的今天,网络安全威胁如影随形。据统计,超过90%的网络攻击都是从系统漏洞和配置不当开始的。作为运维工程师,我们不仅要让系统跑得稳定,更要让它固若金汤。这份指南将结合实战经验,分享一套从“裸奔”到“铜墙铁壁”的Linux系统安全加固技巧。
安全威胁现状:你的Linux真的安全吗?
常见安全威胁类型
现代Linux系统面临的主要威胁包括:
- 暴力破解攻击:针对SSH、FTP等服务的密码爆破尝试。
- 权限提升攻击:利用内核或应用漏洞获取更高的root权限。
- 恶意软件感染:服务器被植入木马、后门或挖矿程序。
- 数据泄露风险:敏感文件(如配置文件、日志)的权限设置不当。
- DDoS攻击:通过海量请求耗尽服务器资源的攻击方式。
安全防护的三道防线
构建完整的安全体系,通常需要建立以下三道防线:
- 第一道防线:系统层防护(用户管理、权限控制、服务加固)
- 第二道防线:网络层防护(防火墙、端口管理、流量监控)
- 第三道防线:应用层防护(日志审计、入侵检测、应急响应)
用户账户安全:筑牢第一道防线
1. 用户账户管理最佳实践
禁用不必要的系统账户
许多Linux发行版会默认创建一些非登录账户(如games, news),这些账户若被利用可能成为攻击跳板。可以通过脚本批量禁用它们。
#!/bin/bash
# 禁用系统不需要的账户
USERS_TO_DISABLE="games news uucp operator gopher"
for user in $USERS_TO_DISABLE; do
if id "$user" >/dev/null 2>&1; then
usermod -L "$user"
usermod -s /sbin/nologin "$user"
echo "已禁用账户: $user"
fi
done
# 检查空密码账户
awk -F: '($2 == "") {print "警告: " $1 " 账户密码为空"}' /etc/shadow
创建安全的管理员账户
避免直接使用root账户进行日常操作,应该创建一个具有sudo权限的普通用户。
# 创建具有sudo权限的普通用户
useradd -m -s /bin/bash -G wheel secadmin
passwd secadmin
# 配置sudo免密(谨慎使用)
echo "secadmin ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/secadmin
chmod 440 /etc/sudoers.d/secadmin
2. 密码策略强化
配置强密码策略
强制用户使用复杂且定期更换的密码是基础。
# /etc/login.defs 密码策略配置
PASS_MAX_DAYS 90 # 密码最大有效期
PASS_MIN_DAYS 7 # 密码最小更改间隔
PASS_MIN_LEN 12 # 最小密码长度
PASS_WARN_AGE 14 # 密码过期警告天数
# 安装并配置 pam_pwquality
yum install -y libpwquality
echo "password requisite pam_pwquality.so retry=3 minlen=12 dcredit=-1 ucredit=-1 ocredit=-1 lcredit=-1" >> /etc/pam.d/system-auth
账户锁定策略
防止攻击者通过暴力尝试破解密码。
# 配置登录失败锁定
cat >> /etc/pam.d/sshd << EOF
auth required pam_tally2.so deny=5 unlock_time=300 even_deny_root root_unlock_time=300
account required pam_tally2.so
EOF
# 查看被锁定的账户
pam_tally2 --user=username
# 解锁账户
pam_tally2 --user=username --reset
SSH安全加固:关闭危险之门
1. SSH配置安全优化
核心安全配置
修改/etc/ssh/sshd_config是提升SSH安全性的关键一步。
# /etc/ssh/sshd_config 安全配置
Port 2022 # 更改默认端口
Protocol 2 # 使用SSH协议版本2
PermitRootLogin no # 禁止root直接登录
PasswordAuthentication no # 禁用密码认证
PubkeyAuthentication yes # 启用公钥认证
AuthorizedKeysFile .ssh/authorized_keys
MaxAuthTries 3 # 最大认证尝试次数
MaxSessions 2 # 最大会话数
ClientAliveInterval 300 # 客户端存活检测间隔
ClientAliveCountMax 2 # 最大存活检测次数
AllowUsers secadmin developer # 仅允许特定用户登录
DenyUsers root guest # 拒绝特定用户登录
2. SSH密钥认证配置
生成和部署SSH密钥
密钥认证比密码认证安全得多,务必启用。
# 在客户端生成密钥对
ssh-keygen -t ed25519 -b 4096 -f ~/.ssh/id_ed25519 -N ""
# 复制公钥到服务器
ssh-copy-id -i ~/.ssh/id_ed25519.pub secadmin@server_ip
# 服务器端设置正确权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chown -R secadmin:secadmin ~/.ssh
SSH连接监控脚本
实时监控登录失败并自动告警甚至封禁IP。
#!/bin/bash
# SSH登录监控和告警脚本
LOG_FILE="/var/log/secure"
ALERT_EMAIL="admin@company.com"
# 监控SSH登录失败
tail -f $LOG_FILE | while read line; do
if echo "$line" | grep -q "Failed password"; then
IP=$(echo "$line" | awk '{print $11}')
USER=$(echo "$line" | awk '{print $9}')
echo "SSH登录失败: $USER from $IP" | mail -s "SSH Security Alert" $ALERT_EMAIL
# 自动封禁多次失败的IP
FAIL_COUNT=$(grep "Failed password" $LOG_FILE | grep "$IP" | wc -l)
if [ $FAIL_COUNT -gt 5 ]; then
iptables -A INPUT -s $IP -j DROP
echo "已封禁IP: $IP"
fi
fi
done
防火墙配置:构建网络防护屏障
1. iptables防火墙规则
基础防火墙脚本
iptables是Linux内核自带的强大包过滤工具,可以精确控制进出流量。
#!/bin/bash
# iptables安全配置脚本
# 清空现有规则
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
# 设置默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 允许本地回环
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# 允许已建立的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许SSH(自定义端口)
iptables -A INPUT -p tcp --dport 2022 -j ACCEPT
# 允许HTTP和HTTPS
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 防DDoS规则
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
2. firewalld现代防火墙管理
对于使用systemd的较新发行版(如RHEL/CentOS 7+, Fedora),firewalld提供了更易用的动态管理方式。
# 启用firewalld
systemctl enable --now firewalld
# 配置默认区域
firewall-cmd --set-default-zone=public
# 添加服务规则
firewall-cmd --permanent --zone=public --add-service=ssh
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
# 自定义端口规则
firewall-cmd --permanent --zone=public --add-port=2022/tcp
# 限制SSH访问源
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="ssh" accept'
# 重载配置
firewall-cmd --reload
文件系统安全:保护数据资产
1. 文件权限管理
关键文件权限检查脚本
系统关键文件的错误权限可能导致严重的信息泄露。
#!/bin/bash
# 系统关键文件权限检查
check_file_permissions(){
local file=$1
local expected_perm=$2
local current_perm=$(stat -c "%a" "$file" 2>/dev/null)
if [ "$current_perm" != "$expected_perm" ]; then
echo "警告: $file 权限异常,当前: $current_perm, 期望: $expected_perm"
chmod $expected_perm "$file"
echo "已修复: $file 权限设置为 $expected_perm"
fi
}
# 检查关键系统文件权限
check_file_permissions "/etc/passwd" "644"
check_file_permissions "/etc/shadow" "600"
check_file_permissions "/etc/group" "644"
check_file_permissions "/etc/gshadow" "600"
check_file_permissions "/etc/ssh/sshd_config" "600"
# 查找危险权限文件(SUID/SGID)
find / -type f \( -perm -4000 -o -perm -2000 \) -exec ls -lg {} \; 2>/dev/null | head -20
2. 磁盘加密和挂载安全
磁盘挂载安全选项
在/etc/fstab中使用安全挂载选项,可以限制特定目录的执行权限,防止攻击者上传并运行恶意程序。
# /etc/fstab 安全挂载选项
/dev/sda1 /home ext4 defaults,nodev,nosuid,noexec 0 2
/dev/sda2 /tmp ext4 defaults,nodev,nosuid,noexec 0 2
/dev/sda3 /var/log ext4 defaults,nodev,nosuid,noexec 0 2
# 创建加密分区(LUKS)
cryptsetup luksFormat /dev/sdb1
cryptsetup luksOpen /dev/sdb1 encrypted_disk
mkfs.ext4 /dev/mapper/encrypted_disk
服务安全加固:减少攻击面
1. 服务管理和端口控制
服务安全检查脚本
关闭不需要的服务,是“最小攻击面”原则的直接体现。
#!/bin/bash
# 服务安全检查和加固脚本
# 停用不必要的服务
DISABLE_SERVICES="telnet rsh rlogin ypbind tftp talk ntalk"
for service in $DISABLE_SERVICES; do
if systemctl is-enabled $service >/dev/null 2>&1; then
systemctl disable --now $service
echo "已停用服务: $service"
fi
done
# 检查监听端口
echo "=== 当前监听端口 ==="
netstat -tlnp | grep LISTEN
# 检查运行的服务
echo "=== 运行中的服务 ==="
systemctl list-units --type=service --state=running | grep -v "systemd"
2. Web服务器安全配置
Nginx安全配置示例
如果你运行Web服务,应用层的安全配置同样重要。
# /etc/nginx/nginx.conf 安全配置
http {
# 隐藏版本信息
server_tokens off;
# 安全头设置
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
# 限制请求大小
client_max_body_size 10M;
client_body_buffer_size 128k;
# 连接限制
limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=5r/s;
server {
listen 443 ssl http2;
# SSL安全配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512;
ssl_prefer_server_ciphers off;
# 应用限制
limit_conn conn_limit_per_ip 10;
limit_req zone=req_limit_per_ip burst=10 nodelay;
}
}
系统监控和日志审计:洞察安全态势
1. 系统日志配置
rsyslog安全日志配置
集中、完整的日志是事后追溯和分析的基础。
# /etc/rsyslog.conf 日志配置
# 启用安全相关日志
auth,authpriv.* /var/log/auth.log
kern.* /var/log/kern.log
mail.* /var/log/mail.log
# 远程日志发送(可选)
*.* @@log-server.company.com:514
# 日志轮转配置
cat > /etc/logrotate.d/security << EOF
/var/log/auth.log {
daily
missingok
rotate 52
compress
delaycompress
notifempty
create 0640 syslog adm
}
EOF
2. 入侵检测系统部署
AIDE文件完整性监控
AIDE可以建立系统文件的“指纹”数据库,定期检查是否有文件被篡改。
# 安装和配置AIDE
yum install -y aide
aide --init
mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
# 定期完整性检查
cat > /etc/cron.daily/aide-check << 'EOF'
#!/bin/bash
AIDE_REPORT=/tmp/aide_report_$(date +%Y%m%d)
aide --check > $AIDE_REPORT 2>&1
if [ $? -ne 0 ]; then
mail -s "AIDE检测到系统变化" admin@company.com < $AIDE_REPORT
fi
EOF
chmod +x /etc/cron.daily/aide-check
内核参数调优:系统级安全防护
1. 网络安全参数
通过调整内核参数,可以防范多种低层网络攻击。
# /etc/sysctl.conf 安全参数配置
# 禁用IP转发(非路由器/网关服务器)
net.ipv4.ip_forward = 0
net.ipv6.conf.all.forwarding = 0
# 禁用ICMP重定向
net.ipv4.conf.all.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
# 启用反向路径过滤
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# 防SYN洪水攻击
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 2
# 忽略ping请求(根据需求开启)
# net.ipv4.icmp_echo_ignore_all = 1
# 应用配置
sysctl -p
2. 内存和进程安全
进程安全控制
限制核心转储和进程数量,增加攻击者利用漏洞的难度。
# 限制core dump
echo "* soft core 0" >> /etc/security/limits.conf
echo "* hard core 0" >> /etc/security/limits.conf
# 进程数量限制
echo "* soft nproc 65536" >> /etc/security/limits.conf
echo "* hard nproc 65536" >> /etc/security/limits.conf
# 内存地址随机化(ASLR)
echo 2 > /proc/sys/kernel/randomize_va_space
自动化安全检查:持续安全保障
1. 综合安全检查脚本
将日常检查工作自动化,形成报告。
#!/bin/bash
# Linux系统安全检查脚本
REPORT_FILE="/tmp/security_report_$(date +%Y%m%d).txt"
echo "=== Linux系统安全检查报告 ===" > $REPORT_FILE
echo "检查时间: $(date)" >> $REPORT_FILE
echo "" >> $REPORT_FILE
# 检查用户登录
echo "=== 近期登录用户 ===" >> $REPORT_FILE
last -10 >> $REPORT_FILE
# 检查sudo使用记录
echo "=== sudo使用记录 ===" >> $REPORT_FILE
grep sudo /var/log/auth.log | tail -10 >> $REPORT_FILE
# 检查进程状态
echo "=== 可疑进程检查 ===" >> $REPORT_FILE
ps aux | awk '{print $1, $2, $11}' | grep -v "^\[" | sort | uniq -c | sort -nr | head -20 >> $REPORT_FILE
# 检查网络连接
echo "=== 网络连接状态 ===" >> $REPORT_FILE
netstat -tupln | grep LISTEN >> $REPORT_FILE
# 发送报告
mail -s "每日安全检查报告" admin@company.com < $REPORT_FILE
2. 安全基线检查
对照CIS(互联网安全中心)等安全基准进行检查。
#!/bin/bash
# CIS基准检查脚本片段
check_password_policy(){
echo "检查密码策略..."
if grep -q "PASS_MAX_DAYS.*90" /etc/login.defs; then
echo "✓ 密码最大有效期配置正确"
else
echo "✗ 密码最大有效期配置异常"
fi
}
check_ssh_config(){
echo "检查SSH配置..."
if grep -q "^PermitRootLogin no" /etc/ssh/sshd_config; then
echo "✓ SSH禁止root登录配置正确"
else
echo "✗ SSH允许root登录,存在安全风险"
fi
}
# 执行检查
check_password_policy
check_ssh_config
应急响应预案:安全事件处理
1. 入侵检测和响应
当怀疑系统被入侵时,应有标准化的响应流程。
#!/bin/bash
# 安全事件应急响应脚本
isolate_system(){
echo "系统隔离中..."
# 断开网络(保留SSH管理)
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -A INPUT -p tcp --dport 2022 -s 192.168.1.100 -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 停止非必要服务
systemctl stop httpd nginx mysql
echo "系统已隔离,仅保留管理访问"
}
collect_evidence(){
EVIDENCE_DIR="/tmp/incident_$(date +%Y%m%d_%H%M%S)"
mkdir -p $EVIDENCE_DIR
# 收集系统信息
ps aux > $EVIDENCE_DIR/processes.txt
netstat -tupln > $EVIDENCE_DIR/network.txt
lsof > $EVIDENCE_DIR/openfiles.txt
# 收集日志
cp /var/log/auth.log $EVIDENCE_DIR/
cp /var/log/messages $EVIDENCE_DIR/
echo "证据收集完成: $EVIDENCE_DIR"
}
# 使用示例
# isolate_system
# collect_evidence
安全配置模板:标准化部署
1. 安全加固一键脚本
对于需要批量部署的环境,可以编写一键脚本。
#!/bin/bash
# Linux服务器安全加固一键脚本
set -e
SCRIPT_NAME="Linux Security Hardening"
LOG_FILE="/var/log/security_hardening.log"
log(){
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a $LOG_FILE
}
log "开始执行 $SCRIPT_NAME"
# 1. 更新系统
log "更新系统软件包..."
yum update -y >> $LOG_FILE 2>&1
# 2. 配置SSH
log "配置SSH安全设置..."
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sed -i 's/#Port 22/Port 2022/' /etc/ssh/sshd_config
sed -i 's/#PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
systemctl restart sshd
# 3. 配置防火墙
log "配置防火墙规则..."
systemctl enable --now firewalld
firewall-cmd --permanent --remove-service=ssh
firewall-cmd --permanent --add-port=2022/tcp
firewall-cmd --reload
log "安全加固完成!请检查日志文件: $LOG_FILE"
持续安全改进:建立安全文化
安全监控仪表板
通过整合工具和脚本,将关键安全指标可视化。
#!/bin/bash
# 安全监控数据收集脚本
# 收集安全指标数据,用于可视化展示
METRICS_FILE="/var/log/security_metrics.json"
{
echo "{"
echo " \"timestamp\": \"$(date -u +%Y-%m-%dT%H:%M:%SZ)\","
echo " \"failed_logins\": $(grep "Failed password" /var/log/auth.log | wc -l),"
echo " \"active_connections\": $(netstat -tn | grep :22 | wc -l),"
echo " \"suspicious_processes\": $(ps aux | grep -E "(nc|wget|curl)" | wc -l),"
echo " \"disk_usage\": $(df / | awk 'NR==2 {print $5}' | sed 's/%//'),"
echo " \"load_average\": \"$(uptime | awk -F'load average:' '{print $2}')\""
echo "}"
} > $METRICS_FILE
安全培训和意识提升
技术手段之外,人的因素同样关键。应建立定期的安全培训机制,例如新员工安全意识培训、定期安全演练、安全事件复盘分享会等。
总结:构建多层次安全防护体系
Linux系统安全加固是一个持续的过程,而非一次性的任务。它需要我们从系统、网络、应用等多个维度建立立体的防护体系,并遵循以下核心原则:
- 最小权限原则:用户、进程、服务只拥有完成其功能所必需的最小权限。
- 深度防护:构建多层次的安全措施,即使某一层被突破,其他层仍能提供保护。
- 持续监控:通过日志、监控工具实时掌握系统状态,快速发现异常行为。
- 定期更新:及时应用系统和应用的安全补丁,并根据威胁情报调整安全策略。
一个可行的实施路线图可以分阶段进行:
- 第一阶段(基础加固):完成用户/权限管理、SSH安全配置、基础防火墙规则、关键服务加固。
- 第二阶段(监控完善):配置集中日志与监控,部署入侵检测系统(如AIDE),编写自动化检查与基线核查脚本。
- 第三阶段(持续改进):开展安全培训与演练,建立应急响应流程,整合外部威胁情报,持续优化安全工具与策略。
安全永远没有终点。通过系统性地应用上述加固技巧,你不仅能显著提升服务器的安全性(例如将暴力破解成功率降至极低水平),还能建立起快速响应安全事件的能力。在这个信息安全威胁日益严峻的时代,掌握这些实战技能,无疑是每一位运维工程师提升自身核心竞争力的关键。如果你想与更多同行探讨系统安全或自动化运维的实践,欢迎来云栈社区交流分享。