Linux是一个多用户、多任务的操作系统,多用户主要体现在用户角色的多样性,不同的用户所分配的权限不同,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统,这也是Linux系统比Windows系统更为安全的本质所在。

      在Linux操作系统中,每个文件、目录和进程,都归属于某一个用户,没有用户许可其它普通用户是无法操作的。系统默认安装时,系统用户名和UID是一对一的对应关系,一个UID 对应一个用户。而Linux系统也正是通过用户的LoginName所对应的UID来确认用户身份的。UID是系统确认用户身份及所拥有权限的唯一标识,相同UID的用户具有相同的身份和权限。

      UID一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问,另一方面也可以为用户提供安全性保护。每个用户账号都拥有一个惟一的UID和各自的Password。当一个用户在登录系统时,操作系统会通过比对用户登录时输入的用户名是否在/etc/password中存在,及用户输入的密码是否与/etc/shadow中通过借助于salt随机数及SHA512单向加密算法加密后存储的密码一致,来判断是否允许用户进行登录。用户如果在登录时键入正确的用户名和口令后,就能够进入系统和自己的主目录。

      在Linux系统中,系统是通过UID来区分用户权限级别的,而UID为0的用户被系统约定为是具有超级权限的root用户。我们可以通过/etc/passwd来查看UID为0的用户是root,而且只有root对应的UID为0。对于root用户来说,普通用户无法执行的操作,root用户都能完成,所以也被称之为超级管理用户,从这一点来看,root用户在系统中是无可替代的至高地位和无限制权限。

      root用户的特权性还表现在root用户在系统正常的许可范围内,可以超越任何用户和用户组来对对任何文件进行读取、修改、删除等操作;对可执行程序或进程的执行、终止等;对硬件设备的添加、创建和移除等;也可以对文件和目录进行属主和权限进行修改,以适合系统管理的需要。但值得注意的是,这种操作是在系统正常许可范围内的操作,有些操作就是具有超级权限的root也无法完成;比如/proc 目录,/proc是用来反应系统运行的实时状态信息的,因此即便是root用户也无能为力。

      与超级管理员root用户所相对的就是普通用户,普通用户一般都是受限用户,我们为了保证服务器的安全,并完成特定的系统任务,就必须为其创建相对应权限的普通用户,而普通用户又分为:
 1、系统用户
    在CetnOS系统6之前一般的系统普通用户的UID范围为:1-499,而从CentOS7开始系统普通用户的UID范围更改为1-999。
    系统用户一般主要供系统服务使用,一般默认不允许进行系统登陆。

 2、登录用户
    在CetnOS6系统之前一般的普通登录用户的UID范围为:500-60000,而从CentOS7开始普通登录用户的UID范围更改为1000-60000。
    登录用户一般是由操作系统超级管理员root用户根据实际业务需求添加并分配相应权限等。


      普通用户与root共用一个UID是非常危险的一件事情,比如我们把普通用户xlogin的UID改为0,事实上这个普通用户就具有了超级管理员权限,他的权限就和root用户一样;这事实上就造成了系统管理权限存在的安全隐患的风险。

      基于root具有至高无上的系统权限,root用户一般也只是被用来管理和维护系统时使用,所以日常运维工作中,建议一般使用普通用户身份进行登录和完成相关操作,如果确实必须使用用root权限才可以完成的工作,建议可以通过su或sudo来实现;切不可随意让一个用户和root分享同一个UID!


实现用户账号的管理,要完成的工作主要有如下几个方面:
    1、用户账号UID的添加、删除与修改。 
    2、用户口令Password的管理。
    3、用户组GID的管理。


1、用户账号UID的添加、修改与删除。

  添加用户账号就是在系统中创建一个新的用户账号,然后为新账号分配用户号、用户组、对用户进行描述、指定家目录和登录Shell等资源。
  添加新用户帐号使用useradd或者adduser命令,二者实际上是一个命令。adduser是useradd的链接文件。常用参数如下:

useradd [选项] 登录名
      -u, --uid UID:指定UID;
      -g, --gid GROUP:指定基本组ID,此组得事先存在;
      -G, --groups GROUP1[,GROUP2,...[,GROUPN]]]:指明用户所属的附加组,多个组之间用逗号分隔;
      -c, --comment COMMENT:指明注释信息;
      -d, --home HOME_DIR:以指定的路径为用户的家目录;通过复制/etc/skel此目录并重命名实现;指定的家目录路径如果事先存在,则不会为用户复制环境配置文件;
      -s, --shell SHELL:指定用户的默认shell,可用的所有shell列表存储在/etc/shells文件中;
      -r, --system:创建系统用户;
    注意:创建用户时的诸多默认设定配置文件为/etc/login.defs

      这里我以新建普通登录用户xlogin为例,指定UID为1100,GID为1200,其附加组为magedu,注释信息为Admin,家目录为/data/xlogin,shell为/sbin/nologin.

[root@xlogin ~]# groupadd magedu
[root@xlogin ~]# groupadd -g 1200 cetos
[root@xlogin ~]# tail -2 /etc/group
magedu:x:1000:
cetos:x:1200:
[root@xlogin ~]# useradd -u 1100 -g 1200 -G magedu -c "Admin" -d /data/xlogin -s /sbin/nologin xlogin
[root@xlogin ~]# tail -1 /etc/passwd
xlogin:x:1100:1200:Admin:/data/xlogin:/sbin/nologin
[root@xlogin ~]# id xlogin
uid=1100(xlogin) gid=1200(cetos) 组=1200(cetos),1000(magedu)

    useradd -D:显示创建用户的默认配置;

    useradd -D  选项: 修改默认选项的值,修改的结果保存于/etc/default/useradd文件中;

更改默认值
       只带 -D 选项使用时,useradd 将显示当前的默认值。-D 和其它选项配合使用时,useradd
       将为指定的选项更新默认值。有效的“更改默认值”选项有:       
       -b, --base-dirBASE_DIR
           新用户主目录的路径前缀。如果创建新账户时,没有使用 -d 选项,用户的名称将会缀在 BASE_DIR 的后边形成新用户的主目录名。
           这个选择在 /etc/default/useradd 中设置 HOME 选项。
       -e, --expiredateEXPIRE_DATE
           禁用此用户账户的日期。
           此选项在 /etc/default/useradd 中设置 EXPIRE 变量。
       -f, --inactiveINACTIVE
           密码过期到账户被禁用之前的天数。
           这个选项在 /etc/default/useradd 中设置 INACTIVE 变量。
       -g, --gidGROUP
           新用户初始组的组名或 ID (使用了 -N/--no-user-group 或者 /etc/login.defs 中的变量 USERGROUPS_ENAB 设置为 no
           时)。给出的组必须存在,并且数字组 ID 必须有一个已经存在的项。
           这个选项在 /etc/default/useradd 中设置 GROUP 变量。
       -s, --shellSHELL
           新用户的登录 shell 名。
           这个选项在 /etc/default/useradd 设置 SHELL 变量。
注意:
       系统管理员负责将默认的用户文件放在 /etc/skel/ 目录中(或者命令行上、/etc/default/useradd 中指定的任何其它目录)。
[root@xlogin ~]# useradd -D
GROUP=100
HOME=/home   #把用户的家目录建在/home中;
INACTIVE=-1  #是否启用帐号过期停权,-1表示不启用;
EXPIRE=      #帐号终止日期,不设置表示不启用;
SHELL=/bin/bash #新建登录用户的默认使用SHELL的类型;
SKEL=/etc/skel  #默认添加用户的目录默认文件存放位置;也就是说,当我们用adduser添加用户时,用户家目录下的文件,都是从这个目录中复制过去的;
CREATE_MAIL_SPOOL=yes
[root@xlogin ~]# cat /etc/default/useradd 
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes


  usermod命令:修改用户属性

