管理用户与群组

- 创建、删除和修改本地用户帐户
- 为本地用户帐户更改密码和调整密码有效期
- 创建、删除和修改本地群组和群组会籍
- 配置超级用户访问权限

本地用户和组

什么是用户?

用户账户用于在可以运行命令的不同人员和程序之间提供安全界限。

用户类型

  • 超级用户

    用于管理系统,名称为root,UID为0;对系统具有完全访问权限。

  • 系统用户

    提供支持服务进程使用,有限的权限,通常不需要以超级用户身份运行,系统会为这些进程分配非特权账户。

  • 普通用户

    用户处理日常工作的普通用户账户,对系统具有优先的访问权限。

# 使用id,可以显示当前系统已登录用户的信息;id 用户名,可以显示该用户的基本信息。
[root@controller ~]# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[root@controller ~]# id root
uid=0(root) gid=0(root) groups=0(root)

# 查看与进程相关联的用户,可以使用ps -au命令,第一列显示的时用户名。
[root@controller ~]# ps au
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
gdm         2266  0.2  0.8 5252832 267392 tty1   Sl+  03:24   0:10 /usr/bin/gnome-shell
gdm         2665  0.0  0.0 679996 22376 tty1     Sl+  03:24   0:00 /usr/libexec/gsd-color
root        7824  0.0  0.0  27820  5456 pts/0    Ss   04:00   0:00 -bash
gdm         2702  0.0  0.0 367332 13068 tty1     Sl+  03:24   0:00 /usr/libexec/gsd-sound

# 查看文件所有者,可以使用ls -l,查看目录所有者,可以使用ls -ld;第三列为用户名。
[root@controller ~]# ls -l
total 8
-rw-------. 1 root root 1667 Nov  7 22:56 anaconda-ks.cfg
drwxr-xr-x. 2 root root    6 Nov  7 23:03 Desktop
drwxr-xr-x. 2 root root    6 Nov  7 23:03 Documents
drwxr-xr-x. 2 root root    6 Nov  7 23:03 Downloads
-rw-r--r--. 1 root root 1894 Nov  7 23:02 initial-setup-ks.cfg
drwxr-xr-x. 2 root root    6 Nov  7 23:03 Music
drwxr-xr-x. 2 root root    6 Nov  7 23:03 Pictures
drwxr-xr-x. 2 root root    6 Nov  7 23:03 Public
drwxr-xr-x. 2 root root    6 Nov  7 23:03 Templates
drwxr-xr-x. 2 root root    6 Nov  7 23:03 Videos
[root@controller opt]# ls -ld ansible/
drwxrwxr-x. 3 sunyinpeng sunyinpeng 29 Nov 16 07:27 ansible/

系统使用/etc/passwd文件存储本地用户信息

