Linux学习笔记35——特定权限设置(比group、user更细的设置)、身份切换(su、sudo)、密码验证过程详解(PAM)、批量创建用户

一、主机的细部权限规划:ACL 的使用

从第五章开始,我们就一直强调 Linux 的权限概念是非常重要的! 但是传统的权限仅有三种身份 ( owner, group, others) 搭配三种权限 ( r,w,x) 而已,并没有办法单纯的针对某一个使用者或某一个群组来设置特定的权限需求,例如前一小节最后的那个任务! 此时就得要使用 ACL 这个机制啦!这玩意挺有趣的,下面我们就来谈一谈:

1,什么是 ACL 与如何支持启动 ACL

ACL 是 Access Control List 的缩写,主要的目的是在提供传统的 owner,group,others 的read,write,execute 权限之外的细部权限设置。ACL 可以针对单一使用者,单一文件或目录来进行 r,w,x 的权限规范,对于需要特殊权限的使用状况非常有帮助。
那 ACL 主要可以针对哪些方面来控制权限呢主要可以针对几个项目:
使用者 ( user) :可以针对使用者来设置权限;
群组 ( group) :针对群组为对象来设置其权限;
默认属性 ( mask) :还可以针对在该目录下在创建新文件/目录时,规范新数据的默认权限;

也就是说,如果你有一个目录,需要给一堆人使用,每个人或每个群组所需要的权限并不相同时,在过去,传统的 Linux 三种身份的三种权限是无法达到的, 因为基本上,传统的 Linux权限只能针对一个用户、一个群组及非此群组的其他人设置权限而已,无法针对单一用户或个人来设计权限。 而 ACL 就是为了要改变这个问题啊!好了,稍微了解之后,再来看看如何让你的文件系统可以支持 ACL 吧!

如何启动 ACL

事实上,原本 ACL 是 unix-like 操作系统的额外支持项目,但因为近年以来 Linux 系统对权限细部设置的热切需求, 因此目前 ACL 几乎已经默认加入在所有常见的 Linux 文件系统的挂载参数中 ( ext2/ext3/ext4/xfs等等) !所以你无须进行任何动作, ACL 就可以被你使用啰!不过,如果你不放心系统是否真的有支持 ACL 的话,那么就来检查一下核心挂载时显示的信息吧!
[root@study ~]# dmesg | grep -i acl
[ 0.330377] systemd[1]: systemd 208 running in system mode. ( +PAM +LIBWRAP +AUDIT
+SELINUX +IMA +SYSVINIT +LIBCRYPTSETUP +GCRYPT +ACL +XZ)
[ 0.878265] SGI XFS with ACLs, security attributes, large block/inode numbers, no
debug enabled

瞧!至少 xfs 已经支持这个 ACL 的功能啰!

2,ACL 的设置技巧: getfacl, setfacl

好了,既然知道我们的 filesystem 有支持 ACL 之后,接下来该如何设置与观察 ACL 呢很简单,利用这两个指令就可以了:
getfacl:取得某个文件/目录的 ACL 设置项目;
setfacl:设置某个目录/文件的 ACL 规范。

先让我们来瞧一瞧 setfacl 如何使用吧!
setfacl 指令用法介绍及最简单的“ u:帐 :权限 ”设置
[root@study ~]# setfacl [-bkRd] [{-m|-x} acl参数] 目标文件名
选项与参数:
-m :设置后续的 acl 参数给文件使用,不可与 -x 合用;
-x :删除后续的 acl 参数,不可与 -m 合用;
-b :移除“所有的” ACL 设置参数;
-k :移除“默认的” ACL 参数,关于所谓的“默认”参数于后续范例中介绍;
-R :递回设置 acl ,亦即包括次目录都会被设置起来;
-d :设置“默认 acl 参数”的意思!只对目录有效,在该目录新建的数据会引用此默认值

上面谈到的是 acl 的选项功能,那么如何设置 ACL 的特殊权限呢殊权限的设置方法有很多, 我们先来谈谈最常见的,就是针对单一使用者的设置方式:
#1. 针对特定使用者的方式:
#设置规范:“ u:[使用者帐 列表]:[rwx] ”,例如针对 vbird1 的权限规范 rx :
[root@study ~]# touch acl_test1
[root@study ~]# ll acl_test1
-rw-r–r–. 1 root root 0 Jul 21 17:33 acl_test1
[root@study ~]# setfacl -m u:vbird1:rx acl_test1
[root@study ~]# ll acl_test1
-rw-r-xr–+ 1 root root 0 Jul 21 17:33 acl_test1
#权限部分多了个 + ,且与原本的权限 ( 644) 看起来差异很大!但要如何查阅呢br> [root@study ~]# setfacl -m u::rwx acl_test1
[root@study ~]# ll acl_test1
-rwxr-xr–+ 1 root root 0 Jul 21 17:33 acl_test1
#设置值中的 u 后面无使用者列表,代表设置该文件拥有者,所以上面显示 root 的权限成为 rwx 了!

