5-4 帳戶管理檔案
內容:
一般 Unix/Linux 系統有四個主要的帳戶管理檔案,分別是 /etc/passwd、/etc/shadow、/etc/group 與 /etc/gshadow,並且都設定成僅能『讀取』,不可修改或執行。管理者如要修改的話,則須先它設定成可寫入,完成後再改回來(利用 chmod)。以下分別介紹之。
5-4-1 帳戶檔案 - /etc/passwd
此檔案在建立系統時便已存在,管理者不用特地去產生它,而且當管理者操作增加、刪除或更新帳戶命令時,也會自動修改此檔案。當然,管理者也可以直接利用 vi 編輯此檔案來管理帳戶,但一般系統都不建議如此操作,還是利用正規管理命令(容後介紹)較為妥當。我們可以利用 # cat /etc/passwd 命令,觀察此檔案內容,如下所示:
# cat /etc/passed
root:BXOVk2FNVaoKs:0:0:root:/root:/bin/bash
bin:*:1:1:bin:/bin:/sbin/nologin
daemon:*:2:2:daemon:/sbin:/sbin/nologin
adm:*:3:4:adm:/var/adm:/sbin/nologin
lp:*:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:*:5:0:sync:/sbin:/bin/sync
shutdown:*:6:0:shutdown:/sbin:/sbin/shutdown
halt:*:7:0:halt:/sbin:/sbin/halt
mail:*:8:12:mail:/var/spool/mail:/sbin/nologin
news:*:9:13:news:/etc/news:
uucp:*:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:*:11:0:operator:/root:/sbin/nologin
games:*:12:100:games:/usr/games:/sbin/nologin
gopher:*:13:30:gopher:/var/gopher:/sbin/nologin
ftp:*:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:*:99:99:Nobody:/:/sbin/nologin
…..
tsnien:GaB2MI0gT.psI:508:508::/home/tsnien:/bin/bash |
其中每一行記錄(即是每一筆資料的意思)表示每一個使用者的帳戶資料。圖 5-4是每一筆記錄中每一欄位所代表的功能,各欄位功能(欄位之間以冒號分隔)如下:
圖 5-4 帳戶檔案內容
-
使用者名稱(User name,第 1 欄位):使用者身份的識別名稱,又稱為登入名稱(Login name)或帳戶名稱(Account name)。名稱最長為 32 個字元,且同一系統內不可以有兩個以上名稱相同。
-
密碼(password,第 2 欄位):加密或雜湊演算後的密碼儲存位置。許多系統(如 Fedora core 4)並不會將密碼儲存於此欄位,而是將加密後的密碼儲存於 /etc/shadow 檔案內,此欄位顯示如下(x 的含意容後說明):
csu001:x:502:502:csu students:/home/csu001:/bin/bash |
-
使用者識別碼(User Identifier, UID,第 3 欄位):使用者獨一無二的識別碼。UID 號碼介於 0 ~ 65535 之間,其中 UID=0 為 root 識別碼;1 ~ 499 則保留給系統使用,大多分配給『系統操作者』帳戶使用;其餘 500 ~ 65535 則給一般使用者帳戶使用。
-
群組識別碼(Group Identifier, GID,第 4 欄位):使用者所屬群組的識別碼。此欄位與 /etc/group 檔案內第三欄位相對應,表示該帳戶使用者是歸屬於哪一個群組。
-
註解(Comment,第 5 欄位):此欄位僅做說明使用,大多使用於儲存使用者的全名。
-
家目錄(Home directory,第 6 欄位):該帳戶的家目錄,使用者登入後會立即進入此帳戶。系統管理者在建立帳戶時,必須同時開啟該帳戶的家目錄,並將此目錄的擁有者設定為所建立的帳戶所有,如家目錄未建立完備,該帳戶將無法順利登入系統。
-
外殼(Shell,第 7 欄位):此欄位指定使用者登入後,執行哪一個外殼程式(如 /bin/bash),亦即指定外殼環境。
5-4-2 群組檔案 - /etc/group
由群組檔案 /etc/group 可以看出系統上已設定的群組,以及每一群組包含的使用者,檔案範例如下(# cat /etc/group):
root::0:root,systexftp,service
bin::1:root,bin,daemon
daemon::2:root,bin,daemon
sys::3:root,bin,adm
adm::4:root,adm,daemon
tty::5:
disk::6:root
lp::7:daemon,lp
……
tsnien:x:508: |
上述中,每一列表示一筆記錄,並代表一個群組的屬性,其格式如下:
groupname:password:gid:user-list
其中:
-
群組名稱(Group name,第 1 欄位):每一群組的名稱,如 bin、root 等。某些名稱是系統內定的,多半有其特殊功能。
-
群組密碼(password,第 2 欄位):目前此欄位不使用。
-
群組識別碼(Group ID, GID,第 3 欄位):範圍 0 ~ 65535,其中 0 ~ 99 保留給系統使用,其中 root 的 GID 為0。此 GID 與 /etc/passwd 內的 GID (第三欄位)相同。如果使用者有獨立群組的話,則 GID 與 UID 的號碼相同。
-
使用者列表(User list,第 4 欄位):此群組底下的使用者。相同群組的使用者的權限大致上相同,譬如上例中,除了 root 具有超級使用者權限外,systexftp 與 service 使用者都具有相當的權限,這樣的做法是非常危險的。
5-4-3 帳戶隱藏檔 - /etc/shadow
加密或雜湊計算後的密碼是否就安全呢?這是值得深思的問題。如圖 5- 所建立的帳戶,將加密後的密碼儲存於帳戶檔案 /etc/passwd 。我們利用 ls –l 觀察此檔案的安全性如何:
$ ls -l /etc/passwd
-rw-r--r-- 1 root root 7716 Jul 16 10:07 /etc/passwd |
由它的存取控制碼(-rw-r--r--,0644)可以看出,雖然該檔案僅能由 root 修改,但其他所有人都可以讀取它。這是因為系統上還有許多地方必定會利用到 /etc/passwd 檔,所以無法限制他人讀取。如此一來,任何人都可以讀取所有帳戶加密後的密碼,有心人士便可以利用暴力攻擊法或字典攻擊法(請參考拙著『資訊與網路安全技術』),去猜測或破解某一特殊使用者的密碼。一般系統大多利用 MD5 演算法,有心人士只要輸入不同的密碼,再經過 MD5 計算後所得的雜湊值,比較是否與 root 欄位的密碼相同。如果相同的話,表示就已破解 root 的密碼,再利用所猜測的密碼,便可以順利以 root 身份進入系統,如此一來,不但入侵成功而且還享有最高優先權。
由此可見,將加密後的密碼存放於 /etc/passwd 檔案是不可靠的。還好一般 Unix/Linux 都可利用 Shadow 套件來解決此困厄。Shadow 套件不但可以隱藏密碼,還可以擴充密碼的功能,譬如設定帳戶有效期限、密碼更換週期等等。安裝 Shadow 套件之後,系統會另外建立一個密碼管理檔案,其名為 /etc/shadow,是儲存加密後的檔案,亦即相關密碼控制訊息。然而,加密後的密碼就不再存放於 /etc/passwd 檔案,其中每筆記錄將變更為下列格式:(# cat /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
…..
tsnien:x:502:502::/home/tsnien:/bin/bash |
原來儲存密碼的第二個欄位,不再儲存加密後的密碼,而以『x』取代,表示加密後密碼已移植到 /etc/shadow 檔案上。另外,觀察 /etc/shadow 檔案屬性如下:
$ ls -l /etc/shadow
-r-------- 1 root root 8709 Jul 16 10:07 /etc/shadow |
我們可以發現 /etc/shadow 的存取控制碼為 0400,亦即只有 root 可以讀取,其他使用者是不允許讀取的。儲存於 /etc/shadow 的加密後密碼,一般使用者是無法讀取,如此便可以增加破解密碼的困難度(當然還可利用其他方法破解)。
欲觀察 /etc/shadow 的檔案內容,必須以 root 帳號登入系統,如下所示(# cat /etc/shadow):
root:$1$oa4Fm13y$b1aJSwPYX2JDJSIuTVDxV0:12832:0:99999:7:::
bin:*:12832:0:99999:7:::
daemon:*:12832:0:99999:7:::
adm:*:12832:0:99999:7:::
lp:*:12832:0:99999:7:::
sync:*:12832:0:99999:7:::
shutdown:*:12832:0:99999:7:::
halt:*:12832:0:99999:7:::
mail:*:12832:0:99999:7:::
….
radiusd:!!:12832:0:99999:7:::
ldap:!!:12832:0:99999:7:::
mysql:!!:12832:0:99999:7:::
…..
tsnien:$1$EvORlBb6$zhui.EoD70ir8FiWVhIj/0:12838:0:99999:7::: |
如同 /etc/passwd 檔案一樣,每一行表示一筆記錄並對應到 /etc/passwd 檔案資料,表示某一帳戶的密碼管理訊息。每一筆資料包含若干個欄位,欄位之間以冒號(:)分隔,如圖 5-5 所示。各欄位功能如下說明:
圖 5-5 /etc/shadow 各欄位功能
-
使用者名稱(User name,第 1 欄位):該筆記錄的使用者名稱(或稱帳戶名稱、登入名稱),此欄位與 /etc/passwd 檔案相對應的使用者名稱。
-
密碼(Password,第 2 欄位):儲存該帳戶的加密或雜湊演算後的密碼。如果該欄位內容是兩個驚嘆號(!!),表示該帳戶已被鎖定而且無法登入(或還未開啟);如果是一個星號(*),則表示該帳戶是特殊使用者,並且無法直接登入,如 lp 等等。
-
最後變更日期(Last changed,第 3 欄位):儲存該帳戶密碼最後變更的日期,但不是直接儲存某年某月的日期,而是取某一日期(如 1970 年 1 月 1 日)到所變更日期之間的天數。
-
至少使用天數(Min days,第 4 欄位):密碼至少必須使用的天數。譬如若此欄位為 10,表示密碼上次變更後(Last changed 欄位),至少必須經過 10 天之後才可以再變更密碼。此欄位一般甚少使用,大多設定為 0。
-
使用最多天數(Max days,第 5 欄位):密碼最多可使用的天數,亦即在這個期間必須變更密碼。譬如若此欄位為 30,則表示上次變更密碼後(Last changed 欄位值),30 天內必須重新變更密碼。如果沒有特定指定可以使用幾天,可將此欄位設定成最大值(99999),表示永遠有效的意思。
-
警告(Warning,第 6 欄位):密碼過期之前警告的天數。譬如若此欄位是 7,表示該密碼使用最多天數的最後 7 天內,使用者登入時,都會發出警告的訊息;如果沒有特殊指定,此欄位大多設定為 7。
-
過期天數(Expires,第 7 欄位):此欄位記錄著允許密碼過期變更的天數。譬如若此欄位設定為 5,表示密碼過期的 5 天內還可登入,如果再超過的話,則帳戶就會被鎖定而且無法登入(需管理者重新設定)。此欄位若為 0 表示密碼永遠有效。
-
鎖定(Disabled,第 8 欄位):此欄位為 0,表示該帳戶已被鎖定;否則表示未被鎖定。
5-4-4群組隱藏檔 - /etc/gshadow
雖然目前甚少使用群組密碼,但 Shadow 套件還是建立一個群組密碼隱藏檔案 /etc/gshadow。因為甚少使用此檔案,這裡僅簡單介紹。檔案範例如下(# cat /etc/gshadow):
root:::root
bin:::root,bin,daemon
daemon:::root,bin,daemo
….
tsnien:!!:: |
其中每一行表示一個群組的管理訊息,它是由四個欄位所構成,欄位之間以冒號(:)分隔,如圖 5-6 所示。各欄位功能如下:
-
群組名稱(Group name,第 1 欄位):與 /etc/group 相對應的群組名稱。
-
密碼(Password,第 2 欄位):加密後群組密碼。
-
管理者(Administrators,第 3 欄位):群組管理員的帳戶名稱,如果超過一位管理員,會以逗號(,)分隔。
-
成員(Members,第 4 欄位):群組成員的帳戶名稱;如果超過一個成員,會以逗號(,)分隔。
圖 5-6 /etc/gshadow 各欄位功能
|