Linux用户和组管理

1.  Linux输入账号和密码后的过程

    1.  先找寻/etc/passwd是否有你的账号,没有就跳出。如果有,从/etc/passwd获得uid,从/etc/group获得gid,同时把用户的家目录与shell设定也读出来。

    2.  核对输入的密码与/etc/shadow,是否一致

    3.  如果正确,就进入shell管理的阶段

2.  /etc/passwd文件结构

    root:x:0:0:root:/root:/bin/bash

    第一列:用户名

    第二列:早期密码列,后因为不安全,放到了/etc/shadow

    第三列:uid

        0为root,其它用户的uid也可以修改为0,但是不建议这样做

        1~999系统账户

        1000~60000一般用户

    第四列:gid

    第五列:用户信息说明栏

    第六列:用户家目录,如果要修改某个用户的家目录,修改这个地方就可以了。

    第七列:shell设定

3.  /etc/shadow文件结构

    root:$1$openssl $JeZQQ/HbK0aLlolY6grw31::0:99999:7:::

    第一列:用户名

    第二列:密码

    第三列:最近更改密码的日期

    第四列:密码不可被更改的天数,默认为0,表示随时可以修改

    第五列:密码需要重新更改的天数,默认为99999,没有强制用户修改密码

    第六列:密码更改前警告的天数,默认为7天

    第七列:密码失效日,-1为永不失效,0为立刻失效

    第八列:账号失效日

    第九列:保留

    如果普通用户忘记了密码,直接使用root更改该用户的密码即可。

    如果root用户忘记了密码,可以使用用户维护模式,修改root的密码。

    也可以用LiveCD开机后挂载根目录去修改/etc/shadow,将root的密码字段清空(可以直接修改/etc/shadow,按wq!强制退出即可),重启计算机,root将不使用密码登录。

4.  群组

    1.  /etc/group文件结构

        root:x:0:

        第一列:组名

        第二列:组密码,不需要设置

        第三列:gid

        第四列:组包含的用户名称

    2.  有效群组与初始群组

        初始群组:当创建用户,会自动创建一个同名的群组,这个群组就是初始群组。初始群组体现在/etc/passwd文件的GID部分,这个GID就是用户的初始群组。

        有效群组:当用户加入多个群组中,使用groups查看当前用户所在组,第一个出现的就是有效群组

        例子:

        创建一个用户

        useradd yangjianbo

        查看/etc/passwd

        yangjianbo:x:1502:1502::/home/yangjianbo:/bin/bash  1502就是用户的初始群组

        把yangjianbo这个用户加入到其它群组

        usermod -G zabbix yangjianbo

        查看/etc/group

        zabbix:x:1501:yangjianbo  可以看到zabbix这个组中有了成员yangjianbo

        切换yangjianbo用户,执行groups

        yangjianbo zabbix  第一个组就是有效群组

        切换有效群组为zabbix

        newgrp zabbix

        再执行一下groups

        zabbix yangjianbo  可以看到有效群组已经切换为zabbix  切换有效群组的时候,其实是又开了一个shell,执行exit退出当前的shell

    3.  /etc/gshadow文件结构

        yangjianbo:!::

        第一列:组名

        第二列:组密码,无密码就是!

        第三列:群管理员账号

        第四列:群组成员账号

5.  账号管理

    1.  创建用户

        1.  useradd

          参数及选项

          -c  注释,就是/etc/passwd,第五列的说明栏

          -d  设置家目录,而不适用默认家目录。

          -e  expire_date  账号失效日过期时间

          -g  指定初始群组,该群组必须存在

          -G  指定次要群组,该群组必须存在

          -M  强制不创建家目录

          -m  强制创建家目录

          -s  指定shell,默认为/bin/bash

          -u  指定UID,是一组数字。直接指定一个特殊的数字给这个用户

          -r   建立一个系统账号,账号的UID会受限制

          -f  修改/etc/shadow的第七列,密码失效日,0为立刻失效,-1为永不失效

        2.  例子

          useradd -d /home/zhangxueyou -u 10000 -g zabbix -G zhangshaohua1510 -s /sbin/nologin -f -1 -c niubi yangjianbo

          家目录: /home/zhangxueyou  权限为700 

          uid: 10000  查看/etc/passwd

          初始群组:zabbix  查看/etc/passwd

          次要群组:zhangshaohua1510  查看/etc/group

          shell: /sbin/nologin  查看/etc/passwd

          -f: 密码永不过期  

          -c:用户信息说明栏  查看/etc/passwd

          用户名: yangjianbo

        3.  useradd使用的参考文件

          useradd -D  可以查看

          /etc/default/useradd  实际的配置文件

          具体内容如下:         

