在了解到Linux系统上的文件目录权限,有时候你会发现为什么刚创建的文件是-rw-r--r--这个权限,目录是drwxr-xr-x权限,有些是-rwsr-xr-x,又有些是drwsrws--T?这些则与umask、特殊权限有关。
一.umask:
什么是umask?umask一般是用在你初始创建一个目录或者文件的时候赋予他们的权限。它与chmod的效果刚好相反,umask设置的是权限“补码”,而chmod设置的是文件权限码。一般在/etc/profile、
或用户家目录下的.bash_profile或.profile中设置umask值。
0022
[root@centos7 ~]#umask -S
u=rwx,g=rx,o=rx
默认的umask是0022,0022四个数字代表是赋值初始化准备丢弃的权限。(相对应文件来说,x权限就算没说明出来丢弃一样必须默认丢弃)
第一个0代表suid 丢弃的权限;
第二个0代表本文件/目录拥有者什么权限都没丢弃;
第三个2代表本文件/目录的用户组丢弃了w权限;
第四个2代表本文件/目录的文件/目录的用户组丢弃了w权限。
一般我们会这样表示:
umask +default permission(默认权限) =777(目录)/666(文件)
例:[root@centos7 ~]#umask 002
[root@centos7 ~]#touch bb
[root@centos7 ~]#mkdir cc
[root@centos7 ~]#ll
-rw-rw-r--. 1 root root 0 May 31 20:20 bb
drwxrwxr-x. 2 root root 6 May 31 20:20 cc
bb文件权限rw-rw-r--:664 符合666-002=664
cc目录权限rwxrwxr-x:775符合777-002=775
但存在特殊情况如果把umask设为135呢?
[root@centos7 ~]#umask 135
[root@centos7 ~]#touch dd
[root@centos7 ~]#mkdir ee
[root@centos7 ~]#ll
-rw-r---w-. 1 root root 0 May 31 20:23 dd
drw-r---w-. 2 root root 6 May 31 20:24 ee
dd文件的权限变为rw-r---w-:642不符合666-135=531
目录的权限rw-r---w-:642符合777-135=642
为什么文件的会变化,这是因为:转换成二进制可看出
把上面的减去下面的,没有权限减则保留原权限(110100010)转换成八进制为642.
则:文件权限用666-umask ,如果所得结果某位存在执行(奇数)权限,则将其权限+1,偶数不变。
目录权限用777-umask ,得到的权限即为目录的权限。
二.特殊权限SUID, SGID, Sticky
要了解特殊权限需对安全上下文有一个概念:
前提:进程有属主和属组;文件有属主和属组
(1) 任何一个可执行程序文件能不能启动为进程,取决发起者对程序文件是否拥有执行权限
(2) 启动为进程之后,其进程的属主为发起者,进程的属组为发起者所属的组
(3) 进程访问文件时的权限,取决于进程的发起者
(a) 进程的发起者,同文件的属主:则应用文件属主权限
(b) 进程的发起者,属于文件属组;则应用文件属组权限
(c) 应用文件“其它”权限
SUID:
1.SUID 权限仅对二进制程序(binary program)有效;
2.执行者对于该程序需要具有x 的可执行权限;
3.本权限仅在执行该程序的过程中有效(run-time);
4.执行者将具有该程序拥有者(owner) 的权限。
5.SUID设置在目录上无意义
权限设定:
chmod u+s FILE...
chmod u-s FILE...
[root@centos7 ~]# ls -ld /tmp ; ls -l /usr/bin/passwd
drwxrwxrwt. 14 root root 4096 Jun 16 01:27 /tmp
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd
在Linux系统中,所有账号的密码都记录在/etc/shadow 这个文件里面,这个文件的权限为:
[root@centos7 ~]#ll /etc/shadow
----------. 1 root root 1572 May 31 17:42 /etc/shadow
这个文件仅有root 可读且仅有root 可以强制写入而已。既然这个文件仅有root 可以修改,那么普通用户呢?
[xiaoming@centos7 ~]$passwd
Changing password for user xiaoming.
Changing password for xiaoming.
(current) UNIX password:
New password:
Retype new password:
passwd: all authentication tokens updated successfully.也可修改密码。这就是加了SUID特殊权限功能。
- xiaoming对于/usr/bin/passwd 这个程序来说是具有x 权限的,表示dmtsai 能执行passwd;
- passwd 的拥有者是root 这个账号;
- xiaoming执行passwd 的过程中,会『暂时』获得root 的权限;
- /etc/shadow 就可以被xiaoming 所执行的passwd 所修改。
[xiaoming@centos7 ~]$cat /etc/shadow
cat: /etc/shadow: Permission denied
xiaoming 使用cat 去读取/etc/shadow 时,cat 不具有SUID 的权限,所
以xiaoming 执行『cat /etc/shadow』时,是不能读取/etc/shadow 的。
SGID:
s 标志在文件拥有者的x 项目为SUID,那s 在群组的x 时则称为Set GID
[root@centos7 ~]# ls -l /usr/bin/locate
-rwx--s--x. 1 root slocate 40496 Jun 10 2014 /usr/bin/locate
与SUID 不同的是,SGID 可以针对文件或目录来设定!如果是对文件来说, SGID 有如下的功能:
-1.SGID 对二进制程序有用;
-2.程序执行者对于该程序来说,需具备x 的权限;
-3.执行者在执行的过程中将会获得该程序群组的支持!
[root@centos7 ~]# ll /usr/bin/locate /var/lib/mlocate/mlocate.db
-rwx--s--x. 1 root slocate 40496 Jun 10 2014 /usr/bin/locate
-rw-r-----. 1 root slocate 2349055 Jun 15 03:44 /var/lib/mlocate/mlocate.db
与SUID 非常的类似,使用xiaoming 这个账号去执行locate 时,那xiaoming将会取得slocate 群组的支持, 因此就能够去读取 mlocate.db 。
SGID 也能够用在目录上,这也是非常常见的一种用途
目录设定了SGID 的权限后,他将具有如下的功能:
-1. 用户若对于此目录具有r 与x 的权限时,该用户能够进入此目录;
-2.用户在此目录下的有效群组(effective group)将会变成该目录的群组;
-3.用途:若用户在此目录下具有w 的权限(可以新建文件),则使用者所建立的新文件,该新文件的群组与此目录的群组相同。
Sticky Bit
这个 Sticky Bit, SBIT 目前只针对目录有效,sticky 设置在文件上无意义。SBIT 对于目录的作用是:
-1.当用户对于此目录具有w, x 权限,亦即具有写入的权限时;
-2.当用户在该目录下建立文件或目录时,仅有自己与root 才有权力删除该文件
SUID/SGID/SBIT 权限设定
4 为SUID、 2 为SGID、 1 为SBIT
[root@centos7 ~]# cd /tmp
[root@centos7 tmp]# touch test
[root@centos7 tmp]# chmod 4755 test; ls -l test
-rwsr-xr-x 1 root root 0 Jun 16 02:53 test
[root@centos7 tmp]# chmod 6755 test; ls -l test
-rwsr-sr-x 1 root root 0 Jun 16 02:53 test
[root@centos7 tmp]# chmod 1755 test; ls -l test
-rwxr-xr-t 1 root root 0 Jun 16 02:53 test
[root@centos7 tmp]# chmod 7666 test; ls -l tes
-rwSrwSrwT 1 root root 0 Jun 16 02:53 test
设定权限成为 -rws--x--x 的模样:
[root@centos7 tmp]# chmod u=rwxs,go=x test; ls -l test
-rws--x--x 1 root root 0 Jun 16 02:53 test
承上,加上 SGID 与 SBIT 在上述的文件权限中!
[root@centos7 tmp]# chmod g+s,o+t test; ls -l test
-rws--s--t 1 root root 0 Jun 16 02:53 test
三、ACL权限
1】ACL 是Access Control List 的缩写,主要的目的是在提供传统的owner,group,others 的read,write,execute 权限之外的细部权限设定。ACL 可以针对单一使用者,单一文件或目录来进行
ACL 主要可以针以下来控制权限呢:
1.使用者 (user):可以针对使用者来设定权限;
2.群组 (group):针对群组为对象来设定其权限;
3.默认属性(mask):还可以针对在该目录下在建立新文件/目录时,规范新数据的默认权限;
及1.ACL:Access Control List,实现灵活的权限管理;2.CentOS7默认创建的xfs和ext4文件系统具有ACL功能;3.CentOS7之前版本,默认手工创建的ext4文件系统无ACL功能,需手动增加tune2fs –o acl/dev/sdb1
mount –o acl/dev/sdb1 /mnt/test
4.ACL生效顺序:所有者,自定义用户,自定义组,其他人
为多用户或者组的文件和目录赋予访问权限rwx
2】ACL 的设定技巧: getfacl, setfacl
- getfacl:取得某个文件/目录的ACL 设定项目;
2.setfacl:设定某个目录/文件的ACL 规范。
1.setfacl 指令用法介绍及『u:账号:权限』设定
[root@centos7 ~]# setfacl [-bkRd] [{-m|-x} acl 参数] 目标文件名
选项与参数:
-m :设定后续的 acl 参数给文件使用,不可与 -x 合用;
-x :删除后续的 acl 参数,不可与 -m 合用;
-b :移除『所有的』 ACL 设定参数;
-k :移除『预设的』 ACL 参数,
-R :递归设定 acl ,亦即包括次目录都会被设定起来;
-d :设定『预设 acl 参数』的意思!只对目录有效,在该目录新建的数据会引用此默认值
例:[root@centos7 ~]# touch acl_test1
[root@centos7 ~]# ll acl_test1
-rw-r--r--. 1 root root 0 Jul 21 17:33 acl_test1
[root@centos7 ~]# setfacl -m u:xiaoming:rx acl_test1
[root@centos7 ~]# ll acl_test1
-rw-r-xr--+ 1 root root 0 Jul 21 17:33 acl_test1
[root@centos7 ~]# setfacl -m u::rwx acl_test1
[root@centos7 ~]# ll acl_test1
-rwxr-xr--+ 1 root root 0 Jul 21 17:33 acl_test1
设定值中的 u 后面无使用者列表,代表设定该文件拥有者
2.getfacl 指令用法余setfacl一样
例:[root@centos7 ~]# getfacl acl_test1
file: acl_test1 <==说明档名而已!
owner: root <==说明此文件的拥有者,亦即 ls -l 看到的第三使用者字段
group: root <==此文件的所属群组,亦即 ls -l 看到的第四群组字段
user::rwx <==使用者列表栏是空的,代表文件拥有者的权限
user:xiaoming:r-x <==针对xiaoming 的权限设定为 rx ,与拥有者并不同!
group::r-- <==针对文件群组的权限设定仅有 r
mask::r-x <==此文件预设的有效权限 (mask)
other::r--
3】特定的单一群组的权限设定:『g:群组名:权限』
- 针对特定群组的方式:
设定规范:『 g:[所属组]:[rwx] 』,例如针对 g1 的权限规范 rx :
[root@centos7 ~]# setfacl -m g:g1:rx acl_test1 - 针对有效权限 mask 的设定方式:
设定规范:『 m:[rwx] 』,例如针对刚刚的文件规范为仅有 r :
[root@centos7 ~]# setfacl -m m:r acl_test1
3 针对预设权限的设定方式:
设定规范:『 d:[ug]:使用者列表:[rwx] 』
让 xiaoming 在 /srv/projecta 底下一直具有 rx 的预设权限!
[root@centos7 ~]# setfacl -m d:u:xiaoming:rx /srv/projecta
4】主要的文件操作命令cp和mv都支持ACL,只是cp命令需要加上-p 参数。但是tar等常见的备份工具是不会保留目录和文件的ACL信息
getfacl -R /tmp/dir1 > acl.txt
setfacl -R -b /tmp/dir1
清除dir目录的ACL权限
setfacl -R --set-file=acl.txt /tmp/dir1
setfacl --restore acl.txt
getfacl -R /tmp/dir1