usermod [选项] 登录
      -u, --uid UID:修改用户的ID为此处指定的新UID;
      -g, --gid GROUP:修改用户所属的基本组;
      -G, --groups GROUP1[,GROUP2,...[,GROUPN]]]:修改用户所属的附加组;原来的附加组会被覆盖;
      -a, --append:与-G一同使用,用于为用户追加新的附加组;
      -c, --comment COMMENT:修改注释信息;
      -d, --home HOME_DIR:修改用户的家目录;用户原有的文件不会被转移至新位置;
      -m, --move-home:只能与-d选项一同使用,用于将原来的家目录移动为新的家目录;
      -l, --login NEW_LOGIN:修改用户名;
      -s, --shell SHELL:修改用户的默认shell;
      
      -L, --lock:锁定用户密码;即在用户原来的密码字符串之前添加一个"!";
      -U, --unlock:解锁用户的密码;
      -e, --expiredate EXPIRE_DATE  设定帐户过期的日期为 EXPIRE_DATE
      -f, --inactive INACTIVE       过期 INACTIVE 天数后,设定密码为失效状态


      以修改用户xlogin的用户名为redhat为例,UID为1200,GID为1100,附加组改为ubuntu后,并新增附加组为fedora,修改注释信息为Linux,将原来的家目录/home/xlogin移动为新的家目录/data/redhat,默认shell为/bin/bash。并锁定用户redhat。

[root@xlogin ~]# groupadd ubuntu
[root@xlogin ~]# groupadd -g 1100 linux
[root@xlogin ~]# usermod -l redhat -u 1200 -g 1100 -G ubuntu xlogin
[root@xlogin ~]# groupadd -g 1110 fedora
[root@xlogin ~]# usermod -a -G fedora -c "Linux" -m -d /data/redhat  redhat
[root@xlogin ~]# id redhat
uid=1200(redhat) gid=1100(linux) 组=1100(linux),1201(ubuntu),1110(fedora)


2、用户口令Password的管理。

passwd命令:
    passwd [-k] [-l] [-u [-f]] [-d] [-e] [-n mindays] [-x maxdays] [-w warndays] [-i inactivedays] [-S] [--stdin] [username]
    (1) passwd:修改用户自己的密码;
    (2) passwd USERNAME:修改指定用户的密码,但仅root有此权限;
       -l:锁定用户; 
       -u:解锁用户;
       -d:清除用户密码串;
       -e: 强制用户下次登录时修改密码;
       -i DAYS:非活动期限;
       -n DAYS:密码的最短使用期限;
       -x DAYS:密码的最长使用期限;
       -w DAYS:警告期限;
       
      --stdin:
        echo "PASSWORD" | passwd --stdin USERNAME

/etc/passwd:用户的信息库
用户名:X占位符或加密的密码:用户UID:GID:注释信息:用户家目录:登录时默认shell程序        

[root@xlogin ~]# echo "linux" | passwd --stdin redhat     #通过标准输入的方式更改redhat用户密码为linux
更改用户 redhat 的密码 。
passwd:所有的身份验证令牌已经成功更新。

       测试过程中,发现使用usermod -L和passwd -l功能相同,都是在shadow文件中用户密码前加了个叹号,而且无论是使用usermod -L还是passwd -l锁定的用户,都可以使用passwd -u或者usermod -U进行解锁。

