找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

2944

积分

0

好友

404

主题
发表于 4 小时前 | 查看: 3| 回复: 0

在数字化浪潮席卷全球的今天,网络安全威胁如影随形。据统计,超过90%的网络攻击都是从系统漏洞和配置不当开始的。作为运维工程师,我们不仅要让系统跑得稳定,更要让它固若金汤。这份指南将结合实战经验,分享一套从“裸奔”到“铜墙铁壁”的Linux系统安全加固技巧。

安全威胁现状:你的Linux真的安全吗?

常见安全威胁类型

现代Linux系统面临的主要威胁包括:

  • 暴力破解攻击:针对SSH、FTP等服务的密码爆破尝试。
  • 权限提升攻击:利用内核或应用漏洞获取更高的root权限。
  • 恶意软件感染:服务器被植入木马、后门或挖矿程序。
  • 数据泄露风险:敏感文件(如配置文件、日志)的权限设置不当。
  • DDoS攻击:通过海量请求耗尽服务器资源的攻击方式。

安全防护的三道防线

构建完整的安全体系,通常需要建立以下三道防线:

  1. 第一道防线:系统层防护(用户管理、权限控制、服务加固)
  2. 第二道防线:网络层防护(防火墙、端口管理、流量监控)
  3. 第三道防线:应用层防护(日志审计、入侵检测、应急响应)

用户账户安全:筑牢第一道防线

1. 用户账户管理最佳实践

禁用不必要的系统账户
许多Linux发行版会默认创建一些非登录账户(如gamesnews),这些账户若被利用可能成为攻击跳板。可以通过脚本批量禁用它们。

#!/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系统安全加固是一个持续的过程,而非一次性的任务。它需要我们从系统、网络、应用等多个维度建立立体的防护体系,并遵循以下核心原则:

  1. 最小权限原则:用户、进程、服务只拥有完成其功能所必需的最小权限。
  2. 深度防护:构建多层次的安全措施,即使某一层被突破,其他层仍能提供保护。
  3. 持续监控:通过日志、监控工具实时掌握系统状态,快速发现异常行为。
  4. 定期更新:及时应用系统和应用的安全补丁,并根据威胁情报调整安全策略。

一个可行的实施路线图可以分阶段进行:

  • 第一阶段(基础加固):完成用户/权限管理、SSH安全配置、基础防火墙规则、关键服务加固。
  • 第二阶段(监控完善):配置集中日志与监控,部署入侵检测系统(如AIDE),编写自动化检查与基线核查脚本。
  • 第三阶段(持续改进):开展安全培训与演练,建立应急响应流程,整合外部威胁情报,持续优化安全工具与策略。

安全永远没有终点。通过系统性地应用上述加固技巧,你不仅能显著提升服务器的安全性(例如将暴力破解成功率降至极低水平),还能建立起快速响应安全事件的能力。在这个信息安全威胁日益严峻的时代,掌握这些实战技能,无疑是每一位运维工程师提升自身核心竞争力的关键。如果你想与更多同行探讨系统安全或自动化运维的实践,欢迎来云栈社区交流分享。




上一篇:iQOO 15 Ultra正式发布:24GB+1TB存储,搭载骁龙8 Elite Gen5与主动散热系统
下一篇:Kubernetes 1.35 集群安装完整指南:在 CentOS 9 上使用 Docker 运行时
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-2-7 20:38 , Processed in 0.312589 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表