Linux以其完备、健壮的文件体系著称,通过学习本文将对文件安全有一个大体的认识
目录
标准文件许可
“许可”这个词翻译的不好,我要说的是“permission”,明白人都懂
在讲解前,我希望大家能明白一个基本概念:在Linux中,维护文件安全靠两样,一是ownership,而是permission,ownership(所有权)表示拥有该文件,继而可以对该文件进行permission的(授权)的转移
文件所有权(ownership)
用户所有权和用户组所有权
前面讲到,用户和用户组和基本信息可以在/etc/passwd
和/etc/group
中进行配置
Linux的每个文件,都有两个“所有权”,一是用户所有权,二是用户组所有权,可以通过ls -lh
命令查看
在Mac上体现的不好……上面就拿DOS-tools这个文件来讲,它的user owner是macbookpro,group owner是stuff
更改用户组所有权
通过chgrp
命令更改文件的用户组所有权
chgrp 新组群 文件名
更改用户所有权
通过chown
命令更改文件的用户所有权
chown 新用户 文件名
也可以通过chown
命令直接同时更改用户组和用户所有权
chown 新用户组:新用户 文件名
文件类型列表
我们知道ls -l
是列出文件的长列表形式之命令(见本文首图)
细心的人看到(有眼睛的人)都能看到每个文件记录行的开头有10个字符
首字母表示文件类型,d=>文件夹,-=>文件,l=>链接,p=>管道
文件许可转让(permission)
1. rwx
2. ls长列表的二重含义
ls -l
长列表开头10字符长度玩意剩下的9个字幕,按照从前往后分别表示用户所有权、用户组所有权、其他人所有权,每三个字母为一组
以我这个普通文件(regular file)为例,如果拥有该文件的用户所有权可以读、写该文件,这时候用户所有权不起作用,否则如果属于文件的用户组,则拥有读的权限,其他人也是一样
3. chmod命令
chmod
和chown
命令不同的是,chmod
修改的是某个文件相应权限组(用户、用户组、其他)的权限,而chown
修改的是某个文件有哪些权限组成员(用户有哪些人、用户组有哪些人)
4. umask命令
umask
决定当新文件创建后默认的文件权限列表
5. mkdir -m
可以使用-m
开关在创建文件时同时设置文件权限
6. cp -p
为了保护(伪装)要修改文件的原始权限设定和时间戳,使用-p
开关
特殊文件权限
Linux的特殊权限有三种,1. sticky bit,2. setuid bit,3. setgid bit
粘滞位(sticky bit)
『粘滞位』这个词不知道翻译的如何,应该没问题吧
可以在目录上设置粘滞位(sticky bit),以防止用户删除它们不作为用户所有者拥有的文件;粘滞位显示在与其他人的x许可相同的位置;粘性位由t(表示x也存在)或T(当其他人没有x时)表示
通俗的说,sticky bit主要用在全局可写的文件夹上——如果有别的用户移动、创建文件到该文件夹,只有该被打粘滞位的文件夹的所有者或者root用户有权删除这个新文件
这里我只有两个用户(macbookpro、root),就不演示了
setuid和setgid
和sticky bit一样,setuid和setgid都是特殊文件权限
基础操作越用的不多,这里先略(以后有机会补上
访问控制列表(access control list)
这个东西对于普通用户肯定用不上,是更高级的文件权限控制手段
acl文件(/etc/fstab)
access control lists(简称acls),必须用/etc/fstab
文件中列出的选项进行挂载(mount)
哎呀这个也没有!算了不讲反正大家都懂 ;-)
讲真,这个其实还有点重要——以后单独列出一章讲解(此处略
文件链接
在Linux中,文件链接分为硬连接(hard link)和符号链接(symbol link,也叫软连接)两种
学习文件链接,首先要知道一个重要的基础概念:索引节点(inode)
(支持开源,感恩开源……)
索引节点(inode)
看名字,索引“节点”应该是一种类似结点的数据结构(data structure)——没错,而且每当在文件系统创建新的文件,都会把该文件的metadata(元数据,我觉得理解成“额外数据”也挺好)存储在这里,这些额外的数据比如文件的访问属性等(注意:不包括文件名或文件的实际内容)
索引节点表(inode table)
索引节点表存储所有的索引节点,当文件系统被创建(mkfs
命令)时被创建,
使用df -i
命令查看有哪些索引节点在被挂载的文件系统中的空闲(free)的
索引节点编号(inode number)
每个索引节点都有一个独一无二的索引节点编号(inode number),使用-i
开关进行查看
重申:文件的inode不存储该文件的文件名(文件名存储在对应的文件夹inode里面);另外inode存储着一个指向文件实际内容的指针
文件目录(directory)
文件目录,俗语叫“文件夹”,它本质上是一个表(table)
文件夹(还是文件夹叫的亲切)是这样一张表:它以映射表(map)的形式存储由文件名和文件对应的inode组成的键值对
让我们看看吧(敲:ls -ali
)
总之,inode和指针有着千丝万缕的联系(可以类比学习、记忆)
硬链接(hard link)
创建一个硬链接(hard link),不用加开关(默认为hard link)
用ln
命令创建的硬链接和被链接的文件有一样的inode,这意味:1. 着它们有着相同的permission和ownership,2. 任何时候二者文件内容相同(因为inode总是有一个指向文件的实际内容的指针)
硬连接创建的文件链接,即使原始文件被删除,硬连接还可以独立存在——文件的inode存储指向改文件的硬链接个数,当改计数归零则自动删除,即从磁盘上抹销该文件
符号链接(symbol link)
创建一个符号链接(symbol link),使用-s
开关
可以看到,符号链接的inode和原文件的inode没有关系,这就是说
如果原始文件存在(hard link数≥1),就不会有毛病
但是如果删除了最后一个hard link,剩下的symbol link——它的文件内容已经随着最后一个硬链接的消失被抹销了,(文件名还在因为其parent directory仍然存在)——你可以继续往『原来』的那个软连接里面写数据,这会自动创建一个新的source.txt文件作为原来的硬链接——“原来”打了双引号,因为ls -li
看到这时“原来”的软连接的inode其实已经改变了(怎么说呢,软连接比较容易叛变?)
再会!