Linux(二)用户和文件权限

Linux(二)用户和文件权限

1.用户和用户组

一、用户(User)

什么是liunx用户 :本质就是可以登录系统并使用系统资源(如运行程序、操作文件)的实体。使用操作系统的人都是用户。

作用

  • 身份标识: 区分不同的使用者(如 alice, bob, www-data, mysql)。

  • 权限控制: 每个文件和进程都有“所有者”。文件的所有者决定了谁可以修改该文件的权限或删除它。进程的运行身份决定了它能访问哪些资源。

  • 资源隔离: 确保不同用户的数据和操作环境相对独立和安全。

  • 审计: 系统日志可以记录哪个用户执行了特定操作。

类型

  • 超级用户(root):UID为0,拥有系统级最高权限,可执行所有操作(如修改系统配置、访问任意文件)
  • 系统用户(伪用户):UID范围通常为1-999(不同系统可能略有差异),用于运行系统服务(如bindaemon),默认无法登录
  • 普通用户:UID≥1000,由管理员创建,权限受限,仅能访问授权资源

二、用户组(Group)

什么是Linux 用户组 :一组用户的集合。它是一种逻辑分组机制,用于简化权限管理。用户组就是是具有相同系统权限的一组用户

作用

  • 简化权限分配:简化权限管理,允许将相同权限批量分配给组内成员,而非逐个用户设置。

类型

  • 基本组(私有组):用户创建时自动生成,与用户名相同,每个用户仅有一个基本组。
  • 附加组(公有组):用户可加入多个附加组,继承组内权限(如sudo组允许执行管理员命令)

用户与组的关系:

  • 主组 (Primary Group): 每个用户必须属于一个主组。用户创建文件时,文件的“属组”默认就是用户的主组。用户的主组信息存储在 /etc/passwd 中。
  • 附加组 (Supplementary Groups): 一个用户可以同时属于零个或多个附加组。用户获得这些附加组所拥有的权限。附加组成员关系存储在 /etc/group 文件中。
  • 总结: 用户和组的关系是多对多的。一个用户可以属于多个组;一个组可以包含多个用户。

2 配置文件

2.1 /etc/group - 用户组信息库

# 查看 /etc/group
[root@lavm-zo7f3xq5c6 ~]# cat /etc/group
# group_name:password:GID:user_list
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
lp:x:7:
mem:x:8:
kmem:x:9:
wheel:x:10:
cdrom:x:11:
mail:x:12:postfix
man:x:15:
dialout:x:18:
floppy:x:19:
games:x:20:
tape:x:33:
video:x:39:
ftp:x:50:
lock:x:54:
audio:x:63:
nobody:x:99:
users:x:100:
utmp:x:22:
utempter:x:35:
input:x:999:
systemd-journal:x:190:
systemd-network:x:192:
dbus:x:81:
polkitd:x:998:
ssh_keys:x:997:
sshd:x:74:
postdrop:x:90:
postfix:x:89:
chrony:x:996:
jd:x:1000:jd
nscd:x:28:
ntp:x:38:
cgred:x:995:
docker:x:994:

字段说明

