“ 本文正在参加「金石计划 . 瓜分6万现金大奖」 ”
12.7.2.4 suid核心知识小结
1)suid的功能是针对二进制命令或程序的,不能用在Shell等类似脚本文件上。
2)用户或属主对应的前三位权限的x位上,如果有s(S)则表示具备suid权限。
3)suid的作用就是让普通用户可以在执行某个设置了suid位的命令或程序时,拥有与命令对应属主(一般为root管理员)一样的身份和权限(默认)。
4)二进制命令程序需要具有可执行权限x配合才能进行相关操作。
5)suid对应的身份和权限仅在程序命令的执行过程中才有效。
6)suid是一把双刃剑,是一个比较危险的功能,对系统安全存在一定的威胁,企业里用户授权可以使用sudo等替代sgid功能。
7)在进行安全优化时,系统中默认设置了suid权限的命令要取消掉。
12.7.2.5 suid基于命令实战实例应用
如果想让一个普通用户neteagle拥有root用户才能拥有的rm删除文件权限,除了使用su或sudo临时切换到root身份或以root身份进行操作以外,还可以怎么做呢?另一种方法就是利用suid权限实现。示例代码如下:
[root@centos7 ~]# touch younggilr.txt
[root@centos7 ~]# ll younggilr.txt
-rw-r--r--. 1 root root 0 Oct 16 16:58 younggilr.txt
[root@centos7 ~]# ll -d /root/
dr-xr-x---. 2 root root 285 Oct 16 16:58 /root/
下面以neteagle用户的身份切换删除/root/younggirl.txt,根据前面讲过的权限知识,删除文件以查看文件的上级目录权限,younggilr.txt的上级目录为/root,用户和用户组都是root,因此,neteagle用户对/root目录的权限就是看其他用户位的权限(一),没有任何权限,测试代码如下:
[neteagle@centos7 ~]$ ls /root/
ls: cannot open directory /root/: Permission denied
[neteagle@centos7 ~]$ cd /root/
-bash: cd: /root/: Permission denied
[neteagle@centos7 ~]$ rm -f /root/younggirl.txt
rm: cannot remove ‘/root/younggirl.txt’: Permission denied
可以看到,结果是什么操作都进行不了。
下面为rm命令授权suid权限(注意,所有的授权操作都是在root下完成的,测试都是在neteagle用户窗口下进行的),步骤如下:
[root@centos7 ~]# chmod u+s /bin/rm #对rm设置了suid位以后,任何用户执行rm都是root身份和权限。
[root@centos7 ~]# ll /bin/rm
-rwsr-xr-x. 1 root root 62872 Aug 20 2019 /bin/rm
再到neteagle用户窗口下进行测试,发现这次可以删除了。
[neteagle@centos7 ~]$ rm -f /root/younggirl.txt
提示: 对rm设置了suid位以后,任何用户执行rm都是以root的身份和权限来进行的,由此可见这样操作是很不安全的。所以,笔者坚决禁止读者在企业中使用suid功能。
12.7.2.6 哪些命令被默认设置了suid位
Linux系统在默认情况下为了解决一些权限问题,就已经设置了一些suid的命令,这些命令在大多数情况下都没有破坏功能,下面仅以/bin目录为例进行说明。
[root@centos7 ~]# chmod u-s /bin/rm #测试完毕赶紧取消suid权限。
[root@centos6 ~]# find /bin -type f -perm 4755|xargs ls -l #CentOS 6结果。
-rwsr-xr-x. 1 root root 77560 Jan 26 2018 /bin/mount
-rwsr-xr-x. 1 root root 38520 Mar 22 2017 /bin/ping
-rwsr-xr-x. 1 root root 36488 Mar 22 2017 /bin/ping6
-rwsr-xr-x. 1 root root 34904 Jun 19 2018 /bin/su
-rwsr-xr-x. 1 root root 53480 Jan 26 2018 /bin/umount
现在普通用户neteagle下测试ping的功能,可以正常ping网站地址,示例代码如下:
[neteagle@centos7 ~]$ ping www.baidu.com
PING www.a.shifen.com (14.215.177.38) 56(84) bytes of data.
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=1 ttl=128 time=44.8 ms
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=2 ttl=128 time=40.1 ms
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=3 ttl=128 time=39.9 ms
^C
--- www.a.shifen.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 39.996/41.656/44.819/2.237 ms
在root窗口下取消ping的suid权限位,步骤如下:
[root@centos6 ~]# ll /bin/ping
-rwsr-xr-x. 1 root root 38520 Mar 22 2017 /bin/ping
[root@centos6 ~]# chmod u-s /bin/ping
[root@centos6 ~]# ll /bin/ping #CentOS 6下的结果。
-rwxr-xr-x. 1 root root 38520 Mar 22 2017 /bin/ping
重新在普通用户neteagle下测试ping功能,发现此时不能使用ping了。
[root@centos6 ~]# useradd neteagle
[root@centos6 ~]# passwd neteagle
Changing password for user neteagle.
New password:
BAD PASSWORD: it is too simplistic/systematic
BAD PASSWORD: is too simple
Retype new password:
passwd: all authentication tokens updated successfully.
[C:~]$ ssh neteagle@10.0.0.202
Connecting to 10.0.0.202:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
/usr/bin/xauth: file /home/neteagle/.Xauthority does not exist
[neteagle@centos6 ~]$ ping www.baidu.com #CentOS 6下的结果。
ping: icmp open socket: Operation not permitted
提示: 因为ping没有了suid位,普通用户默认无法执行ping命令,设置完suid位之后,再执行ping命令时拥有了root身份和权限,所以就可以ping了,需要特别注意的是,虽然CentOS 7下这个ping取消了suid权限,但是这个示例还是有意义的,大家可以测试其他命令。
经过上述不同角度的讲解,相信读者应该能够明白suid的作用及应用场景了,suid可以使得普通用户在执行某个命令时拥有超越本身权限的能力,suid的核心是对命令进行设置,其与后文的su和sudo命令的功能是不同的。
12.7.3 sgid权限知识
对于二进制命令或者程序来说,sgid的功能与suid基本相同,唯一的区别是,suid是获得命令所属用户的身份和权限,而sgid是获得命令所属用户组的身份和权限,因此,有关sgid对于二进制命令或者程序方面的知识就不详细叙述了。
12.7.3.1 sgid核心知识小结
1)与suid不同的是,sgid既可以针对文件,也可以针对目录进行设置!
2)sgid的权限是针对用户组权限位的。
对于文件来说,sgid的功能具体如下。
1)sgid仅对二进制命令及程序有效。
2)二进制命令或程序,也需要有可执行权限x的配合。
3)执行命令的任意用户可以获得该命令在程序执行期间所属组的身份和权限。
对于目录(继承目录所属的组)来说,sgid的功能具体如下。
1)Linux默认情况下所有用户创建文件,默认用户和组都是自身。
2)sgid可以让用户在此目录下创建的文件和目录具有与此目录相同的用户组设置。
setgid位主要用于目录中,在为某个目录设置了setgid位以后,在该目录中新创建的文件具有该目录的所属组权限,而不是创建该文件的用户的默认所有者。这就使得在多个用户之间共享一个目录中的文件变得简单。
提示: 用八进制数2000表示setgid权限位。
12.7.3.2 sgid位命令程序权限案例
大家还记得locate命令么?locate命令是一个从系统数据库中查找文件功能的命令,默认查找的数据库文件为/var/lib/mlocate/mlocate.db,通常是使用updatedb更新数据库。示例代码如下:
[root@centos7 ~]# which locate #查看路径,CentOS 7下需要先安装,命令如下yum install -y mlocate。
/usr/bin/locate
[root@centos7 ~]# ll `which locate` #查看locate命令属性。
-rwx--s--x. 1 root slocate 40520 Apr 11 2018 /usr/bin/locate #用户组为默认有s,即sgid位。
[root@centos7 ~]# updatedb #创建并更新locate命令对应的数据库列表。
[root@centos7 ~]# ll /var/lib/mlocate/mlocate.db #locate命令对应的数据库。
-rw-r-----. 1 root slocate 2014972 Oct 16 17:38 /var/lib/mlocate/mlocate.db
[root@centos7 ~]# echo "echo neteagleLinux" >/bin/neteaglecmd #创建一个脚本文件并放到/bin下。
[root@centos7 ~]# chmod +x /bin/neteaglecmd #加执行权限。
[root@centos7 ~]# locate neteaglecmd #无法查找到。
[root@centos7 ~]# updatedb #该命令会根据PATH路径,将命令索引更新到mlocate.db数据库中。
[root@centos7 ~]# locate neteaglecmd #重新查找,这次就有了。
/usr/bin/neteaglecmd
切换到neteagle用户下测试,查找neteaglecmd,示例代码如下:
[neteagle@centos7 ~]$ locate neteagle
/usr/bin/neteaglecmd
根据基本权限知识,neteagle是普通用户,neteagle执行locate,要想查找到neteaglecmd就必须要读取/var/lib/mlocate/mlocate.db数据库中的信息,但是,该文件的用户和用户组分别是root和slocate,neteagle用户对于mlocate.db的权限属于其他权限位,即最后三位(---),所以neteagle用户下是无法查找到neteaglecmd这个命令的。
但是事实上,neteagle用户却是查找到了neteaglecmd,真实原因就是locate命令本身的用户组位设置了sgid位,因此,neteagle用户在使用locate命令查找文件时,就拥有了与locate命令对应的与用户组相同的身份和权限,因此,在读取/var/lib/mlocate/mlocate.db时,是以slocate用户组身份读取的mlocate.db,而slocate用户组对mlocate.db文件的权限属于中间三位,即“r--”,说明它具有读的权限,因此,neteagle就查到了neteaglecmd这个命令文件。
取消locate命令的sgid权限,示例代码如下:
[root@centos7 ~]# chmod g-s `which locate` #取消sgid位。
[root@centos7 ~]# ll `which locate`
-rwx--x--x. 1 root slocate 40520 Apr 11 2018 /usr/bin/locate
然后,在neteagle用户下进行测试,直接提示权限拒绝了。
[neteagle@centos7 ~]$ locate neteaglecmd
locate: can not stat () `/var/lib/mlocate/mlocate.db': Permission denied
这个sgid的实际应用很少,有能力的读者可以了解一下。
12.7.3.3 sgid基于目录的案例
下面就来看一道RHCE认证考试题(了解即可)。
创建共享目录/home/admins,要求属主为adminuser,adminuser组成员对admins目录有写入、读取和执行的权限,其他所有用户均没有任何权限(root除外),在/home/admins目录中创建的文件会自动继承adminuser组的权限。
参考解答代码如下:
[root@centos7 ~]# mkdir /home/admins #创建共享目录admins。
[root@centos7 ~]# groupadd adminuser #添加用户组adminuser。
[root@centos7 ~]# ll -d /home/admins/
drwxr-xr-x. 2 root root 6 Oct 16 18:00 /home/admins/
[root@centos7 ~]# chgrp adminuser /home/admins/ #为admins目录授权adminuser用户组。
[root@centos7 ~]# ll -d /home/admins/
drwxr-xr-x. 2 root adminuser 6 Oct 16 18:00 /home/admins/ #查看授权结果。
[root@centos7 ~]# touch /home/admins/neteagle.txt #创建测试文件。
[root@centos7 ~]# ll /home/admins/
total 0
-rw-r--r--. 1 root root 0 Oct 16 18:01 neteagle.txt #文件默认用户和组都是root。
[root@centos7 ~]# chmod 2770 /home/admins/ #授权sgid权限给admins目录。
[root@centos7 ~]# ll -d /home/admins/
drwxrws---. 2 root adminuser 26 Oct 16 18:01 /home/admins/ #查看授权结果。
[root@centos7 ~]# touch /home/admins/newfile.txt #再创建新文件。
[root@centos7 ~]# ll /home/admins/
total 0
-rw-r--r--. 1 root root 0 Oct 16 18:01 neteagle.txt
-rw-r--r--. 1 root adminuser 0 Oct 16 18:02 newfile.txt #新创建的文件用户组为adminuser了,而非默认的root了。
整个配置过程,已满足题意要求。
12.7.4 粘滞位(sbit)知识
粘滞位(sticky bit)的功能现在已经很少用了,不过对于想/tmp目录这样的,因为其是整个系统用户的临时文件存放地,因此还是有点意义的。一个目录即使它的所有权限都开放了,即权限为rwxrwxrwx,而同时设置了粘滞位,那么除非目录的属主和root用户都有权限删除它,除此之外其他用户是不能删除这个目录的。粘滞位的用途一般是将一个文件夹的权限都打开,然后共享该文件,像/tmp目录一样。粘滞位的功能虽然方便,但是同时也带来了一定的安全隐患,生产环境中应禁止设置粘滞位权限。
12.8 改变文件或目录的用户和用户组命令 chown
12.8.1 命令详解
【命令星级】 ★★★★★
【功能说明】
chown命令用于改变文件或目录的用户和用户组。
【语法格式】
chown [option] [OWNER][:GROUP] [file]
chown [选项] [用户:用户组] [<文件或目录>]
常用授权命令语法格式:
chown 用户 文件或目录 #仅授权用户。
chown :用户组 文件或目录 #仅授权用户组,等同于“chgrp 用户组 文件或目录”。
chown 用户:用户组 文件或目录 #同时授权用户和用户组。
说明:
1)其中的“:”可以用"."代替。
2)要授权的用户和组名,必须是Linux系统中真实存在的。
【选项说明】
表12-8针对chown命令的参数选项进行了说明。
表12-8 chown命令的参数选项及说明
12.8.2 使用范例
范例12-4: 更改文件alex.txt所属的用户为inca的示例。
[root@centos7 ~]# touch alex.txt #创建测试文件。
[root@centos7 ~]# ll alex.txt #查看默认属性。
-rw-r--r--. 1 root root 0 Oct 16 18:30 alex.txt
[root@centos7 ~]# chown inca alex.txt #授权inca用户。
chown: invalid user: ‘inca’ #提示用户不存在,待授权的用户或组必须存在。
[root@centos7 ~]# useradd inca #添加inca用户。
[root@centos7 ~]# chown inca alex.txt #重新将alex.txt文件所属用户授权为inca用户。
[root@centos7 ~]# ll alex.txt
-rw-r--r--. 1 inca root 0 Oct 16 18:30 alex.txt #查看授权结果。
范例12-5: 更改neteagle.txt文件所属的用户组为tech。
[root@centos7 ~]# ll neteagle.txt
-rw-r-Sr--. 1 root root 0 Oct 16 15:46 neteagle.txt
[root@centos7 ~]# chown .tech neteagle.txt #将neteagle.txt所属的组授权为tech。
chown: invalid user: ‘.tech’
[root@centos7 ~]# groupadd tech
[root@centos7 ~]# chown .tech neteagle.txt #等价于chgrp tech neteagle.txt。
[root@centos7 ~]# ll neteagle.txt
-rw-r-Sr--. 1 root tech 0 Oct 16 15:46 neteagle.txt #查看授权结果。
范例12-6: 同时将/neteagle目录及子目录所属的用户改为inca,将用户组改为tech。
[root@centos7 ~]# ll -d /neteagle/
drwxr-xr-t. 2 root root 48 Oct 16 14:27 /neteagle/
[root@centos7 ~]# chown -R inca.tech /neteagle/
[root@centos7 ~]# ll -d /neteagle/
drwxr-xr-t. 2 inca tech 48 Oct 16 14:27 /neteagle/
12.8.3 文件所属的用户及用户组特殊情况
当文件及目录的用户或用户组被删除时,对应的用户和用户组位就会显示如下的数字形式:
[root@centos7 ~]# userdel -r inca
[root@centos7 ~]# groupdel tech
[root@centos7 ~]# ll -d /neteagle/
drwxr-xr-t. 2 1007 1009 48 Oct 16 14:27 /neteagle/
解决办法就是重新创建uid为1007的用户,以及gid为1009的用户组,具体步骤如下:
[root@centos7 ~]# useradd inca -u 1007
[root@centos7 ~]# groupadd tech -g 1009
[root@centos7 ~]# ll -d /neteagle/
drwxr-xr-t. 2 inca tech 48 Oct 16 14:27 /neteagle/
12.9 chattr:改变文件的扩展属性
12.9.1 命令详解
【命令星级】 ★★★☆☆
【功能说明】
chattr命令用于改变文件的扩展属性。与chmod命令相比,chmod只是改变了文件的读、写、执行权限。更底层的属性控制是由chattr来改变的。
【语法格式】
chattr [options] [mode] [files]
chattr [选项] [模式] [<文件或目录>]
说明:chattr命令以及后面的选项和文件,每个元素之间都至少要有一个空格。
【选项说明】
表12-9针对chattr命令的参数选项进行了说明。
表12-9 chattr命令的参数选项及说明
12.9.2 使用范例
范例12-7: 设置只能向文件里追加内容,但不能删除文件。
[root@centos7 ~]# touch test
[root@centos7 ~]# lsattr test #lsattr查看文件的扩展属性。
---------------- test
[root@centos7 ~]# chattr +a test #+a添加追加属性。
[root@centos7 ~]# lsattr test
-----a---------- test
[root@centos7 ~]# rm -f test #即使是root用户也无法删除。
rm: cannot remove ‘test’: Operation not permitted
[root@centos7 ~]# echo 111 >> test #可以追加文本。
[root@centos7 ~]# cat test
111
[root@centos7 ~]# echo 111 > test #但是不能清空文件。
-bash: test: Operation not permitted
范例12-8: 对文件加锁,使其只能被执行读操作。
[root@centos7 ~]# touch file1.txt
[root@centos7 ~]# echo test >file1.txt
[root@centos7 ~]# cat file1.txt
test
[root@centos7 ~]# chattr +i file1.txt #使用+i参数为文件加锁。
[root@centos7 ~]# lsattr file1.txt
----i----------- file1.txt
[root@centos7 ~]# rm file1.txt #root用户也无法删除文件。
rm: remove regular empty file ‘file1.txt’? y
rm: cannot remove ‘file1.txt’: Operation not permitted
[root@centos7 ~]# echo 111 > file1.txt #不能清空。
-bash: file1.txt: Permission denied
[root@centos7 ~]# echo 111 >> file1.txt #也不能追加。
-bash: file1.txt: Permission denied
[root@centos7 ~]# cat file1.txt
test #可以查看。
[root@centos7 ~]# chattr -i file1.txt #使用-i参数解锁。
[root@centos7 ~]# rm file1.txt
rm: remove regular empty file ‘file1.txt’? y #解锁后就可以删除了。
12.9.3 安全优化实战
下面利用-a和-i参数为大家讲解chattr在企业中的实战应用。
为了避免恶意删除.bash_history历史记录文件或者重定向到/dev/null,又因为系统需要向这个文件写入历史记录,因此采用追加模式,只增不减。命令如下:
[root@centos7 ~]# chattr +a .bash_history #为历史记录文件加上只能追加的属性。
[root@centos7 ~]# lsattr .bash_history
-----a---------- .bash_history
[root@centos7 ~]# chattr -a .bash_history
[root@centos7 ~]# lsattr .bash_history
---------------- .bash_history
如果系统锁定的文件不能被删除或修改,那么可以使用下面的命令来实现:
[root@centos7 ~]# chattr +i /etc/passwd /etc/group /etc/shadow /etc/gshadow /etc/inittab #锁定系统关键文件。
[root@centos7 ~]# lsattr /etc/passwd /etc/group /etc/shadow /etc/gshadow /etc/inittab
----i----------- /etc/passwd
----i----------- /etc/group
----i----------- /etc/shadow
----i----------- /etc/gshadow
----i----------- /etc/inittab
[root@centos7 ~]# useradd xx #添加用户的命令,后面会详细讲解。
useradd: cannot open /etc/passwd
#说明:做完上面实验的读者,请立即解锁这些文件,因为以后学习都需要修改这些文件。
解锁命令如下:
[root@centos7 ~]# chattr -i /etc/passwd /etc/group /etc/shadow /etc/gshadow /etc/inittab
[root@centos7 ~]# lsattr /etc/passwd /etc/group /etc/shadow /etc/gshadow /etc/inittab
---------------- /etc/passwd
---------------- /etc/group
---------------- /etc/shadow
---------------- /etc/gshadow
---------------- /etc/inittab
提示: 对于chattr功能的使用,黑客如果知道也能操作,因此,使用chattr的安全性只是相对的。
12.10 lsattr:查看文件的扩展属性
12.10.1 命令详解
【命令星级】 ★★★☆☆
【功能说明】
lsattr命令用于查看文件扩展属性。
【语法格式】
lsattr [options] [files]
lsattr [选项] [<文件或目录>]
说明: lsattr命令以及后面的选项和文件,每个元素之间都至少要有一个空格。
【选项说明】
表12-10针对lsattr命令的参数选项进行了说明。
表12-10 lsattr命令的参数选项及说明
12.10.2 使用范例
范例12-9: 查看文件的扩展属性。
[root@centos7 ~]# touch file1.txt
[root@centos7 ~]# lsattr file1.txt #查看文件默认的扩展属性。
---------------- file1.txt
[root@centos7 ~]# chattr +i file1.txt
[root@centos7 ~]# lsattr file1.txt
----i----------- file1.txt #可以看到文件具有i属性。
范例12-10: 查看目录的扩展属性。
[root@centos7 ~]# mkdir dir2
[root@centos7 ~]# ll -d dir2/
drwxr-xr-x. 2 root root 6 Oct 13 15:15 dir2/
[root@centos7 ~]# lsattr -d dir2/ #使用-d选项可以查看目录的扩展属性。
---------------- dir2/
[root@centos7 ~]# chattr +i dir2 #也可以对目录加锁。
[root@centos7 ~]# lsattr -d dir2/
----i----------- dir2/
12.11 本章重点
1)Linux基本9位权限之文件和目录权限的详细说明。
2)Linux基本9位权限之字符和数字(8进制)的权限知识。
3)权限及用户和用户组属性修改命令chmod、chown、chgrp。
4)默认权限umask以及系统目录安全案例。
5)掌握特殊权限suid相关知识,sgid和sticky的相关知识了解即可。
6)chattr和lsattr锁定一个文件防止被篡改或者删除的相关知识。