欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

Linux 用户和组管理

程序员文章站 2022-07-01 22:34:54
安全AAA认证 Authentication :认证用户的身份(用户名和对应口令) Authorization :授权(依据认证结果,不同的用户权限不一样) Accouting /Audition :计费/审计 用户和组 操作系统没有用户的情况下也是可以正常运行的;用户是资源获取标识符,是资源分配和 ......

安全aaa认证
  authentication :认证用户的身份(用户名和对应口令)
  authorization :授权(依据认证结果,不同的用户权限不一样)
  accouting /audition :计费/审计

用户和组
  操作系统没有用户的情况下也是可以正常运行的;用户是资源获取标识符,是资源分配和安全权限模型的核心要素之一;密码口令用来实现用户认证

  信息库:用户 密码
  名称解析:将用户名解析为user identifier uid
  容器:能够容纳很多用户的容器叫组(group)或者角色(role),可以给容器分配权限
  组名:group identifier gid
  解析:在数据库中按搜索码查找到对应的条目,并找到与之对应额外其他数据的过程

 账号存储在数据库中,数据库可以是文本文件格式、sql数据库、 ldap(用来放用户账号的数据库),linux的账户信息存储在文本文件中

 用户
  用户标识:uid(16bit 0-65535)
    管理员:root的uid为0
    普通用户:uid为1-65535,普通用户又分为系统用户和登录用户两种
  系统用户:
    uid为 1-499(centos6) 1-999(centos7)
    这些uid系统保留,作为系统账号,如运行守护进程的账户
  登录用户:
    uid为 500-60000(centos6) 1000-60000(centos7)通过交互方式登录

 系统用户:为了能够让后台进程或服务类进程以非管理员的身份运行,通常需要为此创建普通用户,这类用户从不用登录系统,只是为了能够让其以普通用户的身份运行进程,获取普通用户权限

  组
    管理员组:root组的gid为0
    普通用户组:gid为1-65535,普通用户组又分为系统用户组和登录用户组两种
      系统用户组:
      gid为1-499(centos6) 1-999(centos7)
    登录用户组:
     gid为 500-60000(centos6) 1000-60000(centos7)

  linux用户所属组的类别:
    用户的基本组:用户必须属于一个且只有一个基本组;基本组名默认与用户名相同,且仅包含一个用户,也叫私有组(即:新建的用户,也会建一个组,但组里只有用户自己)
    用户的附加组:基本组以外的组属于用户的附加组(或者额外组)

    注意:
      一个用户只属于一个基本组,但是可以属于零个或多个附加组
      除用户的基本组外,其余所属的组都为附加组
    系统识别用户不是通过用户名,而是uid

  安全上下文:运行中的进程有其属主和属组,进程是否有权限访问文件取决于启动这个进程的属主或属组是否有权限

加密方法介绍:
  对称加密:加密和解密使用相同的秘钥称为对称加密(des、3des、aes)
 非对称加密:加密和解密使用不同的秘钥为非对称加密(dsa、rsa)
 单向加密:雪崩效应、定长输出、不可逆
  md5   信息摘要,128bit定长输出16个字符
  sha1  安全的哈希算法 160bit(sha256、sha512)
  centos5中密码加密用的md5,centos6/7中密码加密用的sha512

用户和组的配置文件
  /etc/passwd文件格式
   用户名:密码占位符:uid:gid(基本组id):用户备注信息:家目录:默认shell

/etc/shadow文件格式:
   用户名:$加密算法类型$盐$加密后密码:最近一次的密码修改时间:密码最短使用期限:密码最长使用期限:警告区间:非活动区间:账号过期期限:预留段
      $加密算法类型$8位盐$加密后的密码
        加密算法类型"1"表示md5,"5"表示sha256,"6"表示 sha512
       md5sum、sha512sum命令可以计算文件的信息摘要
       例子:用于生成用户的密码信息填写到/etc/shadow
         openssl passwd -l -salt 12345678
          -1为指定的加密算法为md5,-salt指定盐为12345678
      最近一次密码修改时间:最近一次修改密码距离1970年1月1日的天数
      密码最短使用期限:密码不可以被更改的天数;如果是0表示密码随时可以更改;如果为20那么设定密码后,20 天之内无法更改密码
      密码最长使用期限:密码到期需要更改的天数;如果是99999表示密码永不过期;如果密码到期还没更改就登录不了系统
      密码到期前警告天数:在密码最长使用期限前面几天开始警告密码快到期需要更改密码
      非活动区间:密码最长使用期限过了还没有更改密码,还可以使用该密码登录系统的天数,但是每次登录就强制要求修改密码,不修改密码登录不了系统
      账号过期期限:账号过期距离1970年1月1日的天数;如果为 20 ,1970年1月21账号过期登录不了系统
      预留段:目前未使用