字段 说明
group_name 用户组名称(如 sudo, dev
password 历史遗留字段(通常为 x 或空),真实密码存储在 /etc/gshadow
GID 用户组的唯一数字 ID(系统组:1-999,普通组:≥1000)
user_list 属于该组的附加成员列表(逗号分隔),不包含以该组为主组的用户
  • root 组编号为 0

  • 1-499系统预留的编号 预留给安装的软件和服务的

  • 用户手动创建的用户组从500开始

  • 组密码占位符都是x

  • 如果组内只有一个用户,而且用户名和组名相同的话,是可以省略用户名的

2.2 /etc/gshadow - 用户组加密信息

[root@lavm-zo7f3xq5c6 ~]# cat /etc/gshadow
# group_name:encrypted_password:admins:members
root:::
bin:::
daemon:::
sys:::
adm:::
tty:::
disk:::
lp:::
mem:::
kmem:::
wheel:::
cdrom:::
mail:::postfix
man:::
dialout:::
floppy:::
games:::
tape:::
video:::
ftp:::
lock:::
audio:::
nobody:::
users:::
utmp:!::
utempter:!::
input:!::
systemd-journal:!::
systemd-network:!::
dbus:!::
polkitd:!::
ssh_keys:!::
sshd:!::
postdrop:!::
postfix:!::
chrony:!::
jd:!!::jd
nscd:!::
ntp:!::
cgred:!::
docker:!::

字段说明

字段 说明
group_name 用户组名称(与 /etc/group 对应)
encrypted_password 组密码(加密后),用于非成员用户临时加入该组(newgrp 命令)*为空
admins 组管理员列表(逗号分隔),可添加/删除组成员
members 组成员列表(逗号分隔),覆盖 /etc/group 中的成员
  • 存放当前系统中用户组的密码信息

  • /etc/group中的记录一一对应

2.3 /etc/passwd - 用户账户信息文件

[root@lavm-zo7f3xq5c6 ~]# cat /etc/passwd
# username:password:UID:GID:GECOS:home_dir:shell
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin

字段说明

字段 说明
username 用户登录名(如 root, alice
password 密码占位符x 表示真实密码在 /etc/shadow
UID 用户唯一数字 ID(0=root, 系统用户:1-999, 普通用户:≥1000)
GID 用户的主组 ID(对应 /etc/group 中的 GID)
GECOS 用户备注信息(如全名、电话,逗号分隔)
home_dir 用户主目录路径(如 /home/alice
shell 用户默认 Shell(如 /bin/bash, /usr/sbin/nologin
  • 存储当前系统中所有用户的信息

2.4 /etc/shadow - 用户安全信息文件

 cat /etc/shadow
# username:encrypted_password:lastchg:min:max:warn:inactive:expire:reserved 
root:$6$KRlxyfFB$jw.j4L6boxyU3QulNeVOI4KycxRd0fQ2.NMBMP69/Lz1/Uk0MTJGuNi.HPpVbt1q1OjdvWdoZkCxjHBTIr7l10:20238:0:99999:7:::
bin:*:17834:0:99999:7:::
daemon:*:17834:0:99999:7:::
adm:*:17834:0:99999:7:::
lp:*:17834:0:99999:7:::
sync:*:17834:0:99999:7:::
shutdown:*:17834:0:99999:7:::
halt:*:17834:0:99999:7:::
mail:*:17834:0:99999:7:::
operator:*:17834:0:99999:7:::
games:*:17834:0:99999:7:::
ftp:*:17834:0:99999:7:::
nobody:*:17834:0:99999:7:::
systemd-network:!!:17942::::::
dbus:!!:17942::::::
polkitd:!!:17942::::::
sshd:!!:17942::::::
postfix:!!:17942::::::
chrony:!!:17942::::::
nscd:!!:17942::::::
ntp:!!:18058::::::

关键字段说明

字段 说明
username 用户登录名(与 /etc/passwd 对应)
encrypted_password 加密后的密码(格式:$id$salt$hash,如 $6$abc... 表示 SHA-512)
lastchg 上次修改密码的天数(从 1970-01-01 起)
min 密码最小使用天数(0=可随时修改)
max 密码最大有效期(99999=永不过期)
warn 密码到期前警告天数(7=提前7天警告)
inactive 密码过期后账户宽限天数(到期后仍可登录,超时则锁定)
expire 账户绝对过期日期(从 1970-01-01 起的天数,空=永不过期)
  • 存放当前系统中所有用户的密码信息

3. 用户命令

命令 作用 常用参数 示例
whoami 显示当前用户名 whoamiroot
id 显示用户身份信息 -u(UID), -g(GID) id alice → UID=1001, GID=1001
su 切换用户身份 - (加载环境变量) su - alice → 切换到alice用户
sudo 以超级用户权限执行命令 -i (登录shell) sudo apt update → root权限更新
passwd 修改用户密码 -l (锁定), -u (解锁) passwd alice → 修改alice的密码
groups 显示用户所属组 groups bobbob : sudo dev
last 显示用户登录历史 -n (行数) last alice → alice的登录记录

1. 显示登录的用户名

[root@lavm-zo7f3xq5c6 ~]# whoami
root

2. 显示用户身份信息

[root@lavm-zo7f3xq5c6 ~]# id root
uid=0(root) gid=0(root) 组=0(root)

3. 切换用户

su - alice  # 切换到 alice 用户并加载其环境
Password:   # 输入 alice 的密码
alice@host:~$ 

4. 以超级用户权限执行命令

# 查看系统日志
sudo tail -f /var/log/syslog

5. 显示用户所属组

[root@lavm-zo7f3xq5c6 ~]# groups root
root : root

6. 显示用户登录历史

[root@lavm-zo7f3xq5c6 ~]# last
root     pts/1        173.41.142.189   Mon Jun  9 11:22   still logged in   
root     pts/0        173.41.143.189   Mon Jun  9 11:22   still logged in  

4. 用户和用户组操作

4.1 添加用户组

# 语法
groupadd [选项] 组名
# 选项
#  -g GID: 指定组ID (默认自动分配)
# -r: 创建系统组 (GID < 1000)
#示例
groupadd developers        # 创建普通组
groupadd -g 1500 testers   # 创建指定GID的组
groupadd -r apache         # 创建系统组

# 使用
groupadd developers 
# 查看
[root@lavm-zo7f3xq5c6 ~]# cat /etc/group | grep developers
developers:x:1001:

4.2 修改用户组名称

# 语法
groupmod -n 新组名 旧组名
# 示例
groupmod -n dev-team developers  # 重命名组
# 查看 
[root@lavm-zo7f3xq5c6 ~]# cat /etc/group | grep dev-team
dev-team:x:1001:

4.3 修改用户组编号

# 语法
groupmod -g 新GID 组名
# 示例
groupmod -g 2000 dev-team  # 修改组ID

# 查看
[root@lavm-zo7f3xq5c6 ~]# cat /etc/group | grep dev-team
dev-team:x:2000:

4.4 创建分组并指定编号

# 语法
groupadd -g 指定GID 组名

# 示例
groupadd -g 3000 qa-team  # 创建GID=3000的组
# 查看
[root@lavm-zo7f3xq5c6 ~]# cat /etc/group | grep qa-team
qa-team:x:3000:

4.5 删除用户组

# 语法
groupdel 组名
# 不能删除用户的主组
# 示例
groupdel qa-team  # 删除组

4.6 添加用户

#语法
useradd [选项] 用户名
选项 作用 示例值
-d 指定主目录 /home/alice
-g 指定主组 developers
-G 指定附加组 sudo,www-data
-s 指定登录Shell /bin/bash
-u 指定UID 1500
-m 创建主目录 (无参数值)
-r 创建系统用户 (无参数值)
# 示例 
useradd -g dev-team zhangsan  #创建用户并指定用户组
# 查看
[root@lavm-zo7f3xq5c6 ~]# id zhangsan
uid=1000(zhangsan) gid=2000(dev-team) 组=2000(dev-team)

4.7 指定个人文件夹

#语法
usermod -d 新目录 -m 用户名  # -m移动现有文件
  # 创建用户并指定家目录
useradd -d /home/wangwu wangwu 

# 指定wangwu2
usermod -d /home/wangwu2 wangwu

4.8 修改用户组

#语法
usermod [选项] 用户名
操作 命令格式
修改主组 usermod -g 新主组 用户名
替换所有附加组 usermod -G 组1,组2 用户名
追加附加组 usermod -aG 追加组 用户名
修改UID usermod -u 新UID 用户名
usermod -g dev-team alice          # 修改主组
usermod -G docker,nginx alice      # 替换附加组
usermod -aG sudo alice             # 追加sudo组
usermod -u 2001 alice              # 修改UID

4.9 删除用户

# 语法
userdel [选项] 用户名
# 选项
# -r: 同时删除主目录和邮件
# -f: 强制删除(即使已登录)
userdel -r alice  # 完全删除用户及目录

5 .文件权限

[root@lavm-zo7f3xq5c6 /]# ll
总用量 16
lrwxrwxrwx.   1 root root    7 2月  15 2019 bin -> usr/bin
dr-xr-xr-x.   5 root root 4096 5月  30 16:03 boot
drwxr-xr-x   19 root root 3000 5月  30 16:06 dev
drwxr-xr-x.  79 root root 8192 6月   9 16:17 etc
drwxr-xr-x.   5 root root   46 6月   9 15:31 home
-rw-------    1 root root 327059968 6月   1 14:06 net-tools-image.tar

# 权限结构解析
-rwxr-xr-- 1 user group 4096 Jan 1 10:00 file.txt
↑  ┬ ┬ ┬   ↑   ↑    ↑     ↑      ↑        ↑
│  │ │ │   │   │    │     │      │        └─ 文件名
│  │ │ │   │   │    │     │      └─ 修改时间
│  │ │ │   │   │    │     └─ 文件大小(字节)
│  │ │ │   │   │    └─ 所属组
│  │ │ │   │   └─ 所有者
│  │ │ │   └─ 链接数
│  │ │ └─ 其他人权限 (r--)
│  │ └─ 所属组权限 (r-x)
│  └─ 所有者权限 (rwx)
└─ 文件类型(-:普通文件,d:目录,l:链接)

5.1 文件基本权限

  • 权限类型
    • r(读):查看文件内容/列目录清单(对目录)
    • w(写):修改文件内容/在目录增删文件(对目录)
    • x(执行):运行程序/进入目录(对目录)
  • 权限归属
    • 属主(u):文件所有者
    • 属组(g):文件所属用户组
    • 其他用户(o):既非属主也非属组成员的用户
ls -l 文件名  # 示例:-rwxr-xr-- 表示属主有rwx,属组有r-x,其他用户有r--

5.2 基本权限的修改

符号模式

#u :表示当前用户
#g:所属组
# O:其他用户
## 所有用户(a)添加写权限
chmod [ugoa][+-=][rwx] 文件  
示例: 
# u :表示用户
# + :添加
# x:(执行)
chmod u+x data.txt       # 为所有者添加执行权限  
# g :所属组
# - :删除
# w写
chmod g-w data.txt        # 移除所属组的写权限  
chmod a=rwx data.txt   # 所有用户设为 rwx  

数字表示法(常用):

# 权限数据
# r:4
# w:2
#  x:1


# 7= r+w+x
chmod 755 data1.txt       # rwxr-xr-x (7=rwx, 5=r-x)
chmod 644 data1.txt       # rw-r--r--

递归修改(目录及内容):

chmod -R 755 目录/

5.3 权限的作用

1 文件权限

权限 含义 示例操作
r 读取文件内容:允许查看文件内容(如 catlessheadtail)。 cat example.txt
w 修改文件内容:允许编辑文件内容(需配合目录的 w 权限才能删除文件)。 vim example.txt
x 执行文件:允许运行文件(如脚本、二进制程序)。 ./script.sh

关键点

  • 文件的 w 权限仅允许修改内容,删除文件需目录的 w 权限
  • 文件默认权限为 644rw-r--r--),即所有者可读写,其他用户只读。

2 目录权限

权限 含义 示例操作
r 列出目录内容:允许查看目录中的文件列表(如 ls)。 ls /home/user
w 修改目录结构:允许在目录中创建、删除、重命名文件或子目录。 touch file.txtrm file.txt
x 进入目录:允许访问目录内的元数据和文件(如 cd)。 cd /home/user

关键点

  • 目录的 w 权限是最关键的操作权限,即使没有 r 权限,只要目录有 x 权限,用户仍可进入目录并操作文件(需知道文件名)。
  • 目录默认权限为 755rwxr-xr-x),即所有者可完全控制,其他用户可读和执行。

3. 总结

权限修改命令及效果

命令 权限解析 结果
chmod 750 folder 7 (rwx) 所有者, 5 (r-x) 组, 0 (---) 其他 → 仅所有者可完全控制目录 目录权限:drwxr-x---
chmod 640 folder/1.txt 6 (rw-) 所有者, 4 (r--) 组, 0 (---) 其他 → 所有者可读写,其他无权限 文件权限:-rw-r-----
chmod 754 folder 7 (rwx) 所有者, 5 (r-x) 组, 4 (r--) 其他 → 所有者可完全控制,其他可读 目录权限:drwxr-xr--
chmod 755 folder 7 (rwx) 所有者, 5 (r-x) 组, 5 (r-x) 其他 → 开放公共访问 目录权限:drwxr-xr-x
chmod 644 folder/1.txt 同上(恢复默认文件权限) 文件权限:-rw-r--r--
chmod 646 folder/1.txt 6 (rw-) 所有者, 4 (r--) 组, 6 (rw-) 其他 → 其他用户可读写文件 文件权限:-rw-rw-r--
chmod 757 folder 7 (rwx) 所有者, 5 (r-x) 组, 7 (rwx) 其他 → 过度开放权限 目录权限:drwxr-xrwx(不推荐)
  • 文件权限rwx 控制内容访问,x 是执行关键。
  • 目录权限rwx 控制结构操作,x 是进入目录的关键。
  • 安全原则:遵循最小权限原则,避免过度开放权限(如 777)。

6. 默认权限

1 umask(权限掩码)

功能:控制新创建文件/目录的默认权限,通过“屏蔽”部分权限实现。

#查看当前 umask
umask  # 输出示例:0022

结构解析

  • 第一位 0:文件特殊权限(SetUID/SetGID/Sticky Bit)
  • 后三位 022:文件/目录的基础 umask 值

2 文件默认权限规则

规则 说明
最大权限 666(rw-rw-rw-)
不可执行原则 新建文件默认无 x 权限(安全机制)
计算方式 文件权限 = 666 - umask(需二进制按位减,非算术减)
示例(umask=022) 666 - 022 = 644rw-r--r--(非744!)

3 目录默认权限规则

规则 说明
最大权限 777(rwxrwxrwx)
计算方式 目录权限 = 777 - umask
示例(umask=022) 777 - 022 = 755rwxr-xr-x

📌 关键区别:目录保留执行权限(x),确保可进入

4 修改 umask 值

  • 临时修改(仅当前会话有效):

    umask 0002  # 新文件:664(rw-rw-r--),目录:775(rwxrwxr-x)
    
  • 永久修改

    vi /etc/profile  # 在末尾添加: umask 0002
    source /etc/profile  # 立即生效
    

7. sudo权限

核心概念

root 授权普通用户执行特权命令的工具

  • 操作对象:系统命令(需绝对路径)
  • 配置文件:/etc/sudoers(必须用 visudo 编辑!)

4.1 visudo 配置语法

# 语法
用户名 被管理主机=(可切换身份) 授权命令(绝对路径)

# 配置示例
# 1. 授权用户 stu2 以 root 身份执行所有命令:
stu2    ALL=(root)    ALL
# 2. 授权组 admin 免密执行 apt 更新:
%admin  ALL=(ALL)     NOPASSWD: /usr/bin/apt update

# 3. 允许用户 bob 重启网络服务:
bob     ALL=(root)    /usr/bin/systemctl restart network

权限生效验证

# 检查 sudo 权限
sudo -l  # 查看当前用户可执行的 sudo 命令

# 执行特权命令:
sudo /usr/bin/systemctl restart nginx  # 需输入用户密码(除非配置NOPASSWD)

安全守则

  1. umask 推荐值
    • 普通用户:0002(文件664,目录775)
    • 超级用户:0022(文件644,目录755)
  2. sudo 最小化授权
    • 禁止无限制 ALL 权限(如必须,则用 NOPASSWD: 需谨慎)
    • 命令路径必须为绝对路径(防止路径劫持)

通过 visudo -c 可检查配置文件语法是否正确

posted @ 2025-06-11 09:31  sunyimo  阅读(48)  评论(0)    收藏  举报