Linux还为每个文件和目录存储了3个额外的信息位。

□设置用户ID(SUID):当文件被用户使用时,程序会以自身文件属主的权限运行。

s:属主原有执行权限

S:属主无执行权限

chmod u+|-s /path/to/somfile

chmod 4644 /path/to/somefile

例:

[hadoop@localhost test]$ ls -l `which passwd`
-rwsr-xr-x 1 root root 22984 2007-01-07 /usr/bin/passwd

□设置组ID(SGID):对文件来说,程序会议文件属组的权限运行;对目录来说,目录中创建的新文件会以目录的默认数组作为默认属组。

chmod g+|-s /path/to/somfile

chmod 4644 /path/to/somefile

例子:

1、创建两个用户hive和hadoop

将这两个用户加入到mygrp组中赋予一个目录有mygrp组写的权限

[root@localhost ~]# useradd hadoop
[root@localhost ~]# useradd hive
[root@localhost ~]# usermod -a -G mygrp hadoop
[root@localhost ~]# usermod -a -G mygrp hive
[root@localhost ~]# chmod g+w /tmp/test/
[root@localhost ~]# chown :mygrp /tmp/test/

2、分别以hive和hadoop的身份在/tep/test创建一个文件

-rw-rw-r-- 1 hadoop hadoop 0 10-20 21:49 a.hadoop
-rw-rw-r-- 1 hive   hive   0 10-20 21:50 a.hive

注:这个时候如果以hive的身份去修改a.hadoop,会出无法修改,权限不够


因为这个文件的属主和属组都是hadoop,hive无权更改

两个用户都能修改各自创建的文件,只需修改属组为mygrp即可。但不可能每次创建一个文件都手工去chmod。这个时候就需运用到sgid的作用。

3、将/tmp/test修改成sgid


[root@localhost ~]# chmod g+s /tmp/test/
[root@localhost ~]# ls -ld /tmp/test/
drwxrwsr-x 2 root mygrp 4096 10-20 21:50 /tmp/test/


4、以hive和hadoop各自的身份分别创建两个文件

-rw-rw-r-- 1 hadoop mygrp  0 10-20 22:06 b.haddop
-rw-rw-r-- 1 hive   mygrp  0 10-20 22:06 b.hive

这个时候,hadoop和hive用户的属组都为Mygrp。也就是此目录为两者的共享目录。

SGID位对文件共享非常重要。是能了SGID位,让在一个共享目录下创建的新文件都属于该目录的属组,也就是每个用户的组

□粘着位(sticky):附加other的权限上

chmod o+|-t /path/to/somefile

例子:

1、将/tmp/test进行配置stick
[root@localhost ~]# chmod o+t /tmp/test/
[root@localhost ~]# ls -ld /tmp/test/
drwxrwsr-t 2 root mygrp 4096 10-20 22:13 /tmp/test/
2、用hadoop的身份创建一个文件,如下:
-rw-rw-r-- 1 hadoop mygrp  0 10-20 22:16 c.haddop
3、用hive的身份编辑和删除c.haddop
结果:可以对c.hadoop进行编辑修改,但是无法删除
[hive@localhost test]$ rm c.haddop
rm: 无法删除 “c.haddop”: 不允许的操作


chmod SUID、SGID和粘着位的八进制值

二进制 八进制 描述

000 0 所有位都清零

001 1 粘着位置位

010 2 SGID位置位

011 3 SGID位和粘着位都置位

100 4 SUID位置位

101 5 SUID位和粘着位都置位

110 6 SUID位和SGID位都置位

111 7 所有位都置位


ACL:文件访问控制列表

acl:用于实现在原有的访问控制机制之外补充一种文件访问控制机制

用户访问文件:

1、用户是否为文件属主?

2、用户是否有特定的访问控制条目?

3、用户是否属于文件属组?

4、用户所属的组是否有特定的访问控制条目?

5、其它。

getfacl /path/to/somewhere:查看文件或目录的访问控制列表:

[hadoop@localhost test]$ getfacl b.hive
# file: b.hive
# owner: hive
# group: mygrp
user::rw-
group::rw-
other::r--

setfacl -m u:USERNAME:MODE /path/to/somewhere:为USERNAME指定的用户设定对文件/path/to/somewhere具有MODE访问权限:

setfacl -m g:GROUPNAME:MODE /path/to/somewhere:为GROUPNAME指定的组设定对文件/path/to/somewhere具有MODE访问权限:

setfacl -x u:USERNAME /path/to/somewhere

setfacl -x g:GROUPNAME /path/to/somewhere

额外挂载的文件系统默认不支持acl

/dev/mapper/onlinevg-mylv
3.0G  136M  2.7G   5% /mnt
[root@TP-CW-TS-DB-01 mnt]# setfacl -m u:nagios:rw  fstab
setfacl: fstab: Operation not supported

解决方法1:

[root@TP-CW-TS-DB-01 mnt]# umount /mnt
[root@TP-CW-TS-DB-01 mnt]# mount -o acl /dev/mapper/onlinevg-mylv /mnt
[root@TP-CW-TS-DB-01 mnt]# mount -o acl /dev/mapper/onlinevg-mylv /mnt
[root@TP-CW-TS-DB-01 mnt]# setfacl -m u:nagios:rw  fstab
[root@TP-CW-TS-DB-01 mnt]# getfacl fstab
# file: fstab
# owner: root
# group: root
user::rw-
user:nagios:rw-
group::r--
mask::rw-
other::r--

永久有效:编辑/etc/fstab,在挂载选项后附加acl选项

方法2:设定分区的默认挂载选项中有acl,则挂载无须再指定acl:

tune2fs -o acl DEVICE

取消此默认挂载选项:

tune2fs -o ^acl DEVICE


补充:

创建不可修改文件

在常见的Linux扩展文件系统中(如ext2、ext3、ext4等),可以将文件设置为不可修改(immutable).某些文件属性可帮助我们将文件设置不可修改。一旦文件被设置为不可修改,任何用户包括超级用户都不能删除该文件,除非其不可修改属性被移除。通过查看/etc/mtab文件,很容易找出所有挂载分区的文件系统类型。

例如:

[root@TP-CW-TS-DB-01 mnt]# chattr +i /mnt/fstab #添加不可修改权限
[root@TP-CW-TS-DB-01 mnt]# rm /mnt/fstab
rm: remove regular file `/mnt/fstab'? y
rm: cannot remove `/mnt/fstab': Operation not permitted
[root@TP-CW-TS-DB-01 mnt]# chattr -i /mnt/fstab #去除不可修改权限
[root@TP-CW-TS-DB-01 mnt]# rm /mnt/fstab
rm: remove regular file `/mnt/fstab'? y  #删除成功