Linux 用户管理简介

一、创建用户

Linux 系统可以使用 useradd 命令创建新用户:
$ sudo useradd -m -c 'description' <username>

  • -m 选项表示创建用户的同时自动在 /home 目录下创建该用户的主目录(/home/<username>
  • -c 选项用于给新用户添加描述,该描述将保存在 /etc/passwd 文件中

默认情况下,新创建的用户并未分配密码,需要使用 passwd <username> 命令为新用户设置密码。

PS:在为新用户自动创建主目录时,可以同时复制一部分初始文件(如 .bashrc.vimrc 等)到该目录下,复制的源文件默认位于 /etc/skel 目录下。
即创建新用户时,/etc/skel/ 目录下的所有文件都将自动复制到新用户的主目录中。

在 Ubuntu 系统中,useradd 命令默认不自动创建用户主目录,所以需要带上 -m 选项。而 Centos 系统中,useradd 命令默认会自动创建用户主目录,可以加上 -M 选项表示不创建用户主目录。

useradd 的部分命令选项:

选项 描述
-c, –comment 添加用户描述
-d, –home-dir 指定用户的主目录位置
-m, –create-home 自动创建用户的主目录
-M, –no-create-home 不自动创建用户主目录(CentOS)
-N, –no-user-group 不创建同名的组
-s, –shell 指定用户使用的 shell
-g, –gid 指定新账户主组的名称或 ID
-G, –groups 指定新账户的附加组列表
-e, –expiredate 指定新账户的过期日期
-f, –inactive 用户密码过期后的重置密码期限
-r, –system 创建一个系统账户
-k, –skel 指定骨架目录(默认为 /etc/skel)

PS:其中的 INACTIVEEXPIRE 选项用于设置用户账号的过期时间。INACTIVE 用于指定一个期限(单位为),在该期限内,密码失效后的用户可以重置自己的密码。该选项值为 -1 时则禁用此特性。
EXPIRE 用于指定一个截止日期(格式为 YYYY-MM-DD),超过该期限后用户账号即被禁用。

$ sudo useradd -e 2018-10-01 temp_account # 创建一个临时账户

用户默认设置

新用户在创建时会使用一些预先定义的默认设置,useradd 命令从 /etc/default/useradd 文件中获取这些默认设置。当前的默认配置可以通过 useradd -D 命令显示:

1
2
3
4
5
6
7
8
$ useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=no

可以直接通过 useradd -D 命令修改 useradd 的默认设置,如:
$ sudo useradd -D -s /bin/bash # 将新建用户的默认 shell 设置为 /bin/bash

二、用户组

在 Linux 系统中,任何一个用户都必须属于至少一个用户组。对于大多数 Linux 发行版,创建新用户时会自动创建一个同名的用户组。
初始创建的同名用户组叫做基础属组(primary group),用户还可以同时属于其他用户组,这些用户组叫做附加属组(supplementary group)。如:

1
2
$ id starky
uid=1000(starky) gid=1000(starky) 组=1000(starky),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),116(lpadmin),122(sambashare)

每一个用户和用户组在创建时都会关联于一个唯一的 UID 和 GID。UID 和 GID 的取值范围都是 0-65535 。root 用户的 UID 和 GID 永远都是 0 。

