首页 >> 大全

二、用户身份与文件权限

2023-11-17 大全 29 作者:考证青年

Linux 是一个多用户、多任务的操作系统,具有很好的稳定性与安全性,在幕后保障 Linux系统安全的则是一系列复杂的配置工作。本文将详细讲解文件的所有者、所属组以及其他人可对文件进行的读(r)、写(w)、执行(x)等操作,以及如何在 Linux 系统中添加、删除、修改用户账户信息。我们还可以使用 SUID、 SGID 与 SBIT 特殊权限更加灵活地设置系统权限功能,来弥补对文件设置一般操作权限时所带来的不足。隐藏权限能够给系统增加一层隐形的防护层,让黑客最多只能查看关键日志信息,而不能进行修改或删除。而文件的访问控制列表( List, ACL)可以进一步让单一用户、用户组对单一文件或目录进行特殊的权限设置,让文件具有能满足工作需求的最小权限。最后还将讲解如何使用 su 命令与 sudo 服务让普通用户具备管理员的权限,不仅可以满足日常的工作需求,还可以确保系统的安全性。

1.用户身份与能力

➢用户身份:管理员 UID 为 0:系统的管理员用户。

➢系统用户 UID 为 1~999: Linux 系统为了避免因某个服务程序出现漏洞而被黑客提权至整台服务器,默认服务程序会有独立的系统用户负责运行,进而有效控制被破坏范围。

➢普通用户 UID 从 1000 开始:是由管理员创建的用于日常工作的用户。

注:UID 是不能冲突的,而且管理员创建的普通用户的 UID 默认是从 1000开始的(即使前面有闲置的号码)

为了方便管理属于同一组的用户, Linux 系统中还引入了用户组的概念。通过使用用户组号码(GID, Group ),我们可以把多个用户加入到同一个组中,从而方便为组中的用户统一规划权限或指定任务。假设有一个公司中有多个部门,每个部门中又有很多员工。如果只想让员工访问本部门内的资源,则可以针对部门而非具体的员工来设置权限。例如,可以通过对技术部门设置权限,使得只有技术部门的员工可以访问公司的数据库信息等。

另外,在 Linux 系统中创建每个用户时,将自动创建一个与其同名的基本用户组,而且这个基本用户组只有该用户一个人。如果该用户以后被归纳入其他用户组,则这个其他用户组称之为扩展用户组。一个用户只有一个基本用户组,但是可以有多个扩展用户组,从而满足日常的工作需要。

:建立用户帐号

语法格式 [] LOGIN

说明:

-c<备注>  加上备注文字。备注文字会保存在passwd的备注栏位中。
-d<登入目录>  指定用户登入时的起始目录。
-D  变更预设值.
-e<有效期限>  指定帐号的有效期限。
-f<缓冲天数>  指定在密码过期后多少天即关闭该帐号。
-g<群组>  指定用户所属的群组。
-G<群组>  指定用户所属的附加群组。
-m  自动建立用户的登入目录。
-M  不要自动建立用户的登入目录。
-n  取消建立以用户名称为名的群组.
-r  建立系统帐号。
-s   指定用户登入后所使用的shell。
-u  指定用户ID。

实例:创建一个普通用户并指定家目录的路径、用户的 UID 以及 Shell 解释器。在下面的命令中,请注意/sbin/,它是终端解释器中的一员,与 Bash 解释器有着天壤之别。一旦用户的解释器被设置为 ,则代表该用户不能登录到系统中:

[root@LB-nginx-01 ~]# useradd -d /home/centos/ -u 8888 -s /sbin/nologin centos
[root@LB-nginx-01 ~]# id centos
uid=8888(centos) gid=8888(centos) 组=8888(centos)

:创建用户组

语法格式: [] group

说明:

-g:指定新建工作组的 id;
-r:创建系统工作组,系统工作组的组ID小于 500;
-K:覆盖配置文件 "/ect/login.defs";
-o:允许添加组 ID 号不唯一的工作组。
-f,--force: 如果指定的组已经存在,此选项将失明了仅以成功状态退出。当与 -g 一起使用,并且指定的GID_MIN已经存在时,选择另一个唯一的GID(即-g关闭)

实例:创建一个组,指定ID为666

[root@LB-nginx-01 ~]# groupadd -g 666 centoslinux
[root@LB-nginx-01 ~]# cat /etc/group | tail -1
centoslinux:x:666:

:删除群组

语法格式: [] GROUP

实例:删除群组

[root@LB-nginx-01 ~]# groupdel centos

:修改用户的属性

语法格式: [] LOGIN

说明:

-c<备注>        修改用户帐号的备注文字。
-d登入目录>   修改用户登入时的目录。
-e<有效期限>  修改帐号的有效期限。
-f<缓冲天数>  修改在密码过期后多少天即关闭该帐号。
-g<群组>     修改用户所属的群组。
-G<群组>     修改用户所属的附加群组。
-l<帐号名称>  修改用户帐号名称。
-L          锁定用户密码,使密码无效。
-s   修改用户登入后所使用的shell。
-u    修改用户ID。
-U        解除密码锁定。

实例:

[root@LB-nginx-01 ~]# id centos   #查看原来状态
uid=8888(centos) gid=8888(centos) 组=8888(centos)
[root@LB-nginx-01 ~]# usermod -g yu centos    #更改基本组为yu
[root@LB-nginx-01 ~]# id centos
uid=8888(centos) gid=8889(yu) 组=8889(yu)
[root@LB-nginx-01 ~]# usermod -G root centos    #将用户centos加入到root组内
[root@LB-nginx-01 ~]# id centos
uid=8888(centos) gid=8889(yu) 组=8889(yu),0(root)
[root@LB-nginx-01 ~]# usermod -u 9999 centos     #将用户的UID改为9999
[root@LB-nginx-01 ~]# id centos
uid=9999(centos) gid=8889(yu) 组=8889(yu),0(root)
[root@LB-nginx-01 ~]# usermod -s /bin/bash centos    #更改用户登入后所使用的shell为/bin/bash
[root@LB-nginx-01 ~]# cat /etc/passwd | tail -1
centos:x:9999:8889::/home/centos/:/bin/bash

