UID 和 GID
雖然我們登陸 Linux 系統(tǒng)時(shí),輸入的是帳號(hào),但是其實(shí)電腦并不會(huì)直接識(shí)別帳號(hào)名稱,它僅認(rèn)識(shí) ID 而已。
每個(gè)登陸用戶至少都會(huì)取得兩個(gè) ID,一個(gè)是用戶ID(User ID ),一個(gè)是群組ID(Group ID)。文件是如何知道它是屬于哪個(gè)用戶和群組呢?其實(shí)就是通過(guò) UID 和 GID。
用戶
/etc/passwd
這個(gè)文件的結(jié)構(gòu):每一行代表一個(gè)用戶帳號(hào),每一行的內(nèi)容使用冒號(hào) : 隔開(kāi),總共有 7 項(xiàng)內(nèi)容:
1.用戶名稱
2.密碼,由于歷史原因,密碼欄都是 x,真正的密碼在 /etc/shadow 中;
3.UID,特別的,root 用戶的 UID 是 0,1-999 是系統(tǒng)帳號(hào);
4.GID,對(duì)應(yīng) /etc/group 中的 GID;
5.備注
6.家目錄
7.Shell
/etc/shadow
這個(gè)文件主要與用戶密碼相關(guān),結(jié)構(gòu)和 /etc/passwd 類似,每一行代表一個(gè)用戶密碼和限制條件:
1.用戶名稱;
2.密碼,注意是經(jīng)過(guò)加密的密碼;
3.最近更換密碼的日期;
4.密碼不可更換的天數(shù);
5.密碼需要更換的天數(shù);
6.密碼需要更換期限前的警告天數(shù);
7.密碼過(guò)期后的帳號(hào)寬限時(shí)間;
8.帳號(hào)失效日期;
9.保留;
群組
/etc/group
這個(gè)文件記錄 GID 與群組名稱的對(duì)應(yīng)關(guān)系。
vi /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
每一行代表一個(gè)群組,以冒號(hào) : 作為分隔符,總共有 4 欄,每個(gè)欄位的意義是:
- 群組名稱
- 群組密碼
- GID
- 該群組所包含的用戶名稱,如果有多個(gè)用戶,用逗號(hào)
,隔開(kāi),不要有空格
有效群組和初始群組
初始群組(Initial group)
當(dāng)用戶一登陸系統(tǒng),立刻就擁有這個(gè)群組的相關(guān)權(quán)限。
可以通過(guò)查看 /etc/passwd 文件里面用戶的 GID 確定初始群組。使用者一登陸就會(huì)主動(dòng)取得,不需要在 /etc/group 文件的第 4 個(gè)欄位中寫(xiě)入該群組。
CentOS 用
useradd <username>命令創(chuàng)建用戶時(shí)默認(rèn)會(huì)創(chuàng)建一個(gè)和username同名的用戶組,所以一般用戶的初始群組就是和用戶名同名的群組。
有效群組(Effective group)
假如有一個(gè)用戶 lc,由于是使用 useradd <username> 命令創(chuàng)建的,現(xiàn)在 lc 這個(gè)用戶的初始群組是 lc。如果它要加入到 users 組中,那么必須要在 /etc/group 文件中找到 users 那一行,將 lc 這個(gè)用戶加到第 4 欄當(dāng)中,這樣 lc 就加入了 users 群組中。如果一個(gè)用戶不止加入一個(gè)群組,用逗號(hào) , 隔開(kāi)即可。
切換有效群組
groups
如何知道一個(gè)用戶屬于哪些群組呢?可以使用命令 groups ,結(jié)果如下:
[lc@localhost~]$ groups
lc users
上面輸出的信息顯示用戶 lc 同時(shí)屬于 lc 和 users 兩個(gè)群組。同時(shí),還有一個(gè)隱含的信息:第一個(gè)輸出的群組為有效群組。也就是說(shuō), 目前用戶 lc 的有效群組是 lc。此時(shí),如果我以 touch <filename> 新建一個(gè)文件,這個(gè)文件的擁有者是 lc,群組也是 lc。
[lc@localhost~]$ touch test
[lc@localhost~]$ ll test
-rw-rw-r-- lc lc test
通常有效群組的作用就是新建文件時(shí)。
newgrp
那么有效群組是否可以切換呢?
我想把有效群組切換到 users,此時(shí)可以使用 newgrp 命令,這個(gè)命令可以變更目前用戶的有效群組。
[lc@localhost~]$ newgrp users
[lc@localhost~]$ groups
users lc
[lc@localhost~]$ touch test2
[lc@localhost~]$ ll
-rw-rw-r-- lc lc test
-rw-r--r-- lc users test2
[lc@localhost~]$ exit # !!!注意,要離開(kāi) newgrp 的環(huán)境!
上面輸出的信息顯示有效群組已經(jīng)變更為 users 了
newgrp命令也是有限制的,切換的群組必須是該用戶所屬的群組。如果想切換的sshd群組,但是因?yàn)?lc并不屬于sshd群組,此時(shí)是無(wú)法完成切換的。
另外,newgrp命令是以另外一個(gè)shell來(lái)提供功能的,這個(gè)新的shell中用戶lc的有效GID為users。所以想要回到原來(lái)的環(huán)境中,輸入exit即可回到原來(lái)的shell。
/etc/gshadow
這個(gè)文件的作用是建立群組管理員,和 /etc/group 一樣也是使用冒號(hào) : 作為分隔符,每一欄的含義如下:
1.群組名稱
2.密碼欄。密碼欄為嘆號(hào) ! 或者為空表示該群組沒(méi)有群組管理員
3.群組管理員的帳號(hào)
4.該群組所屬的用戶
由于目前有類似
sudo這樣的工具,所以群組管理員的功能已經(jīng)很少使用了。
帳號(hào)管理
新增和刪除用戶
新增用戶
使用系統(tǒng)默認(rèn)值新增用戶,操作如下:
useradd <username>
默認(rèn)值內(nèi)容包括:
- 在
/etc/passwd裡面建立一行與帳號(hào)相關(guān)的資料,包括建立 UID/GID/家目錄等; - 在
/etc/shadow裡面將此帳號(hào)的密碼相關(guān)參數(shù)填入,但是尚未有密碼; - 在
/etc/group裡面加入一個(gè)與帳號(hào)名稱一模一樣的群組名稱; - 在
/home底下建立一個(gè)與帳號(hào)同名的目錄作為使用者家目錄,且權(quán)限為 700
useradd -D命令可以查看默認(rèn)值
有特殊需求的新增用戶操作如下:
useradd -u <uid> -g <groupname> <username>
這里我們指定了新增用戶的 uid,指定了一個(gè)已經(jīng)存在的群組作為使用者的初始群組。
密碼設(shè)定
以上新增了用戶之后,在默認(rèn)情況下,該用戶是鎖定無(wú)法登陸的,需要使用 passwd 命令設(shè)定密碼才可以使用
passwd <username>
特別的,如果
passwd不加參數(shù),意思是修改root用戶的密碼。
設(shè)置密碼校驗(yàn):PAM模塊
Pluggable Authentication Modules
PAM 是獨(dú)立的 API,任何程序有驗(yàn)證需求時(shí),都可以向 PAM 發(fā)出驗(yàn)證請(qǐng)求,PAM 經(jīng)過(guò)一系列的驗(yàn)證之后,將驗(yàn)證結(jié)果返回給程序。
passwd 使用的就是 pam_cracklib.so 模塊,如果我們輸入字典中可以找到的字符串, passwd 就會(huì)有報(bào)錯(cuò)提示。
passwd 驗(yàn)證執(zhí)行流程:
1.執(zhí)行 /usr/bin/passwd 命令;
2.passwd 調(diào)用 PAM 模塊進(jìn)行驗(yàn)證;
3.PAM 模塊會(huì)到 /etc/pam.d/ 尋找與 passwd 同名的配置文件;
4.根據(jù) /etc/pam.d/passwd 內(nèi)的配置,引用相關(guān)的 PAM 模塊逐步進(jìn)行驗(yàn)證;
5.將驗(yàn)證結(jié)果會(huì)傳給 passwd;
6.passwd 程序會(huì)根據(jù) PAM 會(huì)傳的結(jié)果決定下一步動(dòng)作(重新設(shè)置密碼或者通過(guò)驗(yàn)證)。
pam.pwquality.so已經(jīng)取代pam_cracklib.so,完全兼容,并且提供/etc/security/pwquality.conf配置文件額外提供默認(rèn)值。
設(shè)置密碼復(fù)雜度
pam_cracklib.so 支持的部分選項(xiàng):
retry=N:定義登錄/修改密碼失敗時(shí),可以重試的次數(shù)
minlen=N:新密碼的最小長(zhǎng)度
dcredit=N:當(dāng) N>0 時(shí)表示新密碼中數(shù)字出現(xiàn)的最多次數(shù);當(dāng)N<0時(shí)表示新密碼中數(shù)字出現(xiàn)最少次數(shù);
ucredit=N: 當(dāng) N>0 時(shí)表示新密碼中大寫(xiě)字母出現(xiàn)的最多次數(shù);當(dāng)N<0時(shí)表示新密碼中大寫(xiě)字母出現(xiàn)最少次數(shù);
lcredit=N: 當(dāng)N>0 時(shí)表示新密碼中小寫(xiě)字母出現(xiàn)的最多次數(shù);當(dāng)N<0時(shí)表示新密碼中小寫(xiě)字母出現(xiàn)最少次數(shù);
ocredit=N:當(dāng)N>0 時(shí)表示新密碼中特殊字符出現(xiàn)的最多次數(shù);當(dāng)N<0時(shí)表示新密碼中特殊字符出現(xiàn)最少次數(shù);
maxrepeat=N:拒絕包含多于N個(gè)相同連續(xù)字符的密碼。 默認(rèn)值為0表示禁用此檢查
maxsequence=N:拒絕包含長(zhǎng)于N的單調(diào)字符序列的密碼。默認(rèn)值為0表示禁用此檢查。實(shí)例是 '12345' 或 'fedcb'。除非序列只是密碼的一小部分,否則大多數(shù)此類密碼都不會(huì)通過(guò)簡(jiǎn)單檢查。
enforce_for_root: 如果用戶更改密碼是root,則模塊將在失敗檢查時(shí)返回錯(cuò)誤。默認(rèn)情況下,此選項(xiàng)處于關(guān)閉狀態(tài),只打印有關(guān)失敗檢查的消息,但 root 仍可以更改密碼。不要求root用戶輸入舊密碼,因此不會(huì)執(zhí)行比較舊密碼和新密碼的檢查
修改 /etc/pam.d/system-auth 文件:
[root@localhost~]$ vi /etc/pam.d/system-auth
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth required pam_env.so
auth required pam_faildelay.so delay=2000000
auth sufficient pam_unix.so nullok try_first_pass
auth requisite pam_succeed_if.so uid >= 1000 quiet_success
auth required pam_deny.so
account required pam_unix.so
account sufficient pam_localuser.so
account sufficient pam_succeed_if.so uid < 1000 quiet
account required pam_permit.so
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= minlen=8 ucredit=-1 lcredit=-1 ocredit=-1 dcredit=-1 enforce_for_root
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password required pam_deny.so
session optional pam_keyinit.so revoke
session required pam_limits.so
-session optional pam_systemd.so
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session required pam_unix.so
找到 pam_pwquality.so 后面加上需要驗(yàn)證的參數(shù):
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= minlen=8 ucredit=-1 lcredit=-1 ocredit=-1 dcredit=-1 enforce_for_root
設(shè)置密碼到期時(shí)間
修改 /etc/login.defs 文件:
PASS_MAX_DAYS 180 #密碼最長(zhǎng)過(guò)期天數(shù)
PASS_MIN_DAYS 0 #密碼最小過(guò)期天數(shù)
PASS_MIN_LEN 8 #密碼最小長(zhǎng)度
PASS_WARN_AGE 7 #密碼過(guò)期警告天數(shù)
以上是針對(duì)新增用戶的設(shè)置,如果是已有用戶不受影響,需要使用以下命令修改已有用戶的密碼到期時(shí)間:
# 先查看密碼過(guò)期和失效策略
passwd -S lc
# 也可以使用 chage 命令查看
chage -l lc
# 修改密碼過(guò)期時(shí)間,設(shè)置180天過(guò)期
passwd -x 180 lc
設(shè)置多次輸入密碼錯(cuò)誤鎖定用戶
編輯 /etc/pam.d/sshd 文件:
[root@localhost~]$ vi /etc/pam.d/sshd
#%PAM-1.0
auth required pam_tally2.so deny=5 unlock_time=1200 even_deny_root root_unlock_time=1200
...
參數(shù)說(shuō)明:
even_deny_root:也限制 root 用戶;
deny:設(shè)置普通用戶和root用戶連續(xù)錯(cuò)誤登陸的最大次數(shù),超過(guò)最大次數(shù),則鎖定該用戶
unlock_time:設(shè)定普通用戶鎖定后,多少時(shí)間后解鎖,單位是秒;
root_unlock_time:設(shè)定root用戶鎖定后,多少時(shí)間后解鎖,單位是秒;
注意,配置需要寫(xiě)在第一行
$ ssh root@120.25.226.1
# 錯(cuò)誤密碼
root@120.25.226.1's password:
Permission denied, please try again.
root@120.25.226.1's password:
Permission denied, please try again.
root@120.25.226.1's password:
Permission denied, please try again.
root@120.25.226.1's password:
Permission denied, please try again.
root@120.25.226.1's password:
Permission denied, please try again.
# 正確密碼
root@120.25.226.1's password:
Permission denied, please try again.
從上面的輸出信息可以看到 ,在嘗試 5 次錯(cuò)誤密碼登錄之后,幾十使用正確密碼也無(wú)法登錄了,需要的等待 20 分鐘解鎖。
設(shè)置終端連接超時(shí)時(shí)間
設(shè)置 TMOUT 環(huán)境變量,30 分鐘超時(shí):
[root@localhost~]$ echo $TMOUT # 先確定是否有該環(huán)境變量
[root@localhost~]$ vi /etc/profile
export TMOUT=1800 # 30分鐘超時(shí)
[root@localhost~]$ source /etc/profile
鎖定和解鎖用戶
# 使某個(gè)用戶失效,無(wú)法登陸
passwd -l lc
# 恢復(fù)
passwd -u lc
修改用戶資料
usermod [-cdegGlsuLU] <username>
參數(shù):
-c :後面接帳號(hào)的說(shuō)明,即 /etc/passwd 第五欄的說(shuō)明欄,可以加入一些帳號(hào)的說(shuō)明。
-d :後面接帳號(hào)的家目錄,即修改 /etc/passwd 的第六欄;
-e :後面接日期,格式是 YYYY-MM-DD 也就是在 /etc/shadow 內(nèi)的第八個(gè)欄位資料啦!
-f :後面接天數(shù),為 shadow 的第七欄位。
-g :後面接初始群組,修改 /etc/passwd 的第四個(gè)欄位,亦即是 GID 的欄位!
-G :後面接次要群組,修改這個(gè)使用者能夠支援的群組,修改的是 /etc/group 囉~
-a :與 -G 合用,可『增加次要群組的支援』而非『設(shè)定』喔!
-l :後面接帳號(hào)名稱。亦即是修改帳號(hào)名稱, /etc/passwd 的第一欄!
-s :後面接 Shell 的實(shí)際檔案,例如 /bin/bash 或 /bin/csh 等等。
-u :後面接 UID 數(shù)字啦!即 /etc/passwd 第三欄的資料;
-L :暫時(shí)將使用者的密碼凍結(jié),讓他無(wú)法登入。其實(shí)僅改 /etc/shadow 的密碼欄。
-U :將 /etc/shadow 密碼欄的 ! 拿掉,解凍啦!
刪除用戶
userdel [-r] <username>
參數(shù):
-r :同時(shí)刪除用戶的家目錄
# 刪除用戶 `lc`,同時(shí)刪除家目錄
[root@localhost~]$ userdel -r lc
想要徹底清除某個(gè)用戶留下的痕跡,可以在刪除之前通過(guò)
find / -user <username>命令查找整個(gè)系統(tǒng)中數(shù)據(jù)該用戶的文件,然后再刪除,這樣可以比較徹底地刪除用戶文件。
新增和刪除群組
新增群組
groupadd [-g] [-r] <groupname>
參數(shù):
-g : 指定特定的 GID
-r : 新增系統(tǒng)群組
groupadd lcgroup
刪除群組
groupdel <groupname>