密码期限图:

Linux 用户和组管理

 /etc/group文件格式:
  组名:密码占位符:gid:以当前组为附加组的用户列表(多个用户以逗号隔开)
  注意:新用户添加或删除附加组,必须重新登录才能够表现出来

/etc/gshadow文件格式:
  组名:组密码:组管理员列表:以当前组为附加组的用户列表
  组密码:一般不对组设置口令,如果设置了,普通用户知道口令后便可直接加进来,不设置反而更加安全
  组管理员列表:可以更改组密码和组成员的用户列表

 /etc/shells  当前系统支持的shell列表
 /etc/skel  创建用户的时候会将skel目录中的文件复制到创建用户的家目录中
 /etc/default/useradd 创建用户时候定义的默认参数
 /etc/login.defs 设置密码文件shadow中的默认参数

用户和组管理命令
useradd、usedel、passwd、usermod、chsh、chage、chfn、groupadd、groupmod、groupdel、su

  useradd(adduser是useradd的软连接)
    -u uid  指定uid
  -g gid  指定gid,即用户的基本组,但gid要事先存在
  -g gid  指定用户的附加组,但gid要事先存在
  -d 目录  指定家目录,目录最好不存在,如果该目录存在就不能将skel中的文件复制到该目录中
  -c 备注  指定备注信息(comment)
  -s shell  指定默认shell,应该指定使用/etc/shells文件中出现的shell
  -m    创建用户时,强制给用户创建家目录
  -m    创建用户时,但不创建家目录
  -d    为useradd命令创建用户指定新的默认值,结合-d、-s改变其创建用户时默认家目录和默认shell等
  -r    创建系统用户特点:id 1-499,不会为用户创建家目录 ,默认shell为/sbin/nologin

  userdel 删除用户,默认会保留家目录
 userdel username
  -r 删除用户的时候同时删除用户的家目录和邮箱目录

  passwd 设定用户密码
  普通用户直接用passwd修改密码
  管理员:
    改自己密码直接用passwd
    改其他用户密码passwd username
  -l 锁定指定用户/etc/shadow文件中密码字段前加两个!
  -u 解锁指定用户
  -e 强制用户下次登录修改密码(直接让密码过期)
  -n days 指定密码最短使用期限
  -x days 指定密码最长使用期限
  -w days 密码到期前多少天开始警告
  -i days 非活动期限
  --stdin 从标准输入接收用户密码
  用法:echo "password" | passwd --stdin username
 密码安全性策略:足够复杂、足够长;交叉使用数字、大写字母、小写字母和特殊字符中的至少三种;尽量避免使用易猜测的密码;定期更换

  usermod  跟useradd命令使用方法类似
  -u  修改uid
  -g 修改gid
  -g 默认会覆盖原有的附加组,如果要是添加,可以同时使用-a选项
  -c 修改注释
  -d 修改用户的家目录;默认不会迁移用户的家目录,只是改/etc/passwd中的属性信息;如果要迁移,同时使用-m选项
  -s  修改shell    
  -l  修改用户登录名称,只能改用户名不能修改基本组
  -e  过期期限
  -f  非活动期限
  -l 锁定用户密码,即在用户的密码串之前添加"!"
  -u 解锁用户密码,即在用户的密码串之前去掉"!"

  chage  修改用户的日期属性
  -e  账号过期期限,距离1970-1-1号的时间天数,过了这个时间,账号不可登录
  -i 修改非活动区间
  -m 修改密码最小使用时间
  -m 修改密码最长使用时间
  -w 警告时间

  getent  用来察看系统的数据库中的相关记录
   getent [选项...] 数据库名 [键 ...]
  getent passwd root  查看认证passwd数据库中root记录信息
  getent hosts baidu.com  查看hosts主机解析数据库中baidu.com记录信息
  支持的数据库:ahosts ahostsv4 ahostsv6 aliases ethers group gshadow hosts netgroup networks passwd protocols rpc services shadow

  chsh   修改用户默认shell
  chfn   修改用户注释
  groupadd 创建组
  -g 创建组并为其指定gid
  -r 创建系统组
  groupmod 修改组信息
  -g 修改gid
  -n 修改用户的基本组名称
  groupdel 删除组

 groupmems 更改和查看组成员
  groupmems [options] [action]

   [options]
    -g 更改为指定组
  [action]
    -a username 指定用户加入组
    -d username 从组中删除用户
    -p 从组中清除所有成员
   -l 显示组成员列表

  groups  显示每个输入的用户名所在的全部组,如果没有指定用户名则默认为当前进程用户
  gpasswd 配置组密码;如果登录用户不属于该组,可以通过newgrp grpname切换基本组这时候需要输入该组密码
  -a 将用户添加至指定组中
  -d 从指定组中移除用户
  -a 设置对组有管理权限的用户列表
  newgrp 切换用户的基本组
  newgrp [-] [group]
   newgrp - 会模拟用户重新登录,以实现重新初始化其工作环境
    newgrp 临时切换基本组(只适用于当前用户切换)如果用户本不属于此组,则需要组密码

  newgrp类似login指令,它是以相同的帐号,另一个群组名称,再次登入系统。要使用newgrp指令切换基本组,用户必须是该组的用户,否则需要组密码。

