如何构建Linux服务器安全防护体系

描述

Linux服务器安全防护完全指南:从0到1构建铜墙铁壁

 前言:作为一名运维工程师,我见过太多因为安全配置不当而被攻破的服务器。本文将分享我多年来积累的实战经验,教你如何构建一套完整的Linux服务器安全防护体系。

真实案例:一次惊心动魄的入侵事件

去年某个深夜,我接到监控告警:公司一台Web服务器CPU使用率异常飙升。登录后发现系统中运行着可疑进程,进一步排查发现服务器已被植入挖矿木马。这次事件让我深刻意识到服务器安全防护的重要性。

攻击路径复盘

• 攻击者通过SSH暴力破解获得root权限

• 植入后门程序并建立持久化连接

• 下载挖矿程序消耗服务器资源

• 尝试横向渗透内网其他主机

核心防护策略:多层安全防线

第一层:SSH安全加固

1. 修改默认端口

 

# 编辑SSH配置文件
vim /etc/ssh/sshd_config

# 修改端口(建议使用10000-65535范围)
Port 22022

# 重启SSH服务
systemctl restart sshd

 

2. 禁用root直接登录

 

# 在sshd_config中设置
PermitRootLogin no

# 创建普通用户并加入sudo组
useradd -m -s /bin/bash admin
usermod -aG sudo admin

 

3. 配置密钥认证

 

# 生成SSH密钥对
ssh-keygen -t ed25519 -C "your_email@example.com"

# 在服务器上创建authorized_keys
mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "your_public_key" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

# 禁用密码认证
echo "PasswordAuthentication no" >> /etc/ssh/sshd_config
systemctl restart sshd

 

第二层:Fail2Ban防暴力破解

安装配置Fail2Ban

 

# Ubuntu/Debian
apt update && apt install fail2ban -y

# CentOS/RHEL
yum install epel-release -y && yum install fail2ban -y

 

自定义SSH防护规则

 

# 创建本地配置文件
cat > /etc/fail2ban/jail.local << 'EOF'
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 3
ignoreip = 127.0.0.1/8 192.168.0.0/16

[sshd]
enabled = true
port = 22022
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 86400
EOF

# 启动服务
systemctl enable fail2ban && systemctl start fail2ban

 

查看封禁状态

 

# 查看被封IP
fail2ban-client status sshd

# 手动解封IP
fail2ban-client set sshd unbanip 192.168.1.100

 

第三层:防火墙配置

UFW简单防火墙

 

# 启用UFW
ufw enable

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

# 允许SSH连接(使用自定义端口)
ufw allow 22022/tcp

# 允许Web服务
ufw allow 80/tcp
ufw allow 443/tcp

# 查看规则
ufw status verbose

 

iptables高级配置

 

#!/bin/bash
# 清空现有规则
iptables -F
iptables -X
iptables -Z

# 设置默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# 允许本地回环
iptables -A INPUT -i lo -j ACCEPT

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

# SSH限速(防暴力破解)
iptables -A INPUT -p tcp --dport 22022 -m state --state NEW -m recent --set --name SSH
iptables -A INPUT -p tcp --dport 22022 -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j DROP
iptables -A INPUT -p tcp --dport 22022 -j ACCEPT

# Web服务
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# 保存规则
iptables-save > /etc/iptables/rules.v4

 

第四层:入侵检测系统

部署OSSEC-HIDS

 

# 下载安装OSSEC
wget https://github.com/ossec/ossec-hids/archive/3.6.0.tar.gz
tar -xzf 3.6.0.tar.gz && cd ossec-hids-3.6.0
./install.sh

# 配置监控规则
vim /var/ossec/etc/ossec.conf

 

自定义监控脚本

 

#!/bin/bash
# 系统异常检测脚本
LOG_FILE="/var/log/security_check.log"

