stolen's blog

逆风的方向,更适合飞翔

用户管理

用户相关文件

文件 说明
/etc/passwd 用户账户信息
/etc/shadow 用户密码(加密)
/etc/group 组信息
/etc/gshadow 组密码
/etc/login.defs 用户账号限制默认值
/etc/default/useradd 用户创建默认配置

/etc/passwd 格式(7 个字段,冒号分隔):

text
1
用户名:密码占位符:UID:GID: 描述:家目录:登录 shell

示例:root:x:0:0:root:/root:/bin/bash

/etc/shadow 格式(9 个字段,冒号分隔):

text
1
用户名:加密密码:最后修改时间:最小间隔:最大天数:警告天数:宽限天数:失效日期:保留

创建用户

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
27
28
29
# 基本创建(使用默认配置)
sudo useradd username

# 指定家目录
sudo useradd -d /home/custom username

# 指定 UID
sudo useradd -u 1001 username

# 指定主组
sudo useradd -g groupname username

# 指定附加组
sudo useradd -G group1,group2 username

# 指定 shell
sudo useradd -s /bin/zsh username

# 创建时不创建家目录
sudo useradd -M username

# 创建系统用户(UID < 1000)
sudo useradd -r username

# 创建时设置注释信息
sudo useradd -c "Full Name,Dept" username

# 交互式创建(更友好)
sudo adduser username # Debian/Ubuntu

修改用户

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
27
28
29
30
31
32
# 修改用户名
sudo usermod -l newname oldname

# 修改 UID
sudo usermod -u 1002 username

# 修改家目录
sudo usermod -d /new/home username
sudo usermod -d /new/home -m username # 同时移动文件

# 修改主组
sudo usermod -g newgroup username

# 修改附加组(覆盖)
sudo usermod -G group1,group2 username

# 添加附加组(追加)
sudo usermod -aG groupname username

# 修改 shell
sudo usermod -s /bin/bash username

# 锁定用户
sudo usermod -L username

# 解锁用户
sudo usermod -U username

# 设置密码过期
sudo chage -E 2026-12-31 username # 账号过期
sudo chage -M 90 username # 密码 90 天过期
sudo chage -m 7 username # 7 天内不可改密码

删除用户

1
2
3
4
5
6
7
8
# 删除用户(保留家目录)
sudo userdel username

# 删除用户及家目录
sudo userdel -r username

# 强制删除用户及家目录
sudo userdel -r -f username

查看用户信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 查看用户信息
id username
id -u username # 仅 UID
id -g username # 仅 GID
id -G username # 所有组

# 查看用户详细信息
finger username

# 查看用户所属组
groups username

# 查看当前用户
whoami
who am i

# 查看用户密码信息
sudo grep username /etc/shadow
sudo chage -l username # 密码过期信息

# 查看最后登录
last username
lastlog -u username

切换用户

1
2
3
4
5
6
7
8
9
10
11
# 切换用户
su username

# 切换用户并加载环境变量
su - username

# 以 root 执行命令
su -c "command"

# 退出当前 shell
exit

组管理

创建组

1
2
3
4
5
6
7
8
# 基本创建
sudo groupadd groupname

# 指定 GID
sudo groupadd -g 1001 groupname

# 创建系统组
sudo groupadd -r groupname

修改组

1
2
3
4
5
# 修改组名
sudo groupmod -n newname oldname

# 修改 GID
sudo groupmod -g 1002 groupname

删除组

1
2
3
4
5
# 删除组
sudo groupdel groupname

# 强制删除(即使为某用户主组)
sudo groupdel -f groupname

组操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 添加用户到组
sudo usermod -aG groupname username
sudo gpasswd -a username groupname

# 从组中移除用户
sudo gpasswd -d username groupname

# 设置组管理员
sudo gpasswd -A user1,user2 groupname

# 设置组成员(覆盖现有成员)
sudo gpasswd -M user1,user2,user3 groupname

# 查看组信息
getent group groupname
grep groupname /etc/group

# 查看组所有成员
members groupname # 需安装 libnss-extrausers

文件权限

权限基础

Linux 权限分为三类用户:

  • u (user/owner): 文件所有者
  • g (group): 文件所属组
  • o (other): 其他用户

三种基本权限:

