文件权限
[root@centos7 ~]# ll
total 8
-rw-------. 1 root root 1806 May 15 22:36 anaconda-ks.cfg
-rw-r--r--. 1 root root 1837 May 16 08:30 initial-setup-ks.cfg
rwx
rw-r--r--
左三位:定义了owner(属主)的权限
中三位:定义了group(属组)的权限
右三位:定义了others(其他人)的权限
rwx含义
readble:可读
writable:可写
excutable:可执行
rwx作用
对文件
r--:可以读取该文件的内容
-w-:可以修改该文件的内容,但不能查看
--x:无意义
rw-:可以读写文件
r-x:可以读取和执行文件
-wx:可以修改该文件的内容,但不能查看
rwx:all
对目录
r--:可以的短列出目录下的文件名,仅仅是文件名(文件名是存在目录里面的)
-w-:无意义
--x:可以进入且可以访问目录下的文件,但不能列出文件名
rw-:可以的短列出目录下的文件名,仅仅是文件名(文件名是存在目录里面的)
r-x:可以进入,可以访问子文件,同时可以长列出文件
-wx:表示用户可以进入目录,可以删除和创建文件,但是不能长列出
rwx:all
chmod
修改文件的权限
# 指定权限修改
[root@centos7 app]# ll
total 0
dr-x------. 4 fanjie fanjie 87 May 23 20:46 test
[root@centos7 app]# chmod u=rwx,g=x,o=rw test/
[root@centos7 app]# ll
total 0
drwx--xrw-. 4 fanjie fanjie 87 May 23 20:46 test
[root@centos7 app]# chmod g+w,o+x test/
[root@centos7 app]# ll
total 0
drwx-wxrwx. 4 fanjie fanjie 87 May 23 20:46 test
# 指定八进制修改
[root@centos7 app]# ll
total 0
drwx-wxrwx. 4 fanjie fanjie 87 May 23 20:46 test
[root@centos7 app]# chmod 010 test/
[root@centos7 app]# ll
total 0
d-----x---. 4 fanjie fanjie 87 May 23 20:46 test
# --reference=:参考其他文件的权限
[root@centos7 app]# ll
total 0
-rw-r--r--. 1 root root 0 May 24 10:11 b
d-----x---. 4 fanjie fanjie 87 May 23 20:46 test
[root@centos7 app]# chmod --reference=test/ b
[root@centos7 app]# ll
total 0
------x---. 1 root root 0 May 24 10:11 b
d-----x---. 4 fanjie fanjie 87 May 23 20:46 test
# 有些时候我们需要只给目录x权限,这样就可以用X来实现
[root@centos7 test]# ll /app/test/
total 0
d---------. 2 root root 6 May 24 10:16 dir
----------. 1 root root 0 May 24 10:16 file
[root@centos7 test]# chmod u+X,o+x /app/test/ -R
[root@centos7 test]# ll /app/test/
total 0
d--x-----x. 2 root root 6 May 24 10:16 dir
---------x. 1 root root 0 May 24 10:16 file
umask
777-umask:创建目录的默认权限
666-umask:创建文件的默认权限
[root@centos6 app]# umask 022
[root@centos6 app]# touch a;mkdir b
[root@centos6 app]# umask 000
[root@centos6 app]# touch c;mkdir d
[root@centos6 app]# ll
total 8
-rw-r--r--. 1 root root 0 May 24 14:17 a
drwxr-xr-x. 2 root root 4096 May 24 14:17 b
-rw-rw-rw-. 1 root root 0 May 24 14:17 c
drwxrwxrwx. 2 root root 4096 May 24 14:17 d
修改umask值只在当前shell有效,可以修改/etc/.bashrc对所有的用户有效,也可以修改~/.bashrc对当前用户有效,修改之后不能立即生效,可以使用source/.重读修改的配置文件
练习
-
复制/etc/fstab文件到/app/下,设置文件所有者为wangcai读写权限,所属组为sysadmins组有读写权限,其他人无权限
[root@centos6 app]# useradd wangcai;groupadd sysadmins [root@centos6 app]# cp /etc/fstab /app/;chown wangcai.sysadmins /app/fstab;chmod 660 /app/fstab [root@centos6 app]# ll total 12 -rw-rw----. 1 wangcai sysadmins 899 May 24 14:31 fstab
-
误删除了用户wangcai的家目录,请重建并恢复该用户家目录及相应的权限属性(cp命令不能直接复制隐藏文件,但是可以通过直接操作目录来实现)
[root@centos6 ~]# cp -a /etc/skel/ /home/wangcai/
特殊权限位
SUID
大家都知道密码时存在/etc/shadow下的,但是这个文件的权限是000,那为什么普通用户可以修改密码呢?先来看下修改密码的工具passwd的权限:
[root@centos7 ~]# su - wangcai -c "ls -l /bin/passwd"
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /bin/passwd
看到passwd的属主权限位多了一个s,这就是设置过SUID的,当用户没有权限操作时,可以通过设置SUID继承工具的属主权限,也就是root权限(仅作用于二进制文件时才有意义)
[root@centos7 app]# ll
total 0
-rw-r--r--. 1 root root 0 May 24 16:02 a
-rwxr--r--. 1 root root 0 May 24 16:04 b
[root@centos7 app]# chmod u+s a;chmod u+s b;ll
total 0
-rwSr--r--. 1 root root 0 May 24 16:02 a
-rwsr--r--. 1 root root 0 May 24 16:04 b
可以看到如果属主原本就有可执行的权限,那么在该位显示为小写的s,否则为大写的S
SGID
作用于二进制文件时:任何人在执行该文件时,都可以临时拥有其属组的权限(和SUID的作用差不多)
作用于目录时:当目录属组的用户在该目录下创建文件时,文件默认的属组不再是当前用户属组,而是设置了SGID的目录的属组,这就意味着,目录属组的用户在此目录下创建的文件属组的所有用户都拥有相同的权限
[root@centos7 app]# chmod g+s,o-t test/
[root@centos7 app]# ll
total 0
drwxrwsrwx. 2 root bangongshi 15 May 24 17:13 test
[root@centos7 app]# su - zhangsan -c "touch /app/test/a"
[root@centos7 app]# ll test/
total 0
-rw-rw-r--. 1 zhangsan bangongshi 0 May 24 17:09 a
[root@centos7 app]# su - lisi -c "rm -rf /app/test/a"
[root@centos7 app]# ll test/
total 0
可以实现同一组的用户,都可以在同一目录下相互查看其他用户的文件,但是这样的话当前用户也可以删除同一组的其他用户的文件
Sticky
仅可以作用于目录,当目录拥有sticky,则用户在在此目录下创建的文件只有该用户自己和root才可以删除,其他用户均不可以,这样可以配合设置SGID来实现同一组的成员间可以互相查看对方的文件,但是不可以删除
[root@centos7 app]# chmod o+t test/
[root@centos7 app]# ll
total 0
drwxrwsrwt. 2 root bangongshi 6 May 24 17:10 test
[root@centos7 app]# su - zhangsan -c "touch /app/test/a"
[root@centos7 app]# su - lisi -c "rm -rf /app/test/a"
rm: cannot remove ‘/app/test/a’: Operation not permitted
同时设置SGID和Sticky
[root@centos7 app]# chmod 3777 test/
[root@centos7 app]# ll
total 0
drwxrwsrwt. 2 root bangongshi 15 May 24 17:13 test
其他设置以此类推
设置文件特殊属性
chattr
- +i:不可删除,改名和更改,root也不行(-i与之相反)
- +a:只能追加内容,也不能被删除和改名,root也不行(-a与之相反)
[root@centos7 app]# touch a;chattr +i a;rm -rf a
rm: cannot remove ‘a’: Operation not permitted
[root@centos7 app]# chattr -i a;rm -rf a
[root@centos7 app]# ll
total 0
[root@centos7 app]# touch a;echo hello > a;chattr +a a;echo world >a
-bash: a: Operation not permitted
[root@centos7 app]# echo world >>a;cat a
hello
world
[root@centos7 app]# chattr -a a;echo zhangsan >a;cat a
zhangsan
lsattr
显示特定的属性
[root@centos7 app]# chattr +ia a
[root@centos7 app]# lsattr a
----ia---------- a
文件访问控制列表-facl
file access control list,可以实现灵活的权限管理
是否支持ACl
[root@centos6 ~]# tune2fs -l /dev/sda1 |grep acl
Default mount options: user_xattr acl
getfacl
查看文件是否有facl
[root@centos7 app]# getfacl a
# file: a
# owner: root
# group: root
user::rw-
group::r--
other::r--
setfacl
- -m:设置文件的ACL规则
- -x:删除文件的ACL规则
- -b:删除所有扩展ACL规则
- -k:删除默认的ACL规则
- -X:从文件中读取ACL条目进行删除
- -M:从文件中读取ACL条目进行修改
- -R:递归设置ACL,包括目录中的子目录和文件
- -d:设置默认的ACL
- --restore=:从文件恢复备份的ACL规则
# 创建文件a,把others的权限设置为---,通过设置facl权限,使zhangsan可以访问文件a的内容
[root@centos7 app]# ll
total 4
-rw-r-----. 1 root root 6 May 24 19:51 a
[root@centos7 app]# setfacl -m u:zhangsan:r-- a;ll
total 4
-rw-r-----+ 1 root root 6 May 24 19:51 a
[root@centos7 app]# getfacl a
# file: a
# owner: root
# group: root
user::rw-
user:zhangsan:r--
group::r--
mask::r--
other::---
[root@centos7 app]# su - zhangsan -c "cat /app/a"
nihao
权限之间的优先级
owner的优先级是大于ACL USER的,谁的权重大谁的优先
mask
设置mask时,就不在有普通的group权限了,group的权限位会被mask权限替换,除了owner和other的权限不受mask的影响,其他的权限都不会高于mask权限
[root@centos7 app]# ll
total 0
-rwxrwx---. 1 root root 0 May 24 20:21 a
[root@centos7 app]# setfacl -m u:zhangsan:rwx a
[root@centos7 app]# getfacl a
# file: a
# owner: root
# group: root
user::rwx
user:zhangsan:rwx
group::rwx
mask::rwx
other::---
[root@centos7 app]# setfacl -m m:r-- a;getfacl a
# file: a
# owner: root
# group: root
user::rwx
user:zhangsan:rwx #effective:r--
group::rwx #effective:r--
mask::r--
other::---
[root@centos7 app]# ll
total 0
-rwxr-----+ 1 root root 0 May 24 20:21 a
默认权限
现在有目录结构如下:
[root@centos7 app]$ tree
.
└── home
└── var
2 directories, 0 files
[root@centos7 app]$ ll
total 0
drwxr-xr-x. 3 root root 17 May 24 16:46 home
可以使用setfacl -mR u:frank:rwx home,设置完成后,frank用户将拥有rwx权限:
[root@centos7 app]$ setfacl -Rm u:frank:rwx home
[root@centos7 app]$ ll
total 0
drwxrwxr-x+ 3 root root 17 May 24 16:46 home
[root@centos7 app]$ ll -dl home/var/
drwxrwxr-x+ 2 root root 6 May 24 16:46 home/var/
[root@centos7 app]$ getfacl home/var/
# file: home/var/
# owner: root
# group: root
user::rwx
user:frank:rwx
group::r-x
mask::rwx
other::r-x
但是如果root用户再在/app/home下面新建一个文件文件a,frank就对该文件没有权限了:
[root@centos7 home]$ touch a
[root@centos7 home]$ getfacl a
# file: a
# owner: root
# group: root
user::rw-
group::r--
other::r--
现在如果想实现,对于未来创建的新文件,也添加指定的权限,就可以通过设置默认权限来实现:
[root@centos7 app]$ rm -rf *
[root@centos7 app]$ mkdir -p house/var
[root@centos7 app]$ setfacl -Rm d:u:frank:rwx house
[root@centos7 app]$ getfacl house
# file: house
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:frank:rwx
default:group::r-x
default:mask::rwx
default:other::r-x
现在再来在/app/house下新建一个test目录,我们会发现其在默认情况就设置了frank的权限为rwx:
[root@centos7 house]$ mkdir test
[root@centos7 house]$ getfacl test
# file: test
# owner: root
# group: root
user::rwx
user:frank:rwx
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:frank:rwx
default:group::r-x
default:mask::rwx
default:other::r-x
特别注意:现在切换到frank用户下,然后在/app/house下面创建文件时没有权限的,但是可以切换到刚才创建的test目录下创建文件,那是什么原因呢?因为默认权限只对未来创建的文件生效,所以这里要想实现可以在/app/house下的创建文件,可以再给一条facl即可
[root@centos7 house]$ setfacl -Rm u:frank:rwx /app/house
[root@centos7 house]$ getfacl /app/house
getfacl: Removing leading '/' from absolute path names
# file: app/house
# owner: root
# group: root
user::rwx
user:frank:rwx
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:frank:rwx
default:group::r-x
default:mask::rwx
default:other::r-x
[root@centos7 house]$ su - frank
Last login: Thu May 24 17:00:01 CST 2018 on pts/1
[frank@centos7 ~]$ touch /app/house/frank.txt
[frank@centos7 ~]$
可以使用setfacl -k来删除默认权限。
通过文件设置和删除ACL
设置ACL
[root@centos7 app]$ cat file.acl
u:frank:rwx
u:rose:r-x
g:test:r-x
[root@centos7 app]$ setfacl -M file.acl house/
[root@centos7 app]$ getfacl house/
# file: house/
# owner: root
# group: root
user::rwx
user:frank:rwx
user:rose:r-x
group::r-x
group:test:r-x
mask::rwx
other::r-x
删除ACL
[root@centos7 app]$ cat file.acl
u:frank
u:rose
g:test
[root@centos7 app]$ setfacl -X file.del house
[root@centos7 app]$ getfacl house/
# file: house/
# owner: root
# group: root
user::rwx
group::r-x
mask::r-x
other::r-x
备份和恢复ACL
主要的文件操作命令cp和mv都支持ACL,只是cp命令需要加上-p选项,但是tar等常见的备份工具是不会保留目录的ACL信息的
备份
- 打包目录:tar cvf house.tar house
- 备份ACL:getfacl -R house > acl.out
恢复
- 解压文件:ar -xvf house.tar -C /tmp
- 把导出的acl文件acl.out复制到/tmp下:p acl.out /tmp
- 切到/tmp下,恢复acl:etfacl --restore acl.out
练习
- 在/testdir/dir里创建的新文件自动属于g1组,组g2的成员如:alice能对这些新文件有读写权限,组g3的成员如:tom只能对新文件有读权限,其它用户(不属于g1,g2,g3)不能访问这个文件夹。
- 备份/testdir/dir里所有文件的ACL权限到/root/acl.txt中,清除/testdir/dir中所有ACL权限,最后还原ACL权限