第13课:Linux安全配置

【腾讯云】语音识别准确率高,支持多语种,多场景,限时特惠,最低14.9元起

推广

【腾讯云】语音识别准确率高,支持多语种,多场景,限时特惠,最低14.9元起

Linux安全配置

系统安全基础

1. 安全原则

最小权限原则

# 用户权限最小化
# 只给用户必需的权限
# 定期审查用户权限
# 使用sudo而不是直接使用root

# 服务权限最小化
# 以非特权用户运行服务
# 限制服务访问的文件和目录

纵深防御

# 多层安全防护
# 网络层:防火墙、入侵检测
# 系统层:访问控制、审计
# 应用层:输入验证、加密
# 数据层:备份、加密

2. 系统加固检查清单

基础安全检查

# 检查系统版本
cat /etc/os-release
uname -a

# 检查已安装的软件包
dpkg -l | grep -i security    # Debian/Ubuntu
rpm -qa | grep -i security    # CentOS/RHEL

# 检查运行的服务
systemctl list-units --type=service --state=running

# 检查网络端口
ss -tuln
netstat -tuln

用户和权限安全

1. 用户账户安全

密码策略

# 安装密码质量检查工具
sudo apt install libpam-pwquality    # Ubuntu/Debian
sudo yum install libpwquality         # CentOS/RHEL

# 配置密码策略
sudo nano /etc/security/pwquality.conf

# 密码策略配置
minlen = 12                   # 最小长度
minclass = 3                  # 最少字符类型
maxrepeat = 2                 # 最大重复字符
maxclasschars = 4             # 同类字符最大数量
dcredit = -1                  # 至少包含1个数字
ucredit = -1                  # 至少包含1个大写字母
lcredit = -1                  # 至少包含1个小写字母
ocredit = -1                  # 至少包含1个特殊字符

账户锁定策略

# 配置账户锁定
sudo nano /etc/pam.d/common-auth

# 添加以下行
auth required pam_tally2.so deny=5 unlock_time=900 onerr=fail

# 查看锁定状态
sudo pam_tally2 --user=username

# 解锁用户
sudo pam_tally2 --user=username --reset

用户审计

# 查看用户登录历史
last
lastb                         # 失败登录尝试

# 查看当前登录用户
who
w

# 检查可疑用户
awk -F: '$3 == 0 {print $1}' /etc/passwd    # UID为0的用户
awk -F: '$2 == "" {print $1}' /etc/shadow   # 空密码用户

2. sudo配置安全

sudo安全配置

# 编辑sudoers文件
sudo visudo

# 安全配置示例
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
Defaults logfile="/var/log/sudo.log"
Defaults log_input,log_output
Defaults passwd_tries=3
Defaults passwd_timeout=5
Defaults timestamp_timeout=15

# 用户权限配置
user1 ALL=(ALL) /usr/bin/systemctl restart nginx
user2 ALL=(ALL) NOPASSWD: /usr/bin/systemctl status *
%developers ALL=(ALL) /usr/bin/git, /usr/bin/docker

SSH安全配置

1. SSH服务加固

SSH配置文件

# 编辑SSH配置
sudo nano /etc/ssh/sshd_config

# 安全配置
Port 2222                     # 修改默认端口
Protocol 2                    # 使用SSH协议版本2
PermitRootLogin no            # 禁止root直接登录
PasswordAuthentication no     # 禁用密码认证
PubkeyAuthentication yes      # 启用公钥认证
AuthorizedKeysFile .ssh/authorized_keys

# 登录限制
MaxAuthTries 3                # 最大认证尝试次数
MaxSessions 2                 # 最大会话数
LoginGraceTime 60             # 登录超时时间
ClientAliveInterval 300       # 客户端保活间隔
ClientAliveCountMax 2         # 最大保活次数

# 用户限制
AllowUsers user1 user2        # 允许登录的用户
DenyUsers baduser             # 禁止登录的用户
AllowGroups sshusers          # 允许登录的组

# 重启SSH服务
sudo systemctl restart sshd

2. SSH密钥管理

生成和管理SSH密钥

# 生成强密钥
ssh-keygen -t ed25519 -b 4096 -C "user@example.com"
ssh-keygen -t rsa -b 4096 -C "user@example.com"

