linux中除了有常见的读写执行三种常见的权限外,还有3中特殊的权限,分别是SUID,SGID,Striky。在了解特殊权限以前,先解释一下安全上下文的概念。linux
安全上下文:进程运行时可以访问那些资源或文件,不取决与进程文件的属主属组,而取决与运行该命令的用户身份的UID和GID,以该身份获取各类系统资源。安全
特殊权限位: oop
SUID:对一个可执行文件,不是以发起者身份来获取资源,而是以可执行文件的属主身份来执行,也就是说不管谁来执行这个文件,他都有文件全部者的特权。若是全部者是 root 的话,那么执行人就有超级用户的特权了。ui
SUID: 运行某程序是,相应进程的属主是程序文件自身的属主,而不是启动者。spa
chmod u+s FILE
chmod u-s FILE
若是FILE自己原来就有执行权限,则显示为s;不然显示Scode
eg.blog
-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权限。 ip
[root@RedHat data]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwdhadoop
普通用户也要能修改自身的登陆密码,因此必须给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