这一部分主要写一写关于Linux的权限。这一部分的演示内容基于的系统是CentOS7,使用的用户是notroot。
Linux权限说到Linux的权限,就要提及用户、组和文件。Linux下一切皆文件,准确的说用户的权限主要看文件权限,文件的权限决定了那些用户可以 *** 作。Linux默认最高权限是root用户,任何文件都可以读取、写入和执行。
用户Linux是个多用户的 *** 作系统,也就是可以多个用户同时在线 *** 作。Windows就是单用户的,只能一个用户登录。Linux中用户权限是通过UID来进行追踪的,UID是用户的唯一标识。这其中还会涉及到一个用户组,用户组也有一个唯一标识叫GID,用户组的权限也是通过GID跟踪。Linux的默认最高权限用户是root。
- /etc/passwd:提到用户,就会说一下这个文件。这个文件里包含了很多信息,任何用户都可以读,在以前的老版本系统里,这个文件还存储用户的密码hash,现在没有了,现在那个位置被改为x,为了更安全。文件内容如下:
#内容太多了,挑了几条(^=^) root:x:0:0:root:/root:/bin/bash mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin centos:x:1000:1000:centos:/home/centos:/bin/bash notroot:x:1001:1001:centos7:/home/notroot:/bin/bash
每一列的意思
Linux系统预留了500一下的UID值给系统用户,甚至有的服务要用特定的UID才能正常工作。系统自己创建了一些用户,比如ftp、mail等,在上面的示例中,我自己创建的只有notroot和centos罢了。
2. /etc/shadow:这个文件用于存储用户密码。这个文件并不是所有人都读取,只有root用户可以 *** 作。内容如下:
1 2 34 5 678 9 root:1fefVjKQxrnzcMrqi6dF3Liaia.::0:99999:7::: mail:*:17632:0:99999:7::: operator:*:17632:0:99999:7::: games:*:17632:0:99999:7::: ftp:*:17632:0:99999:7::: centos:$cFBq2XgWTlqQ0Ru4$G6D20.lL.4nrKIEGfAZAW3OswZusNTG.DmSrbhm3C9UcUxh6t04WE8pl.ZaXolHwbCAoHpdvnmc0/8QjtD3K51::0:99999:7::: notroot:1fefVjKQxrnzcMrqi6dF3Liaia.:18937:0:99999:7:::
每一列的意思:
- useradd:添加用户。参数如下表:
如果只执行useradd test -p 123456的话useradd有默认设置。我的虚拟机默认设置如下所示:
[root@localhost ~]# useradd -D GROUP=100 #默认加入的用户组是公共组 HOME=/home #home目录的位置,基本目录 INACTIVE=-1 #密码过期后不会被禁用 EXPIRE= #密码过期时间,不过期 SHELL=/bin/bash #用户默认shell SKEL=/etc/skel #默认将/etc/skel复制到用户home目录下 CREATE_MAIL_SPOOL=yes #在mail目录下创建一个用于接收邮件的目录
如果我们想要修改默认设置,那么就加入-D和需要修改的条目参数,比如修改一下HOME=/home
[root@localhost ~]# useradd -Db /home/test [root@localhost ~]# useradd -D GROUP=100 HOME=/home/test INACTIVE=-1 EXPIRE= SHELL=/bin/bash SKEL=/etc/skel CREATE_MAIL_SPOOL=yes
- userdel:删除用户。直接执行userdel test,只会删除/etc/passwd和/etc/shadow文件中的记录,不会删除用户的home目录,使用userdel -r test就会删除用户的home目录。这个命令的参数比较少,如果用户在登陆删不掉怎么办,执行userdel -f test,强制删除,很多场景都可以试一试。这里就有点像rm -rf test/。
- usermod:修改用户信息。参数和useradd命令差不多,但也有几个不一样的。
- chsh:修改用户的默认shell,chsh -s /bin/bash test。如果不知道有那些shell的话,可以使用chsh -l可以列出有哪些可用的shell。
- chfn:修改备注,在我使用的这个系统中,备注就是开机登录的时候看到的那个名字。可以直接执行chfn test,然后他会给出需要修改的内容。它也有参数,自行查看。
- chage:管理期限。
日期格式例如2021-09-11格式的日期。或者1970年1月1日起到该日期的天数。
组组是由一群用户共享相同的权限所组成的,它们共享的权限就是指组权限。组有唯一标识符组ID(GID),每创建一个用户,会默认创建一个同名的组,具体可以man useradd,看一下-g参数的解释,当然创建用户的时候可以直接指定组。
- /etc/group:组和用户一样,也有一个文件,文件的记录内容如下:
#内容比较多,挑几条,^=^ root:x:0: wheel:x:10: mail:x:12:postfix games:x:20: ftp:x:50: centos:x:1000:beiyong notroot:x:1001: #解释:组名:组密码(类似passwd):GID:组员
- /etc/gshadow:和/etc/shadow相似。组密码这个东西有,但是很少用,它允许非组内成员临时成为该组成员,类似于sudo命令的左右。内容如下:
root::: wheel::: mail:::postfix games::: ftp::: centos:!!::beiyong notroot:!:: #解释:组名:组密码(!代表空):组管理员:组员
- groupadd:创建组。groupadd abc,创建一个abc组。部分参数如下表:
- groupmod:修改组。可以修改组的GID和组名等。参数如下:
- groupdel:删除组。groupdel abc删除abc组。在一系列 *** 作之后发现怎么删不掉创建的组,而且创建的组莫名奇妙的多了个用户,只要把这个用户移动到其他组去,就可以删除这个组。原因就是使用了-o参数,当指定的GID和其中一个组相同时,就会获得这个组的成员,导致无法删除。当改变组关系的时候,需要重启一下才生效。
文件权限有所属主,所属组和其他人之分,每一个都对应一个读、写、执行权限。
drwxrwxr-x. 2 notroot notroot 6 Nov 22 04:01 directory -rw-rw-r--. 1 notroot notroot 7 Nov 22 04:26 file lrwxrwxrwx. 1 notroot notroot 4 Nov 22 04:38 link_file -> file
以上面的内容为例。“rwx”中,r表示读权限,w表示写权限,x表示执行权限,如果位置是-,则代表没有该权限。前面的d表示什么呢,d所在位置表示的类型,d表示这里是个文件夹,如果是-,就表示是一个文件,这个位置上还会有其他的标识,但是自用的情况下,估计遇到最多的就是d、l和-。每个标识的释义如下表:
上一次记录到ls命令的时候没有详细写,这里扯一句。权限后面的数字是文件的应用次数,比如给file文件创建一个硬链接的时候,1就会变成2。如下示例,其中创建了两个软连接和一个硬链接:
18517808 drwxrwxr-x. 2 notroot notroot 6 Nov 22 04:01 directory 36911567 -rw-rw-r--. 2 notroot notroot 7 Nov 22 04:26 file 36911550 lrwxrwxrwx. 1 notroot notroot 4 Nov 22 04:38 link_file -> file 36911565 lrwxrwxrwx. 1 notroot notroot 4 Nov 22 04:42 link_file1 -> file 36911567 -rw-rw-r--. 2 notroot notroot 7 Nov 22 04:26 link_file2
现在回归正题,rwx有三组,分别代表了文件或目录的所属主、所属组和其他的 *** 作权限。看下面的表,对应关系就比较清晰了。
举个例子:如果用户是notroot,此时对应了文件属主,就可以对该文件有读写权限,如果用户是else,但是else用户属于notroot组,此时对应的是属组,则对该文件有读写权限,如果是if用户,而且不属于notroot组,此时对应其他人,则对该文件只有读的权限。
注:目录和文件都有默认的权限,我的虚拟机看到的目录的默认权限是drwxrwxr-x,文件的默认权限是-rw-rw-r--。
默认权限在不同的系统中创建的文件和目录默认权限可能不同,我在kali中创建的文件和目录默认权限和centos7中创建的区别:
#kali -rw-r--r-- 1 notroot notroot 0 11月 22 22:58 test drwxr-xr-x 2 notroot notroot 4096 11月 22 22:59 test1 #centos. drwxrwxr-x. 2 notroot notroot 6 Nov 22 04:01 directory -rw-rw-r--. 2 notroot notroot 7 Nov 22 04:26 file
说实话,这种区别也是我在复习书本的时候才注意到这点的。
默认权限由一种叫“权限掩码”的东西确定。当文件和目录拥有所有权限时,权限展示为rwxrwxrwx,而掩码是记录文件和目录所没有的权限,所以拿centos7的目录来说,目录默认没有的权限就是-------w-,所以权限掩码记录的是目录没有写权限。
权限掩码用umask命令查看。centos7中看到的目录权限掩码如下:
[notroot@localhost ~]$ umask 0002
和看到的rwx不同,一个数字,一个字母。
文件权限数字表示文件权限可以用数字来表示,其转换方法就是二进制转八进制。每一个权限位对应一个二进制数值,文件或目录拥有某一项权限,则对应的二进制数为1,比如一个文件权限是rwxrw-r--,则对应如下表:
那么它的八进制表示就是754,所以可以说这个文件的权限是754。
计算方式:每三个二进制一组,2进制转8进制,最终拼凑起来就是最后的8进制数啦。
同理,权限掩码也是这样。这四位八进制掩码每一位表示的意思如下表:
二进制权限掩码对应关系如下表:
对应上表,0002所表示的用户没有的权限就是-------w-,也就是“其他人”没有写权限。
利用掩码,就可以算出目录和文件的默认权限,目录默认权限是777-002=775,也就是目录对应权限是rwxrwxr-x,文件默认权限是666-002=664,也就是文件对应权限是rw-rw-r--。利用八进制权限掩码计算八进制文件权限只用了后三位,没有用粘着位,因为粘着位有特殊作用。
注:文件默认满权限是666,因为文件一开始是任何人不能执行,所以777去掉可执行(x)权限,就是666。
文件的扩展权限Linux的文件权限如果只有属主、属组、其他人,那就会遇到一些问题。比如用户A给其他人创建了一个打卡程序write_A_file用于将考勤记录进用户A创建的文件file,最简单的办法就是赋予write_A_file程序其他人可执行的权限,赋予file其他人可读写权限,但是这样就会导致其他人绕过程序任意读写file。A只想自己 *** 作file。如果只给write_A_file一个其他人可执行权限的话,其他人运行的时候,只能 *** 作自己创建的file。所以这个时候就体现了特殊的权限位SUID和SGID的作用。
特殊权限位和普通权限的数字表示方法是一样的,权限掩码的第一位就是表示这个权限的,每一个二进制对应关系如下表:
每一个位置的作用如下:
SUID置位时,表示当文件被使用时,程序会以文件属主的权限运行。
SGID置位时,表示当文件被使用时,程序会以文件属组的权限运行。对于目录而言,目录中的文件会以目录的默认属组作为默认属组。
粘着位置位时,表示进程结束后文件还驻留再内存中。暂不了解这有啥用,回头知道了回来补上。
结合上面的例子,用户A只要给write_A_file赋予一个特殊权限,将SUID置位,那么任何人都不能直接 *** 作file,但是所有人运行write_A_file时,write_A_file就以用户A的权限运行,那么程序就可以 *** 作用户A创建的file文件。特殊权限不能乱给,否则会造成安全问题,假设write_A_file中允许用户执行任意系统命令,那么就可以利用该程序直接获得用户A的权限shell,完成越权 *** 作。
修改权限一是修改权限,二是修改属组和属主,三是修改默认权限。
chomd:修改权限命令。基本格式:chmod options mode file。mode参数可以是八进制模式,也可以是符号模式。options是可选的参数,详见man chmod,这里就不写啦。
八进制模式下修改权限示例
#起始权限 drwxrwxr-x. 2 notroot notroot 6 Nov 22 04:01 directory -rw-rw-r--. 1 notroot notroot 7 Nov 22 04:26 file #给directory权限rwxr-xr-x(755) [notroot@localhost documents]$ chmod 755 directory/ [notroot@localhost documents]$ ls -l total 4 drwxr-xr-x. 2 notroot notroot 6 Nov 22 04:01 directory -rw-rw-r--. 1 notroot notroot 7 Nov 22 04:26 file #给file权限rw-rw-rw-(666) [notroot@localhost documents]$ chmod 666 file [notroot@localhost documents]$ ls -l total 4 drwxr-xr-x. 2 notroot notroot 6 Nov 22 04:01 directory -rw-rw-rw-. 1 notroot notroot 7 Nov 22 04:26 file #给directory一个SUID的特殊权限(4),其余权限是rwxr-xr-x(755),合起来的八进制是4755。其他两个扩展权限位赋权同理。但是如果要把特殊权限去除的话,用八进制做不到好像。 [notroot@localhost documents]$ chmod 4755 directory/ [notroot@localhost documents]$ ls -l total 4 drwsr-xr-x. 2 notroot notroot 6 Nov 22 04:01 directory -rw-rw-rw-. 1 notroot notroot 7 Nov 22 04:26 file
符号模式比较复杂,但是省去了换算的烦恼。权限格式为[ugoa…][+-=][rwxXstugo]。每个字母释义如下表:
使用示例如下:
#起始权限 drwsrwsr-x. 2 notroot notroot 6 Nov 22 04:01 directory -rw-rw-rw-. 1 notroot notroot 7 Nov 22 04:26 file #给file属主怎加一个可执行权限 [notroot@localhost documents]$ chmod u+x file [notroot@localhost documents]$ ll -rwxrw-rw-. 1 notroot notroot 7 Nov 22 04:26 file #给file文件属组权限设置和属主相同 [notroot@localhost documents]$ chmod g=u file [notroot@localhost documents]$ ll -rwxrwxrw-. 1 notroot notroot 7 Nov 22 04:26 file #给file的属主、属组和其他人权限相同 [notroot@localhost documents]$ chmod ug=o file [notroot@localhost documents]$ ll -rw-rw-rw-. 1 notroot notroot 7 Nov 22 04:26 file #给file文件增加一个SUID特殊权限 [notroot@localhost documents]$ chmod u+s file [notroot@localhost documents]$ ll -rwSrw-rw-. 1 notroot notroot 7 Nov 22 04:26 file #去除directory中的特殊权限。 [notroot@localhost documents]$ chmod ug-s directory/ [notroot@localhost documents]$ ll total 4 drwxrwxr-x. 2 notroot notroot 6 Nov 22 04:01 directory
chown:修改属主,也支持改变属组。命令格式chown options owner[.group] file。owner可以是用户名,也可以是UID。先创建一个文件newfile,然后修改它的属主为beiyong此时需要root权限。示例如下:
-rw-rw-r--. 1 notroot notroot 0 Nov 27 01:48 newfile #切换root用户后,修改用户 [root@localhost documents]# chown beiyong newfile [root@localhost documents]# ll -rw-rw-r--. 1 beiyong notroot 0 Nov 27 01:48 newfile #还可以改变属组,beiyong用户的属组是centos。只改变属组也可以执行 #chown .centos newfile #如果用户名和组名相同,那么可以执行chown centos. newfile,将属主和属组全部改变 [root@localhost documents]# chown beiyong.centos newfile [root@localhost documents]# ll -rw-rw-r--. 1 beiyong centos 0 Nov 27 01:48 newfile #newdir下的文件和目录 drwxrwxr-x. 2 notroot notroot 6 Nov 27 02:02 chddir -rw-rw-r--. 1 notroot notroot 0 Nov 27 02:02 chfile
chgrp:修改属组。命令格式chgrp options group file,和chown差不多。只是说可能会用到两个参数。-R参数可以递归改变目录下的子目录和文件的属组,-h可以改变符号链接(软连接)的属组。使用示例如下:
drwxrwxr-x. 2 notroot notroot 6 Nov 27 02:00 newdir #修改属组为centos [root@localhost documents]# chgrp centos newdir/ [root@localhost documents]# ll drwxrwxr-x. 2 notroot centos 6 Nov 27 02:00 newdir #将newdir下的所有文件和目录都改为centos [root@localhost documents]# chgrp -R centos newdir/ [root@localhost documents]# ls newdir/ -l drwxrwxr-x. 2 notroot centos 6 Nov 27 02:02 chddir -rw-rw-r--. 1 notroot centos 0 Nov 27 02:02 chfile
注:任何用户都可以改变属组,但是前提是用户必须属于文件和目录的当前属组和目标属组
umask:查看、修改默认权限。使用示例如下:
#查看默认掩码 [notroot@localhost newdir]$ umask 0002 #修改默认掩码,修改的是当前用户下的,如果不修改特殊权限位的话,也可以只写3个数字。 #umask 022 [notroot@localhost newdir]$ umask 0022 [notroot@localhost newdir]$ umask 0022总结
无,有错误的话请指正。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)