05 用户身份与文件权限
- Linux 是一个多用户、多任务的操作系统,具有很好的稳定性与安全性,在幕后保障 Linux 系统的安全则是一系列复杂的配置工作。
- 文件的所有者、所属组以及其他人可对文件进行的读(r)、写(w)、执行(x)等操作,如何在 Linux 系统中添加、删除、修改用户账户信息。
- 使用 SUID、SGID 与 SBIT 特殊权限更加灵活地设置系统权限,来弥补对文件设置一般操作权限时所带来的不足。
- 隐藏权限能够给系统增加一层隐形的防护层,让黑客最多只能查看关键日志信息,而不能篡改或删除。
- 文件访问控制列表(Access Control List,ACL)可以进一步让单一用户、用户组对单一文件或目录进行特殊的权限设置,让文件具有能满足工作需求的最小权限。
- 如何使用 su 命令与 sudo 服务让普通用户具备管理员的权限,这不仅能够满足日常的工作需求,还可以确保系统的安全性。
用户身份与能力
- 在 Linux 的学习过程中如果使用普通用户身份进行操作,则在配置服务之后出现错误时很难判断是系统自身的问题还是因为权限不足而导致的;这无疑会给大家的学习过程徒增坎坷。
- 更何况我们的实验环境是使用 VMware 虚拟机软件搭建的,可以将安装好的系统设置为一次快照,这样即便系统彻底崩溃了,也可以在 5 秒的时间内快速还原出一台全新的系统,而不用担心数据丢失。
- 很多图书或培训机构的老师会讲到,Linux 系统中的管理员就是 root。这其实是错误的,Linux 系统的管理员之所以是 root,并不是因为它的名字叫 root,而是因为该用户的身份号码即 UID(User IDentification)的数值为 0。
- 在 Linux 系统中,UID 就像我们的身份证号码一样具有唯一性,因此可通过用户的 UID 值来判断用户身份。
用户身份
- 管理员 UID 为 0: 系统的管理员用户。
- 系统用户 UID 为 1 ~ 999: Linux 系统为了避免因某个服务程序出现漏洞而被黑客提权至整台服务器,默认服务程序会由独立的系统用户负责运行,进而有效控制被破坏范围。
- 普通用户 UID 从 1000 开始: 是由管理员创建的用于日常工作的用户。
UID 是不能冲突的,而且管理员创建的普通用户的 UID 默认是从 1000 开始的(即使前面有闲置的号码)。
用户组
- 用户组
- 为了方便管理属于同一组的用户,Linux 系统中还引入了用户组的概念。
- 通过使用用户组号码(GID,Group IDentification),可以把多个用户加入到同一个组中,从而方便为组中的用户统一规划权限或指定任务。
- 基本用户组
- 在 Linux 系统中创建每个用户时,将自动创建一个与其同名的基本用户组,而且这个基本用户组只有该用户一个人。
- 如果该用户以后被归纳到其他用户组,则这个其他用户组称之为扩展用户组。
- 一个用户只有一个基本用户组,但是可以有多个扩展用户组,从而满足日常的工作需要。
- 基本用户组就像是原生家庭,是在创建账号(出生)时就自动生成的。
- 扩展用户组则像工作单位,为了完成工作,需要加入到各个不同的群体中,这是需要手动添加的。
用户能力
id
id命令用于显示用户的详细信息,语法格式为id 用户名。
[linuxprobe@linuxprobe ~]$ id linuxprobe
uid=1000(linuxprobe) gid=1000(linuxprobe) groups=1000(linuxprobe),10(wheel)
useradd
-
useradd命令用于创建新的用户账户,语法格式为useradd [参数] 用户名。 -
useradd命令中的参数以及作用:参数 作用 -d指定用户的家目录(默认为 /home/username)-e账户的到期时间,格式为 YYYY-MM-DD.-u指定该用户的默认 UID -g指定一个初始的用户基本组(必须已存在) -G指定一个或多个扩展用户组 -N不创建与用户同名的基本用户组 -s指定该用户的默认 Shell 解释器
[linuxprobe@linuxprobe ~]$ useradd linuxcool
useradd: Permission denied.
useradd: cannot lock /etc/passwd; try again later.
[linuxprobe@linuxprobe ~]$ su - root
Password:
[root@linuxprobe ~]# useradd linuxcool
[root@linuxprobe ~]# id linuxcool
uid=1001(linuxcool) gid=1001(linuxcool) groups=1001(linuxcool)
[root@linuxprobe ~]#
[root@linuxprobe ~]# useradd -d /home/linux -u 8888 -s /sbin/nologin linuxdown
[root@linuxprobe ~]# id linuxdown
uid=8888(linuxdown) gid=8888(linuxdown) groups=8888(linuxdown)
[root@linuxprobe ~]# ls /home/
linux linuxcool linuxprobe
[root@linuxprobe ~]#
groupadd
groupadd命令用于创建新的用户组,语法格式为groupadd [参数] 群组名。- 为了能够更加高效地指派系统中各个用户的权限,在工作中常常会把几个用户加入到同一个组里面,这样便可以针对一类用户统一安排权限。
[root@linuxprobe ~]# groupadd ronny
[root@linuxprobe ~]#
usermod
-
usermod命令用于修改用户的属性,英文全称为user modify,语法格式为usermod [参数] 用户名。 -
usermod命令中的参数以及作用:参数 作用 -c填写用户账户的备注信息 -d -m参数 -m与参数-d连用,可重新指定用户的家目录并自动把旧的数据转移过去-e账户的到期时间,格式为 YYYY-MM-DD -g变更所属用户组 -G变更扩展用户组 -L锁定用户禁止其登录系统 -U解锁用户,允许其登录系统 -s变更默认终端 -u修改用户的 UID
[root@linuxprobe ~]# id linuxprobe
uid=1000(linuxprobe) gid=1000(linuxprobe) groups=1000(linuxprobe),10(wheel)
[root@linuxprobe ~]#
[root@linuxprobe ~]# usermod -G root linuxprobe # 将用户 linuxprobe 加入到 root 用户组中
[root@linuxprobe ~]# id linuxprobe
uid=1000(linuxprobe) gid=1000(linuxprobe) groups=1000(linuxprobe),0(root)
[root@linuxprobe ~]#
[root@linuxprobe ~]# usermod -u 8888 linuxprobe # 修改 linuxprobe 用户的 UID 号码值
[root@linuxprobe ~]# id linuxprobe
uid=8888(linuxprobe) gid=1000(linuxprobe) groups=1000(linuxprobe),0(root)
[root@linuxprobe ~]#
[root@linuxprobe ~]# usermod -s /sbin/nologin linuxprobe # 把用户的解释器终端由默认的 /bin/bash 修改为 /sbin/nologin
[root@linuxprobe ~]# su - linuxprobe
This account is currently not available.
passwd
-
passwd命令用于修改用户的密码、过期时间等信息,英文全称为password,语法格式为passwd [参数] 用户名。 -
passwd命令中的参数以及作用:参数 作用 -l锁定用户,禁止其登录 -u解除锁定,允许用户登录 --stdin允许通过标准输入修改用户密码,如 echo "NewPassWord" | passwd --stdin Username-d使该用户可用空密码登录系统 -e强制用户在下次登录时修改密码 -S显示用户的密码是否被锁定,以及密码所采用的加密算法名称
[root@linuxprobe ~]# passwd # 修改 root 用户密码
Changing password for user root.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
[root@linuxprobe ~]# passwd linuxprobe # 修改 linuxprobe 用户密码
Changing password for user linuxprobe.
New password:
BAD PASSWORD: The password is a palindrome
Retype new password:
passwd: all authentication tokens updated successfully.
[root@linuxprobe ~]#
[root@linuxprobe ~]# passwd -l linuxprobe # 锁定 linuxprobe 用户,禁止其登录
Locking password for user linuxprobe.
passwd: Success
[root@linuxprobe ~]# passwd -S linuxprobe # 显示用户的密码是否被锁定
linuxprobe LK 2023-06-11 0 99999 7 -1 (Password locked.)
[root@linuxprobe ~]#
[root@linuxprobe ~]# passwd -u linuxprobe # 解除 linuxprobe 锁定,允许用户登录
Unlocking password for user linuxprobe.
passwd: Success
[root@linuxprobe ~]# passwd -S linuxprobe
linuxprobe PS 2023-06-11 0 99999 7 -1 (Password set, SHA512 crypt.)
[root@linuxprobe ~]#
userdel
userdel命令用于删除已有的用户账户,英文全称为user delete,语法格式为userdel [参数] 用户名。userdel命令中的参数以及作用:
| 参数 | 作用 |
|---|---|
-f |
强制删除用户 |
-r |
同时删除用户及用户家目录 |
[root@linuxprobe ~]# userdel linuxcool # 删除 linuxcool 用户及用户家目录
[root@linuxprobe ~]# id linuxcool
id: ‘linuxcool’: no such user
[root@linuxprobe ~]# ls /home/ # 用户已被删除,但家目录数据会继续存放在 /home 目录中
linux linuxcool linuxprobe
[root@linuxprobe ~]# rm -rf /home/linuxcool
[root@linuxprobe ~]# userdel -rf linuxdown # 删除 linuxdown 用户及用户家目录
[root@linuxprobe ~]# ls /home/
linuxprobe
[root@linuxprobe ~]#
文件权限与归属
- 可读(r) 可读
read表示能够读取目录内的文件列表; - 可写(w) 可写
write表示能够在目录内新增、删除、重命名文件; - 可执行(x) 可执行
execute则表示能够进入该目录。
读写执行权限对于文件与目录可执行命令的区别
| 文件 | 目录 | |
|---|---|---|
| 可读(r) | cat | ls |
| 可写(w) | vim | touch |
| 可执行(x) | ./script | cd |
文件权限的字符与数字表示
| 权限项 | 可读 | 可写 | 可执行 | 可读 | 可写 | 可执行 | 可读 | 可写 | 可执行 |
|---|---|---|---|---|---|---|---|---|---|
| 字符表示 | r | w | x | r | w | x | r | w | x |
| 数字表示 | 4 | 2 | 1 | 4 | 2 | 1 | 4 | 2 | 1 |
| 权限分配 | 文件所有者 | 文件所属组 | 其他用户 |
文件权限的数字表示法
- 文件权限的数字表示法基于字符(rwx)的权限计算而来,其目的是简化权限的表示方式
- 若某个文件的权限为 7,则代表可读、可写、可执行(4+2+1)
- 若权限为 6,则代表可读、可写(4+2)。

文件属性信息

-
上图包含文件的类型、访问权限、所有者(属主)、所属组(属组)、占用的磁盘大小、最后修改时间和文件名称等信息。
-
该文件的类型为普通文件,所有者权限为可读、可写(
rw-),所属组权限为可读(r--) -
其他人也只有可读权限(
r--) -
文件的磁盘占用大小是 34298 字节
-
最近一次的修改时间为 4 月 2 日的 0:23
-
文件的名称为 install.log。
常见的文件类型
- 普通文件(
-) - 目录文件(
d) - 链接文件(
l) - 管道文件(
p) - 块设备文件(
b) - 字符设备文件(
c)
- 普通文件的范围特别广泛,比如纯文本信息、服务配置信息、日志信息以及 Shell 脚本等,都属于普通文件。几乎在每个目录下都能看到普通文件(
-)和目录文件(d)的身影。 - 块设备文件(
b)和字符设备文件(c)一般是指硬件设备,比如鼠标、键盘、光驱、硬盘等,在/dev/目录中最为常见。应该很少有人会对鼠标、键盘进行硬件级别的管理吧。
文件的特殊权限
SUID
- SUID 是一种对二进制程序进行设置的特殊权限,能够让二进制程序的执行者临时拥有所有者的权限(仅对拥有执行权限的二进制程序有效)。
- 程序原先权限位上没有 x 执行权限,那么被赋予特殊权限后将变成大写的 S。
- 程序原先权限位上有 x 执行权限,那么被赋予特殊权限后将变成小写的 s。
[root@linuxprobe ~]# ls -l /etc/shadow
----------. 1 root root 1397 Jun 11 17:39 /etc/shadow
[root@linuxprobe ~]# ls -l /bin/passwd # 所有者的权限由 rwx 变成了 rws,其中 x 改变成 s 就意味着该文件被赋予了 SUID 权限
-rwsr-xr-x. 1 root root 33544 Dec 14 2019 /bin/passwd
[root@linuxprobe ~]#
加粗显示的字体用来告诫用户一定要小心这个权限,因为一旦某个命令文件被设置了 SUID 权限,就意味着凡是执行该文件的人都可以临时获取到文件所有者所对应的更高权限。因此,千万不要将 SUID 权限设置到 vim、cat、rm 等命令上面!!!
SGID
- SGID 特殊权限有两种应用场景:
- 当对二进制程序进行设置时,能够让执行者临时获取文件所属组的权限;
- 当对目录进行设置时,则是让目录内新创建的文件自动继承该目录原有用户组的名称。
[root@linuxprobe ~]# cd /tmp
[root@linuxprobe tmp]# mkdir testdir
[root@linuxprobe tmp]# ls -ald testdir
drwxr-xr-x. 2 root root 6 Jun 11 17:56 testdir
[root@linuxprobe tmp]# chmod -R 777 testdir # 设置好目录的 777 权限, 确保普通用户可以向其中写入文件
[root@linuxprobe tmp]# chmod -R g+s testdir # 设置 SGID 特殊权限位
[root@linuxprobe tmp]# ls -ald testdir
drwxrwsrwx. 2 root root 6 Jun 11 17:56 testdir
[root@linuxprobe tmp]# su - linuxprobe
[linuxprobe@linuxprobe ~]$ cd /tmp/testdir
[linuxprobe@linuxprobe testdir]$ echo "linuxprobe.com" > test
[linuxprobe@linuxprobe testdir]$ ls -al test
-rw-rw-r--. 1 linuxprobe root 15 Jun 11 17:57 test
[linuxprobe@linuxprobe testdir]$ logout
[root@linuxprobe tmp]
chmod
chmod命令用于设置文件的一般权限及特殊权限,英文全称为change mode,语法格式为chmod [参数] 文件名。- 针对目录进行操作时需要加上大写参数
-R来表示递归操作,即对目录内所有的文件进行整体操作。
[root@linuxprobe ~]# ls -l anaconda-ks.cfg
-rw-------. 1 root root 1385 Jun 4 03:15 anaconda-ks.cfg
[root@linuxprobe ~]# chmod 760 anaconda-ks.cfg # 权限设置成其所有者可读可写可执行、所属组可读可写、其他人没有任何权限,则相应的字符法表示为 rwxrw----,其对应的数字法表示为 760
[root@linuxprobe ~]# ls -l anaconda-ks.cfg
-rwxrw----. 1 root root 1385 Jun 4 03:15 anaconda-ks.cfg
chown
chown命令用于设置文件的所有者和所有组,英文全称为change own,语法格式为chown 所有者:所有组 文件名。- 针对目录进行操作时需要加上大写参数
-R来表示递归操作,即对目录内所有的文件进行整体操作。
[root@linuxprobe ~]# chown linuxprobe:linuxprobe anaconda-ks.cfg
[root@linuxprobe ~]# ls -l anaconda-ks.cfg
-rwxrw----. 1 linuxprobe linuxprobe 1385 Jun 4 03:15 anaconda-ks.cfg
[root@linuxprobe ~]#
SBIT
- SBIT 特殊权限位可确保用户只能删除自己的文件,而不能删除其他用户的文件。换句话说,当对某个目录设置了 SBIT 粘滞位权限后,那么该目录中的文件就只能被其所有者执行删除操作了。
- RHEL 8 系统中的
/tmp作为一个共享文件的目录,默认已经设置了 SBIT 特殊权限位,因此除非是该目录的所有者,否则无法删除这里面的文件。 - 与前面所讲的 SUID 和 SGID 权限显示方法不同,当目录被设置 SBIT 特殊权限位后,文件的其他用户权限部分的 x 执行权限就会被替换成 t 或者 T
- 程序原先权限位上没有 x 执行权限,那么被赋予特殊权限后将变成大写的 T。
- 程序原先权限位上有 x 执行权限,那么被赋予特殊权限后将变成小写的 t。
[root@linuxprobe ~]# cd /tmp
[root@linuxprobe tmp]# echo "Welcome to linuxprobe.com" > test
[root@linuxprobe tmp]# chmod 777 test # 赋予 test 文件最大的 777 权限
[root@linuxprobe tmp]# ls -al test
-rwxrwxrwx. 1 linuxprobe linuxprobe 26 Jun 11 18:08 test
[root@linuxprobe tmp]# su - linuxprobe
[linuxprobe@linuxprobe ~]$ rm -f /tmp/test # 由于 SBIT 特殊权限位的缘故,依然无法删除该文件
rm: cannot remove 'test': Operation not permitted
特殊权限的设置参数
SUID、SGID、SBIT 特殊权限的设置参数:
| 参数 | 作用 |
|---|---|
u+s |
设置 SUID 权限 |
u-s |
取消 SUID 权限 |
g+s |
设置 SGID 权限 |
g-s |
取消 SGID 权限 |
o+t |
设置 SBIT 权限 |
o-t |
取消 SBIT 权限 |
[root@linuxprobe ~]# mkdir linux
[root@linuxprobe ~]# chmod -R linux/
chmod: missing operand after ‘linux/’
Try 'chmod --help' for more information.
[root@linuxprobe ~]# chmod -R o+t linux/ # 设置 SBIT 权限
[root@linuxprobe ~]# ls -ald linux/
drwxr-xr-t. 2 root root 6 Jun 11 18:12 linux/
[root@linuxprobe ~]#
权限数字和字符表示法的转换
- 其实,SUID、SGID 与 SBIT 也有对应的数字表示法,分别为 4、2、1。
- 也就是说 777 还不是最大权限,最大权限应该是 7777,其中第 1 个数字代表的是特殊权限位。
- 数字表示法是由
特殊权限 + 一般权限构成的。- 在
rwxr-xr-t权限中- 最后一位是 t,这说明该文件的一般权限为
rwxr-xr-x,并带有 SBIT 特殊权限。 - 对于可读(r)、可写(w)、可执行(x)权限的数字计算方法大家应该很熟悉了—
rwxr-xr-x即 755,而 SBIT 特殊权限位是 1 - 合并后的结果为 1755。
- 最后一位是 t,这说明该文件的一般权限为
- 在
rwsrwSr--权限中- 去掉特殊权限后一般权限为
rwxrw-r--(执行文件有 x 权限 + 特殊权限后变为 s,没有 x 权限 + 特殊权限后变为 S),数字表示法是 764 - 特殊权限为 SUID/4 + SGID/2,数字表示法是 420
- 合并后的结果为 6764
- 去掉特殊权限后一般权限为
- 在 5537 权限中
- 特殊权限为 5,也就是 SUID/4 + SBIT/1
- 一般权限为 537,也就是
r-x-wxrwx - 合并后为
r-s-wxrwt
- 在

