賬號安全也是系統安全的一項關鍵性的決定因素。不常用的賬號,以及採用了很容易被猜中的口令的賬號,都是黑客攻擊的主要目標。在這一章裏,我們首先研究自動工具所實現的下層模型,然後介紹工具本身(useradd,userdel等)。系統提供的默認工具 useradd 實際用起來相當不錯,應該能夠滿足站點的大多數需求。遺憾的是,useradd 卻沒有我們希望的那樣好。
1 /etc/passwd 文件
/etc/passwd 文件是系統能夠識別的用戶的一份清單。在用戶登錄期間,系統查詢這個文件,確定用戶的 UID 並驗證用戶的口令。這個文件中的每一行代表一個用戶,它包含 7 個由冒號分隔的字段。
- 登錄名
- 經過加密的口令或者口令佔位符
- UID 號
- 默認的 GID 號
- “GECOS”信息:全名、辦公室、分機號、住宅電話
- 主目錄
- 登錄 shell
舉個例子:
下面各小節中將更詳細地討論 /etc/passwd 中的字段。
1.1 登錄名
登錄名(也叫做用戶名)必須是唯一的,它的長度一般不超過 32 個字符。代表的是登錄到主機上的用戶的所使用的名稱。
1.2 加密的口令
目前大多數系統實際上把加密後的口令放在 /etc/shadow 而不是 /etc/passwd 文件裏。但不管實際情況下口令到底保存在哪裏,本節討論的內容都適用。
/etc/shadow 文件以加密的形式保存口令。通過 passwd 命令來設置這個字段的內容,或者從另外一個賬號中複製加密後的口令字符串。
如果通過手工編輯 /etc/passwd 文件來創建一個新賬號,那麼要在加密口令字段添一個星號或者一個 x 以防止在設置一個真實口令之前發生未經授權使用該賬號的情況。千萬不要讓這個字段爲空——那樣會引入一個大大的安全漏洞,因爲不需要口令就能訪問這個賬號。
目前大多數的 Linux 發行版本默認使用 SHA-512 算法來加密口令,在我所測試的 Ubuntu 10.10 和 Fedora 17 發行版本上均採用的是 SHA-512 加密算法。SHA-512 口令很容易辨認,因爲它們總是以 $6$ 開頭。在加密口令的過程中會隨機摻入“salt”,這樣一來,同一個口令可以對應許多不同的加密後的形式。如果"salt"是以"$id$"開頭的,例如:
那麼並非使用 DES 標準加密算法,而是使用 id 號所標識的加密算法,各個 id 所代表的加密算法如下表所示:
ID | 加密算法 |
---|---|
1 | MD5 |
2a | Blowfish(SUSE 發行版本所使用) |
5 | SHA-256 (since glibc 2.7) |
6 | SHA-512 (since glibc 2.7) |
所以 $5$salt$encrypted 代表的就是一個 SHA-256 加密串,而 $6$salt$encrypted 代表的是一個 SHA-512 加密串。
1.3 UID 號
UID 是 32 位無符號整數。然而,因爲和老系統之間的互操作性問題,我們建議在可能的情況下將站點上的最大 UID 號限制爲 32767(最大的 16 位有符號整數)。
按照定義,root 的 UID 號爲 0。大多數系統還定義虛擬用戶 bin、daemon 以及其他一些用戶。習慣上將這些虛擬登錄名放置在 /etc/passwd 文件的開關部分,並且給予它們比較小的 UID 號。爲了能夠給將來可能添加的任何非真實用戶提供足夠的空間,我們建議從 500(或更大)開始分配真實用戶的 UID 號。
1.4 默認的 GID 號
和 UID 類似,組的 ID 號是一個 32 位的整數。GID 0 是給名爲“root”的組保留的。GID 1 通常指的是名爲“bin”的組,GID 2 指的是“daemon”的組,但不一定總是這樣,在 Ubuntu 發行版本上,GID 1 指的是“daemon”組,GID 2 指的是“bin”組。
1.5 GECOS 字段
GECOS 字段通常用來記錄每個用戶的個人信息。它的語法定義不明確,GECOS 字段最初是用來保存登錄信息的,在把批處理作業從貝爾實驗室中的 UNIX 系統傳送到運行 GECOS(代表 General Electric Comprehensive Operating System)的大型機時需要這些登錄信息,現如今只留下了 GECOS 這個名字而已。
1.6 主目錄
當用戶登錄之後,他們的 shell 就進入到自己的主目錄中。如果在登錄時找不到用戶的主目錄,那麼系統會顯示諸如“no home directory”這樣的信息。如果把 /etc/login.defs 中的 DEFAULT_HOME 設爲 no,那麼就會禁止沒有主目錄的用戶登錄;否則會允許登錄,並且讓用戶處在根目錄下。
1.7 登錄 shell
雖然登錄 shell 一般是像 Bourne shell 或者 C shell(/bin/sh 或者 /bin/csh)那樣的命令解釋程序,但是它可以是任何程序。bash 是默認的 shell,如果 /etc/passwd 沒有指定一個登錄 shell,那麼就用它。
2 /etc/shadow 文件
只有超級用戶才能讀 /etc/shadow 文件,它用來保護加密口令的安全。在使用了隱蔽口令系統的情況下,/etc/passwd 文件中原來的口令字段一定要包含一個 x。
shadow 文件並不是 passwd 文件的超集,而 passwd 文件也不是從它產生的,管理員必須兩個文件都維護(或者使用諸如 useradd 這樣的工具來自行維護)。和 /etc/passwd 類似,/etc/shadow 文件也是給每個用戶一行,每行有 9 個用冒號分隔的字段:
- 登錄名
- 加密後的口令
- 上次修改口令的時間
- 兩次修改口令之間最少的天數
- 兩次修改口令之間最多的天數
- 提前多少天警告用戶口令即將過期
- 在口令過期之後多少天禁用賬號
- 賬號過期的日期
- 保留字段,目前爲空
唯獨要求非空的字段是用戶名和口令。/etc/shadow 中指定的絕對日期是從 1970 年 1 月 1 日至今的天數(不是秒數),這不是 UNIX 系統上估算時間的標準方法。一個典型的 shadow(隱蔽口令文件)看上去類似於:
2S6C.l16.XrbvP.2rmnZtZ4s1X.:15512:0:99999:7:::
系統管理員可以通過使用
查看上次修改口令的時間。也可以使用工具 pwconv 讓 shadow 文件的內容和 passwd 文件的內容保持一致,補上任何新加的用戶,刪除不在 passwd 中列出的用戶。pwconv 會用 /etc/login.defs 裏指定的默認值填充 shadow 文件裏大多數的隱蔽參數。
3 /etc/group 文件
/etc/group 文件包含了 UNIX 組的名稱和每個組中成員的列表。例如:
csstaff:x:100:lloyd,evi
student:x:200:dotty
每一行都代表了一個組,其中包含有 4 個字段;
- 組名
- 加密的口令或者包含一個 x 表明有一個 gshadow 文件
- GID 號
- 成員列表,彼此用逗號隔開(注意不要加空格)
在我所測試的發行版本中都配置有 /etc/gshadow 文件,它的概念和 /etc/shadow 文件類似,但是卻沒有那麼重要(組的口令很少使用)。
4 添加用戶
通常,添加一個新用戶的過程包含系統要求的 4 個步驟,兩個步驟用來爲新用戶建立一個有用的環境,還有其他幾個步驟用來爲管理員自己提供更多便利。系統所需的步驟:
- 編輯 /etc/passwd 和 /etc/shadow 文件,定義賬號
- 把用戶添加到 /etc/group 文件裏
- 使用 passwd 設置一個初始口令
- 創建用戶主目錄,用 chown 和 chmod 命令改變用戶主目錄的屬主和屬組
爲用戶所進行的步驟:
- 將默認的啓動文件複製到用戶的主目錄中
- 設置用戶的郵件主目錄並建立郵件別名
爲管理員準備的步驟:
- 覈實賬號是否設置正確
- 將用戶的聯繫信息和賬號狀態加入數據庫
您必須以 root 的身份來執行每一步驟,或者也可以使用諸如 sudo 這樣讓您以 root 身份來執行命令的程序。
4.1 創建用戶的主目錄
系統管理員創建的任何目錄最初都由 root 所有,所以必須使用 chown 命令修改它的屬主和屬組。下面這一系列命令將爲我們舉例的用戶創建一個合適的主目錄:
$ sudo chown tyler:staff /home/tyler
$ sudo chmod 700 /home/tyler
4.2 複製默認啓動文件
通過將配置文件放置到用戶的主目錄中,可以對一些命令和工具進行定製。啓動文件一般都是以圓點(.)開關,以字母 rc(“run command”的縮寫)結尾,這是 CTSS 操作系統留下的”遺蹟“。除非 ls 使用 -a 選項,否則開頭的圓點讓 ls 在顯示的目錄列表中不顯示這些文件,這些文件被認爲是”不感興趣的“。下表列出了一些常見的啓動文件:
命令 | 文件名 | 典型的用途 |
---|---|---|
bash | .bashrc | 設置啓動環境 |
vim | .vimrc | 設置 vim 編輯器的選項 |
emacs | .emacs | 設置 emacs 編輯器的選項 |
.mailrc | 定義個人郵件別名 |
如果還沒有一組不錯的默認啓動文件,那麼也可以使用發行版在 /etc/skel 下提供的文件,把它們作爲修改的起點。還要保證給新用戶的 umask 設置一個合理的值(建議採用 077、027 或者 022,具體是哪一個取決於站點的友好性和規模)。
5 刪除用戶
當某個用戶離開您的單位時,應該從系統中刪除該用戶的登錄賬號和文件。如果需要手工刪除一個用戶,可能需要對照下面的步驟來做:
- 將用戶從所有本地用戶數據庫中刪除
- 將用戶從 aliases 文件中刪除,或者添加一個轉發地址
- 刪除用戶的 crontab 文件和所有掛起的 at 作業
- 終止所有仍在運行的用戶進程
- 將用戶從 /etc/passwd, /etc/shadow, /etc/group 和 /etc/gshadow 文件中刪除
- 刪除用戶的主目錄
- 刪除用戶的郵件存儲文件
6 賬號管理工具
useradd 命令把用戶添加到 passwd 文件中去(如果可以的話還會添加到 shadow 文件中去)。它提供了一個命令行驅動的接口,很容易通過手工運行或從自制的 adduser 腳本調用。usermod 命令可以改變已有用戶在 passwd 文件中的條目。userdel 命令可以將用戶從系統中刪除,還可以刪除用戶的主目錄。groupadd、groupmod 和 groupdel 命令也可以對 /etc/group 文件進行操作。
例如,爲了用 useradd 命令(使用系統的默認設置)創建新用戶 hilbert,只需運行:
這條命令將在 /etc/passwd 文件中創建下面的項
需要說明的是,useradd 在口令字段中旋轉了一個星號,直到您指派一個真實的口令之前,它都能有效地禁用該賬號。
當給出其他參數的時候,useradd 往往會更有用。在下面的例子中,我們指定 hilbert 的主屬組爲“faculty”,而且還應該把他加入到“famous”組裏。我們也重新指定了默認的主目錄位置,如果目錄不存在,還要讓 useradd 創建它:
-G famous -m -s /bin/sh hilbert
這條命令在 passwd 文件中創建了這麼一條:
(指派的 UID 比系統上最大的 UID 大 1)在 shadow 文件中相應的項爲:
它還在 /etc/group 中將 hilbert 添加到“faculty”組和“famous”組中,還創建 /home/math/hilbert 目錄,並按照 /etc/skel 的山窩在這個目錄下增加若干初始配置文件。
usermod 命令用來修改已經存在的賬號,並且使用了很多和 useradd 命令一樣的標誌。例如,我們能夠使用下面的命令將 hilbert 賬號的作廢日期設爲 2013 年 7 月 4 日:
userdel 命令刪除用戶賬號,並且取消 useradd 命令所做的全部修改。要刪除 hilbert 這個賬號,我們可以使用下面的命令:
這條命令刪除了 passwd、shadow 和 group 文件中與 hilbert 相關的資料。默認情況下,它不會刪除 hilbert 的主目錄。-r 選項讓 userdel 也刪除用戶的主目錄。