Linux系统安全
·
一、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
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)