初学Linux之用户、组和权限
前面我们了解了计算机标准I/O 和管道的主要知识,理解了系统中的数据输入端口和输出端口,以及将数据以数据流进行传递的处理方法。有数据,就会有输入数据的人,输入的数据需要以文件的方式进行保存,为了数据的安全,不同的人对数据的所有权限是不同的,当使用的人多了,会有分组的情况。 若是我们将输入数据的人称作用户,那么多个用户也就形成了用户组,不同的用户都有自己的文件,为了数据的安全,有必要对自己或者组,以及他人文件的设置对应的操作权限,防止破坏他人的数据,也保护了自己的数据。
到此,我们需要学习对用户、组和权限进行相关设置的方法,这是非常重要的。
一、用户和组管理命令
在了解用户和组管理命令之前,基于Linux一切皆文件的理念,我们有必要了解哪些文件是用户和组相关的文件,以及这些文件的相关权限。
1、用户相关
与用户本身相关的文件是 /etc/passwd ,这个文件包含了以下方面的信息:
通过这些简单的信息,可以看出这个文件是存储用户基本的信息的文件,我们在主机登陆时提交的用户名和密码,必须要和这个文件中的相对应才能成功登陆系统。从这方面来看,这个文件本身也是非常重要,由于涉及到系统登陆信息,若是有任何的不慎造成删除或者修改,都会导致某个用户无法登陆,若是管理员(root)的信息被恶意修改,也会导致系统无法正常启动的情况。文件中每个用户处理本身的UID外还有一个 GID,除了系统或者人为指定的情况外,这个GID是和UID在数字上一般是相同的,这也说明,一个用户在创建后,本身还会同时创建一个以这个用户为组名的“组”。另外文件中的密码都是X代替,没有直接显示,说明还有一个文件是针对密码进行描述的,和用户密码对应的文件就是 /etc/shadow 。
使用 cat 命令分别打开两个文件,可以看到一个两个文件的用户是一一对应的,同时可以看到管理员帐户(root)和下面那些 shell 为/sbin/nologin的用户相比,多了很长的一段字符串,在这里可以知道,这个字符串本身就是密文加密过的用户密码。正常情况下,需要手动登陆的用户也是有加密过的密码,同时,只要加密的密码才是正常有效的,若是明文密码出现在 /etc/shadow 用户名的后面,即使登录时输入一致也是无法登陆的。/etc/shadow 文件的信息格式如下(以分号隔开)
对用户进行管理的命令,就是对以上者这些信息进行管理的,一般包括 useradd、usermod、userdel,分别对应的是添加新用户,对已有用户进行修改,对已有用户进行删除的操作。
useradd 命令使用方法非常的通俗易懂,当然,若是缺省了这些选项的情况下,系统也有默认指定信息的。在 /etc/default/useradd 文件中,就定义了useradd 命令没有任何选项指定的情况下,创建新用户的信息。
显示或更改默认设置的命令: useradd -D ;useradd –D -s SHELL ;useradd –D –b BASE_DIR ;useradd –D –g GROUP 。
由于都是对用户本身的相关信息进行设置,所有 usermod 命令就有很多选项定义的内容和 useradd 相同,比如 -u、-g、-G、-s、-d、-c,这几个选项也是比较常用的。
userdel 是删除已有用户的命令,它的使用比较简单,只有一个 -r 选项,去除用户的同时,删除对应的家目录。
还有一些常用的和用户相关的命令:id ,su。
id 这个命令可以随时查看用户相关的ID信息,用法如右图所示。
su 命令是在当前的端口不退出登陆的情况下,直接切换到指定用户的身份进行操作的命令。可以使用 exit 命令回到原先的用户。
newusers 命令根据数据格式和 /etc/passwd 文件相同的文件,批量地创建用户。
以上以及描述了和用户相关的命令,接下来是关于用户密码相关的命令:passwd ,chage。
passwd 命令是设置密码的命令,没有选项的情况下,可以对用户的密码进行修改;在使用选项的情况下,可以对密码的属性进行相关操作。而 chage 命令本身只是对密码的相关属性进行设置的命令,不能对用户的密码进行修改。
另外,chfn 命令可以交互式的指定用户的GECOS信息,chsh 命令则是交互式的指定用户的shell,finger 命令可以显示用户的相关信息。我们可以查询 man 帮助列表,对这些命令作进一步的了解。
2、组相关
前文介绍了用户相关的文件和命令,对应的,用户的组也有对应的文件。文件包括 /etc/group 和/etc/gshadow ,它们分别对应的是用户组基本的信息,以及用户组密码的管理。文件中的内容是一一对应,也有互相重复的情况,值得注意的是,/etc/gshadow 文件中的组管理员列表指定的是用户组的管理员。
和用户组相关的命令包括 groupadd、groupmod、groupdel,分别对应的是用户组的添加(只有组没有对应id的用户),组属性的修改,用户组的删除。
groupadd中的 -r 选项是针对系统组的,useradd命令也是有这个选项的,系统用户和系统组是Linux操作系统启动过程中对一些启动相关文件进行使用而建立的,系统安装成功后自动存在的, 这些用户和组的shell类型是/sbin/nologin ,本身不具备登陆功能。这些组很简单的对组本身的属性(ID、名称)进行了定义,但是对组内部的数据是无法修改的,比如说密码、成员等等,这就需要下面两个命令:gpasswd、groupmems。
gpasswd命令在不加选项的情况下,可以更改指定组的密码,-A 选项也可以设置组管理员。
二、理解文件权限和默认权限
以上我们已经了解了用户和组相关的文件、命令,是否是所有的成员对这些文件,命令都能任意使用呢?当然不是的,我们用su 命令临时切换到wang用户身份,使用 cat 命令可查看 /etc/passwd 文件的内容,当使用 nano 工具对这个文件进行修改时,退出保存出现了报错提示: [ Error writing /etc/passwd: Permission denied ] 。说明wang 用户的身份对于 /etc/passwd 这个文件,可以读取数据,但是不能写入更改。
读写的英文单词分别是 read、write ,对应的首字母是 r、w ,我们列表显示 /etc/passwd ,发现文件类型(文件系统)到大小之间的显示是 :rw-r–r– root root (略去链接数),这个信息就表示权限、所有者(创建用户)、所属组(创建时所在的组),权限有9个字符,前三个是和所有者相关,中间三个是所属组相关,最后三个是和其他人相关。每三个分别对应 r 、w 、x,这里的 x 对应的英文单词是 execute ,取第二个字母 x ,是执行权限,普通文件一般是不带的,一般是二进制的程序文件或者是脚本文件带有,目录是要有 x 的,这个 x 项决定了对应的用户是否能够进入到目录的内部。对文件权限的理解有以下总结:
使用管理员帐户root 和普通用户 wang 分别在自己的家目录中创建文件和目录,查看两者的区别。
可以看到,不同用户创建文件和目录的默认权限是不相同的,为了方便输入和表示,可以使用对应的数字进行代替(括号中的是二进制):r=4(100),w=2(010),x=1(001)。对应所有者、所属组、其他用户,再将这些单独的数字进行相加,之后组合成三个数字的组合,上面图片中的文件目录权限的数字表示分别是:aaa(644)、ccc(755)、bbb(664)、ddd(775)。
这个是由用户的 umask 值决定的,非特权用户umask是 002 ,root 的 umask 是 022 ,umask 值可以使用 umask 命令设置并查看,用法如下:
对于umask值计算得到创建文件和目录的默认权限的算法原理(以root为例)如下:
简单的总结就是:新建FILE权限: 666-umask 如果所得结果某位存在执行(奇数)权限,则将其权限+1 。新建DIR权限: 777-umask。这些计算都是二进制计算后转换成10进制表示的。
三、设置文件权限
当我们创建的文件或目录的默认权限不满足我们使用的情况下,有必要对一些文件的权限进行更改,比如,普通用户对这个文件无法读取,但是又需要读取和了解文件的内容,这时可以对文件加上 r 权限,就能成功的解决,若是有的目录,我不希望其他的用户查看,更改,进入,则将这个文件的权限设置为770,那么除了所有者和属组里的用户,就没有办法访问这个目录了。
在更改具体的权限前,我们可以尝试更改文件的所有者和所属的组。chown 设置文件的所有者 ,chgrp 设置文件的属组信息。
更改用户权限的命令是:chmod ,这个命令的用户有两者模式,一个是字母表示,另一个是数字表示,字母表示时:u 、g 、o 分别对应的是所有者(user)、所属组(group)、其他用户(others),这样是比较直观的。也可以使用数字法一步到位,输入命令时是比较简单的。具体的用法和示例如下:
四、特殊权限
前面我们提到了 /etc/shadow 这个文件是root 用户才具有 w 权限的,但是实际中,我们登陆 wang 用户,使用 passwd 命令,更改了用户wang 的登陆密码,之后打开/etc/shadow 文件,发现文件的密码出现了变化,这是如何情况呢?其实这不是对文件的之间修改,只是通过一个命令实现的操作,我们可以查看这个命令对应的文件进行了解。
图片中我们可以看到,这个/usr/bin/passwd 文件普通用户是有执行权限的,但是对应 /etc/passwd,普通用户是没有执行权限的,但是在权限上的 所有者的权限 x 位是 s,不是x,这里就是后面的原因了,这个就是接下来学习的 文件的特殊权限。
文件的特殊权限有三个,分别是 SUID 、SGID、Stiky。
1、SUID
SUID 是在可执行文件上设置的特殊权限,在文件的权限位显示位所有者的 x 位,以 s 显示。这个特殊权限的作用是让普通的用户在执行有 x 权限的程序文件时,本身暂时成为了程序文件的所有者,这时,这个普通用户就可以对文件所有者对应的文件进行程序文件对应的操作。还是以 passwd 这个命令为例,passwd 对应的程序文件 /usr/bin/passwd 已经设置了SUID,同时普通用户有 x 权限,文件的所有者是 root ,当普通的用户 wang 执行 passwd 命令时,由于SUID 的作用,此时,用户wang暂时以root的身份执行 passwd 程序对应的操作,就对 所有者为root的文件具备了相应的权限,/etc/passwd 文件所有者是 root ,对应的权限是 r 和 w ,最终,用户 wang通过这个命令,对/etc/passwd 文件完成了w操作。
需要注意的是 SUID 只对二进制可执行程序有效,若是对目录进行设置,本身是没有意义的。设定的方法是:(1)chmod u+s FILE… (2)chmod u-s FILE…(3)chmod 4755 (数字法) FILE…. ;
2、SGID
从SGID的名称上,我们就可以看出,这个是作用在文件或者目录权限的属组 x 位上,它的数字表示位 2 ,特点是:作用在可执行程序文件上时,对文件有执行权限的普通用户,将获得属组的身份,此时,对属组的文件可以执行程序文件对应的操作;作用在目录上,对目录有 w 权限的用户,在这个目录下新建的目录,将继承目录的所属组,同时还会继承 SGID,创建的文件不会继承 SGID。
SGID的设定 :(1)chmod g+s FILE… ;(2)chmod g-s FILE… ;(3)chmod 2644 FILE… ; (4) chmod g+s DIR… ;(5)chmod g-s DIR…;(6)chmod 2755 DIR… ;
3、Stiky
Stiky 称作为粘滞位 ,显示在目录权限 other 的 x 位,权限的字母表示为 t ,数字表示为 1 ,只能作用在目录,具有sticky权限的目录,普通用户只能删除自己的文件。
设置的方法:(1)chmod o+t 目标目录… ;(2)chmod o-t 目标目录… ;(3)chmod 1775 目标目录… 。
注:SUID 、SGID 、Stiky 三个特殊权限都是在对应的权限有 x 权限下生效的,若是文件或者目录去除了 x 权限,那么三个特殊权限也会失效,此时在文件权限位上的表示,由原来的小写变为大写。
五、ACL
ACL:Access Control List,对文件和目录实现灵活的权限管理 ,除了文件的所有者,所属组和其它人,可以对更多的用户设置权限。需要指出的是:CentOS7 默认创建的xfs和ext4文件系统具有ACL功能 CentOS7 之前版本,默认手工创建的ext4文件系统无ACL功能,需手动通过两步命令增加 (1)tune2fs –o acl /dev/sdb1; (2)mount –o acl /dev/sdb1 /mnt/test 。ACL生效顺序:所有者,自定义用户,自定义组,其他人 。用户权限优先 (若是匹配到用户权限,组权限再大也不匹配), 多个组累加权限。
在没有任何人为更改的情况下,文件和目录本身是具备基础的 ACL ,称为 base ACL ,在对 ACL 进行的设置更改后,查询的ACL将是 extended ACL 。base ACL 是不能清除的,清除了 extended ACL 后,将还原到文件最初的 base ACL 。
查看某个文件或者目录的 ACL信息 :getfacl file | directory 。
设置ACL的命令是 setfacl ,具体的用法如下:
当我们设置了 extended ACL 之后,ACL信息中会出现一个 mask 选项,ACL文件上的group权限是mask 值(自定义用户,自定义组 ,拥有组的最大权限),而非传统的组权限 ,自定义用户、自定义组 、拥有组,只有在这个mask 值范围内的权限才会生效,若是设定的超出了mask 权限的范围,一般在ACL信息中会出现实际生效权限的提示。单独设置ACL中的 mask 权限值的方法示例: setfacl -m mask::rx file 。
注意:通过ACL赋予目录默认x权限,目录内文件也不会继承x权限 。
ACL是可以备份的,主要的文件操作命令cp和mv都支持ACL,只是cp命令需要 加上-p 参数。但是tar等常见的备份工具是不会保留目录 和文件的ACL信息 。使用了不支持ACL 的命令对文件或者目录进行操作,设置了extended ACL 的可以备份后再恢复即可。
(1)getfacl -R /tmp/dir1 > acl.txt ;(2) setfacl –restore acl.txt (在哪个目录下备份 getfacl ,就在哪个目录下操作)。
本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/89680