什么是Linux 权限?
在Linux系统中,权限用于控制对文件和目录的访问和操作。每个文件和目录都有一个与之关联的权限设置
每个部分都有三个权限:读取(r)、写入(w)和执行(x)
不同文件类型的有意义:针对普通文本文件和目录,相同的写法,但代表的意义不同
文件:
r:可读,可以使用类似cat等命令查看文件内容;
w:可写,可以编辑或删除此文件;
x: 可执行,executable,可以命令提示符下当作命令提交给内核运行
r单独存在,可查看文件内容
w单独存在,看不到文件内容,但是可以强制修改文件内容,会覆盖原文件内容,单独存在,意义不大
x单独存在,毫无意义
目录:
r: 可以对此目录执行ls以列出内部的所有文件;
w: 可以在此目录创建、修改、删除文件;
x: 可以使用cd切换进此目录,也可以使用ls -l查看内部文件的详细信息;
只有r权限时,可以读(有报错),不能写,也不能进入目录
只有w权限时,毫无意义
只有x权限时,只能进入,不能读,不能写
目录的rw权限:可以查看内容,不可以进入目录,不能删除目录或它里面的文件
目录的rx权限:可以查看内容,可以进入目录,不可以修改目录的内容
目录的wx权限:不可以查看目录内容,可以进入目录,可以删除
目录下的文件,前提是你需要知道目录下有什么文件
查看文件的权限
可以使用 ls -l ,如果是目录需要加上 -d选择,否则值限制此目录下有什么文件
[root@mysql tmp]# ls test test.txt [root@mysql tmp]# ll test.txt -rw-r--r-- 1 root root 0 Apr 20 09:01 test.txt [root@mysql tmp]# ll -d test drwxr-xr-x 2 root root 6 Apr 20 09:01 test
权限针对的三类用户:
权限由三个部分组成:所有者、组和其他用户
u: user 属主
g: group 属组
o: other 其它用户
ls -l 命令显示的意义
编辑
[root@mysql tmp]# ls -l test.txt -rw-r--r-- 1 root root 0 Apr 20 09:01 test.txt
第一栏代表这个文件的类型与权限
第一个字符代表这个文件是“目录、文件或链接文件等等”:
当为[ d ]则是目录,例如上表文件名为“.config”的那一行;当为[ - ]则是文件,例如上表文件名为“initial-setup-ks.cfg”那一行;
若是[ l ]则表示为链接文件(link file);
若是[ b ]则表示为设备文件里面的可供储存的周边设备(可随机存取设备);
若是[ c ]则表示为设备文件里面的序列埠设备,例如键盘、鼠标(一次性读取设备)
接下来的字符中,以三个为一组,且均为“rwx” 的三个参数的组合。其中,[ r ]代表可读(read)、[ w ]代表可写(write)、[ x ]代表可执行(execute).要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号[ - ]而已。
第一组为“文件拥有者可具备的权限”;
第二组为“加入此群组之帐号的权限”;
第三组为“非本人且没有加入本群组之其他帐号的权限
举例:
若有一个文件的类型与权限数据为“-rwxr-xr--”,请说明其意义为何?
所有者:可读、可写、可执行(rwx)
所属组:本例中为可读可执行(rx)
其他人:只读
修改文件的属性和权限
chgrp :改变文件所属群组
chown :改变文件拥有者
chmod :改变文件的权限, SUID, SGID, SBIT等等的特性
举例:
1. 改变文件的拥有者。将test.txt文件的拥有者改为test用户。
[root@mysql tmp]# ll test.txt -rw-r--r-- 1 root root 0 Apr 20 09:01 test.txt [root@mysql tmp]# id test uid=1001(test) gid=1001(test) groups=1001(test) [root@mysql tmp]# chown test test.txt [root@mysql tmp]# ll test.txt -rw-r--r-- 1 test root 0 Apr 20 09:01 test.txt
2. 同样将文件的小组改为test.
[root@mysql tmp]# ll test.txt -rw-r--r-- 1 test test 0 Apr 20 09:01 test.txt
3. 同样也可以用chown同时改变拥有者和所属组
[root@mysql tmp]# useradd t2 [root@mysql tmp]# chown t2.t2 test.txt [root@mysql tmp]# ll test.txt -rw-r--r-- 1 t2 t2 0 Apr 20 09:01 test.txt //或者换一种写法效果一样 [root@mysql tmp]# useradd t3 [root@mysql tmp]# chown t3:t3 test.txt [root@mysql tmp]# ll test.txt -rw-r--r-- 1 t3 t3 0 Apr 20 09:01 test.txt
修改文件权限,chmod 命令的使用
chmod | u g o a |
+ (加入) -(除去) = (设置) |
r w x |
文件或者目录 |
隐藏权限
默认权限与隐藏权限
除了基本r, w, x权限外,在Linux传统的Ext2/Ext3/Ext4文件系统下,我们还可以设置其他的系统隐藏属性,这部份可使用chattr 来设置,而以lsattr 来查看,最重要的属性就是可以设置其不可修改的特性!让连文件的拥有者都不能进行修改!这个属性可是相当重要的,尤其是在安全机制上面(security)!比较可惜的是,在 CentOS 7.x 当中利用 xfs 作为默认文件系统,但是 xfs 就没有支持所有的 chattr 的参数了!仅有部份参数还有支持而已
默认权限:umask
创建一个新的文件或目录时,它的默认权限会是什么?那就与 umask 有关 了!umask 是什么呢? umask 就是指定“目前使用者在创建文件或目录时候的权限默认值”,
[root@mysql tmp]# umask 0022 [root@mysql tmp]# umask -S u=rwx,g=rx,o=rx
umask:遮罩码,反向掩码 影响用户新创建的文件和目录的默认权限
666-umask
777-umask
在默认权限的属性上,目录与文件是不一样的。我们知道 x 权限对于目录是非常重要的!但是一般文件的创建则不应该有执行的权限,因为一般文件通常是用在于数据的记录嘛!当然不需要执行的权限了。因此,默认的情况如下:
若使用者创建为“文件”则默认“没有可执行( x )权限”,亦即只有 rw这两个项目,也就是最大为666 分,默认权限如下:
-rw-rw-rw-
若使用者创建为“目录”,则由于 x 与是否可以进入此目录有关,因此默认为所有权限均开放,亦即为777 分,默认权限如下:
drwxrwxrw
因为 umask 为 022 ,所以 user 并没有被拿掉任何权限,不过 group 与others 的权限被拿掉了 2 (也就是 w 这个权限),那么当使用者:
创建文件时:(-rw-rw-rw-) - (-----w--w-) ==> -rw-r--r-- ---
>644
创建目录时:(drwxrwxrwx) - (d----w--w-) ==> drwxr-xr-x --
--->755
隐藏权限
//查看文件的隐藏权限,lsattr命令
[root@mysql tmp]# lsattr test.txt
---------------- test.txt
//chattr更改文件的隐藏权限。
a:让文件或目录仅供附加用途;
b:不更新文件或目录的最后存取时间;
c:将文件或目录压缩后存放;
d:将文件或目录排除在倾倒操作之外;
i:不得任意更动文件或目录;
s:保密性删除文件或目录;
S:即时更新文件或目录;
u:预防意外删除
最重要的当属 +i 与 +a 这个属性了。+i 可以让一个文件无法被更动,对于需要强烈的系统安全的人来说,真是相当的重要的!里头还有相当多的属性是需要 root 才能设置
举例:
-i 选择的运用
[root@mysql tmp]# pwd /tmp [root@mysql tmp]# touch t1.txt [root@mysql tmp]# chattr +i t1.txt [root@mysql tmp]# lsattr t1.txt ----i----------- t1.txt [root@mysql tmp]# rm -f t1.txt rm: cannot remove ‘t1.txt’: Operation not permitted //即使 是root也没有权限删除和移动 [root@mysql tmp]# mkdir testdir [root@mysql tmp]# mv t1.txt testdir/ mv: cannot move ‘t1.txt’ to ‘testdir/t1.txt’: Operation not permitted
2、-a选项的运用。文件内容只能追加,不能覆盖。
[root@mysql tmp]# cat t1.txt 123 [root@mysql tmp]# chattr +a t1.txt [root@mysql tmp]# lsattr t1.txt -----a---------- t1.txt [root@mysql tmp]# echo 456 > t1.txt -bash: t1.txt: Operation not permitted [root@mysql tmp]# echo 456 >> t1.txt
三、特殊权限和Facl
SUID:
运行某程序时,相应进程的属主是程序文件自身的属主,而不是用户本身了,只对二进制程序有效,执行者对于程序需要有x权限
编辑
例子:passwd命令 需要在/etc/shadow中写入密码
ls -l /bin/cat
ls -l /etc/shadow
chmod u+s file (如果本身具有x,为s,否则为S)
总结: 其他人,运行SUID的文件时,就临时拥有了SUID文件所属者的权限。
SGID:
对于文件:运行某程序时,相应进程的属组是程序文件自身的属组,而不是用户本身的基本组
对于目录:
用户对此目录有rx权限可以进入目录
用户进入此目录后,有效用户组会变成该目录的用户组
若用户在此目录有w权限,则用户创建的文件用户组与该目录用户组相同
Sticky (BIT):
只针对目录有效,当用户对目录拥有wx权限时,用户在该目录创建的文件或目录,只有自己与root才可以删除。
在一个公共目录,每个人都可以创建文件,删除自己的文件,但是不能删除别人的文件(冒险位,粘贴位)
FACL
文件系统访问控制列表
FACL:filesystem access control list
利用文件的扩展属性,保存了额外的访问控制权限
getfacl 查看、setfacl 设置
语法:setfacl [-bkRd] [-m|-x acl 参数] 目标文件名
选项与参数:
-m:设置后续的acl参数,不可与-x一起使用
-x: 删除后续的acl参数,不可与-m一起使用
-b:删除所有的acl参数
-k:删除默认的acl参数
-R:递归设置acl参数
-d:设置默认acl参数,只对目录有效