linux中除了有常见的读写执行三种常见的权限外,还有3中特殊的权限,分别是SUID,SGID,Striky。在了解特殊权限之前,先解释一下安全上下文的概念。
安全上下文:进程运行时能够访问那些资源或文件,不取决与进程文件的属主属组,而取决与运行该命令的用户身份的UID和GID,以该身份获取各种系统资源。
特殊权限位:
SUID:对一个可执行文件,不是以发起者身份来获取资源,而是以可执行文件的属主身份来执行,也就是说无论谁来执行这个文件,他都有文件所有者的特权。如果所有者是 root 的话,那么执行人就有超级用户的特权了。
SUID: 运行某程序是,相应进程的属主是程序文件自身的属主,而不是启动者。
chmod u+s FILE
chmod u-s FILE
如果FILE本身原来就有执行权限,则显示为s;否则显示S
eg.
-r--------. 1 root root 865 7月 26 02:17 /etc/shadow -rwxr-xr-x. 1 root root 54048 6月 10 2014 /bin/cat 有一个叫hadoop的用户,在hadoop用户下 [hadoop@RedHat ~]$ cat /etc/shadow cat: /etc/shadow: Permission denied cat进程启动起来以后,是以hadoop的身份运行的。而hadoop没有访问/etc/shadow这个文件的权限。所以访问不到。 [root@RedHat data]# chmod u+s /bin/cat [root@RedHat data]# ll /bin/cat -rwsr-xr-x. 1 root root 54048 Jun 10 2014 /bin/cat 再切换到hadoop用户下, [hadoop@RedHat ~]$ cat /etc/shadow
root:$6$DotZtyMiripQ.7bt$d171YFkJIRCfK/9G3A1qBLfOo4/ya6zZWxqyU5qEgaqE0hcM89Ig61:16585:0:99999:7::: bin:*:16231:0:99999:7::: daemon:*:16231:0:99999:7::: adm:*:16231:0:99999:7::: lp:*:16231:0:99999:7::: .... 访问成功,在设置SUID后,cat进程起来以后,不在以hadoop的身份运行,而是以cat文件自身的属主root来运行,而root用户对/etc/shadow具有访问权限。
应用场景:
写一个脚本获取某些系统的属性的时候,就必须给SUID权限。
[root@RedHat data]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd
普通用户也要能修改自身的登录密码,所以必须给SUID权限。
SGID:对于一个可执行文件,不是以发起者身份来获取资源,而是以可执行文件的属组的身份来执行。也就是说该文件具有所属组的特权,任意存取这个组所能使用的系统资源。若一个目录设置了SGID,则所有被复制到这个目录下的文件,其所属组都会被重设为和这个目录一样,除非在复制时文件时加上-p参数,才能保留原来所属组的群组设置。
SGID:运行某程序是,相应进程的属组是程序文件自身的属主,而不是启动者的基本组。
chmod g+s FILE
chmod g-s FILE
eg.
假设有develop, team, hadoop, hbase, hive几个用户要在一个公共目录/tmp/project/下,建一个文件,相互都能访问,相互而且能编辑。
在root用户下
[root@RedHat tmp]# mkdir project
[root@RedHat tmp]# groupadd developteam
[root@RedHat tmp]# chown -R :developteam /tmp/project/
[root@RedHat tmp]# usermod -a -G developteam hadoop
[root@RedHat tmp]# usermod -a -G developteam hive
[root@RedHat tmp]# usermod -a -G developteam hbase
[root@RedHat tmp]# id hadoop
uid=1002(hadoop) gid=1002(hadoop) groups=1002(hadoop),1005(development),1007(developteam)
hadoop有developteam组权限
在hadoop用户下
[hadoop@RedHat project]$ touch a.hadoop
[hadoop@RedHat project]$ ll
-rw-rw-r--. 1 hadoop hadoop 0 7月 26 03:05 a.hadoop
在hbase用户下
[hbase@RedHat project]$ touch a.hbase
[hbase@RedHat project]$ ll
-rw-rw-r--. 1 hadoop hadoop 0 7月 26 03:05 a.hadoop
-rw-rw-r--. 1 hbase hbase 0 7月 26 03:06 a.hbase
新建的文件a.hadoop a.hbase都是属于用户的基本组,相互之间没有写权限。
给/tmp/project目录添加SGID权限
[root@RedHat project]# chmod g+s /tmp/project/
[root@RedHat project]# ls -ld .
drwxrwsr-x. 2 root developteam 4096 Jul 26 03:06 .
在hadoop用户下
[hadoop@RedHat project]$ touch b.hadoop
[hadoop@RedHat project]$ ll
-rw-rw-r--. 1 hadoop hadoop 0 7月 26 03:05 a.hadoop
-rw-rw-r--. 1 hbase hbase 0 7月 26 03:06 a.hbase
-rw-rw-r--. 1 hadoop developteam 0 7月 26 03:07 b.hadoop
在hbase用户下
[hbase@RedHat project]$ touch b.hbase
[hbase@RedHat project]$ ll
-rw-rw-r--. 1 hadoop hadoop 0 7月 26 03:05 a.hadoop
-rw-rw-r--. 1 hbase hbase 0 7月 26 03:06 a.hbase
-rw-rw-r--. 1 hadoop developteam 0 7月 26 03:07 b.hadoop
-rw-rw-r--. 1 hbase developteam 0 7月 26 03:07 b.hbase
发现新建的文件b.hadoop和b.hbase都属于developteam组。hadoop和hbase可以访问修改对方创建的文件。但是这样又有个缺陷,那就是hadoop和hbase能够删除对方建立的文件。
STICKY:粘滞位,通常对于目录而言。通常对于全局公共目录来说,让该目录具有Sticky后,删除只属于自己的文件有效(但是仍能编辑修改别人的文件,除了root)。不能根据安全上下文获取对别人的文件的写权限。
Sticky:在一个公共目录,每个都可以创建文件,删除自己的文件,但不能删除别人的文件;
chmod o+t DIRECTORY
chmod o-t DIRECTORY
给/tmp/project目录添加Sticky权限
[root@RedHat project]# chmod o+t /tmp/project/
[root@RedHat project]# ls -ld .
drwxrwsr-t. 2 root developteam 4096 Jul 26 03:15 .
这三位特殊权限组成一个八进制的权限位s,u,t,用二进制表示:
SUID SGID STICKY 最靠前的权限位
000
001
...
110
111
chmod 1755 /backup/test,标红的表示特殊权限位。
练习:新建一个公司的开发组developteam。有三个成员hadoop hbase hive,在工程目录/tmp/projct下,可以创建文件,可以访问修改其他组员创建的文件,可以
删除自己创建的文件,但是不能删除其他组员创建的文件
useradd hadoop
useradd hbase
useradd hive
groupadd developteam
usermod -a -G developteam hadoop
usermod -a -G developteam hive
usermod -a -G developteam hbae
mkdir /tmp/project/
#chmod g+w /tmp/project
chomd g+s /tmp/project
drwxrwsr-x. 2 root development 4096 6月 29 23:10 /tmp/project/
chomd o+t /tmp/project
drwxrwsr-t. 2 root development 4096 6月 29 23:10 /tmp/project/
su hbase
cd /tmp/project
touch a.habse
ls -l a.habse
-rw-rw-r--. 1 hbase development 0 6月 29 23:10 a.hbase
su hadoop
cd /tmp/project
touch a.hadoop
ls -l a.hadoop
-rw-rw-r--. 1 hadoop development 0 6月 29 23:10 a.hadoop