# 检查异常进程
check_suspicious_processes() {
    echo"[$(date)] 检查可疑进程..." >> $LOG_FILE
    
    # 检查CPU使用率异常的进程
    ps aux --sort=-%cpu | head -10 | whileread line; do
        cpu=$(echo$line | awk '{print $3}')
        if (( $(echo "$cpu > 80" | bc -l) )); then
            echo"警告:发现高CPU使用率进程: $line" >> $LOG_FILE
        fi
    done
}

# 检查异常网络连接
check_network_connections() {
    echo"[$(date)] 检查网络连接..." >> $LOG_FILE
    
    # 检查异常端口监听
    netstat -tlnp | grep -E ':(1234|4444|5555|8080)' && {
        echo"警告:发现可疑端口监听" >> $LOG_FILE
    }
}

# 执行检查
check_suspicious_processes
check_network_connections

 

第五层:文件完整性监控

使用AIDE工具

 

# 安装AIDE
apt install aide -y  # Ubuntu/Debian
yum install aide -y  # CentOS/RHEL

# 初始化数据库
aide --init
mv /var/lib/aide/aide.db.new /var/lib/aide/aide.db

# 创建检查脚本
cat > /usr/local/bin/aide_check.sh << 'EOF'
#!/bin/bash
aide --check | tee /var/log/aide_check.log
if [ $? -ne 0 ]; then
    echo"文件完整性检查发现异常,请查看日志文件"
    # 可以在这里添加邮件通知
fi
EOF

chmod +x /usr/local/bin/aide_check.sh

# 添加定时任务
echo"0 2 * * * /usr/local/bin/aide_check.sh" | crontab -

 

高级防护技巧

1. 端口敲门技术

 

# 安装knockd
apt install knockd -y

# 配置端口敲门
cat > /etc/knockd.conf << 'EOF'
[options]
    UseSyslog

[openSSH]
    sequence    = 7000,8000,9000
    seq_timeout = 5
    command     = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22022 -j ACCEPT
    tcpflags    = syn

[closeSSH]
    sequence    = 9000,8000,7000
    seq_timeout = 5
    command     = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22022 -j ACCEPT
    tcpflags    = syn
EOF

# 启动服务
systemctl enable knockd && systemctl start knockd

 

2. 蜜罐部署(迷惑攻击者)

 

# 安装Cowrie SSH蜜罐
pip3 install cowrie

# 配置虚假SSH服务监听22端口
# 真实SSH服务使用非标准端口

 

3. 日志分析自动化

 

#!/bin/bash
# 自动日志分析脚本
LOGFILE="/var/log/auth.log"
ALERT_EMAIL="admin@yourdomain.com"

# 分析SSH登录失败
failed_attempts=$(grep "Failed password"$LOGFILE | grep "$(date '+%b %d')" | wc -l)

if [ $failed_attempts -gt 50 ]; then
    echo"警告:今日SSH登录失败次数达到 $failed_attempts 次" | 
    mail -s "SSH安全警报 - $(hostname)"$ALERT_EMAIL
fi

# 检查新用户创建
new_users=$(grep "new user" /var/log/auth.log | grep "$(date '+%b %d')")
if [ ! -z "$new_users" ]; then
    echo"警告:检测到新用户创建:$new_users" | 
    mail -s "用户管理警报 - $(hostname)"$ALERT_EMAIL
fi

 

监控与告警系统

搭建轻量级监控

 

