上一篇介绍了 Linux 用户管理,接下来介绍一下 Linux 的权限管理。Linux 是多用户的操做系统,容许多个用户同时登陆和工做,Linux 权限是操做系统用来限制不一样用户对资源的访问机制。这里暂且将 Linux 中的权限分为三类:算法
使用 ls 命令时,长格式显示的第一列就是文件的权限,例如:数据库
[root@localhost ~]# ls -l install.log -rw-r--r--. 1 root root 28425 11月 30 18:50 install.log
第一列的权限位 -rw-r--r--.
,则共11位,这11位权限位的含义以下图所示: vim
第1位:表明文件类型。Linux不像Windows使用扩展名表示文件类型,而是使用权限位的第一位表示文件类型。虽然Linux文件的种类不像Windows中那么多,可是分类也很多,详细状况可使用“info ls
” 命令查看。这里列出一些常见的文件类型:segmentfault
-
: 普通文件d
: 目录文件。Linux中一切皆文件,因此目录也是文件的一种l
: 软连接文件b
: 块设备文件。这是一种特殊设备文件,存储设备都是这种文件,如分区文件/dev/sda1就是这种文件c
: 字符设备文件。这也是特殊设备文件,输入设备通常都是这种文件,如鼠标、键盘等p
: 管道符文件。这是一种很是少见的特殊设备文件。s
: 套接字文件。这也是一种特殊设备文件,一些服务支持socket访问就会产生这样的文件第2~4位:表明文件所属者的权限数组
r
: 表明read,是读取权限w
: 表明write,是写权限x
: 表明execute,是执行权限第11位安全
.
:若是是个点表明受 SELinux 安全上下文保护,这里忽略暂不作详细介绍+
:若是是个加号表示设置了ACL权限,下文再作详细介绍读、写、执行权限对文件和目录的含义是不一样的。bash
权限对文件的做用app
cat
、more
、less
、head
、tail
等文件查看命令vim
、echo
等修改文件数据的命令。注意:对文件有写权限,是不能删除文件自己的,只能修改文件中的数据,若是想要删除文件,则须要对文件的上级目录拥有写权限。权限对目录的做用less
ls
命令查看目录下的内容了touch
、rm
、cp
、mv
等命令cd
命令进入目录chmod
命令用来修改文件或目录的权限。异步
命令格式:chmod [选项] 权限模式 文件或目录
选项:
-R
:递归设置权限,也就是给予目录中的全部文件和子目录设定权限--reference=参考文件或目录
:使用参考文件或参考目录的权限来设置目标文件或目录的权限权限模式
:权限模式分为符号组合和八进制数组合 符号组合的格式是[ugoa][[+-=][permission]]
,也就是[用户身份][[赋予方式][权限]]
的格式。
用户身份
u
:表明全部者(user)g
:表明所属组(group)o
:表明其余人(other)a
:表明所有身份(all)赋予方式
+
:加入权限-
:减去权限=
:设置权限权限
r
: 读取权限(read)w
: 写权限(write)x
: 执行权限(execute)八进制数组合的格式是 [0-7][0-7][0-7]
三位数字组成(每一位数字都是权限之和),第一位是所属者权限之和,第二位是所属组权限之和,第三位其余人权限之和
r
读取权限对应的数字是 4
w
写权限对应的数字是 2
x
执行权限对应的数字是 1
rw
八进制数表示 6
示例:
# 1. 添加组用户的写权限。 chmod g+w test.log # 2. 删除其余用户的全部权限。权限为空,即权限设置为'---' chmod o= test.log # 使全部用户都没有写权限 chmod a-w test.log # 3. 当前用户具备全部权限,组用户有读写权限,其余用户只有读权限 chmod u=rwx, g=rw, o=r test.log 等价于 chmod 754 test.log # 4. 将目录以及目录下的文件都设置为全部用户都拥有读写权限 chmod -R a=rw testdir/ # 5. 根据参考文件 a.log 的权限来 设置文件 test.log 的权限 chmod --reference=a.log ./test.log
chown
命令用来修改文件和目录的全部者和所属组。
命令格式:chown [选项] 全部者[:所属组] 文件或目录
选项:
-R
:递归修改目录下全部的文件及子目录的所属者和所属组--reference=参考文件或目录
:使用参考文件或参考目录的所属者和所属组来设置目标文件或目录的所属者和所属组全部者[:所属组]
:当省略 ":所属组
",仅改变文件所属者注意:普通用户不能修改文件的所属者和所属组,哪怕本身是这个文件的所属者也不行。普通用户能够修改所属者是本身的文件权限
示例:
# 修改文件的所属者为 user1,所属组为 group1 chown user1:group1 test.log
chown
命令只能用来修改文件和目录的所属组,其实彻底能够由 chown
命令来替代。
命令格式:chgrp 用户组 文件或目录
选项:
-R
:递归修改目录下全部的文件及子目录的所属组--reference=参考文件或目录
:使用参考文件或参考目录的所属组来设置目标文件或目录的所属组当建立一个新的文件和目录是都默认会有一些权限,新建的文件权限通常是 "-rw-r--r--
",新建的目录权限通常是 "drwxr-xr-x
"。这些新建文件或目录的默认权限是由权限掩码 umask来决定的。在讲解 umask 以前,须要先了解一下文件和目录的默认最大权限
666
(即 -rw-rw-rw-
),没有执行权限,只是由于执行权限对文件来说比较危险,不能再新建文件的时候默认赋予,而必须经过用户手工赋予777
(即 drwxrwxrwx
),这是由于对目录而言,执行权限仅仅表明进入目录,因此即便新建目录时直接默认赋予也没有什么危险查看权限掩码值 和 新文件新目录的预设权限,以下
[root@localhost ~]# umask 0022 [root@localhost ~]# umask -S u=rwx,g=rx,o=rx [root@localhost ~]# touch testfile [root@localhost ~]# mkdir testdir [root@localhost ~]# ls -ld testfile testdir/ drwxr-xr-x. 2 root root 4096 4月 22 14:48 testdir/ -rw-r--r--. 1 root root 0 4月 22 14:47 testfile [root@localhost ~]#
权限掩码值所表示的权限就是新建文件和新建目录要从默认最大权限里要排除的权限。查询掩码值由两种方式,直接执行 "umask
" 以数字方式展现,能够看到有四位 '0022
',其中第一位是特殊权限用的,这里暂时先无论,主要看后三位 "022
",即"----w--w-
";执行 "umask -S
" 以符号方式展现,其中缺乏的权限对应的权限值就是掩码值,这里用户组和其余用户都缺乏 w
,因此掩码值是 022
。
按照官方的标准算法,umask
默认权限须要使用二进制进行逻辑与和逻辑非联合运算才能够获得正确的新建文件和目录的默认权限,这种方法既很差计算也很差理解,不推荐。咱们这里按照权限字母相减的方式来讲明默认权限的计算方式,以权限掩码值等于 "022
" 为例:
-rw-rw-rw-
,经过计算 (-rw-rw-rw-) - (-----w--w-) = (-rw-r--r--)
,则新建文件默认权限是 -rw-r--r--
,即 644
drwxrwxrwx
,经过计算 (drwxrwxrwx) - (d----w--w-) = (drwxr-xr-x)
,则新建目录默认权限是 drwxr-xr-x
,即 655
注意:
计算新建文件的默认权限时,网上有些教程直接使用使用权限数字相减获得默认权限,这样实际上是不对的。例如 umask 值为003
(即--------wx
),权限数字相减666 - 003 = 663
,获得的默认权限是663
(即-rw-rw--wx
), 显然不对,由于经过权限掩码能够看出默认权限里 other 是不该该包含wx
权限的。正确的计算结果是(-rw-rw-rw-) - (--------wx) = (-rw-rw-r--)
,即664
。形成这个错误的根本缘由是文件的默认最大权限是666
,全部二进制位并无满1
,而目录的默认最大权限是777
,全部二进制位都满1
了,因此新建目录的默认权限计算是可使用权限数字相减的,而新建文件的默认权限计算不能使用权限数字相减的
umask
命令是用来显示或设置建立文件或目录的权限掩码的。
命令格式:umask [选项] [权限模式]
选项:
-S
:以符号组合的方式输出权限掩码,不使用该选项时以八进制数的形式输出权限模式
:与上面 chmod
命令的权限模式相同使用umask
命令设置的权限掩码只是临时有效,若是须要永久有效,须要修改/etc/bashrc
文件里的内容,可是不建议修改
示例:
# 修改权限掩码为 033。等价于 "umask u=rwx,g=r,o=r" [root@localhost testdir]# umask 033 [root@localhost testdir]# umask 0033 [root@localhost testdir]# umask -S u=rwx,g=r,o=r [root@localhost testdir]# touch testfile2 [root@localhost testdir]# mkdir testdir2 [root@localhost testdir]# ls -ld testfile2 testdir2/ drwxr--r--. 2 root root 4096 4月 22 16:36 testdir2/ -rw-r--r--. 1 root root 0 4月 22 16:36 testfile2 [root@localhost testdir]#
假若有这样一种场景,有一个这样一个文件,权限是 "rwx-r----
",所属者是 user1,所属组组 gruop1。如今须要对另外一个用户 user2 单独设置该文件的写(w) 权限,可以想到的方法是 把其余用户(other) 的权限赋予写权限,可是这样除了 user2 以外的其余用户都能对该文件进行写操做了,显然不合适;若是把 user2 加入到用户组 group1,并设置 group1 对该文件有写权限,一样也不合适,由于这样 group1 内的用户对该文件都有了写权限;若是把全部者改成 user2 显然更不合适,这样该文件原有的所属者 user1 就对该文件没有了操做权限。
上面那种场景,只经过 所属者(u)、所属组(g)、其余用户(o) 配合 读(r)、写(w)、执行(x)权限 是没法知足的。这时就须要设定 ACL 权限来实现。ACL 是 Access Control List 的缩写,主要的目的是在提供传统的 owner、group、others 的 read、write、execute 权限以外的细部权限设定,ACL 能够针对单一使用者,单一文件或目录来进行 r、w、x 的权限规范。
ACL 主要是针对三个方面来控制权限的:
事实上,本来 ACL 是 unix-like 操做系统的额外支持项目,但由于近年以来 Linux 系统对权限细部设定的热切需求,所以目前 ACL 几乎已经预设加入在全部常见的 Linux 文件系统(ext2/ext3/ext4/xfs 等)的挂载参数中!因此你无须进行任何动做,ACL 就能够被使用了!不过,若是你不放心文件系统是否真的支持 ACL 的话,那么就检查一下磁盘分区信息,以确保开启了 ACL。
1. 查看磁盘分区是否开启 ACL
# 1. 查看当前系统有哪些分区。其中"/dev/mapper/VolGroup-lv_root"是逻辑卷分区,"/dev/sda1"是传统分区 [root@localhost ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/VolGroup-lv_root 18G 3.7G 13G 23% / tmpfs 490M 0 490M 0% /dev/shm /dev/sda1 477M 35M 417M 8% /boot # 2. 查看指定分区文件信息。若是输出包含"acl"字眼则表明该分区已经开启了 ACL [root@localhost ~]# dumpe2fs -h /dev/mapper/VolGroup-lv_root | grep -i acl dumpe2fs 1.41.12 (17-May-2010) Default mount options: user_xattr acl [root@localhost ~]# dumpe2fs -h /dev/sda1 | grep -i acl dumpe2fs 1.41.12 (17-May-2010) Default mount options: user_xattr acl [root@localhost ~]#
2. 开启 ACL
若是上面的查看信息中分区没有开启 ACL的话,你也能够经过下面两种方式来开启 ACL
mount -o remount,acl /
"。这种方式只能临时生效,系统重启又会恢复vim /etc/fstab
",找到对应分区那一行,在 "defaults" 后面追加 "acl",以下图。而后重启系统或者从新挂载 "mount -o remount /
" 使修改生效setfacl 命令用来设定 acl 权限,命令格式:setfacl 选项 文件或目录
选项
-m [u|g|m]:[用户名|组名]:权限
:设定 acl 权限。也能够设置 acl 的有效权限(不用指定用户或用户组)-x [u|g]:[用户名|组名]
:删除指定的 acl 权限。与 -m
选项是相对的-b
:删除所有 acl 权限-R
:递归设定 acl 权限,指目录下现有的全部文件和子目录也设定相同的 acl 权限-d
:设定默认 acl 权限,指目录下后续新建的文件和子目录拥有的默认 acl 权限-k
:删除默认 acl 权限getfacl 用来查看 acl 权限,命令格式:getfacl 文件或目录
ll
命令查看,第一列权限位的最后一个字符显示 "+
"。注意,此时看到的权限(664
)和实际的权限(644
)是有所差异的,此时实际权限就须要经过 getfacl
命令查看了getfacl
命令查询 acl 权限输出结果中,"user:user1:rw-
" 表示用户 user1 对该文件拥有读写权限,若是省略中间的用户名,即"user::rw-
"表明文件所属者拥有的权限,用户组表示规则也同样mask::rw-
" 为 acl 的默认最大有效权限,即给用户或者用户组设置的 acl 权限不能超出该范围与针对用户设定 acl 权限类似,以下:
使用 getfacl
命令查询输出的结果中, mask
表明针对用户和用户组可以设定的最大有效权限,即设定的 acl 权限不能超出 mask 的范围。若是超出了,超出的部分权限是不生效的。
能够经过 "-R
" 选项给目录设定 acl 权限的同时,也给该目录下面的全部文件和子目录设定相同的 acl 权限。以下:
相对有 "-R
" 选项给目录先现有的文件和子目录设定 acl 权限,而 "-d
" 选项是给目录下未来要新建的文件和子目录设定默认 acl 权限,即该目录下文件一旦成功建立成功就拥有的 acl 权限。以下:
其中 "setfacl -d -m u:user2:rwx /tmp/acl_test_dir/
" 等同于 "setfacl -m d:u:user2:rwx /tmp/acl_test_dir/
"
setfacl -x u:user1 /tmp/acl_test_file
setfacl -k /tmp/acl_test_dir/
setfacl -b /tmp/acl_test_dir/
Liunx 中处理常见的 "读写执行(rwx
)" 权限外还有一些特殊权限 s
和 t
,以下:
这些特殊权限是什么意思呢?咱们先从 SUID 开始提及
当 s
权限标志出如今文件所属者的 x
权限位时,如 "/usr/bin/passwd
" 的权限状态 "-rwsr-xr-x
",则表明该文件被设置了 SetUID 权限,简称 SUID。若是文件被设置了 SUID 所起到的做用是任何用户去执行该文件时,用户的身份会被切换为该文件所属者的身份去执行而不是以该用户本身的身份去执行。
以仍是 "/usr/bin/passwd
" 命令为例,使用 passwd
命令修改密码时,实际上修改的是 "/etc/shadow
" 文件,而该文件的权限是 "----------
",所属者和所属组都是 root,也就是说只有 root 用户才能够强制修改 "/etc/shadow
" 文件。可是实际使用中普通用户也是能够修改本身的密码的,即也能修改 "/etc/shadow
" 文件,这是由于 "/usr/bin/passwd
" 被设置了 SUID,普通用户执行 passwd
命令的过程当中其实是以 root 身份去执行的。
SUID 的限制与功能:
设置 SUID 权限
chmod u+s 可执行二进制程序文件
或 chmod 4(0-7)(0-7)(0-7) 可执行二进制程序文件
s
权限标志占用所属者本来的 x
权限位。若是显示的是大 S
,说明是在所属者没有执行权限的状况下设置的 SUID,这时设置的 SUID 权限是无效的,须要把所属者的执行权限加上才能有效,即变为小 s
s
对应的数值是 4
通常不要轻易设置 SUID 权限,由于该动做很危险,试想一下,若是给 "/usr/bin/vim" 设置 SUID 权限,那么任何用户都能使用 "vim" 命令修改任何文件了
当 s
权限标志出如今文件所属组的 x
权限位时,如 "/usr/bin/locate
" 的权限状态 "-rwx--s--x
",则表明该文件被设置了 SetGID 权限,简称 SGID。与 SUID 相比,SGID既能够针对文件来设定,又能够针对目录来设定,功能分别以下:
针对文件 SGID 的限制与功能:
例如,任何用户都能使用 locate
命令来查询数据库文件 "mlocate.db"。由于使用 locate
命令时,所属组都会被切换为 "slocate"
针对目录 SGID 的限制与功能:
r
和 x
权限 w
权限时,新建文件的所属组是此目录的所属组设置 SGID 权限
chmod g+s 目录或文件
或 chmod 2(0-7)(0-7)(0-7) 目录或文件
s
权限标志占用所属组本来的 x
权限位。若是显示的是大 S
,说明是在所属组没有执行权限的状况下设置的 SGID,这时设置的 SGID 权限是无效的,须要把所属组的执行权限加上才能有效,即变为小 s
s
对应的数值是 2
当 t
权限标志出如今文件其余用户(other)的 x
权限位时,如 "/tmp/
" 的权限状态 "drwxrwxrwt
",则表明该文件被设置了 Sticky Bit 权限,简称 SBIT。SBIT 权限只能针对目录生效。
SBIT 的限制与功能:
w
和 x
权限例如,目录 "/tmp/" 被设置了 SBIT 权限,普通用户是不能删除该目录下所属者非本身的文件的,即使全部用户对 "/tmp/" 目录都有写权限
设置 SBIT 权限
chmod o+t 目录
或 chmod 1(0-7)(0-7)(0-7) 目录
s
权限标志占用其余用户本来的 x
权限位。若是显示的是大 T
,说明是在其余用户(other)没有执行权限的状况下设置的 SBIT,这时设置的 SBIT 权限是无效的,须要把其余用户(other)的执行权限加上才能有效,即变为小 t
t
对应的数值是 1
除了上面所说的几种权限外,还能够给文件或目录设置隐藏属性起到权限限制的做用。关于隐藏属性的设置和查看涉及到两个命令 chattr
和 lsattr
。
命令格式:chattr [+-=][属性] 文件或目录
+-=
:+
增长属性;-
:移除属性;=
:设定属性,覆盖原有值A
:当设定了 A 这个属性时,存取此文件(或目录)时,访问时间 atime 将不会被修改。可避免 I/O 较慢的机器过分的存取磁盘S
:通常文件是异步写入磁盘的,若是加上 S
这个属性时,当你进行文件的修改时,会当即同步写入磁盘中a
:文件将只能增长数据,而不能删除也不能修改数据c
:会自动的将此文件压缩,在读取的时候将会自动解压缩。对于大文件挺有用的d
:使文件(或目录)不会被 dump 备份i
:让一个文件(或目录)不能被删除、更名、设定连结也没法写入或新增数据s
:文件被删除时,将会被彻底的移除出这个硬盘空间,因此若是误删了,彻底没法救回来了u
:与 s
相反的,该文件被删除了,则数据内容其实还存在磁盘中,能够恢复该文件示例:
# 1. 建立一个文件 [root@localhost ~]# touch testfile # 2. 给 testfile 文件设置 "i" 属性 [root@localhost ~]# chattr +i testfile # 3. 试图删除 testfile 文件失败,即便是 root 用户 [root@localhost ~]# rm -rf testfile rm: 没法删除"testfile": 不容许的操做 # 4. 移除 "i" 属性 [root@localhost ~]# chattr -i testfile # 5. 再次删除成功 [root@localhost ~]# rm -rf testfile [root@localhost ~]#
chattr
命令只有在 ext2/ext3/ext4 文件系统下才生效
命令格式:lsattr 选项 文件或目录
选项
-a
:将目录下隐藏文件的属性也展现出来-d
:若是查询的是目录,仅列出目录自己的属性而非目录内的文件-R
:连同子目录的数据也一并列出来示例:
[root@localhost ~]# touch testfile [root@localhost ~]# lsattr testfile -------------e- testfile [root@localhost ~]# chattr +aiS testfile [root@localhost ~]# lsattr testfile --S-ia-------e- testfile [root@localhost ~]#