Linux系统安全

📅 发布时间:2026/7/3 13:31:51 👁️ 浏览次数:
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: ($30){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 root2.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 remember5 # 4. 账户锁定策略防止暴力破解 cat /etc/pam.d/sshd EOF # 登录失败3次锁定300秒 auth required pam_tally2.so deny3 unlock_time300 even_deny_root root_unlock_time300 EOF2.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 -ow -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 loglinelen0 /etc/sudoers三、网络安全3.1 防火墙配置iptables/firewalldbash#!/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 # 使用firewalldCentOS/RHEL 7 systemctl start firewalld systemctl enable firewalld # 基本firewalld命令 firewall-cmd --state firewall-cmd --get-default-zone firewall-cmd --list-all firewall-cmd --add-servicehttp --permanent firewall-cmd --add-port8080/tcp --permanent firewall-cmd --reload3.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-sha256libssh.org,diffie-hellman-group-exchange-sha256 Ciphers chacha20-poly1305openssh.com,aes256-gcmopenssh.com,aes128-gcmopenssh.com MACs hmac-sha2-512-etmopenssh.com,hmac-sha2-256-etmopenssh.com,umac-128-etmopenssh.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 -t3.3 网络服务安全bash#!/bin/bash # 网络服务安全配置 # 1. 关闭不必要的服务 echo 检查运行中的服务 systemctl list-units --typeservice --staterunning 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