Linux权限管理终极指南(用户身份与文件权限
在Linux系统中有一系列的配置工作,下面我们从文件的所有者,所属组以及对文件的r(读),w(写),x(执行)等操作,同时介绍如何创建,删除,修改用户信息。也会从SUID,SGID与SBIT特殊权限来灵活设置系统权限,来弥补一般操作权限所带来的不足。最后会来介绍下su命令和sudo服务让普通用户具备管理员的权限。首先我们来介绍一下为什么使用root作为管理员
1.1用户身份与能力
Linux系统管理员之所以是root,并不是它的名字叫root,而是身份号码UID(和我们的身份证号码相似)的数值为0,因此我们可以用UID来判断用户身份。
管理员UID为0:系统管理员用户 |
系统用户UID为1-999:系统避免出现漏洞,默认服务程序系统会由系统用户运行 |
普通用户UID从1000开始:是由管理员创建用于日常工作的用户 |
同时为了方便管理用户,引入了用户组(GID)的概念,在工作中我们把用户放在一个组下面时,只用给组添加权限。
1.1.1id命令
id命令:用来显示用户的详细信息,语法格式“id用户名”
1.1.2user add命令
- useradd命令:用于创建一个新的用户,语法格式为“useradd[参数]用户名”
我们一般创建默认用户家目录在/home目录下面,默认shell解释器/bin/bash:
参数 | 作用描述 |
-s | 指定登录Shell(如/bin/bash、/sbin/nologin) |
-g | 设置主组(组名/GID,必须已存在) |
-G | 添加到附加组(多组用逗号分隔,组需存在) |
-u | 指定UID(非负整数,需唯一) |
-d | 自定义家目录路径 |
-c | 添加用户注释(如姓名/用途) |
-r | 创建系统用户(无家目录,UID为系统区间) |
下面图中使用useradd命令创建wangwu的用户,切换家目录查看信息,并用id命令确定信
下面我们提升难度,创建一个新用户指定路径,用户的UID以及shell解释器,注意下面的
/sbin/nologin,表示用户不能登录到系统中
groupadd命令
groupadd命令:用于创建一个新的用户组,语法格式为”groupadd 组名“
1.1.3usermod命令
usermod命令:用于修改用户属性,语法格式为“usermod [参数] 用户名”
所以说可以在/etc/passwd文件里,使用文本编辑器直接修改用户参数,也可以用usermod来修改用户信息,比如UID,所属组,默认终端等
参数 | 作用描述 |
-s | 修改用户的登录 Shell(如 /bin/bash、/sbin/nologin) |
-g | 变更用户的主组(组名 / GID,必须已存在) |
-G | 变更扩展用户组 |
-u | 修改用户的 UID(需唯一,非负整数,注意避免文件权限问题) |
-d | 变更用户的家目录路径(需确保目录存在,可加 -m 迁移原家目录文件) |
-c | 修改用户的备注信息(如姓名、用途) |
-l | 更改用户名(需确保新用户名未被使用) |
-L | 锁定用户,账号禁止登录,在密码前添加 ! 标记 |
-U | 解锁用户,账号移除密码前的 ! 标记 |
不要被参数吓到了,我们可以先看普通信息:
然后把wnagwu加入到root的用户组里
同时如果不想让wangwu登录也很简单只用修改默认终端即可:
修改后我们会发现在想登录这个用户就不能马上登录了
1.1.4password命令
password命令:用于修改用户的密码,过期时间等信息,语法格式为“paawd [参数]用户名”
普通用户只能用passwd修改自己的系统密码,而root管理员则有权限修改其他所有人的密码,这就代表有权限修改其他权限。
参数 | 作用描述 |
-l | 锁定用户(密码前加 !,禁止登录) |
-u | 解锁用户(移除密码前的 !) |
-d | 删除密码(设为空密码,需系统允许) |
-e | 强制用户下次登录修改密码 |
-S | 显示用户密码是否被锁定,以及密码所采用的加密算法名称 |
要修改自己的密码只需要输入passwd俩次回车即可
要是修改别人的密码,需要先查是不是root管理员权限,然后指定用户进行修改:
当你同事休假时我们可以禁止用户登录系统,等假期结束时,在使用命令允许用户登陆系统
当然在解除时候也要记得使用管理员身份,否则,如果普通用户也有锁定权限,那就乱成一锅粥了:
1.1.5serdel命令
userdel命令:用于删除已有用户,语法格式为“userdel [参数] 用户名”
参数 | 作用 |
-u | 强制删除用户 |
-r | 同时删除用户以及家目录 |
在删除用户时,一般建议保留家目录,以免重要数据被删除,所以说一般使用userdel命令时可以不加参数:
所以说用户已经被删除,但家目录数据保存在/home目录下,等确定不会再用时在手动删除:
1.2 文件权限与归属
一、文件权限的基本概念
Linux 系统通过权限机制控制文件 / 目录的访问权限,基于 “UGO 模型” 划分三类对象:
- U(User):文件所有者(创建者或被指定的用户)
- G(Group):文件所属组(关联的用户组)
- O(Other):其他用户(既非所有者也非所属组成员)
每类对象拥有三种基础权限,对应符号与数字标识如下:
权限 | 符号 | 数字值 | 作用(文件) | 作用(目录) |
读 | r | 4 | 查看文件内容(cat/less等) | 列出目录内文件(ls) |
写 | w | 2 | 修改文件内容(vim/echo等) | 创建 / 删除 / 重命名目录内文件 |
执行 | x | 1 | 运行可执行文件(脚本 / 程序) | 进入目录(cd) |
文件归属的管理
文件的归属(所有者、所属组)可通过以下命令修改:
命令 | 作用 | 示例 |
chown | 修改文件所有者(含所属组) | chown user1:group1 file.txt (将 file.txt 的所有者改为 user1,所属组改为 group1) |
chgrp | 仅修改文件所属组 | chgrp group2 dir/ (将 dir 目录的所属组改为 group2) |
权限的修改方式
- 符号法(chmod):
格式:chmod [对象][操作][权限] 文件
示例:
chmod u+x,g=rw,o-r file.sh # 给所有者加执行权,所属组设为读写,移除其他用户的读权限
- 对象:u(所有者)、g(所属组)、o(其他)、a(所有对象)
- 操作:+(添加)、-(移除)、=(设置)
- 数字法(chmod):
格式:chmod 三位数字 文件(每位数字对应 U、G、O 的权限总和)
示例:
chmod 754 file.txt # 所有者rwx(7=4+2+1),所属组rx(5=4+1),其他r(4)
权限与归属的关系
- 权限优先级:所有者 > 所属组 > 其他用户(匹配到高优先级对象后,不再检查低优先级)。
- 安全原则:遵循 “最小权限” 原则,避免不必要的w和x权限(尤其对系统文件)。
通过组合基础权限、归属设置及特殊权限,可实现对文件 / 目录的精细化访问控制。
1.3文件的特殊权限
在复杂多变的生产环境中,单纯的rwx权限已经不足以满足我们的安全和灵活性所以说我们提出了:SUID,SGID,SBIT
权限名称 | 符号表示 | 数字标识 | 作用描述 | 示例场景 |
SUID | u+s | 4000 | 仅对可执行文件有效,用户执行文件时,临时获得文件所有者权限(而非执行者自身权限) | passwd 命令(权限 -rwsr-xr-x):普通用户执行时临时获 root 权限,可修改 /etc/shadow |
SGID | g+s | 2000 | ・对文件:执行时临时获得文件所属组权限;・对目录:新建文件 / 子目录自动继承目录的组归属 | 团队共享目录(权限 drwxr-sr-x):新建文件自动归属目录所属组,方便组内协作 |
SBIT(粘滞位) | o+t | 1000 | 仅对目录有效,目录内文件仅允许所有者、目录所有者或 root 删除,其他用户无法删除他人文件 | /tmp 目录(权限 drwxrwxrwt):所有用户可写入,但不能删除他人创建的文件 |
1.4文件的隐藏属性
chattr命令
chattr命令:勇于设置文件的隐藏权限,语法格式“chattr[参数]文件名称”
如果想要添加权限,则在命令后面追加“+参数”,想要移除权限,则需要追加“-参数”
参数 | 作用描述 | 示例 |
+i | 添加 “不可修改” 属性(文件 / 目录无法删除、修改、重命名,root 受限) | chattr +i config.conf |
-i | 移除 “不可修改” 属性 | chattr -i config.conf |
+a | 添加 “只能追加” 属性(文件仅允许追加内容,无法删除 / 修改现有内容;目录仅允许新建文件) | chattr +a app.log |
-a | 移除 “只能追加” 属性 | chattr -a app.log |
+S | 添加 “同步更新” 属性(文件修改后立即写入磁盘,不经过缓存,适合关键数据) | chattr +S data.db |
-S | 移除 “同步更新” 属性 | chattr -S data.db |
+s | 添加 “彻底删除” 属性(文件删除后数据被清零,无法通过恢复工具找回) | chattr +s secret.key |
-s | 移除 “彻底删除” 属性 | chattr -s secret.key |
+A | 添加 “不更新访问时间” 属性(文件被访问时,不修改atime记录,减少磁盘 IO) | chattr +A readme.txt |
-A | 移除 “不更新访问时间” 属性 | chattr -A readme.txt |
+b | 添加 “不压缩” 属性(针对支持压缩的文件系统,强制文件不被压缩) | chattr +b large.file |
-b | 移除 “不压缩” 属性 | chattr -b large.file |
+D | 递归应用属性到目录(修改目录时,其下所有文件 / 子目录同步生效,仅对目录有效) | chattr +D +i /data |
-D | 取消递归应用属性 | chattr -D /data |
+d | 添加 “不备份” 属性(文件被dump命令备份时会被忽略) | chattr +d temp.file |
-d | 移除 “不备份” 属性 | chattr -d temp.file |
+c | 添加 “自动压缩” 属性(针对支持压缩的文件系统,文件会被自动压缩存储) | chattr +c log.old |
-c | 移除 “自动压缩” 属性 | chattr -c log.old |
+u | 添加 “可恢复” 属性(文件删除后数据保留,可通过工具恢复,与s属性冲突) | chattr +u doc.txt |
-u | 移除 “可恢复” 属性 | chattr -u doc.txt |
+t | 添加 “尾部合并” 属性(仅目录有效,目录下文件删除后,块会合并到尾部,优化小文件存储) | chattr +t /tmp |
-t | 移除 “尾部合并” 属性 | chattr -t /tmp |
+x | 添加 “可执行” 属性(针对某些文件系统,强制文件可执行,优先级高于权限位x) | chattr +x script.sh |
-x | 移除 “可执行” 属性 | chattr -x script.sh |
我们先创建一个普通文件,如何尝试删除
实践是验证真理的唯一标准,我们只有自己尝试这个功能的强大之处,就不会相信原来Linux系统会如此安全
lsattr命令
lsattr命令:用于查看文件的隐藏权限,语法格式为“lsattr[参数]文件名称”
当我想要查看隐藏权限时,使用ls之类的命令就看不出端倪:
而当我们使用lsattr命令,就无处遁形:
此时我们使用chattr命令,就可去除隐藏权限:
文件访问控制列表文件
访问控制列表(ACL)提供了一种更为灵活的权限管理方式,它允许为单个用户或用户组设置独立的权限规则。使用ACL可以突破传统的所有者、所属组、其他三类权限的限制,从而实现更加精细化的权限分配。要开启文件系统的ACL功能,通常需要在挂载时添加`acl`选项。例如,使用`mount -o remount,acl /`命令重新挂载根分区以启用ACL支持。此后,可以使用`setfacl`命令对文件或目录设置ACL规则,用`getfacl`命令查看这些规则。这为多用户环境下的权限管理提供了更高的灵活性和安全性。
setfacl命令
setfacl命令:用于管理文件的ACL权限规则,语法格式为“setfacl[参数]文件名称”
参数 | 作用描述 | 示例 |
-m | 修改 ACL 规则,格式为 “类型:名称:权限”(类型 u = 用户,g = 组,o = 其他;权限 r = 读,w = 写,x = 执行) | setfacl -m u:testuser:rw file.txt |
-x | 删除指定的 ACL 规则(格式同 - m,不含权限) | setfacl -x u:testuser file.txt |
-b | 移除文件或目录的所有 ACL 规则 | setfacl -b file.txt |
-k | 移除目录的默认 ACL 规则(仅对目录有效) | setfacl -k /data |
-d | 为目录设置默认 ACL 规则(新建文件 / 子目录会继承该规则,需与 - m 配合) | setfacl -d -m g:testgroup:rwx /data |
-R | 递归应用 ACL 规则到目录下的所有文件和子目录 | setfacl -R -m u:testuser:r /data |
-n | 不遵循默认 ACL 继承规则(仅在递归时使用) | setfacl -R -n -m g:testgroup:r /data |
例如,我们原本是进入不了root目录下的,现在我们给普通用户添加权限:
我们会发现现在普通用户也能切换到/root目录下了
当我们发现权限有+的时候上面添加了ACl规则
getfacl命令
getfacl命令:用来查看文件ACl权限规则,语法格式为“getfacl[参数]文件名称”
下面我们使用getfacl显示root管理员家目录上设置的所有ACl信息:
ACL权限也可以使某一个组的用户都可以读写/etc/fstab文件:
Setfacl -m g:zwj:rw /etc/fstab
设置错了也没关系可以用-b来清空ACL权限,删除可以用-x参数,当然恢复可以使用-restore
1.5Su命令与sudo服务
su命令可以解决切换用户身份的需求,保证不退出系统就可以切换用户
,
当然su命令中间的-符号是强烈建议不要省去的
sudo命令是给普通用户添加格外权限的,语法格式为“sudo [参数] 用户名”
当然我们可以使用visudo来帮我们编辑用户权限,这样的好处是会减少添加权限会出现的问题
我们使用命令visudo添加如下,ALL代表系统最高权限
这个时候我们发现就可以看到家目录上的文件信息
当然我们也可以把一条命令的绝对路径找到复制下来放到后面那么我们在使用的时候就不用在验证了
我们设置了不要密码就可以重启虚拟机直接输入sudo reboot