zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    053467
    053466
    053465
    NC201613 Jelly
    NC14608 after与迷宫
    NC14572 走出迷宫
    340. 通信线路
    1135. 新年好
    903. 昂贵的聘礼
    P5767 [NOI1997]最优乘车
  • 原文地址:https://www.cnblogs.com/Lonelychampion/p/11347167.html
Copyright © 2011-2022 走看看