管理賬戶和組的文件有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
UID特定的號段在Redhat裏面有特殊的意義。
- UID 0 始終給root;
- UID 1-200給“系統用戶”,分配個Redhat的系統進程;
- UID 201-999是一系列“系統用戶”,給沒有自己文件的系統進程使用;
- UID 1000+可分配給普通用戶
六、設置密碼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:::