权限 字母 数字 文件含义 目录含义
r 4 查看内容 列出目录内容
w 2 修改内容 创建/删除文件
执行 x 1 执行程序 进入目录

查看权限

1
2
3
4
5
6
7
8
9
10
11
# 详细列表
ls -l file
ls -la # 包含隐藏文件
ls -ld dir # 查看目录本身而非内容

# 权限说明
# -rwxr-xr-- 表示:
# - : 普通文件 (d=目录,l=链接)
# rwx : 所有者权限
# r-x : 组权限
# r-- : 其他用户权限

修改权限(chmod)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 符号模式
chmod u+x file # 给所有者添加执行权限
chmod g-w file # 移除组写权限
chmod o=r file # 设置其他用户只有读权限
chmod a+x file # 给所有人添加执行权限
chmod u+x,g+rx,o+r file # 组合设置
chmod -R u+rwx dir # 递归设置

# 数字模式
chmod 755 file # rwxr-xr-x
chmod 644 file # rw-r--r--
chmod 700 file # rwx------
chmod 4755 file # 带 setuid
chmod 6755 file # 带 setuid+setgid

修改所有者(chown)

1
2
3
4
5
6
7
8
9
10
11
12
13
# 修改所有者
sudo chown username file

# 修改所有者和组
sudo chown username:groupname file
sudo chown username:group file

# 仅修改组
sudo chgrp groupname file
sudo chown :groupname file

# 递归修改
sudo chown -R username:group dir

常用权限组合

场景 权限 命令
私钥文件 600 chmod 600 id_rsa
公钥/脚本 644/755 chmod 644 file
网站目录 755/644 chmod -R 755 /var/www
上传目录 777 chmod 777 uploads
家目录 700 chmod 700 ~
敏感配置 600 chmod 600 .ssh/config

特殊权限

SUID (Set UID)

当可执行文件设置了 SUID 位时,用户执行该文件时将以文件所有者的身份运行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 查看 SUID 文件
find / -perm -4000 2>/dev/null

# 设置 SUID
chmod u+s file
chmod 4755 file

# 移除 SUID
chmod u-s file
chmod 0755 file

# 常见 SUID 程序
/usr/bin/passwd
/usr/bin/sudo
/usr/bin/su

SGID (Set GID)

  • 对文件:执行时以文件所属组身份运行
  • 对目录:目录中创建的文件继承目录的组
1
2
3
4
5
6
7
8
9
10
11
# 查看 SGID 文件
find / -perm -2000 2>/dev/null

# 设置 SGID
chmod g+s file
chmod 2755 file

# 目录 SGID(协作目录)
mkdir /shared
chmod 2775 /shared
# 在此目录创建的文件自动继承 shared 组

Sticky Bit (粘滞位)

通常用于公共目录,用户只能删除自己创建的文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 查看粘滞位目录
ls -ld /tmp
# drwxrwxrwt ... /tmp

# 设置粘滞位
chmod +t dir
chmod 1777 dir

# 移除粘滞位
chmod -t dir
chmod 0777 dir

# 典型应用:/tmp 目录

特殊权限速查

权限 符号 数字位 设置命令
SUID s/S 4 chmod u+s / chmod 4xxx
SGID s/S 2 chmod g+s / chmod 2xxx
Sticky t/T 1 chmod +t / chmod 1xxx

注意:小写 s/t 表示有执行权限,大写 S/T 表示无执行权限


访问控制列表 ACL

ACL 提供更细粒度的权限控制,可针对特定用户/组设置权限。

ACL 基本操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 查看 ACL
getfacl file

# 设置用户 ACL
setfacl -m u:username:rw file
setfacl -m u:username:rwx file

# 设置组 ACL
setfacl -m g:groupname:rx file

# 设置默认 ACL(目录中新文件继承)
setfacl -d -m u:username:rw dir
setfacl -d -m g:groupname:rx dir

# 删除 ACL
setfacl -x u:username file
setfacl -b file # 删除所有 ACL

# 递归设置
setfacl -R -m u:username:rw dir

ACL 权限掩码

1
2
3
4
5
# 设置掩码(限制最大权限)
setfacl -m m::rx file

# 查看有效权限
getfacl file | grep mask

ACL 示例

