1. 程式人生 > >第十四章、Linux 賬號管理與 ACL 許可權配置

第十四章、Linux 賬號管理與 ACL 許可權配置

要如何在 Linux 的系統新增一個使用者啊?呵呵~真是太簡單了~我們登陸系統時會輸入 (1)賬號與 (2)口令, 所以建立一個可用的賬號同樣的也需要這兩個資料。那賬號可以使用 useradd 來新建使用者,口令的給予則使用 passwd 這個命令!這兩個命令下達方法如下:

  • useradd
[[email protected] ~]# useradd [-u UID] [-g 初始群組] [-G 次要群組] [-mM]\
>  [-c 說明欄] [-d 家目錄絕對路徑] [-s shell] 使用者賬號名
選項與引數:
-u  :後面接的是 UID ,是一組數字。直接指定一個特定的 UID 給這個賬號;
-g  :後面接的那個組名就是我們上面提到的 initial group 啦~
      該群組的 GID 會被放置到 /etc/passwd 的第四個欄位內。
-G  :後面接的組名則是這個賬號還可以加入的群組。
      這個選項與引數會修改 /etc/group 內的相關資料喔!
-M  :強制!不要建立使用者家目錄!(系統賬號預設值)
-m  :強制!要建立使用者家目錄!(一般賬號預設值)
-c  :這個就是 /etc/passwd 的第五欄的說明內容啦~可以隨便我們配置的啦~
-d  :指定某個目錄成為家目錄,而不要使用預設值。務必使用絕對路徑!
-r  :建立一個系統的賬號,這個賬號的 UID 會有限制 (參考 /etc/login.defs)
-s  :後面接一個 shell ,若沒有指定則預設是 /bin/bash 的啦~
-e  :後面接一個日期,格式為『YYYY-MM-DD』此專案可寫入 shadow 第八欄位,
      亦即賬號失效日的配置專案囉;
-f  :後面接 shadow 的第七欄位專案,指定口令是否會失效。0為立刻失效,
      -1 為永遠不失效(口令只會過期而強制於登陸時重新配置而已。)
範例一:完全參考預設值建立一個使用者,名稱為 vbird1 [[email protected] ~]# useradd vbird1 [[email protected] ~]# ll -d /home/vbird1 drwx------ 4 vbird1 vbird1 4096 Feb 25 09:38 /home/vbird1 # 預設會建立使用者家目錄,且許可權為 700 !這是重點! [[email protected] ~]# grep vbird1 /etc/passwd /etc/shadow /etc/group /etc/passwd:vbird1:x:504:505::/home/vbird1:/bin/bash /etc/shadow:vbird1:!!:14300:0:99999:7::: /etc/group:vbird1:x:505: <==預設會建立一個與賬號一模一樣的群組名

其實系統已經幫我們規定好非常多的預設值了,所以我們可以簡單的使用『 useradd 賬號 』來建立使用者即可。 CentOS 這些預設值主要會幫我們處理幾個專案:

  • 在 /etc/passwd 裡面建立一行與賬號相關的資料,包括建立 UID/GID/家目錄等;
  • 在 /etc/shadow 裡面將此賬號的口令相關引數填入,但是尚未有口令;
  • 在 /etc/group 裡面加入一個與賬號名稱一模一樣的組名;
  • 在 /home 底下建立一個與賬號同名的目錄作為使用者家目錄,且許可權為 700

由於在 /etc/shadow 內僅會有口令引數而不會有加密過的口令資料,因此我們在建立使用者賬號時, 還需要使用『 passwd 賬號 』來給予口令才算是完成了使用者建立的流程。如果由於特殊需求而需要改變使用者相關引數時, 就得要透過上述表格中的選項來進行建立了,參考底下的案例:

範例二:假設我已知道我的系統當中有個組名為 users ,且 UID 700 並不存在,
        請用 users 為初始群組,以及 uid 為 700 來建立一個名為 vbird2 的賬號
[[email protected] ~]# useradd -u 700 -g users vbird2
[[email protected] ~]# ll -d /home/vbird2
drwx------ 4 vbird2 users 4096 Feb 25 09:59 /home/vbird2

