Linux账号管理与ALC权限设定(二) 批量增加用户脚本

 接上篇。鸟哥提出了一个问题。就是

如果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

这里碰到了一个小插曲,去找解决办法,网上五花八门的原因,什么磁盘不够,什么没有权限。。。一大堆,找到了一个阿里云的解决办法。

  1. 登录ECS实例,执行如下命令,检查密码相关文件权限,查看相关文件的属性配置情况。对存在特殊属性的文件,去除后再尝试修改密码即可。
     
    lsattr /etc/*shadow /etc/passwd /etc/group
    系统显示类似如下。
     
    ------------- /etc/gshadow
    ------------- /etc/shadow
    ------------- /etc/passwd
    ------------- /etc/group
  2. 如果存在“-i”属性,则执行如下命令,取消该安全属性。
     
    chattr -i /etc/*shadow /etc/passwd /etc/group
  1. 重新尝试修改密码。
  2. 如果还是报错,则执行如下命令,尝试备份shadow文件。
     
    mv shadow shadow.bak
  3. 执行如下命令,开启用户的投影密码。
     
    pwconv
  4. 再次尝试修改密码。

我前面肯定是没有问题的,权限也是没问题的。那就是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

原文地址:https://www.cnblogs.com/Lonelychampion/p/11347167.html