[root@xlogin ~]# passwd xlogin
更改用户 xlogin 的密码 。
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
[root@xlogin ~]# grep xlogin /etc/shadow
xlogin:!$6$3DmNUcUd$d0X/F9lKRDsGN55FPA.7NMyI6tsZ/gflJRQTXfaGF1VgNUxqNHVoKJtpkRihm/MPjcsxXBiRsPIt6616P/YMQ0:16781:0:99999:7:::
[root@xlogin ~]# passwd -d xlogin
清除用户的密码 xlogin
passwd: 操作成功
[root@xlogin ~]# grep xlogin /etc/shadow
xlogin::16781:0:99999:7:::
[root@xlogin ~]# usermod -L redhat
[root@xlogin ~]# passwd -l redhat
锁定用户 redhat 的密码 。
passwd: 操作成功
[root@xlogin ~]# grep redhat /etc/shadow
redhat:!!$6$PxHvSbEt$5KdCgVZCYOSMbfKULSy8/2AWqzReWvqcixxPzGhZh3/GAghcl39r9lFF5vEUiTunrUTJbgz9w9CsDagOEP5wS1:16781:0:99999:7:::
[root@xlogin ~]# usermod -U redhat
[root@xlogin ~]# grep redhat /etc/shadow
redhat:!$6$PxHvSbEt$5KdCgVZCYOSMbfKULSy8/2AWqzReWvqcixxPzGhZh3/GAghcl39r9lFF5vEUiTunrUTJbgz9w9CsDagOEP5wS1:16781:0:99999:7:::
[root@xlogin ~]# passwd -u redhat
解锁用户 redhat 的密码。
passwd: 操作成功
[root@xlogin ~]# grep redhat /etc/shadow
redhat:$6$PxHvSbEt$5KdCgVZCYOSMbfKULSy8/2AWqzReWvqcixxPzGhZh3/GAghcl39r9lFF5vEUiTunrUTJbgz9w9CsDagOEP5wS1:16781:0:99999:7:::
[root@xlogin ~]#

/etc/shadow:用户密码

[root@xlogin ~]# grep redhat /etc/shadow
redhat:$6$2JL5HiTd$/Rrz00GfvTeRs62r2bjlReN.q2ZB5c/:16781:10:20:5:9::
每一行给一个特殊帐户定义密码信息,每个字段用 : 隔开。
用户名:加密的密码:密码被修改的天数(自1/1/1970至今):密码最短使用期限:密码最长使用期限:密码变更前提前几天警告:过期期限:保留字段 
字段 1 定义与这个 shadow 条目相关联的用户帐户。 
字段 2 用户加密后的密码
字段 3 自 1/1/1970 起,密码被修改的天数 
字段 4 密码将被允许修改之前的天数(0 表示“可在任何时间修改”) 
字段 5 系统将强制用户修改为新密码之前的天数(1 表示“永远都不能修改”) 
字段 6 密码过期之前,用户将被警告过期的天数(-1 表示“没有警告”) 
字段 7 密码过期之后,系统自动禁用帐户的天数(-1 表示“永远不会禁用”) 
字段 8 该帐户被禁用的天数(-1 表示“该帐户被启用”) 
字段 9 保留供将来使用

      通过修改系统时间来观察密码被修改的天数变化,以及通过使用passwd相关命令,更改用户密码的最短使用期限为10天,密码的最长使用期限为20天,警告期限为5天。

[root@xlogin ~]# tail -1 /etc/shadow
redhat:$6$/Jp.z.c4$ndzgQX8.W4DlVKTJUNAFXaWjr1PczXVy2ZRFA3Mnb5w5Tf4Ca5RNIIcqj20gUd7IriOEEHQU.fSihbhMQzTOM/:16781:0:99999:7:::
[root@xlogin ~]# date 1212201520.30
2020年 12月 12日 星期六 20:15:30 CST
[root@xlogin ~]# passwd redhat
更改用户 redhat 的密码 。
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
[root@xlogin ~]# tail -1 /etc/shadow
redhat:$6$t5O9CWSY$sPUt4PCJseGYIOJl9HfchXv3V/K35jsoaUSHibukzPv2UCmiY6Z/8lQQy/QvRVgnDHaB1QVpttud47JkhPJ1T/:18608:0:99999:7:::
[root@xlogin ~]# tail -1 /etc/shadow
redhat:$6$t5O9CWSY$sPUt4PCJseGYIOJl9HfchXv3V/K35jsoaUSHibukzPv2UCmiY6Z/8lQQy/QvRVgnDHaB1QVpttud47JkhPJ1T/:18608:0:99999:7:::
[root@xlogin ~]# passwd -n 10 -x 20 -w 5 redhat
调整用户密码老化数据redhat。
passwd: 操作成功
[root@xlogin ~]# tail -1 /etc/shadow
redhat:$6$t5O9CWSY$sPUt4PCJseGYIOJl9HfchXv3V/K35jsoaUSHibukzPv2UCmiY6Z/8lQQy/QvRVgnDHaB1QVpttud47JkhPJ1T/:18608:10:20:5:::
[root@xlogin ~]# passwd -e redhat
正在终止用户 redhat 的密码。
passwd: 操作成功
[root@xlogin ~]# tail -1 /etc/shadow
redhat:$6$t5O9CWSY$sPUt4PCJseGYIOJl9HfchXv3V/K35jsoaUSHibukzPv2UCmiY6Z/8lQQy/QvRVgnDHaB1QVpttud47JkhPJ1T/:0:10:20:5:::

      passwd -e redhat命令,强制redhat用户在下次登录时必须修改密码。而且修改后的密码不能与之前的密码相同!但是如果root用户直接通过passwd redhat方式为用户修改修改密码的话,则修改后的密码可以与之前的密码相同。

