管理本地Linux用户和组
用户和组
什么是用户?
系统中的每个进程(运行程序)都作为一个特定用户运行。每个文件归一个特定用户所有。对文件和目录的访问受到用户的限制。与运行进程相关联的用户可确定该进程可访问的文件和目录。
id
命令用于显示有关当前已登陆用户的信息。也可以将用户的用户名作为id
命令的首个参数来请求有关其他用户的基本信息。
[rwas@linuxprobe Desktop]$ id
uid=1003(rwas) gid=1001(qlb) groups=1001(qlb)
[rwas@linuxprobe Desktop]$
要查看与某一文件或目录相关联的用户,则使用ls -l
或者ll
命令。第三列显示用户名:
[rwas@linuxprobe Desktop]$ ls -l /tmp
total 4
-rw-r--r-- 1 root root 2110 Jun 5 20:47 passwd
drwx------ 2 rwas qlb 23 Jun 11 08:41 ssh-ND7O4Yag2K3Y
drwx------ 3 root root 16 Jun 11 08:40 systemd-private-47DITA
drwx------ 3 root root 16 Jun 11 08:41 systemd-private-E8L5bx
drwx------ 3 root root 16 Jun 11 08:41 systemd-private-MvcEbJ
drwx------ 2 root root 6 May 30 10:18 vmware-root
[rwas@linuxprobe Desktop]$ ll /tmp
total 4
-rw-r--r-- 1 root root 2110 Jun 5 20:47 passwd
drwx------ 2 rwas qlb 23 Jun 11 08:41 ssh-ND7O4Yag2K3Y
drwx------ 3 root root 16 Jun 11 08:40 systemd-private-47DITA
drwx------ 3 root root 16 Jun 11 08:41 systemd-private-E8L5bx
drwx------ 3 root root 16 Jun 11 08:41 systemd-private-MvcEbJ
drwx------ 2 root root 6 May 30 10:18 vmware-root
[rwas@linuxprobe Desktop]$
要查看进程(process)信息,可使用ps
命令。默认为仅显示当前shell中的进程。可添加a
选项进行查看与某一终端相关的所有进程。若要查看与进程相关联的用户,请在命令中包含u
选项。第一列显示用户名:
[rwas@linuxprobe Desktop]$ ps
PID TTY TIME CMD
2845 pts/0 00:00:00 bash
3477 pts/0 00:00:00 ps
[rwas@linuxprobe Desktop]$ ps a
PID TTY STAT TIME COMMAND
1224 tty1 Ssl+ 0:05 /usr/bin/Xorg :0 -background none -verbose -auth /ru
2845 pts/0 Ss 0:00 /bin/bash
3489 pts/0 R+ 0:00 ps a
[rwas@linuxprobe Desktop]$ ps au
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1224 1.3 1.5 251064 32384 tty1 Ssl+ 08:40 0:05 /usr/bin/Xorg
rwas 2845 0.0 0.1 116260 2900 pts/0 Ss 08:41 0:00 /bin/bash
rwas 3497 0.0 0.0 123360 1392 pts/0 R+ 08:47 0:00 ps au
[rwas@linuxprobe Desktop]$
以上命令的输出按名称显示用户,但操作系统内部是按UID编号来跟踪用户的。名称到编号的映射在账户信息数据库中定义。默认情况下,系统使用简单的平面文件(即/etc/passwd文件)存储有关本地用户的信息。/etc/passwd采用以下格式(七个冒号分隔字段):
- username 是UID到名称的一种映射,便于用户使用。
- password 以前是以加密格式保存密码的位置。现在密码存储在名称为/etc/shadow的单独文件中。
- UID 是用户ID,即在最基本的级别标识用户的编号。
- GID 是用户的主要组ID编号。
- GECOS 字段是任意文本,通常包含用户的实际姓名。
- /home/dir 是用户的个人数据和配置文件的位置。
- shell 是用户登陆时运行的程序。对于普通用户,这通常是提供用户命令行提示符的程序。
什么是组?
与用户一样,组也有名称和编号(GID)。本地组在/etc/group中定义。
主要组
- 每个用户有且只有一个主要组。
- 对于本地用户,主要组通过/etc/passwd第四个字段中列出的组的GID编号定义。
- 通常用户创建的新文件归主要组所有。
- 通常,新建用户的主要组名称与用户名称相同。
补充组
- 用户可以是零个或者多个补充组的成员。
- 属于本地组补充成员的用户列在/etc/group中组条目的最后一个字段中。对于本地组,用户成员身份由/etc/group中组条目的最后一个字段中由逗号分隔的用户列表确定。
- 补充组成员身份用于帮助确保用户具有对系统中文件及其他资源的访问权限。
获取超级用户访问权限
root用户
大多数操作系统具有某种类型的超级用户,即具有系统全部权限的用户。在RHEL中,该用户就是root用户。该用户的特权该与文件系统上的一般特权,用于管理系统。要执行诸如安装或者删除软件及管理系统文件的目录等任务,必须将特权升级到root用户。
大多数设备都仅受root控制,但也有些设备并非如此。例如,像USB设备等移动设被就可由一般用户控制。虽然非root用户可以添加和删除文件以及管理可移动的设备,但默认情况下,只有root永固可以管理“固定”硬盘。
在linux系统上,建议系统管理员不要直接以root身份登陆。取而代之,系统管理员应当以非root用户登陆,然后使用其他机制(例如su、sudo、PolicyKit)临时获得超级用户特权。
作为管理员用户登陆时,整个桌面环境都不必要的以管理员特权运行。在那种情形中,任何通常仅威胁用户账户的安全漏洞就有可能威胁整个系统。
利用su
切换用户
su
命令可让用户切换至另一个用户账户。如果未指定用户名,则意味着使用root账户。当作为普通用户调用时,系统将提示输入要切换到的账户的密码;当作为root用户调用时,则无需输入账户密码。
su - <username>
[rwas@linuxprobe Desktop]$ su -
Password:
Last login: Wed Jun 5 20:31:53 CST 2019 on :0
Last failed login: Tue Jun 11 09:53:27 CST 2019 on pts/0
There were 3 failed login attempts since the last successful login.
[root@linuxprobe ~]# pwd
/root
[root@linuxprobe ~]# exit
logout
[rwas@linuxprobe Desktop]$ su root
Password:
[root@linuxprobe Desktop]# pwd
/home/rwas/Desktop
[root@linuxprobe Desktop]#
命令su username
会启动non-login shell,而命令su - username
则启动login shell。主要区别是,su - username
会将shell环境设置为如同以该用户身份完全登陆一样,而su username
仅以该用户身份使用当前的环境设置启动shell。
大多数情况下,管理员希望运行su - username
以获得用户的常规设置。
通过sudo
以root身份运行命令
从根本上而言,Linux实施非常粗糙的权限模型:root可以执行任何操作,其他用户无法执行任何操作(与系统相关)。前面讨论过的常用解决方案是允许标准用户利用su
命令暂时称为root用户。这样做的缺点在于,作为root用户操作时会被授予root的所有特权(和责任)。用户不仅可以重新启动Web服务器,还可以删除整个/etc目录。此外,需要以这种方式获取超级用户特权的用户都必须知道root用户的密码。
sudo
命令可以使用户根据/etc/sudoers文件中的设置,而被允许以root或其他用户身份运行命令。与su
之类的工具不同,sudo要求用户输入自己的密码以进行身份校验,而不是输入它们正尝试访问的账户的密码。这样可让管理员将细微的权限交给用户来委派系统管理任务,而无需交出root密码。
例如,如果sudo已配置为允许rwas用户以root身份运行usermod
命令,那么rwas就可以运行下列命令锁定用户账户:
[rwas@linuxprobe Desktop]$ sudo -l
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
[sudo] password for rwas:
Matching Defaults entries for rwas on this host:
requiretty, !visiblepw, always_set_home, env_reset, env_keep="COLORS
DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS", env_keep+="MAIL PS1
PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE
LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY
LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL
LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY",
secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin
User rwas may run the following commands on this host:
(root) /sbin/usermod
[rwas@linuxprobe Desktop]$ sudo usermod -L linuxprobe
使用sudo
的另一个有点在于,通过sudo执行的所有命令都默认将日志记录到/var/log/secure中。
[rwas@linuxprobe Desktop]$ sudo tail /var/log/secure
Jun 11 10:43:25 linuxprobe sudo: rwas : TTY=pts/0 ; PWD=/home/rwas/Desktop ; USER=root ; COMMAND=list
Jun 11 10:43:57 linuxprobe sudo: rwas : TTY=pts/0 ; PWD=/home/rwas/Desktop ; USER=root ; COMMAND=/sbin/usermod -L linuxprobe
Jun 11 10:43:57 linuxprobe usermod[8274]: lock user 'linuxprobe' password
Jun 11 10:45:50 linuxprobe sudo: rwas : command not allowed ; TTY=pts/0 ; PWD=/home/rwas/Desktop ; USER=root ; COMMAND=/bin/tail /var/log/secure
在红帽企业Linux7中,wheel组的所有成员都可使用sudo
命令并以包括root在内的任何用户的身份来运行命令。系统将提示用户输入其自己的密码。这是与红帽企业Linux6和更早的版本之间的区别。在RHEL6和更早的版本中,属于wheel组成员的用户默认情况下时没有这种管理权限的。
若要在过去版本的红帽企业Linux上实现相似的行为,可使用visudo
命令编辑相关的配置文件(/etc/sudoers),取消注释允许wheel组运行所有命令的那一行。
RHEL6 默认为不授予wheel组成员任何特权。过去一直在使用这个组的网站可能会因为RHEL7自动手谕wheel组所有成员完整的sudo特权而感到惊讶。这可能会导致未经过授权的用户获得RHEL7系统的超级用户访问权限。
大多数具有GUI的系统管理应用使用PolicyKit提示用户进行身份验证,以及管理root访问权限。在RHEL7中,PolicyKit可能也提示wheel组的成员输入其自己的密码,以便在使用图形工具时获取root特权。这与它们使用sudo在shell提示符获取那些特权的方式类似。PolicyKit根据自己的配置设置(与sudo的独立)授予这些特权。
管理本地用户账户
管理本地用户
useradd
创建用户
- 不带选项执行时,
useradd username
会为/etc/passwd中的所有字段设置合理的默认值,useradd
命令不设置任何有效的密码,用户也必须等设置了密码之后才可以登陆。 useradd --help
将显示可用于覆盖默认值的基本选项。在大多数情况下,可以将相同的选项用于usermod
命令,以修改现有用户。- 一些默认值从/etc/login.defs文件中读取,如有效UID编号的范围和默认密码过期规则。此文件中的值只在创建新用户时使用。更改此文件对现有用户毫无影响。
usermod
修改现有的用户
usermod --help
将显示可用于覆盖默认值的基本选项,一些常见的基本选项有:
选项 | 作用 |
---|---|
-c, --comment COMMENT | 向GECOS字段添加值,如全名 |
-g, --gid GROUP | 为用户账户指定主要组 |
-G, --groups GROUPS | 为用户账户指定一组补充组 |
-a, --append | 与-G 选项搭配使用,将用户附加到所给的补充组,而不将该用户从其他组删除 |
-d, --d HOME_DIR | 为用户账户指定新的主目录 |
-m, --move-home | 将用户主目录移动到新的位置。必须与-d 选项搭配使用 |
-s, --shell SHELL | 为用户账户指定新的登陆shell |
-L, --lock | 锁定用户账户 |
-U, --unlock | 解锁用户账户 |
userdel
删除用户
userdel username
可将用户从/etc/passwd中删除,但默认情况下会保留主目录不变。userdel -r username
同时删除用户和主目录。
当在未指定
-r
选项的情况下使用userdel
删除某一用户时,系统将具有未分配用户编号所拥有的文件。当由已删除用户创建的文件在其主目录外存在时,也会发生这种情况。这种情况将导致信息的泄露和其他安全问题。
在RHEL7中,useradd
命令为新用户分配UID从1000开始的范围内可用的前三个UID编号。(除非使用-u UID
选项明确指定了一个UID)。以下情况可能导致信息泄露:如果第一个可用UID编号先前已被分配给了一个从系统中删除的用户账户,那么旧的用户的UID编号将会分配给新的用户,这样就会为新用户提供旧用户遗留文件的所有权。
解决这一问题的一个方案是,在删除创建了文件的用户时,同时从系统删除所有这些“无人拥有的”文件。另一种方案是手动为不同用户分配“无人拥有的”文件。root用户可以执行以下命令来查找无人拥有的文件和目录:find / -nouser -o -nogroup 2> /dev/null
id
显示用户信息
id
将显示用户信息,包括用户的UID编号和组成员资格。id username
将显示username的用户信息,包括用户的UID编号和组成员资格。
passwd
设置密码
passwd username
可用户设置用户的初始密码或者更改用户密码。- root用户可以将密码设置为任何值。如果密码不符合最低建议标准,系统将显示消息,不过之后会显示提示重新该新密码,所有令牌也将会更新成功。
[root@linuxprobe ~]# passwd rwas
Changing password for user rwas.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
- 普通用户必须选择长度至少为8个字符,并且不以字典词语、用户名或上一密码为基础的密码。
UID范围
特定的UID编号和编号范围供红帽企业Linux用于特殊的目的。
- UID 0 始终分配给超级用户账户 root。
- UID 1-200 是一系列“系统用户”,静态分配给红帽的系统进程。
- UID 201-999 是一系列“系统用户”,供文件系统中没有自己的文件的系统进程使用。通常在安装需要它们的软件时,从可用池中动态分配它们。程序以这些“无特权”系统用户身份运行,以便限制它们仅访问正常运行所需的资源。
- UID 1000+ 是可供分配给普通用户的范围。
管理本地组账户
管理补充组
groupadd
创建组
groupadd groupname
如果不带选项,则使用/etc/login.defs文件中指定范围内的下一个可用GID。-g GID
选项用于指定具体的GID。-r
选项将使用/etc/login.defs文件中所列有效系统GID编号范围内的GID创建系统组。
groupmod
修改现有的组
groupmod
命令用于将组名映射为GID。-n
选项用于指定新的名称。
[root@linuxprobe ~]# groupmod -n newgroupname oldgroupname
-g
选项用于指定新的GID。
[root@linuxprobe ~]# groupmod -g newgid groupname
groupdel
删除组
groupdel
命令将删除组
[root@linuxprobe ~]# groupdel groupname
- 如果组是现有任何用户的主要组,则它不能被删除。与
userdel
一样,请检查所有文件系统,确保不遗留该组拥有的任何文件。
usermod
变更组成员资格
- 组成员资格通过用户管理进行控制。通过
usermod -g groupname username
更改用户主要组。 - 通过
usermod -aG groupname username
将用户添加到补充组。
使用
-a
选项可使usermod
命令进入“追加”模式,如果不使用此选项,用户将从所有其他补充组中删除。
管理用户密码
阴影密码和密码策略
在遥远的过去,加密的密码存储在全局可读的/etc/passwd文件中。这曾被认为具有合理的安全性,直到对加密密码的字典式攻击变得可见。在那时,加密密码或密码哈希移到更加安全的/etc/shadow文件中。这种文件也允许实施密码期限和到期功能。
现代密码哈希中存储三段信息:
$1$gCjLa2/Z$6PuOEKOAzfCjxjv2hoLOB/
- 1:哈希算法。数字1表示MD5哈希。使用SHA-512哈希时会出现数字6。
- gCjLa2/Z:用于加密哈希的salt。这原先是随机取的。salt和未加密密码组合并加密(称为散列),创建加密的密码哈希。使用salt可以防止两个密码相同的用户在/etc/shadow文件中拥有相同的条目。
- 6PuOEKOAzfCjxjv2hoLOB/:已加密哈希。
为什么要在密码里加点盐(salt)
在密码学中,是指通过在密码任意固定位置插入特定的字符串,让散列后的结果和使用原始密码的散列结果不相符,这种过程称之为“加盐”。
用户尝试登陆时,系统在/etc/shadow中查询用户的条目,将用户的salt和键入的未加密密码组合,再使用指定的哈希算法加密。如果结果与已加密哈希匹配,则用户键入了正确的密码。如果结果与已加密密码不符,则用户键入了错误的密码,登陆尝试也会失败。这种方式允许系统判断用户是否键入了正确的密码,同时又不以用于登陆的密码形式来存储密码。
RHEL7支持两种强大的新密码哈希算法:SHA-256(算法5)和SHA-512(算法6)。这些算法的salt字符串和已加密哈希都比较长。root用户可以更改密码哈希所使用的默认算法,只要运行
authconfig --passalgo
命令,并从md5、sha256或者sha512中选择一个适当的参数。
/etc/shadow 格式
/etc/shadow 采用以下格式(九个冒号分隔的字段):
- 登陆名称。这必须时系统中的有效账户名。
- 已加密的密码。密码字段的开头为感叹号时,表示该密码已被锁定。
- 最近一次更改密码的日期,以距离1970年1月1日的天数表示。
- 可以更改密码前的最少天数,如果为0则无最短期限要求。
- 必须更改密码前的最多天数(过多久必须改密码)。
- 密码即将到期的的警告期。以天表示,0表示不提供警告。
- 账户在密码到期后保持活动的天数。在此期限内,用户依然可以登陆系统并更改密码。在指定天数过后,账户被锁定,变为不活动。
- 这以blank字段为预留字段,供未来使用。
密码过期
下图显示了密码过期参数,可通过chage
命令对其调整,以实施密码过期策略。
[root@linuxprobe ~]# chage -m 0 -M 90 -W 7 -I 14 username
chage -d 0 username
将强制在下次登陆时更新密码。chage -l username
将列出用户名的当前设置。chage -E yyyy-MM-dd
将在指定的日期使账户到期。
提示
date
命令可用于计算未来的日期
[root@linuxprobe ~]# date -d "+90 days"
Wed Sep 11 23:52:58 CST 2019
[root@linuxprobe ~]#
限制访问
通过chage
命令,可以设置账户到期,到了该日期时,用户无法以交互方式访问系统。usermod -L username
可以锁定账户。
账户锁定可防止用户使用密码向系统进行验证。这是预防已离开公司的员工访问某一账户的推荐方式。如果以后该员工回归,其账户可通过usermod -U username
解锁。如果账户也已到期,务必也要更改到期日期。
nologin shell
有时,用户需要一个账户并通过密码与系统进行身份验证,但不需要在系统上使用交互式shell。例如邮件服务器可能需要账户来存储邮件,需要密码供用户通过检索邮件所用的邮件客户端进行身份验证过。用户不需要直接登陆该系统。
这种情况的常用解决方案是将用户登陆的shell设置为/sbin/nologin。如果用户尝试直接登陆系统,nologin shell将直接关闭该连接。
使用nologin shell可以防止以交互方式使用系统,但不会阻止所有访问。用户依然可以通过身份验证,并使用web应用、文件传输程序或邮件读取程序等应用上传或者检索文件。