🐧 Linux安全基础 — 权限与用户管理

网络安全的起点:掌握Linux权限体系与用户管理

📖 为什么从Linux开始?

Linux是服务器世界的主宰——全球90%以上的服务器运行Linux,安全工具几乎全部基于Linux。不掌握Linux权限体系,就像不会走路就想跑步。理解文件权限、用户管理和SUID机制是所有安全工作的基础。

Linux安全三要素 ┌─────────────────────────────────────────────┐ │ 🔐 身份认证 (Authentication) │ │ → 你是谁? /etc/passwd, /etc/shadow │ │ │ │ 🛡️ 访问控制 (Authorization) │ │ → 你能做什么? rwx权限, SUID, ACL │ │ │ │ 📋 审计追踪 (Accounting) │ │ → 你做了什么? /var/log, auditd │ └─────────────────────────────────────────────┘

🔐 文件权限详解

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,防止用户互删文件
SUID是双刃剑!攻击者常利用SUID程序提权。定期审计SUID文件,删除不必要的SUID程序。

ACL 访问控制列表

# 传统权限只能设置一组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 与 /etc/shadow

# /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 权限管理

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}"
sudo安全最佳实践:① 使用白名单而非黑名单 ② 避免NOPASSWD ③ 记录sudo日志 ④ 定期审计sudoers配置 ⑤ 禁止sudo执行shell解释器(bash/sh/python/perl)

🔍 文件完整性检查

攻击者入侵后常修改系统文件。文件完整性检查可以帮助发现篡改。

# 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"

🛡️ 安全加固实战

1. 账户安全

# 禁用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

2. 文件权限加固

# 关键文件权限设置
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 {} \;

3. umask设置

# umask决定新文件的默认权限
umask                    # 查看当前umask
# 0022 → 新文件: 644, 新目录: 755
# 0027 → 新文件: 640, 新目录: 750 (更安全)
# 0077 → 新文件: 600, 新目录: 700 (最严格)

# 设置更安全的umask
echo "umask 027" >> /etc/profile
echo "umask 027" >> /etc/bash.bashrc
Linux安全基础 — 你已掌握文件权限体系(rwx/特殊权限/ACL)、用户与组管理、sudo配置、文件完整性检查和安全加固方法!
命令已验证:chmod/chown/useradd/usermod/groupadd/find/awk/passwd/aide — 所有命令在Docker沙箱验证通过
课后思考题:
  1. 为什么/etc/shadow/etc/passwd更安全?如果shadow文件权限设置错误会有什么后果?
  2. SUID程序有哪些安全风险?如何发现恶意的SUID程序?
  3. 为什么sudoers中不应该使用黑名单模式(!command)?如何绕过?
  4. 如果一个文件的权限是-rwsr-xr-x root root,普通用户执行它会获得什么权限?

📚 进阶资源

参考资料:Linux man pages | CIS Benchmark for Linux | NIST SP 800-123 | AIDE Documentation | sudoers(5)