Connecting to 172.16.200.10:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.WARNING! The remote SSH server rejected X11 forwarding request.
You are required to change your password immediately (root enforced)
Last login: Sat Dec 12 20:57:38 2015 from 172.16.200.1
WARNING: Your password has expired.
You must change your password now and login again!
更改用户 redhat 的密码 。
为 redhat 更改 STRESS 密码。
(当前)UNIX 密码:
[root@xlogin ~]# passwd -i 9 redhat
调整用户密码老化数据redhat。
passwd: 操作成功
[root@xlogin ~]# tail -1 /etc/shadow
redhat:$6$qB4EMVrt$oSkRK5lJFynrqlTwZLrqOd66DLyLGalQyuIOicyQsrdOGiUetM28QVzGIkfb2UsloI.R5uv3PkVvNCmbPYT3d.:16781:10:20:5:9::


      需要关注的文件: /etc/login.defs:

[root@xlogin ~]# cat /etc/login.defs |grep -v '^#\|^$'
MAIL_DIR /var/spool/mail   #创建新用户时所创建的相对应的mail文件目录;
PASS_MAX_DAYS 99999        #用户密码使用的最长天数;
PASS_MIN_DAYS 0            #密码修改之间最小的天数;
PASS_MIN_LEN 5             #用户密码的最小长度;
PASS_WARN_AGE 7            #密码过期之前7天开始提示;
UID_MIN                  1000                  #新建普通登录用户最小UID为1000;
UID_MAX                 60000                  #新建普通登录用户最大UID为60000;
SYS_UID_MIN               201                  
SYS_UID_MAX               999
GID_MIN                  1000
GID_MAX                 60000
SYS_GID_MIN               201
SYS_GID_MAX               999
CREATE_HOME yes
UMASK           077
USERGROUPS_ENAB yes
ENCRYPT_METHOD SHA512


userdel命令:删除用户   
    userdel [选项] 登录
             -r:删除用户时一并删除其家目录;

[root@xlogin ~]# tail -1 /etc/group
magelinux:x:1203:
[root@xlogin ~]# tail -1 /etc/gshadow
magelinux:!::
[root@xlogin ~]# ll -d /data/magedu/
drwx------. 3 magelinux magelinux 74 12月 13 08:56 /data/magedu/
[root@xlogin ~]# userdel -r magelinux
[root@xlogin ~]# ll -d /data/magedu/
ls: 无法访问/data/magedu/: 没有那个文件或目录
[root@xlogin ~]# tail -1 /etc/gshadow
centos:$6$FpLaakgRKbxBFU1$fjZ8eluskwj5qIPkYz1QXB24vc9kDVJnAVFLL9NjVAZLog9H29fIeMaGGNZ5v7Hj0wum4pkSNbViogiSr/pnL1::
[root@xlogin ~]# tail -1 /etc/group
centos:x:1202:
[root@xlogin ~]# tail -1 /etc/shadow
linux:!!:16781:0:99999:7:::
[root@xlogin ~]# tail -1 /etc/passwd
linux:x:1201:1100::/home/linux:/bin/bash