# 设置密钥权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
chmod 600 ~/.ssh/authorized_keys

# 禁用弱密钥算法
echo "PubkeyAcceptedKeyTypes ssh-ed25519,rsa-sha2-256,rsa-sha2-512" >> /etc/ssh/sshd_config

SSH连接监控

# 监控SSH登录
sudo tail -f /var/log/auth.log | grep ssh

# SSH连接统计
grep "Accepted" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -nr

# 检测暴力破解
grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -nr

防火墙配置

1. iptables防火墙

基本iptables规则

# 清空现有规则
sudo iptables -F
sudo iptables -X
sudo iptables -t nat -F
sudo iptables -t nat -X

# 设置默认策略
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 2222 -j ACCEPT

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

# 限制SSH连接频率
sudo iptables -A INPUT -p tcp --dport 2222 -m recent --set --name SSH
sudo iptables -A INPUT -p tcp --dport 2222 -m recent --update --seconds 60 --hitcount 4 --name SSH -j DROP

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

高级iptables规则

# 防止SYN洪水攻击
sudo iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
sudo iptables -A INPUT -p tcp --syn -j DROP

# 防止端口扫描
sudo iptables -A INPUT -m recent --name portscan --rcheck --seconds 86400 -j DROP
sudo iptables -A INPUT -m recent --name portscan --remove
sudo iptables -A INPUT -p tcp -m tcp --dport 139 -m recent --name portscan --set -j LOG --log-prefix "portscan:"
sudo iptables -A INPUT -p tcp -m tcp --dport 139 -m recent --name portscan --set -j DROP

# 限制ICMP
sudo iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

2. firewalld防火墙 (CentOS/RHEL)

firewalld基本配置

# 启动firewalld
sudo systemctl start firewalld
sudo systemctl enable firewalld

# 查看状态
sudo firewall-cmd --state
sudo firewall-cmd --list-all

# 设置默认区域
sudo firewall-cmd --set-default-zone=public

# 添加服务
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https

# 添加端口
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --permanent --add-port=8080/tcp

# 限制源IP
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" accept'

# 重新加载配置
sudo firewall-cmd --reload

3. ufw防火墙 (Ubuntu)

ufw基本配置

# 启用ufw
sudo ufw enable

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

# 允许服务
sudo ufw allow ssh
sudo ufw allow 2222/tcp
sudo ufw allow http
sudo ufw allow https

# 限制连接频率
sudo ufw limit ssh

# 允许特定IP
sudo ufw allow from 192.168.1.0/24

# 查看状态
sudo ufw status verbose

入侵检测和防护

1. fail2ban

安装和配置fail2ban

# 安装fail2ban
sudo apt install fail2ban        # Ubuntu/Debian
sudo yum install fail2ban        # CentOS/RHEL

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

# 配置fail2ban
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

fail2ban配置示例

[DEFAULT]
# 忽略的IP地址
ignoreip = 127.0.0.1/8 192.168.1.0/24

# 封禁时间 (秒)
bantime = 3600

# 查找时间窗口 (秒)
findtime = 600

# 最大重试次数
maxretry = 3

# 邮件通知
destemail = admin@example.com
sendername = Fail2Ban
mta = sendmail

[sshd]
enabled = true
port = ssh,2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600

[nginx-http-auth]
enabled = true
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 3

[nginx-limit-req]
enabled = true
filter = nginx-limit-req
logpath = /var/log/nginx/error.log
maxretry = 3

fail2ban管理

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

# 解封IP
sudo fail2ban-client set sshd unbanip 192.168.1.100

# 手动封禁IP
sudo fail2ban-client set sshd banip 192.168.1.100

# 重新加载配置
sudo fail2ban-client reload

2. 入侵检测系统

AIDE (Advanced Intrusion Detection Environment)

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

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

# 检查文件完整性
sudo aide --check

# 更新数据库
sudo aide --update

Tripwire

# 安装Tripwire
sudo apt install tripwire

# 配置Tripwire
sudo tripwire-setup-keyfiles

# 初始化数据库
sudo tripwire --init

# 检查完整性
sudo tripwire --check

# 更新数据库
sudo tripwire --update

系统审计

