引言:为什么用户管理很重要?

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 特殊权限数字表示

权限数值显示适用对象
SUID4s(所有者执行位置)可执行文件
SGID2s(组执行位置)文件/目录
Sticky1t(其他执行位置)目录

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篇将介绍软件包管理与服务运营