演示:
# 创建用户arclinux和组mygrp,并使mygrp为arclinux的附加组
[root@centos7 ~]# groupadd mygrp
[root@centos7 ~]# useradd -g mygrp arclinux
[root@centos7 ~]# id arclinux
uid=1002(arclinux) gid=1003(arclinux) 组=1003(arclinux),1002(mygrp)

# 为组mygrp设定密码
[root@centos7 ~]# gpasswd mygrp
正在修改 mygrp 组的密码
新密码:
请重新输入新密码:

[root@centos7 ~]# getent gshadow mygrp
    mygrp:$6$fkckp/z12$fbiaff07c27oweshutwdsajfbvhlpe6cwz6l0qmjehv1j3djfsrb2y6ac.xrrdsbdw2s9v5cdjxsls0hxuxwm0::arclinux

# 切换到用户arclinux
[root@centos7 ~]# su - arclinux
[arclinux@centos7 ~]$ whoami
arclinux
[arclinux@centos7 ~]$ id
uid=1002(arclinux) gid=1003(arclinux) 组=1003(arclinux),1002(mygrp)

# 创建的新文件,这时是属于基本组arclinux
[arclinux@centos7 ~]$ touch test
[arclinux@centos7 ~]$ ll
总用量 0
-rw-rw-r-- 1 arclinux arclinux 0 2月 10 15:03 test

# 临时切换基本组
[arclinux@centos7 ~]$ newgrp mygrp

# 此时基本组已经变为mygrp
[arclinux@centos7 ~]$ id
uid=1002(arclinux) gid=1002(mygrp) 组=1002(mygrp),1003(arclinux)

# 再创建的新文件属于临时基本组mygrp
[arclinux@centos7 ~]$ touch test2
[arclinux@centos7 ~]$ ll
总用量 0
-rw-rw-r-- 1 arclinux arclinux 0 2月 10 15:03 test
-rw-r--r-- 1 arclinux mygrp 0 2月 10 15:04 test2
[arclinux@centos7 ~]$ exit
exit
[arclinux@centos7 ~]$ exit
logout

#-------------------------------------------------------------------------
# 如果是不属于mygrp组的用户想临时切换到此组,就需要输入组密码
[root@centos7 ~]# su - centos
上一次登录:五 2月 10 14:59:16 cst 2017pts/1 上

[centos@centos7 ~]$ id
uid=1001(centos) gid=1001(centos) 组=1001(centos)

[centos@centos7 ~]$ newgrp mygrp
密码: # 需要输入密码

[centos@centos7 ~]$ id
uid=1001(centos) gid=1002(mygrp) 组=1002(mygrp),1001(centos)

  newusers 批量创建用户
  chpasswd 批量修改用户密码
    chpasswd除了可以批量修改用户密码,也可以设置单个用户密码
  用法:echo username:password |chpasswd

Linux 用户和组管理