1. auditd审计系统

安装和配置auditd

# 安装auditd
sudo apt install auditd audispd-plugins    # Ubuntu/Debian
sudo yum install audit                      # CentOS/RHEL

# 启动服务
sudo systemctl start auditd
sudo systemctl enable auditd

# 配置审计规则
sudo nano /etc/audit/rules.d/audit.rules

审计规则示例

# 删除所有规则
-D

# 设置缓冲区大小
-b 8192

# 审计系统调用失败
-a always,exit -F arch=b64 -S adjtimex -S settimeofday -k time-change
-a always,exit -F arch=b32 -S adjtimex -S settimeofday -S stime -k time-change

# 审计用户和组管理
-w /etc/group -p wa -k identity
-w /etc/passwd -p wa -k identity
-w /etc/gshadow -p wa -k identity
-w /etc/shadow -p wa -k identity

# 审计登录事件
-w /var/log/lastlog -p wa -k logins
-w /var/run/faillock -p wa -k logins

# 审计权限修改
-a always,exit -F arch=b64 -S chmod -S fchmod -S fchmodat -F auid>=1000 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b32 -S chmod -S fchmod -S fchmodat -F auid>=1000 -F auid!=4294967295 -k perm_mod

# 审计网络连接
-a always,exit -F arch=b64 -S connect -F a2=16 -k network_connect
-a always,exit -F arch=b32 -S connect -F a2=16 -k network_connect

# 使规则不可变
-e 2

审计日志分析

# 查看审计日志
sudo ausearch -k identity
sudo ausearch -k logins
sudo ausearch -k perm_mod

# 生成审计报告
sudo aureport
sudo aureport --auth
sudo aureport --login
sudo aureport --file

# 实时监控
sudo ausearch -ts today -k identity | tail -f

2. 日志监控

系统日志监控

# 重要日志文件
/var/log/auth.log              # 认证日志
/var/log/syslog               # 系统日志
/var/log/kern.log             # 内核日志
/var/log/secure               # 安全日志 (CentOS/RHEL)

# 实时监控日志
sudo tail -f /var/log/auth.log
sudo journalctl -f

# 日志分析脚本
#!/bin/bash
# 检查可疑登录
grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -nr | head -10

# 检查root登录
grep "root" /var/log/auth.log | grep "session opened"

# 检查sudo使用
grep "sudo:" /var/log/auth.log | tail -20

文件系统安全

1. 文件权限和ACL

特殊权限设置

# 设置SUID权限 (谨慎使用)
chmod 4755 /usr/bin/program

# 设置SGID权限
chmod 2755 /shared/directory

# 设置Sticky位
chmod 1777 /tmp

# 查找特殊权限文件
find / -perm -4000 -type f 2>/dev/null    # SUID文件
find / -perm -2000 -type f 2>/dev/null    # SGID文件
find / -perm -1000 -type d 2>/dev/null    # Sticky位目录

文件完整性监控

# 使用md5sum检查文件完整性
md5sum /etc/passwd > /root/passwd.md5
md5sum -c /root/passwd.md5

# 监控重要文件变化
#!/bin/bash
FILES="/etc/passwd /etc/shadow /etc/sudoers"
for file in $FILES; do
    if [ -f "$file" ]; then
        current_hash=$(md5sum "$file" | cut -d' ' -f1)
        stored_hash=$(cat "/root/$(basename $file).md5" 2>/dev/null)
        if [ "$current_hash" != "$stored_hash" ]; then
            echo "WARNING: $file has been modified!"
            logger "File integrity check failed for $file"
        fi
    fi
done

2. 磁盘加密

LUKS磁盘加密

# 安装加密工具
sudo apt install cryptsetup

# 创建加密分区
sudo cryptsetup luksFormat /dev/sdb1

# 打开加密分区
sudo cryptsetup luksOpen /dev/sdb1 encrypted_disk

# 格式化加密分区
sudo mkfs.ext4 /dev/mapper/encrypted_disk

# 挂载加密分区
sudo mount /dev/mapper/encrypted_disk /mnt/encrypted

# 关闭加密分区
sudo umount /mnt/encrypted
sudo cryptsetup luksClose encrypted_disk

网络安全

1. 网络监控

