二、保护文件系统
2.1 保护文件系统是LIDS的重要功能之一。这个功能是在内核的VFS(虚拟文件系统)层实现的,我们可以保护任何种类的文件系统,如EXT2,FAT。
在LIDS,保护的文件按种类分为以下几种:
只读的文件或目录。只读文件意味着它们不被允许改写,如,在目录/usr/bin,/sbin。这些类型的文件大多数都是二进制系统程序或是系统配置文件,除了在升级系统的时候,我们不需要改变它们。
只可增加文件或目录。这些文件是那些只可以增加大小的文件。大多数是系统的日值文件,如在/var/log里的只可增加文件。
额外的文件或目录,这些文件没有被保护。一般来说,你想要保护目录下的所有文件,但是,还需要有一些特殊的文件不要被保护。所以我们可以定义这些文件作为额外的其他的只读文件。
保护挂载或卸载文件系统。当你在启动的时候挂载文件系统的时候,你可以禁止所有人,甚至是root,去卸载文件系统。你也可以禁止任何人在当前文件系统下挂载文件系统来覆盖它。
2.2 LIDS如何在内核保护文件
在这部分,我们会看到一些内核的代码来理解LIDS是如何保护文件的。
Linux文件系统数据结构程序
首先,我们必须了解Linux的虚拟文件系统。
在Linux里的每一个文件,不管是什么样子的,都有一个结点inode数,文件系统提供了以下数据结构。 在/usr/src/Linux/include/Linux/fs.h
struct inode { struct list_head i_hash; struct list_head i_list; struct list_head i_dentry;
unsigned long i_ino; ----> inode number. unsigned int i_count; kdev_t i_dev; ----> device number. umode_t i_mode; nlink_t i_nlink; uid_t i_uid; ...... } 注意:用来鉴定一个结点inode。这个意思是你可以用一对来得到一个系统里独一无二的inode。
在/ur/src/Linux/cinclude/Linux/dcache.h里 struct dentry { int d_count; unsigned int d_flags; struct inode * d_inode; /* Where the name belongs to - NULL is negative */ struct dentry * d_parent; /* parent directory */ struct dentry * d_mounts; /* mount information */ struct dentry * d_covers; struct list_head d_hash; /* lookup hash list */ struct list_head d_lru; /* d_count = 0 LRU list */ struct list_head d_child; /* child of parent list */ struct list_head d_subdirs; /* our ...... } dentry是一个目录文件的入口。通过这个入口,我们可以很容易的在文件的父目录下移动。
例如,如果你一文件的inode是(struct inode*)file_inode,如果你可以用file_inode->d_entry来得到它的目录入口并且用file_inode->d_entry->d_parent来得到父目录的目录入口。 |