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安全配置要点:
- 系统加固:实施最小权限原则,定期更新系统
- 用户管理:强化密码策略,配置账户锁定
- SSH安全:修改默认端口,使用密钥认证
- 防火墙:配置适当的防火墙规则
- 入侵检测:部署fail2ban等防护工具
- 审计监控:启用系统审计,监控日志
- 文件安全:设置正确权限,监控文件完整性
- 网络安全:监控网络连接,控制访问
下一课预告
在下一课中,我们将学习系统备份与恢复,包括:
- 备份策略制定
- 自动化备份脚本
- 系统恢复方法
- 灾难恢复计划
💡 小贴士:安全是一个持续的过程,需要定期检查和更新安全配置。建议建立安全监控机制,及时发现和响应安全威胁。
📚 文章对你有帮助?请关注我的公众号,万分感谢!
获取更多优质技术文章,第一时间掌握最新技术动态

关注公众号
第一时间获取最新技术文章

添加微信
技术交流 · 问题答疑 · 学习指导
评论讨论
欢迎留下你的想法和建议