目录
四、增删改本地账户useradd、userdel、usermod
五、账户默认配置文件/etc/login.defs 和 /etc/skel目录
七、增删改组groupadd、groupdel和groupmod
管理账户和组的文件有4个:
- /etc/passwd 存储本地账户信息
- /etc/shadow 存储密码 存储账户和密码的属性 账户要激活,就要设置密码
- /etc/group 账户组信息 主要记录附加组
- /etc/login.defs 创建账户的时候会去读取的模板
一、本地账户/etc/passwd
Linux系统中每个进程(运行程序)都作为一个特定账户运行。每个文件归一个特定账户所有。对文件和目录的访问收到账户的限制。与运行进程相关联的账户可确定该进程可访问的文件和目录。id命令用于显示账户信息。
[root@server0 ~]# id student
uid=1000(student) gid=1000(student) groups=1000(student),10(wheel)
每个账户有一个id号也就是uid来作为账户的唯一标识,系统用/etc/passwd文件来存储有关本地账户的信息。用冒号分隔7列信息。
username:password:uid:gid:gecos:home_dir:shell
- username是账户名,是uid到名称的一种映射,方便用户使用;
- password,以前用来放加密存储的密码,现在没啥用了,加密的密码存在/etc/shadow;
- uid是账户id;
- gid是账户主要组的id;
- gecos是账户的真实姓名;
- home_dir是账户的家目录;
- shell是账户的登录shell;
[root@server0 ~]# head -n 5 /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
二、本地组/etc/group
与用户一样,组也有名称和编号gid。系统用/etc/group文件来存储本地组信息。用冒号分隔4列信息。
groupname:password:gid:list,of,users,in,this,group
- groupname组名,是gid到名称的一种映射,方便用户使用;
- password组密码,不常用;
- gid是组的id;
- list,of,users,in,this,group是属于这个组的用户列表,用逗号分隔;
[root@server0 ~]# head -n 5 /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:
主要组
- 每个账户只有一个主要组;
- 对本地账户,主要组通过/etc/passwd文件第4个字段gid来定义;
- 通常,账户创建的文件归主要组所有;
- 通常,新建账户的主要组是名称与账户相同的新建组;
补充组
- 账户可以有0个或任意个补充组;
- 补充组用/etc/group文件的第4列来记录
- 补充组成员身份用于帮助确保账户对系统文件和目录的访问
三、切换账户su - <username>
su命令可以切换账户。未指定账户名,意味着切换为root账户。用法是 su - <username>。
注意“-”的使用。
- su - <username>启动登录shell,会将shell环境设置为username登录一样;
- su <username>启动非登录shell,只以username身份使用当前shell环境设置;忘记这条吧
大多数情况下,都是希望获得用户的常规设置,所以一定要加上“-”!
[student@server0 ~]$ su - root
Password:
Last login: Sun Mar 29 16:44:19 CST 2020 on pts/0
[root@server0 ~]#
四、增删改本地账户useradd、userdel、usermod
增删改分别用useradd、userdel、usermod命令。
useradd命令可以在添加账户时,设置/etc/passwd文件的7列值,也可以用选项指定这7列的值。除了这7列值以外,还有一些默认值,比如家目录下的.bash_profile等文件,这些默认值在/etc/login.defs文件中定义。
usermod命令可以修改账户的信息。useradd和usermod的大多数常用选项是可以通用的。
选项 | 用途 |
---|---|
-c | 为账户指定全名,也就是指定/etc/passwd的gecos字段。 |
-g | 为账户指定主要组,也就是指定/etc/passwd的gid字段。 |
-G | 为账户指定补充组。单独使用-G指定一个补充组,账户就不再属于原来的补充组。 会修改/etc/group文件list,of,users,in,this,group |
-a | 与-G搭配使用,为账户添加补充组。-aG为账户添加一个补充组,账户仍属于原来的补充组。 会修改/etc/group文件list,of,users,in,this,group |
-s | 指定账户使用的登录shell,也就是指定/etc/passwd的shell字段。 |
-L | 锁定账户,也就是修改/etc/shadow的内容,使账户不能再登录。 |
-U | 解锁账户,也就是修改/etc/shadow的内容,使账户可以继续登录。 |
userdel命令删除账户。userdel <username>从/etc/passwd中删除,但不删除账户的家目录。userdel -r <username>既从/etc/passwd中删除,也删除账户的家目录。如果删除账户时没有用-r,那么可能造成信息的泄露。比如添加了prince账户,再删除prince账户,再添加bob账户,这时原来prince的家目录已经变成了bob所有。prince的uid被认为是可以再分配给bob的,那么分配之后,没有被删除的prince的家目录就归bob所有。
这种情况,只能是删除时用-r,或者手动为不同账户分配“无人拥有”的文件,查找方式是 find / -nouser -o -nogroup 2>/dev/null
[root@server0 ~]# useradd prince
[root@server0 ~]# ll /home/
total 4
drwx------. 4 prince prince 88 Apr 1 23:49 prince
drwx------. 10 student student 4096 Mar 29 09:31 student
[root@server0 ~]# id prince
uid=1001(prince) gid=1001(prince) groups=1001(prince)
[root@server0 ~]# userdel prince
[root@server0 ~]# ll /home/
total 4
drwx------. 4 1001 1001 88 Apr 1 23:49 prince
drwx------. 10 student student 4096 Mar 29 09:31 student
[root@server0 ~]# useradd bob
[root@server0 ~]# ll /home/
total 4
drwx------. 4 bob bob 88 Apr 1 23:50 bob
drwx------. 4 bob bob 88 Apr 1 23:49 prince
drwx------. 10 student student 4096 Mar 29 09:31 student
[root@server0 ~]# id bob
uid=1001(bob) gid=1001(bob) groups=1001(bob)
五、账户默认配置文件/etc/login.defs 和 /etc/skel目录
UID特定的号段在Redhat里面有特殊的意义。
- UID 0 始终给root;
- UID 1-200给“系统用户”,分配个Redhat的系统进程;
- UID 201-999是一系列“系统用户”,给没有自己文件的系统进程使用;
- UID 1000+可分配给普通用户
账户的密码有效期等也有默认的定义。
#QMAIL_DIR Maildir
MAIL_DIR /var/spool/mail
#MAIL_FILE .mail
# Password aging controls:
#
# PASS_MAX_DAYS Maximum number of days a password may be used.
# PASS_MIN_DAYS Minimum number of days allowed between password changes.
# PASS_MIN_LEN Minimum acceptable password length.
# PASS_WARN_AGE Number of days warning given before a password expires.
#
PASS_MAX_DAYS 99999
PASS_MIN_DAYS 0
PASS_MIN_LEN 5
PASS_WARN_AGE 7
#
# Min/max values for automatic uid selection in useradd
#
UID_MIN 1000
UID_MAX 60000
# System accounts
SYS_UID_MIN 201
SYS_UID_MAX 999
#
# Min/max values for automatic gid selection in groupadd
#
GID_MIN 1000
GID_MAX 60000
# System accounts
SYS_GID_MIN 201
SYS_GID_MAX 999
以上这些在/etc/login.defs里面定义。
新创建的用户,有默认的环境变量等,也就是家目录里默认的.bash_profile、.bashrc 和 .bash_logout 文件。这些文件都在 /etc/skel 目录里面,创建新账户的时候就从 /etc/skel 目录直接copy这3个文件给新账户。如果误删了账户的.bash*文件,也可以从这里copy过去补救一下。
六、设置密码passwd(5)命令
passwd给当前账户设置密码。passwd <username>给指定账户设置密码
passwd输入密码没有回显,为了看清指定的密码可以用--stdin选项,用法是。echo passwordstring | passwd --stdin <username>
七、增删改组groupadd、groupdel和groupmod
使用类似的groupadd、groupdel和groupmod,具体使用可以man一下
下面实验
- 创建账户user1、user2,密码分别为qwe123、1qazxsw2;
- 创建账户组 sys1 、sys2;
- user1的shell是/sbin/nologin;
- user1附属组是sys1 sys2 ;
- user2的主要组是sys2 , 附属组是sys1 user1;
- passwd 设置密码,账户才被激活;
- 创建账户zhangsf,全名ZhangSanFeng,uid为2333,shell为/sbin/nologin,创建完成后增加补充组user1、sys1和sys2;
虽然user1被激活,但是shell是/sbin/nologin还是不能登录。
[root@server0 ~]# groupadd sys1
[root@server0 ~]# groupadd sys2
[root@server0 ~]# useradd -s /sbin/nologin -G sys1,sys2 user1
[root@server0 ~]# useradd -g sys2 -G sys1,user1 user2
[root@server0 ~]# id user1
uid=1001(user1) gid=1003(user1) groups=1003(user1),1001(sys1),1002(sys2)
[root@server0 ~]# id user2
uid=1002(user2) gid=1002(sys2) groups=1002(sys2),1001(sys1),1003(user1)
[root@server0 ~]# echo qwe123 | passwd --stdin user1
[root@server0 ~]# echo 1qazxsw2 | passwd --stdin user2
[root@server0 ~]# useradd -s /sbin/nologin -u 2333 -c ZhangSanFeng zhangsf
[root@server0 ~]# usermod -aG user1,sys1,sys2 zhangsf
[root@server0 ~]# id zhangsf
uid=2333(zhangsf) gid=2333(zhangsf) groups=2333(zhangsf),1001(sys1),1002(sys2),1003(user1)
[root@server0 ~]# tail -n 5 /etc/passwd
gnome-initial-setup:x:993:991::/run/gnome-initial-setup/:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
user1:x:1001:1003::/home/user1:/sbin/nologin
user2:x:1002:1002::/home/user2:/bin/bash
zhangsf:x:2333:2333:ZhangSanFeng:/home/zhangsf:/sbin/nologin
[root@server0 ~]# tail -n 5 /etc/group
slocate:x:21:
sys1:x:1001:user1,user2,zhangsf
sys2:x:1002:user1,zhangsf
user1:x:1003:user2,zhangsf
zhangsf:x:2333:
[root@server0 ~]# tail -n 5 /etc/shadow
gnome-initial-setup:!!:16442::::::
tcpdump:!!:16442::::::
user1:$6$/k.D4qEv$91dHDyIITezuVESaFJrpZiwTWicsZr9cDqPLU9sFC6vywKSeQcK7.zKNWDg85.uGciCij/ra18oubOwqYvCeU/:18353:0:99999:7:::
user2:$6$0t/TYhB6$4iM1CO8hlHfxt/RX6/Xj9O7AHNO4irbyMXMNJ2d2/YSZM1IDO.69JQIhJgb.cOn5C5L0oqAeMt/7Ns2SMYgUp0:18353:0:99999:7:::
zhangsf:!!:18353:0:99999:7:::
八、通过sudo以root身份运行命令
sudo命令可以使账户根据/etc/sudoers文件中的设置,以root或其他账户身份运行命令。sudo要求输入自己的密码来进行身份验证,而不是输入他们要以什么账户(root)的密码。编辑/etc/sudoers文件用命令visudo。
这样的好处是,可以把一部分命令交给非root账户去做,而不是像su - <username>那样真的变成root,也不用告知root密码。所有sudo运行的命令都会记录到/var/log/secure日志中。
比如,添加账户useradd是root身份执行的命令,现在用user2身份添加账户user3。
[root@server0 ~]# su - user2
[user2@server0 ~]$ sudo useradd user3
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 user2:
user2 is not in the sudoers file. This incident will be reported.
[root@server0 ~]# tail -n 2 /var/log/secure
Apr 2 00:40:39 localhost sudo: user2 : user NOT in sudoers ; TTY=pts/1 ; PWD=/home/user2 ; USER=root ; COMMAND=/sbin/useradd user3
Apr 2 00:40:56 localhost su: pam_unix(su-l:session): session closed for user user2
我们在/etc/sudoers里面增加user2以后再尝试一下。可以看到,user2也能添加user3,而且/var/log/secure里面记录了是user2添加的用户。
[root@server0 ~]# visudo
[root@server0 ~]# cat /etc/sudoers | grep user2
user2 ALL=/usr/sbin/useradd
[root@server0 ~]# su - user2
Last login: Thu Apr 2 00:40:08 CST 2020 on pts/1
[user2@server0 ~]$ sudo useradd user3
[sudo] password for user2:
[user2@server0 ~]$ id user3
uid=2334(user3) gid=2334(user3) groups=2334(user3)
[user2@server0 ~]$ exit
logout
[root@server0 ~]# tail -n 4 /var/log/secure
Apr 2 00:47:15 localhost sudo: user2 : TTY=pts/1 ; PWD=/home/user2 ; USER=root ; COMMAND=/sbin/useradd user3
Apr 2 00:47:15 localhost useradd[5576]: new group: name=user3, GID=2334
Apr 2 00:47:15 localhost useradd[5576]: new user: name=user3, UID=2334, GID=2334, home=/home/user3, shell=/bin/bash
Apr 2 00:49:30 localhost su: pam_unix(su-l:session): session closed for user user2
九、管理用户密码/etc/shadow
/etc/shadow用于存储用户的加密密码和密码策略。其格式是用冒号分隔9列信息
name:password:lastchange:minage:maxage:warning:inactive:expire:blank
- name是用户名;
- password是经过加密的密码,如果密码开头是感叹号,表示密码被锁定;
- lastchange最后一次更改密码的日期,距离1970.01.01的天数;
- minage表示lastchange后最少经过minage才能更改密码,0表示没有最短期限要求;
- maxage表示lastchange后最多经过maxage必须更改密码;
- warning表示密码即将到期的警告期,0表示不提供警告;
- inactive密码到期后保持活动的天数,在此期限内用户仍可以登录系统并更改密码,在指定天数过后,账户被锁定,变为不活动;
- expire账户到期日期,距离1970.01.01的天数,与前面密码的期限不同,这个expire指的是账户的期限;
- blank为预留字段,供未来使用;
/etc/shadow里面很多字段都是用距离1970.01.01的天数来作为值的,怎么才能计算出这个天数是多少呢?那就是使用date命令,可以用来计算距离某天多少天的日期,或者某天距离某天多少天。date -d加上简单的描述字符就知道这个天数是多少了。
[root@server0 ~]# date -d "19700101+18376days"
Fri Apr 24 00:00:00 CST 2020
通过chage命令可以修改某个账户的密码有效期设置。
chage -l user1 查看用户user1的密码设置。
chage -m 0 -M 90 -W 8 -I 14 -E 2021-01-01 user1 将用户user1的密码设置更改为最后一次更改密码(2020-April-01)后最少0天可以改密码,最多90天(2020-June-30)就必须改密码,到期前8天开始提示改密码,到期后宽限到14天(2020-July-14),账户有效期到2021-January-01。
[root@server0 ~]# tail -n 5 /etc/shadow
tcpdump:!!:16442::::::
user1:$6$/k.D4qEv$91dHDyIITezuVESaFJrpZiwTWicsZr9cDqPLU9sFC6vywKSeQcK7.zKNWDg85.uGciCij/ra18oubOwqYvCeU/:18353:0:99999:7:::
user2:$6$0t/TYhB6$4iM1CO8hlHfxt/RX6/Xj9O7AHNO4irbyMXMNJ2d2/YSZM1IDO.69JQIhJgb.cOn5C5L0oqAeMt/7Ns2SMYgUp0:18353:0:99999:7:::
zhangsf:!!:18353:0:99999:7:::
user3:!!:18353:0:99999:7:::
[root@server0 ~]#
[root@server0 ~]# chage -l user1
Last password change : Apr 01, 2020
Password expires : never
Password inactive : never
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7
[root@server0 ~]# chage -m 0 -M 90 -W 8 -I 14 -E 2021-01-01 user1
[root@server0 ~]#
[root@server0 ~]# chage -l user1
Last password change : Apr 01, 2020
Password expires : Jun 30, 2020
Password inactive : Jul 14, 2020
Account expires : Jan 01, 2021
Minimum number of days between password change : 0
Maximum number of days between password change : 90
Number of days of warning before password expires : 8
[root@server0 ~]#
[root@server0 ~]# tail -n 5 /etc/shadow
tcpdump:!!:16442::::::
user1:$6$/k.D4qEv$91dHDyIITezuVESaFJrpZiwTWicsZr9cDqPLU9sFC6vywKSeQcK7.zKNWDg85.uGciCij/ra18oubOwqYvCeU/:18353:0:90:8:14:18628:
user2:$6$0t/TYhB6$4iM1CO8hlHfxt/RX6/Xj9O7AHNO4irbyMXMNJ2d2/YSZM1IDO.69JQIhJgb.cOn5C5L0oqAeMt/7Ns2SMYgUp0:18353:0:99999:7:::
zhangsf:!!:18353:0:99999:7:::
user3:!!:18353:0:99999:7:::
chage -d 0 user1 设置user1必须改秘密。
[root@server0 ~]# chage -d 0 user1
[root@server0 ~]# chage -l user1
Last password change : password must be changed
Password expires : password must be changed
Password inactive : password must be changed
Account expires : Jan 01, 2021
Minimum number of days between password change : 0
Maximum number of days between password change : 90
Number of days of warning before password expires : 8
[root@server0 ~]#
[root@server0 ~]# tail -n 5 /etc/shadow
tcpdump:!!:16442::::::
user1:$6$/k.D4qEv$91dHDyIITezuVESaFJrpZiwTWicsZr9cDqPLU9sFC6vywKSeQcK7.zKNWDg85.uGciCij/ra18oubOwqYvCeU/:0:0:90:8:14:18628:
user2:$6$0t/TYhB6$4iM1CO8hlHfxt/RX6/Xj9O7AHNO4irbyMXMNJ2d2/YSZM1IDO.69JQIhJgb.cOn5C5L0oqAeMt/7Ns2SMYgUp0:18353:0:99999:7:::
zhangsf:!!:18353:0:99999:7:::
user3:!!:18353:0:99999:7:::
usermod -L user1 可以用来锁定账户。被锁定的账户的密码前面会多一个感叹号 !,注意观察。usermod -U user1可以用来解锁账户。
[root@server0 ~]# tail -n 5 /etc/shadow
tcpdump:!!:16442::::::
user1:$6$/k.D4qEv$91dHDyIITezuVESaFJrpZiwTWicsZr9cDqPLU9sFC6vywKSeQcK7.zKNWDg85.uGciCij/ra18oubOwqYvCeU/:0:0:90:8:14:18628:
user2:$6$0t/TYhB6$4iM1CO8hlHfxt/RX6/Xj9O7AHNO4irbyMXMNJ2d2/YSZM1IDO.69JQIhJgb.cOn5C5L0oqAeMt/7Ns2SMYgUp0:18353:0:99999:7:::
zhangsf:!!:18353:0:99999:7:::
user3:!!:18353:0:99999:7:::
[root@server0 ~]#
[root@server0 ~]#
[root@server0 ~]# usermod -L user1
[root@server0 ~]#
[root@server0 ~]# tail -n 5 /etc/shadow
tcpdump:!!:16442::::::
user1:!$6$/k.D4qEv$91dHDyIITezuVESaFJrpZiwTWicsZr9cDqPLU9sFC6vywKSeQcK7.zKNWDg85.uGciCij/ra18oubOwqYvCeU/:0:0:90:8:14:18628:
user2:$6$0t/TYhB6$4iM1CO8hlHfxt/RX6/Xj9O7AHNO4irbyMXMNJ2d2/YSZM1IDO.69JQIhJgb.cOn5C5L0oqAeMt/7Ns2SMYgUp0:18353:0:99999:7:::
zhangsf:!!:18353:0:99999:7:::
user3:!!:18353:0:99999:7:::
[root@server0 ~]#
[root@server0 ~]# usermod -U user1
[root@server0 ~]#
[root@server0 ~]# tail -n 5 /etc/shadow
tcpdump:!!:16442::::::
user1:$6$/k.D4qEv$91dHDyIITezuVESaFJrpZiwTWicsZr9cDqPLU9sFC6vywKSeQcK7.zKNWDg85.uGciCij/ra18oubOwqYvCeU/:0:0:90:8:14:18628:
user2:$6$0t/TYhB6$4iM1CO8hlHfxt/RX6/Xj9O7AHNO4irbyMXMNJ2d2/YSZM1IDO.69JQIhJgb.cOn5C5L0oqAeMt/7Ns2SMYgUp0:18353:0:99999:7:::
zhangsf:!!:18353:0:99999:7:::
user3:!!:18353:0:99999:7:::