上述动作为最简单的 ACL 设置,利用“ u:使用者:权限 ”的方式来设置的啦!设置前请加上 -m这个选项。 如果一个文件设置了 ACL 参数后,他的权限部分就会多出一个 + 了!但是此时你看到的权限与实际权限可能就会有点误差! 那要如何观察呢通过 getfacl 吧!

getfacl 指令用法

上面的数据非常容易查阅吧示的数据前面加上 # 的,代表这个文件的默认属性,包括文件名、文件拥有者与文件所属群组。 下面出现的 user, group, mask, other 则是属于不同使用者、群组与有效权限( mask) 的设置值。 以上面的结果来看,我们刚刚设置的 vbird1 对于这个文件具有 r 与 x 的权限啦!这样看的懂吗如果看的懂的话,接下来让我们在测试其他类型的 setfacl 设置吧!

特定的单一群组的权限设置:“ g:群组名:权限 ”

针对有效权限设置:“ m:权限 ”

基本上,群组与使用者的设置并没有什么太大的差异啦!如上表所示,非常容易了解意义。不过,你应该会觉得奇怪的是, 那个 mask 是什么东西啊实他有点像是“有效权限”的意思!他的意义是: 使用者或群组所设置的权限必须要存在于 mask 的权限设置范围内才会生效,此即“有效权限 ( effective permission) ” 我们举个例子来看,如下所示:

您瞧,vbird1 与 mask 的集合发现仅有 r 存在,因此 vbird1 仅具有 r 的权限而已,并不存在 x权限!这就是 mask 的功能了!我们可以通过使用 mask 来规范最大允许的权限,就能够避免不小心开放某些权限给其他使用者或群组了。 不过,通常鸟哥都是将 mask 设置为 rwx 啦!然后再分别依据不同的使用者/群组去规范她们的权限就是了。
例题:将前一小节任务二中 /srv/projecta 这个目录,让 myuser1 可以进入查阅,但 myuser1不具有修改的权力。答:由于 myuser1 是独立的使用者与群组,因此无法使用传统的 Linux权限设置。此时使用 ACL 的设置如下:

请注意,上述的 1, 3 步骤使用 myuser1 的身份,2步骤才是使用 root 去设置的!
上面的设置我们就完成了之前任务二的后续需求喔!这么简单呢!接下来让我们来测试一下,如果我用 root 或者是 pro1 的身份去 /srv/projecta 增加文件或目录时,该文件或目录是否能够具有 ACL 的设置意思就是说,ACL 的权限设置是否能够被次目录所“继承先试看看:

你可以明显的发现,权限后面都没有 + ,代表这个 acl 属性并没有继承喔!如果你想要让 acl在目录下面的数据都有继承的功能,那就得如下这样做了!

使用默认权限设置目录未来文件的 ACL 权限继承“ d:[u|g]:[user|group]:权限 ”

通过这个“针对目录来设置的默认 ACL 权限设置值”的项目,我们可以让这些属性继承到次目录下面呢! 非常方便啊!那如果想要让 ACL 的属性全部消失又要如何处理过“ setfacl -b文件名 ”即可啦! 太简单了!鸟哥就不另外介绍了!请自行测试测试吧!
问:针对刚刚的 /srv/projecta 目录的权限设置中,我需要 1) 取消 myuser1 的设置( 连同默认值) ,以及 2) 我不能让 pro3 这个用户使用该目录,亦即 pro3 在该目录下无任何权限,该如何设置:取消全部的 ACL 设置可以使用 -b 来处理,但单一设置值的取消,就得要通过 -x 才行了!所以你应该这样作:

只需要留意,当设置一个用户/群组没有任何权限的 ACL 语法中,在权限的字段不可留白,而是应该加上一个减 ( -) 才是正确的作法!

二,使用者身份切换

什么 Linux 系统当中还要作身份的变换是为啥能有下面几个原因啦!

使用一般帐 :系统平日操作的好习惯

