清晨一场梦 2020-09-03
本文转载自微信公众号「小姐姐味道」,作者小姐姐养的狗。转载本文请联系小姐姐味道公众号。
随着年龄的增加,我的经验越来越丰富,而记忆力却越来越差。为了应付繁重的日常事务,我不得不准备了长长的任务清单。每一条事项的背后,都在不断的提醒我:无论生活中充满什么惊喜,还是逃离不了它平庸的本质。
而我对时间,会更加的敏感。每次一次敲击键盘,都会调动骨关节的扭动,留下一洗不可撤回的痕迹:windows的超级用户,名字叫做Administrator。这个单词太长了,我总也记不住。相对来说,linux的超级用户叫做root,只有四个字母。它的耗能值,比前者要低的多。
我们在第三小节,刚接触命令行的时候,就使用chmod命令,给普通文本文件,赋予了执行权限。本小节将看一下用户权限和文件权限这两个息息相关的概念,
1、添加用户
到现在为止,我们的系统中,还孤零零的只有这一个用户,是时候学学女娲,捏几个小泥人了。
首先创建两个用户:张三(zhang3)、李四(li4)。
[root@localhost ~]# useradd zhang3
查看下面命令的三个输出结果。
# 系统中多了一个叫做zhang3的组,group文件保存了系统的组信息 [root@localhost ~]# tail -n1 /etc/group zhang3:x:1000: # 系统中多了一个叫做zhang3的用户,shadow文件保存了它们的密码。很多安全渗透就是为了拿到它进行暴力破解 [root@localhost ~]# tail -n1 /etc/shadow zhang3:!!:18207:0:99999:7::: # home目录中,多了一个叫做zhang3的目录 [root@localhost ~]# ll /home --full-time total 0 drwx------. 2 zhang3 zhang3 83 2019-11-06 22:09:33.357165082 -0500 zhang3
接下来,给我们刚刚建立的用户,使用passwd设置一个密码。密码需要输入两次进行确认。如果想要更改密码,可以使用chpasswd命令。
[root@localhost ~]# passwd zhang3 Changing password for user zhang3. New password: BAD PASSWORD: The password is shorter than 8 characters Retype new password: passwd: all authentication tokens updated successfully.
那么如何删除一个现有的用户呢?这是通过userdel命令实现的。加上参数f,会在其他用户使用系统的时候,强制退出。
userdel -f zhang3
2、文件权限说明
从上面的命令执行结果中,我们发现了有两件非常有意思的东西。添加用户后,除了在密码文件shadow中增加了一些内容,同时还在group文件中添加了信息。这涉及到用户的两个属性:用户名,组名。
一个用户只有一个名称代号,但是可以有多个组。下面命令创建一个密码为123的用户li4,并给它追加一个叫做zhang3的组。可以看到/etc/group文件中的信息变更。
[root@localhost ~]# useradd -G zhang3 -p 123 li4 [root@localhost ~]# tail -n 2 /etc/group zhang3:x:1000:li4 li4:x:1001:
好啦,接下来切换到我们的文件权限上面。为了进行下面命令的验证,我们首先创建一个名字叫confirm777.sh的脚本文件。为了让脚本对所有用户可见,我们把它创建在/tmp目录下。
cat > /tmp/confirm777.sh <<EOF echo $USER id EOF
使用ll命令查看文件信息。
[root@localhost ~]# ll /tmp/confirm777.sh --full-time -rw-r--r--. 1 root root 13 2019-11-07 04:25:55.418254935 -0500 confirm777.sh
从ll的命令可以看出,文件的所有者是root用户,文件所属的组,也是root组,它的权限是rw-r--r--。文件权限分为三部分。
那rw-这些东西是什么意思呢?
注意:一个用户拥有文件的w权限,并不代表就可以删除文件。w仅仅针对于文件内容来说的。
一个文件,有3类用户,每类用户,有3种权限。使用最简单的小学乘法,我们能够得出,一个文件的权限位,需要3x3=9个标志位表示。
我们的文件名称,叫做confirm777.sh,这个名字是随便起的么?当然不是,777在linux代表特殊的含义,它代表文件对所有用户具有可读、可写、可执行的权限。可以想象,如果每个文件都有这样的权限,系统将无安全可言。那这一串数字是怎么来的呢?可以看下面的对照表。
对以上三个属性进行任意组合,可以得到:
3、文件权限更改
下面介绍三个文件权限相关的命令。一般常用的,就是chown和chmod。
chown 更改文件的所有者。chgrp 更改文件的组。chmod 更改文件权限。
接下来,我们把confirm777.sh的所有者和组,修改成刚刚创建的用户zhang3。
cd /tmp [root@localhost tmp]# chown zhang3:zhang3 confirm777.sh [root@localhost tmp]# ll confirm777.sh -rw-r--r--. 1 zhang3 zhang3 13 Nov 7 04:25 confirm777.sh
给文件所有者增加执行权限。然后分别切换到zhang3,li4用户执行一下。
通过su 命令,可以切换到其他用户,一般使用su -进行环境变量的清理;而命令id,能够看到当前正在执行的用户信息。
[root@localhost tmp]# chmod u+x confirm777.sh [root@localhost tmp]# su li4 [li4@localhost tmp]$ ./confirm777.sh bash: ./confirm777.sh: Permission denied [li4@localhost tmp]$ exit exit [root@localhost tmp]# su zhang3 [zhang3@localhost tmp]$ ./confirm777.sh root uid=1000(zhang3) gid=1000(zhang3) groups=1000(zhang3) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
可以看到,文件所有者zhang3可以执行文件,但不相关的li4,提示没有权限。接下来,我们验证用户组相关的权限位。
# 去掉zhang3的执行权限 root@localhost tmp]# chmod u-x confirm777.sh [root@localhost tmp]# ll confirm777.sh -rw-r--r--. 1 zhang3 zhang3 13 Nov 7 04:25 confirm777.sh # 增加zhang3组的执行权限,由于li4在zhang3组里,它拥有权限 [root@localhost tmp]# chmod g+x confirm777.sh [root@localhost tmp]# ll confirm777.sh -rw-r-xr--. 1 zhang3 zhang3 13 Nov 7 04:25 confirm777.sh # 切换到zhang3进行执行 [root@localhost tmp]# su - zhang3 [zhang3@localhost tmp]$ ./confirm777.sh bash: ./confirm777.sh: Permission denied [zhang3@localhost tmp]$ exit exit # 切换到li4进行执行 [root@localhost tmp]# su - li4 [li4@localhost tmp]$ ./confirm777.sh root uid=1001(li4) gid=1001(li4) groups=1001(li4),1000(zhang3) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
从命令的执行结果可以看出。这次,li4能够执行文件,相反的,zhang3却不能。
我们使用chmod命令来修改文件权限,使用的是类似于a+x这样的英文字母。拿第一个脚本来说,初始的权限是rw-r--r--,也就是644,在这种情况下,下面的两个脚本等效。
chmod u+x confirm777.sh chmod 744 confirm777.sh
可以看到,第二个命令,使用的是数字样式的权限位,多了一步人脑转换过程。这在日常的使用中,是非常不方便的。所以,使用符号法的表示方式,能够更加直观,非常推荐。
为了更直观的表现这个过程,我专门制作了一张图。
4、目录权限
这里有一个非常有意思的地方。把文件设置成可执行,可以把普通文件变成脚本,目录文件的可执行权限是什么鬼?有什么意义?对文件夹来说:
关于r和x的区别,可以看下面的命令结果,仔细感受一下它们的区别。一般的,几乎所有的目录,都拥有执行权限,不要随意对其进行设置。
[root@localhost tmp]# su - li4 [li4@localhost ~]$ cd /tmp [li4@localhost tmp]$ mkdir nox [li4@localhost tmp]$ touch nox/{a,b,c,d} [li4@localhost tmp]$ chmod a-x nox [li4@localhost tmp]$ ls nox ls: cannot access nox/a: Permission denied ls: cannot access nox/b: Permission denied ls: cannot access nox/c: Permission denied ls: cannot access nox/d: Permission denied a b c d [li4@localhost tmp]$ cat nox/a cat: nox/a: Permission denied [li4@localhost tmp]$ chmod a+x nox [li4@localhost tmp]$ chmod a-r nox [li4@localhost tmp]$ ls nox ls: cannot open directory nox: Permission denied
5、sticky bit
接下来,我们介绍一个比较烧脑的粘贴位。
假如你要删除一个文件,你可以没有这个文件的写权限,但是你必须要拥有这个文件上级目录的写权限。如何创建一个目录,可以让任何人些人文件,但是又不能删除其他用户的文件?这就是stick bit的作用。粘贴位一般只用于目录上,对文件来说并没有什么用处。粘贴位一般使用t表示。
我们可以看一个典型的目录/tmp
[root@localhost tmp]# ls -dl /tmp drwxrwxrwt. 9 root root 4096 Nov 7 06:27 /tmp
可以看到,最后一位,显示的是t,而不是x,意思是普通用户不能删除其他用户的文件。所有用户在/tmp目录中,都可以随意创建文件,但是却删除不了其他人的文件,即使文件的权限是777。
[root@localhost tmp]# touch /tmp/stick [root@localhost tmp]# chown li4:li4 /tmp/stick [root@localhost tmp]# chmod 777 /tmp/stick [root@localhost tmp]# su - zhang3 [zhang3@localhost ~]$ rm /tmp/stick rm: cannot remove ‘/tmp/stick’: Operation not permitted
6、小结
本小节创建了两个用户zhang3和li4,并拿它们测试了chown和chmod命令,最后介绍了粘贴位。linux比较安全的原因,就是因为有比较详尽的权限划分。但权限是枚双刃剑,超权用户一个命令就可以搞垮系统,许多隐藏的木马,通过提权运行在不为人知的地方。
权限相关的几个命令会经常被使用,下面举几个例子。
# 设置/var/lib/mysql的用户和组为mysql chown -R mysql:mysql /var/lib/mysql # 设置目录可读可写,能够上传文件 chmod 777 /var/www/uploads # 增加本目录下所有sh的执行权限 chomd a+x *.sh # 变更file为可读可写可执行 chmod u=rwx,g=rwx,o=rwx file
7、思考&扩展
1、下面这个命令,执行以后,会发生什么情况?警告:不要执行,哪怕把000改成其他数字。
# R遍历子目录的意思 chmod -R 000 /
2、有一天,我看到一个命令chmod u+s file,文中并没有介绍s是什么意思,这是什么意思?
3、如何删除一个用户的组?
EndLinux系统的命令是十分枯燥的。本系列不知不觉已经持续了8个周。和预想的一样,它并未取得广泛的欢迎,从它和其他文章迥然的阅读量就可以看出--标题就让人失去了点击的欲望。
技术类文章完全不同于扯淡型的天马行空,耗费的精力也是巨大的,尤其对我一个对正确性有强迫症的人来说。有时候,我会产生迷茫。不知道这依靠兴趣支撑的输出,能够持续多久。
能够翻到结尾,翻到这里的朋友,xjjdog非常感谢。还有几篇就要结束了,加上以前关于Linux的一些文章,已经可以成为一个体系了。如果你跟踪至此,至少已经可以在平常的工作中游刃有余了。