目录
什么是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/catls -l /etc/shadowchmod 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 参数,只对目录有效