权限
一、文件的基本权限
所谓的权限就是用户访问文件的能力,文件的基本权限包括 r(读),write(写),x(可执行)。
用ls -ld file 查看文件的权限属性:
drwxr-xr-x 4 root root 4096 Jul 3 21:29 file
drwxr-xr-x:说明文件类型,常见的文件类型有:d 目录文件,l 链接文件,c 线性设备文件,b 块设备文件,s sorket文件,- 一般文件,p 管道文件
drwxr-xr-x:此文件(目录)属主用户权限
drwxr-xr-x:此文件(目录)属组用户权限
drwxr-xr-x:此文件(目录)其他用户权限
1)权限对于目录和文件具体含义如下:
目录:
r:可以用ls命令查看目录中的文件列表(用ls -l参数也不能查看里面的内容)
w:可以在目录中创建和删除文件
x:可以cd到此目录中,并且可以使用ls -l显示此文件的元数据信息
文件:
r:可以查看文件内容
w:可修改文件内容
x:可以将此文件做为一个脚本执行
2)用户访问文件时的权限模型:
if(运行程序的属主 = 此程序正在访问文件的属主)
以属主的身份权限访问文件;
else if(运行程序的属组 = 此程序正在访问文件的属组)
以属组的身份权限访问文件;
else
以其他用户身份权限访问;
3)常见的文件权限管理命令
chmod 改变文件权限
Usage:chmod [选项]... 模式[,模式]... 文件...
或:chmod [选项]... 八进制模式 文件...
或:chmod [选项]... --reference=参考文件 文件...
操作对象 | 权限设定 | 权限值 | 示例 |
u 文件属主权限 g 同组用户权限 o 其它用户权限 a 所有用户(包括以上三种) |
+ 增加权限 - 取消权限 = 唯一设定权限 |
r-->4 w-->2 x-->1 |
1、修改/tmp/test文件属主的权限是rwx,属组的权限是r-x,其他用户权限r-x chmod 755 /tmp/test 或者:chmod u=rwx,go=r-x /tmp/test 2、在1问题的基础上,属主,属组,其他用户都要去掉x权限 chmod a-x /tmp/test 或者:chmod u-x,g-x,o-x /tmp/test 或者:chmod 644 /tmp/tes 3、修改/tmp/test1目录文件的属主的权限是rwx,属组的权限是r-x,其他用户权限r-x,以及所在目录下所有文件都是此权限 chmod -R 755 /tmp/test1 或者:chmod -R u=rwx,go=r-x /tmp/test1 4、在问题1基础上,属组的权限变为rwx chmod 775 /tmp/test 或者:chmod g+w /tmp/test 5、以/tmp/test的权限为基准,让/tmp/test2文件的权限和他一样 chmod --reference=/tmp/test /tmp/test2 |
一般情况下,可根据个人喜好程度选择一种修改权限的模式。 umask:设置系统默认掩码,在新文件或目录首次创建时的权限。 对目录来说,新创建的目录权限是 777-umask_value;对于文件来说,新创建的文件权限是666-umask_value.
[root@server test]# umask 0022 [centos@server test]$ umask 0002 [centos@server test]$ id centos uid=500(centos) gid=500(centos) groups=500(centos),600(magedu) [mandriva@server ~]$ umask 0022 [mandriva@server ~]$ id uid=4400(mandriva) gid=3302(linux) groups=3302(linux),2201(gentoo),3300(distro),3301(peguin)
管理员和普通用户的掩码一般都不相同。对于属组和属主用户名相同的,新创建的文件或目录的掩码值是0002;对于属组和属主用户名不相同的,新创建的文件或目录的掩码值与管理员用户的掩码值一样是0022。
二、特殊权限
特殊权限由三种:suid,sgid,sticky。引入特殊权限是为了更好的管理文件或者说为了实现在某种特使情况下的需求。下面对着三种特殊权限意义说明。
特殊权限 | 具体意义 | 示例 |
suid | 设置前提:文件属主具有x权限 此设置一般是对命令设置的,设置此特殊权限后,在执行此命令是不是一发起者进程的用户运行,而是以次命令文件的属主运行。 chmod u+s /path/to/somefile |
最典型的例子是:passwd这个命令。 我们发现普通用户也是可以修改自己的密码的,实际上是将密码信息写入到/etc/shadow文件中去,而这个文件是没有任何权限的。这就是suid的作用,普通用户在设置密码时候,实际上是一passwd命令的属主用户root身份执行的 |
sgid | 设置前提:文件属组具有x权限 此设置一般用法是对目录进行设置的,设置了这个权限之后,以后再这个目录下所建立的任何文件的属组都和这个目录的属组一样。 chmod g+s /path/to/somefile |
例如: 某公司开发项目时,需要将每个人写的代码文件都归属到同一个组当中,方便大家查看。 |
stiky | 设置前提:文件其他具有x权限 此设置的作用是用户只能自己创建的文件 chmod o+t /path/to/somefile |
例如: 在上一个示例中,每个人都可以删除其他人上传的代码,这是我们不愿意看到的,所以在设置了stiky位后,每个人只能删除自己的文件 |
练习:
1、让普通用户使用/tmp/cat能查看管理员才有权限访问的文件;
[root@server ~]#cp `which cat` /tmp/cat [root@server ~]#chmod u+s /tmp/cat [root@server ~]#su - centos [centos@server ~]#/tmp/cat /etc/shadow #可以看到/etc/shadow的内容
2、新建目录/project/test,让普通用户hadoop和openstack对此目录都能创建文件,且创建的文件的属组为此目录的属组,而非用户自身的属组,此外还要求,每个用户不能删除其它人的文件;
[root@server ~]#mkdir -p /project/test [root@server ~]#chmod g+s /project/test [root@server ~]#chmod o+t /project/test
三、ACL(Access Control List)机制
在这样的情况下:某一公司中的财务表,一般情况下,在财务部门中的职员A建立的财务表本人可以读写,属组(在财务部门的职员)可以查看A职员财务表,其他人没有任何权限更改或者查看A职员的财务表。那么,作为公司的CEO或者说是头,难道也没有权限查看这个财务表吗?显然这是不符合我们的要求的,ACL机制的出现就解决了这样的问题。
facl(File Access Control List):文件访问控制列表,它的主要作用是针对某些特定让普通用户设定专有的权限的一种机制,与文件原来的属主、属组、其他、特殊权限没有任何冲突。相当于在文件原有的权限基础上,针对某些用户设定的扩展权限。
查看和设置文件ACL属性的命令是:getfacl和setfacl,具体的常用用法如下:
getfacl | getfal 文件名 | getfacl /etc/passwd 查看/etc/passwd文件的acl属性 |
setfacl | setfacl {-m|-x} 目标:MODE FILE... | 设置centos用户对/etc/fstable的acl属性 setfacl -m u:centos:rw- /etc/fstable 设置centos组对/etc/fstable的acl属性 setfacl -x g:centos /etc/fstable file2文件参照file1文件的acl权限 getfacl file1 | setfacl --set-file=- file2 |
注意:acl机制是在创建文件系统时添加的属性,如果在创建文件系统时,没有添加此属性,在这里就不能使用acl机制。
加入acl机制后用户访问文件时的权限模型:(假语言表示)
if(运行程序的属主 = 此程序正在访问文件的属主 || 运行程序的属主有acl机制)
以属主的身份权限访问文件;(运行程序的属主 = 此程序正在访问文件的属主)
用户级别的facl(运行程序的属主有acl机制);
else if(运行程序的属组 = 此程序正在访问文件的属组 || 运行程序的属组有acl机制)
以属组的身份权限访问文件(运行程序的属组 = 此程序正在访问文件的属组);
用户级别的facl(运行程序的属组有acl机制);
else
以其他用户身份权限访问;
解决开始引入的问题:
#财务组A职员用户是Alex,她属组是FinaDept。公司经理用户是boss [root@server ~]# mkdir -p /test/FinaDept/ [root@server ~]# chown .FinaDept /test/FinaDept/ [root@server ~]# chmod 3777 /test/FinaDept/ #Alex用户所创建的文件 [Alex@server FinaDept]$ touch fina.txt [Alex@server FinaDept]$ ll total 0 -rw-r----- 1 Alex FinaDept 0 Jul 12 00:41 fina.txt #boss用户没有设置acl机制之前 [boss@server FinaDept]$ cat fina.txt cat: fina.txt: Permission denied #设置acl之后 [Alex@server FinaDept]$ setfacl -m u:boss:r-- fina.txt [Alex@server FinaDept]$ getfacl fina.txt # file: fina.txt # owner: Alex # group: FinaDept user::rw- user:boss:r-- group::r-- mask::rw- other::--- ##boss用户只能查看,不能修改 [boss@server FinaDept]$ cat fina.txt a:123 b:1234 [boss@server FinaDept]$ echo "c:234" >> fina.txt -bash: fina.txt: Permission denied