:更改用户密码

语法格式: [-k] [-l] [-u [-f]] [-d] [-e] [-n ] [-x ] [-w ] [-i ] [-S] [--stdin] []

说明:

-S:查询用户密码的状态,也就是 /etc/shadow 文件中此用户密码的内容。仅 root 用户可用;
-l:暂时锁定用户,该选项会在 /etc/shadow 文件中指定用户的加密密码串前添加 "!",使密码失效。仅 root 用户可用;
-u:解锁用户,和 -l 选项相对应,也是只能 root 用户使用;
--stdin:可以将通过管道符输出的数据作为用户的密码。主要在批量添加用户时使用;
-n 天数:设置该用户修改密码后,多长时间不能再次修改密码,也就是修改 /etc/shadow 文件中各行密码的第 4 个字段;
-x 天数:设置该用户的密码有效期,对应 /etc/shadow 文件中各行密码的第 5 个字段;
-w 天数:设置用户密码过期前的警告天数,对于 /etc/shadow 文件中各行密码的第 6 个字段;
-i 日期:设置用户密码失效日期,对应 /etc/shadow 文件中各行密码的第 7 个字段。
-d:使该用户可用空密码登录系统
-e:强制用户在下次登录时修改密码

实例:

[root@localhost ~]# echo "123456" | passwd --stdin centos   #更改centos的密码为123456
Changing password for user centos.
passwd: all authentication tokens updated successfully.
[root@localhost ~]# passwd -l centos      #锁定centos用户,禁止登陆系统
Locking password for user centos.
passwd: Success
[root@localhost ~]# passwd -S centos   #查看用户密码状态,为锁定状态
centos LK 2021-01-11 0 99999 7 -1 (Password locked.)
[root@localhost ~]# passwd -u centos   #解锁用户
Unlocking password for user centos.
passwd: Success
[root@localhost ~]# passwd -S centos   #查看用户密码状态,为设置密码正常状态
centos PS 2021-01-11 0 99999 7 -1 (Password set, SHA512 crypt.)
[root@localhost ~]# passwd -x 60 -i 10 centos   #设置用户密码60 天变更、10 天密码失效
Adjusting aging data for user centos.
passwd: Success
[root@localhost ~]# passwd -S centos   #查看设置的有效期(可直接在/etc/shadow直接更改)
centos PS 2021-01-11 0 60 7 10 (Password set, SHA512 crypt.)

:删除用户

语法格式: [] LOGIN

说明:

-f:强制删除用户
-r:同时删除用户及用户家目录

实例:

[root@LB-nginx-01 ~]# id centos   #查看用户
uid=9999(centos) gid=8889(yu) 组=8889(yu),0(root)
[root@LB-nginx-01 ~]# userdel -r centos  #删除用户以及家目录
userdel:组“centos”没有移除,因为它不是用户 centos 的主组
[root@LB-nginx-01 ~]# id centos   #已删除
id: centos: no such user
[root@LB-nginx-01 ~]# groupdel centos  #因为把用户本来的主组改成yu,所以没有删除centos组,次步骤为删除组

: Linux 下工作组文件 /etc/group 和 /etc/ 管理工具,用于将一个用户添加到组或者从组中删除。

语法格式: [] group

说明:

-a:添加用户到组;
-d:从组删除用户;
-A:指定管理员;
-M:指定组成员和-A的用途差不多;
-r:删除密码;
-R:限制用户登入组,只有组中的成员才可以用newgrp加入该组。

实例:将userA添加到用户组里面:

[root@localhost ~]# gpasswd -a userA groupB

注意:添加用户到某一个组可以使用 -G userA 这个命令可以添加一个用户到指定的组,但是以前添加的组就会清空掉,所以想要添加一个用户到一个组,同时保留以前添加的组时,请使用这个命令来添加操作用户。

从wheel组内删除用户

[root@localhost ~]# gpasswd -d centos1 wheel
Removing user centos1 from group wheel
[root@localhost ~]# id centos1
uid=1001(centos1) gid=1001(centos1) groups=1001(centos1)

2.Linux 的文件权限

尽管在 Linux 系统中一切都是文件,但是每个文件的类型不尽相同,因此 Linux 系统使用了不同的字符来加以区分,常见的字符如下所示。

➢ -:普通文件。

➢ d:目录文件。

➢ l:链接文件。

➢ b:块设备文件。

➢ c:字符设备文件。

➢ p:管道文件。

在 Linux 系统中,每个文件都有所属的所有者和所有组,并且规定了文件的所有者、所有组以及其他人对文件所拥有的可读(r)、可写(w)、可执行(x)等权限。对于一般文件来说,权限比较容易理解:“可读”表示能够读取文件的实际内容;“可写”表示能够编辑、新增、修改、删除文件的实际内容;“可执行”则表示能够运行一个脚本程序。但是,对于目录文件来说,“可读”表示能够读取目录内的文件列表;“可写”表示能够在目录内新增、删除、重命名文件;而“可执行”则表示能够进入该目录。文件的读、写、执行权限可以简写为 rwx,亦可分别用数字 4、 2、 1 来表示,文件所有者,所属组及其他用户权限之间无关联所示。文件权限的数字法表示基于字符表示(rwx)的权限计算而来,其目的是简化权限的表示。例如,若某个文件的权限为 7 则代表可读、可写、可执行(4+2+1);若权限为 6 则代表可读、可写(4+2)。其所有者拥有可读、可写、可执行的权限,其文件所属组拥有可读、可写的权限;而且其他人只有可读的权限。那么,这个文件的权限就是 rwxrw-r–,数字法表示即为 764。