事实上,为了安全的缘故,一些老人家都会建议你,尽量以一般身份使用者来操作 Linux 的日常作业!等到需要设置系统环境时, 才变换身份成为 root 来进行系统管理,相对比较安全啦!避免作错一些严重的指令,例如恐怖的“ rm -rf / ”( 千万作不得!)

用较低权限启动系统服务

相对于系统安全,有的时候,我们必须要以某些系统帐 来进行程序的执行。 举例来说,Linux 主机上面的一套软件,名称为 apache ,我们可以额外创建一个名为 apache 的使用者来启动 apache 软件啊,如此一来,如果这个程序被攻破,至少系统还不至于就损毁了~

软件本身的限制

在远古时代的 telnet 程序中,该程序默认是不许使用 root 的身份登陆的,telnet 会判断登陆者的 UID, 若 UID 为 0 的话,那就直接拒绝登陆了。所以,你只能使用一般使用者来登陆Linux 服务器。 此外, ssh [3] 也可以设置拒绝 root 登陆喔!那如果你有系统设置需求该如何是好啊变换身份啊!

由于上述考虑,所以我们都是使用一般帐 登陆系统的,等有需要进行系统维护或软件更新时才转为 root 的身份来动作。 那如何让一般使用者转变身份成为 root 呢要有两种方式喔:
以“ su – ”直接将身份变成 root 即可,但是这个指令却需要 root 的密码,也就是说,如果你要以 su 变成 root 的话,你的一般使用者就必须要有 root 的密码才行;
以“ sudo 指令 ”执行 root 的指令串,由于 sudo 需要事先设置妥当,且 sudo 需要输入使用者自己的密码, 因此多人共管同一部主机时, sudo 要比 su 来的好喔!至少 root 密码不会流出去!
下面我们就来说一说 su 跟 sudo 的用法啦!

1,su

su 是最简单的身份切换指令了,他可以进行任何身份的切换唷!方法如下:
[root@study ~]# su [-lm] [-c 指令] [username]
选项与参数:

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

上表的解释当中有出现之前第十章谈过的 login-shell 配置文件读取方式,如果你忘记那是啥东西, 请先回去第十章瞧瞧再回来吧!这个 su 的用法当中,有没有加上那个减 “ – ”差很多喔! 因为涉及 login-shell 与 non-login shell 的变量读取方法。这里让我们以一个小例子来说明吧!

范例一:假设你原本是 dmtsai 的身份,想要使用 non-login shell 的方式变成 root

单纯使用“ su ”切换成为 root 的身份,读取的变量设置方式为 non-login shell 的方式,这种方式很多原本的变量不会被改变, 尤其是我们之前谈过很多次的 PATH 这个变量,由于没有改变成为 root 的环境, 因此很多 root 惯用的指令就只能使用绝对路径来执行咯。其他的还有MAIL 这个变量,你输入 mail 时, 收到的邮件竟然还是 dmtsai 的,而不是 root 本身的邮件!是否觉得很奇怪啊!所以切换身份时,请务必使用如下的范例二:
范例二:使用 login shell 的方式切换为 root 的身份并观察变量

上述的作法是让使用者的身份变成 root 并开始操作系统,如果想要离开 root 的身份则得要利用 exit 离开才行。 那我如果只是想要执行“一个只有 root 才能进行的指令,且执行完毕就恢复原本的身份”呢就可以加上 -c 这个选项啰! 请参考下面范例三!

由于 /etc/shadow 权限的关系,该文件仅有 root 可以查阅。为了查阅该文件,所以我们必须要使用 root 的身份工作。 但我只想要进行一次该指令而已,此时就使用类似上面的语法吧!好,那接下来,如果我是 root 或者是其他人, 想要变更成为某些特殊帐 ,可以使用如下的方法来切换喔!

su 就这样简单的介绍完毕,总结一下他的用法是这样的:
若要完整的切换到新使用者的环境,必须要使用“ su – username ”或“ su -l username ”,才会连同 PATH/USER/MAIL 等变量都转成新使用者的环境;
如果仅想要执行一次 root 的指令,可以利用“ su – -c “指令串” ”的方式来处理;
使用 root 切换成为任何使用者时,并不需要输入新使用者的密码;

虽然使用 su 很方便啦,不过缺点是,当我的主机是多人共管的环境时,如果大家都要使用su 来切换成为 root 的身份,那么不就每个人都得要知道 root 的密码,这样密码太多人知道可能会流出去, 很不妥当呢!怎办过 sudo 来处理即可!

