03.Linux系统特殊权限

徐亮伟, 江湖人称标杆徐。多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。擅长Web集群架构与自动化运维,曾负责国内某大型电商运维工作。
个人博客"徐亮伟架构师之路"累计受益数万人。
笔者Q:552408925、572891887
架构师群:471443208

1.Linux系统特殊权限

1.suid以文件的所属用户身份执行命令, 而不是以当前用户的身份执行命令

-rwsr-xr-x. 1 root root 54080 Nov  5  2016 /usr/bin/cat

    root用户执行cat,最终运行的身份是root
    bgx用户执行cat, 最终运行的身份是bgx
suid
    root用户执行,最终运行的身份是root
    bgx用户执行,最终运行的身份是root

2.将目录设置为sgid后续如果在该目录下创建文件, 都将与该目录的所属组保持一致

drwxr-srwx. 2 root devops 29 Jun 14 21:01 /opt/
    bgx用户登陆后, 在/opt/目录创建文件或者目录属主和属组是
        最终属主和属组   bgx devops
    xlw用户登陆后, 在/opt/目录创建文件或者目录属主和属组是
        最终属主和属组  xlw devops
    root用户登陆后, 在/opt/目录创建文件或者目录属主和属组是
        最终属主和属组   root devops

3.sticky任何人都可以在该目录下创建文件以及目录, 但只能删除自己创建的文件和目录

drwxrwxrwt. 7 root root 93 Jun 14 21:47 /tmp/

4.如何设置特殊权限

用符号表示: setuid=u+s; setgid=g+s; sticky=o+t
用数值表示: setuid=4; setgid=2; sticky=1

1.1set_uid

文件的执行有效身份为文件的拥有者,而不是执行者的身份。

演示

//检查passwd文件权限,匿名用户没有权限查看
[root@xuliangwei ~]# chmod 640 /etc/passwd
[root@xuliangwei ~]# ll  /etc/passwd
-rw-r----- 1 root root 1548 Dec  9 18:45 /etc/passwd

//使用普通用户无法查看
[xuliangwei@xuliangwei root]$ cat /etc/passwd
cat: /etc/passwd: Permission denied

//给cat命令赋予suid
[root@xuliangwei ~]# chmod 4755 /bin/cat
[root@xuliangwei ~]# ll /bin/cat
-rwsr-xr-x. 1 root root 48568 Mar 23  2017 /bin/cat

suid授权方法

suid    4000 权限字符s(S),用户位置上的x位上设置。
授权方法:chmod 4755 passwd
        chmod  u+s  passwd

suid的作用

1.让普通用户拥有二进制文件的所属主权限,二进制文件需要有执行权限。
2.如果设置的二进制文件没有执行权限,那么suid的权限显示就是大S。
3.特殊权限suid仅对二进制可执行程序有效,其他文件或目录则无效。
4.如果普通用户需要操作没有权限的文件,为对应的命令赋予Suid权限。
注意: suid双刃剑, 是一个比较危险的功能, 对系统安全有一定的威胁。

1.2set_gid

演示案例

[root@xuliangwei /]# chmod 777 /opt/
[root@xuliangwei /]# chmod g+s /opt/
[root@xuliangwei /]# su - xuliangwei
[xuliangwei@xuliangwei ~]$ mkdir /opt/sgid_test
[xuliangwei@xuliangwei ~]$ ll /opt/sgid_test -d
drwxrwsr-x. 2 xuliangwei root 4096 Nov 14 00:27 /opt/sgid_test

sgid授权方法

suid    2000 权限字符s(S),取决于属组位置上的x。
授权方法:chmod 2755  directory
        chmod  g+s  directory

sgid作用

1.针对用户组权限位修改,用户创建的目录或文件所属组和该目录的所属组一致。
2.当某个目录设置了sgid后,在该目录中新建的文件不在是创建该文件的默认所属组
3.使用sgid可以使得多个用户之间共享一个目录的所有文件变得简单。

1.3sticky粘滞位

sticky对目录有写权限的用户仅仅可以删除目录里属于自己的文件,不能删除其他用户的文件
系统中存在的/tmp目录是经典的粘滞位目录,谁都有写权限,因此安全成问题,常常是木马第一手跳板。

sticky授权方法

粘滞位     1000 权限字符t(T),其他用户位的x位上设置。
授权方法:chmod 1755  /tmp
         chmod o+t /tmp

sticky作用

1.让多个用户都具有写权限的目录,并让每个用户只能删自己的文件。
2.特殊sticky目录表现在others的x位,用小t表示,如果没有执行权限是T
3.一个目录即使它的权限为"777"如果是设置了粘滞位,除了目录的属主和"root"用户有权限删除,除此之外其他用户都不允许删除该目录。

2.权限属性chattr

设置文件属性(权限),针对所有用户,包括 root

a:让文件或目录仅可追加内容
i:不得任意更动文件或目录

//创建文件并设置属性
[root@xuliangwei ~]# touch file_a file_i
[root@xuliangwei ~]# lsattr file_a file_i
---------------- file_a
---------------- file_i

//设置属性
[root@xuliangwei ~]# chattr +a file_a
[root@xuliangwei ~]# chattr +i file_i
[root@xuliangwei ~]# lsattr file_a file_i
-----a---------- file_a
----i----------- file_i