包含了文件的类型、访问权限、所有者(属主)、所属组(属组)、占用的磁盘大小、修改时间和文件名称等信息。通过分析可知,该文件的类型为普通文件,所有者权限为可读、可写(rw-),所属组权限为可读(r–),除此以外的其他人也只有可读权限(r–),文件的磁盘占用大小是 34298 字节,最近一次的修改时间为 4 月 2 日的凌晨 23 分,文件的名称为 .log。

chmod:修改文件、目录的权限

语法格式:chmod [] mode file...

说明:

-c: 只有在文件的权限确实改变时才进行详细的说明-f: 不输出权限不能改变的文件的错误信息-v: 详细说明权限的变化
-R:改变目录及其所有子目录的文件的权限
[mode] 
权限设定字串: [ugoa...][[+-=][rwxX]...][,...]
[ugoa...]:u 表示该档案的拥有者,g 表示与该档案的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示所有(包含上面三者)。
[+-=]: + 表示增加权限,- 表示取消权限,= 表示唯一设定权限。
[rwxX]: r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该档案是个子目录或者该档案已经被设定过为可执行。
[file...]:文件列表(单个或者多个文件、文件夹)

权限身份名称填什么_用户文件夹权限_

实例:

[root@LB-nginx-01 ~]# ll test 
-rw-r--r-- 1 root root 5 1月  13 20:23 test
[root@LB-nginx-01 ~]# chmod 777 test  #数字形式:设所有人可读写执行
[root@LB-nginx-01 ~]# ll test 
-rwxrwxrwx 1 root root 5 1月  13 20:23 test
[root@LB-nginx-01 ~]# chmod ugo-r test    #字符形式:取消掉所有人的读权限
[root@LB-nginx-01 ~]# ll test 
--wx-wx-wx 1 root root 5 1月  13 20:23 test
[root@LB-nginx-01 ~]# chmod 444 test    #数字形式:设所有人仅有读权限
[root@LB-nginx-01 ~]# ll test 
-r--r--r-- 1 root root 5 1月  13 20:23 test
[root@LB-nginx-01 ~]# chmod 421 test   #数字形式:设置所有者读权限,用户组写权限,其他用户执行权限
[root@LB-nginx-01 ~]# ll test
-r---w---x 1 root root 5 1月  13 20:23 test
[root@LB-nginx-01 ~]# chmod ugo+w test  #字符形式:给所有人增加写权限
[root@LB-nginx-01 ~]# ll test 
-rw--w--wx 1 root root 5 1月  13 20:23 test
[root@LB-nginx-01 ~]# chmod o+r test   #字符形式:给其他用户增加读权限
[root@LB-nginx-01 ~]# ll test 
-rw--w-rwx 1 root root 5 1月  13 20:23 test

chown:将指定文件的拥有者改为指定的用户或组,用户可以是用户名或者用户ID;组可以是组名或者组ID;文件是以空格分开的要改变权限的文件列表,支持通配符。系统管理员经常使用chown命令,在将文件拷贝到另一个用户的名录下之后,让用户拥有使用该文件的权限。

语法格式:chown [] user [:group] file...

说明:

-c :显示更改的部分的信息
-f :忽略错误信息
-h :修复符号链接
-R: 处理指定目录以及其子目录下的所有文件
-v :显示详细的处理信息
-deference :作用于符号链接的指向,而不是链接文件本身

实例:

[root@LB-nginx-01 ~]# chown :yu test  #只更改使用者组为yu
[root@LB-nginx-01 ~]# ll test 
-rw--w-rwx 1 root yu 5 1月  13 20:23 test
[root@LB-nginx-01 ~]# chown yu test #只更改所有者为yu
[root@LB-nginx-01 ~]# ll test 
-rw--w-rwx 1 yu root 5 1月  13 20:23 test
[root@LB-nginx-01 ~]# chown nginx:nginx test #更改所有者和使用组者为nginx
[root@LB-nginx-01 ~]# ll test 
-rw--w-rwx 1 nginx nginx 5 1月  13 20:23 test
[root@LB-nginx-01 ~]# chown yu:lei test  #更改所有者为yu和使用组者为lei
[root@LB-nginx-01 ~]# ll test 
-rw--w-rwx 1 yu lei 5 1月  13 20:23 test
[root@LB-nginx-01 ~]# ls -l linux/
总用量 12
-rw-r--r-- 1 root root 5 1月  13 20:49 1.txt
-rw-r--r-- 1 root root 5 1月  13 20:49 2.txt
-rw-r--r-- 1 root root 5 1月  13 20:49 3.txt
[root@LB-nginx-01 ~]# chown -R yu:lei linux/  #将linux文件夹下的子文件	子目录所有者设为yu,使用组者设为lei
[root@LB-nginx-01 ~]# ls -l linux/
总用量 12
-rw-r--r-- 1 yu lei 5 1月  13 20:49 1.txt
-rw-r--r-- 1 yu lei 5 1月  13 20:49 2.txt
-rw-r--r-- 1 yu lei 5 1月  13 20:49 3.txt

3.文件的特殊权限

在复杂多变的生产环境中,单纯设置文件的 rwx 权限无法满足我们对安全和灵活性的需求,因此便有了 SUID、 SGID 与 SBIT 的特殊权限位。 这是一种对文件权限进行设置的特殊功能,可以与一般权限同时使用,以弥补一般权限不能实现的功能。

SUID:是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有属主的权限(仅对拥有执行权限的二进制程序有效)。例如,所有用户都可以执行 命令来修改自己的用户密码,而用户密码保存在/etc/ 文件中。仔细查看这个文件就会发

现它的默认权限是 000,也就是说除了 root 管理员以外,所有用户都没有查看或编辑该文件的权限。但是,在使用 命令时如果加上 SUID 特殊权限位,就可让普通用户临时获得程序所有者的身份,把变更的密码信息写入到 文件中。因此这只是一种有条件的、临时的特殊权限授权方法。查看 命令属性时发现所有者的权限由 rwx 变成了 rws,其中 x 改变成 s 就意味着该文件被赋予了 SUID 权限。如果原本的权限是 rw-没有 x 执行权限,那么被赋予特殊权限后将变成大写的 S。

