学习目标

  • 理解本节涉及的核心主题:Linux 安全管理、日志审计与入侵检测、配置和管理安全日志、使用 fail2ban 防止暴力破解。
  • 掌握重点命令或工具:fail2ban
  • 能够结合示例完成常见操作,并理解关键参数、使用场景与结果差异。
  • 能够识别本节相关的常见风险、易错点或排查思路。

学习重点

  • 主题范围:Linux 安全管理、日志审计与入侵检测、配置和管理安全日志、使用 fail2ban 防止暴力破解、SSH 配置与加固、配置密钥认证
  • 重点命令:fail2ban
  • 学习重点:命令用途、关键参数、典型场景、与相近命令的区别
  • 复习方式:先理解场景,再动手练习,最后对照结果检查

Linux 安全管理

日志审计与入侵检测

日志审计与入侵检测是系统安全管理的重要组成部分,通过记录和分析系统日志,可以及时发现并应对潜在的安全威胁和入侵行为。

配置和管理安全日志

安全日志记录了系统的关键事件和活动,是审计和安全监控的基础。合理配置日志记录级别和权限,确保日志的完整性和可用性。

设置日志记录级别

日志记录级别决定了系统记录哪些类型的事件和信息。不同的日志记录级别适用于不同的安全需求。

步骤:

  1. 编辑 rsyslog 配置文件
    sudo nano /etc/rsyslog.conf
    
  2. 配置不同级别的日志记录
    示例:
    # 记录所有紧急级别及以上的日志到 /var/log/critical.log
    *.emerg    /var/log/critical.log
    
    # 记录警告级别及以上的日志到 /var/log/warnings.log
    *.warn     /var/log/warnings.log
    
    # 记录所有信息级别及以上的日志到 /var/log/syslog
    *.*        /var/log/syslog
    
  3. 重启 rsyslog 服务
    sudo systemctl restart rsyslog
    

常用日志级别:

  • emerg:紧急,系统不可用。
  • alert:需要立即采取措施。
  • crit:严重错误。
  • err:错误。
  • warning:警告。
  • notice:正常但重要的信息。
  • info:信息。
  • debug:调试信息。
管理日志文件权限

确保日志文件的所有者和权限设置正确,防止未授权的访问和篡改。

设置日志文件的所有者与权限

sudo chown root:adm /var/log/syslog
sudo chmod 640 /var/log/syslog

说明:

  • root:adm:设置所有者为 root,所属组为 adm(通常用于管理日志的用户组)。
  • 640:所有者具有读写权限,组用户具有读取权限,其他用户无权限。

使用 chown chmod 修改权限

sudo chgrp adm /var/log/auth.log

sudo chmod 640 /var/log/auth.log

最佳实践:

  • 仅授权的用户和组能够读取和管理日志文件。
  • 定期审查日志文件的权限,确保其符合安全策略。

使用 fail2ban 防止暴力破解

fail2ban 是一个入侵防御软件,监控日志文件中的可疑活动(如多次失败的登录尝试),并自动采取措施(如封禁IP地址),防止暴力破解攻击。

安装与启用 fail2ban

在Debian/Ubuntu上安装 fail2ban

sudo apt update
sudo apt install fail2ban

在CentOS/RHEL上安装 fail2ban

sudo yum install epel-release
sudo yum install fail2ban

启用并启动 fail2ban 服务

sudo systemctl enable fail2ban
sudo systemctl start fail2ban
配置监控规则

fail2ban 使用「监狱」(jails)来定义监控规则,每个监狱对应一个服务(如SSH、HTTP)。

