linux系统 用户身份与文件权限(三)

0.文件的隐藏属性

    Linux系统中的文件除了具备一般权限和特殊权限之外,还有一种隐藏权限,即被隐藏起来的权限,默认情况下不能直接被用户发觉。有用户曾经在生产环境和RHEL考试题目中碰到过明明权限充足但却无法删除某个文件的情况,或者仅能在日志文件中追加内容而不能修改或删除内容,这在一定程度上阻止了黑客篡改系统日志的图谋,因此这种“奇怪”的文件也保障了Linux系统的安全性。

1.  chattr命令

    chattr命令用于设置文件的隐藏权限,格式为“chattr [参数] 文件”。如果想要把某个隐藏功能添加到文件上,则需要在命令后面追加“+参数”,如果想要把某个隐藏功能移出文件,则需要追加“-参数”。chattr命令中可供选择的隐藏权限参数非常丰富,具体如下表所示。

参数 作用
i 无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的子文件内容而不能新建或删除文件
a 仅允许补充(追加)内容,无法覆盖/删除内容(Append Only)
S 文件内容在变更后立即同步到硬盘(sync)
s 彻底从硬盘中删除,不可恢复(用0填充原文件所在硬盘区域)
A 不再修改这个文件或目录的最后访问时间(atime)
b 不再修改文件或目录的存取时间
D 检查压缩文件中的错误
d 使用dump命令备份时忽略本文件/目录
c 默认将文件或目录进行压缩
u 当删除该文件后依然保留其在硬盘中的数据,方便日后恢复
t 让文件系统支持尾部合并(tail-merging)
x 可以直接访问压缩文件中的内容

    先来创建一个普通文件,然后立即尝试删除(这个操作肯定会成功):

[[email protected] testdir]# echo "hello world" > test1
[[email protected] testdir]# rm -r test1 
rm:是否删除普通文件 "test1"?y
[[email protected] testdir]# 

    接下来我们再次新建一个普通文件,并为其设置不允许删除与覆盖(+a参数)权限,然后再尝试将这个文件删除:

[[email protected] testdir]# echo "hello world" > test2
[[email protected] testdir]# chattr +a test2 
[[email protected] testdir]# rm -r test2               
rm:是否删除普通文件 "test2"?y
rm: 无法删除"test2": 不允许的操作
[[email protected] testdir]# 

2.  lsattr命令

    lsattr命令用于显示文件的隐藏权限,格式为“lsattr [参数] 文件”。在Linux系统中,文件的隐藏权限必须使用lsattr命令来查看,平时使用的ls之类的命令则看不出端倪:

[[email protected] testdir]# ll -a test2 
-rw-r--r--. 1 root root 12 8月   9 21:33 test2
[[email protected] testdir]# lsattr test2 
-----a---------- test2
[[email protected] testdir]# chattr -a test2 
[[email protected] testdir]# lsattr test2    
---------------- test2
[[email protected] testdir]# rm -r test2 
rm:是否删除普通文件 "test2"?y
[[email protected] testdir]# 

3.文件访问控制列表

    不知道大家是否发现,前文讲解的一般权限、特殊权限、隐藏权限其实有一个共性—权限是针对某一类用户设置的。如果希望对某个指定的用户进行单独的权限控制,就需要用到文件的访问控制列表(ACL)了。通俗来讲,基于普通文件或目录设置ACL其实就是针对指定的用户或用户组设置文件或目录的操作权限。另外,如果针对某个目录设置了ACL,则目录中的文件会继承其ACL;若针对文件设置了ACL,则文件不再继承其所在目录的ACL。

    为了更直观地看到ACL对文件权限控制的强大效果,我们先切换到普通用户,然后尝试进入root管理员的家目录中。在没有针对普通用户对root管理员的家目录设置ACL之前,其执行结果如下所示:

[[email protected] testdir]# su - user1
上一次登录:四 8月  9 15:14:33 CST 2018pts/0 上
[[email protected] ~]$ cd /root
-bash: cd: /root: 权限不够
[[email protected] ~]$ exit
登出
[[email protected] testdir]# 

3.1  setfacl命令

    setfacl命令用于管理文件的ACL规则,格式为“setfacl [参数] 文件名称”。文件的ACL提供的是在所有者、所属组、其他人的读/写/执行权限之外的特殊权限控制,使用setfacl命令可以针对单一用户或用户组、单一文件或目录来进行读/写/执行权限的控制。其中,针对目录文件需要使用-R递归参数;针对普通文件则使用-m参数;如果想要删除某个文件的ACL,则可以使用-b参数。下面来设置用户在/root目录上的权限:

[[email protected] testdir]# setfacl -Rm u:user1:rwx /root
[[email protected] testdir]# su - user1
上一次登录:四 8月  9 21:40:11 CST 2018pts/0 上
[[email protected] ~]$ cd /root    
[[email protected] root]$ ll
总用量 22708
-rw-rwx---+ 1 root root     1702 7月  23 22:30 anaconda-ks.cfg
-rwxrwxr-x+ 1 root root    10486 8月   1 15:03 sys_check.sh
drwxrwxr-t+ 2 root root        6 8月   9 21:36 testdir
-rw-rwxr--+ 1 root root  3118130 8月   6 2012 wget-1.14.tar.gz
[[email protected] root]$ exit
登出
[[email protected] testdir]# 

    怎么去查看文件上有那些ACL呢?常用的ls命令是看不到ACL表信息的,但是却可以看到文件的权限最后一个点(.)变成了加号(+),这就意味着该文件已经设置了ACL了。

[[email protected] ~]# ll -d /root
dr-xrwx---+ 8 root root 4096 8月   9 15:20 /root
[[email protected] ~]# 

linux系统 用户身份与文件权限(三)

3.2  getfacl命令

    getfacl命令用于显示文件上设置的ACL信息,格式为“getfacl 文件名称”。想要设置ACL,用的是setfacl命令;要想查看ACL,则用的是getfacl命令。下面使用getfacl命令显示在root管理员家目录上设置的所有ACL信息。

[[email protected] ~]# getfacl /root
getfacl: Removing leading '/' from absolute path names
# file: root
# owner: root
# group: root
user::r-x
user:user1:rwx
group::r-x
mask::rwx
other::---

[[email protected] ~]# 

详细学习,请见)

 

猜你喜欢