GROUP=100  初始群组的id,centos属于私有群组机制,所以该配置不会生效
HOME=/home  定义家目录的位置
INACTIVE=-1  密码过期后是否失效的天数,shadow的第七个字段,0为立刻失效,-1永不失效
EXPIRE=    账号失效的日期
SHELL=/bin/bash  
SKEL=/etc/skel  家目录的参数目录,在这个目录创建的文件都会拷贝到用户的家目录下
CREATE_MAIL_SPOOL=yes  建立使用者的mailbox,在/var/spool/mail/     
例子:用户登录的时候,出现下面的情况:

          -bash-4.2$

          解决方法:  cp -a /etc/skel/.bash*   /home/用户

          /etc/skel目录的作用:

            1.  可以把通知的内容放到skel目录下,让登录的人去看

            2.  统一初始化新用户的环境变量

                可以编辑/etc/skel/.bash_profile

        4.  关于密码的参考文件

          /etc/login.defs       

MAIL_DIR        /var/spool/mail  邮箱目录
PASS_MAX_DAYS   99999  密码多久变更
PASS_MIN_DAYS   0    密码多久不用变更
PASS_MIN_LEN    5    密码最小长度
PASS_WARN_AGE   7    密码过期前警告的天数
UID_MIN                  1000  用户最小的uid
UID_MAX                 60000  用户最大的uid
SYS_UID_MIN               201  系统账号最小的uid
SYS_UID_MAX               999  系统账号最大的uid
GID_MIN                  1000  群组最小的gid
GID_MAX                 60000  群组最大的gid
SYS_GID_MIN               201  系统群组最小的gid
SYS_GID_MAX               999  系统群组最大的gid
CREATE_HOME     yes    是否创建家目录
UMASK           077    创建家目录的权限700
USERGROUPS_ENAB yes    userdel删除用户的时候,如果初始群组没有其他成员,那么该用户的初始群组也会被删掉
ENCRYPT_METHOD SHA512

        5.  创建用户的时候,涉及到的参考文件

            /etc/default/useradd  

            /etc/login.defs

            /etc/skel/*          

            /etc/passwd

            /etc/shadow

            /etc/group

            /etc/gshadow

    2.  设置密码

        1.  passwd

            --stdin  常用于shell脚本中,批量创建用户的密码

                命令行:  echo "aaaaa"  | passwd --stdin yangjianbo  脚本中使用双引号,命令行使用单引号                

            -l  会在用户的密码前面添加!!,用户就无法登陆系统

            -u  解锁用户密码,与-l相对

            -S  查看用户密码信息

            -n  修改/etc/shadow的第四个字段,不可修改密码天数

            -x  修改/etc/shadow的第五个字段,多久内必须更改密码

            -w  修改/etc/shadow的第六个字段,过期前警告的天数

            -i  后面跟日期,密码失效日期             
    3.  修改账号及密码期限的信息

        1.  chage命令

            -l  显示用户及密码的信息

            -d  修改最近一次修改密码的日期

            -E  修改账号过期时间  0表示马上过期,-1表示永不过期

            -M  密码保持有效的最大天数       

            -m  密码保持有效的最小天数,0为任何时候修改密码都可以

            -W  密码过期前,提前收到警告信息的天数

            -I  密码失效日期

        2.  例子

            设置用户yangjianbo,30天不准修改密码,60天必须修改密码,提前10天发出警告,过期后30天禁止用户登录系统

            chage -m 30 -M 60 -W 10 -I yangjianbo

    4.  修改账号信息

        1.  usermod

            -c  修改/etc/passwd第五列的说明栏

            -d  修改家目录

            -e  修改账号过期日期,后面跟日期

            -f  修改密码过期后多少天,密码失效

            -g  修改初始群组

            -G  修改次要群组

            -a  结合-G使用,添加用户到次要群组,同时并不删除用户在其它群组,如果不加-a,用户只能加入到当前次要群组

            -l  修改用户名称

            -s  修改用户shell

            -u  修改用户uid

            -L  锁定用户的密码

            -U  解锁用户密码

    5.  删除用户

        1.  userdel

            删除用户相关数据,如下:

            /etc/passwd,/etc/shadow

            /etc/group,/etc/gshadow

            /home/yangjianbo,/var/spool/mail/yangjianbo

            -r  把用户的家目录也删除  

    6.  查看uid/gid

        1.  id命令

            id yangjianbo

            uid=1000(zhangshaohua1510) gid=1000(zhangshaohua1510) 组=1000(zhangshaohua1510)   

    7.  修改用户的shell

        1.  chsh

            -l  列出当前用户所有的shell

            -s  修改当前用户的shell,后面接指定的shell

6.  组管理

    1.  增加组

         1.  groupadd

            -g  指定gid

            -r  创建系统群组

    2.  修改组

        1.  groupmod

            -g  修改群组gid

            -n  修改群组名称

    3.  删除组

        1.  groupdel

            groupdel 组名

            注意:后面接的组名,不要是别的用户的初始群组,否则删不掉群组

    4.  群组管理员

        1.  gpasswd

            -A  后面接用户,把某个用户设置为群组管理员

            -M  后面接用户,把用户加入到该群组

            -r  将群组的密码移除

            -R  将群组的密码栏失效

            切换为群组管理员后的参数

            -a  将某个用户加入群组

            -d  将某个用户移除群组

        2.  例子          

groupadd yunwei    #创建一个群组
gpasswd -A yangjianbo yunwei    #把用户设置为群组的管理员    
su - yangjianbo    # 切换为群组管理员账号
gpasswd -a redis yunwei    #添加某个用户为群组成员
gpasswd -d redis yunwei    #剔除某个用户出群组
su - root
groupdel yunwei   #删除群组

7.  账号管理实例

    1.  例子1,创建下面的账号

        

useradd -G mygroup1 -c "1st user" myuser1
useradd -G mygroup1 -c "2nd user" myuser2
useradd -c "3rd user" -s /sbin/nologin myuser3
echo "passwd" | passwd --stdin myuser1
echo "passwd" | passwd --stdin myuser2
echo "passwd" | passwd --stdin myuser3

    2.  例子2 

        我的使用者 pro1, pro2, pro3 是同一个项目计划的开发人员,我想要让这三个用户在同一个
目录底下工作, 但这三个用户还是拥有自己的家目录与基本的私有群组。假设我要让这个项目计划
/srv/projecta 目录下开发, 可以如何进行?

1.创建一个共同的目录
    mkdir -p /srv/project
2.单独创建一个属组,给这个目录
    groupadd project
    chgrp project /src/project
3.创建三个用户,并设置用户的次要群组为project
     useradd -G project pro1
     useradd -G project pro2
     useradd -G project pro3
4.授权给目录
   chmod 2770 /src/project

8.  ACL管理

    1.  针对方面

        使用者:针对用户设置权限

        群组:针对群组设置权限

        mask:针对在该目录下创建目录或文件时,设置默认权限

    2.  如何启动ACL

        centos的文件系统ext2/ext3/ext4/xfs默认都已经开启了ACL,如何检查系统是否开启ACL,执行下面的命令      

[root@dbbackup-server-50 ~]# dmesg  | grep -i acl
[    2.292406] systemd[1]: systemd 219 running in system mode. (+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ -LZ4 -SECCOMP +BLKID +ELFUTILS +KMOD +IDN)
[    4.460398] SGI XFS with ACLs, security attributes, no debug enabled

    3.  设置ACL

        1.  setfacl命令

            -m  设置后续的acl参数给文件使用,不可与-x合用

            -x  删除后续的acl参数,不可与-m合用

            -b  删除所有的acl参数

            -k  删除默认的acl参数

            -R  递归设置acl,包括子目录

            -d  设置默认acl

        2.  查看acl命令----getfacl

    4.  例子

        1.  为指定用户设置某个文件的acl权限        

setfacl -m u:mysql:rx yangjianbo

            设置完成后,会在文件权限的位置添加一个+号,说明有其他的权限

-rw-r-xr--+ 1 root root    0 Sep 14 23:14 yangjianbo

            查看该目录的acl权限

            getfacl yangjianbo

[root@manager ~]# getfacl yangjianbo
# file: yangjianbo
# owner: root
# group: root
user::rw-  属主的权限
user:mysql:r-x  mysql用户的权限
group::r--  属组的权限
mask::r-x  默认的mask
other::r--  其他人的权限

        2.  为属主设置acl权限

            setfacl -m u::rwx yangjianbo

        3.  为其他群组设置acl权限

            setfacl -m g:mysql:rx yangjianbo

        4.  为属组设置acl权限

            setfacl -m g::rx yangjianbo          

[root@manager ~]# getfacl yangjianbo 
# file: yangjianbo
# owner: root
# group: root
user::rw-
group::r-x
group:mysql:r-x
mask::r-x
other::r--

        5.  设置有效权限     

setfacl -m u:msyql:rw yangjianbo  设置用户mysql可以对yangjianbo文件进行读写
setfacl -m m:r yangjianbo  设置有效权限为只读
su - mysql
mysql无法对yangjianbo进行修改数据和插入数据
通过mask来设置最大有效的权限

        6.  某个用户只有读取某个目录的权限,不可以有写入该目录的权限

setfacl -m u:mysql:rx /tmp/yangjianbo
su - mysql
cd /tmp/yangjianbo
touch a 
touch: cannot touch ‘a’: Permission denied

        7.  接上面的例子,如果我用其他用户创建文件或者目录,那么ACL 权限是否会继承呢?

            可以很明显看到,虽然父目录设置ACL,但是子目录并没有继承           

setfacl -m d:u:mysql:rx yangjianbo 设置继承用户的acl权限
su - mysql
cd /tmp/yangjianbo
touch e 
getfacl e
[root@manager yangjianbo]# ll
total 0
drwxr-xr-x  2 root root 6 Sep 15 23:56 a
drwxr-xr-x  2 root root 6 Sep 15 23:56 b
drwxr-xr-x  2 root root 6 Sep 15 23:56 c
-rw-r--r--  1 root root 0 Sep 15 23:56 d
-rw-r--r--+ 1 root root 0 Sep 16 22:54 e
drwxr-xr-x+ 2 root root 6 Sep 16 22:54 f
-rw-rw-r--+ 1 root root 0 Sep 16 22:56 w
看到文件权限后面的+号,说明已经继承acl已经生效了。

        8.  如何取消acl权限

            setfacl  -b yangjianbo  取消所有的acl权限

            setfacl -x u:mysql  取消指定的acl权限

            setfacl -x d:u:mysql  取消继承权限

        9.  不允许某个用户访问目录

            setfacl -m u:mysql:- yangjianbo

9.  使用者身份切换

    1.  su

        直接执行su,虽然已经切换为root,但是其实用的还是原来账号的shell环境

          使用的是non-login shell,可以使用env查看一下。

        -  不带用户的时候,切换为root,使用的是login-shell,使用的是root的shell环境    

        -l  与-类似

        -m  使用原来用户的shell环境,也是non-login shell  

        -p  使用原来用户的shell环境,也是non-login shell

        -c  只执行一次命令

          su - mysql -c "date"  切换为mysql

          su - -c "date"  切换为root用户

    2.  sudo

        可以以其它身份执行一些指令(通常都是使用普通用户以root身份执行一些指令)

        -u  后面跟用户名称    

[root@milanyi_docker_server ~]# sudo -u mysql touch /tmp/1.txt
[root@milanyi_docker_server ~]# ll /tmp/1.txt 
-rw-r--r-- 1 mysql mysql 0 9月  26 22:40 /tmp/1.txt
[root@milanyi_docker_server ~]# sudo -u mysql sh -c "echo yangjianbo > /tmp/2.txt"
[root@milanyi_docker_server ~]# ll /tmp/2.txt
-rw-r--r-- 1 mysql mysql 11 9月 26 22:41 /tmp/2.txt
[root@milanyi_docker_server ~]# cat /tmp/2.txt
yangjianb

        

        sudo执行的流程:

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

        visudo与/etc/sudoers

          visudo是修改/etc/sudoers的指令,使用root用户执行visudo,修改/etc/sudoers文件。

          1.  单一用户的配置,sudoers的语法

使用者账号       登入者的来源主机名=(可切换的身份)     可下达的指令
root             ALL=(ALL)             ALL <==这是默认值

          2.  使用某个组的配置     

## Allows people in group wheel to run all commands
%wheel  ALL=(ALL)       ALL

usermod -a -G wheel mysql

          3.  使用免密码的配置

%wheel        ALL=(ALL)       NOPASSWD: ALL

          4.  可切换的身份限制

zhangshaohua1510 ALL=(root) NOPASSWD: ALL  限制用户只允许切换为root,切换为其它用户就报无权
zhangshaohua1510@milanyi_docker_server ~]$ sudo -u mysql touch /tmp/4.txt

我们信任您已经从系统管理员那里了解了日常注意事项。
总结起来无外乎这三点:

    #1) 尊重别人的隐私。
    #2) 输入前要先考虑(后果和风险)。
    #3) 权力越大,责任越大。

[sudo] zhangshaohua1510 的密码:
对不起,用户 zhangshaohua1510 无权以 mysql 的身份在 milanyi_docker_server 上执行 /bin/touch /tmp/4.txt。

          5.  可执行的命令限制

zhangshaohua1510 ALL=(ALL) NOPASSWD: !/usr/bin/passwd,/usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root   限制用户修改root用户的密码
[zhangshaohua1510@milanyi_docker_server ~]$ sudo passwd mysql
更改用户 mysql 的密码 。
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
[zhangshaohua1510@milanyi_docker_server ~]$ sudo passwd root
对不起,用户 zhangshaohua1510 无权以 root 的身份在 milanyi_docker_server 上执行 /bin/passwd root。

          6.  别名的配置

User_Alias ADMPW = pro1, pro2, pro3, myuser1, myuser2
Cmnd_Alias ADMPWCOM = !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root
ADMPW ALL=(root) ADMPWCOM

10.  特殊的shell

      /sbin/nologin  使用这个shell的用户是不可以登录系统的。

      当使用/sbin/nologin的用户登录系统的时候,会有报错:

        This account is currently not available.

      如果想给一些/sbin/nologin用户一些提示,可以创建一个文件/etc/nologin.txt,里面可以填写一些内容。      

[root@milanyi_docker_server ~]# su - tcpdump
上一次登录:一 9月 27 21:58:24 CST 2021pts/1 上
This account is system account or mail account.
Please DO NOT use this account to login my Linux server.
xiaoxindian. 

11.  PAM模块

      1.  PAM简介

          PAM是一套应用程序编程接口,它提供了一连串的验证机制,只要用户将验证阶段的需求告知PAM后,PAM就能回报用户验证的结果(成功或失败)。

      2.  PAM配置文件

          放在/etc/pam.d/目录下

      3.  PAM配置文件语法

          查看一下/etc/pam.d/passwd,内容如下:         

#%PAM-1.0    pam的版本号
auth       include      system-auth
account    include      system-auth
password   substack     system-auth
-password   optional    pam_gnome_keyring.so use_authtok
password   substack     postlogin

          第一列  验证类型(type)

            auth

              主要用来检验用户的身份验证,通常需要密码来检验的。

            account

              主要用来检验用户是否具有正确的权限。例如:当你使用一个过期的密码登录时,当然就无法正确登录了。

            session

              用于记录用户登录与注销时的信息。例如:如果经常使用sudo或着su,会在/var/log/secure里面发现很多关于pam的说明,而且记载的数据是"session open,session close"的信息。

            password

              用于提供验证的修订工作。例如:修改或者更改密码

          第二列  验证的控制标志(control flag)

            required

              此验证成功则带有success的标志,若失败则带有failure的标志,但不论成功或失败都会继续后续的验证流程。

            requisite

              若验证失败则立刻回报原程序failure的标志,并终止后续的验证流程。若验证成功则带有success的标志继续后续的验证流程。

            sufficient

              若验证成功则立刻回传success给原程序,并终止后续的验证流程;若验证失败则继续后续的验证。

            optional

              大多是用来显示信息,并不是用来验证的。

            

 

      4.  常用模块简介

          /etc/pam.d/*:  每个程序个别的PAM配置文件

          /lib64/security/*:  PAM模块文件 的实际放置目录

          /etc/security/*:  其它PAM环境的配置文件

          /usr/share/doc/pam-*/:  详细的PAM说明文件

            例如:/usr/share/doc/pam-1.1.8/txts/README.pam_xauth

          模块介绍

            pam_securetty.so  限制系统管理员只能从安全的终端机登录,终端机的设置就在/etc/securetty这个文件中

            pam_nologin.so  限制一般用户是否能够登录主机。如果有/etc/nologin这个文件,那么一般用户登录的时候,就会把/etc/nologin的内容显示出来。这个对root或者已经登录系统的一般用户没有影响。

            pam_selinux.so  控制selinux的一个模块

            pam_console.so  让用户可以通过特殊终端接口(console)登录系统

            pam_loginuid.so  一般用户与系统用户的UID是不同的,使用这个模块来验证用户UID

            pam_env.so  用来设置环境变量的一个模块

            pam_UNIX.so  用于验证阶段的认证功能,用于授权阶段的账号许可证管理,用于会议阶段的日志文件记录

            pam_cacklib.so  用来检验密码的强度

            pam_limits.so  ulimit就是这个模块提供的

      5.  说一下login的PAM验证机制流程 