[root@LB-nginx-01 ~]# ls -l /etc/shadow
---------- 1 root root 632 1月  12 20:17 /etc/shadow
[root@LB-nginx-01 ~]# ls -l /bin/passwd 
-rwsr-xr-x. 1 root root 27856 8月   9 2019 /bin/passwd

SGID:让执行者临时拥有属组的权限(对拥有执行权限的二进制程序进行设置);

在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)。SGID 的第一种功能是参考 SUID 而设计的,不同点在于执行程序的用户获取的不再是文件所有者的临时权限,而是获取到文件所属组的权限。

每个文件都有其归属的所有者和所属组,当创建或传送一个文件后,这个文件就会自动归属于执行这个操作的用户(即该用户是文件的所有者)。如果现在需要在一个部门内设置共享目录,让部门内的所有人员都能够读取目录中的内容,那么就可以创建部门共享目录后,在该目录上设置 SGID 特殊权限位。这样,部门内的任何人员在里面创建的任何文件都会归属于该目录的所属组,而不再是自己的基本用户组。此时,我们用到的就是 SGID 的第二个功能,即在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)

[root@LB-nginx-01 ~]# cd /tmp/
[root@LB-nginx-01 tmp]# mkdir txtdir
[root@LB-nginx-01 tmp]# ls -ld txtdir/
drwxr-xr-x 2 root root 6 1月  13 16:10 txtdir/
[root@LB-nginx-01 tmp]# chmod -R 777 txtdir/
[root@LB-nginx-01 tmp]# chmod g+s txtdir/
[root@LB-nginx-01 tmp]# ls -ld txtdir/
drwxrwsrwx 2 root root 6 1月  13 16:10 txtdir/

在使用上述命令设置好目录的 777 权限(确保普通用户可以向其中写入文件),并为该目录设置了 SGID 特殊权限位后,就可以切换至一个普通用户,然后尝试在该目录中创建文件,并查看新创建的文件是否会继承新创建的文件所在的目录的所属组名称:

[root@LB-nginx-01 tmp]# su - yu
[yu@LB-nginx-01 ~]$ cd /tmp/txtdir/
[yu@LB-nginx-01 txtdir]$ echo 123456 > txt
[yu@LB-nginx-01 txtdir]$ ls -l txt 
-rw-rw-r-- 1 yu root 7 1月  13 16:13 txt

SBIT:SBIT 特殊权限位可确保用户只能删除自己的文件,而不能删除其他用户的文件。当对某个目录设置了 SBIT 粘滞位权限后,那么该目录中的文件就只能被其所有者执行删除操作了。当目录被设置 SBIT 特殊权限位后,文件的其他人权限部分的 x 执行权限就会被替换成 t 或者 T,原本有 x 执行权限则会写成 t,原本没有 x 执行权限则会被写成T。

[root@LB-nginx-01 ~]# su - yu
上一次登录:三 1月 13 16:12:52 CST 2021pts/0 上
[yu@LB-nginx-01 ~]$ ls -ld /tmp
drwxrwxrwt. 15 root root 4096 1月  13 16:42 /tmp
[yu@LB-nginx-01 ~]$ cd /tmp/
[yu@LB-nginx-01 tmp]$ ls -ald
drwxrwxrwt. 15 root root 4096 1月  13 17:15 .
[yu@LB-nginx-01 tmp]$ echo 123456 > test
[yu@LB-nginx-01 tmp]$ chmod 777 test 
[yu@LB-nginx-01 tmp]$ ll test 
-rwxrwxrwx 1 yu yu 7 1月  13 17:15 test

其实,文件能否被删除并不取决于自身的权限,而是看其所在目录是否有写入权限。为了避免现在很多读者不放心,为了测试还是赋予了这个 test文件最大的 777 权限()。切换到另外一个普通用户,然后尝试删除这个其他人创建的文件就会发现,即便读、写、执行权限全开,但是由于 SBIT 特殊权限位的缘故,依然无法删除该文件:

[yu@LB-nginx-01 tmp]$ su - lei
上一次登录:三 1月 13 16:02:30 CST 2021pts/2 上
[lei@LB-nginx-01 ~]$ cd /tmp/
[lei@LB-nginx-01 tmp]$ rm -rf test 
rm: 无法删除"test": 不允许的操作

如果也想对其他目录来设置 SBIT 特殊权限位,用 chmod 命令就可以了。对应的参数 o+t 代表设置 SBIT 粘滞位权限:

[root@LB-nginx-01 ~]# mkdir linux
[root@LB-nginx-01 ~]# chmod -R o+t linux/
[root@LB-nginx-01 ~]# ls -ld linux/
drwxr-xr-t 2 root root 6 1月  13 17:20 linux/

4.文件的隐藏属性

Linux 系统中的文件除了具备一般权限和特殊权限之外,还有一种隐藏权限,即被隐藏起来的权限,默认情况下不能直接被用户发觉。

:设置文件的隐藏权限

语法格式: [ -RV ] [ -v ] [ mode ] files...

说明:

-R 递归处理,将指定目录下的所有文件及子目录一并处理。
-v<版本编号> 设置文件或目录版本。
-V 显示指令执行过程。
+<属性> 开启文件或目录的该项属性。
-<属性> 关闭文件或目录的该项属性。
=<属性> 指定文件或目录的该项属性。

如果想要把某个隐藏功能添加到文件上,则需要在命令后面追加“+参数”,如果想要把某个隐藏功能移出文件,则需要追加“-参数”。

参数作用

无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的子文件内容而不能新建或删除文件

仅允许补充(追加)内容,无法覆盖/删除内容( Only)

文件内容在变更后立即同步到硬盘(sync)

彻底从硬盘中删除,不可恢复(用 0 填充原文件所在硬盘区域)

不再修改这个文件或目录的最后访问时间(atime)

不再修改文件或目录的存取时间