2,sudo

sudo 的指令用法

由于一开始系统默认仅有 root 可以执行 sudo ,因此下面的范例我们先以 root 的身份来执行,等到谈到 visudo 时,再以一般使用者来讨论其他 sudo 的用法吧! sudo 的语法如下:
Tips 还记得在安装 CentOS 7 的第三章时,在设置一般帐 的项目中,有个“让这位使用者成为管理员”的选项吧果你有勾选该选项的话, 那除了 root 之外,该一般用户确实是可以使用 sudo 的喔( 以鸟哥的例子来说, dmtsai 默认竟然可以使用 sudo 了!) !这是因为创建帐 的时候,默认将此用户加入 sudo 的支持中了!详情本章稍后告知!

sudo 可以让你切换身份来进行某项任务,例如上面的两个范例。范例一中,我们的 root 使用sshd 的权限去进行某项任务! 要注意,因为我们无法使用“ su – sshd ”去切换系统帐 (因为系统帐 的 shell 是 /sbin/nologin), 这个时候 sudo 真是他 X 的好用了!立刻以 sshd 的权限在 /tmp 下面创建文件!查阅一下文件权限你就了解意义啦! 至于范例二则更使用多重指令串 (通过分 ; 来延续指令进行),使用 sh -c 的方法来执行一连串的指令, 如此真是好方便!
但是 sudo 默认仅有 root 能使用啊!为什么呢为 sudo 的执行是这样的流程:

  1. 当使用者执行 sudo 时,系统于 /etc/sudoers 文件中搜寻该使用者是否有执行 sudo 的权限;
  2. 若使用者具有可执行 sudo 的权限后,便让使用者“输入使用者自己的密码”来确认;
  3. 若密码输入成功,便开始进行 sudo 后续接的指令(但 root 执行 sudo 时,不需要输入密码);
  4. 若欲切换的身份与执行者身份相同,那也不需要输入密码。

visudo 与 /etc/sudoers

从上面的说明我们可以知道,除了 root 之外的其他帐 ,若想要使用 sudo 执行属于 root 的权限指令,则 root 需要先使用 visudo 去修改 /etc/sudoers ,让该帐 能够使用全部或部分的root 指令功能。为什么要使用 visudo 呢是因为 /etc/sudoers 是有设置语法的,如果设置错误那会造成无法使用 sudo 指令的不良后果。因此才会使用 visudo 去修改, 并在结束离开修改画面时,系统会去检验 /etc/sudoers 的语法就是了。
一般来说,visudo 的设置方式有几种简单的方法喔,下面我们以几个简单的例子来分别说明:

I. 单一使用者可进行 root 所有指令,与 sudoers 文件语法:

假如我们要让 vbird1 这个帐 可以使用 root 的任何指令,基本上有两种作法,第一种是直接通过修改 /etc/sudoers ,方法如下:

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

  1. “使用者帐 ”:系统的哪个帐 可以使用 sudo 这个指令的意思;
  2. “(可切换的身份)”:这个帐 可以切换成什么身份来下达后续的指令,默认 root 可以切换成任何人;
  3. “可下达的指令”:可用该身份下达什么指令个指令请务必使用绝对路径撰写。 默认root 可以切换任何身份且进行任何指令之意。
    那个 ALL 是特殊的关键字,代表任何身份、主机或指令的意思。所以,我想让 vbird1 可以进行任何身份的任何指令, 就如同上表特殊字体写的那样,其实就是复制上述默认值那一行,再将 root 改成 vbird1 即可啊! 此时“vbird1 不论来自哪部主机登陆,他可以变换身份成为任何人,且可以进行系统上面的任何指令”之意。 修改完请储存后离开 vi,并以 vbird1 登陆系统后,进行如下的测试看看:

注意到了吧!vbird1 输入自己的密码就能够执行 root 的指令!所以,系统管理员当然要了解vbird1 这个用户的“操守”才行!否则随便设置一个使用者,他恶搞系统怎办外,一个一个设置太麻烦了, 能不能使用群组的方式来设置呢考下面的第二种方式吧。

II. 利用 wheel 群组以及免密码的功能处理 visudo

我们在本章前面曾经创建过 pro1, pro2, pro3 ,这三个用户能否通过群组的功能让这三个人可以管理系统可以的,而且很简单!同样我们使用实际案例来说明:

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

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2019年1月13日
下一篇 2019年1月13日

相关推荐