[root@controller ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
dovenull:x:970:970:Dovecot's unauthorized user:/usr/libexec/dovecot:/sbin/nologin
libvirtdbus:x:969:969:Libvirt D-Bus bridge:/:/sbin/nologin
sunyinpeng:x:1000:1000::/home/sunyinpeng:/bin/bash

每个字段用冒号隔开,分别为7个字段,含空字段;如下:

  • 用户的用户名。
  • 用户的密码,以加密方式存储,这里始终为x。当然现在已经移动到/etc/shadow文件中。
  • 用户账户的UID号。
  • 用户账户的主要组的GID号。
  • 用户的真实姓名。
  • 用户的主目录,其中包含有用户数据和配置设置。
  • 用户的默认shell程序。

什么是组?

组是需要共享文件和其他系统资源访问权限的用户的集合。用与向一组用户授予文件访问权限,而非仅仅向一个用户授予访问权限。

系统使用/etc/group文件存储本地组的信息。

[root@controller ~]# cat /etc/group
root:x:0:
bin:x:1:
mail:x:12:postfix
pulse-access:x:989:

每个字段用冒号隔开,分别4个字段,如下:

  • 组名称。
  • 组密码字段;该字段始终为x。
  • 组的GID。
  • 作为补充组的改组的成员的用户列表。

组的类型

  • 主要组

    每个用户有,且只有一个主要组;在创建新的普通用户时,会创建一个与该用户同名的新组,该组将用作新用户的主要组,而该用户也是这一用户专用组的唯一成员。

  • 补充组

    补充组的成员资格由/etc/group文件确定,根据所在的组是否具有访问权限,将授予用户对文件的访问权限。具有访问权限的组是用户的主要组还是补充组无关紧要。

管理本地用户账户

从命令行创建用户并设置密码

[root@controller ~]# useradd jerry
[root@controller ~]# useradd jerry
[root@controller ~]# ls /home/
jerry
[root@controller ~]# tail -1 /etc/passwd
jerry:x:1001:1001::/home/jerry:/bin/bash
[root@controller ~]# tail -1 /etc/group
jerry:x:1001:

[root@controller ~]# passwd jerry
Changing password for user jerry.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.

这时将创建一个名为jerry的新用户,设置用户的主目录和账户信息,并为用户jerry用户创建一个专用组。

创建和修改用户常用选项

修改用户的指定:usermod [选项 参数] username

选项说明
-c,–comment COMMENT将用户的真实姓名添加到注释
-g,–git GROUP为用户账户指定主要组
-G,–groups GROUPS为用户账户指定补充组
-a,–append利用-G选项将补充组添加到当前的组成员集合总,而不将补充组替换为新集合
-d,–home HOME_DIT为用户账户指定特定的主目录
-m,–move-home搭配-d使用,将用户主目录移到新的位置
-s,–shell SHELL为用户账户指定特定的登录shell
-L,–lock锁定用户账户
-U,–unlock解锁用户账户

UID范围

  • UID 0 始终分配至超级用户账户root。
  • UID 1-200 是一系列系统用户。
  • UID 201-999 是一系列系统用户,供文件系统中没有自己的文件的系统进程使用。
  • UID 1000+ 是可供分配给普通用户的范围。

从命令行删除用户

# userdel   从/etc/passwd中删除用户的详细信息,但保留该用户的主目录
[root@controller ~]# userdel sunyinpeng
[root@controller ~]# ls /home/
jerry  sunyinpeng
[root@controller ~]# grep sunyinpeng /etc/passwd
[root@controller ~]#
# userdel -r 从/etc/passwd中删除用户的详细信息,同时删除用户主目录;出于安全隐患,常加参数使用
[root@controller ~]# userdel -r jerry
[root@controller ~]# grep jerry /etc/passwd
[root@controller ~]# ls /home
sunyinpeng

获取超级用户访问权限

超级用户

root用户,该用户的特权高于文件系统上的一般特权,用于管理系统。要执行诸如安装或删除软件以及管理系统文件和目录等任务,必须将特权升级到root用户。

root用户拥有足以破坏系统的无限制权限,如果root账户泄露,则其他人就有可能拥有系统的管理控制权限,所以常以普通用户身份登录,仅在需要时升级到root用户特权。

通过su切换超级用户

常用su - 指令,从普通用户切换到root用户,需要输入密码;从root用户切换到普通用户,无需输入密码。

[root@controller ~]# su - jerry
[jerry@controller root]$ su root
Password:
[root@controller ~]# su - jerry

su与su - 的区别

su将启动非登录shell,su - 会启动登录shell。su - 将shell环境设置为如同用户重新登录一样,su仅以该用户身份启动shell,使用的还是原始用户的环境设置。

通过sudo运行命令

使用场景

为安全起见,当root用户设置没有有效的密码时,用户也无法通过密码使用root时,更不能su的时候,可以使用sudo获取root的访问权限。

su与sudo的区别

sudo通常要求用户输入自己的密码以验证身份,而不是输入他们尝试访问的用户账户的密码,也就是说用户使用sudo以root运行命令时,不需要知道root密码。而su则需要输入要切换到的用户的密码。

使用sudo执行的所有命令都默认将日志记录到/var/log/secure中。

[root@controller ~]# cat /var/log/secure
Nov 16 07:15:27 controller sudo[10093]: sunyinpeng : user NOT in sudoers ; TTY=pts/5 ; PWD=/home/sunyinpeng ; USER=root ; COMMAND=/bin/mkdir -p /opt/ansible/configure_users
Nov 16 07:18:40 controller su[10262]: pam_systemd(su:session): Cannot create session: Already running in a session or user slice
Nov 16 07:18:40 controller su[10262]: pam_unix(su:session): session opened for user root by root(uid=1000)
Nov 16 07:19:43 controller su[10262]: pam_unix(su:session): session closed for user root
Nov 16 07:20:57 controller su[10518]: pam_systemd(su:session): Cannot create session: Already running in a session or user slice
Nov 16 07:20:57 controller su[10518]: pam_unix(su:session): session opened for user root by root(uid=1000)
Nov 16 07:21:40 controller su[10518]: pam_unix(su:session): session closed for user root
Nov 16 07:22:29 controller su[10650]: pam_systemd(su:session): Cannot create session: Already running in a session or user slice
Nov 16 07:22:29 controller su[10650]: pam_unix(su:session): session opened for user root by root(uid=1000)
Nov 16 07:26:58 controller su[10650]: pam_unix(su:session): session closed for user root

通过sudo获取交互式root shell

作用:使系统上的非管理员用户账户能够使用sudo来运行su命令,从该账户运行sudo su - root或 sudo -i来获取root用户的交互式shell,而无需输入密码即可使用su。

sudo su - root与sudo -i的区别

  • sudo su - 命令可以完全像正常登录那样设置root环境,因为su - 命令会忽略sudo所做的设置。
  • sudo -i 命令的默认配置实际上会设置在一些细节上与正常登录不同的root用户环境。例如PATH环境变量。

配置sudo

sudo的主配置文件为/etc/sudoers,同时该配置文件中还包含/etc/sudoers.d目录中所有文件的内容,作为配置文件的一部分,为操作简单而便于管理,管理员只需要将相应的文件放入/etc/sudoers.d/目录中,即可为用户添加sudo访问权限。

例子

用户

# 为当前用户jerry启用完整的sudo访问权限(需要输入当前用户密码)
[root@controller ~]# cd /etc/sudoers.d/
[root@controller sudoers.d]# ls
[root@controller sudoers.d]# touch user
[root@controller sudoers.d]# vim user
jerry   ALL=(ALL)       ALL
## 测试
[jerry@controller sudoers.d]$ sudo su - root
[sudo] password for jerry:
[root@controller ~]#
# 为当前用户jerry启用完整的sudo访问权限(无需输入当前用户密码)
[root@controller sudoers.d]# vim user
jerry   ALL=(ALL)       NOPASSWD:ALL
## 测试
[jerry@controller sudoers.d]$ sudo su - root
[root@controller ~]#

# 为当前用户jerry所在的主要组jerry启用完整的访问权限(需要输入组中当前用户的密码)
[root@controller ~]# cd /etc/sudoers.d/
[root@controller sudoers.d]# touch group
[root@controller sudoers.d]# ls
group
[root@controller sudoers.d]# vim group
%jerry  ALL=(ALL)       ALL
## 测试
[jerry@controller sudoers.d]$ sudo su - root
[sudo] password for jerry:
# 为当前用户jerry启用完整的访问权限(无需输入组中当前用户的密码)
[root@controller sudoers.d]# vim group
jerry   ALL=(ALL)       NOPASSWD:ALL
## 测试
[jerry@controller sudoers.d]$ sudo su - root
[root@controller ~]#
参数说明
%jerry% 指定一个组,即jerry组
ALL=(ALL)指定可以包含此文件的任何主机,这个组可以运行任何命令
ALL指定组可以向任何用户一样运行这些命令
NOPASSWD允许用户不输入密码

管理本地组账户

groupadd命令用户创建组,当组存在时,用户才能添加其中;groupadd不带选项创建组时会使用/etc/login.defs文件中指定范围内的下一个可用GID。

创建组

常用参数参数说明
- g指定要使用组的特定GID
- r使用/etc/login.defs文件中系统GID有效范围内的GID创建系统组。
# /etc/login/defs中的SYS_GID_MIN和SYS_GID_MAX配置项定义系统GID的范围
[root@controller ~]# cat /etc/login.defs
#
# Please note that the parameters in this configuration file control the
# behavior of the tools from the shadow-utils component. None of these
# tools uses the PAM mechanism, and the utilities that use PAM (such as the
# passwd command) should therefore be configured elsewhere. Refer to
# /etc/pam.d/system-auth for more information.
......
# System accounts
SYS_GID_MIN               201
SYS_GID_MAX               999

# 当前系统组的GID范围201到999,所以在创建组时尽量避开这个范围,以免与系统组冲突
# 创建组,并指定GID
[root@controller ~]# groupadd -g 2000 sunyinpeng
[root@controller ~]# tail -1 /etc/group
sunyinpeng:x:2000:

# 带-r选项,则使用系统范围内的有效GID
[root@controller ~]# groupadd -r jiagou
[root@controller ~]# tail -2 /etc/group
sunyinpeng:x:2000:
jiagou:x:968:

修改组

groupmod可以更改现有组的属性。

常用参数参数说明
- n指定组的新名称
- g指定新的GID
# 更改组名
[root@controller ~]# tail -2 /etc/group
sunyinpeng:x:2000:
jiagou:x:968:
[root@controller ~]# groupmod -n yinpeng sunyinpeng
[root@controller ~]# tail -2 /etc/group
jiagou:x:968:
yinpeng:x:2000:

# 更改组ID
[root@controller ~]# tail -2 /etc/group
jiagou:x:968:
yinpeng:x:2000:
[root@controller ~]# groupmod -g 9000 jiagou
[root@controller ~]# tail -2 /etc/group
jiagou:x:9000:
yinpeng:x:2000:

删除组

使用groupdel命令

[root@controller ~]# tail -2 /etc/group
jiagou:x:9000:
yinpeng:x:2000:
[root@controller ~]# groupdel yinpeng
[root@controller ~]# tail -2 /etc/group
jerry:x:1000:
jiagou:x:9000:

更改组成员

使用usermod更改用户的组,主要通过用户管理进行控制。

常用参数参数说明
- g更改用户的主要组
- aG将用户添加到某一个补充组
# 更改用户jerry的主要组为jiagou
[root@controller ~]# id jerry
uid=1000(jerry) gid=1000(jerry) groups=1000(jerry)
[root@controller ~]# usermod -g jiagou jerry
[root@controller ~]# id jerry
uid=1000(jerry) gid=9000(jiagou) groups=9000(jiagou)

# 将tom用户添加到jiagou为补充组
[root@controller ~]# id tom
uid=1001(tom) gid=1001(tom) groups=1001(tom)
[root@controller ~]# usermod -aG jiagou tom
[root@controller ~]# id tom
uid=1001(tom) gid=1001(tom) groups=1001(tom),9000(jiagou)

用户密码管理

用户密码文件描述
/etc/passwd全局可读
/etc/shadow只有root用户可读

用户密码文件内容描述

/etc/passwd
[root@localhost ~]# cat /etc/passwd

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

/etc/passwd中每行都记录对应着一个用户,每行记录被冒号(:)分隔为7个字段,每个字段说明如下:

用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录shell
1、用户名是代表用户账号的字符串。
2、口令是一些系统中,存放着加密后的用户口令字。
3、用户标识号是一个整数,系统内部用它来标识用户。
4、组标识号字段记录的是用户所属的用户组。
5、注释性描述字段记录着用户的一些个人情况。
6、主目录也就是用户的起始工作目录,用户在登录到系统之后所处的目录。
7、用户登陆后,要启动一个进程,负责将用户的操作传给内核,这个进程是用户登录到系统后运行的命令解释器或某个特定的程序,即shell。
/etc/shadow
[root@localhost ~]# cat /etc/shadow

bin:*:18397:0:99999:7:::
daemon:*:18397:0:99999:7:::
adm:*:18397:0:99999:7:::
lp:*:18397:0:99999:7:::
sync:*:18397:0:99999:7:::

/etc/shadow的文件格式与/etc/passwd类似,由若干个字段组成,由pwconv命令根据/etc/passwd中的数据自动产生,字段之间用冒号(:)隔开,说明如下:

登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:非活动期:密码过期日:空
1、此密码所属账户的用户名,与/etc/passwd文件中的登录名相一致的用户账号。
2、此用户的加密密码。
3、上次更改密码的日期。
4、两次修改密码之间所需的最小天数。自用户上次更改密码以来到再次更改密码之前必须经过的最短天数。
5、密码保持有效的最大天数。
6、当用户在截止日期之前登录达到该天数时,会受到有关密码过期的警告。
7、非活动期,一旦密码过期,在这些天内仍可以接受登录。过了这一时期后,账户将被锁定。
8、密码过期日,给出的是一个绝对的天数,如果使用了这个字段,那么就给出相应账号的生存期。期满后,该账号就不再是一个合法的账号,也就不能再用来登录了。
9、最后一个字段通常为空,预留给未来使用。

例子:配置账户密码策略

1、配置用户必须每30天更改一次密码。

2、将servera、serverb、serverc账户设为从当前起90天后过期。

3、在账户过期日期的那天锁定账户。

4、更改serverb账户的密码策略,使其每15天要求创建新密码。

5、强制servera、serverb、serverc用户在第一次登录时更改密码。

6、禁止serverd和servere账户登录系统。

[root@localhost ~]# vim /etc/login.defs
[root@localhost ~]# grep PASS_MAX_DAYS /etc/login.defs
#       PASS_MAX_DAYS   Maximum number of days a password may be used.
PASS_MAX_DAYS   30
注释:
[root@localhost ~]# grep PASS /etc/login.defs
#       PASS_MAX_DAYS   Maximum number of days a password may be used.
#       PASS_MIN_DAYS   Minimum number of days allowed between password changes.
#       PASS_MIN_LEN    Minimum acceptable password length.
#       PASS_WARN_AGE   Number of days warning given before a password expires.
PASS_MAX_DAYS   30
PASS_MIN_DAYS   0
PASS_MIN_LEN    5
PASS_WARN_AGE   7

/etc/login/defs文件中的密码期限配置项,以设置默认的密码期限策略。
PASS_MAX_DAYS设置密码的最长期限。
PASS_MIN_DAYS设置密码的默认最短期限。
PASS_WARN_AGE设置密码的默认警告周期。
默认密码期限策略的任何更改都仅对新用户有效。现有用户将继续使用旧密码期限设置,而非新密码设置。
[root@localhost ~]# date -d "+90 days" +%F
2022-05-26
[root@localhost ~]# chage -E 2022-05-26 servera
[root@localhost ~]# chage -E 2022-05-26 serverb
[root@localhost ~]# chage -E 2022-05-26 serverc
[root@localhost ~]# usermod -L -e 2022-05-26 servera
[root@localhost ~]# usermod -L -e 2022-05-26 serverb
[root@localhost ~]# usermod -L -e 2022-05-26 serverc
[root@localhost ~]# chage -M 15 serverb
[root@localhost ~]# chage -d 0 servera
[root@localhost ~]# chage -d 0 serverb
[root@localhost ~]# chage -d 0 serverc
[root@localhost ~]# usermod -s /sbin/nologin serverd
[root@localhost ~]# usermod -s /sbin/nologin servere
注释:
chage:管理密码失效时间。
参数说明:
    -m 密码可更改的最小天数。为零时代表任何时候都可以更改密码。
    -M 密码保持有效的最大天数。
    -W 用户密码到期前,提前收到警告信息的天数。
    -E 帐号到期的日期。过了这天,此帐号将不可用。
    -d 上一次更改的日期
    -I 停滞时期。如果一个密码已过期这些天,那么此帐号将不可用。
    -l 例出当前的设置。由非特权用户来确定他们的密码或帐号何时过期。

usermod:修改账户设置
参数说明:
    -a append   把用户追加到某些组中,仅与-G选项一起使用。
    -c comment  更新使用者账号passwor中的注解栏,一般是使用chfn(1)来修改。
    -d home_dir 更新使用者新的登入目录;给定-m选项,使用者的旧目录会搬到新的目录去,旧不存在则建新的。
    -G group    修改用户所属的附加群组。
    -s shell    修改用户登入后所使用的shell。
    -u uid        修改用户ID。
    -e expire_date   加上使用者账号停止日期,日期格式为MM/DD/YY。
    -f inactive_days 账号过期几日后永久停权。当值为0时,立即停权。为-1时,关闭此功能。
    -g initial_group 更新使用者新的起始登入群组。群组ID必须参照既有的群组。群组ID预设值为1。
    -l login_name     修改用户帐号名称。
    -L    锁定用户密码,使密码无效。
    -U    解除密码锁定。

nologin shell:
用作不打算以交互方式登录系统的用户账户的替代shell。从安全角度来看,如果用户账户担当的职责不需要用户登录系统,则禁止用户账户登录系统是明智的。将用户登录的shell设为/sbin/nologin时,如果用户试图直接登录系统,nologin shell将关闭该连接。

例子:管理本地用户和组

1、在主机中创建的用户必须没30天更改一次密码。

2、创建一个业务组business,GID为35000。

3、为business的所有组成员配置管理权限,使其能够以任何用户身份执行任何命令。

4、创建zhangmou、limou和sunmou用户,并使business作为他们的补充组。

5、将zhangmou、limou和sunmou账户设为从当前起90天后过期。

6、更改limou账户的密码策略,使其每15天要求创建新密码。

7、强制zhangmou、limou和sunmou用户在第一次登录时更改密码。

1[student@controller ~]$ sudo vim /etc/login.defs 
[sudo] password for student: 
[student@controller ~]$ grep PASS_MAX_DAYS /etc/login.defs 
#    PASS_MAX_DAYS    Maximum number of days a password may be used.
PASS_MAX_DAYS    30
2[student@controller ~]$ sudo groupadd -g 35000 business
3[student@controller ~]$ sudo vim /etc/sudoers.d/business
[student@controller ~]$ sudo cat /etc/sudoers.d/business
%business    ALL=(ALL)    ALL
4[student@controller ~]$ sudo groupadd -g 35000 business
[student@controller ~]$ sudo useradd -G business zhangmou
[student@controller ~]$ sudo useradd -G business limou
[student@controller ~]$ sudo useradd -G business sunmou
[student@controller ~]$ sudo grep business /etc/group
business:x:35000:zhangmou,limou,sunmouou
5[student@controller ~]$ date -d "+90 days" +%F
2022-12-21 
[student@controller ~]$ sudo chage -E 2022-12-21 zhangmou
[student@controller ~]$ sudo chage -E 2022-12-21 limou
[student@controller ~]$ sudo chage -E 2022-12-21 sunmou 
6[student@controller ~]$ sudo chage -M 15 limou
[student@controller ~]$ sudo chage -l limou
#Last password change                    : Sep 22, 2022
#Password expires                    : Oct 07, 2022
#Password inactive                    : never
#Account expires                        : Dec 21, 2022
#Minimum number of days between password change        : 0
Maximum number of days between password change        : 15
#Number of days of warning before password expires    : 7 
7[student@controller ~]$ sudo chage -d 0 zhangmou
[student@controller ~]$ sudo chage -d 0 limou
[student@controller ~]$ sudo chage -d 0 sunmou 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值