1. 用户和权限的基本概念
1.1 基本概念
用户是Linux系统工作中重要的一环,用户管理包括用户与组的管理,在Linux系统中,不论是本机还是远程登录系统,每个系统必须拥有一个账号,并且对于不同的系统资源拥有不同的使用权限。在Linux中可以指定每一个用户针对不同的文件或目录的不同权限。这些权限具体包括:
- 读:用
r
或4
表示,对于目录来说,如果有r权限,表示可以使用ls命令查看该目录下的文件情况,但能否查看文件的内容由文件的权限决定; - 写:用
w
或2
表示,对于目录来说,拥有该权限的用户可以在该目录下创建文件和目录; - 执行:
x
或1
表示,如果一个目录有x权限,表示可以使用cd命令进入到这个目录;而如果一个目录没有x权限,而有r或者w权限,表示该目录是一个问题目录。
注: 只有拥有人和root可以对文件进行权限修改,其他人不能修改文件的权限,并且只有拥有人和root可以对其进行强制写入
1.2 ls -l扩展
ls -l命令可以查看文件夹下的内容的详细信息,从左到右依次为:
- 权限——第一个字符如果是d则表示目录
- 硬链接数——通俗的讲,就是有多少种方式可以访问到当前目录/文件,比如可以通过
.
到达当前目录,就算一种方式。 - 拥有者——家目录下,文件/目录的拥有者通常都是当前用户
- 组——在Linux中,很多时候会出现组名和用户名相同的情况,后面再说。
- 大小
- 时间
- 名称
1.3 chmod的使用
1.3.1命令格式
设置权限格式:chmod u= ,g= ,o= file_name
,=
后面分别根用户、所属组其他用户、其他用户的权限
1.3.2 常用命令示例
示例1:
命令:chmod u+r test.txt
说明:让test.txt的拥有者具有test.txt文件的读权限
示例2:
命令:chmod g+x test.txt
说明:让test.txt的拥有者所在的组拥有test.txt文件的可执行权限
示例3:
命令:chmod o+rwx test.txt
说明:让其他组拥有test.txt文件的可写可读可执行权限
对于以上示例,将命令中的+
换为-
就可以减去相应权限,初此之外,a表示所有的用户。如果是初次指定文件权限,则可以用以下命令:
示例4:
命令:chmod 777 test.txt
表示将所有权限赋给是拥有者、拥有者所在的组及其他组,等价于chmod a=rwx test.txt
,这是一个赋值法的语句,一般用来重写某个文件的权限。
关于针对目录的各种权限的说明:如果没有可读权限,则无法对该目录使用ls等相关命令,如果没有可执行权限,则无法对该目录使用cd命令,但是有可读命令的前提是必须拥有可执行权限。
示例5:
命令:chmod u-x,g-x,o-x text.txt
,取消所有用户对text.txt的可执行权限。
示例6:
命令:chmod u+x,g+x,o+x test.txt
,对所有用户加上对test.txt文件的可执行权限。
1.4 设置文件的拥有人和所属组(chown&chgrp)
1.4.1 chown命令
- 语法:
chown [-options] 用户名:群组名 文件名或文件路径
- 参数:-R表示将一个此命令的效果应用于目录中的每个文件上,在修改目录拥有者和群组时使用。
- 功能:改变文件所属的用户和群组
附:如果只修改所属组,则可以使用chown :group_name filename
命令即可。
1.4.2 chgrp命令
- 语法:
chgrp group_name file_name
- 功能:修改文件/目录的所属组
1.5 超级用户的简介
Linux系统中的root账号通常用于系统的维护和管理,对操作系统的所有资源拥有访问权限,在大多数版本的Linux系统中,都不推荐直接使用root账号登录系统,在Linux系统安装的过程中会默认创建一个用户,这个用户被称为标准用户。
sudo是substitute user的缩写,表示使用另一个用户的身份,此时会要求输入密码,密码有五分钟的有效期。
2. Linux的特殊权限详解
Linux的特殊权限分为以下几类:
-
SET UID
:当文件被设置SET UID特殊权限时,任何人执行该文件,都会临时获得该文件拥有人的权限;在文件拥有者的权限列的执行权限位置,如果是s或S,则表明该文件被设置了SET UID权限,即权限列的第三位为s或S。最典型的一个应用就是/bin/passwd被设置了SET UID特殊权限。该目录的权限信息如下:
-
SET GID
:该特殊权限主要应用于目录,当一个目录被设置为SET GID特殊权限时,任何用户在该目录下创建文件,该文件的所属组都会被设置为设置SET GID的那个目录的所属组,实例:给zk目录设置SET GID权限的命令为chmod g+s ./zk
,设置完成后,任何人在zk目录下创建的文件其所属组都是zk目录的所属组。
说明: 在文件所属组的权限列的执行位置被设置为s或者S,就表名该目录被设置为SET GID特殊权限 -
Sticky(粘置位)
:当目录的其它用户的执行权限列为t或T时,表名该目录被设置了Sticky权限。当一个目录设置了该权限后,那么任何用户在该目录下创建的文件就只有拥有者自己和root可以删除,主要是限制对目录的写权限的。
实例:添加sticky权限的命令为:chmod o+t dir_name
附: 当设置特殊权限后,执行权限会被覆盖,如果是小写字母的特殊权限,那么执行权限依然在,如果是大写字母的特殊权限,那么就没有执行权限了。
3. umask缺省权限
3.1 umask简介
umask被称为系统缺省权限,一般来说,umask只看结果的后三位。在大部分系统中,用户创建的目录的缺省权限为777,文件的权限为666(因为普通权限自带执行权限是不太安全的)。而用户可以通过修改umask来间接的修改用户创建的文件/目录的默认权限,umask和权限的运算关系如下:
- 创建目录的默认权限的最终权限为目录777减去umask的后3位
- 创建文件的默认权限的最终权限为文件666权限减去umask的后3位
示例:加入目前umask的值为022,那么创建的目录的默认权限就为777-022=755,文件的默认权限为666-022=644(这不是十进制加减法,要将其转为对应的rwx权限,再进行运算,即不能进行借位操作)。
3.2 umask修改方法
- 临时修改umask(只在当前shell有效),命令格式为:
umask umask_value
示例:umask 0033
- 永久修改,在
/etc/bashrc
文件中,添加umask umask_value
即可,具体如下:
完成后,在命令行执行source /etc/bashrc
命令即可让修改立即生效。
4. ACL权限详解
4.1 ACL权限简介
针对超出三类人以上的权限限制,使用基本权限(u,g,o)已经无法实现了,为了解决此问题,引入了ACL权限,ACL(Access Control List)权限全称为访问控制列表,即对访问进行控制的一张列表。
4.2 设置ACL权限
- 命令格式:
setfacl [-options] u:username:权限 filename
- 实例:
setfacl -m u:mds:--- test.txt
表示移除mds用户对test.txt文件的所有权限; - 常用参数:
-m
:modify,表示修改的意思u
:表示针对用户设置特殊的权限-x
:删除ACL权限-b
:移除所有ACL权限(用ls查看不会显示“+”,-x删除完所有acl权限,依然会存在“+”)
附: 设置了ACL权限后,使用ls -l
命令查看时文件的权限信息最后一列会有一个+号。
实例:
4.3 获取ACL权限信息
- 命令格式:
getfacl file_name
查询到的结果格式为:user(group,other,mask):username:权限
,在结果之前开始有三行(以“#”开头),分别表示文件的文件名、拥有人和所属组。 - 结果说明:
- 如果第一列为user,第二列没有值,则表示该行设置的是owner的权限
- 如果第一列是group,第二列没有值,表示该行设置的是所属组group的权限
- other行总在最后一行
- 示例如下:
注: ACL是由上到下匹配的,一旦匹配成功,立即停止。
4.4 目录的ACL权限相关
针对目录设置ACL权限意义不大,一般对目录设置的ACL权限和对普通文件设置的ACL权限意义不一样,其意义是当在目录中新建文件时其自带的ACL权限,其作用并不在于访问控制,而是ACL权限的继承。
getfacl查看目录文件的acl权限,会发现有default开头的行,这些行表示在该目录下创建文件时会继承的权限。mask表示该文件acl的最大权限,即在default权限存在的情况下,创建文件的acl权限不能超过mask指定的权限。
可以通过setfacl -m mask:新权限 目录路径
来修改mask的值。
实例: 要求在test目录下创建的文件权限为user:ppd:–x,则可以直接通过命令setfacl -m u:ppd:--x test
设置该目录的ACL权限。
5. 权限委派
5.1 权限委派简介
权限委派是让普通用户能获得管理员权限的一种方式,主要是涉及对/etc/sudoers
文件的操作,关于更高级别的pam模块后续讲解。
5.2 权限委派实现与原理
实现: 在/etc/sudoers
文件中,按照格式用户名 ALL=(ALL) ALL
将相应用户写入,即可让指定用户的权限提升至root水平。让指定用户只可以以root身份执行特定命令的编写格式为用户名 ALL=/sbin/命令名
,同时,通过%组名 ALL=(ALL) NOPASSWD:ALL
格式可以让指定组内的用户以root身份执行命令且不需要输入自己的命令。
原理: 通过让该用户借助root的身份去执行命令,并未提升该用户本身的权限(也就是说这些命令实际上并不是由该用户自己执行的),且执行时需要在命令前面加上sodu
,执行时需要输入该用户的密码。
实例:
tgb ALL=(ALL) ALL
:将用户tgb的权限提升到root的权限tgb ALL=/sbin/useradd
:让用户tgb只能执行/sbin/useradd命令%ts ALL=(ALL) NOPASSWD:ALL
:表示用户组ts内的用户可以让root执行任何命令且不需要输入自己的密码
附: 一般在安装操作系统时,都会修改sudoer文件,添加一个用户,以避免直接使用root进行操作,例如在安装ubuntu桌面版等操作系统时,会强制让用户创建一个用户,使用该用户时,如果要执行某些命令,则必须要在命令前面加上sudo
才可以,否则会提示权限不足(permission denied)的错误。