让文件随你心动——玩转权限
1.文件属性
查看 文件属性:
解释属性各部分含义:
##-##rw-r--r-- ##1 ##kiosk ##kiosk ##0 ##Jul 22 14:14 ##westos
##(文件类型:普通文件,之前介绍过)##(权限) ##(文件被系统记录的个数,硬链接)##(用户) ## (组) ## (大小) ## (最后被修改时间) ## (文件名)
查看目录属性:
各部份含义:
##d##rwxr-xr-x ##11 ##kiosk ##kiosk ##8192 ##Jul 22 14:14 ##Desktop
##(文件类型:目录)##(权限)##(目录中子目录的个数) ##(用户)##(组)##(目录中包含的子文件或属性大小)##(时间) ##(目录名)
*属性中的属性大小,即下图中数字6的统计办法:
- 文件数一下 ls- l west/ 时里面成分数
- 目录:按它的字符个数数,是空的时候如果是6 创建 west/111 ,文件名字符数为 3,由于文件属性的成分数是 10 ,则变成 16 :
2.文件所有人所有组的管理
格式:
chown [-R] 账号名称:文件或目录
chown [-R] 账号名称:用户组名称、文件或目录
用法:
chown username filename|dir ##更改文件的所有人
chown username.groupname filename|dir ##更改所有人所有组
^<==>v
chown username:groupnane filename | dir ##更改所有人所有组
chown -R username dir ##更改目录本身及里面所有内容的所有人
chgrp -R groupname dir ##更改目录本身及里面所有内容的所有组
##文件拥有者必须已经存在于系统中们也就是在/etc/passwd这个文件中有记录的用户名称才可改变!
演示:
- 首先新建ugo目录并监控目录和目录下文件的属性
watch -n 1 'ls -ld ugo ; echo ============= ; ls -l ugo'
- 建立五个文件,用户初始所属用户所属组。
- 测试5个命令的功能
3.文件普通权限
|"rwx"|"rwx"|"rwx"|
对应: | u | g | o |
u:文件所有人对文件可以读写 , 匹配时优先匹配
g:文件组成员对文件可读 , 匹配时第二匹配
o:其他人对文件可读 , 当 g 不匹配,匹配 o
a : 所有用户(包括以上三种)
所有用户(包括以上三种)
r : 对文件:可以查看文件中的字符
对目录:可以查看目录中文件的信息w : 对文件:可以更改文件内字符
对目录:可以在目录中添加删除文件
// 简单来说,wq! 只对超级用户和文件所有者有用 —– 这就是读权限- x 对文件:可以运行文件内记录的程序动作
对目录:可以进入目录中(对目录而言,x是任何命令都要有的,即有了x才会有rw)
// 内核认为,默认创建的文件是没有可执行权限的。为了安全。目录给执行权限x
*修改文件权限
- 使用chmod命令改变文件的属性,属性的设置方法有两种,分别可以使用数字或者是符号:
- Linux 文件的基本属性有9个,分别是 owner/group/others组别的read/write/excute属性。
(1)字符方式修改该文件权限
格式:
chmod [-R] <u|g|o><+|-|=><r|w|x> file|dir
## + 增加权限
## - 取消权限
## = 唯一设定权限
用法:
chmod u+x file1 ##给file1的用户添加权限
chmod u-x,g+w file1 ##file1拥有者去掉x权,file1拥有组添加w权限
# 修改多个权限时,每个修改之间以逗号隔开
chmod ugo-r file2 ##file2的用户组和其他人去掉r权限
# 若对多个所属修改同一个权限时,可以将ugo写在一起
chmod a+wx file3 ##file3的用户组和其他人添加wx权限
# a 就等同于 ugo
演示:
tips:
三个权限中,w是一个特殊的权限。chmod +w权限之后默认只会给 u g 加,不会给o加,需要a+w 或 ugo-w 才会给ugo都加上权限。
(2)数字方式修改该文件权限
- 当需要给一个文件指定所有权限时,以数字方式修改权限就非常的便捷.
- 在linux中:系统默认 rwx 分别对应 4,2,1
用法:
chmod 修改后权限值 file
//其中,每三位rwx权限分别对应为:
"7=rwx" "6=rw-" "5=r-x" "4=r--" "3=-wx" "2=-w-" "1=--x" "0=---"
//设定一个文件对所有用户都有读,写,执行的权限。
chmod 777 filename
//取消一个文件所有的权限。
chmod 000 filename
4.系统默认权限的设定
- 从系统存在角度来说,开放权力越大,系统存在意义越高
- 从系统安全角度来说,开放权力越少,系统安全性越高
- 所以系统设定新建文件或目录会去掉一些权限
当进程创建了新文件时,它会指定新文件应该具有的权限。通常,所请求的模式是 0666(每个人可读和可写),它比我们希望的具有更多的权限。幸运的是,不管什么时候创建了新文件,Linux 将参考叫做“umask”的东西。系统用 umask 值来将初始指定的权限降低为更合理、更安全的权限。可以通过在命令行中输入 umask 来查看当前的 umask 设置。
设定方式 :
umask ##查看系统保留权限。系统默认为"022"
umask 077 ##修改该系统保留权限为"077",此设定为临时设定,只在当前shell中生效,当环境改变,比如重新打开或重启,就又还原默认值了。
*其中x权限是内核保留的,不是umask可以改变的
*系统中,目录权限值 — 文件权限值 = 111(内核规定)
永久设定方式:
##修改第一个文件:
vim /etc/bashrc //shell配置文件
70 if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then
71 umask 002 ##普通用户umask
72 else
73 umask 077 ##超级用户umask
74 fi
保存退出后: source /etc/bashrc ## source:使文件立即生效
##修改第二个文件:
vim /etc/profile //系统配置文件
59 if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then
60 umask 002 ##普通用户umask
61 else
62 umask 077 ##超级用户umask
63 fi
保存退出后: source /etc/profile ##使文件立即生效
注: 以上两个文件的umask设定值必须保持一致,要改两个一起改。因为是配置文件,所以不一致会使系统出现问题。
tips:
虽然umask默认值可以改,但是系统设置的原始初始值是有他的好处的:
之前说过,为了安全,默认创建的文件不具有x权限,一般可以看到的文件权限为 rw--- r------r------,即644。那么,目录权限是755。所以umask默认权限是022。这是有依据的非常合适作为默认值的。而且,在创建文件时,如果真的要改变创建文件的默认权限,其实只需要临时改就行。因为只要当前默认权限设定好,创建出来的文件权限值就相应改变,而且不随系统环境变化而变化,改了就是永久的,所以一般非特殊情况下尽量不用去永久设定他的默认值。
5.文件访问控制(acl列表)
1.acl定义
acl = access control
它指定特殊用户对特殊文件有特殊权限
当文件位的权限有 + 的时候,+ 位表示文件是有权限列表的。
//如图,则此时-rw-rwxr- - 后面的 + 表示文件ooo是有权限列表的。
*当文件上有权限列表时,ls -l 能看到的权限是假的,只能用getfacl命令去看
格式 :
getfacl filename
[kiosk@foundation77 Desktop]$ getfacl ooo
# file: ooo ##文件名称
# owner: kiosk ##文件所有人
# group: kiosk ##文件所有组
user::rw- ##拥有者权限
user:kiosk:rwx ##特殊用户权限
group::rw- ##组权限
mask::rwx ##权限掩码 : 最大可以为用途提供的权限
other::r-- ##其他人权限
2.设定acl列表
设定:
setfacl -m <u|g>:<username|groupname>:权限 file | dir
( < >括起来的表示必须添加 )
-m #设定
u #用户
g #组
删除列表中的用户或者组:
setfacl -x <u|g>:<username|groupname> file | dir ##表示这个文件或目录的组删掉
关闭列表中的用户和组:
setfacl -b file | dir ##关闭这个列表
在shell中简单实现一下:
- 先创建ooo普通文件,并监控属性及权限列表,发现开始时没有+号。
[kiosk@foundation77 Desktop]$ watch -n 1 'ls -l ooo;\
> echo ======================================;
> getfacl ooo'
- 开始建立权限列表,发现权限的后面多出了+号,并且user添加了权限为7的kiosk用户
- 发现-m参数还可以重新更改设定了的用户权限列表,又添加了两个用户。
- 删除kiosk的权限
- 关闭权限列表,发现+号也随之消失了。
acl mask值
- mask : 权限掩码
- 用来标实能够赋予用户的最大权限。即若mask为r-x,那么用户最大权限也是r-x,对文件不能添加删除。
tips :
一般在设定acl列表时,最容易出现一个问题:
*在权限列表还存在时,ls -l 显示的东西是假的,此时,如果使用 chmod 命令修改文件权限,其实只会改变文件的权限掩码,从而破坏了文加的普通权限。
//可以看到, 显示了effictive:r——
//重点是,权限掩码变成了r——,即此时文件的权限最大值被破坏了。
如何修复?
setfacl -m m:rwx filename(被破坏的文件) ##给权限掩码赋值 ———— rwx
acl 默认权限
当我们需求某个目录对于student可写,并且目录中新建的子目录对student也可写,就要设定默认默认权限
注: 默认权限只对目录中新建立的文件或者目录生效,对已经建立的文件无效,对于目录本身也无效
setfacl -m d:u:kiosk:7 ooo
- 先对ooo及ooo目录下权限列表进行getfacl查看,用watch监控。
[kiosk@foundation77 Desktop]$ watch -n 1 'getfacl ooo;\
echo ======================================;
getfacl ooo/*'
- 先对ooo文件夹运行命令,开始ooo下还没有文件
- 添加了子文件ooo,ooo/*显示出来了,并且,实现了权限继承。
6.特殊权限
1.suid(冒险位)
讲解冒险位之前,我们先了解一个问题:
众所周知,/etc/passwd文件存放的各个用户的账号与密码信息,/usr/bin/passwd是执行修改和查看此文件的程序,但从权限上看,/etc/passwd仅有root权限的写(w)权,可实际上每个用户都可以通过/usr/bin/passwd命令去修改这个文件。
这是为什么呢?
查看了下/etc/passwd 与/usr/bin/passwd权限
发现/usr/bin/passwd 下的用户权限中,本来 x 的位置变成了s,这一位就是冒险位,这个问题的解释就是冒险位的作用。
- 冒险位只针对二进制可执行文件,
- 文件内记录的程序产生的进程的所有人为文件所有人,和进程发起人身份无关
设定方式:
chmod u+s file
chmod 4xxx file //因为 suid=4 ,所以还是可以以数字方式设置冒险位。
举一个例子,
chmod 4700 /etc/rm
//--->退回普通用户,就可以删除本来没有权限删除的文件,因为此时执行的人会被系统认为是root
- 不过, 即使你拿到了这个文件(我经常将设置冒险位称为普通用户拿到了这个文件),删除目标时,如果这个目标对普通用户没有权限,那么这些文件还是删除不了,这是文件内部指定的,不真正是管理员,不能操作,就像你有尚方宝剑,但是你毕竟不能做皇上做的所有事一样,但一般不会出现。
2.sgid(强制位)
- 对文件: 只针对二进制可执行文件,任何人运行二进制文件 程序时程序产生的进程的所有组都是文件的所有组 ,和程序发起人组的身份无关
- 对目录:当目录有sgid权限后,目录中新建的所有文件的所有组 都自动归属到目录的所有组之中,和文件建立者所在的组无关
设定方式:
chmod g+s file|dir
chmod 2xxx file|dir //由于 sgid=2,所以设定2xxx
- 以root更改所属用户所属组,设定强制位,以root身份建立的子文件所属组还是kiosk
3.sticky (粘制位)
- 只针对与目录,当一个目录上有t权限,除非目录的属主和root用户有权限删除它,除此之外其它用户不能删除和修改这个目录
设定方式:
chmod o+t direcotry
chmod 1777 direcotry ##由于 t=1,所以以数字方式设定权限
//比如/tmp目录
tmp目录是所有用户共有的临时文件夹,所有用户都拥有读写权限,但是若A用户在/tmp里创建了文件a.file,此时B用户要在/tmp里把它删除就是不行的,这就是因为/tmp目录的t权限。