用户和组管理
 为什么要有用户和组管理?
  为了安全和任务分配(身份认证)
 形式: 
  AAA(Cisco开发并建立):
  1、 验证(Authentication): 验证用户是否可以获得访问权限。
   2、 授权(Authorization) : 授权用户可以使用哪些服务。
  3、 记账(Accounting) : 记录用户使用网络资源的情况。
       /////Linux是一种多任务、多用户操作系统
    /////能实现资源使用和完成任务的主体是应用程序进程
 安全上下文:secure context
  进程是以其发起者的身份运行的;可以理解为,进程的所有者就是其发起者;每个进程上都会标记上所有者的身份信息;
  当进程试图访问资源的时候,安全上下文会比对进程的所有者和资源的所有者之间的关系:
   首先查看进程的所有者是否和资源的所有者为同一用户,如果是,就按照所有者拥有的权限来使用资源;
   如果不是,则判断进程的所有者是否属于该资源所属组的成员;如果是,按照所属组的权限来使用资源;
   如果不是,就按照最为普通的其他用户的权限来使用资源;
 用户帐户:是实现操作者和计算机交互式操作的基础 
  超级用户(管理员root)
  普通用户: 系统用户(非登录用户):为了保证系统安全,往往会让某些进程或服务必须以非管理员的用户身份运行;此类用户一般不允许登录到系统
    登录用户:能够通过登录行为验证用户身份进而获得资源访问权限并可以对资源进行操作的用户,称为登录用户;
 用户帐户的标识方式:
  用户登录名称:
   为操作者提供简单易记的字符串标识;
  用户的数字ID(UID):
   为计算机操作系统提供的标准的数字标识符号,0~2^(32-1)
 超级用户:
  用户名:root
  UID:0
 普通用户:
  系统用户:
   CentOS 6以前的版本:1~499
   CentOS 7以后的版本:1~999
  登录用户
   CentOS 6以前的版本:500+
   CentOS 7以后的版本:1000+
  *注意:60000以上的UID通常需要用户自定义标识;
 名称解析:
  用户名和UID的转换
  用户名解析库: /etc/passwd
   操作系统中的认证组件通过解析库实现认证机制,即验证登录用户是否为已经存在的用户;
  用户的认证库: /etc/shadow
   通过此前的解析库认定用户是存在的,在经过认证库的认证,来证明是其声明的用户;
  默认的认证机制:密码认证
  密码复杂性要求:
   a)避免使用有规律的或者来源于字典中的字符串作为密码;
   b)密码要足够长,一般不得少于6个字符;
   c)密码要足够复杂,其中应该至少包括大写字母,小写字母,数字极其他符号
   d)不定期更换
  在linux中,保存到认证库的密码是经过加密算法处理过的;
  加密密码算法:
   MD:
    MD5(Message Digest Version 5),消息摘要算法第五版
    128位定长输出
   SHA(Secure Hash Algorithm 安全的哈希算法):
    sha1:160加密输出
    sha224:
    sha256:
    sha384:
    sha512:默认的加密算法
   salt:通过随机算法计算得到的随机数
   随机数的生成装置:
    /dev/random
    仅仅从熵池中返回随机数;如果熵池中随机数耗尽,进程会被阻塞;
    /dev/urandom
     首先试图从熵池中返回随机数,如果熵池中随机数耗尽,则利用伪随机数生成器生成伪随机数
   在认证库中的密码的最终形态:算法+salt+加密字符串
    算法:$1~$6
    salt:$+随机字符串
    加密字符串:$+单向加密的结果
 组帐户: 将相同的用户或相似属性的用户联系在一起以便于集中授权的集合
 组的分类:
  超级用户组
  普通用户组
   系统用户组
   登录用户组
 组帐户的标识方法:
 组帐户名称:
 组帐户ID(GID) 
 超级用户组:0
 普通用户:
  系统用户组:
   CentOS 6以前的版本:1~499
   CentOS 7以后的版本:1~999
  登录用户组:
   CentOS 6以前的版本:500+
   CentOS 7以后的版本:1000+
 组名解析:
  解析库:/etc/group
  认证库:/etc/gshadow
  组也需要使用密码加密保护
 用户帐户和组帐户之间的关系: 
  在linux中,每个用户必须至少属于一个组
  用户帐户的GID标识被称为用户的主要组(基本组),primary
  Group:每个用户必须要有主要组,而且只能有一个,在主要组的基础之上,用户可以与其他的组帐户存在逻辑关系,称为用户的附加组(附属组),Addition
  Group:对于用户来说,此类组可以没有,也可以有多个。
 用户和组的管理命令:
  组帐户的管理命令:
   groupadd、groupdel、groupmod(修改组的信息)
  用户帐户管理的命令
   useradd、userdel、usermod
  认证相关的命令:
   passwd(设置用户密码...)、gpasswd(设置组密码...)
  其他的相关命令:
   chage(修改密码时间),chsh(修改设定用户shell),finger(检查用户状态信息),su(切换用户身份),id(查看用户UID,GID信息)
 与用户和组相关的命令
  1.groupadd - 创建一个组
  格式: groupadd [选项] group
  常用选项:
   -g GID, 指定要创建组的GID
   -r, 创建一个系统组。保证GID在指定的范围内
  2. groupdel - 删除一个组
  格式:groupdel [选项] GROUP
   *注意:如果某个组是某个系统用户的主要组,则改组不能删除;
  3. groupmod - modify a group definition on the system
  格式:groupmod [选项] GROUP
   常用选项:
    -g GID:修改指定组的GID
    -n newname name,修改指定组的组帐户名称
  4.useradd - 创建一个新用户或更新默认新用户信息
   useradd [选项] 登录
          useradd -D [选项]
    常用选项:  -c, --commentCOMMENT为用户添加注释信息
      -d, --home-dir HOME_DIR 为用户指定家目录的路径
      -e, --expiredateEXPIRE_DATE用户密码的过期的绝对时间
      -f, --inactiveINACTIVE为用户指定密码使用到达最大时间之后的宽限期
      -g, --gidGROUP为用户指明GID;如果不写此选项,系统会创建一个与用户名相同的组并且将之设置为此用户的主要组
      -G, --groupsGROUP1[,GROUP2,...[,GROUPN]]]为用户添加附加组
      -m, --create-home必须为用户创建家目录
      -M, --no-create-home不为用户创建家目录;在创建系统用户时常用此选项
      -s, --shellSHELL为用户指定默认的shell
      -u, --uidUID为用户指定UID
      -r, --system创建一个系统账户。
  5.userdel - 删除用户账户和相关文件
   格式:userdel [选项] 登录
    常用选项:-r, --remove删除用户的同时用户主目录和用户邮箱一起删除
  6.usermod - 修改一个用户账户
   格式:usermod [选项] 登录
    常用选项:
     -c, --commentCOMMENT修改用户的注释信息
     -d, --homeHOME_DIR修改用户的家目录
     -e, --expiredateEXPIRE_DATE修改用户密码过期的绝对日期
     -f, --inactiveINACTIVE修改用户密码过后的宽限期
     -g, --gidGROUP修改用户的主要组(GID)
     -G, --groupsGROUP1[,GROUP2,...[,GROUPN]]修改用户的附加组为此列表中的组,如果同时使用了-a选项,则保留原有的附加组,将此列表中的组追加至用户的附加组列表
     -l, --loginNEW_LOGIN修改用户的登录名
     -s, --shellSHELL修改用户登录的shell
     -u, --uidUID修改用户的UID
     -L, --lock锁定用户
     -U, --unlock解锁被usermod -L锁定的用户 优先级高于passwd
  7.passwd - update user's authentication tokens
   格式:passwd  [-k] [-l] [-u [-f]] [-d] [-e] [-n mindays] [-x maxdays] [-w warndays] [-i inactivedays] [-S] [--stdin] [username]
    常用选项:
     -l, --lock 锁定用户
     -u, --unlock 解锁用户
     --stdin通过标准输入接受密码,可以用于管道
     -d, --delete删除用户密码,也可以用于解除用户锁定
     -e, --expire直接设置用户密码过期
     -n, --minimum DAYS用户密码的最短使用时长 默认值为0
     -x, --maximum DAYS用户密码的最长使用时长 默认值为99999
     -w, --warning DAYS用户密码过期之前多少天开始发送警告信息
     -i, --inactive DAYS用户密码过期之后的宽期限
     -S, --status
  8.chage - 更改用户密码过期信息
   格式:chage [选项] 登录
    常用选项:
     -d, --lastdayLAST_DAY修改密码的最后期限
     -E, --expiredateEXPIRE_DATE修改过期时间
     -I, --inactiveINACTIVE修改宽限期
     -l, --list现实账户年龄信息
     -m, --mindaysMIN_DAYS修改密码最短的有效时间
     -M, --maxdaysMAX_DAYS修改密码最长的有效时间
     -W, --warndaysWARN_DAYS修改警告时间
  9.chsh - 改变登录 shell
   格式:chsh [ -s shell ] [ -l ] [ -u ] [ -v ] [ username ]
  10.finger — 用户信息查找程序
   格式:finger [-lmsp] [user ...] [user@host ...]
  11:id - 显示真实和有效的 UID 和 GID
   格式:id [OPTION]... [USERNAME]
    常用选项:
     -u, --user只显示用户ID
     -g, --group只显示组ID
     -n, --name对于-ugG显示名字而不是数值
  12.su - 运行替换用户和组标识的shell
   格式:su [OPTION]... [-] [USER [ARG]...]
    常用选项:
     -, -l, --login使得shell为可登录的shell,以后面的身份登录到系统
     -c, --commmand=COMMAND以前面指定的用户身份运行COMMAND;不进行身份登录切换