第六章.管理本地用户和组
学习目标:
6.1描述用户和组的概念
哪些是用户
用户帐户是为在不同的人员和不同的程序间提供隔离,对外,用户使用用户名供人们使用。对内,系统分配惟一标示号(UID)来分辨不同的帐户。操作系统内部,每一个程序都作为特定用户执行。每一个文件,都属于特定的用户。
用户帐户有三种主要类型:超级用户、系统用户和普通用户
1.使用id命令显示当前已登陆用户的信息
[yanjianjun@ansible ~]$ id
uid=1000(yanjianjun) gid=1000(yanjianjun) groups=1000(yanjianjun)
2.使用id useranme显示其他用户信息
[yanjianjun@ansible ~]$ id student
uid=1001(student) gid=1001(student) groups=1001(student)
3.使用ls -l查看文件的属性
[yanjianjun@ansible ~]$ ls -l file1
-rw-rw-r-- 1 yanjianjun yanjianjun 0 Jan 11 11:28 file1
4.使用ls -ld查看目录的属性
[yanjianjun@ansible ~]$ ls -ld dir1
drwxrwxr-x 2 yanjianjun yanjianjun 6 Jan 11 11:29 dir1
5.使用ps命令,查看当前shell中的进程
[yanjianjun@ansible ~]$ ps
PID TTY TIME CMD
122308 pts/0 00:00:00 bash
122987 pts/0 00:00:00 ps
6.使用ps -a查看与某一终端相关联的所有进程
[yanjianjun@ansible ~]$ ps -a
PID TTY TIME CMD
122306 pts/0 00:00:00 su
122308 pts/0 00:00:00 bash
122998 pts/0 00:00:00 ps
7.使用ps -au查看与进程相关联的用户
[yanjianjun@ansible ~]$ ps -au
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 2065 0.0 0.0 110108 856 tty1 Ss+ Jan05 0:00 /sbin/agetty --noclear tty1 linux
root 102657 0.0 0.0 116896 3600 pts/0 Ss Jan09 0:00 -bash
root 122306 0.0 0.0 231876 3428 pts/0 S 11:28 0:00 su - yanjianjun
yanjian+ 122308 0.0 0.0 116660 3288 pts/0 S 11:28 0:00 -bash
yanjian+ 123035 0.0 0.0 155372 1872 pts/0 R+ 11:34 0:00 ps -au
帐户信息数据库文件/etc/passwd文件解析:
/etc/passwd文件中的每一行都包含了有关某个用户的信息,它分为七个以逗号分隔的主键。示例如下
yanjianjun:x:1000:1000::/home/yanjianjun:/bin/bash
1. 字段1:用户名
2. 字段2:旧版本用来存放用户密码,现在已移至/etc/shadow文件,该字段始终应为x。
3. 字段3:用户ID(UID)
4. 字段4:用户的组ID(GID)
5. 字段5:用户的真实姓名
6. 字段6:用户的家目录(也称主目录),shell启动时的初始目录,包含用户数据和配置设置。
7.字段7:用户的默认shell程序,用户登陆时运行/bin/bash程序。如果不允许用户进行交互式登陆,则设置为/sbin/nologin。
哪些是组
组是须要共享文件和其他系统资源访问权限的用户集合,组可以向一组用户授予文件访问权限。与用户相像linux创建用户组和用户,组也有组名称。在内部,系统通过分配惟一标示号(GID)来分辨不同的组。组名称和GID的对应关系储存在组帐号信息数据库中/etc/group。
/etc/group文件的每一行都包含了组相关的信息,主键以逗号分隔,如下示例:
yanjianjun:x:1000:
1.字段1:组名称
2. 字段2:旧版本中的组密码字段,该字段始终为x。
3. 字段3:组id(GID)
4. 字段4:作为附属组的用户列表
主要组和附属组
主组:每位用户都有一个主组,在/etc/passwd文件中GID号对应的组。默认情况下,在创建新用户时,会创建一个与用户同名的新组,该组将用作新用户的主要组。
附属组:用户也可以有附属组,附属组的成员资格由/etc/group文件确定。按照所在的组是否有访问权限,将授予用户对文件的访问权限。
6.2获取超级用户访问权限6.2.1超级用户
任何操作系统都具有超级用户,即具有操作系统全部权限的用户。在红帽Linux中,此用户为root用户。要执行例如安装或删掉软件以及管理系统文件和目录等任务,必须将特权提高到root用户。
虽然这么,这些无限制的特权也带来了职责问题。root用户拥有足以破坏系统的无限制权限,如删掉系统文件和目录,删掉用户帐户,以及添加侧门等。假如root帐户泄漏,则其他人就有可能拥有系统的绝对控制权。在本课程中,建议管理员以普通用户身分登入,仅在须要时升级到root用户。
警告:红帽建议管理员不直接以root身分登入,取而代之,系统管理员应该以普通用户登陆,之后使用其他机制(比如su、sudo或PolicyKit)临时活得超级用户特权。
6.2.2切换用户
su命令让用户切换至另一个用户帐号,倘若从普通用户执行su,系统会提示您输入要切换的帐户密码。当以root用户身分执行su时,则无需输入密码。
[root@ansible ~]# su - yanjianjun
Last login: Mon Jan 11 11:28:11 CST 2021 on pts/0
[yanjianjun@ansible ~]$
[yanjianjun@ansible ~]$ su - student
Password:
如果省略用户名,默认情况下su或su -命令尝试切换到root。
[yanjianjun@ansible ~]$ su -
Password:
[root@ansible ~]#
命令su与命令su-的区别
6.2.3通过sudo运行命令
与su不同,sudo一般要求用户输入自己的密码进行身分验证,而非输入正在尝试访问的用户帐户密码。据悉,sudo可以配置为容许特定用户像某个其他用户一样运行任何命令,或仅容许以该用户身分运行部份命令。
1.如果sudo已配置为允许yanjianjun用户以root身份执行命令usermod,那么yanjianjun就可以来锁定或解锁用户账户
[yanjianjun@ansible ~]$ sudo usermod -L student
[sudo] password for yanjianjun:
[yanjianjun@ansible ~]$ su - student
Password:
su: Authentication failure
[yanjianjun@ansible ~]$
2.如果某用户尝试以另一用户身份运行命令,但sudo配置不允许,则该命令将被阻止。这次尝试也会被记录下来。
[yanjianjun@ansible ~]$ sudo tail /var/log/secure
yanjianjun is not in the sudoers file. This incident will be reported.
[yanjianjun@ansible ~]$
执行sudo的另一个优点在于,执行的所有命令都默认将日志记录到/var/log/secure中
Jan 11 22:04:21 ansible su: pam_unix(su-l:session): session opened for user yanjianjun by root(uid=0)
Jan 11 22:04:23 ansible sudo: yanjianjun : user NOT in sudoers ; TTY=pts/0 ; PWD=/home/yanjianjun ; USER=root ; COMMAND=/bin/tail /var/log/secure
Jan 11 22:06:07 ansible su: pam_unix(su-l:session): session closed for user yanjianjun
在红帽企业Linux7和红帽企业Linux8中,wheel组的所有成员都可以使用sudo以任何用户身分运行命令,包括root在内。这是红帽企业Linux6及更早版本相比的变化,在Linux7原先的版本,wheel组的成员默认情况下不会获得这些管理权限。
6.2.4通过sudo获取交互式RootShell
方式一:假若系统的非管理员用户才能使用sudo来运行su命令,则个可以从该帐户运行sudosu-来获取root用户的交互式shell。这式由于sudo将以root用户身分运行su-,而root用户无需输入密码即可使用su。
技巧二:使用sudo-i命令,这将切换到root帐户并运行该用户的默认shell及关联的shell登陆脚本。
[yanjianjun@ansible ~]$ sudo -i
[sudo] password for yanjianjun:
[root@ansible ~]#
sudosu-命令与sudo-i的行为不完全相同
6.2.5配置sudo
sudo的主配置文件为/etc/sudoers,sudoers文件有固定的句型要求,为防止出现问题,应使用特殊的visudo命令进行编辑。
比如:以下来自/etc/sudoers文件的一行可为组wheel的成员启用sudo访问权限。
%wheelALL=(ALL)ALL
默认情况下deepin linux,/etc/sudoers还包含/etc/sudoers.d目录中所有文件的内容,作为配置文件的一部份。这样管理员只需将像一个的文件装入该目录中,即可为用户添加sudo访问权限。
注意
使用/etc/sudoers.d目录下的补充文件比较简单便捷,只需将文件复制到目录中或从目录中删掉文件,即可启用或禁用sudo访问权限。在本课程中,您将在/etc/sudoers.d目录中创建和删掉文件,因而为用户和组配置sudo访问权限。
1.若要为用户yanjianjun启用完整的sudo访问权限,可创建富含以下内容的/etc/sudoers.d/yanjianjun
yanjianjunALL=(ALL)ALL
2.若要为组group01启用完整的sudo访问权限linux创建用户组和用户,可创建富含以下内容的/etc/sudoers.d/group01
%group01ALL=(ALL)ALL
3.据悉,也可以设置sudo,以容许用户在不输入密码的前提下以其他用户身分运行命令
ansibleALL=(ALL)NOPASSWD:ALL
授予用户或组此级别访问权限存在显著的安全风险,非特定场景,不建议使用。
6.3管理本地用户帐户6.3.1从命令行创建用户6.3.2从命令行更改现有用户属性
usermod--help的选项
选项用法
-g,–gidGROUP
为用户指定主要组,指定的组名必须是系统中存在的组
-G,–groupsGROUPS
为用户指定补充组,以冒号分隔
-a,–append
借助-G选项将补充组添加到用户当前的组成员集合,而不是将当前补充组集合替换为新的集合
-d,–homeHOME_DIR
为用户帐户指定特定的主目录
-m,–move-home
将用房主目录移到新的位置,必须与-d选项配合使用。
-s,–shellSHELL
为用户指定特定的登陆shell
-Llinux模拟,–lock
锁定用户帐户
-U,–unlock
解锁用户帐户
6.3.3从命令行删掉帐户
警告:在红帽企业Linux7以上版本,useradd命令为新用户分配一个小于或等于1000的可用UID,除非通过-u选项明晰指定。若果在未指定-r选项的情况下使用userdel删掉某一用户,系统将残留未分配的UID所拥有的文件。或则当已删掉用户拥有的文件在该用户的主目录之外,也会发生此类情况。此类情况将造成信息的泄漏和其他的安全问题。
按照这一情况,解决方案是,在删掉创建了文件的用户时,同时从系统中删掉所有那些无人拥有的文件。root用户可以使用find/-nouser-o-nogroup命令来查找所有无人拥有的文件和目录。
6.3.4从命令行设置密码6.3.5UID范围6.3管理本地组帐户
组必须存在后,用户能够添加到其中。
6.3.1从命令行创建组6.3.2从命令行更改现有的组6.3.3删掉组
**注意:**假如组是任何现有用户的主要组,则您未能删掉它。与userdel一样,请复查所有文件系统,确保系统上不遗留该组拥有的任何文件。
6.3.4从命令行修改组成员资格
[root@ansible project]# id user02
uid=1002(user02) gid=1002(user02) groups=1002(user02)
[root@ansible project]# usermod -g group01 user02
[root@ansible project]# id user02
uid=1002(user02) gid=1003(group01) groups=1003(group01)
[root@ansible project]#
[root@ansible project]# id user03
uid=1003(user03) gid=1004(user03) groups=1004(user03)
[root@ansible project]# usermod -aG group01 user03
[root@ansible project]# id user03
uid=1003(user03) gid=1004(user03) groups=1004(user03),1003(group01)
[root@ansible project]# groupadd group02
[root@ansible project]# usermod -G group02 user03
[root@ansible project]# id user03
uid=1003(user03) gid=1004(user03) groups=1004(user03),1005(group02)
[root@ansible project]#
使用-a选项使usermod函数处于append模式,倘若未降低-a,都会从用户当前的其他补充组中删掉该用户,然后再降低到新的补充组。
6.4管理用户密码
密码文件/etc/shadow,与/etc/passwd文件格式类似。以九个逗号分隔主键。
yanjianjun:666Qi7ozxMh.$sWahbub17MBq7YBQSXQnM.y757qBiQ.UhJLpjZC0tTzbzLSyw9o6/HjqbQPEKJJCrkZR60.m4CVY8.WATo54E.:18456:0:99999:7:::
用户名用户的加密密码先前修改密码的日期,其设置值为自1970年1月1日起的天数,按UTC时区估算。自用户先前修改密码以来到可以再度修改之前必须经过的最短天数密码过期时间,默认9999为永不过期警告期,密码过期前提前几天开始警告。非活动期,一旦密码过期,在这种天内仍可以接受扽古,过了这一时期,帐户将被锁定。密码过期日,其设置值为自1970年1月1日起的天数,按UTC时区估算。孔子段表示它不会在特定的日期失效。最后一个数组为预留数组,预留给未来使用。
1970年1月1日起,估算天数的方式
[root@ansible project]# date -u -d "1970-01-01 UTC $((18644 * 86400 )) seconds"
Sun Jan 17 00:00:00 UTC 2021
[root@ansible project]# date -u -d "1970-01-01 18644 days"
Sun Jan 17 00:00:00 UTC 2021
6.4.1加密密码的格式
**666Qi7ozxMh.sWahbub17MBq7YBQSXQnM.y757qBiQ.UhJLpjZC0tTzbzLSyw9o6/HjqbQPEKJJCrkZR60.m4CVY8.WATo54E.∗∗加密密码数组中储存了三段信息:哈希算法、salt及加密哈希值,每段信息由sWahbub17MBq7YBQSXQnM.y757qBiQ.UhJLpjZC0tTzbzLSyw9o6/HjqbQPEKJJCrkZR60.m4CVY8.WATo54E.**加密密码数组中储存了三段信息:哈希算法、salt及加密哈希值,每段信息由sWahbub17MBq7YBQSXQnM.y757qBiQ.UhJLpjZC0tTzbzLSyw9o6/HjqbQPEKJJCrkZR60.m4CVY8.WATo54E.∗∗加密密码数组中储存了三段信息:哈希算法、salt及加密哈希值,每段信息由符号分隔。
此密码采用哈希算法,数字6表示SHA-512哈希算法,1表示MD5哈希算法,5表示SHA-256哈希算法。用于加密密码的salt用户密码的加密哈希值,salt和未加密密码组合并加密,生成加密的密码哈希。
**使用salt可以避免两个密码相同的用户在/etc/shadow文件中拥有相同的条目。虽然两个用户的密码相同,salt不同的情况下,/etc/shadow中的加密密码也是不同的。
6.4.2密码验证
用户尝试登陆时,系统在/etc/shadow中查询用户条目,将用户的salt和键入的未加密密码组合,再使用指定的哈希算法加密。假如结果与已加密哈希匹配,则用户键入了正确的密码。假如结果与已加密密码不符,则用户键入了错误的密码,登陆尝试也会失败。
6.4.3配置密码时限
密码时限可用通过change命令进行调整来试试密码时限策略。
后面的chage命令使用了-m,-M,-W和-I选项,它们分别用于设置用户密码的最短期限、最长年限、警告周期和失效时限。
注意:date命令可用于估算未来的日期,-u选项报告UTC时间。
[user01@host~]$date-d“+45days”-u
ThuMay2317:01:20UTC2019
编辑/etc/login.defs文件中的密码时限配置项,以设置默认的密码时限策略。PASS_MAX_DAYS设置密码的默认最长年限,PASS_MIN_DAYS设置密码的默认最短期限。PASS_WARN_AGE设置密码的默认警告周期。默认密码时限策略的任何修改都仅对新用户有效。现有用户将继续使用旧密码时限设置,而非新密码设置。
6.4.4限制访问
chage命令可以拿来设置帐户到期日期,到了设定的日期,用户将难以以交互方法登陆系统。usermod命令可以通过-L选项锁定帐户。
[root@ansible project]# usermod -L yanjianjun
[root@ansible project]# su - student
Last login: Mon Jan 11 22:03:20 CST 2021 on pts/0
[student@ansible ~]$ su - yanjianjun
Password:
su: Authentication failure
使用场景1:用户离开公司,管理员可以通过usermod命令锁定帐户并使其到期。该日期必须使用距离1970-01-01的天数来指定,或则以YYYY-MM-DD格式来指定。
[root@ansible project]# usermod -L -e 2019-10-05 user03
-e拿来设置帐户的到期日期,-L锁定用户的密码。假如之后职工返回,其帐户通过usermod-U解锁。假如帐户已到期,勿必也要更改到期日期。
6.4.5nologinShell
nologinshell用作不准备以交互形式登陆系统的用户帐户的取代shell。从安全角度来看,假如用户帐户担当的职责不须要用户以交互方法登入系统,则严禁用户帐户登入系统是明智的。这些情况的解决方案是将用户的登陆shell设为/sbin/nologin。假如用户企图直接登入系统,nologinshell将关掉该联接
[root@ansible project]# usermod -s /sbin/nologin yanjianjun
[root@ansible project]# su - yanjianjun
Last login: Sun Jan 17 18:16:57 CST 2021 on pts/0
Last failed login: Sun Jan 17 18:17:32 CST 2021 on pts/0
There were 2 failed login attempts since the last successful login.
This account is currently not available.
[root@ansible project]#
重要:nologin可以避免以交互方法使用系统,但不会制止所有访问。诸如ftp等应用的访问。
总结
在本章中,你学到了: