第七章 权限管理
7.1 用户使用资源限制文件
Linux中,对于用户使用系统资源,如:CPU、内存、磁盘空间等,都可以做出限制,需要在相关的配置文件中做设置:
vi /etc/security/limits.conf ---编辑资源限制文件,可写入
zhang soft nproc 70
---soft 设置软限制,即警告值, nproc表示该用户运行起的进程数
zhang hard nproc 100 ---hard 设置硬限制,即上限最大值
以上案例可以实现对用户zhang限制其运行进程的数量,到达soft软限制时,会有警报,但仍可继续使用,到达hard硬限制时,将不允许再使用了。
注:该文件注释中的<item>项对可设定限制的资源项有解释。
7.2 文件访问权限设置
7.2.1 文件详细信息介绍
之前我们学习过,ls –l 或 ll后可见到目录下文件的详细信息,那么具体这些信息都是什么呢?我们来详细介绍下:
ls -l ---显示目录内容的详细信息,会显示7项信息
从左至右依次为:文件权限 硬链接数 文件的所属者(属主) 文件的所属组(属组) 文件大小(单位:B) 上一次修改时间 文件名
对应下图:
其中:文件权限部分由10个字符组成,意义如下:
- rwx rwx rwx
文件类型 所属者权限u 所属组权限 g 其他用户权限 o
注:三类用户统一表示用 a
第一个字符的文件类型,由不同字符表示不同类型的文件,具体如下:
- 二进制文件,即文档类 d 目录 l 软链接 b 块设备,如磁盘 c 字符设备,如磁带
注:块设备、字符设备的原理,我们将在后续章节中介绍
每类用户的权限,都由rwx组成,表示了该类用户的访问权限:r读取 w写入 x执行,例如:-rw-r--r-- 表示文档类文件,属主具备读写权限,属组成员具备只读权限,其他用户具备只读权限。
权限的10个字符后的数字1 表示该文件的硬链接数,之前已经讲过。在后面的两个root,前一个表示文件的所属者即属主,后一个表示文件的所属组即属组。二者的权限对应权限中的u和g块。
7.2.2 权限配置
我们先来看一个案例:
图中,以root用户创建并写入一个文件f1,切换到zhang用户下,可查看但不可写入,原因是对于f1文件来讲,属主是root,属组是root,而zhang用户属于其他用户类别,所以只有读权限,没有写权限。那么如果想要允许zhang用户能够写入f1,则需要做权限的更改。更改权限的命令是chmod,它有三种设置方式:
chmod u x,g w,o-r f1 ---增减方式配置权限
chmod a x f1 ---三类用户统一设置
注:增减的方式是在原有权限的基础上做增加或减去
chmod u=rw,g=r,o=r f1 ---赋值方式
chmod a=rw f1
注:赋值方式是全新赋值,覆盖原有权限
chmod 644 f1 ---数字赋值方式,即u=6,g=4,o=4
解释:把rwx三个权限视为一组3bit的二进制数字,有该权限,对应位置1;没有该权限,对应位置0,再转回十进制
例:rw- => 110 => 6 rwx=> 111 =>7 r-x => 101 => 5
所以:chmod 644 f1即 u=rw g=r o=r
chmod 66f1 ---位数不足三位,采用高位补零,即066,称为:右匹配原则
7.2.3 目录的rwx对应的意义
对于文件,我们很容易判断rwx三种权限的功能,即r读取文档,w写入文档,x执行该程序。但是对于目录,我们可能不太清楚rwx的功能,下面具体介绍一下:
r ---显示目录下的内容,即ls功能
w ---允许在目录下创建子目录、子文件
x ---进入目录的功能,即cd功能
可参考如下实验:
由图中可见,只有单x权限的目录,其他用户只能cd进去,却ls查看不了;只有单r权限的目录,其他用户只能ls查看其内容,但cd不进去。而w权限对于目录应该是比较好理解的,表示能够在目录下创建、删除、改名子目录或子文件。
7.2.4默认权限
由前面的案例可见,root创建目录后的默认权限是755,创建文件后的默认权限是644,原因是Linux中有一个权限参数变量:umask 默认值是0022,先关注后三位,即022。可用umask命令查看到其值:
umask ---查看umask变量的值
文件的默认权限其实是由满权限减去umask的后三位的值得到的,如下:
文件默认权限:满权限 - umask = 默认权限
666 - 022 = 644
目录默认权限:满权限 - umask = 默认权限
777 - 022 = 755
注:普通文件因为一般无需执行,所以满权限被认为是666;目录因为必须有x权限才可进入,所以满权限被认为是777
其实umask的值也不是固定的,不同身份的用户umask值也不同,管理员root umask=0022 普通用户 umask=0002,读者可自行查看。
另外,umask的应用除了系统中会有使用,很多文件传输类服务,如:FTP,在上传文件时也会设置umask以制定默认权限,这里暂不展开讲解,先行记住即可。
7.2.5安全位 ---set位
安全位的概念有些复杂,比较难以理解,读者需要多做实验,加以印证。
功能:可以给u 或 g 增加安全位 即 u s 或 g s,并且安全位是加给某个程序的,
则运行该程序时,程序所访问到的文件,以此文件的所属者或所属组身份访问
案例:chmod u s /usr/bin/cat ---给cat命令程序增加用户安全位
su zhang
cat f1 ---则此时,访问f1时,以f1文件的所属者身份访问
ll /usr/bin/cat
注:查看显示程序信息,安全位s显示在x权限的位置,大写S说明之前无x权限,小写s说明之前有x权限
案例如下图:
如图,给cat命令的执行程序增加安全位后,zhang用户使用cat命令时,读取f1的内容,按f1文件的属主身份访问,但是如果使用head、tail、more等命令读取f1时仍应该是拒绝的。
同样道理,如果给cat命令增加了g s即组的安全位,则cat访问f1时,会以f1的属组身份访问的。
7.2.6 粘贴位 ---sticky位,又称粘连位
我们可以想象一下,如果我们以一个用户的身份进入系统,在某目录下创建了自己的目录和文件,当其他用户也登录进系统,如果权限允许,是可以删除我们所创建的文件的,这样对于我们的个人资料就不安全了,为了保护用户的个人资料,可以使用目录粘贴位的方式加以保护。
介绍:可以给目录增加粘贴位,粘贴位只能加到o 上,即 o t,增加了粘贴位的目录,目录中的内容只有创建者有权删除
案例如图:
上图中,我们首先给/mnt的o增加了w权限,因为默认/mnt目录的权限是755,即其他用户无权写入。查看是用ll –d /mnt是只显示/mnt目录的信息,不显示/mnt目录下内容的信息。之后我们使用zhang用户进入/mnt中,创建了目录和文件,但是切换到moon用户下时,是可以删除的。下面我们来看一下增加了粘贴位的效果:
上图中可见,给/mnt增加了粘贴位后,zhang所创建的目录及文件,moon用户无权删除了,这就是粘贴位的功能。
7.2.7 权限配置进阶
有了安全位、粘贴位的概念,我们再来看一下四位数字赋值的方式
chmod 5755 d1
解释:第一位数字表示 u g 的安全位和o的粘贴位组成的3bit的二进制,如:5表示 s-t,即 u s o t
umask 中的第一位数字,也代表的也是文件默认的u g 的安全位和o的粘贴位。
另外,我们可以做实验证明,当给目录设置权限以后,目录内的子目录、子文件是不跟着一起变化的,那么如果我们想要实现改变目录的权限,其内部文件一起变,即配置的继承功能,则需要增加–R 参数,我们称之为递归操作,案例如下:
chmod -R 755 /mnt/d1 --- -R 表示递归操作
7.3 所属信息配置
我们在ls -l 查看的结果中,第三、第四项表示文件的所属者、所属组。当创建文件、目录后,默认当前的创建者即是文件的所属者,所属者所在的私有组即是该文件的所属组。可以想象一下,在权限为644的文件上,如果禁止更改权限,却仍想要允许zhang用户写入文件,可以采用的方法是更改文件的所属者为zhang用户,则zhang即可有写入权限了。
7.3.1 所属信息配置命令
更改文件所属的命令是chown,具体格式如下:
chown zhang f1 ---更改文件的所属者
注:更改后可验证zhang用户对f1有写入权限了
chown .zhang f1 ---更改所属组, 用 . 前面空白,表示略过属主,设置属组,注:用.或:都可以,如 chown:zhang f1
chown root.root f1 ---同时改两项, 等同于:chown root:rootf1
其实更改所属组,还有一个命令是 chgrp,但我们日常使用并不多,所以这里仅仅提示一下。如:chgrp zhang f1
另外,如果我们更改所属的对象是一个目录,默认仅是更改了目录的所属,而目录内的子文件、子目录并未跟着一起更改,若想实现目录内容继承更改,则需要增加递归参数–R,命令如下:
chown -R zhang.zhang dd ---更改目录及其内容的所属信息,-R 递归
最后再来看一下文件复制对文件所属信息的影响:
如图可见,复制目录后,文件的所属发生了变化,变回root属主root属组了。那么如果想要复制后保持原所属信息不变,可增加 –p 参数,如下图:
7.4 访问控制列表ACL
7.4.1 ACL的功能
我们可以试想一下,如果我们有一个文件,属主root,属组root,权限644,现不希望更改文件所属,却想仅允许用户zhang可以写入,该怎么办呢?如果用o w的操作,虽然zhang可以写了,但是除了zhang以外的其他用户,如:lisi等,也具备了写的权限,这与我们的初衷不符,这时候,就可以使用acl来解决此问题。
ACL的功能就是:针对文件,设置特权用户,即允许特定用户访问
如:f1文件权限644,属主root,属组root,则zhang无权写入,可给zhang设定特权,仅允许zhang写入
7.4.2 ACL命令
具体的配置命令如下:
getfacl f1 ---查看文件的acl信息
setfacl -m u:zhang:rw f1 --- 针对文件,设置用户的acl, -m表示设置 u: 表示设置用户的acl
如图所见,用户zhang即对f1有rw权限了,可尝试编辑f1文件加以验证。
另外针对文件,也可以做组的ACL,命令如下
setfacl -m g:zu11:rw f1 --- g:表示设置组的acl
若要撤销acl,可使用-x或-b参数,具体如下:
setfacl -x u:zhang f1 ---撤销单个acl
setfacl -b f1 ---撤销文件的所有acl
7.5 文件属性设置
关于文件属性,其实日常工作中使用较少,这里我们只是简单介绍下,读者能够知道其功能即可。
属性,即文件的某些特性。使用lsattr命令查看,案例如下
lsattr -aR /root ---查看 /root 下的文件及目录权限
-a: 显示指定目录下的文件及目录的属性
-R: 递归显示
文件的常用属性有:
i: 只读属性
A:不更新文件的访问时间 .可减少磁盘 IO 操作
a:可追加数据,但无法修改、删除、重命名
c:压缩, 文件使用时自动解压, 离开文件 / 目录时自动压缩,以节省使用空间
d: 忽略 dump 备份 , 文件有此属性将不允许备份
S: sync 同步
s:安全删除属性 , 文件不可恢复
u:文件删除后,可恢复
其中我们比较容易理解的是:i a c 等属性
我们可以用 chattr命令,使用 - 号来给文件增加或删除属性:
如图所示,在给f1增加i属性前,是可以写入的,给f1增加了i属性后,f1即处于只读状态,可用lsattr查看到,便不可再写入了。之后去除i属性后,f1又可写了。