如何在Linux下创建一个不可变更的文件
假如你想对Linux中的一些重要文件做写保护，这样它们就不能被删除或者被篡改成之前的版本或者其他东西，或者在其他情况下，你可能想避免某些配置文件被软件自动修改。使用chown和chmod命令修改文件的归属关系或者权限位是处理这种情况的一个解决方法，但这并不完美，因为这样无法避免有root权限的操作。这时chattr就派上用场了。 chattr是一个可以设置或取消文件的标志位的Linux命令，它和标准的文件权限（读、写、执行）是分离的。与此相关的另一个命令是lsattr，它可以显示文件的哪些标志位被设置上了。最初只有EXT文件系统（EXT2/3/4）
chattr lsattr
假如你想对Linux中的一些重要文件做写保护，这样它们就不能被删除或者被篡改成之前的版本或者其他东西，或者在其他情况下，你可能想避免某些配置文件被软件自动修改。使用chown和chmod命令修改文件的归属关系或者权限位是处理这种情况的一个解决方法，但这并不完美，因为这样无法避免有root权限的操作。这时chattr就派上用场了。 chattr是一个可以设置或取消文件的标志位的Linux命令，它和标准的文件权限（读、写、执行）是分离的。与此相关的另一个命令是lsattr，它可以显示文件的哪些标志位被设置上了。最初只有EXT文件系统（EXT2/3/4）
假如你想对Linux中的一些重要文件做写保护，这样它们就不能被删除或者被篡改成之前的版本或者其他东西，或者在其他情况下，你可能想避免某些配置文件被软件自动修改。使用`chown`和`chmod`命令修改文件的归属关系或者权限位是处理这种情况的一个解决方法，但这并不完美，因为这样无法避免有root权限的操作。这时`chattr`就派上用场了。


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


![](/data/attachment/album/201505/19/112825lzsmhb3555slgbo5.jpg)


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


`chattr`和`lsattr`命令是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

```

![](/data/attachment/album/201505/19/112829ldh7d0c3cf7fqfdq.jpg)


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



```
$ sudo chattr -R +i /etc

```

### “只可追加”标志位


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


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



```
$ sudo chattr +a /var/log/syslog

```

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


### 结论


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




---


via: <http://xmodulo.com/make-file-immutable-linux.html>


作者：[Dan Nanni](http://xmodulo.com/author/nanni) 译者：[goreliu](https://github.com/goreliu) 校对：[wxy](https://github.com/wxy)


本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](http://linux.cn/) 荣誉推出

