防止 Linux 中的 root 随意删除重要文件(lsattr 与 chattr)

防止 Linux 中的 root 随意删除重要文件(lsattr 与 chattr)

  • 引言
  • lsattr 命令
    • 语法
    • 选项
    • 参数
    • 实例
  • chattr 命令
    • 语法
    • 选项
    • 模式
    • 参数
    • 实例

引言

有时我们为了安全需要,尤其是在生产环境中,为了保证运行的项目或日志不被随意修改、移动或删除,通常会进行相关文件或文件夹的安全设置。

换句话说,如果我们使用 root 账户对文件执行修改(vi)、移动(mv)或删除(rm)操作时,还出现 Operation not permittedPermission denied,则很有可能是对该文件或上级目录进行过文件属性设置(通常是 chattr 设置为 ia)。

lsattr 命令

当我们使用 root 账户对文件或文件夹进行相关操作时,如果还提示因权限不足,而无法进行操作时,那么我们应该使用 lsattr 命令来查看当前文件或文件夹的文件属性。

有关 lsattr 命令的详细说明,请见 lsattr(1) - Linux manual page。

语法

lsattr [ -RVadv ] [ files...  ]

选项

[ -RVadv ] 代表可指定 0 个、1 个或多个选项:

  • -R:递归地列出目录及其内容的属性
  • -a:列出目录中的所有文件,包括以 . 开头的文件(隐藏文件)

参数

[ files... ] 代表可指定 0 个、1 个或多个文件名:

  • 0 个文件名:查看当前目录下所有文件的文件属性
  • 1 个文件名:查看指定文件的文件属性
  • 多个文件名:查看多个指定文件的文件属性

实例

1、查看当前目录下非隐藏文件的文件属性:

$ lsattr 

输出示例:

----i----------- ./webapps
-----a---------- ./logs
---------------- ./README

从上面的输出示例中可知:

  • webapps 目录设置了不可变的文件属性,即 webapps 目录不能删除或重命名,不能创建到该目录的链接,也不能将数据写入该目录
  • logs 目录设置了仅追加的文件属性,即 logs 目录只能追加新文件,但不能删除已追加的文件,且如果修改文件内容而且直接追加内容,则还会生成额外的备份文件
  • README 文件没有设置文件属性

2、查看 logs 目录及其子目录中的内容:

$ lsattr -R logs/

输出示例:

---------------- logs/log_file1
---------------- logs/log_file2
---------------- logs/log_dir1

logs/log_dir1:
---------------- logs/log_dir1/log_file3

如果仅从上面的输出示例来看,logs 目录中的文件都没有设置文件属性,貌似是可以随意操作的,但实际上真是这样吗?

我们来对 log_file1 文件执行删除操作:

$ sudo rm -rf logs/log_file1

输出示例:

rm: cannot remove ‘logs/log_file1’: Operation not permitted

上面的删除命令,我们特意使用了 root 权限,但输出结果却还是操作不允许。这是因为 log_file1 文件的上级目录 logs 设置了仅追加的文件属性,这会导致虽然其子文件没有设置文件属性,但也会受到父级目录的文件属性所影响。

但是,如果我们删除的是 logs/log_dir1/log_file3 文件,则可以正常删除。

注意:虽然父目录的文件属性会影响子文件,但子文件所受的影响和父目录所设置的文件属性效果并非完全一致的。

chattr 命令

chattr 命令可以用来更改 Linux 文件系统上的文件属性。

有关 chattr 命令的详细说明,请见 chattr(1) - Linux manual page。

语法

chattr [ -RVf ] [ -v version ] [ mode ] files...

选项

[ -RVadv ] 代表可指定 0 个、1 个或多个选项:

  • -R:递归地列出目录及其内容的属性

模式

[ mode ] 代表模式,格式是 +-=[aAcCdDeijsStTu]

  • 操作符:
    • +:将选择的属性添加到文件的现有属性中
    • -:将选择的属性从文件的现有属性中删除
    • =:将选择的属性设置为文件的唯一属性
  • 文件属性:
    • a:仅追加(append only)。文件只能以追加模式写入。只有超级用户或具有 CAP_LINUX_IMMUTABLE 功能的进程才能设置或清除此属性
    • i:不可变(immutable)。文件不能修改,即不能删除或重命名该文件,不能创建到该文件的链接,也不能将数据写入该文件。只有超级用户或具有 CAP_LINUX_IMMUTABLE 功能的进程才能设置或清除此属性

注意:并非所有文件系统都支持或使用所有标志,具体可通过文件系统的手册进行查阅。

参数

files... 代表可指定1 个或多个文件名:

  • 1 个文件名:更改指定文件的文件属性
  • 多个文件名:更改多个指定文件的文件属性

实例

1、将 logs 目录及其子目录中所有文件添加仅追加的文件属性:

$ sudo chattr -R +a logs/

2、将 logs 目录及其子目录中所有文件的文件属性更改为不可变,并删除其它的文件属性:

$ sudo chattr -R =i logs/

3、将 logs 目录及其子目录中所有文件删除不可变的文件属性:

$ sudo chattr -R -i logs/

你可能感兴趣的:(Linux)