基本权限:读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处理能力(标识)的进程能够施加该选项。
其他参考资料:ls颜色