文件的隐藏属性
chattr
-
chattr命令用于设置文件的隐藏权限,英文全称为change attributes,语法格式为chattr [参数] 文件名称。 -
chattr命令中的参数及其作用:参数 作用 i无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的子文件内容而不能新建或删除文件 a仅允许补充(追加)内容,无法覆盖/删除内容(Append Only) S文件内容在变更后立即同步到硬盘(sync) s彻底从硬盘中删除,不可恢复(用 0 填充原文件所在硬盘区域) A不再修改这个文件或目录的最后访问时间(atime) b不再修改文件或目录的存取时间 D检查压缩文件中的错误 d使用 dump 命令备份时忽略本文件/目录 c默认将文件或目录进行压缩 u当删除该文件后依然保留其在硬盘中的数据,方便日后恢复 t让文件系统支持尾部合并(tail-merging) x可以直接访问压缩文件中的内容 -
我们一般会将
-a参数设置到日志文件(/var/log/messages)上,这样可在不影响系统正常写入日志的前提下,防止黑客擦除自己的作案证据。 -
如果希望彻底地保护某个文件,不允许任何人修改和删除它的话,不妨加上
-i参数试试,效果特别好。 -
要想彻底删除某个文件,可以使用
+s参数来保证其被删除后不可恢复,硬盘上的文件数据会被用零块重新填充。
[root@linuxprobe ~]# echo "for Test" > linuxprobe
[root@linuxprobe ~]# rm linuxprobe # 文件正常可以删除
rm: remove regular file ‘linuxprobe’? y
[root@linuxprobe ~]#
[root@linuxprobe ~]# echo "for Test" > linuxprobe
[root@linuxprobe ~]# chattr +a linuxprobe # 设置 `不允许删除与覆盖`(+a 参数)权限
[root@linuxprobe ~]# rm -f linuxprobe # 设置隐藏权限后无法删除
rm: cannot remove 'linuxprobe': Operation not permitted
[root@linuxprobe ~]#
lsattr
lsattr命令用于查看文件的隐藏权限,英文全称为list attributes,语法格式为lsattr [参数] 文件名称。
[root@linuxprobe ~]# ls -al linuxprobe
-rw-r--r--. 1 root root 9 Jun 11 18:42 linuxprobe
[root@linuxprobe ~]# lsattr linuxprobe # 查看文件的隐藏权限
-----a-------------- linuxprobe
[root@linuxprobe ~]# chattr -a linuxprobe # 使用 chattr 去掉文件的隐藏权限
[root@linuxprobe ~]# lsattr linuxprobe
-------------------- linuxprobe
[root@linuxprobe ~]# rm -f linuxprobe # 文件正常可以删除
[root@linuxprobe ~]#
文件访问控制列表
- 如果希望对某个指定的用户进行单独的权限控制,就需要用到文件的访问控制列表(ACL)了。
- 通俗来讲,基于普通文件或目录设置 ACL 其实就是针对指定的用户或用户组设置文件或目录的操作权限,更加精准地派发权限。
- 如果针对某个目录设置了 ACL,则目录中的文件会继承其 ACL 权限;若针对文件设置了 ACL,则文件不再继承其所在目录的 ACL 权限。
setfacl
-
setfacl命令用于管理文件的 ACL 权限规则,英文全称为set files ACL,语法格式为setfacl [参数] 文件名称。 -
ACL 权限提供的是在所有者、所属组、其他人的读/写/执行权限之外的特殊权限控制。
-
setfacl命令中的参数以及作用:参数 作用 -m修改权限 -M从文件中读取权限 -x删除某个权限 -b删除全部权限 -R递归子目录 --restore恢复权限
[root@linuxprobe ~]#
[root@linuxprobe ~]# logout
[linuxprobe@linuxprobe ~]$ cd /root/ # 普通用户无法进入 /root 目录
-bash: cd: /root/: Permission denied
[linuxprobe@linuxprobe ~]$
[linuxprobe@linuxprobe ~]$ su - root
Password:
[root@linuxprobe ~]# setfacl -Rm u:linuxprobe:rwx /root # 为普通用户单独设置权限
[root@linuxprobe ~]#
[root@linuxprobe ~]# logout
[linuxprobe@linuxprobe ~]$ cd /root # 普通用户可以进入 /root 目录
[linuxprobe@linuxprobe root]$ ls
anaconda-ks.cfg Documents initial-setup-ks.cfg Pictures Templates
Desktop Downloads Music Public Videos
[linuxprobe@linuxprobe root]$ logout
[linuxprobe@linuxprobe ~]$ ls -ald /root # 文件权限的最后一个点(.)变成了加号(+),这就意味着该文件已经设置了 ACL
dr-xrwx---+ 15 root root 4096 Jun 11 18:45 /root
getfacl
getfacl命令用于查看文件的 ACL 权限规则,英文全称为get files ACL,语法格式为getfacl [参数] 文件名称。
[root@linuxprobe ~]# getfacl /root # 显示在root管理员家目录上设置的所有ACL信息
getfacl: Removing leading '/' from absolute path names
# file: root
# owner: root
# group: root
user::r-x
user:linuxprobe:rwx
group::r-x
mask::rwx
other::---
[root@linuxprobe ~]# setfacl -m g:linuxprobe:rw /etc/fstab # 允许 linuxprobe 组用户都可以读写 /etc/fstab 文件
[root@linuxprobe ~]# getfacl /etc/fstab
getfacl: Removing leading '/' from absolute path names
# file: etc/fstab
# owner: root
# group: root
user::rw-
group::r--
group:linuxprobe:rw-
mask::rw-
other::r--
[root@linuxprobe ~]# setfacl -x g:linuxprobe /etc/fstab # 清空 linuxprobe 组用户的所有 ACL 权限
[root@linuxprobe ~]# getfacl /etc/fstab
getfacl: Removing leading '/' from absolute path names
# file: etc/fstab
# owner: root
# group: root
user::rw-
group::r--
mask::r--
other::r--
[root@linuxprobe ~]#
备份恢复 ACL 权限
- 备份目录上的 ACL 权限时,可使用
-R递归参数,这样不仅能够把目录本身的权限进行备份,还能将里面的文件权限也自动备份。 - ACL 权限的恢复也很简单,使用的是
--restore参数,它能够自动找到要恢复的对象。
[root@linuxprobe ~]# cd /
[root@linuxprobe /]# getfacl -R home > backup.acl
[root@linuxprobe /]# ls -ald backup.acl
-rw-r--r--. 1 root root 19756 Jun 11 19:04 backup.acl
[root@linuxprobe /]# setfacl --restore backup.acl # 在备份时已经指定是对 /home 目录进行操作,所以不需要写对应的目录名称,它能够自动找到要恢复的对象
[root@linuxprobe /]#
getfacl 在备份目录权限时不能使用绝对路径的形式,因此我们需要先切换到最上层根目录,然后再进行操作。
su 命令与 sudo 服务
su
- su 命令与用户名之间有一个减号(
-),这意味着完全切换到新的用户,即把环境变量信息也变更为新用户的相应信息,而不是保留原始的信息。强烈建议在切换用户身份时添加这个减号(-)。 - 从 root 管理员切换到普通用户时是不需要密码验证的,而从普通用户切换成 root 管理员就需要进行密码验证了。
- 使用 sudo 命令把特定命令的执行权限赋予指定用户,这样既可保证普通用户能够完成特定的工作,也可以避免泄露 root 管理员密码。我们要做的就是合理配置 sudo 服务,以便兼顾系统的安全性和用户的便捷性。
sudo
-
授权原则:在保证普通用户完成相应工作的前提下,尽可能少地赋予额外的权限。
-
sudo命令用于给普通用户提供额外的权限,语法格式为sudo [参数] 用户名。 -
使用
sudo命令可以给普通用户提供额外的权限来完成原本只有 root 管理员才能完成的任务,可以限制用户执行指定的命令,记录用户执行过的每一条命令,集中管理用户与权限(/etc/sudoers),以及可以在验证密码后的一段时间无须让用户再次验证密码。 -
sudo命令中的可用参数以及作用:参数 作用 -h列出帮助信息 -l列出当前用户可执行的命令 -u用户名或 UID 值以指定的用户身份执行命令 -k清空密码的有效时间,下次执行 sudo时需要再次进行密码验证-b在后台执行指定的命令 -p更改询问密码的提示语
visudo
-
visudo命令用于编辑、配置用户sudo的权限文件,语法格式为visudo [参数]。 -
visudo命令会自动调用 vi 编辑器来配置/etc/sudoers权限文件,能够解决多个用户同时修改权限而导致的冲突问题。 -
visudo命令还可以对配置文件内的参数进行语法检查,并在发现参数错误时进行报错提醒。这要比用户直接修改文件更友好、安全、方便。 -
visudo命令只有 root 管理员才可以执行,普通用户在使用时会提示权限不足。 -
使用
visudo命令配置权限文件时,其操作方法与 Vim 编辑器中用到的方法完全一致,因此在编写完成后记得在末行模式下保存并退出。谁可以使用 允许使用的主机=(以谁的身份) 可执行命令的列表- 谁可以使用: 稍后要为哪位用户进行命令授权。
- 允许使用的主机: 可以填写 ALL 表示不限制来源的主机,亦可填写如
192.168.10.0/24这样的网段限制来源地址,使得只有从允许网段登录时才能使用 sudo 命令。 - 以谁的身份: 可以填写 ALL 表示系统最高权限,也可以是另外一位用户的名字。
- 可执行命令的列表: 可以填写 ALL 表示不限制命令,亦可填写如
/usr/bin/cat这样的文件名称来限制命令列表,多个命令文件之间用逗号(,)间隔。- 生产环境中不允许某个普通用户拥有整个系统中所有命令的最高执行权(这也不符合前文提到的权限赋予原则,即尽可能少地赋予权限),ALL 参数就有些不合适了。因此只能赋予普通用户具体的命令以满足工作需求,这也受到了必要的权限约束。
- 如果需要让某个用户只能使用 root 管理员的身份执行指定的命令,切记一定要给出该命令的绝对路径,否则系统会识别不出来。这时可以先使用 whereis 命令找出命令所对应的保存路径。
linuxprobe ALL=(ALL) ALLlinuxprobe ALL=(ALL) NOPASSWD:/usr/bin/cat,/usr/sbin/reboot:用户下次再执行sudo命令时就不用密码验证。
[root@linuxprobe ~]# visudo
[root@linuxprobe ~]# su - linuxprobe
[linuxprobe@linuxprobe ~]$ sudo -l # 列出当前 linuxprobe 用户可执行的命令
[sudo] password for linuxprobe:
Matching Defaults entries for linuxprobe on linuxprobe:
!visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset,
env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR
USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT
LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE",
env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY",
secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin
User linuxprobe may run the following commands on linuxprobe:
(ALL) ALL
[linuxprobe@linuxprobe ~]$ cat /etc/shadow
cat: /etc/shadow: Permission denied
[linuxprobe@linuxprobe ~]$ sudo cat /etc/shadow
root:$6$PhbzTyjeKXr0Z5/z$ucA79tg5.Vwy9nOxz.Kxe9gqB.dE4Zy9R87OACLr0ETgoLX7kmbfgya1vFzrf5Gc6.sZ9a.rtGZp.Vl472YGl.:19519:0:99999:7:::
bin:*:18199:0:99999:7:::
daemon:*:18199:0:99999:7:::
adm:*:18199:0:99999:7:::
总结
是 UID 为 0 的用户,是权限最大、限制最小的管理员。
添加和删除用户的命令分别是 useradd 与 userdel。
所有者权限为 rwx,所属组和其他人的权限为 r--,因此数字法表示应该是 744。
rwxrw-r--,那么对应的数字法权限应该是多少?数字法权限应该是 764。
在 Linux 系统中,不同文件具有不同的类型,因此这里应写成 lrwxr-xr-x。
特殊权限中的 SUID。
+i 参数),则意味着什么?无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的子文件内容而不能新建或删除文件。
linuxprobe 用户组,使得该组中的所有成员不得在 /tmp 目录中写入内容。
想要设置用户组的 ACL,则需要把 u 改成 g,即 setfacl -Rm g:linuxprobe:r-x /tmp。
sudo 命令时是否需要验证密码?
系统在默认情况下需要验证当前登录用户的密码,若不想验证,可添加 NOPASSWD 参数。