//a权限, 无法覆盖写入和删除文件
[root@xuliangwei ~]# echo "aa" > file_a
bash: file_a: Operation not permitted
[root@xuliangwei ~]# rm -f file_a
rm: cannot remove ‘file_a’: Operation not permitted

//a权限, 只能追加, 适用于日志文件
[root@xuliangwei ~]# echo "aa" >> file_a

//i权限, 无法写入, 无法删除
[root@xuliangwei ~]# echo "i" > file_i
bash: file_i: Permission denied
[root@xuliangwei ~]# echo "i" >> file_i
bash: file_i: Permission denied
[root@xuliangwei ~]# rm -f  file_i
rm: cannot remove ‘file_i’: Operation not permitted

//解除限制
[root@tianyun ~]# chattr -a file100 
[root@tianyun ~]# chattr -i file200

3.进程掩码umask

umask用于控制系统权限, 默认系统权限较大, 需要靠Umask来变更权限
默认新建文件,系统默认最大权限为666
默认新建目录,系统默认最大权限是777

我们在新建文件和目录的默认权限会受到umask的影响, umask表示要减掉的权限。
创建目录权限值为777-umask
创建普通文件权限值为644-umask

umask涉及到的相关文件/etc/bashrc /etc/profile ~/.bashrc ~/.bash_profile

注意umask影响的范围
shell (vim,touch) --umask--> 新文件或目录权限
vsftpd --umask--> 新文件或目录权限
samba --umask--> 新文件或目录权限
useradd --umask--> 用户 HOME

1.假设umask值为:022(所有位为偶数)
//文件的起始权限值
6 6 6  -  0 2 2  = 6 4 4 

2.假设umask值为:045(其他用户组位为奇数)
//计算出来的权限。由于umask的最后一位数字是5,所以,在其他用户组位再加1。
6 6 6  -   0 4 5 = 6 2 1

3.默认目录权限计算方法
7 7 7  -  0 2 2 = 7 5 5
 
umask 044    //umask所有位全为偶数时
示例:mkdir d044   //目录733
示例:touch f044   //文件622

umask 023    //umask值的部分或全部位为奇数时
示例:mkdir d023   //目录754
示例:touch f023   //文件644

umask 035    //umask值的所有位为奇数时
示例:mkdir d035   //目录742
示例:touch f035   //文件642

示例1: 在shell进程中创建文件

//查看当前用户的umask权限
[root@xuliangwei ~]# umask
0022
[root@xuliangwei ~]# touch file0022
[root@xuliangwei ~]# mkdir dir0022
[root@xuliangwei ~]# ll -d file0022  dir0022/
drwxr-xr-x 2 root root 6 Jan 24 09:02 dir0022/
-rw-r--r-- 1 root root 0 Jan 24 09:02 file0022

示例2: 修改shell umask值(临时生效)

[root@xuliangwei ~]# umask 000
[root@xuliangwei ~]# mkdir dir000
[root@xuliangwei ~]# touch file000
[root@xuliangwei ~]# ll -d dir000 file000
drwxrwxrwx 2 root root 6 Jan 24 09:04 dir000
-rw-rw-rw- 1 root root 0 Jan 24 09:04 file000

示例3: 修改shell umask值(永久生效, 强烈不建议修改)

[root@xuliangwei ~]# vim /etc/profile
if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then 
umask 002
else
umask 022
fi

//立即在当前 shell 中生效
[root@xuliangwei ~]# source /etc/profile

示例4: 通过umask决定新建用户HOME目录的权限

[root@xuliangwei ~]# vim /etc/login.defs
UMASK 077
[root@xuliangwei ~]# useradd dba
[root@xuliangwei ~]# ll -d /home/dba/
drwx------. 4 dba dba 4096 3 月 11 19:50 /home/dba/

[root@tianyun ~]# vim /etc/login.defs
UMASK 000
[root@xuliangwei ~]# useradd sa
[root@xuliangwei ~]# ll -d /home/sa/
drwxrwxrwx. 4 sa sa 4096 3 月 11 19:53 /home/sa/

示例 5:例如vsftpd进程/etc/vsftpd/vsftpd.conf

[root@tianyun ~]# yum -y install vsftpd
[root@tianyun ~]# man vsftpd.conf
anon_umask
local_umask

4.特殊权限练习题

lab permissions setup

考试必考: 创建三个用户, 分别为curlylarrymoe这些用户都是stooges组的成员。
这些用户帐号密码都为password
1.要求以上用户和组可以在/home/stooges目录里访问,创建,删除文件
2.其他用户一律不允许访问该目录
3.在该目录下新建的文件会自动属于stooges组拥有

//创建用户,组
useradd curly
useradd larry
useradd moe
groupadd stooges

//创建密码
echo "password" |passwd --stdin moe
echo "password" |passwd --stdin larry
echo "password" |passwd --stdin curry

//将用户加组
gpasswd -a larry stooges
gpasswd -a moe stooges
gpasswd -a curly stooges

//创建目录并配置权限
mkdir /home/stooges
chmod 770 /home/stooges
chown .stooges /home/stooges
chmod g+s /home/stooges