网络安全的起点:掌握Linux权限体系与用户管理
Linux是服务器世界的主宰——全球90%以上的服务器运行Linux,安全工具几乎全部基于Linux。不掌握Linux权限体系,就像不会走路就想跑步。理解文件权限、用户管理和SUID机制是所有安全工作的基础。
Linux文件权限是安全的第一道防线。每个文件有三组权限:所有者(owner)、组(group)、其他人(others),每组包含读(r)、写(w)、执行(x)三种权限。
# 查看文件权限
ls -la /etc/passwd
# -rw-r--r-- 1 root root 2847 May 19 10:00 /etc/passwd
# └┬┘└┬┘└┬┘
# │ │ └── others: r-- (只读)
# │ └────── group: r-- (只读)
# └────────── owner: rw- (读写)
# 八进制表示法
# r = 4, w = 2, x = 1
# 755 = rwxr-xr-x (所有者全权限,其他人读和执行)
# 644 = rw-r--r-- (所有者读写,其他人只读)
# 700 = rwx------ (仅所有者全权限)
# chmod 修改权限
chmod 755 script.sh # 八进制方式
chmod u+x script.sh # 符号方式:给所有者加执行权限
chmod g-w file.txt # 符号方式:去掉组的写权限
chmod o=rx dir/ # 符号方式:其他人设为读和执行
chmod -R 750 /opt/app/ # 递归修改目录权限
# SUID (Set User ID) — 执行时以文件所有者身份运行
# 最常见的SUID程序: passwd, sudo, su
find / -perm -4000 -type f 2>/dev/null
# -rwsr-xr-x 1 root root 68208 /usr/bin/passwd
# ↑ SUID位,普通用户执行时获得root权限
# SGID (Set Group ID) — 执行时以文件所属组身份运行
find / -perm -2000 -type f 2>/dev/null
# -rwxr-sr-x 1 root mail /usr/bin/wall
# Sticky Bit — 只有文件所有者能删除
# /tmp目录经典示例: drwxrwxrwt
chmod +t /shared/dir # 设置sticky bit
ls -ld /tmp
# drwxrwxrwt 15 root root 4096 May 19 10:00 /tmp
# ↑ sticky bit,防止用户互删文件
# 传统权限只能设置一组group,ACL可以实现精细控制
# 安装ACL工具
apt install acl # Debian/Ubuntu
yum install acl # CentOS/RHEL
# 查看ACL
getfacl /data/project
# 设置ACL:给用户john读写权限
setfacl -m u:john:rw /data/project/report.txt
# 设置ACL:给组dev读写执行权限
setfacl -m g:dev:rwx /data/project/
# 设置默认ACL(新文件继承)
setfacl -d -m g:dev:rwx /data/project/
# 删除ACL
setfacl -x u:john /data/project/report.txt
setfacl -b /data/project/ # 删除所有ACL
Linux用户管理是系统安全的基石。正确配置用户和组,是最基本也最重要的安全措施。
# 创建用户
useradd -m -s /bin/bash john # 创建用户,建立家目录,指定shell
useradd -m -s /sbin/nologin svc # 服务账户,禁止登录
useradd -u 2000 -g docker dev # 指定UID和主组
# 设置密码
passwd john # 交互式设置密码
echo "john:P@ssw0rd" | chpasswd # 非交互式设置密码
# 修改用户属性
usermod -aG sudo john # 加入sudo组
usermod -aG docker,disk john # 加入多个组
usermod -s /bin/zsh john # 修改shell
usermod -L john # 锁定账户
usermod -U john # 解锁账户
usermod -e 2026-12-31 john # 设置账户过期时间
# 删除用户
userdel john # 删除用户(保留家目录)
userdel -r john # 删除用户及家目录
# 查看用户信息
id john # UID, GID, 附加组
groups john # 所属组列表
finger john # 详细信息(需安装finger)
# 创建组
groupadd developers # 创建组
groupadd -g 3000 ops # 指定GID
# 修改组
groupmod -n devteam developers # 重命名组
groupmod -g 3500 developers # 修改GID
# 删除组
groupdel developers
# 管理组成员
gpasswd -a john developers # 添加用户到组
gpasswd -d john developers # 从组中移除用户
gpasswd -A john developers # 设置组管理员
# /etc/passwd 格式 (所有用户可读)
# 用户名:x:UID:GID:描述:家目录:Shell
root:x:0:0:root:/root:/bin/bash
john:x:1000:1000:John Doe:/home/john:/bin/bash
# ↑ x表示密码存储在shadow文件
# /etc/shadow 格式 (仅root可读)
# 用户名:加密密码:最后修改日期:最短修改间隔:最长有效期:警告期:不活动期:过期日期
root:$6$salt$hash:19000:0:99999:7:::
john:$6$rounds=656000$salt$hash:19000:0:99999:7:::
# └──────────────────────────┘
# $6$ = SHA-512加密
# $5$ = SHA-256
# $1$ = MD5 (不安全!)
# $y$ = yescrypt (现代推荐)
# 检查密码强度
chage -l john # 查看密码策略
chage -M 90 john # 密码最长90天有效
chage -m 7 john # 最少7天后才能改密码
chage -W 14 john # 过期前14天警告
sudo是Linux权限管理的核心工具,允许普通用户以其他用户(通常是root)身份执行命令。
# /etc/sudoers 配置 (必须用visudo编辑!)
# 格式: 用户 主机=(以谁身份) 命令
# 基本配置
john ALL=(ALL) ALL # john可以执行任何命令
%sudo ALL=(ALL) ALL # sudo组用户可以执行任何命令
# 最小权限原则
john ALL=(ALL) /usr/bin/systemctl restart nginx
john ALL=(ALL) /usr/bin/apt update
# 只允许john重启nginx和更新软件包
# 免密sudo (不推荐用于生产环境)
john ALL=(ALL) NOPASSWD: ALL
# 允许运行某目录下所有命令
john ALL=(ALL) /usr/local/bin/*
# 禁止某命令
john ALL=(ALL) ALL, !/usr/bin/su, !/usr/bin/bash
# ⚠️ 这种方式可以绕过!不要用黑名单模式
# 使用sudo日志
Defaults logfile="/var/log/sudo.log"
Defaults log_input, log_output
Defaults iolog_dir="/var/log/sudo-io/%{user}/%{runas_user}/%+{%Y%m%d%H%M%S}"
攻击者入侵后常修改系统文件。文件完整性检查可以帮助发现篡改。
# AIDE (Advanced Intrusion Detection Environment)
apt install aide
# 初始化数据库
aideinit
# 生成 /var/lib/aide/aide.db.new
# 更新数据库
cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db
# 检查文件变更
aide --check
# 更新数据库(检查后)
aide --update
# 配置监控规则 /etc/aide/aide.conf
# 监控关键系统目录
/etc p+i+n+u+g+s+m+c+sha256
/bin p+i+n+u+g+s+m+c+sha256
/sbin p+i+n+u+g+s+m+c+sha256
# 忽略日志变化
/var/log p+n+u+g
# 查看变更报告
aide --check | grep -i "changed\|added\|removed"
# 禁用root直接登录
passwd -l root
# 检查空密码账户
awk -F: '($2 == "" || $2 == "!") {print $1}' /etc/shadow
# 检查UID=0的账户(应该只有root)
awk -F: '($3 == 0) {print $1}' /etc/passwd
# 禁用不必要的账户
usermod -L daemon
usermod -s /sbin/nologin nobody
# 检查可登录账户
grep -v '/nologin\|/false' /etc/passwd
# 关键文件权限设置
chmod 600 /etc/shadow # 仅root可读写
chmod 644 /etc/passwd # root写,所有人读
chmod 600 /etc/ssh/sshd_config # SSH配置仅root可读写
chmod 700 /root # root家目录
chmod 1777 /tmp # sticky bit
# 查找世界可写文件
find / -xdev -type f -perm -0002 2>/dev/null
# 查找无主文件
find / -xdev \( -nouser -o -nogroup \) -print 2>/dev/null
# 查找SUID/SGID文件(安全审计)
find / -xdev \( -perm -4000 -o -perm -2000 \) -type f -exec ls -ld {} \;
# umask决定新文件的默认权限
umask # 查看当前umask
# 0022 → 新文件: 644, 新目录: 755
# 0027 → 新文件: 640, 新目录: 750 (更安全)
# 0077 → 新文件: 600, 新目录: 700 (最严格)
# 设置更安全的umask
echo "umask 027" >> /etc/profile
echo "umask 027" >> /etc/bash.bashrc
/etc/shadow比/etc/passwd更安全?如果shadow文件权限设置错误会有什么后果?command)?如何绕过?-rwsr-xr-x root root,普通用户执行它会获得什么权限?