用户管理
1. 相关概念
用户权限是通过创建用户时分配的用户 ID(User ID, UID)来跟踪的,UID 是个数值,每个用户都有唯一的 UID,但在登陆系统时用的不是 UID 而是登录名。
Linux 系统的管理员之所以是root,并不是因为它的名字叫 root,而是由于该用户的身份号码即UID(User Identification)的数值为 0.
Linux 通过设置用户组(group)把多个用户加入到同一个组中,从而方便为这些用户统一规划权限或指定任务,每个组用一个唯一的GID(Group IDentification)来标识,同时还有唯一的组名。
实际上,在 Linux 系统中创建每个用户时,将自动创建一个与其同名的基本用户组,而且这个基本用户组只有该用户一个人。如果该用户以后被归纳入其他用户组,则这个其他用户组称之为扩展用户组。一个用户只有一个基本用户组,但是可以有多个扩展用户组,从而满足日常的工作需要。
用户管理相关命令:
useradd
:创建新用户,useradd <option> user
option 作用 -c
给新用户添加备注 -d
指定用户的家目录 -m
--create-home 自动创建家目录(/home/username) -e
账户的到期时期,YYYY-MM-DD -u
指定该用户的 UID -g
指定 GID 或组名(必须已存在) -G
指定一个或多个扩展用户组 -N
不创建同名的基本用户组 -s
指定该用户的默认 shell 解释器 使用该命令创建用户账户时,默认的用户家目录在/home 目录中,默认的 shell 解释器为/bin/bash,且默认创建一个同名基本用户组。
- 但 Ubuntu 中不会自动创建家目录和解释器,此时要通过带入参数手动创建;
- 若用户的解释器被设置为 nologin,则代表该用户不能登录到系统中
userdel
:删除用户,userdel <option> user
option function -r
同时删除用户及其 HOME 目录、邮件目录 -f
强制删除用户 默认情况下用户的家目录会保留下来,可使用 -r 参数将其删除(但这样依然可能存在已删除用户的其他文件)。
usermod
:修改用户账户的字段(/etc/passwd),usermod <option> user
option function -c
填写用户账户的备注信息 -l
修改用户账户的登录名 -p
修改账户的密码 -d -m
两个参数连用,可重新指定用户的家目录并自动把旧的数据转移过去 -e
账户的到期时间,格式为 YYYY-MM-DD -g
变更所属用户组 -s
变更默认终端 -u
修改用户的 UID -G
变更扩展用户组 -L
锁定用户禁止其合登录系统 -U
解锁用户,允许其登录系统 passwd
:修改用户密码、过期时期、认证信息等,passwd <option> <user>
option function -l
锁定用户,禁止其登录 -u
解除锁定 --stdin
允许通过标准输入修改用户密码,如 echo "NewPassWord" | passwd --stdin Username -d
使该用户可用空密码登录系统 -e
强制用户下次登录时修改密码 -S
显示用户的密码是否被锁定,以及密码所采用的加密算法名称 普通用户只能使用 passwd 命令修改自身的系统密码;而 root 管理员则有权限修改其他所有人的密码,且不需要验证旧密码,这一点特别方便。
既然 root 管理员可以修改其他用户的密码,就表示完全拥有该用户的的管理权限。
groupadd
:创建用户组,默认没有用户被分配到该组,groupadd <option> group_name
groupmod
:修改已有组,groupmod <option> original_msg new_msg
其中 original_msg 和 new_msg 根据 option 进行确定
option function -g
修改 GID -n
修改组名
2. /etc/passwd
Linux 使用/etc/passwd 文件将用户的登陆名匹配到对应的 UID,这个文件包含了一些与用户有关的信息。如下是Linux系统上典型的/etc/passwd文件的一个例子:
$ 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
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
news:x:9:13:news:/etc/news:
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
rpm:x:37:37::/var/lib/rpm:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin
smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin
apache:x:48:48:Apache:/var/www:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
avahi:x:70:70:Avahi daemon:/:/sbin/nologin
hsqldb:x:96:96::/var/lib/hsqldb:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
xfs:x:43:43:X Font Server:/etc/X11/fs:/sbin/nologin
gdm:x:42:42::/var/gdm:/sbin/nologin
rich:x:500:500:Rich Blum:/home/rich:/bin/bash
mama:x:501:501:Mama:/home/mama:/bin/bash
katie:x:502:502:katie:/home/katie:/bin/bash
jessica:x:503:503:Jessica:/home/jessica:/bin/bash
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
$
Linux 有一些特殊的系统账户,它们并不是真的用户,而是系统上运行的各种服务进程访问资源用的特殊账户,Linux 为这些系统账户预留了 500 以下的 UID 值。Linux 这样设置的目的是为了避免因某个服务程序出现漏洞而被黑客提权至整台服务器,进而有效控制被破坏的范围。
Linux 为普通用户创建账户时,一般都会从 UID 为 500 开始,将第一个可用 UID 分配给这个账户。
/etc/passwd 文件的各条目的字段包含了如下信息:
登录用户名
用户密码(均以 x 显示)
用户账户的 UID
用户账户的 GID(Group ID)
用户账户的文本描述(也称为备注字段)
用户 HOME 目录的位置
用户的默认 shell
/etc/passwd 是一个标准的文本文件,可以用任何文本编辑器在/etc/password 文件里直接手动进行用户管理,如添加、修改或删除用户账户,但这样做极其危险。
现在绝大多数 Linux 系统都将用户密码保存在一另一个单独的文件中,叫做 shadow 文件,位置在/etc/shadow,只有特定的程序才能访问这个文件。
3. /etc/shadow
/etc/shadow 文件对 Linux 系统密码管理提供了更多控制,只有 root 用户才能访问,这让它比起/etc/passwd 安全许多。
/etc/shadow 文件为系统上的每个用户账户都保存了一条记录,每条记录包含的字段内容为:
# 例如
rich:$1$.FfcK0ns$f1UgiyHQ25wrB/hykCn020:11627:0:99999:7:::
- 与/etc/passwd 文件中的登录名字段对应的登录名
- 加密后的密码
- 自上次修改密码后过去的天数密码(自 1970 年 1 月 1 日开始计算)
- 多少天后才能更改密码
- 多少天后必须更改密码
- 密码过期前提前多少天提醒用户更改密码
- 密码过期后多少天禁用用户账户
- 用户账户被禁用的日期(用自 1970 年 1 月 1 日到当天的天数表示)
- 预留字段给将来使用
4. /etc/group
组信息也保存在系统的一个文件中,即/etc/group,其中包含了系统上用到的每个组的信息。如下是一个典型例子:
root:x:0:root
bin:x:1:root,bin,daemon
daemon:x:2:root,bin,daemon
sys:x:3:root,bin,adm
adm:x:4:root,adm,daemon
rich:x:500:
mama:x:501:
katie:x:502:
jessica:x:503:
mysql:x:27:
test:x:504:
和 UID 一样,GIP 在分配时也采用了特定的格式,系统账户用的组通常会分配低于 500 的 GID,而普通用户组的 GID 则会从 500 开始分配。
/etc/group 文件中每个条目有 4 个字段:
组名
组密码
GID
该组的用户列表
组密码允许非组内成员通过它临时成为该组成员,这个功能并不很普通,但确实存在。
千万不能通过直接修改/etc/group 文件来添加用户到一个组,要用 usermod 命令。在添加用户到不同的组之前要先创建组。
5. su 与 sudo
su
命令可以解决切换用户身份的需求,使得当前用户在不退出登录的情况下,顺畅地切换到其他用户。
强烈建议在切换用户身份时添加一个减号-
,这意味着完全切换到新的用户,即把环境变量信息也变更为新用户的相应信息,而不是保留原始信息。
从 root 管理员切换到普通用户时不需要密码验证,而从普通用户切换成 root 管理员就需要密码验证了,这是一个必要的安全检查。然而,尽管使用 su 命令可以从普通用户完全切换到 root 管理员,但这不是最安全的议定,因为这将暴露 root 管理员的密码,从而增大了系统密码被黑客获取的几率。
用 sudo 命令可把原本 root 管理员才能执行的特定权限赋予给指定的普通用户,这样既可保证普通用户能完成特定的工作,也可以避免泄露 root 管理员密码。sudo 服务的配置原则为——在保证普通用户完成相应工作的前提下,尽可能少地赋予额外的权限。
sudo 命令:
sudo
:sudo <参数> 命令名称
参数 作用 -h
列出帮助信息 -l
列出当前用户可执行的命令 -u username 或 UID
以指定的用户身份执行命令 -k
清空密码的有效时间,下次执行 sudo 时需要再次验证密码 -b
在后台执行指定的命令 -p
更改询问密码的提示语 visudo
:这条命令在配置用户权限时禁止多个用户同时修改 sudoers 配置文件。只有 root 管理员才可以使用此命令编辑 sudo 服务的配置文件。
如果要让某用户只能使用 root 管理员的身份执行指定的命令,切记一定要给出该命令的绝对路径,否则系统会识别不出来。
可以添加 NOPASSWD
参数,使得用户执行 sudo 命令时不再需要密码验证。