[译] 如何在Linux下创建一个不可变更的文件

Flutter
• 阅读 3735

假如你想对Linux中的一些重要文件做写保护,这样它们就不能被删除或者被篡改成之前的版本或者其他东西,或者在其他情况下,你可能想避免某些配置文件被软件自动修改。使用chownchmod命令修改文件的归属关系或者权限位是处理这种情况的一个解决方法,但这并不完美,因为这样无法避免有root权限的操作。这时chattr就派上用场了。

chattr是一个可以设置或取消文件的标志位的Linux命令,它和标准的文件权限(读、写、执行)是分离的。与此相关的另一个命令是lsattr,它可以显示文件的哪些标志位被设置上了。最初只有EXT文件系统(EXT2/3/4)支持chattrlsattr所管理的标志位,但现在很多其他的原生的Linux文件系统都支持了,比如XFS、Btrfs、ReiserFS等等。

在这个教程中,我会示范如果使用chattr来让Linux中的文件不可变更。

chattrlsattr命令是e2fsprogs包的一部分,它在所有现代Linux发行版都预装了。

下面是chattr的基本语法。

$ chattr [-RVf] [操作符][标志位] 文件...

其中操作符可以是“+”(把选定的标志位添加到标志位列表)、“-”(从标志位列表中移除选定的标志位)、或者“=”(强制使用选定的标志位)。

下面是一些可用的标志位。

  • a: 只能以追加模式打开。
  • A: 不能更新atime(文件访问时间)。
  • c: 当被写入磁盘时被自动压缩。
  • C: 关掉“写时复制”。
  • i: 不可变更。
  • s: 通过自动归零来安全删除。(LCTT 译注:一般情况文件被删后内容不会被修改,改标志位会使得文件被删后原有内容被“0”取代)

“不可变更”标志位

为了让一个文件不可变更,你需要按照如下方法为这个文件添加“不可变更”标志位。例如,对/etc/passwd文件做写保护:

$ sudo chattr +i /etc/passwd

注意设置或取消一个文件的“不可变更”标志位是需要root用户权限的。现在检查该文件“不可变更”标志位是否被添加上了。

$ lsattr /etc/passwd

一旦文件被设置为不可变更,任何用户都将无法修改该文件。即使是root用户也不可以修改、删除、覆盖、移动或者重命名这个文件。如果你想再次修改这个文件,需要先把“不可变更”标志位取消了。

用如下命令取消“不可变更”标志位:

$ sudo chattr -i /etc/passwd

[译] 如何在Linux下创建一个不可变更的文件

如果你想让一个目录(比如/etc)连同它下边的所有内容不可变更,使用“-R”选项:

$ sudo chattr -R +i /etc

“只可追加”标志位

另一个有用的的标志位是“只可追加”,它只允许文件内容被追加的方式修改。你不能覆盖或者删除一个设置了“只可追加”标志位的文件。这个标志位在你想避免日志文件被意外清理掉的情况很有用。

和“不可变更”标志位类似,你可以使用如下命令让文件变成“只可追加”模式:

$ sudo chattr +a /var/log/syslog

注意当你复制一个“不可变更”或者“只可追加”的文件到其他地方后,新文件不会保留这些标志位!

结论

在这个教程中,我展示了如何使用chattrlsattr命令来管理额外的文件标志位,来避免文件被篡改(意外或者其他情况)的方法。注意你不能将chattr作为一个安全措施,因为“不可变更”标志位可以很容易被取消掉。解决这个问题的一个可能的方式是限制chattr命令自身的可用性,或者去掉CAP_LINUX_IMMUTABLE内核权能标志。关于chattr以及可用的标志位的更多细节,请参考它的man手册。


via: http://xmodulo.com/make-file-...

作者:Dan Nanni
译者:goreliu
校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

付费解决 Windows、Linux、Shell、C、C++、AHK、Python、JavaScript、Lua 等领域相关问题,灵活定价,欢迎咨询,微信 ly50247。