[[email protected] ~]# grep vbird2 /etc/passwd /etc/shadow /etc/group
/etc/passwd:vbird2:x:700:100::/home/vbird2:/bin/bash
/etc/shadow:vbird2:!!:14300:0:99999:7:::
# 看一下,UID 與 initial group 確實改變成我們需要的了!

在這個範例中,我們建立的是指定一個已經存在的群組作為使用者的初始群組,因為群組已經存在, 所以在 /etc/group 裡面就不會主動的建立與賬號同名的群組了! 此外,我們也指定了特殊的 UID 來作為使用者的專屬 UID 喔!瞭解了一般賬號後,我們來瞧瞧那啥是系統賬號 (system account) 吧!

範例三:建立一個系統賬號,名稱為 vbird3
[[email protected] ~]# useradd -r vbird3
[[email protected] ~]# ll -d /home/vbird3
ls: /home/vbird3: No such file or directory  <==不會主動建立家目錄

[[email protected] ~]# grep vbird3 /etc/passwd /etc/shadow /etc/group
/etc/passwd:vbird3:x:100:103::/home/vbird3:/bin/bash
/etc/shadow:vbird3:!!:14300::::::
/etc/group:vbird3:x:103:

我們在談到 UID 的時候曾經說過一般賬號應該是 500 號以後,那使用者自己建立的系統賬號則一般是由 100 號以後起算的。 所以在這裡我們加上 -r 這個選項以後,系統就會主動將賬號與賬號同名群組的 UID/GID 都指定小於 500 以下, 在本案例中則是使用 100(UID) 與 103(GID) 囉!此外,由於系統賬號主要是用來進行執行系統所需服務的許可權配置, 所以系統賬號預設都不會主動建立家目錄的

由這幾個範例我們也會知道,使用 useradd 建立使用者賬號時,其實會更改不少地方,至少我們就知道底下幾個檔案:

  • 使用者賬號與口令引數方面的檔案:/etc/passwd, /etc/shadow
  • 使用者群組相關方面的檔案:/etc/group, /etc/gshadow
  • 使用者的家目錄:/home/賬號名稱

那請教一下,你有沒有想過,為何『 useradd vbird1 』會主動在 /home/vbird1 建立起使用者的家目錄?家目錄內有什麼資料且來自哪裡?為何預設使用的是 /bin/bash 這個 shell ?為何口令欄位已經都規範好了 (0:99999:7 那一串)?呵呵!這就得要說明一下 useradd 所使用的參考檔案囉!

  • useradd 參考檔

其實 useradd 的預設值可以使用底下的方法呼叫出來:

[[email protected] ~]# useradd -D
GROUP=100		<==預設的群組
HOME=/home		<==預設的家目錄所在目錄
INACTIVE=-1		<==口令失效日,在 shadow 內的第 7 欄
EXPIRE=			<==賬號失效日,在 shadow 內的第 8 欄
SHELL=/bin/bash		<==預設的 shell
SKEL=/etc/skel		<==使用者家目錄的內容資料參考目錄
CREATE_MAIL_SPOOL=yes   <==是否主動幫使用者建立郵件信箱(mailbox)

