一、创建用户
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:其中的 INACTIVE 和 EXPIRE 选项用于设置用户账号的过期时间。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
8chage -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
7root: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 文件的格式为: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
3User_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
2Cmnd_Alias DENIED_COMMANDS = /bin/su,/bin/mount/,/bin/umount
test ALL=/bin/*,!DENIED_COMMANDS
上面的配置表示 test 用户可以在所有主机上通过 sudo 执行除了 su、mount 和 umount 以外的所有 /bin 目录下的命令。