演示:
创建passwd格式的文件 newuser.txt
[root@centos7 ~]# vim user.txt
hehe:x:2000:2000::/home/hehe:/bin/bash
hehe1:x:2001:2001::/home/hehe1:/bin/bash
hehe2:x:2002:2002::/home/hehe2:/bin/bash

批量设置密码,同样要注意书写格式:
[root@centos7 ~]# vim p.txt
hehe:123456
hehe1:654321
hehe2:centos

使用newusers和chpasswd批量创建用户和设置口令
# 批量创建用户
[root@centos7 ~]# cat user.txt |newusers 或 newusers < user.txt
[root@centos7 ~]# tail -3 /etc/passwd
hehe:x:2000:2000::/home/hehe:/bin/bash
hehe1:x:2001:2001::/home/hehe1:/bin/bash
hehe2:x:2002:2002::/home/hehe2:/bin/bash

# 批量设置密码
[root@centos7 ~]# chpasswd < p.txt
[root@centos7 ~]# tail -3 /etc/shadow
hehe:$6$nvmtwwkv$fhx5xxvrao58de8uxfencgnjt6kyfovevczdaw3z1atomx1ec9dbknsqhpnm26jx.omavvhok02m4xuaixfcc.:17207:0:99999:7:::
hehe1:$6$eza5u/ajvej$srxtc9fnhncmndr1fsyqx.uxc1fkwwnw4ua6.m3dnqbqreauorcl7hznumpa1u6zmr4yahvy52lanqrbl9tgy1:17207:0:99999:7:::
hehe2:$6$4zwn/mkjp7qbphe/$brmhawigtoy8nt0uhwobmo5nlu.hgkf5m58arggajug/5vosi7v8mcf1fpfwsg91a1jqehhngimfzhsegwbh01:17207:0:99999:7:::

#复制家目录中的模板文件,初始化登录环境
[root@centos7 ~]# cp -a /etc/skel/. /home/hehe
[root@centos7 ~]# cp -a /etc/skel/. /home/hehe1
[root@centos7 ~]# cp -a /etc/skel/. /home/hehe2

[root@centos7 ~]# ls -a /home/hehe
. .. .bash_logout .bash_profile .bashrc .mozilla


  id  查看用户id信息
  -u 显示uid,跟-n一起使用则显示用户名
  -g 显示基本组id,跟-n一起使用则显示基本组名
  -g 显示所有组id,跟-n一起使用则显示所有组名
  -n 显示用户名

 who   显示当前登录用户
 whoami  显示当前终端登录的用户

切换用户
  交互式shell和非交互式shell区别(interactive shell and non-interactive shell)
   交互式模式就是在终端上执行,shell等待你的输入,并且立即执行你提交的命令。这种模式被称作交互式是因为shell与用户进行交互。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、退出。当你退出后,shell也终止了。

   非交互式模式,以shell script(非交互)方式执行。在这种模式 下,shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们。当它读到文件的结尾eof,shell也就终止了。可以通过打印“$-”变量的值(代表着当前shell程序的选项标志),查看其中是否有“i”选项(表示interactive shell)来区分交互式与非交互式shell。

 登录shell和非登录shell的区别
  登录shell:是需要用户名、密码登录后才能进入的shell(或者通过"--login"选项生成的shell)

  非登录shell:当然就不需要输入用户名和密码即可打开的shell,例如:直接命令“bash”就是打开一个新的非登录shell,在gnome或kde中打开一个“终端”(terminal)窗口程序也是一个非登录shell。
  执行exit命令,退出一个shell(登录或非登录shell都能退出)
  执行logout命令,退出登录shell(不能退出非登录shell)

  站在用户登录的角度来说,shell的类型:
  登录式shell切换:
    正常通过某终端登录
    su - username
    su -l username
    su - 切换到root用户获取root权限,并将shell环境切换为root的shell环境(能获得root用户的shell环境变量)

  非登录式shell切换:
    su username
    图形终端下打开命令窗口
    自动执行的shell脚本
    su 切换到root用户获取root权限,但保留普通用户的shell环境(不能获得root用户的shell环境变量)

  su命令执行后会将目录切换至原普通用户的工作目录,su -命令执行后会将目录切换至root用户的目录

 以指定用户运行要运行的命令(执行完指定的指令后,恢复原来的用户身份)
  su -c 'command' username