1. 验证阶段 (auth):首先, (a)会先经过 pam_securetty.so 判断,如果使用者是 root 时,则会参考 /etc/securetty
的设定; 接下来(b)经过 pam_env.so 设定额外的环境变量;再(c)透过 pam_unix.so 检验密码,若通过则回报 login 程序;若不通过则(d)继续往下以 pam_succeed_if.so 判断 UID 是否大于 1000 ,若小于 1000 则
回报失败,否则再往下 (e)以 pam_deny.so 拒绝联机。
2. 授权阶段 (account): (a)先以 pam_nologin.so 判断 /etc/nologin 是否存在,若存在则不许一般使用者登入;
(b)接下来以 pam_unix.so 及 pam_localuser.so 进行账号管理,再以 (c) pam_succeed_if.so 判断 UID 是否
小于 1000 ,若小于 1000 则不记录登录信息。 (d)最后以 pam_permit.so 允许该账号登入。
3. 密码阶段 (password): (a)先以 pam_pwquality.so 设定密码仅能尝试错误 3 次; (b)接下来以 pam_unix.so 透
过 sha512, shadow 等功能进行密码检验,若通过则回报 login 程序,若不通过则 (c)以 pam_deny.so 拒绝
登入。
4. 会议阶段 (session): (a)先以 pam_selinux.so 暂时关闭 SELinux; (b)使用 pam_limits.so 设定好用户能够操
作的系统资源; (c)登入成功后开始记录相关信息在登录文件中; (d)以 pam_loginuid.so 规范不同的 UID
权限; (e)开启 pam_selinux.so 的功能。

          查看/etc/pam.d/login的内容,如下:

[root@milanyi_docker_server etc]# cat /etc/pam.d/login 
#%PAM-1.0
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
auth       substack     system-auth
auth       include      postlogin
account    required     pam_nologin.so
account    include      system-auth
password   include      system-auth
# pam_selinux.so close should be the first session rule
session    required     pam_selinux.so close
session    required     pam_loginuid.so
session    optional     pam_console.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session    required     pam_selinux.so open
session    required     pam_namespace.so
session    optional     pam_keyinit.so force revoke
session    include      system-auth
session    include      postlogin
-session   optional     pam_ck_connector.so

      6.  为什么root无法以telnet登录系统,而ssh可以直接登录?

        1.  telnet使用login的PAM模块,而login的验证阶段会有/etc/securetty的限制,而远程连接属于pts/n的动态端口接口设备名称,并没有在/etc/securetty,因此telnet无法登录linux系统

        2.  ssh使用自己的/etc/pam.d/sshd模块,查看一下这个文件内容

[root@milanyi_docker_server etc]# cat /etc/pam.d/sshd 
#%PAM-1.0
auth       required     pam_sepermit.so
auth       substack     password-auth
auth       include      postlogin
# Used with polkit to reauthorize users in remote sessions
-auth      optional     pam_reauthorize.so prepare
account    required     pam_nologin.so
account    include      password-auth
password   include      password-auth
# pam_selinux.so close should be the first session rule
session    required     pam_selinux.so close
session    required     pam_loginuid.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session    required     pam_selinux.so open env_params
session    required     pam_namespace.so
session    optional     pam_keyinit.so force revoke
session    include      password-auth
session    include      postlogin
# Used with polkit to reauthorize users in remote sessions
-session   optional     pam_reauthorize.so prepare

          并没有/etc/securetty的限制,所以可以直接连接到系统。

      7.  其他相关文件

          limits.conf

            /etc/security/limits.conf           

