描述用戶和組的概念
目標(biāo)
完成本節(jié)內(nèi)容后,你能夠描述Linux系統(tǒng)中用戶和組的作用。
什么是用戶?
用戶賬戶是用來在不同的人和可以運(yùn)行命令的程序之間提供安全邊界。
用戶有了用戶名,可以將不同的用戶區(qū)分開來,使其更容易工作。在系統(tǒng)內(nèi)部,系統(tǒng)通過分配給用戶賬戶的唯一識(shí)別號(hào),即用戶ID或UID來區(qū)分用戶賬戶。如果一個(gè)用戶賬戶被一個(gè)人使用,一般會(huì)被分配一個(gè)秘密密碼,用戶在登錄時(shí)用這個(gè)密碼來證明自己是真正的授權(quán)用戶。
用戶賬戶是系統(tǒng)安全的基礎(chǔ)。系統(tǒng)中的每個(gè)進(jìn)程(運(yùn)行的程序)都是以特定的用戶身份運(yùn)行。每個(gè)文件都有一個(gè)特定的用戶作為其所有者。文件的所有權(quán)幫助系統(tǒng)對(duì)文件的用戶實(shí)施訪問控制。與運(yùn)行中的進(jìn)程關(guān)聯(lián)的用戶決定了該進(jìn)程可以訪問的文件和目錄。
用戶賬戶主要有三種類型:超級(jí)用戶、系統(tǒng)用戶和普通用戶。
- 超級(jí)用戶賬戶是用來管理系統(tǒng)的超級(jí)用戶。超級(jí)用戶的名稱是root,賬戶的UID為0。超級(jí)用戶擁有對(duì)系統(tǒng)的完全訪問權(quán)限。
- 系統(tǒng)有系統(tǒng)用戶賬戶,這些賬戶被提供支持服務(wù)的進(jìn)程所使用。這些進(jìn)程或守護(hù)進(jìn)程,通常不需要作為超級(jí)用戶運(yùn)行。它們是被指定的非特權(quán)賬戶,允許它們保護(hù)自己的文件和其他資源不受系統(tǒng)上的普通用戶的影響。用戶不使用系統(tǒng)用戶賬戶交互式登錄。
- 大多數(shù)用戶都有固定的用戶賬戶,他們?nèi)粘9ぷ鲿r(shí)都會(huì)使用這些賬戶。與系統(tǒng)用戶一樣,普通用戶對(duì)系統(tǒng)的訪問權(quán)限也是有限的。
您可以使用id命令來顯示當(dāng)前登錄用戶的信息。
[user01@host ~]$ id
uid=1000(user01) gid=1000(user01) groups=1000(user01) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
要查看其他用戶的基本信息,可以將用戶名作為參數(shù)傳遞給id命令。
[user01@host]$ id user02
uid=1002(user02) gid=1001(user02) groups=1001(user02) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
要查看一個(gè)文件的所有者,請(qǐng)使用 ls -l 命令。要查看一個(gè)目錄的所有者,請(qǐng)使用 ls ld 命令。在下面的輸出中,第三列顯示的是用戶名。
[user01@host ~]$ ls -l file1
-rw-rw-r--. 1 user01 user01 0 Feb 5 11:10 file1
[user01@host]$ ls -ld dir1
drwxrwxr-x. 2 user01 user01 6 Feb 5 11:10 dir1
要查看進(jìn)程信息,請(qǐng)使用ps命令。默認(rèn)情況下,只顯示當(dāng)前shell中的進(jìn)程。添加 a 選項(xiàng)來查看所有進(jìn)程的終端信息。要查看與進(jìn)程相關(guān)聯(lián)的用戶,請(qǐng)加入u選項(xiàng)。在下面的輸出中,第一列顯示的是用戶名。
[user01@host]$ ps -au
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 777 0.0 0.0 225752 1496 tty1 Ss+ 11:03 0:00 /sbin/agetty -o p -- \u --noclear tty1 linux
root 780 0.0 0.1 225392 2064 ttyS0 Ss+ 11:03 0:00 /sbin/agetty -o p -- \u --keep-baud 115200,38400,9600
user01 1207 0.0 0.2 234044 5104 pts/0 Ss 11:09 0:00 -bash
user01 1319 0.0 0.2 266904 3876 pts/0 R+ 11:33 0:00 ps au
前面命令的輸出是按名字顯示用戶,但在內(nèi)部,操作系統(tǒng)使用UID來跟蹤用戶。用戶名與UID的映射是在賬戶信息數(shù)據(jù)庫中定義的。默認(rèn)情況下,系統(tǒng)使用/etc/passwd文件來存儲(chǔ)本地用戶的信息。
/etc/passwd文件中的每一行都包含一個(gè)用戶的信息。它被分為七個(gè)冒號(hào)分隔的字段。下面是/etc/passwd文件中的一個(gè)例子。
user01: x: 1000: 1000: User One: /home/user01: /bin/bash
- 該用戶的用戶名(user01)。
- 用戶的密碼過去是以加密格式存儲(chǔ)在這里。這已經(jīng)被移到了/etc/shadow文件中,后面會(huì)講到。這個(gè)字段應(yīng)該永遠(yuǎn)是x。
- 該用戶賬戶的UID號(hào)(1000)
- 該用戶賬戶的用戶組組的GID號(hào)(1000)。用戶組將在本節(jié)后面討論
- 該用戶的真實(shí)姓名(User One)。
- 該用戶的主目錄(/home/user01)。這是shell啟動(dòng)時(shí)的初始工作目錄,包含用戶的數(shù)據(jù)和配置設(shè)置。
- 這個(gè)用戶的默認(rèn)shell程序,在登錄時(shí)運(yùn)行(/bin/bash)。對(duì)于普通用戶,通常是提供用戶的命令行提示符的程序。如果系統(tǒng)用戶不允許交互式登錄,那么系統(tǒng)用戶可以使用/sbin/nologin。
什么是用戶組?
用戶組是一個(gè)需要共享文件和其他系統(tǒng)資源的用戶集合。組可以用來授予一組用戶對(duì)文件的訪問權(quán)限,而不是只授予單個(gè)用戶。
和用戶一樣,組也有組名,以便于工作時(shí)使用。在內(nèi)部,系統(tǒng)通過分配給組的唯一識(shí)別號(hào),即組ID或GID來區(qū)分組。
組名與GID的映射是在組賬戶信息數(shù)據(jù)庫中定義的。默認(rèn)情況下,系統(tǒng)使用/etc/group文件來存儲(chǔ)關(guān)于本地組的信息。
在/etc/group文件中的每一行都包含一個(gè)組的信息。每個(gè)組條目被分為四個(gè)冒號(hào)分隔的字段。下面是/etc/group文件中的一個(gè)例子。
group01: x: 10000: user01,user02,user03
- 該組的組名(group01)。
- 過時(shí)的組密碼字段。該字段應(yīng)始終為x。
- 本組的GID號(hào)(10000)。
- 作為補(bǔ)充組(user01、user02、user03)的用戶列表。主組(或默認(rèn)組)和補(bǔ)充組將在本節(jié)后面討論。
主要組和補(bǔ)充組
每個(gè)用戶都有一個(gè)主組。對(duì)于本地用戶,這是在/etc/passwd文件中按GID號(hào)列出的組。默認(rèn)情況下,這個(gè)組將擁有該用戶創(chuàng)建的新文件。
通常,當(dāng)你創(chuàng)建一個(gè)新的普通用戶時(shí),會(huì)創(chuàng)建一個(gè)與該用戶相同名稱的新組。該組被用作新用戶的主組,該用戶是這個(gè)用戶私有組的唯一成員。事實(shí)證明,這有助于簡(jiǎn)化文件權(quán)限的管理,這將在后面的課程中討論。
用戶也可以有補(bǔ)充組。補(bǔ)充組的成員資格由 /etc/group 文件決定。用戶被授予對(duì)文件的訪問權(quán)限是基于他們的任何組是否有訪問權(quán)限。對(duì)于用戶來說,擁有訪問權(quán)限的組是主組還是補(bǔ)充組并不重要。
例如,如果用戶user01有一個(gè)主群組用戶01和補(bǔ)充群組 wheel和webadmin,那么該用戶可以讀取這三個(gè)群組中的任何一個(gè)群組可讀的文件。
id命令也可以用來查找用戶的組成員信息。
[user03@host ~]$ id
uid=1003(user03) gid=1003(user03) groups=1003(user03),10(wheel),10000(group01) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
在前面的例子中,用戶03的主群組user03是主群組(gid)。組項(xiàng)列出了該用戶的所有組,除了主組user03之外,該用戶還有組wheel和group01作為補(bǔ)充組。
獲得超級(jí)用戶權(quán)限
目標(biāo)
完成本節(jié)內(nèi)容后,可以切換到超級(jí)用戶賬戶來管理Linux系統(tǒng),并通過sudo命令授予其他用戶超級(jí)用戶權(quán)限。
超級(jí)用戶
大多數(shù)操作系統(tǒng)都有某種超級(jí)用戶,即擁有系統(tǒng)所有權(quán)力的用戶。在 Red Hat Enterprise Linux 中,這就是root用戶。這個(gè)用戶有權(quán)力修改文件系統(tǒng)上的權(quán)限,來管理系統(tǒng)。要執(zhí)行諸如安裝或刪除軟件和管理系統(tǒng)文件和目錄等任務(wù),用戶必須將其權(quán)限升級(jí)到root用戶。
只有普通用戶中的root用戶才能控制大部分設(shè)備,但也有少數(shù)例外。例如,正常用戶可以控制USB設(shè)備等可移動(dòng)設(shè)備。因此,正常用戶可以添加和刪除文件以及以其他方式管理可移動(dòng)設(shè)備,但默認(rèn)只有root用戶才能管理 "固定 "的硬盤。
然而,權(quán)力越大責(zé)任越大。root用戶擁有破壞系統(tǒng)的無限權(quán)力:刪除文件和目錄、刪除用戶賬戶、添加后門等等。如果root用戶的賬戶被破壞,那么系統(tǒng)的管理控制權(quán)就會(huì)被其他人掌握。在整個(gè)課程中,鼓勵(lì)管理員以普通用戶的身份登錄,在需要的時(shí)候才將權(quán)限升級(jí)為根用戶。
Linux中的root賬戶大致相當(dāng)于微軟Windows中的本地管理員賬戶。在Linux中,大多數(shù)系統(tǒng)管理員都是以非權(quán)限用戶的身份登錄系統(tǒng),并使用各種工具暫時(shí)獲得root權(quán)限。
切換用戶
su命令允許用戶切換到不同的用戶賬戶。如果你從一個(gè)普通用戶賬戶運(yùn)行su,你會(huì)被提示你要切換到的賬戶的密碼。
[user01@host ~]$ su - user02
Password:
[user02@host ~]$
如果你省略了用戶名,su 或 su - 命令將嘗試在默認(rèn)情況下切換到 root。
[user01@host ~]$ su
Password:
[root@host ~]#
命令su啟動(dòng)一個(gè)非登錄的shell,而命令su - (帶破折號(hào)選項(xiàng))啟動(dòng)一個(gè)登錄的shell。這兩個(gè)命令的主要區(qū)別在于,su -設(shè)置了shell環(huán)境,就像以該用戶的身份新登錄一樣,而su只是以該用戶的身份啟動(dòng)一個(gè)shell,但使用的是原始用戶的環(huán)境設(shè)置。
在大多數(shù)情況下,管理員應(yīng)該運(yùn)行 su - 來獲取一個(gè)帶有目標(biāo)用戶的正常環(huán)境設(shè)置的 shell。更多信息,請(qǐng)參閱 bash(1) man page。
用sudo運(yùn)行命令
在某些情況下,出于安全考慮,root用戶的賬戶可能根本沒有有效的密碼。在這種情況下,用戶不能用密碼直接以root身份登錄系統(tǒng),也不能用su來獲取交互式shell。在這種情況下,有一個(gè)工具可以用來獲取root權(quán)限,那就是sudo。
與su不同的是,sudo通常要求用戶輸入自己的密碼進(jìn)行身份驗(yàn)證,而不是他們要訪問的用戶賬戶的密碼。也就是說,使用sudo以root身份運(yùn)行命令的用戶不需要知道root密碼。相反,他們使用自己的密碼來驗(yàn)證訪問。
此外,sudo可以被配置成允許特定用戶以其他用戶的身份運(yùn)行任何命令,或者只以該用戶的身份運(yùn)行某些命令。
例如,當(dāng)sudo被配置為允許user01用戶以root身份運(yùn)行usermod命令時(shí),user01可以運(yùn)行以下命令來鎖定或解鎖用戶賬戶:
[user01@host ~]$ sudo usermod -L user02
[sudo] password for user01:
[user01@host ~]$ su - user02
Password:
su: Authentication failure
[user01@host ~]$
如果用戶試圖以另一個(gè)用戶的身份運(yùn)行命令,而sudo配置不允許,則該命令將被阻止,該嘗試將被記錄下來,并且默認(rèn)情況下會(huì)向根用戶發(fā)送一封郵件。
[user02@host ~]$ sudo tail /var/log/secure
[sudo] password for user02:
user02 is not in the sudoers file. This incident will be reported.
[user02@host ~]$
使用sudo的另一個(gè)好處是,所有執(zhí)行的命令都會(huì)被記錄到/ var/log/secure。
[user01@host ~]$ sudo tail /var/log/secure
...output omitted...
Feb 6 20:45:46 host sudo[2577]: user01 : TTY=pts/0 ; PWD=/home/user01 ;
USER=root ; COMMAND=/sbin/usermod -L user02
...output omitted...
在Red Hat Enterprise Linux 7和Red Hat Enterprise Linux 8中,wheel組的所有成員都可以使用sudo以任何用戶的身份運(yùn)行命令,包括root用戶。用戶會(huì)被提示輸入自己的密碼。這是與 Red Hat Enterprise Linux 6 及更早的版本相比的一個(gè)變化,在 Red Hat Enterprise Linux 6 及更早的版本中, wheel 組成員的用戶在默認(rèn)情況下不能獲得這種管理權(quán)限。
使用Sudo獲取root shell
如果系統(tǒng)上有一個(gè)非管理員用戶賬戶可以使用sudo來運(yùn)行su命令,你可以從該賬戶中運(yùn)行sudo su - 來獲得一個(gè)交互式的root用戶shell。這樣做是因?yàn)?strong>sudo會(huì)以root的身份運(yùn)行su -,而root用戶不需要輸入密碼就可以使用su。
另一種使用 sudo 訪問 root 帳戶的方法是使用 sudo -i 命令。這將切換到根賬戶,并運(yùn)行該用戶的默認(rèn)shell(通常是bash)和相關(guān)的shell登錄腳本。如果你只是想運(yùn)行shell,你可以使用sudo -s命令。
例如,管理員可以通過使用 SSH 公鑰驗(yàn)證以普通用戶 ec2-user的身份登錄到 AWS EC2 實(shí)例上的交互式 shell,然后通過運(yùn)行 sudo -i 來獲取根用戶的 shell。
[ec2-user@host ~]$ sudo -i
[sudo] password for ec2-user:
[root@host ~]#
sudo su - 命令和 sudo -i 的行為并不完全相同。這將在本節(jié)末尾簡(jiǎn)要討論。
配置sudo
sudo的主要配置文件是/etc/sudoers。為了避免多個(gè)管理員同時(shí)嘗試編輯它,只能用特殊的visudo命令來編輯。
例如,在 /etc/sudoers 文件中的以下一行可以對(duì)wheel組成員進(jìn)行 sudo 訪問。
%wheel ALL=(ALL) ALL
在這一行中,%wheel是指該規(guī)則適用的用戶或組。%表示這是一個(gè)組,wheel組。ALL=(ALL)指定wheel組可以運(yùn)行任何命令。最后的ALL指定wheel可以作為系統(tǒng)上的任何用戶運(yùn)行這些命令。
默認(rèn)情況下,/etc/sudoers 也會(huì)將 /etc/sudoers.d 目錄中的任何文件的內(nèi)容作為配置文件的一部分。這允許管理員只需在該目錄中放置一個(gè)適當(dāng)?shù)奈募涂梢詾橛脩籼砑?sudo 訪問權(quán)限。
要啟用user01用戶的完全sudo訪問權(quán)限,可以創(chuàng)建/etc/sudoers.d/user01,內(nèi)容如下:
user01 ALL=(ALL) ALL
要啟用 group01 組的完全 sudo 訪問,可以創(chuàng)建 /etc/sudoers.d/group01,內(nèi)容如下:
%group01 ALL=(ALL) ALL
也可以設(shè)置sudo,允許用戶以另一個(gè)用戶的身份運(yùn)行命令而不輸入密碼。
ansible ALL=(ALL) NOPASSWD:ALL
雖然向用戶或組授予這種級(jí)別的訪問權(quán)限存在明顯的安全風(fēng)險(xiǎn),但它經(jīng)常被用于云實(shí)例、虛擬機(jī)和配置系統(tǒng)以幫助配置服務(wù)器。擁有這種訪問權(quán)限的賬戶必須受到謹(jǐn)慎的保護(hù),可能需要SSH publickey驗(yàn)證才能讓遠(yuǎn)程系統(tǒng)上的用戶訪問它。
例如,Amazon Web Services Marketplace 中的 Red Hat Enterprise Linux 的官方 AMI 在出廠時(shí)就鎖定了根用戶和 ec2-user用戶的密碼。ec2-user用戶賬戶被設(shè)置為允許通過SSH公鑰驗(yàn)證進(jìn)行遠(yuǎn)程交互式訪問。ec2-user 用戶也可以在沒有密碼的情況下以 root 用戶的身份運(yùn)行任何命令,因?yàn)?AMI 的 / etc/sudoers 文件的最后一行設(shè)置如下:
ec2-user ALL=(ALL) NOPASSWD: ALL
在配置系統(tǒng)的過程中,可以重新啟用sudo輸入密碼的要求,或者在配置系統(tǒng)的過程中,可以進(jìn)行其他的修改來加強(qiáng)安全性。
在本課程中,你會(huì)經(jīng)??吹?strong>sudo su -代替sudo -i的使用。這兩個(gè)命令都可以使用,但它們之間有一些微妙的區(qū)別。
sudo su - 命令設(shè)置的根環(huán)境和普通登錄一樣,因?yàn)?su - 命令會(huì)忽略 sudo 所做的設(shè)置,而是從頭開始設(shè)置環(huán)境。
sudo -i命令的默認(rèn)配置實(shí)際上是對(duì)root用戶環(huán)境的一些細(xì)節(jié)設(shè)置與普通登錄不同。例如,它設(shè)置的PATH環(huán)境變量的方式略有不同。這影響了shell在查找命令的路徑。
你可以用visudo編輯/etc/sudoers,讓sudo -i表現(xiàn)得更像su -通過編輯/etc/sudoers。找到這一行
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
以下兩行:
Defaults secure_path = /usr/local/bin:/usr/bin
Defaults>root secure_path = /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
對(duì)于大多數(shù)目的來說,這并不是一個(gè)很大的區(qū)別。但是,為了使系統(tǒng)上的PATH設(shè)置與默認(rèn)的/etc/sudoers文件保持一致,本課程的作者在實(shí)例中大多使用sudo su -。
管理本地用戶賬戶
目標(biāo)
完成本節(jié)內(nèi)容后,你應(yīng)該能夠創(chuàng)建、修改和刪除本地用戶賬戶。
管理本地用戶
使用命令行工具來管理本地用戶賬戶。
從命令行創(chuàng)建用戶
- useradd username命令會(huì)創(chuàng)建一個(gè)名為username的新用戶。它設(shè)置了用戶的主目錄和賬戶信息,并為這個(gè)名為username的用戶創(chuàng)建了一個(gè)私有組。此時(shí),該賬戶沒有設(shè)置有效的密碼,在設(shè)置好密碼之前,用戶無法登錄。
- useradd --help命令顯示了可以用來覆蓋默認(rèn)值的基本選項(xiàng)。在大多數(shù)情況下,同樣的選項(xiàng)也可以用usermod命令來修改現(xiàn)有的用戶。
- 一些默認(rèn)值,如有效UID號(hào)碼的范圍和默認(rèn)的密碼過期規(guī)則,都是從/etc/login.defs文件中讀取的。這個(gè)文件中的值只在創(chuàng)建新用戶時(shí)使用。對(duì)這個(gè)文件的更改不會(huì)影響現(xiàn)有用戶。
從命令行修改現(xiàn)有用戶
usermod --help命令顯示可以用來修改賬戶的基本選項(xiàng)。一些常見的選項(xiàng)包括:
| usermod選項(xiàng) | 作用 |
|---|---|
| -c, --comment COMMENT | 在評(píng)論欄中添加用戶的真實(shí)姓名。 |
| -g, --gid GROUP | 指定用戶賬戶的主要組。 |
| -G, --groups GROUPS | 為用戶賬戶指定一個(gè)以逗號(hào)分隔的補(bǔ)充組列表。 |
| -a, --append | 與-G選項(xiàng)一起使用,可將補(bǔ)充組添加到用戶當(dāng)前的組成員集中,而不是用新的組替換補(bǔ)充組。 |
| -d, --home HOME_DIR | 為用戶賬戶指定一個(gè)特定的主目錄。 |
| -m, --move-home | 將用戶的主目錄移動(dòng)到一個(gè)新的位置。必須與-d選項(xiàng)一起使用。 |
| -s, --shell SHELL | 為用戶賬戶指定一個(gè)特定的登錄shell |
| -L, --lock | 鎖定用戶賬戶。 |
| -U, --unlock | 解鎖用戶賬戶。 |
從命令行中刪除用戶
- userdel username命令從/etc/passwd中刪除了用戶名的詳細(xì)信息,但保留了用戶的主目錄。
- userdel -r username命令從/etc/passwd中刪除了用戶名的詳細(xì)信息,同時(shí)也刪除了用戶的主目錄。
當(dāng)使用 userdel 移除用戶而不指定 -r 選項(xiàng)時(shí),用戶的文件得到保留。再創(chuàng)建新用戶十會(huì)指定未使用的uid,新用戶的UID和老用戶的UID相同,新用戶可以訪問老用戶保留的文件,這種情況可能會(huì)導(dǎo)致信息泄露和其他安全問題。
在 Red Hat Enterprise Linux 7 和 Red Hat Enterprise Linux 8 中,useradd 命令為新用戶分配了第一個(gè)大于或等于 1000 未使用的UID,或者使用 -u 選項(xiàng)明確指定一個(gè)UID。
這就是信息泄露的原因。如果第一個(gè)空閑的UID之前被分配給了一個(gè)用戶賬戶,而這個(gè)賬戶已經(jīng)從系統(tǒng)中刪除了,那么老用戶的UID就會(huì)被重新分配給新用戶,讓新用戶擁有老用戶剩余文件的所有權(quán)。
下面的情景說明了這種情況。
[root@host ~]# useradd user01
[root@host ~]# ls -l /home
drwx------. 3 user01 user01 74 Feb 4 15:22 user01
[root@host ~]# userdel user01
[root@host ~]# ls -l /home
drwx------. 3 1000 1000 74 Feb 4 15:22 user01
[root@host ~]# useradd user02
[root@host ~]# ls -l /home
drwx------. 3 user02 user02 74 Feb 4 15:23 user02
drwx------. 3 user02 user02 74 Feb 4 15:22 user01
注意,user02現(xiàn)在擁有user01之前擁有的所有文件。
根據(jù)不同的情況,解決這個(gè)問題的方法之一是當(dāng)創(chuàng)建文件的用戶被刪除時(shí),將所有未擁有的文件從系統(tǒng)中刪除。另一種解決方法是將未擁有的文件手動(dòng)分配給不同的用戶。根用戶可以使用 find / -nouser -o -nogroup 命令查找所有未擁有的文件和目錄。
從命令行設(shè)置密碼
passwd username命令設(shè)置初始密碼或更改用戶名的現(xiàn)有密碼。
root用戶可以將密碼設(shè)置為任意值。如果密碼不符合推薦的最低標(biāo)準(zhǔn),會(huì)顯示一條消息,但隨后會(huì)提示重新輸入新的密碼。
[root@host ~]# passwd user01
Changing password for user user01.
New password: redhat
BAD PASSWORD: The password fails the dictionary check - it is based on a dictionary word Retype new password: redhat
passwd: all authentication tokens updated successfully.
[root@host ~]#
普通用戶必須選擇一個(gè)至少8個(gè)字符以上的密碼,而且也不能為弱密碼。
UID范圍
特定的UID號(hào)和數(shù)字范圍被Red Hat Enterprise Linux用于特定目的。
- UID 0總是被分配給超級(jí)用戶賬戶,root。
- UID 1-200是紅帽公司靜態(tài)分配給系統(tǒng)進(jìn)程的 "system users"范圍。
- UID 201-999是系統(tǒng)進(jìn)程所使用的 "system users "范圍,這些用戶不擁有文件系統(tǒng)中的文件。它們通常是在安裝需要它們的軟件時(shí)從可用池中動(dòng)態(tài)分配的。程序以這些 "非特權(quán) "系統(tǒng)用戶的身份運(yùn)行,以限制他們只訪問他們所需要的資源來運(yùn)作。
- UID 1000+是可以分配給普通用戶的范圍。
管理本地用戶組
目標(biāo)
完成本節(jié)內(nèi)容后,學(xué)生能夠創(chuàng)建、修改和刪除本地用戶組。
管理本地用戶組
在用戶被添加到該組之前,必須有一個(gè)組存在。有幾個(gè)命令行工具可以用來管理本地組賬戶。
從命令行創(chuàng)建組
- groupadd命令可以創(chuàng)建組,在沒有選項(xiàng)的情況下,使用/etc/login.defs文件中指定的下一個(gè)可用的GID來創(chuàng)建組。
- 選項(xiàng) -g 指定了要使用的組的特定 GID。
[user01@host ~]$ sudo groupadd -g 10000 group01
[user01@host ~]$ tail /etc/group
...output omitted...
group01:x:10000:
選項(xiàng) -r從/etc/login.defs文件中列出的有效系統(tǒng)GID范圍內(nèi)的GID創(chuàng)建一個(gè)系統(tǒng)組。在 / etc/login.defs 中的 SYS_GID_MIN 和 SYS_GID_MAX 配置項(xiàng)定義了系統(tǒng) GID 的范圍。
[user01@host ~]$ sudo groupadd -r group02
[user01@host ~]$ tail /etc/group
...output omitted...
group01:x:10000:
group02:x:988:
從命令行修改現(xiàn)有的組
groupmod 命令可以改變現(xiàn)有組的屬性。選項(xiàng) -n 為組指定一個(gè)新的名稱。
[user01@host ~]$ sudo groupmod -n group0022 group02
[user01@host ~]$ tail /etc/group
...output omitted...
group0022:x:988:
注意,組名從group02更新為group0022。
選項(xiàng)-g指定了一個(gè)新的GID。
[user01@host ~]$ sudo groupmod -g 20000 group0022
[user01@host ~]$ tail /etc/group
...output omitted...
group0022:x:20000:
注意,GID由988更新為20000。
從命令行中刪除組
groupdel命令刪除組。
[user01@host ~]$ sudo groupdel group0022
從命令行更改組成員
通過用戶管理來控制組的成員資格。使用 usermod -g 命令來改變用戶的主組。
[user01@host ~]$ id user02
uid=1006(user02) gid=1008(user02) groups=1008(user02)
[user01@host ~]$ sudo usermod -g group01 user02
[user01@host ~]$ id user02
uid=1006(user02) gid=10000(group01) groups=10000(group01)
使用 usermod -aG 命令將用戶添加到補(bǔ)充組中。
[user01@host ~]$ id user03
uid=1007(user03) gid=1009(user03) groups=1009(user03)
[user01@host ~]$ sudo usermod -aG group01 user03
[user01@host ~]$ id user03
uid=1007(user03) gid=1009(user03) groups=1009(user03),10000(group01)
管理用戶密碼
目標(biāo)
完成本節(jié)內(nèi)容后,你能夠?yàn)橛脩粼O(shè)置密碼管理策略,并手動(dòng)鎖定和解鎖用戶賬戶。
影子密碼和密碼策略
曾幾何時(shí),加密的密碼被存儲(chǔ)在可讀的/etc/passwd文件中。這被認(rèn)為是相當(dāng)安全的,直到字典攻擊加密密碼變得普遍。那時(shí)候,加密密碼被轉(zhuǎn)移到一個(gè)單獨(dú)的/etc/shadow文件中,這個(gè)文件只有root才能讀取。這個(gè)新文件還允許密碼老化和過期功能的實(shí)現(xiàn)。
像/etc/passwd一樣,每個(gè)用戶在/etc/shadow文件中都有一行。下圖是/etc/shadow文件中的示例行,其中有九個(gè)冒號(hào)分隔的字段。
user03: $6$CSsX...output omitted...: 17933: 0: 99999: 7: 2: 18113:
- 該密碼所屬賬戶的用戶名。
- 用戶的加密密碼。加密密碼的格式將在本節(jié)后面討論。
- 上次修改密碼的日期。這是自1970-01-01-01起,以天數(shù)為單位,以UTC時(shí)區(qū)計(jì)算。
- 自上次修改密碼后,用戶再次修改密碼的最低天數(shù)。
- 在密碼過期前,不更改密碼的最大天數(shù)??盏淖侄伪硎咀陨洗涡薷暮蟮臅r(shí)間不會(huì)過期。
- 警告期。當(dāng)用戶在截止日期前的這個(gè)天數(shù)登錄時(shí),將被警告密碼過期。
- 閑置期。一旦密碼過期,在這多少天內(nèi)仍會(huì)接受登錄。過了這個(gè)期限后,賬號(hào)將被鎖定。
- 密碼過期的日期。這是以1970-01-01-01起的天數(shù)為單位,以UTC時(shí)區(qū)計(jì)算??兆侄我馕吨粫?huì)在某一特定日期過期。
- 最后一個(gè)字段通常是空的,留待以后使用。
加密密碼的格式
加密密碼字段存儲(chǔ)三個(gè)信息:使用的散列算法、鹽和加密的散列。每條信息都用$符號(hào)來分隔。
$ 6$ CSsXcYG1L/4ZfHr/$ 2W6evvJahUfzfHpc9X.45Jc6H30E...output omitted...
- 這個(gè)密碼使用的散列算法。數(shù)字6表示它是SHA-512散列算法,這在Red Hat Enterprise Linux 8中是默認(rèn)的。
- 用來加密密碼的鹽。這原本是隨機(jī)選擇的。
- 用戶密碼的加密哈希值。將鹽和未加密的密碼結(jié)合起來并加密,生成密碼的加密散列。
使用鹽可以防止兩個(gè)密碼相同的用戶在/etc/shadow文件中出現(xiàn)相同的條目。例如,即使user01和user02都使用redhat作為他們的密碼,如果他們?cè)?strong>/etc/shadow文件中的加密密碼的鹽值不同,那么他們?cè)?strong>/etc/shadow中的加密密碼也會(huì)不同。
密碼驗(yàn)證
當(dāng)用戶嘗試登錄時(shí),系統(tǒng)會(huì)在/etc/shadow中查找該用戶的條目,將該用戶的鹽和輸入的未加密密碼結(jié)合起來,并使用指定的散列算法進(jìn)行加密。如果結(jié)果與加密后的散列算法匹配,說明用戶輸入的密碼是正確的。如果結(jié)果與加密的散列算法不匹配,則說明用戶輸入了錯(cuò)誤的密碼,登錄嘗試失敗。這種方法允許系統(tǒng)判斷用戶是否輸入了正確的密碼,而不會(huì)將該密碼存儲(chǔ)在可用于登錄的形式中。
配置密碼過期
下圖是相關(guān)的密碼時(shí)效參數(shù),可以使用chage命令調(diào)整密碼時(shí)效策略的相關(guān)參數(shù)。

