一、基本权限
在 Linux 下,一般将文件的访问身份分为 3 个类别,分别是 owner(拥有者)、group(所属组)、others(其他身份),且对 3 种身份分别设置 read(可读)、write(可写)、execute(可执行) 等基本权限。
[root@syztoo ~]# ls -l /etc/profile
-rw-r--r-- 1 root root 2090 Apr 15 17:40 /etc/profile
第1字段:文件属性字段(文件类型,文件拥有者的权限,文件所属组的权限,其他身份用户的权限);
第2字段:文件链接数,如果是一个目录,该字段表示该目录下的子目录的个数;
第3字段:文件拥有者;
第4字段:文件所属组;
第5字段:文件所占用的空间;
第6字段:文件最近被访问(被访问意味着被修改)的时间;
第7字段:文件名;
读、写、执行权限对目录和文件的影响:(仅对普通用户生效,对 root 无效)
对于目录来说
单独拥有读权限,可以 ls 查看目录内容,但不能 cd 进目录中去;
单独拥有写权限,既不能 ls 查看目录内容,也不能 cd 进目录中去,更不能在目录下创建目录或文件;
单独拥有执行权限 ,可以 cd 进目录中去,但是不能 ls 查看目录内容,也不能在目录下创建目录或文件;
同时拥有读和写的权限,可以 ls 查看目录内容,但不能 cd 进目录中去,也不能在目录下创建目录或文件;
同时拥有写和执行的权限,可以 cd 进目录中去,可以在目录下创建目录或文件,但不能 ls 查看目录内容;
同时拥有读和执行的权限,可以 ls 查看目录内容,可以 cd 进目录中去,但不能在目录下创建目录或文件;
对于文件来说
单独拥有读权限,仅可以查看文件内容;
单独拥有写权限,允许在不查看文件内容的情况下修改文件内容,比如 echo "abc" > file 这种修改文件内容的方式是可以的,而使用 vim 或者 sed 工具是 不允许的;
单独拥有执行权限,如果文件是二进制文件可以执行该文件;
同时拥有读和执行的权限,可以查看文件内容和执行该文件,但是不可以修改文件内容;
同时拥有写和执行的权限,不能查看文件内容,但是可以修改文件内容和执行该文件;
同时拥有读和写的权限,可以查看和修改文件内容,但无执行权限;
二、SUID,SGID,sticky
1、SUID
SUID,它出现在文件拥有者权限的执行位上面,当一个具有执行权限的文件设置 SUID 权限后,用户执行这个文件时将以文件所有者的身份执行。
比如 passwd 命令:
[root@syztoo home]# which passwd | xargs ls -l
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd
passwd 命令具有 SUID 权限,所有者为 root(Linux 中的命令默认所有者都是 root),也就是说当普通用户使用 passwd 更改自己密码的时候,实际在以 passwd 命令所有者 root 的身份在执行。passwd 执行时,是将密码写入 /etc/shadow 文件里面:
[root@syztoo home]# ls -l /etc/shadow
---------- 1 root root 860 May 7 15:59 /etc/shadow
/etc/shadow 文件对任何人都不具备读写及执行的权限,但 linux 中 root 是一个 bug 一样的存在,所以能够写入成功,命令执行完成后该身份也随之消失。
SUID设置的条件:
- 只有可执行的二进制程序才可以设置SUID;
- 所有者必须对欲设置SUID的文件具备 可执行(x) 权限;
- 命令执行过程中,其它用户获取所有者的身份,完成该程序执行后随即消失;
设置方式:
chmod u+s file
chmod u-s file
2、SGID
SGID,它出现在文件所属组权限的执行位上面,它对普通二进制文件和目录都有效。当它作用于普通文件时,和SUID类似,在执行该文件时,用户将获得该文件所属组的权限。当SGID作用于目录时,如果用户对该目录具有写和执行权限时,那么该用户就可以在该目录下创建文件,而建立的文件的所属组为该目录所属的组(如果该目录无SGID权限,创建的文件的所属组为当前登录用户所属的组)。
设置方式:
chmod g+s file
chmod g-s file
3、Sticky
Sticky,它出现在其他用户权限的执行位上,它只能用来修饰一个目录。当某一个目录拥有 Sticky 权限时,则任何一个能够在这个目录下建立文件的用户,该用户在这个目录下所建立的文件,只有该用户自己和 root 可以删除,其他用户均不可以删除。
比如 /tmp 目录:
[root@syztoo ~]# ls -ld /tmp
drwxrwxrwt. 9 root root 4096 May 7 03:07 /tmp
设置方式:
chmod o+t file
chmod o-t file
另外,SUID,SGID,sticky 权限的设置也可以用数字表示:
4表示SUID
2表示SGID
1表示Sticky
比如:
[root@syztoo ~]# touch 1.sh 2.sh 3.sh
[root@syztoo ~]# mkdir test1 test2
[root@syztoo ~]# ls -ld 1.sh 2.sh 3.sh test1 test2
-rw-rw-r-- 1 root root 0 May 7 17:12 1.sh
-rw-rw-r-- 1 root root 0 May 7 17:12 2.sh
-rw-rw-r-- 1 root root 0 May 7 17:13 3.sh
drwxrwxr-x 2 root root 4096 May 7 17:12 test1
drwxrwxr-x 2 root root 4096 May 7 17:13 test2
[root@syztoo ~]# chmod 4764 1.sh
[root@syztoo ~]# chmod 2674 2.sh
[root@syztoo ~]# chmod 6774 3.sh
[root@syztoo ~]# chmod 2775 test1
[root@syztoo ~]# chmod 1777 test2
[root@syztoo ~]# ls -ld 1.sh 2.sh 3.sh test1 test2
-rwsrw-r-- 1 root root 0 May 7 17:12 1.sh
-rw-rwsr-- 1 root root 0 May 7 17:12 2.sh
-rwsrwsr-- 1 root root 0 May 7 17:13 3.sh
drwxrwsr-x 2 root root 4096 May 7 17:12 test1
drwxrwxrwt 2 root root 4096 May 7 17:13 test2
三、默认权限
当用户创建目录和文件时,总有一个默认权限,umask 则是用来该默认权限的值;
[root@syztoo ~]# umask
0002
umask 设置权限的方式是采用 "补码" 的形式,比如 umask 值为 0002,第一个 0 一般不做考虑,那么创建文件时,文件的权限为 777-002=775。但出于安全考虑,linux 系统默认创建文件时,文件不能具有执行权限,于是文件的起始权限为666,目录的起始权限为777。
所以当 umask 值为 0002 时,创建文件时文件的默认权限为 664,创建目录时目录的默认权限为 775。
[root@syztoo ~]# umask
0002
[root@syztoo ~]# touch 1
[root@syztoo ~]# mkdir 2
[root@syztoo ~]# ls -ld 1 2
-rw-rw-r-- 1 root root 0 May 7 17:53 1
drwxrwxr-x 2 root root 4096 May 7 17:53 2
更改umask值,直接指定(只在当前 shell 下生效):
[root@syztoo ~]# umask 022
四、隐藏权限
Linux 中还有些文件,虽然我们对这个文件有权限,却没有办法编辑和删除,即使 root 用户也不能;
[root@syztoo ~]# ls -l 1.sh
-rwxrwxr-x 1 root root 0 May 7 17:53 1.sh
[root@syztoo ~]# rm -rf 1.sh
rm: cannot remove ‘1.sh’: Operation not permitted
Linux 下的文件除了基本权限 r、w、x 和 特殊权限 SUID、SGID、Sticky 外,还有些隐藏权限,上面的 1.sh 文件,之所以 root 用户也不能删除,是由于该文件具有隐藏权限 i ,隐藏权限可用 lsattr 命令查看:
[root@syztoo ~]# lsattr 1.sh
----i--------e-- 1.sh
"e" 属性表示文件正在使用扩展数据块映射磁盘上的块,默认就有,不用管它;
所有的隐藏权限:
A:即Atime,告诉系统不要修改对这个文件的最后访问时间。
S:即Sync,一旦应用程序对这个文件执行了写操作,使系统立刻把修改的结果写到磁盘。
a:即Append Only,系统只允许在这个文件之后追加数据,不允许任何进程覆盖或截断这个文件。如果目录具有这个属性,系统将只允许在这个目录下建立和修改文件,而不允许删除任何文件。
b:不更新文件或目录的最后存取时间。
c:将文件或目录压缩后存放。
d:当dump程序执行时,该文件或目录不会被dump备份。
D:检查压缩文件中的错误。
i:即Immutable,系统不允许对这个文件进行任何的修改。如果目录具有这个属性,那么任何的进程只能修改目录之下的文件,不允许建立和删除文件。
s:彻底删除文件,不可恢复,因为是从磁盘上删除,然后用0填充文件所在区域。
u:当一个应用程序请求删除这个文件,系统会保留其数据块以便以后能够恢复删除这个文件,用来防止意外删除文件或目录。
t:文件系统支持尾部合并(tail-merging)。
X:可以直接访问压缩文件的内容。
常用的有 a 和 i;
a,只能在文件中追加文件内容;
i,不允许对文件做任何修改;
设置方式:
chattr +/- 隐藏权限