#<domain>      <type>  <item>         <value>
#

#*               soft    core            0
#*               hard    rss             10000
#@student        hard    nproc           20
#@faculty        soft    nproc           20
#@faculty        hard    nproc           50
#ftp             hard    nproc           0
#@student        -       maxlogins       4

第一列
#        - a user name
#        - a group name, with @group syntax
#        - the wildcard *, for default entry
#        - the wildcard %, can be also used with %group syntax,
#                 for maxlogin limit

第二列
#        - "soft" for enforcing the soft limits
#        - "hard" for enforcing hard limits

第三列
#        - core - limits the core file size (KB)
#        - data - max data size (KB)
#        - fsize - maximum filesize (KB)
#        - memlock - max locked-in-memory address space (KB)
#        - nofile - max number of open file descriptors
#        - rss - max resident set size (KB)
#        - stack - max stack size (KB)
#        - cpu - max CPU time (MIN)
#        - nproc - max number of processes
#        - as - address space limit (KB)
#        - maxlogins - max number of logins for this user
#        - maxsyslogins - max number of logins on the system
#        - priority - the priority to run user process with
#        - locks - max number of file locks the user can hold
#        - sigpending - max number of pending signals
#        - msgqueue - max memory used by POSIX message queues (bytes)
#        - nice - max nice priority allowed to raise to values: [-20, 19]
#        - rtprio - max realtime priority

