Linux用户权限进阶管理

AI 生成

Linux用户权限进阶管理

在Linux系统中,权限管理是系统安全的基础。本文将从基础概念到高级应用,全面介绍Linux的用户、组和文件权限管理。

1. 用户和组基础

1.1 用户类型

Linux系统中有两种主要用户类型:

  • 系统用户:UID通常小于1000,用于运行服务和守护进程
  • 普通用户:UID通常从1000开始,用于日常登录和操作

特殊用户:

  • root用户:超级管理员,UID为0,拥有系统的完全控制权
  • nobody用户:最小权限用户,通常用于运行不需要特殊权限的服务

1.2 用户相关文件

  • /etc/passwd:存储用户账号信息
  • /etc/shadow:存储用户密码信息(加密)
  • /etc/group:存储组信息
  • /etc/gshadow:存储组密码信息
  • /etc/login.defs:用户和组配置的默认值
  • /etc/skel/:新用户主目录的模板目录

1.3 用户管理命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 创建用户
useradd username

# 创建用户并设置主目录、shell等
useradd -m -d /home/username -s /bin/bash -c "Full Name" username

# 设置或修改密码
passwd username

# 修改用户信息
usermod -c "New Full Name" username
usermod -s /bin/zsh username # 更改shell
usermod -L username # 锁定账号
usermod -U username # 解锁账号

# 删除用户
userdel username
userdel -r username # 同时删除用户的主目录

1.4 组管理命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 创建新组
groupadd groupname

# 将用户添加到组
usermod -aG groupname username

# 查看用户所属的组
groups username

# 修改组信息
groupmod -n newname oldname

# 删除组
groupdel groupname

2. 文件权限基础

2.1 基本权限类型

Linux文件有三种基本权限:

  • r (read):读取权限,数值为4
  • w (write):写入权限,数值为2
  • x (execute):执行权限,数值为1

每个文件有三种权限级别:

  • 所有者权限 (user/owner)
  • 组权限 (group)
  • 其他人权限 (others)

2.2 查看文件权限

1
ls -l filename

输出示例:

1
-rwxr-xr-- 1 user group 4096 Jan 1 10:00 filename

权限说明:

  • 第1位:文件类型(-:普通文件,d:目录,l:链接,等)
  • 第2-4位:所有者权限
  • 第5-7位:组权限
  • 第8-10位:其他人权限

2.3 更改文件权限

使用chmod命令更改文件权限:

1
2
3
4
5
6
7
8
# 数字表示法
chmod 750 filename # rwxr-x---

# 符号表示法
chmod u+x filename # 给所有者添加执行权限
chmod g-w filename # 移除组的写入权限
chmod o=r filename # 设置其他人只有读取权限
chmod a+x filename # 给所有人添加执行权限

2.4 更改文件所有者和组

1
2
3
4
5
6
7
8
9
10
11
# 更改所有者
chown username filename

# 更改组
chgrp groupname filename

# 同时更改所有者和组
chown username:groupname filename

# 递归更改目录和其内容
chown -R username:groupname directory

3. 特殊权限

3.1 SUID (Set User ID)

当文件被执行时,进程将以文件所有者的权限运行。

1
2
3
# 设置SUID
chmod u+s filename
chmod 4755 filename # 数字表示法