[user01@host ~]$ sudo chage -m 0 -M 90 -W 7 -I 14 user03
前面的chage命令分別使用-m、-M、-M、-W和-I選項(xiàng)來設(shè)置用戶密碼的最小年齡、最大年齡、警告期和不活躍期。
chage -d 0 user03命令強(qiáng)制user03用戶在下次登錄時(shí)更新密碼。
chage -l user03命令顯示user03的密碼老化信息。
chage -E 2019-08-05 user03 命令會(huì)導(dǎo)致 user03 用戶的賬戶在 2019-08-05 日過期(格式為 YYYY-MM-DD)。
日期命令可以用來計(jì)算未來的日期。-u選項(xiàng)報(bào)告的時(shí)間單位是UTC。
[user01@host ~]$ date -d "+45 days" -u
Thu May 23 17:01:20 UTC 2019
編輯/etc/login.defs文件中的密碼過期配置項(xiàng),設(shè)置默認(rèn)的密碼過期策略。PASS_MAX_DAYS 設(shè)置密碼的默認(rèn)最大年齡。PASS_MIN_DAYS 設(shè)置密碼的默認(rèn)最小年齡。PASS_WARN_AGE 設(shè)置密碼的默認(rèn)警告期。默認(rèn)密碼時(shí)效策略的任何更改都只對(duì)新用戶有效?,F(xiàn)有用戶將繼續(xù)使用舊的密碼時(shí)效設(shè)置,而不是新的密碼時(shí)效設(shè)置。
限制進(jìn)入
你可以使用chage命令來設(shè)置賬戶的到期日期。當(dāng)?shù)竭_(dá)該日期后,用戶不能交互式地登錄系統(tǒng)。usermod命令可以用-L選項(xiàng)鎖定賬戶。
user01@host ~]$ sudo usermod -L user03
[user01@host ~]$ su - user03
Password: redhat
su: Authentication failure
如果用戶離開公司,管理員可以通過一條usermod命令鎖定和過期。日期必須以1970-01-01-01-01以來的天數(shù),或以YYY-MM-DD格式給出。
[user01@host ~]$ sudo usermod -L -e 2019-10-05 user03
前面的 usermod 命令使用 -e 選項(xiàng)來設(shè)置用戶賬戶的到期日。而 -L 選項(xiàng)則鎖定了用戶的密碼。
鎖定賬戶可以防止用戶用密碼驗(yàn)證系統(tǒng)的身份驗(yàn)證。這是推薦的防止已經(jīng)離開公司的員工訪問賬戶的方法。如果該員工回來了,以后可以用usermod -U來解鎖該賬戶。如果賬戶也是過期的,一定要同時(shí)更改過期日期。
nologin Shell
nologin shell作為非交互式登錄系統(tǒng)的用戶賬號(hào)的替代shell。從安全的角度來看,當(dāng)用戶帳號(hào)所服務(wù)的職責(zé)不需要用戶登錄系統(tǒng)時(shí),禁止用戶帳號(hào)登錄系統(tǒng)是明智的做法。例如,一個(gè)郵件服務(wù)器可能需要一個(gè)賬戶來存儲(chǔ)郵件,并需要一個(gè)密碼,讓用戶通過郵件客戶端進(jìn)行身份驗(yàn)證,以獲取郵件。該用戶不需要直接登錄系統(tǒng)。
針對(duì)這種情況,常見的解決辦法是將用戶的登錄 shell設(shè)置為/sbin/nologin。如果用戶試圖直接登錄系統(tǒng),nologin shell會(huì)關(guān)閉連接。
[user01@host ~]$ usermod -s /sbin/nologin user03
[user01@host ~]$ su - user03
Last login: Wed Feb 6 17:03:06 IST 2019 on pts/0 This account is currently not available.
總結(jié)
- 用戶賬戶主要有三種類型:超級(jí)用戶、系統(tǒng)用戶和普通用戶。
- 一個(gè)用戶必須有一個(gè)主組,可以是一個(gè)或多個(gè)補(bǔ)充組的成員。
- 包含用戶和組信息的三個(gè)關(guān)鍵文件是/etc/passwd、/etc/group和/etc/shadow。
- su和sudo命令可以作為超級(jí)用戶來運(yùn)行命令。
- useradd、usermod和userdel命令可以用來管理用戶。
- groupadd、groupmod和groupdel命令可以用來管理組。
- chage 命令可用于配置和查看用戶的密碼過期設(shè)置。