第四列
值  

          例子:

            1.  限制每个用户只能新建100MB的文件,且大于90MB会警告       

[root@study ~]# vim /etc/security/limits.conf
vbird1 soft fsize 90000
vbird1 hard fsize 100000

            2.  限制某个组,每次只能有一个用户登录系统   

@pro1 hard maxlogins 1

            3.  这个文件设置完成后,会立刻生效的。

12.  linux主机上的用户信息传递

      1.  查询用户信息

          w  显示当前登录的用户信息               

          who  显示当前用户信息

          last  登录成功用户信息

          lastb  登录失败用户信息

          lastlog  最近登录用户信息

      2.  用户交谈

          write  用户之间可以相互发送信息

            write  用户名  终端名

          mesg  如果用户不想接受信息,执行命令mesg n禁止发送消息到你的终端

               这个mesg n只针对普通用户,不针对root

              mesg y允许发送消息到你的终端

          wall  针对所有用户发消息

              wall "hello,word"

      3.  用户邮件信箱 mail

          上面的交互命令要等到用户都在线的时候使用,当用户不在线的时候,就需要使用mail命令

          mail yang

          输入邮箱主题,内容,最后使用  .   结束

          yang用户登录系统,输入mail就收到邮件了

13.  批量创建用户和密码

#!/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" file.
# 2. use openssl to create users password.
# 3. User must change his password in his first login.
# 4. more options check the following url:

export PATH=/bin:/sbin:/usr/bin:/usr/sbin

# 0. userinput
usergroup=""                   # if your account need secondary group, add here.
pwmech="openssl"               # "openssl" 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

  

    

 

posted @ 2018-10-11 00:12  奋斗史  阅读(436)  评论(0)    收藏  举报