groupdel:删除用户组
     
     groupdel [选项] GROUP
     
     修改系统账户文件,删除与 GROUP 相关的所有项目。给出的组名必须存在。
     不能移除现有用户的主组。在移除此组之前,必须先移除此用户。
     需要手动检查所有文件系统,以确保没有遗留的属于此组的文件。

相关文件
       /etc/group
           组账户信息。
       /etc/gshadow
           安全组账户信息。     
     
[root@xlogin ~]# id redhat
uid=1200(redhat) gid=1100(linux) 组=1100(linux),1201(ubuntu),1110(fedora)
[root@xlogin ~]# grep ubuntu  
  


gpasswd命令:
    组密码文件:/etc/gshadow
    gpasswd [选项] group
      -a USERNAME:向组中添加用户
      -d USERNAME:从组中移除用户

newgrp命令:临时切换指定的组为基本组;
    newgrp [-] [group]
      -: 会模拟用户重新登录以实现重新初始化其工作环境;

[root@xlogin ~]# groupadd centos
[root@xlogin ~]# gpasswd centos
正在修改 centos 组的密码
新密码:
请重新输入新密码:
[root@xlogin ~]# grep centos /etc/gshadow
centos:$6$FpLaakgRKbxBFU1$fjZ8eluskwj5qIPkYz1QXB24vc9kDVJnAVFLL9NjVAZLog9H29fIeMaGGNZ5v7Hj0wum4pkSNbViogiSr/pnL1::
[redhat@xlogin ~]$ whoami 
redhat
[redhat@xlogin ~]$ id
uid=1200(redhat) gid=1100(linux) 组=1100(linux),1110(fedora),1201(ubuntu) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[redhat@xlogin ~]$ touch linux
[redhat@xlogin ~]$ ll
总用量 0
-rw-r--r--. 1 redhat linux 0 12月 12 21:38 linux
[redhat@xlogin ~]$ newgrp fedora
[redhat@xlogin ~]$ touch fedora
[redhat@xlogin ~]$ ll
总用量 0
-rw-r--r--. 1 redhat linux  0 12月 12 21:38 linux
-rw-r--r--. 1 redhat fedora 0 12月 12 21:39 fedora
[redhat@xlogin ~]$ exit
exit
[redhat@xlogin ~]$ newgrp centos
密码:
[redhat@xlogin ~]$ id
uid=1200(redhat) gid=1202(centos) 组=1100(linux),1110(fedora),1201(ubuntu),1202(centos) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[redhat@xlogin ~]$ touch centos
[redhat@xlogin ~]$ ll
总用量 0
-rw-r--r--. 1 redhat centos 0 12月 12 21:41 centos
-rw-r--r--. 1 redhat linux  0 12月 12 21:38 linux
-rw-r--r--. 1 redhat fedora 0 12月 12 21:39 fedora
chage命令:更改用户密码过期信息    chage [选项] 登录名
      -d:密码的上一次修改期限
      -E:过期日期
      -I:非活动期限
      -W:最长使用期限
      -m:最短使用期限
      -W:警告信息

id命令:显示用户的真实和有效ID;
    id [OPTION]... [USER]
      -u: 仅显示有效的UID;
      -g: 仅显示用户的基本组ID; 
      -G:仅显示用户所属的所有组的ID;
      -n: 显示名字而非ID;
      
[redhat@xlogin ~]$ id -G -n redhat
linux ubuntu fedora

 

  su命令:switch user
    登录式切换:会通过读取目标用户的配置文件来重新初始化
      su - USERNAME
      su -l USERNAME
    非登录式切换:不会读取目标用户的配置文件进行初始化
      su USERNAME
    注意:管理员可无密码切换至其它任何用户;
    -c 'COMMAND':仅以指定用户的身份运行此处指定的命令;
[root@xlogin ~]# su - redhat -c 'whoami'
redhat
[root@xlogin ~]# whoami 
root