1
2
3
4
5
6
# 项目协作目录
mkdir /project
setfacl -m g:devteam:rwx /project
setfacl -m u:manager:rwx /project
setfacl -d -m g:devteam:rx /project
setfacl -d -m u:manager:rw /project

sudo 权限配置

sudoers 文件

/etc/sudoers 文件控制 sudo 权限,必须使用 visudo 编辑

1
2
3
4
5
# 安全编辑
sudo visudo

# 使用指定编辑器
sudo EDITOR=vim visudo

sudoers 语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 格式
用户名/组 主机=(目标用户) 命令

# 允许用户执行所有命令
username ALL=(ALL) ALL

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

# 允许执行特定命令
username ALL=(ALL) /usr/bin/systemctl, /usr/bin/journalctl

# 允许无密码执行
username ALL=(ALL) NOPASSWD: ALL
username ALL=(ALL) NOPASSWD: /usr/bin/apt

# 限制命令参数
username ALL=(ALL) /usr/bin/docker exec mycontainer *

# 别名定义
User_Alias ADMINS = alice, bob
Cmnd_Alias SERVICES = /usr/bin/systemctl, /usr/bin/service
ADMINS ALL=(ALL) SERVICES

常用配置示例

1
2
3
4
5
6
7
8
9
10
# /etc/sudoers.d/deploy
# 部署用户可重启服务
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart mysql

# 开发团队可查看所有日志
%developers ALL=(ALL) NOPASSWD: /usr/bin/journalctl

# DBA 可操作数据库
%dba ALL=(ALL) NOPASSWD: /usr/bin/mysql, /usr/bin/mysqldump

sudo 使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 以 root 执行
sudo command

# 以指定用户执行
sudo -u username command

# 获取 root shell
sudo -i
sudo -s

# 查看 sudo 权限
sudo -l
sudo -l -U username

# 清除凭证缓存
sudo -k

用户环境配置

家目录结构

1
2
3
4
5
6
7
8
/home/username/
├── .bashrc # bash 配置
├── .bash_profile # bash 登录配置
├── .profile # 通用登录配置
├── .zshrc # zsh 配置
├── .ssh/ # SSH 密钥和配置
├── .config/ # 应用程序配置
└── ...

环境变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 系统级环境变量
/etc/profile
/etc/environment
/etc/profile.d/*.sh

# 用户级环境变量
~/.bashrc
~/.bash_profile
~/.profile
~/.zshrc

# 查看环境变量
env
printenv
echo $PATH

用户限制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# /etc/security/limits.conf
# 格式:域名 类型 项目 值

# 限制最大进程数
username hard nproc 100

# 限制最大打开文件数
username hard nofile 65535
username soft nofile 65535

# 限制内存使用
username hard as 2097152

# 组限制
@developers hard nproc 200

# 查看当前限制
ulimit -a
ulimit -n # 文件描述符
ulimit -u # 进程数

PAM 配置

1
2
3
4
5
6
7
8
9
10
11
12
# PAM 配置文件位置
/etc/pam.d/

# 常用模块
pam_limits.so # 资源限制
pam_access.so # 访问控制
pam_time.so # 时间限制
pam_listfile.so # 列表检查

# /etc/pam.d/sshd 示例
auth required pam_nologin.so
auth required pam_env.so

实用命令速查

命令 功能
id 显示用户/组 ID
whoami 显示当前用户名
users 显示登录用户
w 显示登录用户及活动
last 显示最后登录记录
lastlog 显示所有用户最后登录
passwd 修改密码
chage 修改密码过期策略
sudo 以其他用户执行命令
su 切换用户
useradd/userdel/usermod 用户管理
groupadd/groupdel/groupmod 组管理
chmod 修改权限
chown 修改所有者
chgrp 修改组
getfacl/setfacl ACL 管理
visudo 编辑 sudoers

安全建议

  1. 最小权限原则:只授予必要的权限
  2. 定期审计:检查 SUID/SGID 文件和高权限账户
  3. 禁用 root 登录:使用 sudo 代替直接 root 登录
  4. 密码策略:设置合理的密码复杂度要求和过期策略
  5. 监控日志:关注 /var/log/auth.log/var/log/secure
  6. 及时清理:删除不需要的用户账户
0%