這個資料其實是由 /etc/default/useradd 呼叫出來的!你可以自行用 vim 去觀察該檔案的內容。搭配上頭剛剛談過的範例一的執行結果,上面這些配置專案所造成的行為分別是:

  • GROUP=100:新建賬號的初始群組使用 GID 為 100 者

    系統上面 GID 為 100 者即是 users 這個群組,此配置專案指的就是讓新設使用者賬號的初始群組為 users 這一個的意思。 但是我們知道 CentOS 上面並不是這樣的,在 CentOS 上面預設的群組為與賬號名相同的群組。 舉例來說, vbird1 的初始群組為 vbird1 。怎麼會這樣啊?這是因為針對群組的角度有兩種不同的機制所致, 這兩種機制分別是:

    • 私有群組機制:系統會建立一個與賬號一樣的群組給使用者作為初始群組。 這種群組的配置機制會比較有保密性,這是因為使用者都有自己的群組,而且家目錄許可權將會配置為 700 (僅有自己可進入自己的家目錄) 之故。使用這種機制將不會參考 GROUP=100 這個配置值。代表性的 distributions 有 RHEL, Fedora, CentOS 等;

    • 公共群組機制:就是以 GROUP=100 這個配置值作為新建賬號的初始群組,因此每個賬號都屬於 users 這個群組, 且預設家目錄通常的許可權會是『 drwxr-xr-x ... username users ... 』,由於每個賬號都屬於 users 群組,因此大家都可以互相分享家目錄內的資料之故。代表 distributions 如 SuSE等。

    由於我們的 CentOS 使用私有群組機制,因此這個配置專案是不會生效的!不要太緊張啊!

  • HOME=/home:使用者家目錄的基準目錄(basedir)

    使用者的家目錄通常是與賬號同名的目錄,這個目錄將會擺放在此配置值的目錄後。所以 vbird1 的家目錄就會在 /home/vbird1/ 了!很容易理解吧!

  • INACTIVE=-1:口令過期後是否會失效的配置值

    我們在 shadow 檔案結構當中談過,第七個欄位的配置值將會影響到口令過期後, 在多久時間內還可使用舊口令登陸。這個專案就是在指定該日數啦!如果是 0 代表口令過期立刻失效, 如果是 -1 則是代表口令永遠不會失效,如果是數字,如 30 ,則代表過期 30 天后才失效。

  • EXPIRE=:賬號失效的日期

    就是 shadow 內的第八欄位,你可以直接配置賬號在哪個日期後就直接失效,而不理會口令的問題。 通常不會配置此專案,但如果是付費的會員制系統,或許這個欄位可以配置喔!

  • SHELL=/bin/bash:預設使用的 shell 程式檔名

    系統預設的 shell 就寫在這裡。假如你的系統為 mail server ,你希望每個賬號都只能使用 email 的收發信件功能, 而不許使用者登陸系統取得 shell ,那麼可以將這裡配置為 /sbin/nologin ,如此一來,新建的使用者預設就無法登陸! 也免去後續使用 usermod 進行修改的手續!

  • SKEL=/etc/skel:使用者家目錄參考基準目錄

    這個咚咚就是指定使用者家目錄的參考基準目錄囉~舉我們的範例一為例, vbird1 家目錄 /home/vbird1 內的各項資料,都是由 /etc/skel 所複製過去的~所以呢,未來如果我想要讓新增使用者時,該使用者的環境變數 ~/.bashrc 就配置妥當的話,您可以到 /etc/skel/.bashrc 去編輯一下,也可以建立 /etc/skel/www 這個目錄,那麼未來新增使用者後,在他的家目錄下就會有 www 那個目錄了!這樣瞭呼?

  • CREATE_MAIL_SPOOL=yes:建立使用者的 mailbox

    你可以使用『 ll /var/spool/mail/vbird1 』看一下,會發現有這個檔案的存在喔!這就是使用者的郵件信箱!

除了這些基本的賬號配置值之外, UID/GID 還有口令引數又是在哪裡參考的呢?那就得要看一下 /etc/login.defs 啦! 這個檔案的內容有點像底下這樣:

MAIL_DIR        /var/spool/mail	<==使用者預設郵件信箱放置目錄

PASS_MAX_DAYS   99999	<==/etc/shadow 內的第 5 欄,多久需變更口令日數
PASS_MIN_DAYS   0	<==/etc/shadow 內的第 4 欄,多久不可重新配置口令日數
PASS_MIN_LEN    5	<==口令最短的字元長度,已被 pam 模組取代,失去效用!
PASS_WARN_AGE   7	<==/etc/shadow 內的第 6 欄,過期前會警告的日數

UID_MIN         500	<==使用者最小的 UID,意即小於 500 的 UID 為系統保留
UID_MAX       60000	<==使用者能夠用的最大 UID
GID_MIN         500	<==使用者自定義組的最小 GID,小於 500 為系統保留
GID_MAX       60000	<==使用者自定義組的最大 GID

CREATE_HOME     yes	<==在不加 -M 及 -m 時,是否主動建立使用者家目錄?
UMASK           077     <==使用者家目錄建立的 umask ,因此許可權會是 700
USERGROUPS_ENAB yes     <==使用 userdel 刪除時,是否會刪除初始群組
MD5_CRYPT_ENAB yes      <==口令是否經過 MD5 的加密機制處理

