一、文件属性和权限
在Linux中使用颜色来区分文件类型,由于Linux是多用户系统那么对于文件的访问控制就需要有很好的机制了。于是在Linux中文件的属性和权限与用户身份绑定在了一起完成了Linux系统的多用户权限控制。
Linux多用户权限控制的本质,实际上就是让不同的用户能够访问的文件不同罢了。由于root可以访问任何文件所以就拥有了至高无上的权利。那么凭什么规定一个用户能访问那些文件而又不能访问那些文件呢?答案就是文件自己说了算;在Linux系统中,每个文件都会有一个特定的拥有者(一般是创建它的用户)和所属用户组,这是属于它的固有属性。文件可以利用这两个固有属性来规定它的拥有者或者其所属用户组内的用户是否拥有对它的访问权利,即读、写和执行的权利。此外为了提高适应性文件还规定了其它不相关人等也就是第三个固有属性,对它的读、写和执行的权利;这三个固有属性和三个权利合起来就构成了文件的针对系统中所有用户的访问控制。
二、分析文件属性
使用命令“ls -l”可以显示文件属性,如图
-:表示文件类型,常见文件类型如下:
–:普通文件 (file)
d: 目录文件(directory)
b: 块设备文件 (block)
c: 字符设备文件 (character)
l: 符号链接文件(symbolic link file)
p: 命令管道文件(pipe)
s: 套接字文件(socket)
rwxr-xr-x:表示文件权限9位,每3位一组(第一组表示属主的权限、第二组表示属组的权限、第三组表示其他人的权限)
r等同于“读”
w等同于“写”
x等同于“执行”
1:表示文件硬链接的次数
Root:表示文件的属主(属主对应第一组权限)
Root:表示文件的属组(属组对应第二组权限)
27776:表示文件大小
那么现在Linux的权限控制已经很明晰了,当某个用户需要访问某个文件时,系统就读取这个文件的属性和权限信息与当前用户的UID和GID进行对比,来确定当前用户是文件的拥有者还是与其所属用户组同组,亦或是毫无关系。然后根据这些比对结果和用户所执行的动作来判断是否满足权限要求。
三、进程安全上下文(secure context)
我们知道一个程序的运行必须产生一个进程进行使用计算机资源;任何时候用户操作计算机都是发起进程;进程也是用户操作计算机的代理(两个不同的用户andy和mark同时发起相同的命令LS进程查看相同的文件/andy/file,属主andy;他们所执行的权限相同吗?答案是否定的因为文件对应用户的权限不同。刚也说过用户的操作发起的都是进程那么文件在接受进程访问时怎么区分那个进程是andy那个是mark呢?)
所以在用户发起进程的时候一定是以发起它的用户的身份在运行;所以进程也是有属主和属组;文件在匹配进程时是以进程的属主和属组决定的、所以这个进程到底可以访问那些文件取决于这个进程自己的权限和它访问那个文件的权限这也叫进程的运行模型或安全上下文(这个过程的判断是由内核完成的)
四、特殊权限
其实Linux的文件权限不止是r、w、x,还包括s和t这两个特殊的权限,它们与系统的账号和系统的进行相关。
s这个标记可以出现在文件拥有者的x权限位上,也可以出现在文件所属组的x权限位上。这两种情况是有些差别的,前者被称为Set UID,简称SUID,而后者被称为Set GID,简称SGID。
SUID的功能
1、 SUID仅对二进制程序有效
2、 执行者对于改程序具有x的可执行权限
3、 执行权限仅在执行改程序的过程中有效
4、 执行者将具有改程序属主的权限
通俗表示修改suid表示运行某程序时对应进程的属主是程序文件自身的属主,而不是启动者。
说明:su这个命令,无论任何人,执行了它都将具有root权限,因为它的属主是root,只是这个权限在执行的su命令中有效。这也是su命令能够切换用户权限的实现原理。SUID在Linux中是非常常见的,哪些需要提供给普通用户,但是又需要root权限才能正确执行的程序基本上都拥有SUID,比如passwd、mount等命令。
SGID的功能
1、 SGID对二进制程序有效
2、 执行者对于改程序具有x的可执行权限
3、 执行者在执行的过程中将会获得该程序所属用户组的支持
修改sgid表示运行某程序时对应进程的属组是程序文件自身的属组,而不是启动者所属的基本组
说明:相对与SUID,SGID就比较少见了。比较典型的是/usr/bin/locate命令,它们权限是“-rws—s–x”,这就是SGID了。
SGID除了能够用在二进制上还可以用在目录上,当一个目录设置了SGID权限后,它将具有如下功能:
1、 用户若对于此目录拥有r与x权限时,该用户能够进入此目录
2、 该用户在此目录下的有效用户组将变成该目录的用户组
3、 该用户在此目录下具有w的权限,则用户所创建的新文件的用户组与此目录的用户组相同。
案例:有Hadoop和hive两个用户需要同时可以编辑对方在/tmp/project下创建的文件;可以把/tmp/project的属组改为team权限rwx,然后把team分别添加为Hadoop和hive的附加组(但是这个时候当这两个用户在/tmp/project下创建文件时文件的属组还是基本组不是附加组)然后把/tmp/project给sgid权限这样这两个用户在创建文件时就会以文件的权限执行添加的文件属组就会使用team;这样Hadoop和hive就可以相互更改删除对方的文件;添加sticky权限后本用户不能删除其他用户的权限
既然文件的属主和属组的x权限位都可以有s权限,是不是其他用户的x权限位也可以由s呢?答案是肯定的。只是这个时候不能是s,而是t了。t权限的名称是sticky bit,简称SBIT。仅对目录有效。
SBIT的功能
1、 用户若对此目录拥有w和x权限,即拥有写的权限
2、 当用户在此目录下创建了文件或目录,仅自己的与root才有权利删除文件。
sticky:当跟sgid一块用时;在一个公共目录下每个用户都可以创建编辑对方的文件但是不能删除文件
说明:SBIT应用的典型例子是/tmp目录。这个目录允许任何用户在里面创建文件,,但是为了避免创建的文件被其他人误删除,则设置SBIT权限,使得自己创建的文件仅能让自己或root删除。/tmp的权限是“drwxrwxrwx”。
五、加密方法
对称加密:加密和解密使用相同的密码保证数据安全性,
公钥加密:每个密码都成对出现一个公钥public key和私钥secret key保证数据身份验证,
单向加密:单项散列加密是提取数据特征码并且不可逆;保证数据完整性。
1、雪崩效应
2、定长输出
六、权限管理命令
修改文件所属组使用命令chgrp,但是这个命令不是很常用。因为另外一个命令chown也能够完成跟它一样的活。
1 2 3 4 5 6 7 8 9 10 |
chgrp [OPTIONS] USERNAME FILE_NAME/DIR_NAME:更改文件或目录的属组 -R:递归修改(将目录下的所有文件包括子目录在内全部修改) --reference=/path/file FILE_NAME:参考某个文件进行设置 chown [OPTIONS] USERNAME FILE_NAME/DIR_NAME:更改文件或目录的属主 -R:递归修改 --reference=/path/file FILE_NAME:参考某个文件进行设置 chown :USERNAME FILE_NAME/DIR_NAME:更改文件或目录的属组 chown USERNAME:USERNAME FILE_NAME/DIR_NAME:同时改变属主和属组 |
修改文件权限需要使用命令chmod,这个命令的花样比较多,可以划分为数字法和文字发。所谓数字法就是使用八进制数字来代替r、w、x;r等同于4,w等同于2,x等同于1。权限组合就用这些数字的和来表示。比如r-x权限等于5、rw-权限等于6、而rwx权限等于7。根据前面说的,一个文件拥有对三种角色的权限设定,即拥有者、所属组和其他,就需要使用三个数字来表示。比如777对应的文件类型和权限属性是“-rwxrwxrwx”,而755对应的则是“-rwxr-xr-x”。所以使用数字法修改权限,就是类似这样的命令。
1 2 3 4 5 6 7 |
chmod [OPTIONS] 755 FILE_NAME:表示修改文件的权限为-rwsr-xr-x -R:递归修改 --reference=/path/file FILE:参考某个文件进行设置 chmod -R 75 DIR_NAME #表示递归修改目的权限为----rwxr-x #当我们写两位时默认前面会以补0 |
文字法就相对复杂点,但是非常直观。首先引入了四个字母u、g、o、a,分别代表属主、属组、其他和全部。接着引入三个操作符+、–、=,分别代表增加、减去和设定。如果给属主增加“w”权限,可以使用“u+w”代表。或者联合使用,比如“u=rwx,go=rx”则代表给拥有者设定“rwx”权限,给属组合其他谁的那个rx权限。比如:
1 2 3 4 5 6 7 8 9 10 |
[root@localhost ~]# chmod a-x test.txt 或 [root@localhost ~]# chmod ugo-x test.txt 或 [root@localhost ~]# chmod -x text.txt #同一种效果都表示把test文件的属主、属组和其他的X执行权限都减去 [root@localhost ~]# chmod a+rwx test.txt #表示把属主.属组,其它都更改为rwx [root@localhost ~]# chmod -R go=r test #递归执行设定test目录属组和其他的权限为r只读 |
特殊权限的设定也可以使用数字法和文字法,数字法只需要将原来的3位数扩展成4位即可。SUID用4代表,SGID用2代表,SBIT用1代表。而它们放在权限数字的最开头。比如我们要设置SUID,可以写成“4755”,要设置SGID可以写成“2755”。如果使用文字法设置SUID就只“u+s”,设置SGID就是“g+s”,设置SBIT就是“0+t”。如:
1 2 3 4 5 6 7 8 |
[root@localhost ~]# chmod u+s test.txt #为test文件添加suid [root@localhost ~]# chmod u-s test.txt #删除suid [root@localhost ~]# chmod g+s test.txt #添加sgid [root@localhost ~]# chmod o+t test #为test目录添加sticky |
七、umask说明
在Linux系统中,管理员和普通用户所创建的文件和目录之间的权限是不同的。而实现这个不同的命令就是umask。umask是系统用来控制文件和目录创建时的默认权限的,系统定义默认创建文件最高权限为666,目录最高权限为777。
查看系统默认umask设定
1 2 3 4 5 6 |
[root@localhost ~]# umask 0022 #第一位表示特殊权限 #第二位表示属主权限 #第三位表示属组权限 #第四位表示其他权限 |
我们知道了系统默认允许文件或目录创建时的最高权限,那么真正在创建一个文件时就是使用最高权限减去umask值,如666-022得到的就是你创建这个文件的权限644。如果想要执行权限必须手动添加,用来保证系统安全。
但是在创建文件或目录时虽然意义上是使用666-umask,可是不是使用666-022这样得到的,因为这样会有一个问题;如果umask设定为033,那么使用666-033=633。这样这个文件还是有执行权限,所以权限不能使用数字进行换算,而是使用字母。什么意思呢?就是把666换算为字母权限(rw-rw-rw-),然后把033换算为字母权限(—–wx-wx);然后用系统默认权限666(rw-rw-rw-)跟umask权限033(—–wx-wx)进行比较,只要umask中的权限出现在系统默认权限中都进行丢弃,那么得到最终权限为644(rw-r–r–)也就没有执行权限。
实例验证:
1 2 3 4 5 6 |
[root@localhost ~]# umask 0033 [root@localhost ~]# umask 0033 [root@localhost ~]# touch test.txt [root@localhost ~]# ll test.txt -rw-r--r--. 1 root root 0 Nov 16 17:31 test.txt |
注意:最后说明一下,虽然系统对于文件或目录的创建设定了最高权限,但是对于管理员和普通用户所使用的默认umask却不同,管理员的umask默认是0022;普通用户umask默认是0002。