第一题、三种权限rwx对文件和目录的意义
权限对文件的意义
r(read):可以读取文件的内容,如读取文本文件的内容
w(write):可以编辑、新增或者是修改文件的内容,但不含有删除文件(需要执行权限)
x(execute):该文件具有可以被执行的权限
像windows里面的文件的是否能够执行是按照其扩展名来判断的,而在Linux中,我们的文件是否能够被执行是根据是否具有“x”权限,而跟文件名是没有关系的。
当你对一个文件具有w的权限是,你可以写入,编辑,新增,修改文件的内容,不具备删除文件本身的权限,要想删除该文件必须具有“x”的权限,因此对于文件的r、w、x来说主要是针对文件的内容,而与文件名是否存在是没有关系的,因为文件记录的实际数据。
权限对目录的意义
r(read contents in directory)表示具有读取目录列表的权限,所以当你对一个目录具有r权限时,表示你是否可以查看目录下面的文件名数据,所以你就可以利用ls命令将该目录的内容列表显示出来。不管有没有x权限,都可以强制的把目录列表显示出来,尽管会报错。如下图
w(modify content of directory)这个权限表示具有更改该目录结构列表的权限,可以新建新的目录和文件,可以删除已经存在的文件或目录(不论该文件的权限如何),将已经存在的文件或目录重命名,转移该目录内文件,目录的位置,总之目录的w权限就与该目录下面的文件名变动有关,而不是文件的内容。
通过该实验目录仅有w权限是没有办法进行如上的操作的,需要配合x权限才可以在该目录下执行任何命令,所以两个权限是需要配合使用的,再看下面的实验就是到了,可以创建文件或者删除,但是因为没有r的权限,所以没有办法读取目录列表有哪些文件。
x(access directory)目录的x代表用户能否进入该目录成为工作目录,进行执行命令的权限,因此如果你不具有x权限,那么你就没有办法切入到该目录,无法正确执行该目录下的任何命令,即使有r权限(尽管列出目录列表的文件,也都会报错)。
第二题、umask和mask的区别和联系
首先我们知道umask指的就是目前用户在新建文件或者目录时候默认的权限值,它是可以屏蔽文件(666)或者目录(777)的最大权限,以获得当前目录或者文件的权限。而mask的设置指的是用户或者组对该文件的权限不能超过mask的默认权限值。
两者都是对权限的的限制,但是作用对象是不一样的,umask的设定是针对新建文件或者目录的权限,作用对象是文件或者目录。而mask的设定是针对用户或者组对已存在文件的使用权限,作用对象是用户或者组。两者的限制都可以避免权限过大,有效的保护系统里面的文件或者目录安全。
umask和mask是对于目录来说是可以继承的,在下面的目录在创建新文件,umask和mask值是不会变的(前提是同一个用户,默认root用户的umask值是022,而一般用户的umask默认值是002),两者都可以使用命令或者修改配置文件进行修改。
第三题、三种特殊权限的应用场景和作用
SUID
限制及其功能:
1、首先SUID的权限只能作用于二进制程序上
2、进程的发起者对该二进制程序必须需要有执行权限
3、启动进程后,其进程的属主就为原程序文件的属主
4、本权限仅在执行该程序的过程中会有效,并且SUID文件设置在目录上是没有意义的
场景:我们知道/etc/shadow文件的所有者root只用读的权限,属主和其他人是没有任何权限的,但是我们作为普通用户想要查看这个文件怎么办呢?
如果我们需要查看这个文件,我们需要使用cat命令,我们知道cat命令是二进制程序,我们使用which cat 命令查看该二进制的程序是放在/bin/cat文件里的,此时我们将二进制程序文件赋予权限SUID时(o+s),并且该文件的other必须要有x权限,仅这两个权限即可,这时我们切换到普通用户时,直接使用cat /etc/shadow即可查看该文件的内容,具体为什么呢?
我们分析下,第一点/bin/cat 二进制程序文件具有other的执行权限,我们普通用户使用cat命令时,这个程序的发起者相对于/bin/cat这个二进制程序是other的身份,由于有x权限,我们就可以执行cat这个命令。
第二点/bin/cat二进制程序文件具有SUID的特殊权限是,这个时候普通用户启动进程时,该进程的属主就是我们的普通用户,这个普通用户就相当于该二进制程序文件/bin/cat的所有者,我们知道该文件的所有者是root,这个普通用户就相当于root用户,因此这个普通用户去查看/etc/shadow(文件的所有者就是root,并且有r权限)是可以查看的
有些人认为root的权限太大,普通用户是继承了他的权限,就会打开任意文件,并不是这样的。我们可以把/etc/shadow和/bin/cat的属组改为普通用户,当有SUID权限和x权限时,不管哪个用户发起的查看/etc/shadow这个进程都可以执行成功的,这里再次强调启动进程之后,其进程的属主就是原程序文件的属主(是他们的身份)
SGID
限制及其功能:此权限可以作用于二进制程序文件上,也可以作用于目录上面
可执行的文件上的SGID权限
1、任何一个可执行的程序文件能不能启动为进程,取决于发起者对于该程序文件时候有x的权限。
2、启动为进程之后,其进程的属主为原程序文件的属组
场景:原理同SUID,具体参考SUID的场景即可
简单举一个例子,我们使用/usr/bin/locate这个二进制程序去查看/var/lib/mlocate/mlocate.db这个文件,我们查看这两个文件的权限时可以知道他们两个的属组都是slocate组,当把/usr/bin/locate文件加上SGID权限时,我们的普通用户就可以使用locate命令查看上面的mlocate.db文件了,因为当这个普通用户启动进程时,他就获得了slocate这个组的支持,因此就可以查看文件了。
目录上的SGID权限
1、用户对于此目录有r、x权限时,该用户能够进入该目录,这是第一步
2、用户在这个目录下面的主组是将会变成该目录的用户组
3、用户对于该目录有w权限时(可以新建文件),则新建的文件的用户组和此目录的用户组是相同的
场景:SGID针对目录上的权限,在实际项目开发中很常见,我们这个项目组叫Project,里面共有两个用户tom,xiaoming ,这时候要求这两个用户对/testdir/test目录有共同的开发权,两者都可以在该目录下面创建新的文件,并且这个文件的属组是Projict这个组,因此属于这个组的用户对她都可以有一定的权限,我们对/testdir/test这个目录的权限最好设置为2770,这时候都可以在这个Project组下,这两个用户可以互相修改对方的文件了。
Sticky
限制及其功能:
1、仅针对目录有效。
2、具有写入权限的(w、x)的目录通常普通用户可以任意删除该目录下面其他用户创建的文件或者目录,无论该文件的权限和所有者。
3、如果在目录上面设置Sticky位时,在该目录下面的文件或者目录,只有文件或者目录的所有者或root可以删除。
场景:/testdir/test这个目录的other权限我们设置为w x权限,我们使用普通用户andy登录时,在这个目录下面创建文件aa和目录bb,然后换一个其他用户li登录时,在这个目录下面创建文件cc和目录dd,这时候li用户可以写东西进到文件所有者的aa文件,也可以删除文件aa,意味着li用户可以任意修改删除/testdir/test目录下面的任何文件。
此时我们在该目录上面加上Sticky位时,此时li用户只能删除和修改自己的文件。
第四题、设置user1,使之新建文件权限为rw——-
[root@localhost ~]# useradd user1 [root@localhost ~]# getent passwd user1 user1:x:6017:6017::/home/user1:/bin/bash [root@localhost ~]# su - user1 [user1@localhost ~]$ umask 0002 [user1@localhost ~]$ umask 066 [user1@localhost ~]$ umask 0066 [user1@localhost ~]$ touch aa [user1@localhost ~]$ ll aa -rw-------. 1 user1 user1 0 Aug 1 23:27 aa
此设置仅对当前进程有效,当退出该用户重新登录,它的默认权限又会变成系统默认的002,因此需要到/etc/bashrc里面进行修改(全部用户有效)或者到~/.bashrc(仅对当前用户有效)
第五题、设置/testdir/f1的权限,使user1用户不可以读写执行,g1组可以读写/testdir/dir的权限,使新建文件自动具有acl权限:user1:rw,g1:—
第一部分设置user1和g1组对该文件的acl权限:
[root@localhost ~]# setfacl -m u:user1:0 /testdir/f1 [root@localhost ~]# setfacl -m g:g1:rw /testdir/f1 [root@localhost ~]# getfacl /testdir/f1 getfacl: Removing leading '/' from absolute path names # file: testdir/f1 # owner: root # group: root user::rwx user:user1:--- group::r-x group:g1:rw- mask::rwx other::r-x
第二部分设置该目录的acl权限能够被继承
[root@localhost ~]# setfacl -m d:u:user1:rw /testdir/f1 [root@localhost ~]# setfacl -m d:g:g1:0 /testdir/f1 [root@localhost ~]# getfacl /testdir/f1 getfacl: Removing leading '/' from absolute path names # file: testdir/f1 # owner: root # group: root user::rwx user:user1:--- group::r-x group:g1:rw- mask::rwx other::r-x default:user::rwx default:user:user1:rw- default:group::r-x default:group:g1:--- default:mask::rwx default:other::r-x
验证下是否继承了目录的acl权限,实验操作的确新建文件就会自动继承父目录的acl权限
[root@localhost ~]# cd /testdir/f1 [root@localhost f1]# touch aa [root@localhost f1]# mkdir bb [root@localhost f1]# ll -d aa bb -rw-rw-r--+ 1 root root 0 Aug 1 23:57 aa drwxrwxr-x+ 2 root root 4096 Aug 1 23:57 bb [root@localhost f1]# getfacl aa # file: aa # owner: root # group: root user::rw- user:user1:rw- group::r-x#effective:r-- group:g1:--- mask::rw- other::r--
备份/testdir目录中所有文件的ACL,清除/testdir的所有ACL权限,并利用备份还原
第一步备份
[root@localhost testdir]# getfacl -R . > testdir.acl [root@localhost testdir]# cat testdir.acl # file: . # owner: root # group: root user::rwx group::rwx other::rwx # file: fi # owner: root # group: root user::rwx group::r-x other::r-x
。。。。。。。。略
第二步、删除(需要加R选项删除下面包括目录的acl权限)
[root@localhost testdir]# setfacl -b . [root@localhost testdir]# ll ./f1 total 12 -rw-rw-r--+ 1 root root 0 Aug 1 23:57 aa drwxrwxr-x+ 2 root root 4096 Aug 1 23:57 bb [root@localhost testdir]# setfacl -bR . [root@localhost testdir]# ll ./f1 total 12 -rw-r--r--. 1 root root 0 Aug 1 23:57 aa drwxr-xr-x. 2 root root 4096 Aug 1 23:57 bb
第三步、恢复/testdir目录的acl权限,并查看下面的文件或目录的确恢复了
[root@localhost testdir]# setfacl --restore=testdir.acl [root@localhost testdir]# ll ./f1 total 12 -rw-rw-r--+ 1 root root 0 Aug 1 23:57 aa drwxrwxr-x+ 2 root root 4096 Aug 1 23:57 bb
原创文章,作者:AndyIvanXue,如若转载,请注明出处:http://www.178linux.com/28865