2.1 用戶和組的基本概念
用戶和組是操作系統中一種身份認證資源。
每個用戶都有用戶名、用戶的唯一編號uid(user id)、所屬組及其默認的shell,可能還有密碼、家目錄、附屬組、注釋信息等。
每個組也有自己的名稱、組唯一編號gid(group id)。一般來說,gid和uid是可以不相同的,但絕大多數都會讓它們保持一致,大致屬於約定俗成類的概念吧。
組分為主組(primary group)和輔助組(secondary group)兩種,用戶一定會屬於某個主組,也可以同時加入多個輔助組。
在Linux中,用戶分為3類:
(1). 超級管理員
超級管理員是最高權限者,它的uid=0,默認超級管理員用戶名為root。因為uid默認具有唯一性,所以超級管理員默認只能有一個(如何添加額外的超級管理員,見useradd命令),但這一個超級管理員的名稱並非一定要是root。但是沒人會去改root的名稱,在后續非常非常多的程序中,都認為超級管理員名稱為root,這里要是一改,牽一發而動全身。
(2). 系統用戶
有時候需要一類具有某些特權但又不需要登錄操作系統的用戶,這類用戶稱為系統用戶。它們的uid范圍從201到999(不包括1000),有些老版本范圍是1到499(centos 6),出於安全考慮,它們一般不用來登錄,所以它們的shell一般是/sbin/nologin,而且大多數時候它們是沒有家目錄的。
(3). 普通用戶
普通用戶是權限受到限制的用戶,默認只能執行/bin、/usr/bin、/usr/local/bin和自身家目錄下的命令。它們的uid從500開始。盡管普通用戶權限收到限制,但是它對自身家目錄下的文件是有所有權限的。
超級管理員和其他類型的用戶,它們的命令提示符是不一樣的。uid=0的超級管理員,命令提示符是"#",其他的為"$"。
默認root用戶的家目錄為/root,其他用戶的家目錄一般在/home下以用戶名命名的目錄中,如longshuai這個用戶的家目錄為/home/longshuai。當然,家目錄是可以自定義位置和名稱的。
2.2 用戶和組管理相關的文件
2.2.1 用戶文件/etc/passwd
/etc/passwd文件里記錄的是操作系統中用戶的信息,這里面記錄了幾行就表示系統中有幾個系統用戶。它的格式大致如下:
root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash nginx:x:498:499:Nginx web server:/var/lib/nginx:/sbin/nologin longshuai:x:1000:1000::/home/longshuai:/bin/bash |
每一行表示一個用戶,每一行的格式都是6個冒號共7列屬性,其中有很多用戶的某些列屬性是留空的。
用戶名:x:uid:gid:用戶注釋信息:家目錄:使用的shell類型
- 第一列:用戶名。注意兩個個特殊的用戶名,root、nobody
- 第二列:x。在以前老版本的系統上,第二列是存放用戶密碼的,但是密碼和用戶信息放在一起不便於管理(密鑰要保證其特殊屬性),所以后來將密碼單獨放在另一個文件/etc/shadow中,這里就都寫成x了
- 第三列:uid
- 第四列:gid
- 第五列:用戶注釋信息。
- 第六列:用戶家目錄。注意root用戶的家目錄為/root
- 第七列:用戶的默認shell,雖然叫shell,但其實可以是任意一個可執行程序或腳本。例如上面的/bin/bash、/sbin/nologin、/sbin/shutdown
用戶的默認shell表示的是用戶登錄(如果允許登錄)時的環境或執行的命令。例如shell為/bin/bash時,表示登錄時就執行/bin/bash命令進入bash環境;shell為/sbin/nologin表示該用戶不能登錄,之所以不能登錄不是因為指定了這個特殊的程序,而是由/sbin/nologin這個程序的功能實現的,假如修改Linux的源代碼,將/sbin/nologin這個程序變成可登錄,那么shell為/sbin/nologin時也是可以登錄的。
2.2.2 密碼文件/etc/shadow
/etc/shadow文件中存放的是用戶的密碼信息。該文件具有特殊屬性,除了超級管理員,任何人都不能直接讀取和修改該文件,而用戶自身之所以能修改密碼,則是因為passwd程序的suid屬性,使得修改密碼時臨時提升為root權限。
該文件的格式大致如下:
每一行表示一個用戶密碼的屬性,有8個冒號共9列屬性。該文件更詳細的信息看wiki:https://en.wikipedia.org/wiki/Passwd#Shadow_file。
- 第一列:用戶名。
- 第二列:加密后的密碼。但是這一列是有玄機的,有些特殊的字符表示特殊的意義。
- ①.該列留空,即"::",表示該用戶沒有密碼。
- ②.該列為"!",即":!:",表示該用戶被鎖,被鎖將無法登陸,但是可能其他的登錄方式是不受限制的,如ssh key的方式,su的方式。
- ③.該列為"*",即":*:",也表示該用戶被鎖,和"!"效果是一樣的。
- ④.該列以"!"或"!!"開頭,則也表示該用戶被鎖。
- ⑤.該列為"!!",即":!!:",表示該用戶從來沒設置過密碼。
- ⑥.如果格式為"$id$salt$hashed",則表示該用戶密碼正常。其中$id$的id表示密碼的加密算法,$1$表示使用MD5算法,$2a$表示使用Blowfish算法,"$2y$"是另一算法長度的Blowfish,"$5$"表示SHA-256算法,而"$6$"表示SHA-512算法,可見上面的結果中都是使用sha-512算法的。$5$和$6$這兩種算法的破解難度遠高於MD5。$salt$是加密時使用的salt,$hashed才是真正的密碼部分。
- 第三列:從1970年1月1日到上次密碼修改經過的時間(天數)。通過計算現在離1970年1月1日的天數減去這個值,結果就是上次修改密碼到現在已經經過了多少天,即現在的密碼已經使用了多少天。
- 第四列:密碼最少使用期限(天數)。省略或者0表示不設置期限。例如,剛修改完密碼又想修改,可以限制多久才能再次修改
- 第五列:密碼最大使用期限(天數)。超過了它不一定密碼就失效,可能下一個字段設置了過期后的寬限天數。設置為空時將永不過期,后面設置的提醒和警告將失效。root等一些用戶的已經默認設置為了99999,表示永不過期。如果值設置小於最短使用期限,用戶將不能修改密碼。
- 第六列:密碼過期前多少天就開始提醒用戶密碼將要過期。空或0將不提醒。
- 第七列:密碼過期后寬限的天數,在寬限時間內用戶無法使用原密碼登錄,必須改密碼或者聯系管理員。設置為空表示沒有強制的寬限時間,可以過期后的任意時間內修改密碼。
- 第八列:帳號過期時間。從1970年1月1日開始計算天數。設置為空帳號將永不過期,不能設置為0。不同於密碼過期,密碼過期后賬戶還有效,改密碼后還能登錄;帳號過期后帳號失效,修改密碼重設密碼都無法使用該帳號。
- 第九列:保留字段。
2.2.3 組文件/etc/group和/etc/gshadow
大致知道有這么兩個文件即可,至於文件中的內容無需關注。
/etc/group包含了組信息。每行一個組,每一行3個冒號共4列屬性。
- 第一列:組名。
- 第二列:占位符。
- 第三列:gid。
- 第四列:該組下的user列表,這些user成員以該組做為輔助組,多個成員使用逗號隔開。
/etc/gshadow包含了組密碼信息
2.2.4 骨架目錄/etc/skel
骨架目錄中的文件是每次新建用戶時,都會復制到新用戶家目錄里的文件。默認只有3個環境配置文件,可以修改這里面的內容,或者添加幾個文件在骨架目錄中,以后新建用戶時就會自動獲取到這些環境和文件。
shell> ls –l -A /etc/skel total 12 -rw-r--r--. 1 root root 18 Oct 16 2014 .bash_logout -rw-r--r--. 1 root root 176 Oct 16 2014 .bash_profile -rw-r--r--. 1 root root 124 Oct 16 2014 .bashrc
刪除家目錄下這些文件,會導致某些設置出現問題。例如刪除".bashrc"這個文件,會導致提示符變異的問題,如下右圖。
要解決這個問題,只需拷貝一個正常的.bashrc文件到其家目錄中即可。一般還會修改該文件的所有者和權限。
2.2.5 /etc/login.defs
設置用戶帳號限制的文件。該文件里的配置對root用戶無效。
如果/etc/shadow文件里有相同的選項,則以/etc/shadow里的設置為准,也就是說/etc/shadow的配置優先級高於/etc/login.defs。
該文件有很多配置項,文件的默認內容只給出了一小部分,若想知道全部的配置項以及配個配置項的詳細說明,可以"man 5 login.defs"查看。
[root@xuexi ~]# less /etc/login.defs #QMAIL_DIR Maildir # QMAIL_DIR是Qmail郵件的目錄,所以可以不設置它 MAIL_DIR /var/spool/mail # 默認郵件根目錄,即信箱 #MAIL_FILE .mail # mail文件的格式是.mail # Password aging controls: PASS_MAX_DAYS 99999 # 密碼最大有效期(天) PASS_MIN_DAYS 0 # 兩次密碼修改之間最小時間間隔 PASS_MIN_LEN 5 # 密碼最短長度 PASS_WARN_AGE 7 # 密碼過期前給警告信息的時間 # 控制useradd創建用戶時自動選擇的uid范圍 # 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 # 控制groupadd創建組時自動選擇的gid范圍 # 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 # 設置此項后,在刪除用戶時,將自動刪除用戶擁有的at/cron/print等job #USERDEL_CMD /usr/sbin/userdel_local # 控制useradd添加用戶時是否默認創建家目錄,useradd -m選項會覆蓋此處設置 CREATE_HOME yes # 設置創建家目錄時的umask值,若不指定則默認為022 UMASK 077 # 設置此項表示當組中沒有成員時自動刪除該組 # 且useradd是否同時創建同用戶名的主組。(該文件中並沒有此項說明,來自於man useradd中-g選項的說明) USERGROUPS_ENAB yes # 設置用戶和組密碼的加密算法 ENCRYPT_METHOD SHA512
注意,/etc/login.defs中的設置控制的是shadow-utils包中的組件,也就是說,該組件中的工具執行操作時會讀取該文件中的配置。該組件中包含下面的程序:
/usr/bin/gpasswd :administer /etc/group and /etc/gshadow /usr/bin/newgrp :log in to a new group,可用來修改gid,哪怕是正在登陸的會話也可以修改 /usr/bin/sg :execute command as different group ID /usr/sbin/groupadd :添加組 /usr/sbin/groupdel :刪除組 /usr/sbin/groupmems :管理當前用戶的主組中的成員,root用戶則可以指定要管理的組 /usr/sbin/groupmod :modify a group definition on the system /usr/sbin/grpck :verify integrity of group files /usr/sbin/grpconv :無視它 /usr/sbin/grpunconv :無視它 /usr/sbin/pwconv :無視它 /usr/sbin/pwunconv :無視它 /usr/sbin/adduser :是useradd的一個軟鏈接,添加用戶 /usr/sbin/chpasswd :update passwords in batch mode /usr/sbin/newusers :update and create new users in batch /usr/sbin/pwck :verify integrity of passsword files /usr/sbin/useradd :添加用戶 /usr/sbin/userdel :刪除用戶 /usr/sbin/usermod :重定義用戶信息 /usr/sbin/vigr :edit the group and shadow-group file /usr/sbin/vipw :edit the password and shadow-password file /usr/bin/lastlog :輸出所有用戶或給定用戶最近登錄信息
2.2.6 /etc/default/useradd
創建用戶時的默認配置。useradd -D修改的就是此文件。
[root@xuexi ~]# cat /etc/default/useradd # useradd defaults file GROUP=100 # 在useradd使用-N或/etc/login.defs中USERGROUPS_ENAB=no時表示創建用戶時不創建同用戶名的主組(primary group), # 此時新建的用戶將默認以此組為主組,網上關於該設置的很多說明都是錯的,具體可看man useradd的-g選項或useradd -D的-g選項 HOME=/home # 把用戶的家目錄建在/home中 INACTIVE=-1 # 是否啟用帳號過期設置(是帳號過期不是密碼過期),-1表示不啟用 EXPIRE= # 帳號過期時間,不設置表示不啟用 SHELL=/bin/bash # 新建用戶默認的shell類型 SKEL=/etc/skel # 指定骨架目錄,前文的/etc/skel就在這里 CREATE_MAIL_SPOOL=yes # 是否創建用戶mail緩沖
man useradd的useradd -D選項介紹部分說明了這些項的意義。
2.3 用戶和組管理命令
2.3.1 useradd和adduser
adduser是useradd的一個軟鏈接。
useradd [options] login_name 選項說明: -b:指定家目錄的basedir,默認為/home目錄 -d:指定用戶家目錄,不寫時默認為/home/user_name -m:要創建家目錄時,若家目錄不存在則自動創建,若不指定該項且/etc/login.defs中的CREATE_HOME未啟用時將不會創建家目錄 -M:顯式指明不要創建家目錄,會覆蓋/etc/login.defs中的CREATE_HOME設置 -g:指定用戶主組,要求組已存在 -G:指定用戶的輔助組,多個組以逗號分隔 -N:明確指明不要創建和用戶名同名的組名 -U:明確指明要創建一個和用戶名同名的組,並將用戶加入到此組中 -o:允許創建一個重復UID的用戶,只有和-u選項同時使用時才生效 -r:創建一個系統用戶。useradd命令不會為此選項的系統用戶創建家目錄,除非明確使用-m選項 -s:指定用戶登錄的shell,默認留空。此時將選擇/etc/default/useradd中的SHELL變量設置 -u:指定用戶uid,默認uid必須唯一,除非使用了-o選項 -c:用戶的注釋信息 -k:指定骨架目錄(skeleton) -K:修改/etc/login.defs文件中有關於用戶的配置項,不能修改組相關的配置。設置方式為KEY=VALUE,如-K UID_MIN=100 -D:修改useradd創建用戶時的默認選項,就修改/etc/default/useradd文件 -e:帳戶過期時間,格式為"YYYY-MM-DD" -f:密碼過期后,該賬號還能存活多久才被禁用,設置為0表示密碼過期立即禁用帳戶,設置為-1表示禁用此功能 -l:不要將用戶的信息寫入到lastlog和faillog文件中。默認情況下,用戶信息會寫入到這兩個文件中 useradd -D [options] 修改/etc/default/useradd文件 選項說明:不加任何選項時會列出默認屬性 -b, --base-dir BASE_DIR -e, --expiredate EXPIRE_DATE -f, --inactive INACTIVE -g, --gid GROUP -s, --shell SHELL
示例:
[root@xuexi ~]# useradd -D -e "2016-08-20" # 設置用戶2016-08-20過期
[root@xuexi ~]# useradd -D GROUP=100 HOME=/home INACTIVE=-1 EXPIRE=2016-08-20 SHELL=/bin/bash SKEL=/etc/skel CREATE_MAIL_SPOOL=yes
[root@xuexi ~]# cat /etc/default/useradd # useradd defaults file GROUP=100 HOME=/home INACTIVE=-1 EXPIRE=2016-08-20 SHELL=/bin/bash SKEL=/etc/skel CREATE_MAIL_SPOOL=yes
useradd創建用戶時,默認會自動創建一個和用戶名相同的用戶組,這是/etc/login.defs中的USERGROUP_ENAB變量控制的。
useradd創建普通用戶時,不加任何和家目錄相關的選項時,是否創建家目錄是由/etc/login.defs中的CREATE_HOME變量控制的。
2.3.2 批量創建用戶newusers
newusers用於批量創建或修改已有用戶信息。在創建用戶時,它會讀取/etc/login.defs文件中的配置項。
newusers [options] [file]
newusers命令從file中或標准輸入中讀取要創建或修改用戶的信息,文件中每行格式都一樣,一行代表一個用戶。格式如下:
pw_name:pw_passwd:pw_uid:pw_gid:pw_gecos:pw_dir:pw_shell
各列的意義如下:
- pw_name:用戶名,若不存在則新創建,否則修改已存在用戶的信息
- pw_passwd:用戶密碼,該項使用明文密碼,在修改或創建用戶時會按照指定的算法自動對其進行加密轉換
- pw_uid:指定uid,留空則自動選擇uid。如果該項為已存在的用戶名,則使用該用戶的uid,但不建議這么做,uid應盡量保證唯一性
- pw_gid:用戶主組的gid或組名。若給定組不存在,則自動創建組。若留空,則創建同用戶名的組,gid將自動選擇
- pw_gecos:用戶注釋信息
- pw_dir:指定用戶家目錄,若不存在則自動創建。留空則不創建。
-
:注意,newusers命令不會遞歸創建父目錄,父目錄不存在時將會給出信息,但newusers命令仍會繼續執行
-
:以完成創建剩下的用戶,所以這些錯誤的用戶家目錄需要手動去創建。
- pw_shell:指定用戶的默認shell
newusers [options] [file]
選項說明:
-c:指定加密方法,可選DES,MD5,NONE,SHA256和SHA512
-r:創建一個系統用戶
newusers首先嘗試創建或修改所有指定的用戶,然后將信息寫入到user和group的文件中。如果嘗試創建或修改用戶過程中發生錯誤,則所有動作都將回滾,但如果在寫入過程中發生錯誤,則寫入成功的不會回滾,這將可能導致文件的不一致性。要檢查用戶、組文件的一致性,可以使用showdow-utils包提供的grpck和pwck命令。
示例:
shell> cat /tmp/userfile zhangsan:123456:2000:2000::/home/zhangsan:/bin/bash lisi:123456:::::/bin/bash shell> newusers -c SHA512 /tmp/userfile shell> tail -2 /etc/passwd zhangsan:x:2000:2000::/home/zhangsan:/bin/bash lisi:x:2001:2001:::/bin/bash shell> tail -2 /etc/shadow zhangsan:$6$aI1Mk/krF$xN0TFOIRibrb/mYngJ/sV3M7g4zOxqOh8CWyDlI0uwmr5qNTzsmwauRFvCpfLtvtiJYZ/5bil.XfJMNB.sqDY1:17323:0:99999:7::: lisi:$6$bngXo/V6wWW$.TlQCJtEm9krBX0Oiep/iahS59a/BwVYcSc8F9lAnMGF55K6W5YoUZ2nK6WkMta3p7sihkxHm/AuNrrJ6hqNn1:17323:0:99999:7:::
2.3.3 groupadd
創建一個新組。
groupadd [options] group 選項說明: -f:如果要創建的組已經存在,默認會錯誤退出,使用該選項則強制創建且以正確狀態退出,只不過gid可能會不受控制。 -g:指定gid,默認gid必須唯一,除非使用了-o選項。 -K:修改/etc/login.defs中關於組相關的配置項。配置方式為KEY=VALUE,例如-K GID_MIN=100 -K GID_MAX=499 -o:允許創建一個非唯一gid的組 -r:創建系統組
2.3.4 修改密碼passwd
修改密碼的工具。默認passwd命令不允許為用戶創建空密碼。
passwd修改密碼前會通過pam認證用戶,pam配置文件中與此相關的設置項如下:
passwd password requisite pam_cracklib.so retry=3
passwd password required pam_unix.so use_authtok
命令的用法如下:
passwd options [username] 選項說明: -l:鎖定指定用戶的密碼,在/etc/shadow的密碼列加上前綴"!"或"!!"。這種鎖定不是完全鎖定,使用ssh公鑰還是能登錄。要完全鎖定,使用chage -E 0來設置帳戶過期。 -u:解鎖-l鎖定的密碼,解鎖的方式是將/etc/shadow的密碼列的前綴"!"或"!!"移除掉。但不能移除只有"!"或"!!"的項。 --stdin:從標准輸入中讀取密碼 -d:刪除用戶密碼,將/etc/shadow的密碼列設置為空 -f:指定強制操作 -e:強制密碼過期,下次登錄將強制要求修改密碼 -n:密碼最小使用天數 -x:最大密碼使用天數 -w:過期前幾天開始提示用戶密碼將要過期 -i:設置密碼過期后多少天,用戶才過期。用戶過期將被禁用,修改密碼也無法登陸。
2.3.5 批量修改密碼chpasswd
以批處理模式從標准輸入中獲取提供的用戶和密碼來修改用戶密碼,可以一次修改多個用戶密碼。也就是說不用交互。適用於一次性創建了多個用戶時為他們提供密碼。
chpasswd [-e -c] "user:passwd" -c:指定加密算法,可選的算法有DES,MD5,NONE,SHA256和SHA512 user:passwd為用戶密碼對,其中默認passwd是明文密碼,可以指定多對,每行一個用戶密碼對。前提是用戶是已存在的。 -e:passwd默認使用的是明文密碼,如果要使用密文,則使用-e選項。參見man chpasswd
chpasswd會讀取/etc/login.defs中的相關配置,修改成功后會將密碼信息寫入到密碼文件中。
該命令的修改密碼的處理方式是先在內存中修改,如果所有用戶的密碼都能設置成功,然后才寫入到磁盤密碼文件中。在內存中修改過程中出錯,則所有修改都回滾,但若在寫入密碼文件過程中出錯,則成功的不會回滾。
示例:
修改單個用戶密碼。
shell> echo "user1:123456" | chpasswd -c SHA512
修改多個用戶密碼,則提供的每個用戶對都要分行。
shell> echo -e 'usertest:123456\nusertest2:123456' | chpasswd
更方便的是寫入到文件中,每行一個用戶密碼對。
shell> cat /tmp/passwdfile zhangsan:123456 lisi:123456 shell> chapasswd -c SHA512 </tmp/passwdfile
2.3.6 chage
chage命令主要修改或查看和密碼時間相關的內容。具體的看man文檔,可能用到的兩個選項如下:
-l:列出指定用戶密碼相關信息
-E:指定帳戶(不是密碼)過期時間,所以是強鎖定,如果指定為0,則立即過期,即直接鎖定該用戶
[root@server2 ~]# chage -l zhangsan Last password change : Jun 06, 2017 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@server2 ~]# chage -E 0 zhangsan [root@server2 ~]# chage -l zhangsan Last password change : Jun 06, 2017 Password expires : never Password inactive : never Account expires : Jan 01, 1970 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
2.3.7 刪除用戶和組
userdel命令用於刪除用戶。
userdel [options] login_name -r:遞歸刪除家目錄,默認不刪除家目錄。 -f:強制刪除用戶,即使這個用戶正處於登錄狀態。同時也會強制刪除家目錄。
一般不直接刪除家目錄,即不用-r,可以vim /etc/passwd,將不需要的用戶直接注釋掉。
groupdel命令刪除組。如果要刪除的組是某用戶的主組,需要先刪除主組中的用戶。
2.3.8 usermod
修改帳戶屬性信息。必須要確保在執行該命令的時候,待修改的用戶沒有在執行進程。
usermod [options] login 選項說明: -l:修改用戶名,僅僅只是改用戶名,其他的一切都不會改動(uid、家目錄等) -u:新的uid,新的uid必須唯一,除非同時使用了-o選項 -g:修改用戶主組,可以是以gid或組名。對於那些以舊組為所屬組的文件(除原家目錄),需要重新手動修改其所屬組 -m:移動家目錄內容到新的位置,該選項只在和-d選項一起使用時才生效 -d:修改用戶的家目錄位置,若不存在則自動創建。默認舊的家目錄不會刪除 如果同時指定了-m選項,則舊的家目錄中的內容會移到新家目錄 如果當前用戶家目錄不存在或沒有家目錄,則也不會創建新的家目錄 -o:允許用戶使用非唯一的UID -s:修改用的shell,留空則選擇默認shell -c:修改用戶注釋信息 -a:將用戶以追加的方式加入到輔助組中,只能和-G選項一起使用 -G:將用戶加入指定的輔助組中,若此處未列出某組,而此前該用戶又是該組成員,則會刪除該組中此成員 -L:鎖定用戶的密碼,將在/etc/shadow的密碼列加上前綴"!"或"!!" -U:解鎖用戶的密碼,解鎖的方式是移除shadow文件密碼列的前綴"!"或"!!" -e:帳戶過期時間,時間格式為"YYYY-MM-DD",如果給一個空的參數,則立即禁用該帳戶 -f:密碼過期后多少天,帳戶才過期被禁用,0表示密碼過期帳戶立即禁用,-1表示禁用該功能
同樣,還有groupmod修改組信息,用法非常簡單,幾乎也用不上,不多說了。
2.3.9 vipw和vigr
vipw和vigr是編輯用戶和組文件的工具,vipw可以修改/etc/passwd和/etc/shadow,vigr可以修改/etc/group和/etc/gshadow,用這兩個工具比較安全,在修改的時候會檢查文件的一致性。
刪除用戶出錯時,提示用戶正在被進程占用。可以使用vi編輯/etc/paswd和/etc/shadow文件將該用戶對應的行刪除掉。也可以使用vipw和vipw -s來分別編輯/etc/paswd和/etc/shadow文件。它們的作用是一樣的。
2.3.10 手動創建用戶
手動創建用戶的全過程:需要管理員權限。
- 在/etc/group中添加用戶所屬組的相關信息。如果用戶還有輔助組則在對應組中加入該用戶作為成員。
- 在/etc/passwd和/etc/shadow中添加用戶相關信息。此時指定的家目錄還不存在,密碼不存在,所以/etc/shadow的密碼位使用"!!"代替。
- 創建家目錄,並復制骨架目錄中的文件到家目錄中。
shell> mkdir /home/user_name shell> cp -r /etc/skel /home/user_name。
- 修改家目錄及子目錄的所有者和屬組。
shell> chown -R user_name:user_name /home/user_name
- 修改家目錄及子目錄的權限。例如設置組和其他用戶無任何權限但所有者有。
shell> chmod -R 700 /home/user_name
到此為止,用戶已經創建完成了,只是沒有密碼,所以只能su,不能登錄。
- 生成密碼。
- 使用openssl passwd生成密碼。但openssl passwd生成的密碼只能是MD5算法的,很容易被破解
# 生成使用md5算法的密碼,然后將其復制到/etc/shadow對應的密碼位
# 其中-1是指md5,-salt '12345678'是使用8位字符創建密碼的雜項
shell> openssl passwd -1 -salt '12345678' '123456'
-
- 直接使用passwd命令創建密碼
- 測試手動創建的用戶是否可以正確登錄。
以下是全過程。
shell> mkdir /tmp/12;cp /etc/group /etc/passwd /etc/shadow /tmp/12/ # 備份這些文件 shell> echo "userX:x:666" >> /etc/group shell> echo "userX:x:666:666::/home/userX:/bin/bash" >> /etc/passwd shell> echo 'userX:!!:17121:0:99999::::' >> /etc/shadow shell> cp -r /etc/skel /home/userX shell> chown -R userX:userX /home/userX shell> chmod -R go= /home/userX shell> passwd --stdin userX <<< '123456'
測試使用userX是否可以登錄。
如果是使用openssl passwd創建的密碼。那么使用下面的方法將這部分密碼替換到/etc/shadow中。
shell> field=$(tail -1 /etc/shadow | cut -d":" -f2) shell> password=$(openssl passwd -1 -salt 'abcdefg' 123456) shell> sed -i '$s%'$field'%'$password'%' /etc/shadow
2.4 其他用戶相關命令
2.4.1 finger查看用戶信息
從CentOS 6版本開始就沒有該命令了,要先安裝。
shell> yum -y install finger
shell> useradd zhangsan
shell> finger zhangsan
Login: zhangsan Name:
Directory: /home/zhangsan Shell: /bin/bash
Never logged in.
No mail.
No Plan.
2.4.2 id
id username -u:得到uid -n:得到用戶名而不是uid -z:無任何空白字符輸出模式,不能在默認的格式下使用。
示例:
shell> id root uid=0(root) gid=0(root) groups=0(root) shell> id wangwu uid=500(wangwu) gid=500(wangwu) groups=500(wangwu) shell> id -u wangwu 500 shell> id -u -z wangwu 2002[root@server2 ~]#
2.4.3 users
查看當前正在登陸的用戶名。
2.4.4 last
查看最近登錄的用戶列表,其實last查看的是/var/log/wtmp文件。
-n 顯示行數:列出最近幾次登錄的用戶
[root@xuexi ~]# last -4 root pts/0 192.168.100.1 Wed Mar 30 15:16 still logged in root pts/1 192.168.100.1 Wed Mar 30 14:21 - 14:21 (00:00) root pts/1 192.168.100.1 Wed Mar 30 14:04 - 14:10 (00:06) root pts/0 192.168.100.1 Wed Mar 30 13:12 - 15:16 (02:04) wtmp begins Thu Feb 18 20:59:39 2016
2.4.5 lastb
查看誰嘗試登陸過但沒有登錄成功的。即能夠審核和查看誰曾經不斷的登錄,可能那就是黑客。
-n:只列出最近的n個嘗試對象。
2.4.6 who和w
都是查看誰登錄過,並干了什么事
w查看的信息比who多。
shell> who root tty1 2017-06-07 00:49 root pts/0 2017-06-07 02:06 (192.168.100.1) shell> w 08:26:38 up 18:48, 2 users, load average: 0.00, 0.01, 0.05 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root tty1 00:49 7:36m 0.24s 0.24s -bash root pts/0 192.168.100.1 02:06 6.00s 0.97s 0.02s w
其中w的第一行,分別表示當前時間,已開機時長,當前在線用戶,過去1、5、15分鍾的平均負載率。這一行和uptime命令獲取的信息是完全一致的。
2.4.7 lastlog
可以查看登錄的來源IP
-u 指定查看用戶
shell> lastlog|head -n 10 Username Port From Latest root pts/0 192.168.100.1 Wed Mar 30 15:16:25 +0800 2016 bin **Never logged in** daemon **Never logged in** adm **Never logged in** lp **Never logged in** sync **Never logged in** shutdown **Never logged in** halt **Never logged in** mail **Never logged in**