点赞
收藏
评论区
推荐文章
Easter79 Easter79
4年前
tar命令的exclude参数
用tar命令可以在Linux底下进行打包操作,如果要排除某些特定的目录或者文件可以用exclude参数,通常比较好用的有以下几个\excludevcs,这个是将版本控制系统的文件予以排除。\excludepath/to/my/name,这个是将某个路径下的文件夹或者文件予以排除,这个参数有两点需要注意一是如果是文件夹,文件夹名称的末尾
九路 九路
2年前
Android中依赖版本统一管理
前言在Android的实际开发中,我们会经常使用到多Module开发,而当我们修改一些版本信息或者SDK升级时,可能涉及多个Module都需要修改。显然逐个修改Module中的build.gradle文件是非常繁杂而且容易出错的一件事情,基于此种情况,我们
ThreadLocal源码解析及实战应用
ThreadLocal是一个关于创建线程局部变量的类。通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。而使用ThreadLocal创建的变量只能被当前线程访问,其他线程则无法访问和修改。ThreadLocal在设计之初就是为解决并发问题而提供一种方案,每个线程维护一份自己的数据,达到线程隔离的效果。
inode节点扩容
本文分享自天翼云开发者社区《》,作者:2m1.inode概述在Linux系统中,每个文件和目录都有一个对应的inode节点,用于存储文件或目录的元数据信息,如:文件大小、创建时间、修改时间、权限等。当文件或目录被创建时,系统会为其分配一个inode节点。然
Stella981 Stella981
4年前
Python打包EXE文件
Python程序打包工具Python是一个脚本语言,被解释器解释执行。它的发布方式:.py文件:对于开源项目或者源码没那么重要的,直接提供源码,需要使用者自行安装Python并且安装依赖的各种库。(Python官方的各种安装包就是这样做的)。.pyc文件:有些公司或个人因为机密或者各种原因,不愿意源码被运行者看到,可以使用pyc文件发布,pyc文件是
Wesley13 Wesley13
4年前
MySQL在INSERT IGNORE未新增记录时避免AUTO_INCREMENT自增
在MySQL5.7中做INSERTIGNORE时发现,即使INSERT未成功执行,表的自增主键却自动加1了,在某些情况下需要避免这种行为.需要修改的变量是 innodb\_autoinc\_lock\_mode,将其设为0后,在INSERT未成功执行时不会自增主键.innodb\_autoinc\_lock\_mode在MySQL各版本
Stella981 Stella981
4年前
Spring cloud 超时及重试配置【ribbon及其它http client】
开启重试在某些情况下是有问题的,比如当压力过大,一个实例停止响应时,路由将流量转到另一个实例,很有可能导致最终所有的实例全被压垮。说到底,断路器的其中一个作用就是防止故障或者压力扩散。用了retry,断路器就只有在该服务的所有实例都无法运作的情况下才能起作用。这种时候,断路器的形式更像是提供一种友好的错误信息,或者假装服务正常运行的假象给使用者。不
Wesley13 Wesley13
4年前
MySQL在Ubuntu远程配置
MySQL远程连接访问在普通Linux下配置:在这个配置文件/etc/mysql/my.cnf修改:bindaddress         127.0.0.1修改为bindaddress         127.0.0.1或者b
Wesley13 Wesley13
4年前
MongoDB学习系列11:MongoDB中的修改器
使用修改器时,"\_id"的值不能改变,而整个文档在替换时是可以改变"\_id"的。$set用来修改一个键的值。$unset用来删除一个键。$inc用来增加已有键的值,或者在键不存在时创建一个键。只能用于整数、长整数、或者双精度浮点数。$push往数组里添加东西,$pop从数组中删除元素。{$pop:{key:1}}从数据末
Stella981 Stella981
4年前
Linux应急响应(一):SSH暴力破解
0x00前言SSH是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议,主要用于给远程登录会话数据进行加密,保证数据传输的安全。SSH口令长度太短或者复杂度不够,如仅包含数字,或仅包含字母等,容易被攻击者破解,一旦被攻击者获取,可用来直接登录系统,控制服务器所有权限。0x01应急场景某天,网站
3A网络 3A网络
3年前
理解 virt、res、shr 之间的关系(linux 系统篇)
理解virt、res、shr之间的关系(linux系统篇)前言想必在linux上写过程序的同学都有分析进程占用多少内存的经历,或者被问到这样的问题——你的程序在运行时占用了多少内存(物理内存)?通常我们可以通过t