# 安装Netdata实时监控
bash <(curl -Ss https://my-netdata.io/kickstart.sh)

# 配置告警
vim /etc/netdata/health_alarm_notify.conf

# 设置邮件通知
SEND_EMAIL="YES"
DEFAULT_RECIPIENT_EMAIL="admin@yourdomain.com"

 

自定义告警脚本

 

#!/usr/bin/env python3
import psutil
import smtplib
from email.mime.text import MIMEText
import time

defcheck_system_health():
    alerts = []
    
    # CPU使用率检查
    cpu_percent = psutil.cpu_percent(interval=1)
    if cpu_percent > 80:
        alerts.append(f"CPU使用率过高: {cpu_percent}%")
    
    # 内存使用率检查
    memory = psutil.virtual_memory()
    if memory.percent > 85:
        alerts.append(f"内存使用率过高: {memory.percent}%")
    
    # 磁盘使用率检查
    for partition in psutil.disk_partitions():
        disk_usage = psutil.disk_usage(partition.mountpoint)
        if disk_usage.percent > 90:
            alerts.append(f"磁盘 {partition.mountpoint} 使用率过高: {disk_usage.percent}%")
    
    return alerts

defsend_alert(alerts):
    ifnot alerts:
        return
    
    msg = MIMEText('
'.join(alerts))
    msg['Subject'] = f'服务器健康告警 - {time.strftime("%Y-%m-%d %H:%M")}'
    msg['From'] = 'monitor@yourdomain.com'
    msg['To'] = 'admin@yourdomain.com'
    
    # 发送邮件逻辑
    print("发送告警:", '
'.join(alerts))

if __name__ == "__main__":
    alerts = check_system_health()
    send_alert(alerts)

 

应急响应预案

发现入侵后的处理步骤

1. 立即隔离

 

# 断网隔离(保留SSH连接)
iptables -A INPUT -j DROP
iptables -I INPUT 1 -s YOUR_IP -j ACCEPT

 

2. 保存证据

 

# 备份关键日志
tar -czf evidence_$(date +%Y%m%d_%H%M).tar.gz 
    /var/log/auth.log 
    /var/log/syslog 
    /var/log/messages

 

3. 清理后门

 

# 检查计划任务
crontab -l
cat /etc/crontab
ls -la /etc/cron.*

# 检查启动项
systemctl list-unit-files --state=enabled
ls -la /etc/init.d/

 

实战演练

模拟攻击测试

 

# 使用Nmap扫描自己的服务器
nmap -sS -O YOUR_SERVER_IP

# 使用Hydra测试SSH暴力破解防护
hydra -l admin -P /usr/share/wordlists/rockyou.txt 
    ssh://YOUR_SERVER_IP:22022 -t 4

 

性能优化

 

# 优化SSH配置性能
echo "ClientAliveInterval 60" >> /etc/ssh/sshd_config
echo "ClientAliveCountMax 3" >> /etc/ssh/sshd_config
echo "MaxAuthTries 3" >> /etc/ssh/sshd_config
echo "MaxSessions 5" >> /etc/ssh/sshd_config

 

进阶技巧分享

1. 使用PAM增强认证

 

# 配置Google Authenticator双因子认证
apt install libpam-google-authenticator -y
google-authenticator

# 修改PAM配置
echo "auth required pam_google_authenticator.so" >> /etc/pam.d/sshd

 

2. 自动化安全检查

 

# 创建安全检查清单脚本
cat > /usr/local/bin/security_audit.sh << 'EOF'
#!/bin/bash
echo"=== Linux服务器安全检查报告 ==="
echo"检查时间: $(date)"
echo""

# 检查用户账户
echo"1. 用户账户检查:"
awk -F: '$3==0{print "警告: " $1 " 具有root权限"}' /etc/passwd

# 检查空密码账户
echo"2. 空密码账户检查:"
awk -F: '$2==""{print "警告: " $1 " 密码为空"}' /etc/shadow

# 检查文件权限
echo"3. 关键文件权限检查:"
ls -l /etc/passwd /etc/shadow /etc/sudoers

# 检查网络监听
echo"4. 网络监听端口:"
netstat -tlnp | grep LISTEN

echo"=== 检查完成 ==="
EOF

chmod +x /usr/local/bin/security_audit.sh

 

总结与建议

通过以上多层防护措施,可以显著提升Linux服务器的安全性:

安全等级评估

• 基础级:修改SSH端口 + 密钥认证

• 标准级:+ Fail2Ban + 防火墙配置

• 高级:+ 入侵检测 + 文件监控

• 专家级:+ 蜜罐 + 自动化响应

最佳实践建议

1. 定期更新系统和软件包

2. 最小化权限原则

3. 定期审计和日志分析

4. 制定应急响应预案

5. 定期进行安全演练

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分