接上篇。鸟哥提出了一个问题。就是
如果myuser1用户是这个项目的助理,他只能查看该目录下的内容,而无法修改删除。那该如何操作呢?
首先,不能将该用户加入projecta这个群组,否则他也可以修改删除文件了
其次,不能将该目录的权限进行修改,例如修改other的权限,为5,这样其他人都可以查阅该项目了。
这个时候,引入了外部身份认证系统的概念
例子:
首先我们创建ac1_test1目录,然后查看他的权限是rw- r-x r--相对应的root的账户的权限就是rw-
然后我们利用setfacl命令,将lsq的用户赋予了该目录rx的权限。然后我们利用ll查看的时候,发现该目录给原来目录的权限发生了变化。第一个框和第二个框之间的变化,有原来的rw-r---r--变成了rw-r-xr--+ 1。
如何查看该目录的ALC权限呢,就需要getfacl这个命令。可以看到最后一个红框的部分
user :: 空表示是目录拥有者,是不是跟第一个红框的权限一致的,都是rw-的权限。第二个user:lsq 就是我们将lsq的权限赋给了该目录。就是r-x的权限
至此,lsq在该目录下就拥有了r-x的权限。也就解答了上面中助教的问题。
设置某个群组的权限就是这么简单。。。。
也就是说,mask是用来规范最大权限的意思,比如说,你给了用户7的权限,但是你mask只有4的权限,你哪怕给了用户7的权限,他也只能拥有4的权限,因为,mask的存在。
OK。上述设置的ACL权限有一个问题,就是不能继承。也就是说,如果用root身份登入之后,创建的文档,是无法继承ACL权限的。让我们测试一下
,我们的projecta是有ACL权限的,看到后面的+号了么,证明是有权限的。
那我们用root账号建立一个档案
看到了么?这两个文档 abc1和abc2是不带+号的,也就是没有ACL权限的,这就证明,新创立文档无法继承原父目录下的ACL权限的。那该咋办呢?
测试一下
首先我们使用命令 setfacl -m d:u:myuser1:rx /srv/projetca 来给myuser1赋予了ACL的继承权限。然后getfacl 来查看一下,就是第二个红框,发现myuser1确实已经有了ACL的权限。
接下来我们用root创建一个目录ccc。然后查看一下新创建的ccc是否和刚才一样,没有ACL的权限呢?getfacl ccc。发现该目录已经继承了projecta的ACL权限,就是最后一个红框部分。至此,我们的问题得到了解答。通过这个命令,无论在projceta下面创建了什么目录和档案,myuser1都已经具有了ACL的权限,即r-x的权限。
实验:
针对myuser1的权限问题,首先这是一个针对单一用户的ACL权限取消的问题。
针对该目录所有ACL的权限的取消。用-b来处理。即 setfacl -b /srv/projecta来取消projecta的ACL目录权限
通过这个方式,会取消所有施加在projecta文件夹上的ACL权限,那如何取消单一用户的ACL权限呢,就像题目要求的,取消myuser1的ACL权限该如何操作呢,这就需要-x来设置。而且只能逐个设定,这个逐个设定的意思就是,因为我们刚刚经过两步,一步是给myuser1加上了projecta的非继承权限,然后有给myuser1加上了继承的ACL权限,所以我们要逐个取消掉才行。
首先我们需要查看一下myuser1的ACL权限,通过getfacl命令,发现有user的权限和default的权限,然后我们就需要逐个取消掉
setfacl -x u: XXXXXXXX setfacl -x d:u:XXXXXXXXXX来分别取消掉这两个权限,然后我们getfacl查看一下该目录下的ACL权限,发现myuser1的ACL权限没了,对比顶部的user:default:。实现了我们的要求
那如何让pro3用户无访问该目录的权限呢?通过setfacl -来处理
,红框位置显示,pro3已经没有了访问projecta的权限
身份转移 命令 su sudo
这个我一直在用,上面的截图中也能够显示,不停地身份转移
su 与 su -的区别
上面中,我们一直再用su来进行角色的转换,这样就存在一个问题,就是环境变量的问题。如下图
虽然你用su命令登录的root的身份,但是环境变量依然是采用的lsq的环境变量。这就是所谓的non-login shell的登陆方式,这样我们在操作一些命令的时候,他取得环境变量就不是root的,尤其是PATH。。。是lsq而非root
为解决这个问题,就出现了su -命令,这就是login-shell。。。彻底的转换成root身份,如下图
我们采用su-命令之后,在env lsq的时候,发现没有任何关于lsq的信息,只剩下root的信息,对比前一张图。很容易看出区别
所以,我们在日常操作的时候,如果确实需要root身份来处理一些事情的时候,一定要用su -命令,否则很容易出现一些问题。
若只是短暂的使用root的账户信息来操作某一项指令,而非切换的话,我们又用到了
su - -c 的命令
例 : su - -c “head -n 3 /etc/shadow”执行head命令取前3行
可以发现,虽然用root身份执行了head命令,但是最终的角色并没有转换,红框部分显示
sudo 命令
。看到了么?当我们用lsq账户去操作sudo 的时候,他会提示 not in the sudoers file。。。也就是你没有sudo的使用权。而sudo的使用权的配置文件放置在
/etc/sudoers目录中。而要修改 sudoers脚本文件,我们用到了visudo这个东东
让我们来探究一下这是个啥东东
敲入命令 visudo
如下图,
在root下,新增lsq的sudo编辑权限,然后测试,最后一个红框的测试结果证明,lsq已经具有了sudo的权限。对比sudo的第一张图。
第一个红框中的解释
通过上面的解释,我们可以得知,如果想让用户只允许通过sudo命令执行某一段sheel,那只需要将ALL改为某段程式的地址即可。但这个地址必须是绝对路径。
例,如果想让myuser1用户只能用sudo来代替root执行修改密码的指令,我们该如何操作呢?
visudo 进入编辑界面,我们上图添加的是lsq账户执行跟root一样的所有操作。我们只需在下方加入 myuser1 ALL=(root) /usr/bin/passwd。即可完成该需求。
如上操作,进入myuser1账户修改密码时,当我们执行 sudo passwd的时候,发现竟然可以修改root的登陆密码。。。这肯定不可取,书中给出了答案。如下图
即加上!来阻止执行 /usr/bin/passwd和/usr/bin/passwd root这两个命令,然后其他随便。这样就能够避免更改root的密码了
现在我有一个设想,如果我只是加了阻止,而将中间的那部分去掉呢?结果会如何??
上图就是结果,无法执行任何命令。为什么呢?看上上图中的解释。最后一个一列的意思是,可以执行的命令,注意,是可以执行的命令,那我们在前面加上!之后代表的是非可执行,那可执行代码在哪呢?没有可执行代码了。对吧,这也就是为什么要加上中间那段的意思。
OK。我们加上之后再来试一下
成功了,不是么?
如何批量处理用户的sudo呢?通过群组的方式。敲入visudo 命令如下图
第一个红框中,%wheel 意思是,只要加入了wheel群组的人员,都可以采用sudo命令来执行操作
第二个红框中,可以发现这个是注释的部分,与第一个红框唯一的区别就在于后半部分,有一个NOPASSWD:ALL 。无需密码,即免密使用。如果将这行注释取消掉,意思就是所有加入wheel群组的用户,都可以免密使用sudo命令。是不是很欣喜,很意外
那如果我们想让某一部分人免密使用sudo命令,只需要将该行注释取消掉,然后将这部分人加入到wheel群组中即可。
,查阅 /etc/group,可以发现wheel群组信息。
PAM模块简介
这个东东很好用,write
首先我们要who看一下,都有什么用户在线,然后才能用write进行通话,write +用户+端口
这两个图,一个是用centos登录的账户,一个是用putty登录的账户,这两个家伙开始通信吧。。哈哈,用法就是write lsq pts/0 ,这个pts/0端口就是通过who来得知的,第一个框中的账户名后边的部分。
剩下两个框就是交流的内容,是不是很cool,我觉得很cool...
利用mesg n/y来停止或允许接收上面write发送的数据
wall "XXXXXXXXXXX"来进行全体用户的广播信息
无论是wall还是write,有一个问题就是只有使用者在线方能收到信息。这也就是我们在使用之前,要who一下的原因。如何让用户不在线的时候 也能接收到信息呢?mail
要写信,就有收信,收信的命令同样用mail来实现。
接上面的信息,我们可以发现第二个红框的位置。路径就在/var/spool/mail/lsq内,我们直接cat一下,就能看到文件内容
pwck命令
chpasswd命令 明码加密并写入/etc/shadow
例 :我们现在想批量添加账号,该如何操作?书中给出了一个脚本,很合适,记录一下吧
#!/bin/bash #This shell script will create amount of linux login accounts for you #1 . check the "accountadd.txt" file exist? you must create that file manually # one account name one line in the "accountadd.txt" #2 . use openssl to create users password. #3 . User must change his password in his first login. #4 . more options check the following url: #https://www.cnblogs.com/Lonelychampion/ #2019/08/15 lsq export PATH=/bin:/sbin:/usr/bin:/usr/sbin #0. userinput usergroup="" #if your account need secondary group,add here. pwmech="openssl" #"oepnssl" or "account" is needed. homeperm="no" #if "yes" then I will modify home dir permission to 711 #1 . check the accountadd.txt file action="${1}" #"create" is useradd and "delete" is userdel. if [ ! -f accountadd.txt ]; then echo "There is no accountadd.txt file,stop here." exit 1 fi [ "${usergroup}" != "" ] && groupadd -r ${usergroup} rm -f outputpw.txt usernames=$(cat accountadd.txt) for username in ${usernames} do case ${action} in "create") [ "${usergroup}" != "" ] && usegrp=" -G ${usergroup} " || usegrp="" useradd ${usegrp} ${username} [ "${pwmech}" == "openssl" ] && usepw=$(openssl rand -base64 6) || usepw=${username} echo ${usepw} | passwd --stdin ${username} chage -d 0 ${username} [ "${homeperm}" =="yes" ] && chmod 711 /home/${username} echo "username=${username} , password=${usepw}" >> outputpw.txt ;; "delete") echo "deleting ${username}" userdel -r ${username} ;; *) echo "Usage: $0 [create|delete]" ;; esac done
让我们来测试一下这个脚本。我是照着书上抄的,看看能不能一步抄对。哈哈哈
vim accountadd.txt ,添加如下账户
然后执行 sh accountadd.sh create命令
然后查看 cat /etc/passwd
用户都已经加载上去了,让我们测试一下。
我们拿std04来测试一下,首先我们需要知道std04的密码是什么?看脚本,>>outputpw.txt,意思就是将密码文件输出到了outputpw.txt文件中。
我们cat一下。
就能够看到每个用户的密码。然后我们用Putty 登录一下瞅瞅
,我们输入密码之后,putty会退出,然后你重新登录一下,看一下密码是否重新设置成功?
看到了么?manipulation erro
这里碰到了一个小插曲,去找解决办法,网上五花八门的原因,什么磁盘不够,什么没有权限。。。一大堆,找到了一个阿里云的解决办法。
- 登录ECS实例,执行如下命令,检查密码相关文件权限,查看相关文件的属性配置情况。对存在特殊属性的文件,去除后再尝试修改密码即可。
lsattr /etc/*shadow /etc/passwd /etc/group
------------- /etc/gshadow
------------- /etc/shadow
------------- /etc/passwd
------------- /etc/group - 如果存在“-i”属性,则执行如下命令,取消该安全属性。
chattr -i /etc/*shadow /etc/passwd /etc/group
- 重新尝试修改密码。
- 如果还是报错,则执行如下命令,尝试备份shadow文件。
mv shadow shadow.bak
- 执行如下命令,开启用户的投影密码。
pwconv
- 再次尝试修改密码。
我前面肯定是没有问题的,权限也是没问题的。那就是shadow的文件没有同步了。。。好吧,按照他说的,mv shadow shadow.bak pwconv...问题来了。exit出来之后,死活登录不上去了,连root账户都无法登陆,我知道,从我们账号管理一我们知道,肯定是shadow出现了问题,没办法,采用单用户模式进行登录,然后修改密码,如果忘了,我的前面随笔里也有,找一下就O了。然后登陆
我首先先cat了一下/etc/passwd,发现里面的用户都还在,然后我又 ls /etc/shadow*一下,问题出现了
出现了三个shadow文件,一个是shadow,一个shadow- ,一个就是我们的shadow.bak文件。
我将shadow文件删除,然后将shadow- mv成shadow。
然后exit退出,登录,发现没有问题,然后我们再试一下刚才的修改密码,终于出现了我们想要的,如下图
.修改密码吧。兄弟。。。
练习题
批量添加邮件账号
#!/bin/bash for userName in pop1 pop2 pop3 do useradd -g mail -s /sbin/nologin -M $userName echo $userName | passwd --stdin $userName done
一般账号 添加次要群组支持
#!/bin/bash for userName in youlog1 youlog2 youlog3 do useradd -G youcan -s /bin/bash -m $userName echo $userName | passwd --stdin $userName done