Linux服务器管理完全攻略 第2篇:用户与权限管理
Linux Server Administration Complete Guide Part 2
Linux服务器管理完全攻略系列
第1篇:基础与文件系统 | 第2篇:用户与权限管理(当前)| 第3篇:软件包管理与服务
引言:为什么用户管理很重要?
Linux是一个多用户操作系统。多个用户可以同时访问系统,每个用户都有独特的权限和工作空间。服务器安全的第一道防线就是适当的用户管理和权限设置。
本篇涵盖从用户账户创建到组管理、文件权限设置、特殊权限以及sudo配置——Linux管理员必须掌握的核心内容。
1. 理解用户账户
1.1 用户类型
- root用户:UID 0,拥有系统所有权限的超级用户
- 系统用户:UID 1-999,用于运行服务的账户(nginx、mysql等)
- 普通用户:UID 1000以上,供实际人员使用的账户
1.2 用户信息文件
# /etc/passwd - 用户基本信息
username:x:1000:1000:Full Name:/home/username:/bin/bash
# 字段:用户名:密码占位:UID:GID:描述:主目录:默认shell
# /etc/shadow - 加密密码(仅root可访问)
username:$6$salt$encrypted:19000:0:99999:7:::
# 字段:用户名:加密密码:最后修改日:最小天数:最大天数:警告天数:...
1.3 查看用户信息
# 当前用户
whoami
id
# 特定用户信息
id username
getent passwd username
# 当前登录用户
who
w
2. 用户账户管理
2.1 创建用户
# 基本用户创建
sudo useradd username
# 使用选项创建
sudo useradd -m -d /home/devuser -s /bin/bash -c "Developer Account" devuser
# -m: 创建主目录
# -d: 指定主目录路径
# -s: 指定默认shell
# -c: 注释/描述
# 设置密码
sudo passwd devuser
2.2 修改用户
# 修改用户信息
sudo usermod -c "Updated Comment" username
sudo usermod -s /bin/zsh username # 更改shell
sudo usermod -d /new/home username # 更改主目录
sudo usermod -l newname oldname # 更改用户名
sudo usermod -aG groupname username # 添加到组(-a必须!)
# 锁定/解锁账户
sudo usermod -L username # 锁定
sudo usermod -U username # 解锁
2.3 删除用户
# 仅删除用户(保留主目录)
sudo userdel username
# 删除用户及主目录
sudo userdel -r username
3. 组管理
3.1 理解组
组允许您为多个用户集中管理权限。每个用户有一个主组,可以属于多个附属组。
# /etc/group - 组信息
groupname:x:1000:user1,user2,user3
# 字段:组名:密码:GID:成员列表
3.2 组管理命令
# 创建组
sudo groupadd developers
sudo groupadd -g 2000 devops # 指定GID
# 修改组
sudo groupmod -n newname oldname # 重命名
sudo groupmod -g 2001 groupname # 更改GID
# 删除组
sudo groupdel groupname
# 查看组成员
getent group developers
groups username
3.3 组使用示例
# 创建开发团队组并添加用户
sudo groupadd developers
sudo usermod -aG developers alice
sudo usermod -aG developers bob
# 设置共享目录
sudo mkdir /srv/project
sudo chgrp developers /srv/project
sudo chmod 2775 /srv/project
4. 文件权限深入
4.1 权限结构回顾
-rwxr-xr-- 1 owner group 1024 Jan 21 10:00 file.txt
│└─┬┘└─┬┘└─┬┘
│ │ │ └── 其他用户(Others):r--(只读)
│ │ └────── 组(Group):r-x(读取、执行)
│ └────────── 所有者(Owner):rwx(读取、写入、执行)
└───────────── 文件类型:-(普通文件)
4.2 chmod - 更改权限
# 数字方式(八进制)
chmod 755 script.sh # rwxr-xr-x
chmod 644 file.txt # rw-r--r--
chmod 700 private/ # rwx------
chmod 777 public/ # rwxrwxrwx(安全起见不推荐)
# 符号方式
chmod u+x script.sh # 给所有者添加执行权限
chmod g-w file.txt # 移除组的写入权限
chmod o=r file.txt # 设置其他用户为只读
chmod a+r file.txt # 给所有人添加读取权限
chmod u=rwx,g=rx,o=r file # 组合设置
# 递归应用
chmod -R 755 directory/
4.3 chown - 更改所有权
# 更改所有者
sudo chown newowner file.txt
# 同时更改所有者和组
sudo chown newowner:newgroup file.txt
# 仅更改组
sudo chown :newgroup file.txt
sudo chgrp newgroup file.txt
# 递归应用
sudo chown -R webuser:www-data /var/www/
5. 特殊权限
5.1 SUID(Set User ID)
设置在可执行文件上时,执行时以文件所有者的权限运行。
# 设置SUID
chmod u+s program
chmod 4755 program
# 示例:passwd命令
ls -l /usr/bin/passwd
# -rwsr-xr-x 1 root root ... /usr/bin/passwd
# 普通用户可以更改自己的密码
5.2 SGID(Set Group ID)
在文件上设置时以组权限运行,在目录上设置时新文件继承目录的组。
# 设置SGID
chmod g+s directory/
chmod 2775 directory/
# 用于团队共享文件夹
sudo mkdir /srv/shared
sudo chgrp developers /srv/shared
sudo chmod 2775 /srv/shared
# 在此创建的所有文件都属于developers组
5.3 Sticky Bit(粘滞位)
在目录上设置时,只有文件所有者可以删除自己的文件。
# 设置Sticky Bit
chmod +t directory/
chmod 1777 directory/
# 示例:/tmp目录
ls -ld /tmp
# drwxrwxrwt 12 root root ... /tmp
# 所有人都可以创建文件,但只能删除自己的文件
5.4 特殊权限数字表示
| 权限 | 数值 | 显示 | 适用对象 |
|---|---|---|---|
| SUID | 4 | s(所有者执行位置) | 可执行文件 |
| SGID | 2 | s(组执行位置) | 文件/目录 |
| Sticky | 1 | t(其他执行位置) | 目录 |
6. sudo配置与管理
6.1 什么是sudo?
sudo(Superuser Do)允许普通用户以管理员权限执行命令。比直接以root登录更安全,所有操作都会被记录日志。
6.2 编辑sudoers文件
# 必须使用visudo(执行语法检查)
sudo visudo
# /etc/sudoers 基本结构
# 用户名 主机=(运行用户) 命令
root ALL=(ALL:ALL) ALL
%sudo ALL=(ALL:ALL) ALL
# 示例:授予devuser sudo权限
devuser ALL=(ALL:ALL) ALL
# 只允许特定命令
webadmin ALL=(ALL) /usr/bin/systemctl restart nginx, /usr/bin/systemctl status nginx
# 允许无密码执行
deploy ALL=(ALL) NOPASSWD: /usr/bin/git pull
6.3 使用sudo组
# Ubuntu/Debian:sudo组
sudo usermod -aG sudo username
# RHEL/CentOS:wheel组
sudo usermod -aG wheel username
# 验证组设置
getent group sudo
getent group wheel
6.4 查看sudo日志
# sudo使用日志
sudo cat /var/log/auth.log | grep sudo # Debian/Ubuntu
sudo cat /var/log/secure | grep sudo # RHEL/CentOS
7. 实战场景
7.1 搭建Web开发团队环境
# 1. 创建组
sudo groupadd webdev
# 2. 创建用户并添加到组
sudo useradd -m -s /bin/bash -G webdev alice
sudo useradd -m -s /bin/bash -G webdev bob
sudo passwd alice
sudo passwd bob
# 3. 设置项目目录
sudo mkdir -p /var/www/project
sudo chown root:webdev /var/www/project
sudo chmod 2775 /var/www/project
# 4. 授予特定sudo权限
sudo visudo
# 添加:%webdev ALL=(ALL) /usr/bin/systemctl restart nginx
7.2 安全审计检查清单
# 查找SUID文件(安全审计)
sudo find / -perm -4000 -type f 2>/dev/null
# 查找没有所有者的文件
sudo find / -nouser -o -nogroup 2>/dev/null
# 查找全局可写文件
sudo find / -perm -0002 -type f 2>/dev/null
# 查找空密码账户
sudo awk -F: '($2 == "") {print $1}' /etc/shadow
8. 常见错误与解决方案
- usermod -G vs usermod -aG:
-aG保留现有组并追加,仅用-G会替换所有组 - chmod 777:绝对不要使用,这是安全漏洞
- 直接编辑/etc/sudoers:必须使用
visudo,语法错误会导致无法访问系统 - 直接使用root账户:推荐使用sudo提升权限,以便记录审计日志
总结
用户和权限管理是Linux服务器安全的基础。适当的用户隔离、应用最小权限原则、通过sudo管理权限是安全服务器运营的必要元素。
下一篇第3篇将介绍软件包管理与服务运营。
系列文章
← 第1篇:基础与文件系统 | 第2篇(当前)| 第3篇:软件包管理与服务 →