Linux 权限管理
Linux 是多用户操作系统,权限管理是其核心安全机制。本章将介绍用户、组和文件权限的管理。
用户和组
用户概念
Linux 系统中每个用户都有一个唯一的用户 ID(UID):
- root 用户:UID 为 0,拥有最高权限
- 系统用户:UID 1-999,运行系统服务
- 普通用户:UID 1000+,日常使用
用户管理命令
useradd - 创建用户
useradd username # 创建用户
useradd -m username # 创建用户并创建主目录
useradd -m -s /bin/bash username # 指定登录 Shell
useradd -m -G sudo,docker username # 指定附加组
useradd -u 2000 username # 指定 UID
解释:
-m:创建用户主目录(/home/username)-s:指定用户的登录 Shell-G:指定用户加入的附加组-u:指定用户 ID
userdel - 删除用户
userdel username # 删除用户(保留主目录)
userdel -r username # 删除用户及其主目录
usermod - 修改用户
usermod -l newname oldname # 修改用户名
usermod -d /new/home username # 修改主目录
usermod -s /bin/zsh username # 修改登录 Shell
usermod -G group1,group2 user # 修改附加组
usermod -aG docker username # 添加附加组(不覆盖)
usermod -L username # 锁定用户
usermod -U username # 解锁用户
passwd - 管理密码
passwd # 修改当前用户密码
passwd username # 修改指定用户密码(需要 root)
passwd -l username # 锁定用户密码
passwd -u username # 解锁用户密码
passwd -d username # 删除用户密码
passwd -e username # 强制用户下次登录时修改密码
组管理命令
groupadd - 创建组
groupadd groupname # 创建组
groupadd -g 2000 groupname # 指定 GID
groupdel - 删除组
groupdel groupname
groupmod - 修改组
groupmod -n newname oldname # 修改组名
groupmod -g 3000 groupname # 修改 GID
gpasswd - 管理组成员
gpasswd -a username groupname # 添加用户到组
gpasswd -d username groupname # 从组中移除用户
gpasswd -A admin groupname # 设置组管理员
查看用户和组信息
id # 显示当前用户信息
id username # 显示指定用户信息
# uid=1000(user) gid=1000(user) groups=1000(user),27(sudo),999(docker)
whoami # 显示当前用户名
who # 显示已登录用户
w # 显示登录用户及其活动
groups # 显示当前用户所属组
groups username # 显示指定用户所属组
cat /etc/passwd # 查看所有用户
cat /etc/group # 查看所有组
/etc/passwd 文件格式:
username:x:1000:1000:User Name:/home/user:/bin/bash
| 字段 | 含义 |
|---|---|
| username | 用户名 |
| x | 密码占位符(实际密码在 /etc/shadow) |
| 1000 | UID |
| 1000 | GID |
| User Name | 用户描述 |
| /home/user | 主目录 |
| /bin/bash | 登录 Shell |
文件权限
权限表示
每个文件有三组权限:
-rw-r--r-- 1 user group 4096 Mar 15 10:30 file.txt
权限分为三组:
- 所有者(user):文件的所有者
- 所属组(group):文件的所属组
- 其他人(other):其他所有用户
每组三个字符:
r:读取权限w:写入权限x:执行权限-:无权限
数字表示法
权限也可以用数字表示:
| 权限 | 二进制 | 十进制 |
|---|---|---|
| --- | 000 | 0 |
| --x | 001 | 1 |
| -w- | 010 | 2 |
| -wx | 011 | 3 |
| r-- | 100 | 4 |
| r-x | 101 | 5 |
| rw- | 110 | 6 |
| rwx | 111 | 7 |
常用权限组合:
| 数字 | 权限 | 说明 |
|---|---|---|
| 755 | rwxr-xr-x | 可执行程序、目录 |
| 644 | rw-r--r-- | 普通文件 |
| 600 | rw------- | 敏感文件(如密钥) |
| 700 | rwx------ | 私有目录 |
| 777 | rwxrwxrwx | 所有人可读写执行(不推荐) |
解释:
- 数字是三个八进制数,分别代表所有者、组、其他人的权限
- 755 = 7(所有者rwx) + 5(组r-x) + 5(其他人r-x)
- 目录需要 x 权限才能进入
chmod - 修改权限
字母方式
chmod u+x file # 所有者添加执行权限
chmod g-w file # 组移除写权限
chmod o=r file # 其他人只读
chmod a+x file # 所有人添加执行权限
chmod u=rwx,g=rx,o=r file # 同时设置三组权限
符号说明:
u:所有者(user)g:所属组(group)o:其他人(other)a:所有人(all)+:添加权限-:移除权限=:设置权限
数字方式
chmod 755 file # 设置权限为 rwxr-xr-x
chmod 644 file # 设置权限为 rw-r--r--
chmod -R 755 dir/ # 递归修改目录权限
chmod 600 ~/.ssh/id_rsa # 私钥文件权限
解释:数字方式更简洁,适合精确设置权限。
chown - 修改所有者
chown user file # 修改所有者
chown user:group file # 修改所有者和所属组
chown :group file # 只修改所属组
chown -R user:group dir/ # 递归修改
chgrp - 修改所属组
chgrp group file # 修改所属组
chgrp -R group dir/ # 递归修改
特殊权限
SUID(Set User ID)
当可执行文件设置了 SUID,执行时以文件所有者的权限运行:
chmod u+s /usr/bin/passwd # 设置 SUID
chmod 4755 file # 数字方式设置 SUID
# 显示为
ls -l /usr/bin/passwd
# -rwsr-xr-x 1 root root ... /usr/bin/passwd
# ↑ s 表示 SUID
解释:passwd 命令需要 SUID,因为普通用户修改密码需要写入 /etc/shadow(root 才能访问)。
SGID(Set Group ID)
对于文件:执行时以文件所属组的权限运行 对于目录:在目录中创建的文件继承目录的组
chmod g+s dir/ # 设置 SGID
chmod 2755 dir/ # 数字方式
# 显示为
ls -ld dir/
# drwxrwsr-x 2 user group ... dir/
# ↑ s 表示 SGID
应用场景:共享目录,多个用户可以在同一目录中协作。
Sticky Bit
对于目录:只有文件所有者才能删除自己的文件
chmod +t /tmp # 设置 Sticky Bit
chmod 1777 /tmp # 数字方式
# 显示为
ls -ld /tmp
# drwxrwxrwt 8 root root ... /tmp
# ↑ t 表示 Sticky Bit
解释:/tmp 目录设置了 Sticky Bit,用户只能删除自己创建的临时文件。
sudo - 以超级用户执行
基本用法
sudo command # 以 root 执行命令
sudo -u user command # 以指定用户执行命令
sudo -i # 切换到 root 用户
sudo su - # 切换到 root 用户(加载环境)
配置 sudo
编辑 sudoers 文件:
sudo visudo # 安全地编辑 sudoers
常用配置:
# 用户执行所有命令
username ALL=(ALL) ALL
# 用户执行特定命令无需密码
username ALL=(ALL) NOPASSWD: /usr/bin/apt, /usr/bin/yum
# 组成员获得 sudo 权限
%sudo ALL=(ALL:ALL) ALL
查看权限
sudo -l # 查看当前用户的 sudo 权限
umask - 默认权限
umask 设置新文件和目录的默认权限:
umask # 查看当前 umask
umask 022 # 设置 umask
计算方式:
- 目录默认权限:777 - umask
- 文件默认权限:666 - umask(无执行权限)
示例(umask = 022):
- 目录权限:777 - 022 = 755(rwxr-xr-x)
- 文件权限:666 - 022 = 644(rw-r--r--)
永久设置:在 ~/.bashrc 中添加:
echo "umask 022" >> ~/.bashrc
实践案例
Web 服务器目录权限
# 设置网站目录所有者
sudo chown -R www-data:www-data /var/www/html
# 设置目录权限
sudo find /var/www/html -type d -exec chmod 755 {} \;
# 设置文件权限
sudo find /var/www/html -type f -exec chmod 644 {} \;
# 上传目录需要写权限
sudo chmod 775 /var/www/html/uploads
SSH 密钥权限
# 私钥必须严格保护
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
# 公钥可以公开
chmod 644 ~/.ssh/id_rsa.pub
chmod 644 ~/.ssh/authorized_keys
共享目录配置
# 创建共享组
sudo groupadd developers
# 添加用户到组
sudo usermod -aG developers user1
sudo usermod -aG developers user2
# 创建共享目录
sudo mkdir /shared
# 设置组所有权和 SGID
sudo chown :developers /shared
sudo chmod 2775 /shared
小结
本章我们学习了:
- 用户和组的管理(useradd、usermod、userdel、passwd)
- 组管理(groupadd、groupdel、groupmod、gpasswd)
- 文件权限表示(字母和数字方式)
- 修改权限(chmod)
- 修改所有者(chown、chgrp)
- 特殊权限(SUID、SGID、Sticky Bit)
- sudo 配置
- umask 设置
练习
- 创建一个新用户,设置密码,并加入 sudo 组
- 创建一个目录,设置权限为 755
- 创建一个只有所有者能访问的私有目录
- 配置一个共享目录,让组成员可以协作
- 查看
/usr/bin/passwd的权限,解释为什么需要 SUID - 设置 umask 为 077,创建文件查看权限