检查压缩文件中的错误

使用 dump 命令备份时忽略本文件/目录

默认将文件或目录进行压缩

当删除该文件后依然保留其在硬盘中的数据,方便日后恢复

让文件系统支持尾部合并(tail-)

可以直接访问压缩文件中的内容

实例:设置不允许删除与覆盖(+a 参数)权限,然后再尝试将这个文件删除(适用于日志文件):

[root@LB-nginx-01 linux]# chattr +a 1.txt 
[root@LB-nginx-01 linux]# rm -rf 1.txt 
rm: 无法删除"1.txt": 不允许的操作 
[root@LB-nginx-01 linux]# lsattr 1.txt    #查看文件隐藏权限
-----a---------- 1.txt

:显示文件的隐藏权限

语法格式: [ -RVadv ] [ files... ]

说明:

-a:显示所有文件和目录,包括以"."为名称开头字符的额外内建,现行目录"."与上层目录".."。
-d:显示,目录名称,而非其内容。
-l:此参数目前没有任何作用。
-R:递归处理,将指定目录下的所有文件及子目录一并处理。
-v:显示文件或目录版本。
-V:显示版本信息。

实例:查看隐藏权限

[root@LB-nginx-01 linux]# lsattr 1.txt    #查看文件隐藏权限
-----a---------- 1.txt

5.文件访问控制列表

一般权限、特殊权限、隐藏权限有一个共性是针对某一类用户设置的。如果对某个指定的用户进行单独的权限控制,就需要用到文件的访问控制列表(ACL)了。就是说基于普通文件或目录设置 ACL 其实就是针对指定的用户或用户组设置文件或目录的操作权限。另外,如果针对某个目录设置了 ACL,则目录中的文件会继承其 ACL;若针对文件设置了 ACL,则文件不再继承其所在目录的 ACL。

为了更直观地看到 ACL 对文件权限控制的强大效果,我们先切换到普通用户,然后尝试进入 root 管理员的家目录中。在没有针对普通用户对 root 管理员的家目录设置 ACL之前,其执行结果如下所示:

[root@LB-nginx-01 ~]# su - yu
上一次登录:三 1月 13 17:14:52 CST 2021pts/0 上
[yu@LB-nginx-01 ~]$ cd /root
-bash: cd: /root: 权限不够

:管理文件的 ACL 规则

语法格式: [-] [{-m|-x} ] [{-M|-X} ] file ...

文件的 ACL提供的是在所有者、所属组、其他人的读/写/执行权限之外的特殊权限控制,使用 命令可以针对单一用户或用户组、单一文件或目录来进行读/写/执行权限的控制。

说明:

-m :设置后续的 acl 参数给文件使用,不可与 -x 合用;
-x :删除后续的 acl 参数,不可与 -m 合用;
-b :移除“所有的” ACL 设置参数;
-k :移除“默认的” ACL 参数,关于所谓的“默认”参数于后续范例中介绍;
-R :递回设置 acl ,亦即包括次目录都会被设置起来;
-d :设置“默认 acl 参数”的意思!只对目录有效,在该目录新建的数据会引用此默认值

实例:给/root文件夹设置用户yu有读写执行权限

[root@LB-nginx-01 ~]# setfacl -Rm u:yu:rwx /root/
[root@LB-nginx-01 ~]# su - yu
上一次登录:四 1月 14 15:38:26 CST 2021pts/3 上
[yu@LB-nginx-01 ~]$ cd /root/
[yu@LB-nginx-01 root]$ ls
anaconda-ks.cfg  docker-ce.repo  intall_nginx.sh          linux                nginx-1.6.3         test      yuchaolei  yu.txt
backup.tar       img1            keepalived-1.2.4.tar.gz  mycentos_latest.tar  nginx-1.6.3.tar.gz  text.txt  yu.tar
[yu@LB-nginx-01 root]$ cat text.txt 
hello word
1111
[yu@LB-nginx-01 root]$ exit

[root@LB-nginx-01 ~]# ll -d /root   #文件的权限最后一个点(.)变成了加号(+) ,这就意味着该文件已经设置了 ACL 了
dr-xrwx---+ 9 root root 4096 1月  13 20:23 /root

:显示文件上设置的 ACL 信息

_权限身份名称填什么_用户文件夹权限

语法格式: [-] file ...

说明:

-a:仅显示文件访问控制列表
-d:仅显示默认的访问控制列表
-c:不显示注释表头
-e: 显示所有的有效权限
-E:显示无效权限
-s:跳过只有基条目(base entries)的文件
-R:递归显示子目录
-L:逻辑遍历(跟随符号链接)
-P:物理遍历(不跟随符号链接)
-t:使用制表符分隔的输出格式
-n:显示数字的用户/组标识
-p:不去除路径前的 '/' 符号
-v:显示版本并退出
-h: 显示本帮助信息

实例:

[root@LB-nginx-01 ~]# getfacl   /root
# file: root              #文档名
# owner: root      #此文件的拥有者
# group: root       #此文件所属的群组 
user::r-x                #文件拥有者的权限
user:yu:rwx         #针对 yu的权限设置为 rwx ,与拥有者并不同
group::r-x                   #针对文件群组的权限设置仅有 rx
mask::rwx                  #此文件默认的有效权限
other::---                   #其他人拥有的权限

6.su 命令与 sudo 服务

在实验环境中很少遇到安全问题,并且为了避免因权限因素导致配置服务失败,从而建议使用 root 管理员来执行各种操作,但是在生产环境中还是要对安全多一份敬畏之心,不要用 root管理员去做所有事情。因为一旦执行了错误的命令,可能会直接导致系统崩溃,尽管 Linux 系统为了安全性考虑,使得许多系统命令和服务只能被 root管理员来使用,但是这也让普通用户受到了更多的权限束缚,从而导致无法顺利完成特定的工作任务。

su 命令可以解决切换用户身份的需求,使得当前用户在不退出登录的情况下,顺畅地切换到其他用户,比如从 root 管理员切换至普通用户:

语法格式:su [-lm] [-c 指令] []

说明:

- :单纯使用 - 如“ su - ”代表使用 login-shell 的变量文件读取方式来登陆系统;若使用者名称没有加上去,则代表切换为 root 的身份。
-l :与 - 类似,但后面需要加欲切换的使用者帐号!也是 login-shell 的方式。
-m :-m 与 -p 是一样的,表示“使用目前的环境设置,而不读取新使用者的配置文件”
-c :仅进行一次指令,所以 -c 后面可以加上指令喔!

实例:如果想要离开 root 的身份则得要利用 exit 离开才行。 那我如果只是想要执行“一个只有 root 才能进行的指令,且执行完毕就恢复原本的身份呢

[yu@LB-nginx-01 ~]$ cat /etc/shadow
cat: /etc/shadow: 权限不够
[yu@LB-nginx-01 ~]$ su - root -c "head -3 /etc/shadow"
密码:
root:$6$EHnCZkJi21dSzHPH$k2HEPreRAyQw8frfP40LRM/2vW1TKRzme9QmKYqA4f/DF45ugQjvGdbOskeE6B7R6a/ONEiExZw9cM7i5lSSd.::0:99999:7:::
bin:*:17834:0:99999:7:::
daemon:*:17834:0:99999:7:::

[root@localhost ~]# id
uid=0(root) gid=0(root) groups=0(root)
[root@localhost ~]# su - centos
Last login: Thu Jan 14 11:59:20 EST 2021 on pts/0
[centos@localhost ~]$ id
uid=1000(centos) gid=1000(centos) groups=1000(centos)

上面的 su 命令与用户名之间有一个减号(-),这意味着完全切换到新的用户,即把环境变量信息也变更为新用户的相应信息,而不是保留原始的信息。强烈建议在切换用户身份时添加这个减号(-)。

另外,当从 root 管理员切换到普通用户时是不需要密码验证的,而从普通用户切换成 root管理员就需要进行密码验证了;这也是一个必要的安全检查:

[centos@localhost ~]$ su root
Password: 
[root@localhost centos]# su - centos
Last login: Thu Jan 14 12:03:01 EST 2021 on pts/0
[centos@localhost ~]$ exit
logout

尽管像上面这样使用 su 命令后,普通用户可以完全切换到 root 管理员身份来完成相应工作,但这将暴露 root 管理员的密码,从而增大了系统密码被黑客获取的几率;这并不是最安全的方案。

最安全的方案是使用sudo 命令把特定命令的执行权限赋予给指定用户,这样既可保证普通用户能够完成特定的工作,也可以避免泄露 root 管理员密码。我们要做的就是合理配置 sudo 服务,以便兼顾系统的安全性和用户的便捷性。 sudo 服务的配置原则也很简单—在保证普通用户完成相应工作的前提下,尽可能少地赋予额外的权限。

sudo:给普通用户提供额外的权限来完成原本 root 管理员才能完成的任务

