一、Linux系统安全概述
1.1 什么是系统安全
Linux系统安全是指保护Linux操作系统免受未经授权的访问、使用、披露、破坏、修改或中断的一系列措施和实践。作为开源系统,Linux具有天生的安全优势,但仍然需要正确的配置和管理来确保系统安全。
1.2 安全威胁类型
| 威胁类型 | 描述 | 常见攻击方式 |
|---|---|---|
| 外部攻击 | 来自网络的外部入侵 | 端口扫描、暴力破解、DDoS攻击 |
| 内部威胁 | 来自系统内部的恶意行为 | 权限滥用、数据窃取、破坏 |
| 恶意软件 | 病毒、木马、蠕虫等 | Rootkit、后门程序、勒索软件 |
| 漏洞利用 | 利用系统或软件漏洞 | 缓冲区溢出、提权攻击 |
| 社会工程学 | 利用人为因素 | 钓鱼邮件、欺骗电话 |
1.3 安全原则
python
# 安全原则示意图(伪代码)
安全原则 = [
"最小权限原则:用户只拥有完成工作所需的最小权限",
"纵深防御:多层安全防护,单点失败不影响整体安全",
"默认安全:默认配置应该是最安全的配置",
"fail-safe:系统失败时应处于安全状态",
"完全审查:所有操作都应被记录和审计",
"权限分离:关键操作需要多人授权"
]
二、用户和权限安全
2.1 用户账号管理
bash
#!/bin/bash
# 用户账号安全管理
# 1. 查看系统中的用户
echo "系统用户列表:"
cat /etc/passwd | cut -d: -f1,3,7 | column -t -s:
# 2. 检查是否有空密码用户
echo "检查空密码用户:"
awk -F: '($2==""){print $1}' /etc/shadow
# 3. 检查UID为0的用户(root权限)
echo "UID为0的用户:"
awk -F: '($3==0){print $1}' /etc/passwd
# 4. 锁定不需要的账号
# usermod -L 用户名 # 锁定账号
# usermod -U 用户名 # 解锁账号
# 5. 删除不必要的默认用户
# userdel -r 用户名 # 删除用户及家目录
# 6. 设置密码策略
echo "设置密码过期策略:"
# chage -M 90 用户名 # 密码最大使用天数
# chage -m 7 用户名 # 密码最小修改间隔
# chage -W 7 用户名 # 密码过期前警告天数
# chage -E 2024-12-31 用户名 # 账号过期日期
# 7. 查看用户密码状态
chage -l root
2.2 密码安全策略
bash
#!/bin/bash
# 密码安全配置
# 1. 配置密码复杂度(/etc/pam.d/system-auth 或 /etc/security/pwquality.conf)
cat >> /etc/security/pwquality.conf << EOF
# 密码最小长度
minlen = 12
# 至少包含一个小写字母
dcredit = -1
# 至少包含一个大写字母
ucredit = -1
# 至少包含一个数字
ocredit = -1
# 至少包含一个特殊字符
lcredit = -1
# 不能包含用户名
usercheck = 1
# 允许的连续相同字符数
maxrepeat = 3
EOF
# 2. 设置密码过期策略(/etc/login.defs)
cat >> /etc/login.defs << EOF
# 密码最大有效期(天)
PASS_MAX_DAYS 90
# 密码最小修改间隔(天)
PASS_MIN_DAYS 7
# 密码过期前警告(天)
PASS_WARN_AGE 14
EOF
# 3. 禁止使用旧密码
# 在/etc/pam.d/system-auth中添加:
# password sufficient pam_unix.so remember=5
# 4. 账户锁定策略(防止暴力破解)
cat >> /etc/pam.d/sshd << EOF
# 登录失败3次,锁定300秒
auth required pam_tally2.so deny=3 unlock_time=300 even_deny_root root_unlock_time=300
EOF
2.3 文件和目录权限
bash
#!/bin/bash
# 文件和目录权限管理
# 1. 重要文件的权限设置
echo "设置重要文件权限:"
chmod 644 /etc/passwd # 所有用户可读,仅root可写
chmod 600 /etc/shadow # 仅root可读写
chmod 644 /etc/group # 所有用户可读,仅root可写
chmod 600 /etc/gshadow # 仅root可读写
chmod 644 /etc/hosts.allow # 配置文件
chmod 644 /etc/hosts.deny
# 2. 查找权限过于宽松的文件
echo "查找其他用户可写的文件:"
find / -type f -perm -o+w -ls 2>/dev/null
echo "查找设置了SUID/SGID的文件:"
find / -type f \( -perm -4000 -o -perm -2000 \) -ls 2>/dev/null
# 3. 设置默认权限(umask)
echo "当前umask:$(umask)"
# 在/etc/profile中设置默认umask
echo "umask 027" >> /etc/profile # 文件默认权限:640,目录:750
# 4. 设置文件属性(不可更改)
# chattr +i /etc/passwd # 设置为不可修改
# chattr +a /var/log/messages # 只能追加内容
# lsattr /etc/passwd # 查看文件属性
# 5. 检查重要文件的完整性
echo "检查系统二进制文件完整性:"
rpm -Va # 验证所有已安装的RPM包(RHEL/CentOS)
# dpkg --verify # Debian/Ubuntu系统
2.4 sudo权限控制
bash
#!/bin/bash
# sudo配置示例 (/etc/sudoers)
# 1. 使用visudo编辑sudoers文件(不要直接编辑)
# visudo
# 2. 基本的sudo配置示例
cat >> /etc/sudoers.d/custom << EOF
# 允许wheel组所有成员执行任何命令
%wheel ALL=(ALL) ALL
# 允许用户alice执行所有命令,不需要密码
alice ALL=(ALL) NOPASSWD: ALL
# 允许用户bob只能执行特定的系统命令
bob ALL=(ALL) /usr/bin/systemctl restart httpd, /usr/bin/systemctl status httpd
# 允许ops组的成员以webadmin用户执行命令
%ops ALL=(webadmin) /usr/bin/nginx
# 定义命令别名
Cmnd_Alias NETWORKING = /sbin/ifconfig, /sbin/ip, /usr/sbin/netstat
Cmnd_Alias SERVICES = /usr/bin/systemctl start *, /usr/bin/systemctl stop *
Cmnd_Alias SU = /bin/su
# 使用命令别名
%admin ALL=(ALL) NETWORKING, SERVICES
# 限制root的sudo权限
Defaults:root !authenticate
EOF
# 3. sudo日志配置
echo "配置sudo日志:"
echo 'Defaults logfile="/var/log/sudo.log"' >> /etc/sudoers
echo 'Defaults loglinelen=0' >> /etc/sudoers
三、网络安全
3.1 防火墙配置(iptables/firewalld)
bash
#!/bin/bash
# 使用iptables配置防火墙
# 1. 查看当前规则
iptables -L -n -v
iptables -t nat -L -n -v
# 2. 基础防火墙策略
# 清空现有规则
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 OUTPUT -o lo -j ACCEPT
# 允许已建立的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许SSH连接(限制来源IP)
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT
# 允许Web服务
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 允许DNS查询
iptables -A INPUT -p udp --dport 53 -j ACCEPT
# 允许Ping(限制频率)
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/second -j ACCEPT
# 防止DDoS攻击
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j REJECT
# 记录并丢弃其他所有包
iptables -A INPUT -j LOG --log-prefix "IPTABLES-DROP: "
iptables -A INPUT -j DROP
# 保存规则
service iptables save
# 或
iptables-save > /etc/iptables/rules.v4
# 使用firewalld(CentOS/RHEL 7+)
systemctl start firewalld
systemctl enable firewalld
# 基本firewalld命令
firewall-cmd --state
firewall-cmd --get-default-zone
firewall-cmd --list-all
firewall-cmd --add-service=http --permanent
firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --reload
3.2 SSH安全配置
bash
#!/bin/bash
# SSH安全加固 (/etc/ssh/sshd_config)
# 备份原配置
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
# 安全的SSH配置
cat > /etc/ssh/sshd_config << EOF
# 端口设置(修改默认端口)
Port 2222
# 协议版本
Protocol 2
# 监听地址
ListenAddress 0.0.0.0
ListenAddress ::
# 认证设置
PermitRootLogin no # 禁止root直接登录
PubkeyAuthentication yes # 允许密钥认证
PasswordAuthentication no # 禁止密码认证
PermitEmptyPasswords no # 禁止空密码
ChallengeResponseAuthentication no # 关闭挑战响应认证
UsePAM yes
# 登录限制
MaxAuthTries 3 # 最大认证尝试次数
MaxSessions 10 # 最大并发会话数
LoginGraceTime 60 # 登录超时时间(秒)
# 用户限制
AllowUsers alice bob @192.168.1.0/24 # 允许特定用户或IP
DenyUsers guest test # 禁止特定用户
AllowGroups wheel admin # 允许特定组
DenyGroups guests # 禁止特定组
# 空闲超时
ClientAliveInterval 300 # 客户端存活检查间隔
ClientAliveCountMax 2 # 最大存活检查次数
TCPKeepAlive yes
# 日志设置
SyslogFacility AUTH
LogLevel INFO
# 主机密钥算法
HostKey /etc/ssh/ssh_host_ed25519_key
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
# 加密算法(禁用弱算法)
KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com
# 其他安全设置
X11Forwarding no # 禁用X11转发
AllowTcpForwarding yes # 允许TCP转发
AllowAgentForwarding yes # 允许代理转发
PrintMotd no # 不显示MOTD
PrintLastLog yes # 显示上次登录
Banner /etc/ssh/banner # 登录横幅
EOF
# 创建登录警告横幅
cat > /etc/ssh/banner << EOF
*******************************************************************
* 警告 *
* 未经授权禁止访问此系统! *
* 所有活动都会被记录和监控。 *
*******************************************************************
EOF
# 重启SSH服务
systemctl restart sshd
# 检查SSH配置
sshd -t
3.3 网络服务安全
bash
#!/bin/bash
# 网络服务安全配置
# 1. 关闭不必要的服务
echo "检查运行中的服务:"
systemctl list-units --type=service --state=running
echo "禁用不必要的服务:"
# systemctl disable bluetooth
# systemctl disable cups
# systemctl disable avahi-daemon
# systemctl disable postfix # 如果不需要邮件服务
# 2. 使用xinetd管理服务
# 安装xinetd
yum install xinetd -y
# 配置TCP Wrapper (/etc/hosts.allow, /etc/hosts.deny)
cat > /etc/hosts.allow << EOF
# 允许本地网络访问
sshd: 192.168.1.0/255.255.255.0
vsftpd: .example.com
EOF
cat > /etc/hosts.deny << EOF
# 默认拒绝所有
ALL: ALL
EOF
# 3. 端口扫描检测
echo "检查开放端口:"
netstat -tulpn
ss -tulpn
nmap -sT -O localhost
# 4. 安装入侵检测系统
# yum install aide -y
# aide --init
# mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
# 5. 配置系统日志监控
cat >> /etc/rsyslog.conf << EOF
# 记录所有认证信息
auth,authpriv.* /var/log/auth.log
# 记录所有内核日志
kern.* /var/log/kern.log
# 记录所有安全相关日志
*.emerg :omusrmsg:*
EOF
systemctl restart rsyslog
四、系统审计与监控
4.1 日志管理
bash
#!/bin/bash
# 系统日志管理
# 1. 重要日志文件
echo "重要日志文件位置:"
echo "/var/log/messages" # 系统常规日志
echo "/var/log/secure" # 安全认证日志
echo "/var/log/maillog" # 邮件服务日志
echo "/var/log/cron" # 计划任务日志
echo "/var/log/boot.log" # 启动日志
echo "/var/log/dmesg" # 内核日志
echo "/var/log/lastlog" # 用户最后登录信息
echo "/var/log/wtmp" # 登录历史
echo "/var/log/btmp" # 错误登录尝试
# 2. 查看登录日志
echo "最近成功登录:"
last | head -10
echo "最近失败登录:"
lastb | head -10
echo "当前登录用户:"
who
echo "用户最后登录时间:"
lastlog | head -20
# 3. 日志轮转配置 (/etc/logrotate.conf)
cat > /etc/logrotate.d/custom << EOF
/var/log/custom/*.log {
daily # 每天轮转
missingok # 如果日志不存在则忽略
rotate 30 # 保留30个旧日志
compress # 压缩旧日志
delaycompress # 延迟压缩
notifempty # 空文件不轮转
create 644 root root # 创建新日志的权限
sharedscripts # 共享脚本
postrotate # 轮转后执行的命令
kill -HUP `cat /var/run/rsyslogd.pid 2>/dev/null` 2>/dev/null || true
endscript
}
EOF
# 4. 实时监控日志
tail -f /var/log/secure
# 5. 日志分析脚本
cat > /usr/local/bin/log_analyzer.sh << 'EOF'
#!/bin/bash
# 简单的日志分析脚本
echo "=== SSH登录失败统计 ==="
grep "Failed password" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | head -10
echo -e "\n=== sudo使用统计 ==="
grep "sudo:" /var/log/secure | awk '{print $9}' | sort | uniq -c | sort -nr | head -10
echo -e "\n=== 异常时间登录 ==="
grep -E "([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]" /var/log/secure | grep "Accepted" | awk '{print $1,$2,$3,$9,$11}'
echo -e "\n=== 最近新增用户 ==="
grep "useradd" /var/log/secure | tail -10
EOF
chmod +x /usr/local/bin/log_analyzer.sh