跳到主要内容

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)
1000UID
1000GID
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:执行权限
  • -:无权限

数字表示法

权限也可以用数字表示:

权限二进制十进制
---0000
--x0011
-w-0102
-wx0113
r--1004
r-x1015
rw-1106
rwx1117

常用权限组合

数字权限说明
755rwxr-xr-x可执行程序、目录
644rw-r--r--普通文件
600rw-------敏感文件(如密钥)
700rwx------私有目录
777rwxrwxrwx所有人可读写执行(不推荐)

解释

  • 数字是三个八进制数,分别代表所有者、组、其他人的权限
  • 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

小结

本章我们学习了:

  1. 用户和组的管理(useradd、usermod、userdel、passwd)
  2. 组管理(groupadd、groupdel、groupmod、gpasswd)
  3. 文件权限表示(字母和数字方式)
  4. 修改权限(chmod)
  5. 修改所有者(chown、chgrp)
  6. 特殊权限(SUID、SGID、Sticky Bit)
  7. sudo 配置
  8. umask 设置

练习

  1. 创建一个新用户,设置密码,并加入 sudo 组
  2. 创建一个目录,设置权限为 755
  3. 创建一个只有所有者能访问的私有目录
  4. 配置一个共享目录,让组成员可以协作
  5. 查看 /usr/bin/passwd 的权限,解释为什么需要 SUID
  6. 设置 umask 为 077,创建文件查看权限