本文转载自微信公众号「小姐姐味道」,作者小姐姐养的狗。转载本文请联系小姐姐味道公众号。
随着年龄的增加,我的经验越来越丰富,而记忆力却越来越差。为了应付繁重的日常事务,我不得不准备了长长的任务清单。每一条事项的背后,都在不断的提醒我:无论生活中充满什么惊喜,还是逃离不了它平庸的本质。
而我对时间,会更加的敏感。每次一次敲击键盘,都会调动骨关节的扭动,留下一洗不可撤回的痕迹: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--。文件权限分为三部分。
- 所有者权限,缩写为u。文件的所有者所拥有的权限。也就是root用户的权限,是rw-
- 组用户权限,缩写为g。文件所属组内所有用户的权限。因为root组内只有root一个用户,所以组用户权限是r--。
- 其他用户权限,缩写为o。其他不相关用户的权限,比如我们刚创建的zhang3、li4用户,对文件的权限就是r--。
- 全部,缩写为a,表示对上面三类用户集体操作。
那rw-这些东西是什么意思呢?
- r 表示可读权限。read。
- w 表示可写权限。write。
- x 表示可执行权限。execute。
- - 权限占位符,表示没有当前权限。
注意:一个用户拥有文件的w权限,并不代表就可以删除文件。w仅仅针对于文件内容来说的。
一个文件,有3类用户,每类用户,有3种权限。使用最简单的小学乘法,我们能够得出,一个文件的权限位,需要3x3=9个标志位表示。
我们的文件名称,叫做confirm777.sh,这个名字是随便起的么?当然不是,777在linux代表特殊的含义,它代表文件对所有用户具有可读、可写、可执行的权限。可以想象,如果每个文件都有这样的权限,系统将无安全可言。那这一串数字是怎么来的呢?可以看下面的对照表。
- r 4 读
- w 2 写
- x 1 执行
对以上三个属性进行任意组合,可以得到:
- 4 r-- 4+0+0
- 6 rw- 4+2+0
- 5 r-x 4+0+1
- 2 -w- 0+2+0
- 3 -wx 0+2+1
- 1 --x 0+0+1
- 7 rwx 4+2+1
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 表示允许读取目录中的文件名,但不能进入该目录
- w 表示允许用户修改目录,可以创建、迁移、删除、更名目录下的文件
- x 可以获得目录下文件的列表,以及进入目录,执行cd命令
关于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的一些文章,已经可以成为一个体系了。如果你跟踪至此,至少已经可以在平常的工作中游刃有余了。
xjjdog接下来会找一些让人欢迎的主题,而不是这么枯燥的知识点。毕竟,有的时候,人家毕竟还是个可爱的女孩纸嘛。
作者简介:小姐姐味道 (xjjdog),一个不允许程序员走弯路的公众号。聚焦基础架构和Linux。十年架构,日百亿流量,与你探讨高并发世界,给你不一样的味道。我的个人微信xjjdog0,欢迎添加好友,进一步交流。