步骤:

  1. 复制默认配置文件

    sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
    
  2. 编辑 jail.local 文件

    sudo nano /etc/fail2ban/jail.local
    
  3. 配置监控服务(如 sshd
    示例:配置 sshd 监狱

    [sshd]
    enabled = true
    port    = ssh
    filter  = sshd
    logpath = /var/log/auth.log
    maxretry = 5
    bantime = 600
    
  4. 配置防护参数

    • maxretry:允许的最大失败尝试次数。
    • bantime:封禁时间(秒)。 示例:
    [sshd]
    enabled = true
    port    = ssh
    filter  = sshd
    logpath = /var/log/auth.log
    maxretry = 5
    bantime = 600
    
  5. 重启 fail2ban 服务应用更改

    sudo systemctl restart fail2ban
    
应用场景与案例

防止 SSH 暴力破解

通过配置 fail2ban 监控 sshd 日志,可以自动封禁多次失败的SSH登录尝试,防止暴力破解攻击。

示例:

[sshd]
enabled = true
port    = ssh
filter  = sshd
logpath = /var/log/auth.log
maxretry = 5
bantime = 600

防止 HTTP 暴力破解

同样,可以为Web服务器(如Apache、Nginx)配置 fail2ban 监控特定的日志文件,防止HTTP暴力破解攻击。

示例:配置 nginx 监狱

[nginx-http-auth]
enabled = true
port    = http,https
filter  = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 3
bantime = 600

步骤:

  1. 创建 nginx-http-auth 过滤器

    sudo nano /etc/fail2ban/filter.d/nginx-http-auth.conf
    

    内容:

    [Definition]
    failregex = no user/password was provided for basic authentication.*client: <HOST>
    ignoreregex =
    
  2. 编辑 jail.local 文件

    sudo nano /etc/fail2ban/jail.local
    

    添加以下内容:

    [nginx-http-auth]
    enabled = true
    port    = http,https
    filter  = nginx-http-auth
    logpath = /var/log/nginx/error.log
    maxretry = 3
    bantime = 600
    
  3. 重启 fail2ban 服务

    sudo systemctl restart fail2ban
    

应用场景:

  • 增强远程访问安全:通过自动封禁可疑IP地址,减少暴力破解攻击的成功率。
  • 保护Web应用:防止针对Web应用的暴力登录尝试,确保应用程序的安全性。

SSH 配置与加固

SSH(Secure Shell)是Linux系统中常用的远程访问协议,通过合理配置和加固,可以显著提升系统的远程访问安全性,防止未授权的访问和潜在的安全威胁。

配置密钥认证

密钥认证提供了一种比密码更安全的SSH登录方式,防止密码泄露和暴力破解攻击。

生成 SSH 密钥对

使用 ssh-keygen 命令生成密钥对

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

说明:

  • -t rsa:指定密钥类型为RSA。
  • -b 4096:生成4096位密钥。
  • -C "comment":为密钥添加注释(通常为电子邮件)。

示例输出:

Generating public/private rsa key pair.
Enter file in which to save the key (/home/alice/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/alice/.ssh/id_rsa
Your public key has been saved in /home/alice/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx your_email@example.com
The key's randomart image is:
+---[RSA 4096]----+
|                 |
|        .        |
|       o +       |
|      o + +      |
|     . + = S     |
|      + + *      |
|     . = = .     |
|      . + .      |
|       E         |
+-----------------+
配置服务器端与客户端

将公钥复制到服务器

使用 ssh-copy-id 命令将公钥复制到远程服务器的 authorized_keys 文件中:

ssh-copy-id username@remote_host

示例:

ssh-copy-id alice@192.168.1.100

手动复制公钥

如果 ssh-copy-id 不可用,可以手动复制公钥:

  1. 复制公钥内容
    cat ~/.ssh/id_rsa.pub
    
  2. 在服务器上创建 ~/.ssh 目录并设置权限
    ssh username@remote_host
    mkdir -p ~/.ssh
    chmod 700 ~/.ssh
    
  3. 将公钥添加到 authorized_keys 文件
    echo "your_public_key_contents" >> ~/.ssh/authorized_keys
    chmod 600 ~/.ssh/authorized_keys
    
配置 ~/.ssh/authorized_keys 文件权限

确保 authorized_keys 文件和 .ssh 目录的权限正确,以防止未授权的访问。

设置权限:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

示例:

ssh username@remote_host
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
测试密钥认证

使用私钥进行登录

ssh username@remote_host

验证无密码登录

如果配置正确,应该无需输入密码即可登录。

示例:

ssh alice@192.168.1.100

输出:

Welcome to Ubuntu 20.04.4 LTS (GNU/Linux 5.4.0-104-generic x86_64)
...
alice@remote_host:~$

禁用密码登录,配置防火墙

通过禁用密码登录,只允许使用密钥认证,可以显著提升SSH登录的安全性,防止密码暴力破解攻击。

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

步骤:

  1. 打开配置文件

    sudo nano /etc/ssh/sshd_config
    
  2. 禁用密码认证
    找到并修改以下行:

    PasswordAuthentication no
    
  3. 禁用 Root 用户登录
    找到并修改以下行:

    PermitRootLogin no
    
  4. 禁用不必要的SSH选项
    禁用 X11 转发

    X11Forwarding no
    

    限制特定用户登录

    AllowUsers alice bob
    

保存并关闭文件

配置防火墙规则允许 SSH 连接

确保防火墙允许SSH端口(默认22)的流量,以便远程访问。

使用 ufw 配置

sudo ufw allow ssh

使用 firewalld 配置

sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload

使用 iptables 配置

sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

保存 iptables 规则

sudo iptables-save | sudo tee /etc/iptables/rules.v4
重启 SSH 服务应用更改

命令:

sudo systemctl restart sshd

验证配置:

重新连接SSH,确保只允许密钥认证:

ssh username@remote_host
禁用不必要的 SSH 选项

禁用 X11 转发

/etc/ssh/sshd_config 文件中设置:

X11Forwarding no

限制用户登录

/etc/ssh/sshd_config 文件中设置:

AllowUsers alice bob

其他安全选项:

  • 更改默认端口
    步骤:
    1. 编辑配置文件

      sudo nano /etc/ssh/sshd_config
      
    2. 更改端口号

      Port 2222
      
    3. 更新防火墙规则
      使用 ufw

      sudo ufw allow 2222/tcp
      sudo ufw delete allow ssh
      

      使用 firewalld

      sudo firewall-cmd --permanent --add-port=2222/tcp
      sudo firewall-cmd --permanent --remove-service=ssh
      sudo firewall-cmd --reload
      
    4. 重启 SSH 服务

      sudo systemctl restart sshd
      
  • 启用 TCP Wrappers
    步骤:
    1. 编辑 /etc/hosts.allow 文件

      sudo nano /etc/hosts.allow
      

      添加规则:

      sshd: 192.168.1.0/24
      
    2. 编辑 /etc/hosts.deny 文件

      sudo nano /etc/hosts.deny
      

      添加规则:

      sshd: ALL
      

应用场景:

  • 高安全性服务器:通过仅允许特定用户和IP地址访问SSH,增强服务器安全性。
  • 分布式系统:在多个服务器间实施严格的SSH访问控制,确保只有授权用户能够访问关键节点。

总结

Linux安全管理是确保系统稳定性和数据安全的关键环节。通过合理配置用户认证与授权、防火墙、SELinux/AppArmor、安全日志审计以及SSH加固,系统管理员可以构建一个安全、可靠的Linux环境。以下是基于具体实例的应用总结:

  • 配置 sudo 权限
    将用户 alice 添加到 sudo 组:

    sudo usermod -aG sudo alice
    sudo visudo
    # 添加以下行以赋予sudo组成员权限
    %sudo   ALL=(ALL:ALL) ALL
    
  • 创建并管理用户组
    创建 developers 组并将用户 bob 添加到该组:

    sudo groupadd developers
    sudo usermod -aG developers bob
    groups bob
    # 输出:bob : bob developers sudo
    
  • 设置文件组权限
    修改 /var/www/html/index.html 文件的所属组为 developers 并设置组权限:

    sudo chgrp developers /var/www/html/index.html
    sudo chmod 750 /var/www/html/index.html
    
  • 使用 ACL 赋予用户特定权限
    为用户 charlie 赋予 /var/www/html/index.html 的读取和写入权限:

    sudo setfacl -m u:charlie:rw /var/www/html/index.html
    getfacl /var/www/html/index.html
    
  • 配置 iptables 允许SSH和HTTP流量

    sudo iptables -A INPUT -i lo -j ACCEPT
    sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
    sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
    sudo iptables -A INPUT -j DROP
    sudo iptables-save | sudo tee /etc/iptables/rules.v4
    
  • 使用 ufw 设置防火墙规则

    sudo ufw default deny incoming
    sudo ufw default allow outgoing
    sudo ufw allow ssh
    sudo ufw allow http
    sudo ufw allow https
    sudo ufw enable
    
  • 启用并配置 SELinux
    查看SELinux状态:

    sestatus
    

    将SELinux模式设置为 enforcing

    sudo setenforce 1
    sudo nano /etc/selinux/config
    # 设置 SELINUX=enforcing
    sudo systemctl restart sshd
    
  • 配置 AppArmor 保护Nginx
    创建 /etc/apparmor.d/usr.sbin.nginx 文件:

    /usr/sbin/nginx {
        #include <abstractions/base>
        #include <abstractions/nginx>
    
        /var/www/** r,
        /var/log/nginx/** rw,
        /etc/nginx/** r,
        /usr/share/nginx/html/** r,
        /usr/sbin/nginx mr,
    }
    

    加载并启用配置:

    sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.nginx
    sudo systemctl reload apparmor
    
  • 配置并管理 fail2ban 防止暴力破解
    安装并启用 fail2ban

    sudo apt install fail2ban
    sudo systemctl enable fail2ban
    sudo systemctl start fail2ban
    

    配置 sshd 监狱:

    [sshd]
    enabled = true
    port    = ssh
    filter  = sshd
    logpath = /var/log/auth.log
    maxretry = 5
    bantime = 600
    

    重启 fail2ban 服务:

    sudo systemctl restart fail2ban
    
  • 配置SSH密钥认证并禁用密码登录
    生成密钥对并复制公钥到服务器:

    ssh-keygen -t rsa -b 4096 -C "alice@example.com"
    ssh-copy-id alice@192.168.1.100
    

    编辑 /etc/ssh/sshd_config 文件:

    PasswordAuthentication no
    PermitRootLogin no
    X11Forwarding no
    AllowUsers alice bob
    

    重启SSH服务:

    sudo systemctl restart sshd
    

本节总结

  • 本节主要围绕 Linux 安全管理、日志审计与入侵检测、配置和管理安全日志、使用 fail2ban 防止暴力破解、SSH 配置与加固 展开。
  • 需要重点掌握的命令或工具包括:fail2ban
  • 学习时应优先抓住「命令解决什么问题、在什么场景下使用、执行后会产生什么结果」。
  • 对涉及权限、覆盖、网络、系统服务、删除或安全配置的操作,建议先在测试环境练习。

复习建议

  • 先用自己的话复述本节每个主题或命令的作用,避免只记参数不懂用途。
  • 按原文示例至少手敲一遍典型命令,并观察输出变化。
  • 对高风险操作先确认路径、权限和目标对象,再执行实际命令。
  • 可优先复习这些高频命令:fail2ban