文件与目录的默认权限和隐藏权限
在之前我们已经提到了,我们可以通过chown修改属性,chmod修改权限。在这个地方就不多说了,不了解的话可以去前面看看。下面我们主要谈一谈“新建一个文件或者目录时默认的权限是什么”。
文件默认权限:umask
umask是指定“目前用户在新建文件或目录时候的权限默认值”,我们可以通过以下的方式得知或者设置umask:
[root@VM_174_157_centos ~]# umask
0022
[root@VM_174_157_centos ~]# umask -S
u=rwx,g=rx,o=rx
以上两种方式都可以,但是不是应该是3个数吗,怎么是4个?第一个0是我们之后要谈到的隐藏权限。默认的权限属性是这样的:
- 若创建“文件”,则默认是没有执行(x)权限,只有r、w两个,最大为666,即-rw-rw-rw
- 若创建“目录”,则默认的是777,即drwxrwxrwx
要注意的是,umask的分数值的是“该默认值需要减掉的权限”,以上面的例子来说,umask为022,所以user没被拿走任何的权限,但是group、others被拿走了2的权限(也就是w),所以当你:
- 创建文件:-rw-r–r–
- 创建目录:drwxr-xr-x
当然,用umask可以更改默认权限,比如:
[root@VM_174_157_centos tmp]# umask 002
[root@VM_174_157_centos tmp]# touch test1
[root@VM_174_157_centos tmp]# mkdir test2
[root@VM_174_157_centos tmp]# ll
total 2
-rw-rw-r-- 1 root root 0 Feb 25 11:33 test1
drwxrwxr-x 2 root root 4096 Feb 25 11:33 test2
文件隐藏属性chattr,lsattr
文件除了基本的9个权限之外,还有隐藏权限,他们对系统安全有很大的帮助。不过要注意的是,chattr命令只能在Ext2/Ext3的文件系统上面生效。下面我们就来看看这些隐藏属性。
- chattr(设置文件隐藏属性)
[root@VM_174_157_centos ~]# chattr [+-=][ASacdistu] 文件或目录名称
选项与参数:
+:增加某一个特殊参数,其他的保存不变
-:移除某一个特殊参数,其他的保存不变
=:仅有后面接的参数
A:当设定后,若有访问此文件(或目录)时,他的访问时间atime将不会被修改,可避免I/O较慢的机器过度访问硬盘
S:一般文件是异步写入磁盘的(参见Linux的sync命令),如果加上S这个属性,将同步地写入硬盘
a:当设置a之后,这个文件只能增加数据,而不能删除和修改数据,只有root才能删除
c:这个属性设置之后,将会自动将此文件压缩,在读取的时候自动解压缩,存的时候自动压缩,对大文件还蛮有用
d:当dump程序被执行,设置d将可以使得该文件或(目录)不会被dump备份
i:这个i很厉害!它可以让一个文件“不能被删除、改名,设置连接也无法写入和添加数据。对系统安全有很大的帮助,也只有root能设置
s:如果文件被删除,它将会被完全从这个硬盘空间中删除
u:与s相反,如果被删除了,其实数据还在磁盘内,可以使用来找回该文件
注意:属性设置唱见的是a和i,而且很多设置值必须要身为root才能设置
范例1:给一个文件增加 i 的参数
[root@VM_174_157_centos tmp]# chattr +i test.txt
[root@VM_174_157_centos tmp]# rm -f test.txt
rm: cannot remove 'test.txt': Operation not permitted
#看到了吗?连root都不能删除这个文件,赶紧解除吧
[root@VM_174_157_centos tmp]# chattr -i test.txt
- lsattr(显示文件隐藏属性)
[root@VM_174_157_centos ~]# lsattr [-adR] 文件或目录
选项或参数:
-a:将隐藏文件的属性也显示出来
-d:如果接的是目录,进列出目录本身的属性而非目录内的文件名
-R:连同子目录的数据也一并列出来
[root@VM_174_157_centos tmp]# chattr +aij test.txt
[root@VM_174_157_centos tmp]# lsattr test.txt
----ia---j------ test.txt
文件特殊权限:SUID,SGID,SBIT
我们一直提到文件的权限就是r、w、x三个读、写、执行的权限,但是其实我们还可以发现另外一些奇怪的现象:
[root@VM_174_157_centos ~]# ls -ld /tmp; ls -l /usr/bin/passwd
drwxrwxrwt. 10 root root 4096 Feb 25 14:33 /tmp
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd
这个s和t的权限又是哪里来的呢?这就是我们接下来要提到的部分:
- SetUID
- 当s这个标志出现在文件所有者的x权限上时,比如/usr/bin/passwd这个文件的权限状态为“-rwsr-xr-x”,此时就被称为Set UID,简称SUID的特殊权限
- SUID权限仅对二进制程序(binary program)有效
- 执行者对于该程序需要具有 x 的可执行权限
- 本权限仅在执行该程序的过程中(run-time)有效
- 执行者将具有该程序所有者(owner)的权限
举个例子:在Linux中,所有账号密码都记录在/etc/shadow 这个文件里面,这个文件的权限是“-r——– 1 root root”,意思是这个档案仅有root可读且强制写入。那么如果我使用一个普通账户执行 passwd 修改密码却也是可以成功的!
可是明明,/etc/shadow就不能被普通用户存取,为什么普通用户还能修改呢?这就是SUID功能了,我们可以知道:
- 1.普通用户对/usr/bin/passwd有x权限,说明可以执行passwd命令
- 2.passwd的拥有者是root
- 3.普通用户执行passwd的过程中,会暂时获得root的权限
- 4./etc/shadow就可以被普通用户所执行的passwd所修改
但是当我们想用cat去查看/etc/shadow的时候就不行了,因为cat不具备SUID权限!另外SUID仅可用在二进制程序上,不能够用在shell script上。这是因为shell script只是将很多的二进制文件调进来执行而已。
- SetGID
当 s 标志在文件所有者的 x 位置时为SUID,那当 s 在用户组的 x 位置时为SetGID(SGID),我们可以看到形如这样:
[root@VM_174_157_centos ~]ls -l /usr/bin/locate
-rwx--s--x. 1 root slocate 40496 Jun 10 2014 /usr/bin/locate
与SUID不同的是,SGID可以针对文件或目录来设置,当对文件来说:
- SGID对二进制程序有用
- 程序执行者对该程序来说,需要具备 x 的权限
- 执行者在执行的过程中将会获得该程序用户组的支持
当对目录来说:
- 用户若对此目录有r、x权限,可进入该目录
- 用户在此目录下的有效用户组(effective group)将会变成该目录的用户组
- 若用户在此目录下具有 w 的权限,则创建的新文件的用户组与次目录的用户组相同
总的来说,SGID就是用来管理用户组内的权限的。
- Sticky Bit
这个Sticky Bit(SBIT)只对目录有用,对于文件无效。它的作用是:
- 当用户对于此目录具有w,x权限时,即具有写入的权限时
- 当用户在该目录下创建文件或目录时,仅有自己与root才有权利删除该文件
比如,当甲这个用户于A目录是具有group或others的身份,并且拥有w权限,这表示“可以对该目录内任何人建立的目录或文件均可进行删除/更名/移动等操作”。但是,如果A目录加上了SBIT的权限时,则他只能对自己建立的文件或目录进行那些操作,而不能动别人的东西。
- SUID/SGID/SBIT权限设置
权限设置和前面的类似,SUID为4,SGID为2,SBIT为1,具体的情况参照下面范例:
#注意:这个范例只是练习所以对同一个文件操作,但是一定要记住SUID是对文件使用,SBIT是对目录使用
[root@VM_174_157_centos tmp]# cd /tmp
[root@VM_174_157_centos tmp]# touch test <==创建测试用的空文件
[root@VM_174_157_centos tmp]# chmod 4755 test; ls -l test <==加入具有SUID的权限
-rwsr-xr-x 1 root root 0 Feb 25 16:59 test
[root@VM_174_157_centos tmp]# chmod 6755 test; ls -l test <==加入具有SUID/SGID的权限
-rwsr-sr-x 1 root root 0 Feb 25 16:59 test
[root@VM_174_157_centos tmp]# chmod 1755 test; ls -l test <==加入SBIT的功能
-rwxr-xr-t 1 root root 0 Feb 25 16:59 test
[root@VM_174_157_centos tmp]# chmod 7666 test; ls -l test <==具有空的SUID/SGID权限
-rwSrwSrwT 1 root root 0 Feb 25 16:59 test
#在最后一个例子中,出现了大写的S和T,因为s和t都是代替x的,但是我们执行的是7666
#也就是说user,group,others都没有x这个可执行的权限,所以S,T代表空的。
#符号也可以进行操作,如下,设置权限为-rws--x--x
[root@VM_174_157_centos tmp]# chmod u=rwxs,go=x test;ls -l test
-rws--x--x 1 root root 0 Feb 25 16:59 test
#在上述文件中加上SGID与SBIT
[root@VM_174_157_centos tmp]# chmod g+s,o+t test; ls -l test
-rws--s--t 1 root root 0 Feb 25 16:59 test
查看文件类型:file
如果你想知道某个文件的基本数据,是ASCII或data,或者binary,有没有用到动态函数库(share library)等等,就可以用file这个命令:
[root@VM_174_157_centos tmp]# file ~/.bashrc
/root/.bashrc: ASCII text <==这是ASCII纯文本
[root@VM_174_157_centos tmp]# file /usr/bin/passwd
/usr/bin/passwd: setuid ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=1e5735bf7b317e60bcb907f1989951f6abd50e8d, stripped
#执行文件包括suid权限,兼容的硬件平台,使用的是Linux核心2.6.32的动态链接库等
[root@VM_174_157_centos tmp]# file /var/lib/mlocate/mlocate.db
/var/lib/mlocate/mlocate.db: data <==这是data文件