网络连接监控

# 监控网络连接
netstat -tupln
ss -tupln

# 监控网络流量
sudo tcpdump -i eth0
sudo iftop -i eth0

# 检查可疑连接
netstat -an | grep ESTABLISHED | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr

端口扫描检测

# 使用nmap检测开放端口
nmap -sS localhost
nmap -sU localhost

# 端口扫描检测脚本
#!/bin/bash
# 检测端口扫描
tail -f /var/log/syslog | grep -i "port scan" | while read line; do
    echo "Port scan detected: $line"
    logger "Security Alert: Port scan detected"
done

2. 网络访问控制

hosts.allow和hosts.deny

# 配置访问控制
sudo nano /etc/hosts.allow
# 允许特定IP访问SSH
sshd: 192.168.1.0/24
sshd: 10.0.0.1

sudo nano /etc/hosts.deny
# 拒绝所有其他连接
sshd: ALL

安全监控脚本

1. 综合安全检查脚本

#!/bin/bash
# 系统安全检查脚本

LOG_FILE="/var/log/security_check.log"
DATE=$(date '+%Y-%m-%d %H:%M:%S')

echo "[$DATE] 开始安全检查" >> $LOG_FILE

# 检查失败登录
failed_logins=$(grep "Failed password" /var/log/auth.log | wc -l)
if [ $failed_logins -gt 10 ]; then
    echo "[$DATE] WARNING: 检测到 $failed_logins 次失败登录" >> $LOG_FILE
fi

# 检查root登录
root_logins=$(grep "root" /var/log/auth.log | grep "session opened" | wc -l)
if [ $root_logins -gt 0 ]; then
    echo "[$DATE] WARNING: 检测到 $root_logins 次root登录" >> $LOG_FILE
fi

# 检查新用户
new_users=$(find /home -maxdepth 1 -type d -mtime -1 | wc -l)
if [ $new_users -gt 1 ]; then
    echo "[$DATE] INFO: 检测到 $((new_users-1)) 个新用户目录" >> $LOG_FILE
fi

# 检查SUID文件变化
find / -perm -4000 -type f 2>/dev/null > /tmp/current_suid
if [ -f /root/suid_files.list ]; then
    diff /root/suid_files.list /tmp/current_suid > /dev/null
    if [ $? -ne 0 ]; then
        echo "[$DATE] WARNING: SUID文件列表发生变化" >> $LOG_FILE
    fi
fi
cp /tmp/current_suid /root/suid_files.list

# 检查网络连接
suspicious_connections=$(netstat -an | grep ESTABLISHED | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | awk '$1 > 10 {print $2}')
if [ ! -z "$suspicious_connections" ]; then
    echo "[$DATE] WARNING: 检测到可疑网络连接: $suspicious_connections" >> $LOG_FILE
fi

echo "[$DATE] 安全检查完成" >> $LOG_FILE

总结

Linux安全配置要点:

  1. 系统加固:实施最小权限原则,定期更新系统
  2. 用户管理:强化密码策略,配置账户锁定
  3. SSH安全:修改默认端口,使用密钥认证
  4. 防火墙:配置适当的防火墙规则
  5. 入侵检测:部署fail2ban等防护工具
  6. 审计监控:启用系统审计,监控日志
  7. 文件安全:设置正确权限,监控文件完整性
  8. 网络安全:监控网络连接,控制访问

下一课预告

在下一课中,我们将学习系统备份与恢复,包括:

  • 备份策略制定
  • 自动化备份脚本
  • 系统恢复方法
  • 灾难恢复计划

💡 小贴士:安全是一个持续的过程,需要定期检查和更新安全配置。建议建立安全监控机制,及时发现和响应安全威胁。

Vue3 + TypeScript 企业级项目实战

课程推荐

Vue3 + TypeScript 企业级项目实战
Python 全栈开发工程师培训

热门课程

Python 全栈开发工程师培训

📚 文章对你有帮助?请关注我的公众号,万分感谢!

获取更多优质技术文章,第一时间掌握最新技术动态

关注公众号

关注公众号

第一时间获取最新技术文章

添加微信

添加微信

技术交流 · 问题答疑 · 学习指导

评论讨论

欢迎留下你的想法和建议