欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-15 22:20:02
...

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] ~]# 

详细学习,请见)