這個檔案規範的資料則是如下所示:

  • mailbox 所在目錄
    使用者的預設 mailbox 檔案放置的目錄在 /var/spool/mail,所以 vbird1 的 mailbox 就是在 /var/spool/mail/vbird1 囉!

  • shadow 口令第 4, 5, 6 欄位內容
    透過 PASS_MAX_DAYS 等等配置值來指定的!所以你知道為何預設的 /etc/shadow 內每一行都會有『 0:99999:7 』的存在了嗎?^_^!不過要注意的是,由於目前我們登陸時改用 PAM 模組來進行口令檢驗,所以那個 PASS_MIN_LEN 是失效的!

  • UID/GID 指定數值
    雖然 Linux 核心支援的賬號可高達 232 這麼多個,不過一部主機要作出這麼多賬號在管理上也是很麻煩的! 所以在這裡就針對 UID/GID 的範圍進行規範就是了。上表中的 UID_MIN 指的就是可登陸系統的一般賬號的最小 UID ,至於 UID_MAX 則是最大 UID 之意。

    要注意的是,系統給予一個賬號 UID 時,他是 (1)先參考 UID_MIN 配置值取得最小數值; (2)由 /etc/passwd 搜尋最大的 UID 數值, 將 (1) 與 (2) 相比,找出最大的那個再加一就是新賬號的 UID 了。我們上面已經作出 UID 為 700 的 vbird2 , 如果再使用『 useradd vbird4 』時,你猜 vbird4 的 UID 會是多少?答案是: 701 。 所以中間的 505~699 的號碼就空下來啦!

    而如果我是想要建立系統用的賬號,所以使用 useradd -r sysaccount 這個 -r 的選項時,就會找『比 500 小的最大的那個 UID + 1 』就是了。 ^_^

  • 使用者家目錄配置值
    為何我們系統預設會幫使用者建立家目錄?就是這個『CREATE_HOME = yes』的配置值啦!這個配置值會讓你在使用 useradd 時, 主動加入『 -m 』這個產生家目錄的選項啊!如果不想要建立使用者家目錄,就只能強制加上『 -M 』的選項在 useradd 命令執行時啦!至於建立家目錄的許可權配置呢?就透過 umask 這個配置值啊!因為是 077 的預設配置,因此使用者家目錄預設許可權才會是『 drwx------ 』哩!

  • 使用者刪除與口令配置值
    使用『USERGROUPS_ENAB yes』這個配置值的功能是: 如果使用 userdel 去刪除一個賬號時,且該賬號所屬的初始群組已經沒有人隸屬於該群組了, 那麼就刪除掉該群組,舉例來說,我們剛剛有建立 vbird4 這個賬號,他會主動建立 vbird4 這個群組。 若 vbird4 這個群組並沒有其他賬號將他加入支援的情況下,若使用 userdel vbird4 時,該群組也會被刪除的意思。 至於『MD5_CRYPT_ENAB yes』則表示使用 MD5 來加密口令明文,而不使用舊式的 DES(注2) 。

