为什么不该一直用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里 |
| UID | 1000 | 用户ID |
| GID | 1000 | 主组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-data | Web服务器 | Nginx/Apache运行用户 |
docker | Docker | 无需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
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远程连接完全指南。