一、文件目录权限
①rwx基础权限组合
②隐藏属性:a、i
③SUID、SGID、SBIT
④ACL
⑤sudo :给用户开放执行某些命令的权限,在开放的同时能够进行一些限制。
1. 文件和目录中R、W、X权限的差别:
|
字符 |
数字 |
目录 |
文件 |
|
R |
4 |
查看目录下的文件与目录名称 |
查看文件内容 |
|
W |
2 |
在目录下增,删,改文件与目录名称 |
修改文件内容 |
|
X |
1 |
可以用cd命令进入该目录 |
可执行,一般为程序或脚本 |
(1)文件权限:
rwx:可读、可写、可执行。
rw:可读、可写、不可执行。
rx:可读、不可写、可执行。
wx:不可读、可强制覆盖性写入、不可执行(shell脚本)。
r:只读
w:不可读、可强制覆盖性写入、不可执行。
x:不可读、不可写、不可执行(shell脚本)。
注:二进制文件只要有x权限就能执行,shell脚本需要rx权限才能执行
(2)目录权限:读对应ls查看目录中子文件子目录,写对应目录中创建文件删除文件修改文件名称,执行对应cd切换到目录中
rwx:可读、可写、可执行。
rx:可读、不可写、可执行。
rw:读权限无法查看文件详细信息,无法对目录下的文件进行删除或新建文件,不可执行。
wx:不可读、可写、可执行。
r:读权限无法查看文件详细信息,不可写、不可执行。
w:不可读、不可写、不可执行。
x:不可读、不可写、可执行。
问:如何以用户最低权限把文件存进来?
答:需要wx权限
2. 文件目录权限的修改
命令:chmod
描述:改变文件或目录权限。
用法:chmod [选项] 权限 文件或目录
选项:-R #递归将权限应用于所有的子目录与子文件。
chmod 命令参数中,u代表所有者,g代表所属组,o代表其他用户,a代表所有人。
[root@localhost ~]# chmod -R 666 ./nginx-1.26.2
[root@localhost ~]# ls -ld ./nginx-1.26.2
drw-rw-rw-. 9 502 games 186 6月 19 13:13 ./nginx-1.26.2
[root@localhost ~]# ls -l ./nginx-1.26.2
总用量 836
drw-rw-rw-. 6 502 games 4096 6月 19 13:08 auto
-rw-rw-rw-. 1 502 games 327851 8月 13 2024 CHANGES
3. 文件归属修改
命令:chown
描述:修改文件或目录的所有者与所属组。
用法:chown [选项] [所有者]:[所属组] 文件或目录
选项:-R #递归将权限应用于所有的子目录与子文件。
[root@localhost ~]# chown -R cxk:cxk ./nginx-1.26.2
[root@localhost ~]# ls -ld ./nginx-1.26.2
drw-rw-rw-. 9 cxk cxk 186 6月 19 13:13 ./nginx-1.26.2
[root@localhost ~]# ls -l ./nginx-1.26.2
总用量 836
drw-rw-rw-. 6 cxk cxk 4096 6月 19 13:08 auto
-rw-rw-rw-. 1 cxk cxk 327851 8月 13 2024 CHANGES
4. 文件隐藏属性
Linux 下的文件还有一些隐藏属性,使用lsattr来查看。
命令:lsattr
描述:查看文件系统属性
用法:lsattr 选项 文件名
选项:
-a #显示所有文件和目录
-d #若目标是目录,仅列出目录本身属性
[root@localhost ~]# lsattr -d /root #显示/root目录的隐藏属性
---------------------- .
[root@localhost ~]# lsattr /root #显示/root目录下文件的隐藏属性
---------------------- ./anaconda-ks.cfg
---------------------- ./nginx-1.26.2.tar.gz
---------------------- ./nginx-1.26.2
[root@localhost ~]# lsattr -a /root #显示/root目录下所有文件(包括隐藏文件)的隐藏属性
---------------------- ./.
---------------------- ./..
---------------------- ./.ssh
---------------------- ./.bash_logout
---------------------- ./.bash_profile
---------------------- ./.bashrc
---------------------- ./.cshrc
---------------------- ./.tcshrc
---------------------- ./anaconda-ks.cfg
---------------------- ./nginx-1.26.2.tar.gz
---------------------- ./.viminfo
---------------------- ./nginx-1.26.2
---------------------- ./.bash_history
命令:chattr(超级用户可用)
描述:修改文件隐藏属性
用法:chattr [+-=] [选项] 文件或目录
选项:
i:如果对文件设置i属性,那么不允许对文件进行删除、改名,也不能添加和修改数据;如果对目录设置i属性,那么只能修改目录下文件的数据,但不允许建立和删除文件。
a:如果对文件设置a属性,那么只能在文件中增加数据,但是不能删除也不能修改数据;如果对目录设置a属性,那么只允许在目录中建立和修改文件(echo追加覆盖),但是不允许删除。
e:曾经Linux 中绝大多数的文件都默认拥有e属性。表示该文件是使用ext4 (CentOS6)文件系统进行存储的,而且不能使用“chattr -e”命令取消e属性
[root@localhost ~]# chmod 777 /test/group #修改文件权限为最大权限
[root@localhost ~]# ls -l /test/group
-rwxrwxrwx. 1 root root 0 6月 19 17:39 /test/group
[root@localhost ~]# vim /test/group #文件中写入echo “cxk nb 666”
[root@localhost ~]# lsattr /test/group
---------------------- /test/group
[root@localhost ~]# chattr +i /test/group #对文件设置i属性
[root@localhost ~]# lsattr /test/group
----i----------------- /test/group
[root@localhost ~]# chmod 777 /test/ #上级目录权限开到最大,避免影响
切换为user1用户,测试加i属性的文件
[user1@localhost ~]$ cat /test/group #可以查看文件内容
echo "cxk nb 666"
[user1@localhost ~]$ vim /test/group #只读,不能修改文件内容,强制保存退出也不行
cho "cxk nb 666"
"/test/group" [只读] 1L, 18B 1,1 全部
[user1@localhost ~]$ rm -rf /test/group #无法删除
rm: 无法删除 '/test/group': 不允许的操作
[user1@localhost ~]$ /test/group #可以执行
cxk nb 666
切换为root用户,修改权限
[root@localhost ~]# chattr -i /test/group #删除文件的i属性
[root@localhost ~]# chattr +i /test/ #目录设置i属性
[root@localhost ~]# lsattr -d /test/
----i----------------- /test/
切换为user1用户,测试加i属性的目录
[user1@localhost ~]$ rm -rf /test/cxk #不能删除目录下的文件/目录
rm: 无法删除 '/test/cxk/nb.txt': 权限不够
[user1@localhost ~]$ touch /test/nb.txt #不能在目录下创建文件/目录
touch: 正在设置 '/test/nb.txt' 的时间: 没有那个文件或目录
[user1@localhost test]$ mv group group1 #不能修改目录下文件的名称
mv: 无法将'group' 移动至'group1': 不允许的操作
[user1@localhost ~]$ cd /test/ #可以执行进入目录
[user1@localhost test]$ ls -a #可以查看目录下信息
. .. cxk group
[user1@localhost test]$ vim group #可以修改目录下文件的内容
[user1@localhost test]$ cat group #可以查看目录下文件的内容
echo "cxk nb 666"xxxxx
[user1@localhost ~]$ rm -rf /test/group
rm: 无法删除 '/test/group': 不允许的操作
切换为root用户,修改权限
[root@localhost ~]# chattr -i /test/ #删除目录的i属性
[root@localhost ~]# chattr +a /test/group #文件设置a属性
切换为user1用户,测试加a属性的文件(适合日志文件)
[user1@localhost ~]$ cat /test/group #可以查看文件
echo "cxk nb 666"xxxxx
[user1@localhost ~]$ vim /test/group #不能修改文件内容,强制保存退出也不行
[user1@localhost ~]$ echo "123" >> /test/group #可以追加写入文件内容
[user1@localhost ~]$ cat /test/group
echo "cxk nb 666"xxxxx
123
[user1@localhost ~]$ rm -rf /test/group #不能删除文件
rm: 无法删除 '/test/group': 不允许的操作
切换为root用户,修改权限
[root@localhost ~]# chattr -a /test/group #删除文件的a属性
[root@localhost ~]# chattr +a /test/ #设置目录的a属性
切换为user1用户,测试加a属性的目录
[user1@localhost ~]$ touch /test/nb.txt #可以在目录下创建文件
[user1@localhost ~]$ ls -l /test/
-rw-r--r--. 1 user1 root 0 6月 19 18:43 nb.txt
[user1@localhost ~]$ rm -rf /test/nb.txt #不可以删除目录下的文件
rm: 无法删除 '/test/nb.txt': 不允许的操作
[user1@localhost ~]$ vim /test/group #可以强制保存退出修改文件内容
[user1@localhost ~]$ cat /test/group
echo "cxk nb 666"
[user1@localhost ~]$ ls -a /test/ #会产生.swp文件,只增不减,不能删除
. 4913 cxk group .group.swn .group.swp grouz~
.. 5036 grou group~ .group.swo .group.swpx nb.txt
[user1@localhost ~]$ echo "333" >> /test/group #可以追加写入文件内容,不会产生.swp
[user1@localhost ~]$ cat /test/group
echo "cxk nb 666"
333
5.文件特殊权限
在多用户多任务的Linux系统里,每个进程的运行都与运行的用户和组相关联。 除了进程识别号(PID)以外,每个进程还有另外4个用户和组相关的识别号。他们分别 是:实际用户识别号(real user ID,RUID)、实际组识别号(real group ID,RGID)、 有效用户识别号(effect user ID,EUID)、有效组识别号(effect group ID,EGID)。
EUID 和 EGID 的作用在于确定一个进程对其访问的文件的权限和优先权。一般情况下,EUID、EGID与RUID和RGID相同。设置了SUID和SGID情况除外。
[root@localhost ~]# ll
-rw-r--r--. 1 root root 63 6月 22 16:05 while.c
[root@localhost ~]# chmod u+s,g+s,g+x,o+t while.c #给while.c所有者加SUID,所属组加GUID和执行权限,其他组加SBIT
[root@localhost ~]# ll
-rwSr-sr-T. 1 root root 63 6月 22 16:05 while.c #大写S(T)代表没有执行权限,小写s(t)表示有可执行权限
|
所有者 |
所属组 |
其他人 | ||
|
A |
rwx |
rwx |
rwx | |
|
421=7 |
421=7 |
421=7 | ||
|
x=s=suid |
x=s=sgid |
x=t=sbit | ||
|
suid=4 |
sgid=2 |
sbit=1 |
==7 |
[root@localhost ~]# touch aaa1
[root@localhost ~]# chmod 7777 aaa1 #设置7777权限,第一个7为suid+sgid+sbit
[root@localhost ~]# ll aaa1
-rwsrwsrwt. 1 root root 0 6月 22 18:50 aaa1
[root@localhost ~]# chmod 755 aaa1 #改成755权限,第一个默认为0,即0755
[root@localhost ~]# ll aaa1
-rwxr-xr-x. 1 root root 0 6月 22 18:50 aaa1
(1)SUID权限:
SUID:改变运行进程的用户身份,在程序运行后以程序所有者身份运行进程
当一个具有执行权限的文件设置SUID权限后,用户执行这个文件时将以文件所有者的身份执行。
特点:
①命令执行者要对该程序拥有x(执行)权
②只有可以执行的二进制程序设定SUID权限才会生效
③命令执行者在执行该程序时获得该程序文件所有者的身份
④SUID 权限只在该程序执行过程中有效,就是说身份改变只在执行过程中有效。
⑤可执行文件/usr/bin/passwd 所有者是root(UID为0),此文件被设置了SUID 权限。当一个UID为1000、GID为1000的用户执行此命令时,产生的进程RUID和RGID分 别是1000和1000,EUID是0、EGID是1000。
只有可以执行的二进制程序设定SUID权限才会生效
二进制程序.c生效,shell脚本.sh不生效
[root@localhost ~]# dnf -y install gcc vim #安装c语言编译器
[root@localhost ~]# gcc ./while.c #编译c语言
[root@localhost ~]# ls #得到a.out可执行文件
anaconda-ks.cfg a.out while.c
[root@localhost ~]# mv ./a.out / 将a.out文件放到根下,方便普通用户执行
[user1@localhost ~]$ /a.out #普通用户执行a.out
[root@localhost ~]# pstree -up #查看进程有没有用户身份转换——没有
└─sshd(21098)───sshd(21102,user1)───bash(21103)─┬─a.out(21805)
[root@localhost ~]# chmod u+s /a.out #给a.out文件加上SUID,普通用户再运行一次文件
[root@localhost ~]# pstree -up #查看进程有没有用户身份转换——有
└─sshd(21098)───sshd(21102,user1)───bash(21103)─┬─a.out(21810,root)
二进制文件只需要x就可以执行,shell脚本需要rx才能执行
[root@localhost ~]# ll /a.out /while.sh
-rwsr-xr-x. 1 root root 17208 6月 22 16:28 /a.out
-rwsr-xr-x. 1 root root 40 6月 22 16:05 /while.sh
[root@localhost ~]# chmod o-r /a.out /while.sh #去掉文件的其他人组读权限
[root@localhost ~]# ll /a.out /while.sh
-rwsr-x--x. 1 root root 17208 6月 22 16:28 /a.out
-rwsr-x--x. 1 root root 40 6月 22 16:05 /while.sh
[user1@localhost ~]$ /a.out #普通用户可以执行二进制文件
^C
[user1@localhost ~]$ /while.sh #普通用户不能执行shell脚本
/bin/bash: /while.sh: 权限不够
例:经过前边对passwd命令的学习,每个用户都可以使用passwd(该命令的绝 对路径是/usr/bin/passwd)来修改自己的密码。系统用来记录用户名和密码的文件分别为 /etc/passwd 和/etc/shadow,命令执行最终的结果是修改/etc/shadow 中对应的密码。对 于这个文件,只有root用户有读权限,而普通用户在修改密码时最终也会修改这个文件。
接下来查看一下各个配置文件的权限:
[root@localhost ~]# ls -l /etc/passwd
-rw-r--r--. 1 root root 938 6月 4 19:03 /etc/passwd
[root@localhost ~]# ls -l /etc/shadow
----------. 1 root root 711 6月 22 15:18 /etc/shadow
查看/usr/bin/passwd 权限:
[root@localhost ~]# ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 32656 5月 15 2022 /usr/bin/passwd
例:
首先登陆普通用户user1,进行修改密码:
[user1@localhost ~]$ passwd
更改用户 user1 的密码 。
当前的密码:
#修改到此步骤暂停,打开另一个终端执行pstree-up此命令会显示执行进程的用户。
└─sshd(11291)───sshd(11305,user1)───bash(11306)───passwd(11368,root)
#我们会看到以上信息,说明了user1用户通过ssh远程链接,运行了了一个bash的 shell 类型。然后执行passwd命令。在这个命令执行过程中,执行命令的身份被切换成了 root 用户。
[root@localhost ~]# ps aux
root 11368 0.0 0.7 17532 7040 pts/1 S+ 15:47 0:00 passwd
在文件所有者权限上有一个s,这就是说明该文件设置了SUID权限。也就是说在普通 用户在执行passwd命令的时候是使用passwd文件所有者的身份。
删除SUID权限的命令实例:
[root@localhost ~]# chmod u-s /usr/bin/passwd
[root@localhost ~]# ls -l /usr/bin/passwd
-rwxr-xr-x. 1 root root 32656 5月 15 2022 /usr/bin/passwd
添加或删除SUID的命令格式为:
chmod u+s /usr/bin/passwd #添加SUID权限
chmod u-s /usr/bin/passwd #删除SUID权限
(2)SGID权限:
SGID:对文件对目录
SGID 权限的功能和SUID类似。如果某个二进制文件的组权限设置了SGID权限。则在执行该文件时,用户将获得该文件所属组的权限。 SGID可以针对文件生效,也可以针对目录生效。在设置了SGID权限的目录下建立文件时,新建的文件的所属组会继承上级目录的所属组。
例 : 我们在使用 locate 命 令 查 找 文 件 的 时 候 ,实 际上是查询了 /var/lib/mlocate/mlocate.db 数据库。作为普通用户,能够正常使用 locate 命令的原 因,就在于locate命令本身具有SGID权限。
[root@localhost ~]# updatedb
[root@localhost ~]# ls -l /var/lib/mlocate/mlocate.db
-rw-r-----. 1 root slocate 1039925 6月 22 17:26 /var/lib/mlocate/mlocate.db
[root@localhost ~]# ls -l /usr/bin/locate
-rwx--s--x. 1 root slocate 41048 5月 16 2022 /usr/bin/locate
添加或删除SGID的命令格式为:
chmod g+s /usr/bin/passwd
chmod g-s /usr/bin/passwd
如果系统上不存在/var/lib/mlocate/mlocate.db 这个文件,那么就不能执行 locate 命 令。需要使用updatedb命令生成molcate.db文件后才能使用localte命令。
总结:
SGID 针对文件:
①命令执行者要对该程序拥有x(执行)权限。
②只有可执行的二进制程序设置SGID权限才会生效。
③程序在执行过程中,程序的组会改变成程序文件的所属组。
④SGID 权限同样只在该程序执行过程中有效,也就是说组身份的转变在程序执行过程中有效。
SGID 针对目录:
当用户在拥有SGID权限的目录下新建文件时,新建的文件的所属组会继承拥有 SGID 权限目录的所属组。
[root@localhost ~]# mkdir /test.d
[root@localhost ~]# chmod 777 /test.d/
[user1@localhost ~]$ ll /test.d/
总用量 0
[user1@localhost ~]$ ll -d /test.d/
drwxrwxrwx. 2 root root 6 6月 22 17:58 /test.d/
[user1@localhost ~]$ cd /test.d/
[user1@localhost test.d]$ touch ./aaa1
[user1@localhost test.d]$ ll
总用量 0
-rw-r--r--. 1 user1 user1 0 6月 22 17:59 aaa1
[root@localhost ~]# chmod g+s /test.d/ #给test.d文件加上SGID
[user1@localhost test.d]$ ll -d /test.d/
drwxrwsrwx. 2 root root 30 6月 22 18:02 /test.d/
[user1@localhost test.d]$ groups
user1
[user1@localhost test.d]$ touch ./bbb1
[user1@localhost test.d]$ ll #新文件所属组为上级目录所属组
总用量 0
-rw-r--r--. 1 user1 user1 0 6月 22 17:59 aaa1
-rw-r--r--. 1 user1 root 0 6月 22 18:02 bbb1
(3)Sticky BIT权限:
SBIT:对目录
sticky 权限只能用于设置在目录上,设置了这种权限的目录,只有该文件的创建者、 目录的拥有者和root可以删除自己的文件。在RedHat或CentOS系统中/tmp目录默认拥 有sticky 权限。
[user1@localhost test.d]$ ll -d /tmp
drwxrwxrwt. 5 root root 4096 6月 22 17:26 /tmp
添加或删除
chmod o+t /tmp/ #添加SBIT权限
chmod o-t /tmp/ #删除SBIT权限
[root@localhost ~]# ll -d /test.d/
drwxrwsrwx. 2 root root 30 6月 22 18:02 /test.d/
[root@localhost ~]# chmod g-s /test.d/ #排除SGID对目录的影响
[user1@localhost test.d]$ touch ccc1 #user1创建文件
[cxk@localhost test.d]$ touch ddd1 #cxk创建文件
[cxk@localhost test.d]$ ll
总用量 0
-rw-r--r--. 1 user1 user1 0 6月 22 17:59 aaa1
-rw-r--r--. 1 user1 root 0 6月 22 18:02 bbb1
-rw-r--r--. 1 user1 user1 0 6月 22 18:20 ccc1
-rw-r--r--. 1 cxk cxk 0 6月 22 18:21 ddd1
[cxk@localhost test.d]$ rm -rf ./* #cxk可以将所有文件删除,不是自己的也行
[cxk@localhost test.d]$ ll
总用量 0
[root@localhost ~]# chmod o+t /test.d/ #给test.d文件加SBIT
[user1@localhost test.d]$ touch aaa1 #user1创建文件
[user1@localhost test.d]$ touch bbb1
[cxk@localhost test.d]$ touch ccc1 #cxk创建文件
[cxk@localhost test.d]$ touch ddd1
[cxk@localhost test.d]$ ll
总用量 0
-rw-r--r--. 1 user1 user1 0 6月 22 18:26 aaa1
-rw-r--r--. 1 user1 user1 0 6月 22 18:27 bbb1
-rw-r--r--. 1 cxk cxk 0 6月 22 18:27 ccc1
-rw-r--r--. 1 cxk cxk 0 6月 22 18:27 ddd1
[cxk@localhost test.d]$ rm -rf ./* #cxk不能删除user1的文件,只能删除自己的
rm: 无法删除 './aaa1': 不允许的操作
rm: 无法删除 './bbb1': 不允许的操作
[cxk@localhost test.d]$ ll
总用量 0
-rw-r--r--. 1 user1 user1 0 6月 22 18:26 aaa1
-rw-r--r--. 1 user1 user1 0 6月 22 18:27 bbb1
[cxk@localhost test.d]$ vim ./aaa1 #cxk不能修改user1文件,也不能强制保存退出
6.ACL权限
ACL(access control list)访问控制列表,可以对单一的用户或者组设置对文件或 目录的独立rwx权限。
使用条件:所有者,所属组,其他人都设置完成了,再独立的给用户增加权限
(1)开启ACL权限(centos6.*、ext系列文件系统)
由于ACL是传统的Unix-like操作系统权限的额外支持项目,因此要使用ACL必须要 有文件系统的支持才行。目前绝大部分的文件系统都支持ACL的功能,包括 EXT3/EXT4,JFS,XFS 等。
xfs 文件系统: xfs 文件系统是Centos7/RockyLinux9 中默认使用的文件系统(旧版本通常为ext系 列),XFS文件系统默认开启ACL权限。因为是不同的文件系统,所以查询的方式也并不相同:
#在返回信息中:
第一条说明了:系统在252-32运行系统模式,其中就包含了ACL。
第二条说明了:具有ACL、安全属性、没有启用调试的SGI XFS。
(2)ACL权限的使用
描述:查看访问控制列表。
用法:getfacl 文件或目录
[root@localhost ~]# getfacl ./issue
# file: issue
# owner: root
# group: root
user::rw-
group::r--
other::r--
描述:设置访问控制列表。
用法:setfacl 【选项】 {-m|-x} {u:username:rwx} 文件或目录
选项:
-m #设置ACL条目
[root@localhost ~]# setfacl -m u:user1:rwx /issue
#u指所有者,可替换为所属组g和其他人o
#user1为用户名
#rwx为设置的权限
#/issue为要修改的目录或文件
[root@localhost ~]# getfacl /issue #查看文件的acl信息
getfacl: Removing leading '/' from absolute path names
# file: issue
# owner: root
# group: root
user::rw-
user:user1:rwx
group::r--
mask::rwx
other::r--
-x #删除指定用户的ACL权限
[root@localhost ~]# getfacl /issue
getfacl: Removing leading '/' from absolute path names
# file: issue
# owner: root
# group: root
user::rw-
group::r--
group:user1:rwx
mask::rwx
other::r--
[root@localhost ~]# setfacl -x g:user1 /issue #删除user1的所属组acl权限
[root@localhost ~]# getfacl /issue
getfacl: Removing leading '/' from absolute path names
# file: issue
# owner: root
# group: root
user::rw-
group::r--
mask::rwx
other::r--
-b #删除所有ACL条目
[root@localhost ~]# ll /issue #文件设置acl后会有加号,此时文件或目录权限不准确,需要使用getfacl查看详细信息
-rw-rwxr--+ 1 root root 24 6月 22 20:00 /issue
[root@localhost ~]# getfacl /issue
getfacl: Removing leading '/' from absolute path names
# file: issue
# owner: root
# group: root
user::rw-
user:user1:rwx
user:cxk:rw-
group::r--
group:bin:rw-
mask::rwx
other::r--
[root@localhost ~]# setfacl -b /issue #删除所有acl条目
[root@localhost ~]# getfacl /issue
getfacl: Removing leading '/' from absolute path names
# file: issue
# owner: root
# group: root
user::rw-
group::r--
other::r--
[root@localhost ~]# ll /issue #acl全部被删除完之后文件的+号就没了
-rw-r--r--. 1 root root 31 6月 22 20:04 /issue
-R #实现目录上的ACL权限递归
[root@localhost ~]# mkdir /nb
[root@localhost ~]# touch /nb/aaa{1..10}
[root@localhost ~]# setfacl -R -m u:cxk:rwx /nb #递归设置acl权限
[root@localhost ~]# getfacl /nb #nb目录有
getfacl: Removing leading '/' from absolute path names
user:cxk:rwx
[root@localhost ~]# getfacl /nb/aaa1 #目录下aaa1文件有
getfacl: Removing leading '/' from absolute path names
user:cxk:rwx
[root@localhost ~]# getfacl /nb/aaa3 #目录下aaa3文件有
getfacl: Removing leading '/' from absolute path names
user:cxk:rwx
-d #设置默认ACL权限(对目录生效) (最后设置,因为会被其他设置影响)
[root@localhost ~]# setfacl -R -m u:cxk:rwx /nb #递归创建/nb下aaa1到aaa10
[root@localhost ~]# ll /nb
-rw-rwxr--+ 1 root root 0 6月 22 20:25 aaa1
[root@localhost ~]# touch /nb/bbb{1..10} #创建bbb1到bbb10,没有和aaa一样,因为在递归时bbb还没创建,递归只能递归已经创建的文件或目录
[root@localhost ~]# ll /nb
-rw-rwxr--+ 1 root root 0 6月 22 20:25 aaa1
-rw-r--r--. 1 root root 0 6月 22 20:30 bbb1
[root@localhost ~]# setfacl -d -m u:cxk:rwx /nb #设置默认acl权限
[root@localhost ~]# touch /nb/ccc{1..10} #创建ccc1到ccc10,和aaa一样有acl但没有执行权限
[root@localhost ~]# ll /nb
-rw-rwxr--+ 1 root root 0 6月 22 20:25 aaa1
-rw-r--r--. 1 root root 0 6月 22 20:30 bbb1
-rw-rw-r--+ 1 root root 0 6月 22 20:34 ccc1
[root@localhost ~]# getfacl /nb/ccc1 #acl默认的最大权限为mask::rw-,有效权限为注释内容
getfacl: Removing leading '/' from absolute path names
# file: nb/ccc1
# owner: root
# group: root
user::rw-
user:cxk:rwx #effective:rw-
group::r-x #effective:r--
mask::rw-
other::r--
[root@localhost ~]# setfacl -m u:user1:rwx /nb #后续设置比默认权限大的值
[root@localhost ~]# getfacl /nb #默认值会变为更大的值
mask::rwx
[root@localhost ~]# setfacl -m m:r /nb/ccc1 #设置默认值为r--
[root@localhost ~]# getfacl /nb/ccc1
getfacl: Removing leading '/' from absolute path names
# file: nb/ccc1
# owner: root
# group: root
user::rw-
user:cxk:rwx #effective:r--
group::r-x #effective:r--
mask::r--
other::r--
[root@localhost ~]# chmod g-r /nb/ccc1 #组或用户或其他人,去掉读权限
[root@localhost ~]# getfacl /nb/ccc1 #默认权限也去除读权限,实际权限也受影响
getfacl: Removing leading '/' from absolute path names
# file: nb/ccc1
# owner: root
# group: root
user::rw-
user:cxk:rwx #effective:---
group::r-x #effective:---
mask::---
other::r--
-k #删除默认ACL权限
[root@localhost ~]# getfacl /nb/ccc1
getfacl: Removing leading '/' from absolute path names
user:cxk:rwx #effective:---
group::r-x #effective:---
mask::---
[root@localhost ~]# setfacl -k -m u:cxk:rw /nb/ccc1 #删除默认acl权限
[root@localhost ~]# getfacl /nb/ccc1
getfacl: Removing leading '/' from absolute path names
user:cxk:rw-
group::r-x
mask::rwx
例:
为user1 用户对anaconda-ks.cfg添加 ACL权限:
(首先查看文件,此时没有ACL权限设置)
(设置ACL权限为rwx后,用getfacl命令查看)
(-x选项为删除某项的ACL权限,也就是某用户对文件(或目录)的ACL权限)
(给root家目录下anaconda-ks.cfg文件设置ACL权限)
(再设置两条用-b选项看效果)
(可以看到setfacl命令-b选项一次性清空了所有ACL权限)
在ACL权限里可以添加-R选项来递归设置ACL权限,具体格式是:
setfacl-R-m u:user:rwx aa
mask:在 ACL 权限里还有mask的相关设置,可以把mask理解为有效权限。它的意思 就是用户或组的权限必须要存在于mask的权限设置范围内才能生效。下面请看实例:
(给user1 用户在/test/目录赋予rwx的ACL权限)
(为test目录设置mask为r可读。再次查看发现ACL权限出现了变化。user1的ACL 权限在加上mask之后只有r权限。)
注:为/test/添加默认最大权限(mask)为r,其他ACL权限不得超出此权限。但 mask 的设置必须遵循最后设置原则,其他ACL权限设置完成后最后设置mask默认ACL才 能正常生效。在生产环境中我们通常将mask默认设置成rwx,然后针对不同的用户和用户 组规定他们权限。
在设置acl 之后,ls-l查看文件权限结果中所属组权限输出结果并不准确。以 getfacl 结果为准。
二、执行命令权限
设置主机名
hostname #查看主机名
hostnamectl set-hostname xxhf #将主机名设置为xxhf
/etc/hostname #保存主机名配置文件
1.sudo
给用户开放执行某些命令的权限,在开放的同时能够进行一些限制
打开方式:
①vim /etc/sudoers
②visudo(建议)(不仅有字体颜色,还能在退出时提醒错误)
|
root |
ALL=(ALL) #(ALL)默认为root |
ALL |
|
用户名 |
主机名=(用户名) |
可执行命令绝对路径 |
|
hf01 |
ALL=root(主机名最好为ALL,通用) |
[root@cxk ~]# visudo #将cxk加入/etc/sudoers配置文件,给其root权限
root ALL=(ALL) ALL
cxk ALL=(ALL) ALL
[cxk@cxk ~]$ sudo useradd xxx1 #cxk使用root权限创建用户
[sudo] cxk 的密码:
[cxk@cxk ~]$ tail -n 1 /etc/passwd #用户xxx1创建成功
xxx1:x:1002:1002::/home/xxx1:/bin/bash
[cxk@cxk ~]$ sudo cat /etc/shadow #可以查看配置文件,刚才输入过密码,短时间内不需要再输入
xxx1:!!:20626:0:99999:7:::
[root@cxk ~]# visudo #将主机名改成cx
cxk cx=(ALL) ALL
[cxk@cxk ~]$ sudo cat /etc/shadow #cxk用户无法执行sudo
cxk 无权在 cxk 上运行 sudo。此事将被报告。
[root@cxk ~]# visudo #将主机名改成cxk
cxk cxk=(ALL) ALL
[cxk@cxk ~]$ sudo cat /etc/shadow #cxk用户可以执行sudo
xxx1:!!:20626:0:99999:7:::
[root@cxk ~]# visudo #只开放添加用户和设置密码sudo
root ALL=(ALL) ALL
cxk ALL=(ALL) /usr/sbin/useradd,/usr/bin/passwd
[cxk@cxk ~]$ sudo useradd xxx2 #可以添加用户
[cxk@cxk ~]$ sudo passwd xxx2 #可以修改密码
更改用户 xxx2 的密码 。
新的密码:
无效的密码: 密码少于 8 个字符
重新输入新的密码:
passwd:所有的身份验证令牌已经成功更新。
[root@cxk ~]# visudo #!加内容是禁止做的命令,防止普通用户修改root密码
cxk ALL=(ALL) /usr/sbin/useradd,/usr/bin/passwd,!/usr/bin/passwd root,!/usr/bin/passwd "",!/usr/bin/passwd --stdin root
[root@cxk ~]# visudo #wheel组的用户为管理员,可以设置权限,上面对个人限制,但没有对管理员组限制,就可以修改root密码
%wheel ALL=(ALL) ALL
在系统中root的权限是最高的,但仅仅因为需要执行某几条命令就将root用户 密码告知其他用户的话那么系统安全则无法保证。
当某些用户需要以root身份执行某些命令时我们可以使用sudo的方式运行,使 用sudo 既能保证普通用户运行一些原本无法执行的命令,又能保证root密码不会泄露, 同时还能对普通用户在执行命令过程中的某些行为进行限制。
sudo 的使用方式是在sudo后加上需要执行的命令。sudo执行流程如下:
1)当用户执行sudo时系统会在/etc/sudoers文件中查找该用户是否有执行sudo 的权限。
2)若用户具有执行sudo的权限后,系统会让用户输入自己的密码来确认。
3)密码输入成功,开始进行sudo后续的命令。但root执行sudo不需要输入密 码(如果切换的用户与执行者的身份相同也不用输入密码)。
因为在sudo执行的时候要去检查/etc/sudoers文件,所以先要对/etc/sudoers 文件进行修改,让该账号能够使用全部或部分的root命令功能。(可以用visudo命令打 开文件进行修改,在退出时如果有语法错误会提示)
例:
[root@cxk ~]# visudo
root ALL=(ALL) ALL
cxk ALL=(ALL)
[root@cxk ~]# visudo
/etc/sudoers:101:14: 语法错误
cxk ALL=(ALL)
^
现在做什么?
选项有:
重新编辑 sudoers 文件(e)
退出,不保存对 sudoers 文件的更改(x)
退出并将更改保存到 sudoers 文件(危险!)(Q)
(vim /etc/sudoers 添加 user1 的sudo权限)
格式为:用户账号 登录者的来源主机名=(可切换的身份) 可执行的命令
所以上面两行的意思是:
1)用户账号:系统默认为root可以使用sudo命令。后添加user1用户。
2)可以被管理的服务器的网络地址,写自己或者ALL代表任何来源地址都可以管 理本台服务器。
3)可切换身份:这个账号可以切换成什么身份来执行后续的命令。
4)可执行的命令:这个命令必须写绝对路径。
ALL:代表任何身份,任何主机,任何命令。
修改完成后切换用户查看sudo命令效果:
在/etc/sudoers 配置文件中,也可以添加授权组使用sudo命令:
(在本机中还有user2用户,默认组为user2。添加组的时候在组名添加%即可。之后保存 退出。)
例:给user1用户授权创建用户命令和修改用户密码命令。
(授权user1用户拥有更改密码,创建用户的权限,但是隐患是被授权的user1用户 可以用此命令修改root密码)
(在修改密码命令之后添加了!/usr/bin/passwd"",!/usr/bin/passwd root 等防止 普通用户更改root密码的操作)
sudo 和su命令的组合使用:
[user1@localhost ~]$ sudo CMD
#CMD 表示我们要执行的命令,使用空格隔开sudo与要执行的命令。
sudo 常见选项如下:
-l:查询当前用户来源主机名以及可用的命令。
-S:非交互式执行sudo(可用NOPASSWD代替)
-h:帮助,查询sudo命令选项。
例:非交互式执行sudo
[user1@localhost ~]$ echo "password" | sudo -S CMD
[cxk@cxk ~]$ sudo -l #查询当前用户来源主机名以及可用的命令
[sudo] cxk 的密码:
匹配 %2$s 上 %1$s 的默认条目:
用户 cxk 可以在 cxk 上运行以下命令:
(ALL) /usr/sbin/useradd, /usr/bin/passwd, !/usr/bin/passwd root, !/usr/bin/passwd \"\",
!/usr/bin/passwd --stdin root
[root@cxk ~]# visudo #加入NOPASSWD,用户使用sudo不需要密码
root ALL=(ALL) ALL
cxk ALL=(ALL) NOPASSWD:/usr/sbin/useradd,/usr/bin/passwd,!/usr/bin/passwd root,!/usr/bin/passwd "",!/usr/bin/passwd --stdin root
[root@cxk ~]# visudo #加上/usr/bin/su -,普通用户就可以变成root用户
root ALL=(ALL) ALL
cxk ALL=(ALL) NOPASSWD:/usr/sbin/useradd,/usr/bin/passwd,!/usr/bin/passwd root,!/usr/bin/passwd "",!/usr/bin/passwd --stdin root,/usr/bin/su -
[cxk@cxk ~]$ sudo su -
上一次登录: 二 6月 23 08:01:59 CST 2026 从 192.168.202.1 pts/0 上
[root@cxk ~]#
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/www_com__/article/details/170283194