現在你知道啦,使用 useradd 這支程式在建立 Linux 上的賬號時,至少會參考:

  • /etc/default/useradd
  • /etc/login.defs
  • /etc/skel/*

這些檔案,不過,最重要的其實是建立 /etc/passwd, /etc/shadow, /etc/group, /etc/gshadow 還有使用者家目錄就是了~所以,如果你瞭解整個系統執行的狀態,也是可以手動直接修改這幾個檔案就是了。 OK!賬號建立了,接下來處理一下使用者的口令吧!

  • passwd

剛剛我們講到了,使用 useradd 建立了賬號之後,在預設的情況下,該賬號是暫時被封鎖的, 也就是說,該賬號是無法登陸的,你可以去瞧一瞧 /etc/shadow 內的第二個欄位就曉得囉~ 那該如何是好?怕什麼?直接給他配置新口令就好了嘛!對吧~配置口令就使用 passwd 囉!

[[email protected] ~]# passwd [--stdin]  <==所有人均可使用來改自己的口令
[[email protected] ~]# passwd [-l] [-u] [--stdin] [-S] \
>  [-n 日數] [-x 日數] [-w 日數] [-i 日期] 賬號 <==root 功能
選項與引數:
--stdin :可以透過來自前一個管線的資料,作為口令輸入,對 shell script 有幫助!
-l  :是 Lock 的意思,會將 /etc/shadow 第二欄最前面加上 ! 使口令失效;
-u  :與 -l 相對,是 Unlock 的意思!
-S  :列出口令相關引數,亦即 shadow 檔案內的大部分資訊。
-n  :後面接天數,shadow 的第 4 欄位,多久不可修改口令天數
-x  :後面接天數,shadow 的第 5 欄位,多久內必須要更動口令
-w  :後面接天數,shadow 的第 6 欄位,口令過期前的警告天數
-i  :後面接『日期』,shadow 的第 7 欄位,口令失效日期

範例一:請 root 給予 vbird2 口令
[[email protected] ~]# passwd vbird2
Changing password for user vbird2.
New UNIX password: <==這裡直接輸入新的口令,螢幕不會有任何反應
BAD PASSWORD: it is WAY too short <==口令太簡單或過短的錯誤!
Retype new UNIX password:  <==再輸入一次同樣的口令
passwd: all authentication tokens updated successfully.  <==竟然還是成功修改了!

root 果然是最偉大的人物!當我們要給予使用者口令時,透過 root 來配置即可。 root 可以配置各式各樣的口令,系統幾乎一定會接受!所以您瞧瞧,如同上面的範例一,明明鳥哥輸入的口令太短了, 但是系統依舊可接受 vbird2 這樣的口令配置。這個是 root 幫忙配置的結果,那如果是使用者自己要改口令呢? 包括 root 也是這樣修改的喔!

範例二:用 vbird2 登陸後,修改 vbird2 自己的口令
[[email protected] ~]$ passwd   <==後面沒有加賬號,就是改自己的口令!
Changing password for user vbird2.
Changing password for vbird2
(current) UNIX password: <==這裡輸入『原有的舊口令』
New UNIX password: <==這裡輸入新口令
BAD PASSWORD: it is based on a dictionary word <==口令檢驗不通過,請再想個新口令
New UNIX password: <==這裡再想個來輸入吧
Retype new UNIX password: <==通過口令驗證!所以重複這個口令的輸入
passwd: all authentication tokens updated successfully. <==有無成功看關鍵詞

passwd 的使用真的要很注意,尤其是 root 先生啊!鳥哥在課堂上每次講到這裡,說是要幫自己的一般賬號建立口令時, 有一小部分的學生就是會忘記加上賬號,結果就變成改變 root 自己的口令,最後.... root 口令就這樣不見去!唉~ 要幫一般賬號建立口令需要使用『 passwd 賬號 』的格式,使用『 passwd 』表示修改自己的口令!拜託!千萬不要改錯!

與 root 不同的是,一般賬號在更改口令時需要先輸入自己的舊口令 (亦即 current 那一行),然後再輸入新口令 (New 那一行)。 要注意的是,口令的規範是非常嚴格的,尤其新的 distributions 大多使用 PAM 模組來進行口令的檢驗,包括太短、 口令與賬號相同、口令為字典常見字串等,都會被 PAM 模組檢查出來而拒絕修改口令,此時會再重複出現『 New 』這個關鍵詞! 那時請再想個新口令!若出現『 Retype 』才是你的口令被接受了!重複輸入新口令並且看到『 successfully 』這個關鍵詞時才是修改口令成功喔!

Tips:
與一般使用者不同的是, root 並不需要知道舊口令就能夠幫使用者或 root 自己建立新口令! 但如此一來有困擾~就是如果你的親密愛人老是告訴你『我的口令真難記,幫我配置簡單一點的!』時, 千萬不要妥協啊!這是為了系統安全...
鳥哥的圖示

為何使用者要設訂自己的口令會這麼麻煩啊?這是因為口令的安全性啦!如果口令配置太簡單, 一些有心人士就能夠很簡單的猜到你的口令,如此一來人家就可能使用你的一般賬號登陸你的主機或使用其他主機資源, 對主機的維護會造成困擾的!所以新的 distributions 是使用較嚴格的 PAM 模組來管理口令,這個管理的機制寫在 /etc/pam.d/passwd 當中。而該檔案與口令有關的測試模組就是使用:pam_cracklib.so,這個模組會檢驗口令相關的資訊, 並且取代 /etc/login.defs 內的 PASS_MIN_LEN 的配置啦!關於 PAM 我們在本章後面繼續介紹,這裡先談一下, 理論上,你的口令最好符合如下要求:

  • 口令不能與賬號相同;
  • 口令儘量不要選用字典裡面會出現的字串;
  • 口令需要超過 8 個字元;
  • 口令不要使用個人資訊,如身份證、手機號碼、其他電話號碼等;
  • 口令不要使用簡單的關係式,如 1+1=2, Iamvbird 等;
  • 口令儘量使用大小寫字元、數字、特殊字元($,_,-等)的組合。

為了方便系統管理,新版的 passwd 還加入了很多創意選項喔!鳥哥個人認為最好用的大概就是這個『 --stdin 』了! 舉例來說,你想要幫 vbird2 變更口令成為 abc543CC ,可以這樣下達命令呢!

範例三:使用 standard input 建立使用者的口令
[[email protected] ~]# echo "abc543CC" | passwd --stdin vbird2
Changing password for user vbird2.
passwd: all authentication tokens updated successfully.

這個動作會直接升級使用者的口令而不用再次的手動輸入!好處是方便處理,缺點是這個口令會保留在命令中, 未來若系統被攻破,人家可以在 /root/.bash_history 找到這個口令呢!所以這個動作通常僅用在 shell script 的大量建立使用者賬號當中!要注意的是,這個選項並不存在所有 distributions 版本中, 請使用 man passwd 確認你的 distribution 是否有支援此選項喔!

如果你想要讓 vbird2 的口令具有相當的守則,舉例來說你要讓 vbird2 每 60 天需要變更口令, 口令過期後 10 天未使用就宣告口令失效,那該如何處理?

範例四:管理 vbird2 的口令使具有 60 天變更、10 天口令失效的配置
[[email protected] ~]# passwd -S vbird2
vbird2 PS 2009-02-26 0 99999 7 -1 (Password set, MD5 crypt.)
# 上面說明口令建立時間 (2009-02-26)、0 最小天數、99999 變更天數、7 警告日數
# 與口令不會失效 (-1) 。

[[email protected] ~]# passwd -x 60 -i 10 vbird2
[[email protected] ~]# passwd -S vbird2
vbird2 PS 2009-02-26 0 60 7 10 (Password set, MD5 crypt.)

那如果我想要讓某個賬號暫時無法使用口令登陸主機呢?舉例來說, vbird2 這傢伙最近老是胡亂在主機亂來, 所以我想要暫時讓她無法登陸的話,最簡單的方法就是讓她的口令變成不合法 (shadow 第 2 欄位長度變掉)! 處理的方法就更簡單的!

範例五:讓 vbird2 的賬號失效,觀察完畢後再讓她失效
[[email protected] ~]# passwd -l vbird2
[[email protected] ~]# passwd -S vbird2
vbird2 LK 2009-02-26 0 60 7 10 (Password locked.)
# 嘿嘿!狀態變成『 LK, Lock 』了啦!無法登陸喔!
[[email protected] ~]# grep vbird2 /etc/shadow
vbird2:!!$1$50MnwNFq$oChX.0TPanCq7ecE4HYEi.:14301:0:60:7:10::
# 其實只是在這裡加上 !! 而已!

[[email protected] ~]# passwd -u vbird2
[[email protected] ~]# grep vbird2 /etc/shadow
vbird2:$1$50MnwNFq$oChX.0TPanCq7ecE4HYEi.:14301:0:60:7:10::
# 口令欄位恢復正常!

是否很有趣啊!您可以自行管理一下你的賬號的口令相關引數喔!接下來讓我們用更簡單的方法來查閱口令引數喔! 

  • chage

除了使用 passwd -S 之外,有沒有更詳細的口令引數顯示功能呢?有的!那就是 chage 了! 他的用法如下:

[[email protected] ~]# chage [-ldEImMW] 賬號名
選項與引數:
-l :列出該賬號的詳細口令引數;
-d :後面接日期,修改 shadow 第三欄位(最近一次更改口令的日期),格式 YYYY-MM-DD
-E :後面接日期,修改 shadow 第八欄位(賬號失效日),格式 YYYY-MM-DD
-I :後面接天數,修改 shadow 第七欄位(口令失效日期)
-m :後面接天數,修改 shadow 第四欄位(口令最短保留天數)
-M :後面接天數,修改 shadow 第五欄位(口令多久需要進行變更)
-W :後面接天數,修改 shadow 第六欄位(口令過期前警告日期)

範例一:列出 vbird2 的詳細口令引數
[[email protected] ~]# chage -l vbird2
Last password change                               : Feb 26, 2009
Password expires                                   : Apr 27, 2009
Password inactive                                  : May 07, 2009
Account expires                                    : never
Minimum number of days between password change     : 0
Maximum number of days between password change     : 60
Number of days of warning before password expires  : 7

我們在 passwd 的介紹中談到了處理 vbird2 這個賬號的口令屬性流程,使用 passwd -S 卻無法看到很清楚的說明。如果使用 chage 那可就明白多了!如上表所示,我們可以清楚的知道 vbird2 的詳細引數呢! 如果想要修改其他的配置值,就自己參考上面的選項,或者自行 man chage 一下吧!^_^

chage 有一個功能很不錯喔!如果你想要讓『使用者在第一次登陸時, 強制她們一定要更改口令後才能夠使用系統資源』,可以利用如下的方法來處理的!

範例二:建立一個名為 agetest 的賬號,該賬號第一次登陸後使用預設口令,
        但必須要更改過口令後,使用新口令才能夠登陸系統使用 bash 環境
[[email protected] ~]# useradd agetest
[[email protected] ~]# echo "agetest" | passwd --stdin agetest
[[email protected] ~]# chage -d 0 agetest
# 此時此賬號的口令建立時間會被改為 1970/1/1 ,所以會有問題!

範例三:嘗試以 agetest 登陸的情況
You are required to change your password immediately (root enforced)
WARNING: Your password has expired.
You must change your password now and login again!
Changing password for user agetest.
Changing password for agetest
(current) UNIX password:  <==這個賬號被強制要求必須要改口令!

非常有趣吧!你會發現 agetest 這個賬號在第一次登陸時可以使用與賬號同名的口令登陸, 但登陸時就會被要求立刻更改口令,更改口令完成後就會被踢出系統。再次登陸時就能夠使用新口令登陸了! 這個功能對學校老師非常有幫助!因為我們不想要知道學生的口令,那麼在初次上課時就使用與學號相同的賬號/口令給學生, 讓她們登陸時自行配置她們的口令,如此一來就能夠避免其他同學隨意使用別人的賬號,也能夠保證學生知道如何更改自己的口令! 

  • usermod

所謂這『人有失手,馬有亂蹄』,您說是吧?所以囉,當然有的時候會『不小心』在 useradd 的時候加入了錯誤的配置資料。或者是,在使用 useradd 後,發現某些地方還可以進行細部修改。 此時,當然我們可以直接到 /etc/passwd 或 /etc/shadow 去修改相對應欄位的資料, 不過,Linux 也有提供相關的命令讓大家來進行賬號相關資料的微調呢~那就是 usermod 囉~

[[email protected] ~]# usermod [-cdegGlsuLU] username
選項與引數:
-c  :後面接賬號的說明,即 /etc/passwd 第五欄的說明欄,可以加入一些賬號的說明。
-d  :後面接賬號的家目錄,即修改 /etc/passwd 的第六欄;
-e  :後面接日期,格式是 YYYY-MM-DD 也就是在 /etc/shadow 內的第八個欄位資料啦!
-f  :後面接天數,為 shadow 的第七欄位。
-g  :後面接初始群組,修改 /etc/passwd 的第四個欄位,亦即是 GID 的欄位!
-G  :後面接次要群組,修改這個使用者能夠支援的群組,修改的是 /etc/group 囉~
-a  :與 -G 合用,可『新增次要群組的支援』而非『配置』喔!
-l  :後面接賬號名稱。亦即是修改賬號名稱, /etc/passwd 的第一欄!
-s  :後面接 Shell 的實際檔案,例如 /bin/bash 或 /bin/csh 等等。
-u  :後面接 UID 數字啦!即 /etc/passwd 第三欄的資料;
-L  :暫時將使用者的口令凍結,讓他無法登陸。其實僅改 /etc/shadow 的口令欄。
-U  :將 /etc/shadow 口令欄的 ! 拿掉,解凍啦!

如果你仔細的比對,會發現 usermod 的選項與 useradd 非常類似! 這是因為 usermod 也是用來微調 useradd 新增的使用者引數嘛!不過 usermod 還是有新增的選項, 那就是 -L 與 -U ,不過這兩個選項其實與 passwd 的 -l, -u 是相同的!而且也不見得會存在所有的 distribution 當中!接下來,讓我們談談一些變更引數的例項吧!

範例一:修改使用者 vbird2 的說明欄,加上『VBird's test』的說明。
[[email protected] ~]# usermod -c "VBird's test" vbird2
[[email protected] ~]# grep vbird2 /etc/passwd
vbird2:x:700:100:VBird's test:/home/vbird2:/bin/bash

範例二:使用者 vbird2 口令在 2009/12/31 失效。
[[email protected] ~]# usermod -e "2009-12-31" vbird2
[[email protected] ~]# grep vbird2 /etc/shadow
vbird2:$1$50MnwNFq$oChX.0TPanCq7ecE4HYEi.:14301:0:60:7:10:14609:

範例三:我們建立 vbird3 這個系統賬號時並沒有給予家目錄,請建立他的家目錄
[[email protected] ~]# ll -d ~vbird3
ls: /home/vbird3: No such file or directory  <==確認一下,確實沒有家目錄的存在!
[[email protected] ~]# cp -a /etc/skel /home/vbird3
[[email protected] ~]# chown -R vbird3:vbird3 /home/vbird3
[[email protected] ~]# chmod 700 /home/vbird3
[[email protected] ~]# ll -a ~vbird3
drwx------  4 vbird3 vbird3 4096 Sep  4 18:15 .  <==使用者家目錄許可權
drwxr-xr-x 11 root   root   4096 Feb 26 11:45 ..
-rw-r--r--  1 vbird3 vbird3   33 May 25  2008 .bash_logout
-rw-r--r--  1 vbird3 vbird3  176 May 25  2008 .bash_profile
-rw-r--r--  1 vbird3 vbird3  124 May 25  2008 .bashrc
drwxr-xr-x  3 vbird3 vbird3 4096 Sep  4 18:11 .kde
drwxr-xr-x  4 vbird3 vbird3 4096 Sep  4 18:15 .mozilla
# 使用 chown -R 是為了連同家目錄底下的使用者/群組屬性都一起變更的意思;
# 使用 chmod 沒有 -R ,是因為我們僅要修改目錄的許可權而非內部檔案的許可權!

  • userdel

這個功能就太簡單了,目的在刪除使用者的相關資料,而使用者的資料有:

  • 使用者賬號/口令相關引數:/etc/passwd, /etc/shadow
  • 使用者群組相關引數:/etc/group, /etc/gshadow
  • 使用者個人檔案資料: /home/username, /var/spool/mail/username..

整個命令的語法非常簡單:

[[email protected] ~]# userdel [-r] username
選項與引數:
-r  :連同使用者的家目錄也一起刪除

範例一:刪除 vbird2 ,連同家目錄一起刪除
[[email protected] ~]# userdel -r vbird2

這個命令下達的時候要小心了!通常我們要移除一個賬號的時候,你可以手動的將 /etc/passwd 與 /etc/shadow 裡頭的該賬號取消即可!一般而言,如果該賬號只是『暫時不啟用』的話,那麼將 /etc/shadow 裡頭賬號失效日期 (第八欄位) 配置為 0 就可以讓該賬號無法使用,但是所有跟該賬號相關的資料都會留下來! 使用 userdel 的時機通常是『你真的確定不要讓該使用者在主機上面使用任何資料了!』

另外,其實使用者如果在系統上面操作過一陣子了,那麼該使用者其實在系統內可能會含有其他檔案的。 舉例來說,他的郵件信箱 (mailbox) 或者是例行性工作排程 (crontab, 十六章) 之類的檔案。 所以,如果想要完整的將某個賬號完整的移除,最好可以在下達 userdel -r username 之前, 先以『 find / -user username 』查出整個系統內屬於 username 的檔案,然後再加以刪除吧!