1
2
$ id root
uid=0(root) gid=0(root) 组=0(root

Ubuntu 系统中 1-99 的 ID 只用于分配给系统用户(如运行服务的 www-data),100-999动态地分配给系统守护进程的用户(在创建用户时使用 --system 选项)。而第一个普通用户则分配值为 1000 的 UID 和 GID。

使用 useradd 命令创建新用户时,可以同时为该用户关联附加属组。用户创建完成后也可以使用 usermod 命令修改该用户的附加属组。如:

1
2
3
4
5
6
7
$ sudo useradd test -G lpadmin,sambashare    # 创建用户 test 并将其添加至 lpadmin 和 sambashare 组
$ id test
uid=1004(test) gid=1004(test) 组=1004(test),116(lpadmin),122(sambashare)
$
$ sudo usermod test -a -G sudo # 将用户 test 添加(-a)至 sudo 用户组
$ id test
uid=1004(test) gid=1004(test) 组=1004(test),27(sudo),116(lpadmin),122(sambashare)

usermod 命令用于修改已经存在的用户。常用命令选项如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ usermod
用法:usermod [选项] 登录

选项:
-c, --comment 注释 GECOS 字段的新值
-d, --home HOME_DIR 用户的新主目录
-e, --expiredate EXPIRE_DATE 设定帐户过期的日期为 EXPIRE_DATE
-f, --inactive INACTIVE 过期 INACTIVE 天数后,设定密码为失效状态
-g, --gid GROUP 强制使用 GROUP 为新主组
-G, --groups GROUPS 新的附加组列表 GROUPS
-a, --append GROUP 将用户追加至上边 -G 中提到的附加组中,
并不从其它组中删除此用户
-h, --help 显示此帮助信息并退出
-l, --login LOGIN 新的登录名称
-L, --lock 锁定用户帐号
-m, --move-home 将家目录内容移至新位置 (仅与 -d 一起使用)
-o, --non-unique 允许使用重复的(非唯一的) UID
-p, --password PASSWORD 将加密过的密码 (PASSWORD) 设为新密码
-R, --root CHROOT_DIR chroot 到的目录
-s, --shell SHELL 该用户帐号的新登录 shell
-u, --uid UID 用户帐号的新 UID
-U, --unlock 解锁用户帐号
-Z, --selinux-user SEUSER 用户账户的新 SELinux 用户映射

具体可参考命令:man usermod

三、删除用户(组)

userdel 命令可用于删除用户,groupdel 命令可用于删除用户组。
默认不带选项的 userdel 命令只会删除用户,并不会同时删除该用户的主目录(可以通过加上 -r 选项强制删除用户主目录)。

删除某个用户后,所有原本属于该用户的文件都将失去属主,而被对应的 UID 所代替。如果之后又新建一个用户,而该用户使用了之前已删除账户的 UID,则新账户会替代已删除的账户并获取其文件的权限。

可以使用 find / -user UID -o -group GID 命令定位已删除账户拥有的所有文件

四、密码

使用 useradd 命令创建新用户时,是不自动提示创建密码的(Ubuntu系统中的 adduser 命令可以交互地创建新用户)。
需要使用 passwd 命令为用户设置或修改密码。

密码时效

可以使用 chage 命令设置用户密码的有效期限,如:
$ sudo chage -M 30 test
30 天后,用户 test 的密码将会过期,并收到提示需要输入新的密码。

chage 命令的常用选项:
|选项|描述|
|-|-|
|-m days|设置用户修改密码的最小间隔时间,值为 0 时表示可以在任何时间修改密码|
|-M days|设置密码保持有效的最长期限,即修改密码的最大间隔时间|
|-E date|设置用户账户过期并自动被禁用的日期|
|-W days|设置密码过期前多少天用户被警告需要修改密码|
|-I days|设置密码失效多长时间后账户被锁定|

不带任何选项的 chage 命令可以交互地修改密码时效:

1
2
3
4
5
6
7
8
9
10
11
$ sudo chage test
正在为 test 修改年龄信息
请输入新值,或直接敲回车键以使用默认值

最小密码年龄 [0]:
最大密码年龄 [99999]: 60
最近一次密码修改时间 (YYYY-MM-DD) [2018-09-03]:
密码过期警告 [7]:
密码失效 [-1]:
帐户过期时间 (YYYY-MM-DD) [-1]:
$

用户可以使用 chage -l 命令查看自己的密码时效设置:

1
2
3
4
5
6
7
8
chage -l test
最近一次密码修改时间 : 9月 03, 2018
密码过期时间 : 11月 02, 2018
密码失效时间 : 从不
帐户过期时间 : 从不
两次改变密码之间相距的最小天数 :0
两次改变密码之间相距的最大天数 :60
在密码过期之前警告的天数 :7

账户禁用

可以使用 passwd -l <user> 命令禁用用户账号,使用 passwd -u <user> 命令解除账户禁用。
但是这个命令并不能完全禁止用户的访问(如该用户还可以通过 SSH 远程登录主机)。

如需完全禁用某用户,可使用如下命令:
sudo usermod --expiredate 1 <user>
该命令会将用户账号的失效日期设置为 1970 年 1月 1 日(即立即禁用)。

或者将用户登录时的 shell 修改为 /bin/false/usr/sbin/nologin
$ sudo usermod -s /bin/false <user>
该命令不会锁定账户,但该账户对 shell 的访问已被限制。

五、用户信息

Linux 系统将用户、群组等信息保存在以下三个文件中:
/etc/passwd/etc/shadow/etc/group

/etc/passwd 文件中包含了所有用户的列表及详细信息:

1
2
3
4
5
6
7
root:x:0:0:root:/root:/bin/bash
...
starky:x:1000:1000:starky,,,:/home/starky:/bin/bash
sshd:x:112:65534::/run/sshd:/usr/sbin/nologin
postgres:x:113:123:PostgreSQL administrator,,,:/var/lib/postgresql:/bin/bash
skitar:x:1001:1001::/home/skitar:/bin/bash
mysql:x:114:124:MySQL Server,,,:/nonexistent:/bin/false

该文件的格式为:username:password:UID:GID:GECOS:Home:Shell
其中的 password 项都为 x ,而实际的密码保存在 /etc/shadow 文件中。

/etc/group 文件的格式为:groupname:password:GID:member,member

六、sudo

sudo 命令可以使普通用户以 root 用户身份执行命令。
使用 useradd 命令新建的用户默认没有使用 sudo 命令的权限,需要先将其加入 sudo 用户组
$ sudo usermod <user> -a -G sudo

sudo 的本意是以其他用户的身份执行命令。可以使用 -u 选项指定“其他”身份。默认即为 root 用户。

配置 sudo

sudo 命令通过检查 /etc/sudoers 中的配置来确定授权规则。可以通过编辑 sudoers 文件将 sudo 的授权限制为指定的用户,指定的主机,或只能执行特定的命令。
sudoers
sudoers 文件的格式为:username host = command
如:test ALL=/bin/userdel,/bin/useradd

可以将授权使用的命令限定为某个目录中的所有命令(但不包含其子目录),如:
test ALL=/bin/*,/sbin/*

有些时候需要将使用某个命令的权限授予一个用户,但该命令又需要使用另外一个用户的身份执行(如 MySQL 的系统守护进程)。可以使用下面的格式:
test ALL=(mysql) /usr/bin/mysqld

还可以通过用户组信息完成对 sudo 的授权:
%groupname ALL=(ALL) ALL
上面的配置表示该组的所有用户可以在任何主机使用 sudo 执行任何命令。

别名设置

/etc/sudoers 文件中允许定义和使用别名,包括用户别名(User_Alias)、主机别名(Host_Alias)和命令别名(Cmnd_Alias)。如:

1
2
3
User_Alias ADMIN = skitar,test
Cmnd_Alias USER_COMMANDS = /bin/userdel,/bin/useradd
ADMIN ALL=/bin/groupadd,USER_COMMANDS

上面的配置表示用户 skitar 和 test 可以在所有主机上通过 sudo 执行 userdel、useradd 和 groupadd 命令。

还可以在别名前加上感叹号(!)表示拒绝:

1
2
Cmnd_Alias DENIED_COMMANDS = /bin/su,/bin/mount/,/bin/umount
test ALL=/bin/*,!DENIED_COMMANDS

上面的配置表示 test 用户可以在所有主机上通过 sudo 执行除了 su、mount 和 umount 以外的所有 /bin 目录下的命令。

参考资料

Pro Linux System Administration: Learn to Build Systems for Your Business Using Free and Open Source Software 2nd Edition