Linux文件系统权限全面解析

基本权限:读r、写w、执行x

读(read)权限就是查看文件的内容,不管你是不是可执行程序,读权限的含义就是能够查看文件中的每一个字符;

写(write)权限就是修改文件中的内容(对于目录来说就还多了一个新建和删除文件的含义);

执行(Execute)权限就是允许该程序执行,执行不同于读,具有读权限表示你能看这个文件中的内容,具有执行权限才表示能够执行这个文件中的程序逻辑,这点对于windows用户可能需要接受一下这个概念。另外,还有一点需要说明的是,对于目录来说,执行权限就是访问该目录的权限,如果没有执行权限只有读权限,则无法切换到该目录(这里仅仅是不能切换到该目录的意思,也就是不能列举该目录下的文件,如果你知道该目录下的某个文件的名字,依然可以根据完整路径访问该文件的,不过也仅仅是读,不会具有写或者执行的权限)。

用户的权限

Linux是一个真正意义上的多用户系统,他可以为每个用户详细的指定不同的文件权限,这个功能可以最大限度地保护文件的安全。Linux的用户概念不仅仅是为每个使用计算机的人创建用户,很多程序都会有单独的用户。如果你查看linux的/etc/passwd文件,你就会发现linux系统中有太多的用户,很多程序都有自己的用户,尤其是提供网络服务的程序。对于这些程序,如果以他们自己的用户启动,它能访问到的文件就完全取决于你有没有为该用户指定访问权限。因此,很多独立用户的程序默认是不能访问你的私人文件的,这点就比Windows下安全多了。

Linux文件系统的权限一般分为文件所有者权限,文件所有者所在组的权限、所有用户的权限三类。Linux文件系统中每个文件都有一个所有者用户(用户名为一个字符串,如果重装了系统只要用户名一样还会有一样的权限)。

查看权限:ls -l

ls命令是列出目录下文件列表,而是用参数-l则可以显示更详细的信息,这里就包括文件权限,每个文件列出的第一列信息就是文件权限

在列出的权限中如果是对应的字母则表示具有该权限,如果是短横线“-”则表示没有该权限。

第一个字符是d或者-,如果显示d则表示这个文件是一个目录,否则就是文件;

后面是三组三个字符紧挨着,对于每一组的三个字符分别表示rwx即读写执行三个权限,三组分别代表当前用户、当前用户组、所有用户的权限,可以为三组赋予不同的权限。

修改权限:chmod chown

chmod是专门用户修改文件权限的命令。

它有两种用法:

一种是直接用+x、-x的的方式为所有用户添加或者删除某个权限;

chmod +x filename     # 为文件添加x权限
chmod -x filename

另一种是直接使用三个阿拉伯数字表示为每个用户类型赋予的权限。每个数字对应的一个三位的二进制数的十进制取值,下面表格是每个数字对应的权限。数字只有可能具有如下的几个取值,如果没有读权限则不可能具有写或执行权限。

十进制数 对应的二进制数 含义
7 111 读、写、执行权限
6 110 读、写权限
5 101 读、执行权限
4 100 只读权限
0 000 没有任何权限

chown用来修改文件所有者。

chown username.groupname filename

迭代修改-R

不管是chmod还是chown都是用-R表示迭代修改整个目录及其子目录。这里是用的大写R,而不像mv、cp等命令使用小写R。

扩展权限ACL

这是对用户、用户组机制权限的不足添加的功能,它可以详细的为每个用户分配不同的权限,详见Access Control List

其他高级权限setuid

除了上述权限之外,还有一些不太常用的权限,但当你有该需求时还是很好用的。它们就是SUID/GUID以及sticky bit。他们其实是之前说的9位权限前面的3位二进制位,由于一般不会具备该权限,所以ls -l默认不显示。

SUID和GUID一般就是针对可执行程序的。SUID表示该程序在执行的时候以文件所有者的权限执行,GUID表示该程序所有者所在用户组的权限执行。

sticky bit的作用就是在其他权限允许的情况下,让每个用户只允许删除自己所拥有的文件。最典型的例子就是/tmp目录。需要注意的是,如果为某个目录设置了sticky bit权限,其目录下的所有文件和目录均具备该权限,所以不需要为他们单独设置权限。

添加SUID可以使用chmod u+s或者前面加4

删除SUID使用chmod u-s,强制修改为0xxx好像没用

添加GUID可以使用chmod g+s或者前面加2

删除GUID使用chmod g-s,强制修改为0xxx好像没用

添加sticky bit可以使用+t或者在最前面添加1

删除sticky bit使用-t,强制修改为0xxx好像没用

chmod +t filename
chmod 1755 filename   # 同时添加多个权限可以按照二进制方式修改其值

ls -l中是一个第一个x的位置用s或者S表示SUID,第二个x的位置用s或者S表示GUID,最后一位x的位置用t或者T表示sticky bit。小写和大写的区别就是,小写表示该位置具有x权限,大写就是表示不具备x权限(这仅仅针对所在的位置的x,其他位置有没有x不管),例如:

drwxrwxrwt    # drwxrwxrwx + t
drwxrwxrwT    # drwxrwxrw- + t

查找及修改权限

查找所有设置了SUID的文件

find /path/to/file -perm -04000 -type f -ls
或者
ls -l | grep '^...s'     # 查找suid文件
ls -l | grep '^...s..s'  # 查找suid和guid

通过find可以更个性化的修改文件的权限。比如为所有目录修改权限为755,为所有文件修改为644如下:

find /path/to/file -type d -exec chmod 755 {} \;
find /path/to/file -type f -exec chmod 644 {} \;

SELinux

上述权限都是说的本地权限,如果要通过网络访问,在装有SELinux的系统上(RHE或者fedora等系统)还需要设置SELinux的权限

查看一个文件的SELinux权限

ls -Z filename

临时设置权限(使用restorecon命令后失效,并且不能为新文件自动设置权限)

sudo chcon -t xxx /path/to/file -R

chcon命令是修改对象(文件)的安全上下文,比如:用户、角色、类型、安全级别。也就是将每个文件的安全环境变更至指定环境。使用–reference选项时,把指定文件的安全环境设置为与参考文件相同。chcon命令位于/usr/bin/chcon。

目录永久权限

sudo semanage fcontext -a -t xxx "/path/to/file(/.*)?"
sudo restorecon -R -v /path/to/file

semanage fcontext命令是把权限写到/etc/selinux/targeted/contexts/files/file_contexts.local文件中

restorecon是为了应用该权限到目录,同时清空chcon设置的权限。此时,该目录下所有的文件以及新建的文件就都设置了权限。命令中的-R就是为了根据semanage fcontext更新没有设置权限的所有文件。

删除权限

sudo semanage fcontext -d /path/to/file

隐藏权限

查看隐藏权限

lsattr filename

参数或选项描述:
-R:递归处理,将指定目录下的所有文件及子目录一并处理。
-V:显示详细过程有版本编号。
-v:设定文件或目录版本(version)。

+ :在原有参数设定基础上,追加参数。
– :在原有参数设定基础上,移除参数。
= :更新为指定参数设定。

chattr -R +i filename

A:文件或目录的 atime (access time)不可被修改(modified), 可以有效预防例如手提电脑磁盘I/O错误的发生。
S:硬盘I/O同步选项,功能类似sync。
a:即append,设定该参数后,只能向文件中添加数据,而不能删除,多用于服务器日志文 件安全,只有root才能设定这个属性。
c:即compresse,设定文件是否经压缩后再存储。读取时需要经过自动解压操作。
d:即no dump,设定文件不能成为dump程序的备份目标。
i:设定文件不能被删除、改名、设定链接关系,同时不能写入或新增内容。i参数对于文件 系统的安全设置有很大帮助。
j:即journal,设定此参数使得当通过mount参数:data=ordered 或者 data=writeback 挂载的文件系统,文件在写入时会先被记录(在journal中)。如果filesystem被设定参数为 data=journal,则该参数自动失效。
s:保密性地删除文件或目录,即硬盘空间被全部收回。
u:与s相反,当设定为u时,数据内容其实还存在磁盘中,可以用于undeletion.

各参数选项中常用到的是a和i。a选项强制只可添加不可删除,多用于日志系统的安全设定。而i是更为严格的安全设定,只有superuser (root) 或具有CAP_LINUX_IMMUTABLE处理能力(标识)的进程能够施加该选项。

Linux测试某个用户对某个文件夹的权限

其他参考资料:ls颜色

Add a Comment

电子邮件地址不会被公开。 必填项已用*标注

20 − 3 =