一、文章大纲
-
Linux基础权限
-
ACL访问控制
-
特殊权限SUID、SGID、STICKY和特殊属性
二、Linux基础权限
在Linux下,我们可以使用ll或ls -l命令方便查看一个文件的权限设置信息,如下图,我们将查看信息分为三个部分。
ll查看文件权限第一部分:-rw-------.
表示所有者、所属组和其他人对文件的访问权限,也可以分为3个部分:
rwx第1部分:表示文件类型,有以下类型
-
”-” 表示普通文件
-
”d” 表示目录
-
"l” 表示链接文件
-
"p" 表示管理文件
-
"b" 表示块设备文件
-
"c" 表示字符设备文件
-
"s" 表示套接字文件
第2部分:总共有9位,前面3位表示所有者对文件的权限,中间3位表示所属组对文件的权限,最后3位表示其他用户对文件的权限,使用rwx表示。
rwx除使用rwx表示外,另外一个直观的表示方式是使用数字,如:
-
查看文件a的权限为:rwxrwxrwx,对应数字表示为777,表明用户自己、所属组、其他人对该文件具有读取、写入(修改)和执行权限。
-
查看目录b的权限为:r-xr--r--,对应数字表示为644,表明用户自己对该目录具有读取权限,所属组、其他人虽然对目录有读取权限但因为没有执行权限无法进入目录实际上无权限。
#切换到tmp目录,创建test.file文件
[root@centos7 ~]# cd /tmp/
[root@centos7 tmp]# echo abcd > test.file
#查看文件权限,为644
[root@centos7 tmp]# ll test.file
-rw-r--r--. 1 root root 5 May 30 01:40 test.file
#新增xiaozeng用户
[root@centos7 tmp]# useradd xiaozeng
#切换用户,因为文件对其他用户有读取权限,所以新用户可以读取但是没办法修改
[root@centos7 tmp]# su xiaozeng
[xiaozeng@centos7 tmp]$ cat test.file
abcd
#因为没有写入权限,无法对文件进行
[xiaozeng@centos7 tmp]$ echo 1234 >> test.file
bash: test.file: Permission denied
#xiaozeng相对于root属于其他用户,取消其他用户对test.file文件的读取权限
[root@centos7 tmp]# chmod o-r test.file
[root@centos7 tmp]# ll test.file
-rw-r-----. 1 root root 5 May 30 01:40 test.file
[xiaozeng@centos7 tmp]$ cat test.file
cat: test.file: Permission denied
#也可以使用数字形式修改,比如给其他用户增加读取和写入权限
[root@centos7 tmp]# chmod 646 test.file
[root@centos7 tmp]# ll test.file
-rw-r--rw-. 1 root root 5 May 30 01:40 test.file
[xiaozeng@centos7 tmp]$ cat test.file
abcd
[xiaozeng@centos7 tmp]$ echo 1234 >> test.file
[xiaozeng@centos7 tmp]$ cat test.file
abcd
1234
第3部分:
表示facl权限,后面会详细介绍。
第二部分: 1
表示硬链接引用次数。
第三部分: root root
表示文件的所属用户和所属组。
#查看test.file文件权限
[root@centos7 tmp]# ll test.file
-rw-r--r--. 1 root root 5 May 30 01:51 test.file
#去掉other用户读取权限,因为这里用户和用户组为root,xiaozeng用户相对文件来说是其他用户
[root@centos7 tmp]# chmod o-r test.file
[root@centos7 tmp]# ll test.file
-rw-r-----. 1 root root 5 May 30 01:51 test.file
#切换xiaozeng用户,查看文件,提示没有权限
[root@centos7 tmp]# su xiaozeng
[xiaozeng@centos7 tmp]$ cat test.file
cat: test.file: Permission denied
#将文件的属组修改为xiaozeng
[root@centos7 tmp]# chown root:xiaozeng test.file
[root@centos7 tmp]# ll test.file
-rw-r-----. 1 root xiaozeng 5 May 30 01:51 test.file
#切换xiaozeng用户,可以查看文件,因为对就属组的权限是可读
[root@centos7 tmp]# su xiaozeng
[xiaozeng@centos7 tmp]$ cat test.file
abcd
三、ACL访问控制
上述基础权限控制还是太粗,我们试想这样一个场景:文件test.file属于用户root,属组为xiaozeng,对应权限为640,现在有新用户zhangsan也需要查看test.file文件,但是zhangsan用户相对文件属于other组,没有查看权限,在不改变属组的关系情况下该怎么办?这就要用到ACL访问控制了。
#添加用户zhangsan
[root@centos7 tmp]# useradd zhangsan
#切换用户zhangsan
[root@centos7 tmp]# su zhangsan
#没有权限查看文件
[zhangsan@centos7 tmp]$ cat test.file
cat: test.file: Permission denied
[zhangsan@centos7 tmp]$ ls -al test.file
-rw-r-----. 1 root xiaozeng 5 May 30 01:51 test.file
#查看文件acl权限
[root@centos7 tmp]# getfacl test.file
# file: test.file
# owner: root
# group: xiaozeng
user::rw-
group::r--
other::---
#设置acl权限,用户zhangsan用户对文件test.file读取权限。
[root@centos7 tmp]# setfacl -m u:zhangsan:r-- test.file
[root@centos7 tmp]# getfacl test.file
# file: test.file
# owner: root
# group: xiaozeng
user::rw-
user:zhangsan:r--
group::r--
mask::r--
other::---
#切换用户,可查看文件
[root@centos7 tmp]#
[root@centos7 tmp]# su zhangsan
[zhangsan@centos7 tmp]$ cat test.file
abcd
#修改内容,失败
[zhangsan@centos7 tmp]$ echo zhangsan >> test.file
bash: test.file: Permission denied
#设置zhangsan用户对文件读写权限
[root@centos7 tmp]# setfacl -m u:zhangsan:rw- test.file
[root@centos7 tmp]# getfacl test.file
# file: test.file
# owner: root
# group: xiaozeng
user::rw-
user:zhangsan:rw-
group::r--
mask::rw-
other::---
#切换用户,用户可以写入文件
[root@centos7 tmp]# su zhangsan
[zhangsan@centos7 tmp]$ echo zhangsan >> test.file
[zhangsan@centos7 tmp]$ cat test.file
abcd
zhangsan
#查看文件,多一个+号,表示文件设置acl权限
[root@centos7 tmp]# ll test.file
-rw-r-x---+ 1 root xiaozeng 14 May 30 04:04 test.file
#清除acl权限
[root@centos7 tmp]# setfacl -b test.file
[root@centos7 tmp]# getfacl test.file
# file: test.file
# owner: root
# group: xiaozeng
user::rw-
group::r--
other::---
#新建文件夹zs
[root@centos7 tmp]# mkdir zs
[root@centos7 tmp]# ls -ld zs/
drwxr-xr-x. 2 root root 6 May 30 04:13 zs/
#设置目录权限,去掉其他用户读写权限
[root@centos7 tmp]# chmod o-rx zs -R
[root@centos7 tmp]# ls -ld zs/
drwxr-x---. 2 root root 6 May 30 04:13 zs/
[root@centos7 tmp]#
#切换zhangsan用户,测试对目录访问权限
[root@centos7 tmp]# su zhangsan
[zhangsan@centos7 tmp]$ cd zs/
bash: cd: zs/: Permission denied
#设置zhangsan用户组对目录读写访问权限
[root@centos7 tmp]# setfacl -m g:zhangsan:rwx zs
[root@centos7 tmp]# getfacl zs
# file: zs
# owner: root
# group: root
user::rwx
group::r-x
group:zhangsan:rwx
mask::rwx
other::---
#切换zhangsan用户
[root@centos7 tmp]# su zhangsan
[zhangsan@centos7 tmp]$ cd zs/
#可以正常创建文件
[zhangsan@centos7 zs]$ touch abc
#查看创建文件权限,发现创建文件并没有fac权限
[zhangsan@centos7 zs]$ ls abc -l
-rw-rw-r--. 1 zhangsan zhangsan 0 May 30 04:17 abc
#可以加上d参数,这样该目录下文件会继承目录acl权限
[root@centos7 tmp]# setfacl -m d:g:zhangsan:rwx zs
[root@centos7 tmp]# getfacl zs
# file: zs
# owner: root
# group: root
user::rwx
group::r-x
group:zhangsan:rwx
mask::rwx
other::---
default:user::rwx
default:group::r-x
default:group:zhangsan:rwx
default:mask::rwx
default:other::---
#切换用户,创建文件
[root@centos7 tmp]# su zhangsan
[zhangsan@centos7 tmp]$ cd zs
[zhangsan@centos7 zs]$ touch bcd
[zhangsan@centos7 zs]$ ls -alth
total 0
drwxrwx---+ 2 root root 28 May 30 04:20 .
-rw-rw----+ 1 zhangsan zhangsan 0 May 30 04:20 bcd
-rw-rw-r--. 1 zhangsan zhangsan 0 May 30 04:17 abc
drwxrwxrwt. 9 root root 171 May 30 04:13 ..
#使用k参数取消默认权限设置
[root@centos7 tmp]# setfacl -k zs
[root@centos7 tmp]# getfacl zs
# file: zs
# owner: root
# group: root
user::rwx
group::r-x
group:zhangsan:rwx
mask::rwx
other::---
#使用b参数,取消acl权限设置
[root@centos7 tmp]# setfacl -b zs
[root@centos7 tmp]# getfacl zs
# file: zs
# owner: root
# group: root
user::rwx
group::r-x
other::---
四、特殊权限SUID、SGID、STICKY和特殊属性
SUID
作用:让普通用户临时拥有该文件的属主的执行权限,suid权限只能应用在二进制可执行文件(命令)上,而且suid权限只能设置在属主位置上。
增加权限 u+s,移除权限u-s,对应数字为4。
#拷贝一份cat命令,命名为suid_cat
[root@centos7 tmp]# cp /usr/bin/cat suid_cat
[root@centos7 tmp]# ll suid_cat
-rwxr-xr-x. 1 root root 54160 May 30 04:50 suid_cat
#切换xiaozeng用户
[root@centos7 tmp]# su xiaozeng
#查看shadow文件权限,权限为000也就意味着只有root可以查看(root是超级管理员)
[xiaozeng@centos7 tmp]$ ll /etc/shadow
----------. 1 root root 771 May 30 03:37 /etc/shadow
#使用拷贝的cat命令查看shadow文件,提示无权限,因为文件只能root查看
[xiaozeng@centos7 tmp]$ ./suid_cat /etc/shadow
./suid_cat: /etc/shadow: Permission denied
#切换root,给文件设置suid权限
[root@centos7 tmp]# chmod u+s suid_cat
#查看文件,发现文件属主由rxw变为rws,说明文件有suid权限
[root@centos7 tmp]# ll suid_cat
-rwsr-xr-x. 1 root root 54160 May 30 04:50 suid_cat
#切换xiaozeng用户
[root@centos7 tmp]# su xiaozeng
#可以成功查看shadow文件内容。因为具有suid权限的文件会临时拥有属主的权限,也就是root权限
[xiaozeng@centos7 tmp]$ ./suid_cat /etc/shadow
root:$6$BRi2HZ9h$nae7m9Ai0IYzQL5UT8H0REwHHEkzYemOFY6o85zdDblHaPUd2Bz2yFhT8bKvXpl1d41U1pdGFp.S.eLGWqOvF.:19503: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:!!:19499::::::
dbus:!!:19499::::::
polkitd:!!:19499::::::
sshd:!!:19499::::::
postfix:!!:19499::::::
test:$6$2UQjp2Fc$KvajSnGNhDRhA9//QpgqiUtMD0LvT6zoP8ohhveaVYrVlyM3dERo2NHlkYBOH33yZRSHUnb1N4EPcuB/F4qGr1:19499:0:99999:7:::
abc:!!:19499:0:99999:7:::
xiaozeng:!!:19506:0:99999:7:::
zhangsan:!!:19506:0:99999:7:::
#查看文件权限
[root@centos7 tmp]# ll suid_cat
-rwsr-xr-x. 1 root root 54160 May 30 04:50 suid_cat
#可以使用八进制0,表示不设置,也就是取消suid权限
[root@centos7 tmp]# chmod 0744 suid_cat
[root@centos7 tmp]# ll suid_cat
-rwxr--r--. 1 root root 54160 May 30 04:50 suid_cat
#使用八进制4,表示设置文件suid权限
[root@centos7 tmp]# chmod 4744 suid_cat
[root@centos7 tmp]# ll suid_cat
-rwsr--r--. 1 root root 54160 May 30 04:50 suid_cat
SGID
作用:sgid权限一般应用在目录上,当一个目录拥有sgid权限时,任何用户在该目录下创建的文件的属组都会****继承****该目录的属组。
sgid权限也使用s表示,增加权限g+s,移除权限g-s,对应数字为2。
#新建目录
[root@centos7 tmp]# mkdir sgid_dir
[root@centos7 tmp]# ls -ld sgid_dir/
drwxr-xr-x. 2 root root 6 May 30 04:59 sgid_dir/
#给目录设置757权限,即其他用户可访问可以读写
[root@centos7 tmp]# chmod 757 sgid_dir/
[root@centos7 tmp]# ls -ld sgid_dir/
drwxr-xrwx. 2 root root 6 May 30 04:59 sgid_dir/
#切换xiaozeng用户,并创建文件
[root@centos7 tmp]# su xiaozeng
[xiaozeng@centos7 tmp]$ cd sgid_dir/
[xiaozeng@centos7 sgid_dir]$ touch a
#查看文件,文件属于xiaozeng用户和xiaozeng组
[xiaozeng@centos7 sgid_dir]$ ll
total 0
-rw-rw-r--. 1 xiaozeng xiaozeng 0 May 30 05:00 a
#给目录设置sgid权限
[root@centos7 tmp]# chmod g+s sgid_dir/
#查看目录,属组权限由r-x变为r-s
[root@centos7 tmp]# ls -ld sgid_dir/
drwxr-srwx. 2 root root 24 May 30 05:01 sgid_dir/
#切换用户xiaoeng,并创建文件b
[root@centos7 tmp]# su xiaozeng
[xiaozeng@centos7 tmp]$ cd sgid_dir/
[xiaozeng@centos7 sgid_dir]$ touch b
#查看文件b属组,由于目录属组为root,所以文件自动继承其属组
[xiaozeng@centos7 sgid_dir]$ ll
total 0
-rw-rw-r--. 1 xiaozeng xiaozeng 0 May 30 05:00 a
-rw-rw-r--. 1 xiaozeng root 0 May 30 05:01 b
#
[root@centos7 tmp]# ls -ld sgid_dir/
drwxr-srwx. 2 root root 24 May 30 05:01 sgid_dir/
[root@centos7 tmp]# chmod 0757 sgid_dir/
[root@centos7 tmp]# ls -ld sgid_dir/
drwxr-srwx. 2 root root 24 May 30 05:01 sgid_dir/
STICKY
作用:sticky权限一般针对目录来设置,作用是只允该目录下的文件的创建者删除自己的创建的文件,不允许其他人删除文件。(root用户除外,因为root用户是超级管理员),而且sticky权限只能设置在other位置上。
增加权限o+t,移除权限o-t,对应数字为1。
#新建目录sticky_dir
[xiaozeng@centos7 tmp]$ mkdir sticky_dir
#赋予目录777权限,即任何人都可以读写
[xiaozeng@centos7 tmp]$ chmod 777 sticky_dir/
[xiaozeng@centos7 tmp]$ ls -althd sticky_dir/
drwxrwxrwx. 2 xiaozeng xiaozeng 6 May 30 05:49 sticky_dir/
#切换用户xiaozeng,并创建多个文件
[xiaozeng@centos7 tmp]$ cd sticky_dir/
[xiaozeng@centos7 sticky_dir]$ touch aaa
[xiaozeng@centos7 sticky_dir]$ touch bbb
#赋予文件aaa和bbb777权限
[xiaozeng@centos7 sticky_dir]$ chmod 777 aaa bbb
[xiaozeng@centos7 sticky_dir]$ ll
total 0
-rwxrwxrwx. 1 xiaozeng xiaozeng 0 May 30 05:50 aaa
-rwxrwxrwx. 1 xiaozeng xiaozeng 0 May 30 05:50 bbb
#切换zhangsan用户
[root@centos7 tmp]# su zhangsan
[zhangsan@centos7 tmp]$ cd sticky_dir/
#因为文件是777权限,所以用户zhangsan可以对文件读写
[zhangsan@centos7 sticky_dir]$ echo 1234 >> aaa
[zhangsan@centos7 sticky_dir]$ echo 567 > aaa
[zhangsan@centos7 sticky_dir]$ cat aaa
567
#也可以删除文件
[zhangsan@centos7 sticky_dir]$ rm aaa
[zhangsan@centos7 sticky_dir]$ exit
exit
#切回xiaozeng用户
[root@centos7 tmp]# su xiaozeng
#对目录设置STICKY权限
[xiaozeng@centos7 tmp]$ chmod o+t sticky_dir/
#查看目录权限,其他用户权限由rwx变为rwt
[xiaozeng@centos7 tmp]$ ls -ld sticky_dir/
drwxrwxrwt. 2 xiaozeng xiaozeng 17 May 30 05:51 sticky_dir/
#切换回sticky_dir目录
[xiaozeng@centos7 tmp]$ cd sticky_dir/
[xiaozeng@centos7 sticky_dir]$ ll
total 0
-rwxrwxrwx. 1 xiaozeng xiaozeng 0 May 30 05:50 bbb
#创建文件ccc,并设置777权限
[xiaozeng@centos7 sticky_dir]$ touch ccc
[xiaozeng@centos7 sticky_dir]$ chmod 777 ccc
[xiaozeng@centos7 sticky_dir]$ ll
total 0
-rwxrwxrwx. 1 xiaozeng xiaozeng 0 May 30 05:50 bbb
-rwxrwxrwx. 1 xiaozeng xiaozeng 0 May 30 05:53 ccc
#切换回zhangsan用户
[root@centos7 tmp]# su zhangsan
[zhangsan@centos7 tmp]$ cd sticky_dir/
#可以对文件正常写入
[zhangsan@centos7 sticky_dir]$ echo 1324 >> bbb
[zhangsan@centos7 sticky_dir]$ echo 6666 > bbb
[zhangsan@centos7 sticky_dir]$ cat bbb
6666
[zhangsan@centos7 sticky_dir]$ echo 1234 >> ccc
[zhangsan@centos7 sticky_dir]$ echo 666 > ccc
#虽然文件权限为777,但是目录设置STICKY,所以其他用户没办法删除文件
[zhangsan@centos7 sticky_dir]$ rm bbb
rm: cannot remove ‘bbb’: Operation not permitted
[zhangsan@centos7 sticky_dir]$ rm ccc
rm: cannot remove ‘ccc’: Operation not permitted
[root@centos7 tmp]# su xiaozeng
[xiaozeng@centos7 tmp]$ ll
total 0
drwxrwxrwt. 2 xiaozeng xiaozeng 28 May 30 05:53 sticky_dir
[xiaozeng@centos7 tmp]$ chmod 0777 sticky_dir/
[xiaozeng@centos7 tmp]$ ll
total 0
drwxrwxrwx. 2 xiaozeng xiaozeng 28 May 30 05:53 sticky_dir
[xiaozeng@centos7 tmp]$ chmod 1777 sticky_dir/
[xiaozeng@centos7 tmp]$ ll
total 0
drwxrwxrwt. 2 xiaozeng xiaozeng 28 May 30 05:53 sticky_dir
特殊属性
另外还有两种特殊的属性
i属性
添加i属性,文件不能写,不能删除,root用户也受限
#创建文件test
[root@centos7 tmp]# echo "hell world" > test
[root@centos7 tmp]# cat test
hell world
#给文件添加i属性
[root@centos7 tmp]# chattr +i test
#使用ls查看不到i属性,需要使用lsattr
[root@centos7 tmp]# ll test
-rw-r--r--. 1 root root 11 May 30 10:04 test
#使用lsattr查看
[root@centos7 tmp]# lsattr test
----i----------- test
#设置i属性后,文件不能添加
[root@centos7 tmp]# echo add >> test
-bash: test: Permission denied
#也无法删除
[root@centos7 tmp]# rm test
rm: remove regular file ‘test’? y
rm: cannot remove ‘test’: Operation not permitted
#使用-i取消i属性
[root@centos7 tmp]# chattr -i test
#查看文件属性
[root@centos7 tmp]# lsattr test
---------------- test
#取消属性后,可以删除文件
[root@centos7 tmp]# rm test
rm: remove regular file ‘test’? y
[root@centos7 tmp]#
a属性
添加a属性,文件只能追加,不能删除,root用户也受限
#创建文件test
[root@centos7 tmp]# echo hello > test
#添加a属性
[root@centos7 tmp]# chattr +a test
#无法重写文件
[root@centos7 tmp]# echo world > test
-bash: test: Operation not permitted
#可以追加
[root@centos7 tmp]# echo world >> test
#可以查看
[root@centos7 tmp]# cat test
hello
world
#无法删除,root也不行
[root@centos7 tmp]# rm test
rm: remove regular file ‘test’? y
rm: cannot remove ‘test’: Operation not permitted
#查看文件属性
[root@centos7 tmp]# lsattr test
-----a---------- test
#去掉文件a属性
[root@centos7 tmp]# chattr -a test
[root@centos7 tmp]# lsattr test
---------------- test
#去掉属性后可以删除文件
[root@centos7 tmp]# rm test
rm: remove regular file ‘test’? y
[root@centos7 tmp]#
网友评论