语法格式:sudo [ -Vhl ] │ [ -p ] [ -c class│- ] [ -a ] [-u │#uid ]

说明:

-V 显示版本编号
-h 会显示版本编号及指令的使用方式说明
-l 显示出自己(执行 sudo 的使用者)的权限
-v 因为 sudo 在第一次执行时或是在 N 分钟内没有执行(N 预设为五)会问密码,这个参数是重新做一次确认,如果超过 N 分钟,也会问密码
-k 将会强迫使用者在下一次执行 sudo 时问密码(不论有没有超过 N 分钟)
-b 将要执行的指令放在背景执行
-p prompt 可以更改问密码的提示语,其中 %u 会代换为使用者的帐号名称, %h 会显示主机名称
-u username/#uid 不加此参数,代表要以 root 的身份执行指令,而加了此参数,可以以 username 的身份执行指令(#uid 为该 username 的使用者号码)
-s 执行环境变数中的 SHELL 所指定的 shell ,或是 /etc/passwd 里所指定的 shell
-H 将环境变数中的 HOME (家目录)指定为要变更身份的使用者家目录(如不加 -u 参数就是系统管理者 root )
command 要以系统管理者身份(或以 -u 更改为其他人)执行的指令

实例:以 sshd 的身份在 /tmp 下面创建一个名为 的文件

[root@LB-nginx-01 ~]# sudo -u sshd touch /tmp/mysshd
[root@LB-nginx-01 ~]# ll /tmp/mysshd 
-rw-r--r-- 1 sshd sshd 0 1月  16 15:52 /tmp/mysshd    #属主属组都是sshd

sudo 命令具有如下功能:

➢限制用户执行指定的命令:

➢ 记录用户执行的每一条命令;

➢ 配置文件(/etc/)提供集中的用户管理、权限与主机等参数;

➢ 验证密码的后 5 分钟内(默认值)无须再让用户再次验证密码。

当然,如果担心直接修改配置文件会出现问题,则可以使用 sudo 命令提供的 命令来配置用户权限。这条命令在配置用户权限时将禁止多个用户同时修改 配置文件,还可以对配置文件内的参数进行语法检查,并在发现参数错误时进行报错。

使用 命令配置 sudo 命令的配置文件时,其操作方法与 Vim 编辑器中用到的方法一致,因此在编写完成后记得在末行模式下保存并退出。在 sudo 命令的配置文件中,按照下面的格式将第 99 行(大约)填写上指定的信息:

使用者帐号        登陆者的来源主机名称=(可切换的身份)       可下达的指令
root             ALL=(ALL)                           ALL

上面这一行的四个元件意义是:

“使用者帐号”:系统的哪个帐号可以使用 sudo 这个指令的意思;“登陆者的来源主机名称”:当这个帐号由哪部主机连线到本 Linux 主机,意思是这个帐号可能是由哪一部网络主机连线过来的, 这个设置值可以指定用户端计算机(信任的来源的意思) 。默认值 root 可来自任何一部网络主机“(可切换的身份) ”:这个帐号可以切换成什么身份来下达后续的指令,默认 root 可以切换成任何人;“可下达的指令”:可用该身份下达什么指令?这个指令请务必使用绝对路径撰写。 默认root 可以切换任何身份且进行任何指令之意。

那个 ALL 是特殊的关键字,代表任何身份、主机或指令的意思。

[root@LB-nginx-01 ~]# visudo99 ## Allow root to run any commands anywhere100 root    ALL=(ALL)       ALL101 centos  ALL=(ALL)       ALL

在填写完毕后记得要先保存再退出,然后切换至指定的普通用户身份,此时就可以用 sudo-l 命令查看到所有可执行的命令了(下面的命令中,验证的是该普通用户的密码,而不是 root管理员的密码

[root@localhost ~]# su - centos
Last login: Thu Jan 14 12:04:12 EST 2021 on pts/0
[centos@localhost ~]$ sudo -lWe trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:#1) Respect the privacy of others.#2) Think before you type.#3) With great power comes great responsibility.[sudo] password for centos: 
Matching Defaults entries for centos on localhost:!visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAMELANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALLLANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/binUser centos may run the following commands on localhost:(ALL) ALL

接下来是见证奇迹的时刻!作为一名普通用户,是肯定不能看到 root 管理员的家目录(/root)中的文件信息的,但是,只需要在想执行的命令前面加上 sudo 命令就可以了:

[centos@localhost ~]$ ls /root/
ls: cannot open directory /root/: Permission denied
[centos@localhost ~]$ sudo ls /root/
anaconda-ks.cfg

生产环境中不允许某个普通用户拥有整个系统中所有命令的最高执行权(即尽可能少地赋予权限),因此 ALL 参数就有些不合适了。因此只能赋予普通用户具体的命令以满足工作需求,这也受到了必要的权限约束。如果需要让某个用户只能使用 root 管理员的身份执行指定的命令,切记一定要给出该命令的绝对路径,否则系统会识别不出来。我们可以先使用 命令找出命令所对应的保存路径,然后把配置文件第 99 行的用户权限参数修改成对应的路径即可:

[centos@localhost ~]$ exit
logout
[root@localhost ~]# whereis cat
cat: /usr/bin/cat /usr/share/man/man1/cat.1.gz
[root@localhost ~]# visudo
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
centos  ALL=(ALL)       /usr/bin/cat
[root@localhost ~]# su - centos
Last login: Sat Jan 16 04:07:18 EST 2021 on pts/0
[centos@localhost ~]$ cat /etc/shadow
cat: /etc/shadow: Permission denied
[centos@localhost ~]$ sudo cat /etc/shadow
root:$6$TVNmLLTWOGbLirnN$rG/yMtbr94uSukoeMmCmlNS8twpoEaxK03eu0lozTKUgdkH/dVGGYCDllYORfMlMCiBD8vL2WpiXhoT67duBt/::0:99999:7:::
bin:*:17834:0:99999:7:::
daemon:*:17834:0:99999:7:::
adm:*:17834:0:99999:7:::
lp:*:17834:0:99999:7:::
sync:*:17834:0:99999:7:::

Ⅰ.实现,,这三个用户通过群组的功能让这三个人可以管理系统

[root@localhost ~]# visudo
107 ## Allows people in group wheel to run all commands
108 %wheel  ALL=(ALL)       ALL             # 在最左边加上 % ,代表后面接的是一个“群组”之意
[root@localhost ~]# usermod -G wheel centos1    #加入 wheel 的支持
[root@localhost ~]# id centos1                
uid=1001(centos1) gid=1001(centos1) groups=1001(centos1),10(wheel)

上面的设置值会造成“任何加入 wheel 这个群组的使用者,就能够使用 sudo 切换任何身份来操作任何指令”的意思。 你当然可以将 wheel 换成你自己想要的群组名。接下来,请分别切换身份成为 及 试看看 sudo 的运行。

[root@localhost ~]# su - centos1                #切换到centos1用户
[centos1@localhost ~]$ sudo ls /root/                  #使用sudo可以查看root家目录,说明已设置上权限
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:#1) Respect the privacy of others.#2) Think before you type.#3) With great power comes great responsibility.[sudo] password for centos1: 
anaconda-ks.cfg
[centos1@localhost ~]$ exit
logout
[root@localhost ~]# su - centos2 			#切换到centos2用户
[centos2@localhost ~]$ sudo ls /rootWe trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:#1) Respect the privacy of others.#2) Think before you type.#3) With great power comes great responsibility.[sudo] password for centos2: 
centos2 is not in the sudoers file.  This incident will be reported.   ##使用sudo查看root家目录,显示不在sudoers file

如果你想要让 也支持这个 sudo 的话,不需要重新使用 ,只要利用 去修改 的群组支持,让 用户加入 wheel 群组当中,那他就能够进行 sudo了

Ⅱ.有限制的指令操作:

上面几点都会让使用者能够利用 root 的身份进行任何事情!这样总是不太好~如果我想要让使用者仅能够进行部分系统任务, 比方说,系统上面的仅能够帮 root 修改其他使用者的密码时,亦即“当使用者仅能使用 这个指令帮忙 root 修改其他用户的密码”时,你该如何撰写呢?可以这样做:

[root@localhost ~]# visudo     #注意是 root 身份99 ## Allow root to run any commands anywhere100 root    ALL=(ALL)       ALL101 centos1 ALL=(ALL)       /usr/bin/passwd        #务必用绝对路径
[root@localhost ~]# su - centos1
Last login: Sat Jan 16 07:04:38 EST 2021 on pts/0
[centos1@localhost ~]$ sudo passwd centos    #注意,身份是 centos1
[sudo] password for centos1:            #输入 centos1的密码
Changing password for user centos.
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.
[centos1@localhost ~]$ sudo passwd 
Changing password for user root.
New password:                   #见鬼!怎么会去改 root 的密码?

恐怖啊!我们竟然让 root 的密码被 给改变了!下次 root 回来竟无法登陆系统…欲哭无泪~怎办? 所以我们必须要限制使用者的指令参数!修改的方法为将上述的那行改一改先:

## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
centos2 ALL=(ALL)       /usr/bin/passwd [a-zA-Z]*,!/usr/bin/passwd root,!/usr/bin/passwd

在设置值中加上惊叹号“ ! ”代表“不可执行”的意思。因此上面这一行会变成:可以执行“ 任意字符”,但是“ ”与“ root ”这两个指令例外! 如此一来 就无法改变 root 的密码了!这样这位使用者可以具有 root 的能力帮助你修改其他用户的密码,而且也不能随意改变 root 的密码!很有用处的!

Ⅲ.通过别名创建 :

如果我有 15 个用户需要加入刚刚的管理员行列,那么我是否要将上述那长长的设置写入 15 行啊? 而且如果想要修改命令或者是新增命令时,那我每行都需要重新设置,很麻烦ㄟ!有没有更简单的方式? 是有的!通过别名即可!我们 的别名可以是“指令别名、帐号别名、主机别名”等。不过这里我们仅介绍帐号别名, 其他的设置值有兴趣的话,可以自行玩玩!

假设我的 , , 与 , 要加入上述的密码管理员的 sudo 列表中,那我可以创立一个帐号别名称为 ADMPW 的名称,然后将这个名称处理一下即可。处理的方式如下:

[root@localhost ~]# visudo20 User_Alias ADMPW = centos1,centos2,centos3                 #将centos1,centos2,centos3用户设置别名为User_Alias21 Cmnd_Alias ADMPWCOM = !/usr/bin/cat						#将!/usr/bin/cat禁止使用cat命令设置别名为Cmnd_Alias22 ADMPW    ALL=(root)    ADMPWCOM                 #和之前的一样,只不过改为别名了

我通过 创建出一个新帐号,这个帐号名称一定要使用大写字符来处理,包括(命令别名) 、(来源主机名称别名) 都需要使用大写字符的!这个ADMPW 代表后面接的那些实际帐号。 而该帐号能够进行的指令就如同 后面所指定的那样!上表最后一行则写入这两个别名 (帐号与指令别名) , 未来要修改时,我只要修改 以及 这两行即可!设置方面会比较简单有弹性喔!

Ⅳ.sudo 的时间间隔问题:

如果我使用同一个帐号在短时间内重复操作 sudo 来运行指令的话, 在第二次执行 sudo 时,并不需要输入自己的密码!sudo 还是会正确的运行喔!为什么呢? 第一次执行 sudo 需要输入密码,是担心由于使用者暂时离开座位,但有人跑来你的座位使用你的帐号操作系统之故。 所以需要你输入一次密码重新确认一次身份。两次执行 sudo 的间隔在五分钟内,那么再次执行 sudo 时就不需要再次输入密码了, 这是因

为系统相信你在五分钟内不会离开你的作业,所以执行 sudo 的是同一个人!呼呼!真是很人性化的设计啊~ _。不过如果两次 sudo 操作的间隔超过 5 分钟,那就得要重新输入一次你的密码了

[root@localhost ~]# visudo
centos1   ALL=(root)    /usr/sbin/useradd,NOPASSWD: /usr/sbin/userdel,/usr/sbin/groupdel,PASSWD: /usr/sbin/usermod,/usr/sbin/groupmod
##这里的/usr/sbin/useradd 操作时必须使用密码;/usr/sbin/userdel, /usr/sbin/groupdel操作时可以不使用密码(跟在其后的所有操作一律不使用密码);/usr/sbin/usermod, /usr/sbin/groupmod 操作时还是要输入密码;还有PASSWD和NOPASSWD不可定义于别名中哦!
centos1   ALL=(root)   NOPASSWD:ALL      #执行所有都不需要密码[centos1@localhost ~]$ sudo useradd yyy   #每次都是用密码
[sudo] password for centos1: 
[centos1@localhost ~]$ sudo -k              # 将会强迫使用者在下一次执行 sudo 时问密码(不论有没有超过 N 分钟)
[centos1@localhost ~]$ sudo useradd y     #每次都是用密码
[sudo] password for centos1: 
[centos1@localhost ~]$ sudo userdel y      #即使使用sudo -k没有使用密码就直接操作了
[centos1@localhost ~]$ sudo -k
[centos1@localhost ~]$ sudo userdel yyyy        #即使使用sudo -k没有使用密码就直接操作了
[centos1@localhost ~]$ sudo -k
[centos1@localhost ~]$ sudo userdel yyy           #即使使用sudo -k没有使用密码就直接操作了

Ⅴ.sudo 搭配 su 的使用方式:

很多时候我们需要大量执行很多 root 的工作,所以一直使用 sudo 觉得很烦!可以使用 sudo 搭配 su , 一口气将身份转为 root ,而且还用使用者自己的密码来变成 root。 我们创建一个 ADMPW 帐号别名:

[root@localhost ~]# visudo
User_Alias ADMPW = centos1,centos2,centos3
ADMPW    ALL=(root)    /bin/su -
[root@localhost ~]# su - centos1
Last login: Sat Jan 16 09:19:41 EST 2021 on pts/0
[centos1@localhost ~]$ sudo su -
[sudo] password for centos1: 
Last login: Sat Jan 16 08:50:24 EST 2021 from 192.168.34.1 on pts/0
[root@localhost ~]#          #注意看已经是root用户

,,三个用户只要输入“ sudo su - ”并且输入“自己的密码”后, 立刻变成 root 的身份!不但 root 密码不会外流,使用者的管理也变的非常方便!这也是实务上面多人共管一部主机时常常使用的技巧呢!这样管理确实方便,不过还是要强调一下大前提, 那就是“这些你加入的使用者,全部都是你能够信任的用户”!虽然流露不出root密码,但是误操作还是有的。

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了