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
相关推荐
一只鹿鹿鹿2 小时前
研发中心数据安全管理规定(文件)
java·运维·开发语言·数据库·后端
青灯文案12 小时前
Linux 常用目录及其用途
linux·运维·服务器
芒果披萨2 小时前
Linux磁盘挂载
linux·运维·服务器
icy、泡芙2 小时前
全志 GPIO BUG
linux·bug
SMF19192 小时前
【Docker】Linux系统上卸载旧Docker、卸载Podman并重新安装Docker及配置国内镜像源
linux·docker·podman
中科三方2 小时前
实操指南:网站更换服务器IP后,域名解析如何修改和验证?
运维·服务器·tcp/ip
ErizJ2 小时前
面试 | Linux
linux·面试
Rabbit_QL2 小时前
GitHub 多账号 SSH 配置指南:让个人和工作账号共存
运维·ssh·github
wanhengidc2 小时前
云手机有哪些辅助功能?
运维·服务器·网络·游戏·智能手机·生活