示例输出:-rwsr-xr-x(所有者执行位显示为s

适用场景:允许普通用户执行需要更高权限的命令,如passwd命令。

3.2 SGID (Set Group ID)

应用于文件:执行时进程将以文件所属组的权限运行。
应用于目录:在该目录中创建的新文件将继承目录的组。

1
2
3
# 设置SGID
chmod g+s directory
chmod 2755 directory # 数字表示法

示例输出:-rwxr-sr-x(组执行位显示为s

适用场景:团队协作目录,确保所有文件属于同一个组。

3.3 Sticky Bit

主要应用于目录。设置后,只有文件所有者、目录所有者或root可以删除或重命名目录中的文件。

1
2
3
# 设置Sticky Bit
chmod +t directory
chmod 1755 directory # 数字表示法

示例输出:-rwxr-xr-t(其他人执行位显示为t

适用场景:共享目录如/tmp,防止用户删除他人的文件。

4. 高级权限控制

4.1 访问控制列表 (ACL)

ACL提供了比传统权限更精细的控制,允许为特定用户或组设置权限。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 安装ACL工具
apt install acl # Debian/Ubuntu
yum install acl # CentOS/RHEL

# 查看文件的ACL
getfacl filename

# 设置用户ACL
setfacl -m u:username:rwx filename

# 设置组ACL
setfacl -m g:groupname:rx filename

# 删除特定ACL
setfacl -x u:username filename

# 递归设置目录ACL
setfacl -R -m u:username:rwx directory

# 设置默认ACL(新创建的文件自动继承)
setfacl -d -m u:username:rwx directory

4.2 chattr和lsattr

chattr命令可以设置文件的特殊属性,如防止删除或修改。

1
2
3
4
5
6
# 设置不可修改属性
chattr +i filename # 文件不能被修改、删除、重命名或链接
chattr +a filename # 只能追加内容,不能删除或修改现有内容

# 查看文件特殊属性
lsattr filename

常用属性:

  • i (immutable):不可变
  • a (append-only):只追加
  • s (secure deletion):安全删除
  • u (undeletable):不可删除

4.3 capabilities

capabilities允许将特定的root权限分配给普通用户程序,而不需要设置SUID位。

1
2
3
4
5
6
7
8
9
10
11
12
# 安装capabilities工具
apt install libcap2-bin # Debian/Ubuntu
yum install libcap # CentOS/RHEL

# 查看文件capabilities
getcap /path/to/file

# 设置capabilities
setcap cap_net_raw+ep /path/to/program

# 删除capabilities
setcap -r /path/to/program

常用capabilities:

  • cap_net_raw:允许使用原始套接字
  • cap_net_bind_service:允许绑定小于1024的端口
  • cap_sys_ptrace:允许调试程序
  • cap_sys_admin:允许执行系统管理操作

5. 用户权限的高级应用

5.1 sudo配置

sudo允许普通用户以root或其他用户身份执行命令。

基本配置(通过visudo编辑/etc/sudoers):

1
2
3
4
5
6
7
8
9
10
11
# 允许用户执行所有命令
username ALL=(ALL) ALL

# 允许用户无需密码执行所有命令
username ALL=(ALL) NOPASSWD: ALL

# 限制用户只能执行特定命令
username ALL=(ALL) /bin/ls, /usr/bin/apt

# 允许组内所有用户执行命令
%admin ALL=(ALL) ALL

更高级的sudo配置:

1
2
3
4
5
6
7
8
9
10
11
12
# 限制环境变量
Defaults env_reset
Defaults env_keep="HOME PATH"

# 锁定特定终端
Defaults requiretty

# 密码尝试次数
Defaults passwd_tries=3

# 密码锁定时间
Defaults passwd_timeout=5

5.2 RBAC(基于角色的访问控制)

通过AppArmor或SELinux实现更复杂的RBAC策略。

AppArmor (Ubuntu)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 检查状态
aa-status

# 编辑配置文件
vim /etc/apparmor.d/usr.bin.example

# 配置示例
profile example /usr/bin/example {
/etc/example.conf r,
/var/log/example.log w,
deny /etc/shadow r,
}

# 重新加载配置
apparmor_parser -r /etc/apparmor.d/usr.bin.example

SELinux (CentOS/RHEL)

1
2
3
4
5
6
7
8
9
10
11
# 检查状态
sestatus

# 设置文件上下文
chcon -t httpd_sys_content_t /var/www/html/file.html

# 创建策略模块
audit2allow -M mymodule -i /var/log/audit/audit.log

# 加载策略模块
semodule -i mymodule.pp

5.3 PAM (Pluggable Authentication Modules)

PAM允许自定义认证机制。

PAM配置示例(/etc/pam.d/common-auth):

1
2
3
4
5
# 设置密码尝试次数
auth required pam_tally2.so deny=5 unlock_time=300

# 设置密码复杂度要求
password required pam_pwquality.so retry=3 minlen=8 difok=3

常用PAM模块:

  • pam_unix:传统Unix密码验证
  • pam_ldap:LDAP验证
  • pam_google_authenticator:双因素验证
  • pam_limits:资源限制控制

6. 文件系统权限

6.1 文件系统挂载选项

通过挂载选项控制文件系统权限:

1
2
3
4
5
6
7
8
# 挂载分区并禁止执行程序
mount -o noexec /dev/sdb1 /mnt/data

# 禁止设置SUID位
mount -o nosuid /dev/sdb1 /mnt/data

# 禁止设置设备文件
mount -o nodev /dev/sdb1 /mnt/data

修改/etc/fstab使配置永久生效:

1
/dev/sdb1 /mnt/data ext4 defaults,noexec,nosuid,nodev 0 0

6.2 文件系统加密

使用LUKS加密敏感分区:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 创建加密容器
cryptsetup luksFormat /dev/sdb1

# 打开加密设备
cryptsetup luksOpen /dev/sdb1 encrypted_data

# 创建文件系统
mkfs.ext4 /dev/mapper/encrypted_data

# 挂载
mount /dev/mapper/encrypted_data /mnt/secure

# 关闭
umount /mnt/secure
cryptsetup luksClose encrypted_data

7. 实用技巧和最佳实践

7.1 查找特殊权限文件

查找系统中设置了SUID的文件:

1
find / -type f -perm -4000 -ls 2>/dev/null

查找设置了SGID的文件:

1
find / -type f -perm -2000 -ls 2>/dev/null

查找设置了Sticky Bit的目录:

1
find / -type d -perm -1000 -ls 2>/dev/null

7.2 恢复错误的权限设置

如果不小心更改了系统文件的权限,可能导致系统问题。以下是一些恢复命令:

1
2
3
4
5
6
7
8
9
10
11
12
# 恢复/bin目录的默认权限
chmod 755 /bin
chmod 755 /bin/*

# 恢复sudoers文件
pkexec chmod 440 /etc/sudoers

# 恢复SSH密钥权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
chmod 644 ~/.ssh/authorized_keys

7.3 最佳安全实践

  1. 最小权限原则:授予完成任务所需的最小权限

    1
    2
    # 创建专用服务用户,不赋予登录shell
    useradd -r -s /usr/sbin/nologin servicename
  2. 限制SUID文件:定期审查并限制SUID文件数量

    1
    2
    # 移除不必要的SUID权限
    chmod u-s /path/to/program
  3. 设置正确的umask:控制新创建文件的默认权限

    1
    2
    # 在/etc/profile或~/.bashrc设置
    umask 027 # 新文件权限为750
  4. 定期安全审计

    1
    2
    3
    4
    5
    # 查找世界可写的文件
    find / -type f -perm -o+w -not -path "/proc/*" -ls 2>/dev/null

    # 查找无主文件
    find / -nouser -o -nogroup -ls 2>/dev/null

总结

Linux权限系统设计精巧而强大,从基本的读/写/执行权限到高级的ACL、capabilities和强制访问控制,提供了全面的安全保障。掌握这些知识对于维护服务器安全、保护敏感数据和实现多用户协作至关重要。

记住,权限管理是一个平衡的艺术—既要确保安全性,又要保持系统的可用性和灵活性。通过定期审计和持续改进,可以构建一个既安全又实用的Linux系统。