> Linux用户与权限管理:sudo、用户组详解

为什么不该一直用root

我见过太多人在服务器上一直用root账号。这就像开车不系安全带——大部分时候没事,但出事就是大事。一个误操作rm -rf /,整个服务器就完了。

正确的做法是:创建普通用户,需要提权时用sudo。

用户管理基础

查看用户信息

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# 查看当前用户
$ whoami
root

# 查看用户详细信息
$ id deploy
uid=1000(deploy) gid=1000(deploy) groups=1000(deploy),27(sudo),33(www-data)

# 查看所有用户
$ cat /etc/passwd | awk -F: '{print $1, $3, $7}' | column -t
root      0     /bin/bash
daemon    1     /usr/sbin/nologin
www-data  33    /usr/sbin/nologin
deploy    1000  /bin/bash

# 查看最近登录
$ last -5
deploy   pts/0    192.168.1.100    Mon Feb  8 10:00   still logged in
root     pts/1    192.168.1.100    Mon Feb  8 09:30 - 09:55  (00:25)

/etc/passwd文件格式

1
2
$ grep deploy /etc/passwd
deploy:x:1000:1000:Deploy User:/home/deploy:/bin/bash
字段示例说明
用户名deploy登录名
密码x存在/etc/shadow里
UID1000用户ID
GID1000主组ID
注释Deploy User描述信息
家目录/home/deploy用户主目录
Shell/bin/bash登录Shell

创建和管理用户

创建用户

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# 创建用户(同时创建家目录和设置Shell)
$ sudo useradd -m -s /bin/bash deploy
$ sudo passwd deploy
New password:
Retype new password:
passwd: password updated successfully

# 一步到位(推荐用adduser,更友好)
$ sudo adduser webapp
Adding user 'webapp' ...
Adding new group 'webapp' (1001) ...
Adding new user 'webapp' (1001) with group 'webapp' ...
Creating home directory '/home/webapp' ...
Copying files from '/etc/skel' ...
New password:
Retype new password:
passwd: password updated successfully
Full Name []: Web App User
Room Number []:

修改用户

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 修改用户Shell
$ sudo usermod -s /bin/zsh deploy

# 修改用户家目录
$ sudo usermod -d /opt/deploy -m deploy

# 锁定用户(禁止登录)
$ sudo usermod -L deploy

# 解锁用户
$ sudo usermod -U deploy

# 设置账号过期日期
$ sudo usermod -e 2026-12-31 tempuser

删除用户

1
2
3
4
5
# 删除用户(保留家目录)
$ sudo userdel deploy

# 删除用户及其家目录
$ sudo userdel -r deploy

用户组管理

组的基本操作

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# 查看用户所属的组
$ groups deploy
deploy : deploy sudo www-data docker

# 创建组
$ sudo groupadd developers

# 将用户添加到组(-a 追加,不加会覆盖)
$ sudo usermod -aG developers deploy
$ sudo usermod -aG docker deploy
$ sudo usermod -aG www-data deploy

# 从组中移除用户
$ sudo gpasswd -d deploy developers

# 查看组成员
$ getent group developers
developers:x:1002:deploy,webapp

常用组及其用途

组名用途说明
sudo允许sudo提权Ubuntu
wheel允许sudo提权CentOS
www-dataWeb服务器Nginx/Apache运行用户
dockerDocker无需sudo使用Docker
adm系统日志可读取部分系统日志

sudo配置

赋予sudo权限

1
2
3
4
5
6
7
# 方法1:加入sudo组(推荐)
$ sudo usermod -aG sudo deploy

# 方法2:编辑sudoers文件
$ sudo visudo
# 添加以下行:
deploy ALL=(ALL:ALL) ALL

sudoers高级配置

1
$ sudo visudo
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 允许deploy用户免密码sudo
deploy ALL=(ALL) NOPASSWD: ALL

# 允许deploy只能执行特定命令
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx, /usr/bin/systemctl restart mysql

# 允许developers组执行所有命令
%developers ALL=(ALL:ALL) ALL

# 允许webadmin组只能管理Nginx
%webadmin ALL=(ALL) NOPASSWD: /usr/bin/systemctl * nginx, /usr/bin/nginx -t

sudo使用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 以root身份执行命令
$ sudo systemctl restart nginx

# 以其他用户身份执行
$ sudo -u www-data whoami
www-data

# 切换到root Shell
$ sudo -i
root@server:~#

# 查看sudo权限
$ sudo -l
User deploy may run the following commands on server:
    (ALL : ALL) ALL

实战:部署用户配置

一个标准的部署用户配置流程:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 1. 创建部署用户
$ sudo adduser deploy

# 2. 赋予sudo权限
$ sudo usermod -aG sudo deploy

# 3. 加入必要的组
$ sudo usermod -aG www-data deploy
$ sudo usermod -aG docker deploy

# 4. 配置SSH密钥登录
$ sudo mkdir -p /home/deploy/.ssh
$ sudo cp ~/.ssh/authorized_keys /home/deploy/.ssh/
$ sudo chown -R deploy:deploy /home/deploy/.ssh
$ sudo chmod 700 /home/deploy/.ssh
$ sudo chmod 600 /home/deploy/.ssh/authorized_keys

# 5. 创建项目目录
$ sudo mkdir -p /var/www/myproject
$ sudo chown deploy:www-data /var/www/myproject
$ sudo chmod 775 /var/www/myproject

# 6. 禁止root直接SSH登录
$ sudo vim /etc/ssh/sshd_config
# PermitRootLogin no
$ sudo systemctl restart sshd

验证:

1
2
3
4
5
6
7
8
# 用deploy用户登录
$ ssh [email protected]
deploy@server:~$ whoami
deploy
deploy@server:~$ sudo whoami
root
deploy@server:~$ docker ps
CONTAINER ID   IMAGE   ...

安全最佳实践

实践说明
禁用root SSH登录PermitRootLogin no
使用密钥登录禁用密码认证
最小权限原则sudo只授权必要的命令
定期审计检查sudo日志
及时清理离职人员立即删除账号
强密码策略安装libpam-pwquality

查看sudo日志

1
2
3
4
5
6
7
# Ubuntu
$ grep sudo /var/log/auth.log | tail -10
Feb  8 10:15:23 server sudo: deploy : TTY=pts/0 ; PWD=/home/deploy ; USER=root ; COMMAND=/usr/bin/systemctl restart nginx
Feb  8 10:20:45 server sudo: deploy : TTY=pts/0 ; PWD=/home/deploy ; USER=root ; COMMAND=/usr/bin/apt update

# CentOS
$ grep sudo /var/log/secure | tail -10

常见问题

deploy is not in the sudoers file

1
2
3
# 用root登录后执行
$ usermod -aG sudo deploy  # Ubuntu
$ usermod -aG wheel deploy  # CentOS

新建文件的默认权限

1
2
3
4
5
6
7
# 查看umask
$ umask
0022  # 新文件默认644,新目录默认755

# 修改umask(在.bashrc中)
$ echo "umask 002" >> /home/deploy/.bashrc
# 现在新文件默认664,同组用户也能写

总结

用户管理的核心就是:不用root日常操作,用sudo提权,最小权限原则。配好一个标准的deploy用户,以后每台服务器照着做就行。

关于文件权限的详细说明,参考Linux文件权限详解。SSH安全配置方面推荐看SSH远程连接完全指南

用户管理 Sudo 用户组 安全
cd ..