Linux 學習筆記(六)添加用戶

賬號安全也是系統安全的一項關鍵性的決定因素。不常用的賬號,以及採用了很容易被猜中的口令的賬號,都是黑客攻擊的主要目標。在這一章裏,我們首先研究自動工具所實現的下層模型,然後介紹工具本身(useradduserdel等)。系統提供的默認工具 useradd 實際用起來相當不錯,應該能夠滿足站點的大多數需求。遺憾的是,useradd 卻沒有我們希望的那樣好。

1 /etc/passwd 文件

/etc/passwd 文件是系統能夠識別的用戶的一份清單。在用戶登錄期間,系統查詢這個文件,確定用戶的 UID 並驗證用戶的口令。這個文件中的每一行代表一個用戶,它包含 7 個由冒號分隔的字段。

  • 登錄名
  • 經過加密的口令或者口令佔位符
  • UID 號
  • 默認的 GID 號
  • “GECOS”信息:全名、辦公室、分機號、住宅電話
  • 主目錄
  • 登錄 shell

舉個例子:

bluebird:x:1000:1000:bluebird,,,:/home/bluebird:/bin/bash

下面各小節中將更詳細地討論 /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$"開頭的,例如:

$id$salt$encrypted

那麼並非使用 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。大多數系統還定義虛擬用戶 bindaemon 以及其他一些用戶。習慣上將這些虛擬登錄名放置在 /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(隱蔽口令文件)看上去類似於:

bluebird:$6$hfHk.lS7$7.9E6STv5GgasGrv5UkEgGRBeliMUV6aJ4elkYKcHcahxsRU6U1k9XIMKaQ
2S6C.l16.XrbvP.2rmnZtZ4s1X.:15512:0:99999:7:::

系統管理員可以通過使用

date -d "1970-01-01 15512 day GMT"

查看上次修改口令的時間。也可以使用工具 pwconvshadow 文件的內容和 passwd 文件的內容保持一致,補上任何新加的用戶,刪除不在 passwd 中列出的用戶。pwconv 會用 /etc/login.defs 裏指定的默認值填充 shadow 文件裏大多數的隱蔽參數。

3 /etc/group 文件

/etc/group 文件包含了 UNIX 組的名稱和每個組中成員的列表。例如:

wheel:x:10:trent,net,evi,garth,lynda,boggs,millert
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 設置一個初始口令
  • 創建用戶主目錄,用 chownchmod 命令改變用戶主目錄的屬主和屬組

爲用戶所進行的步驟:

  • 將默認的啓動文件複製到用戶的主目錄中
  • 設置用戶的郵件主目錄並建立郵件別名

爲管理員準備的步驟:

  • 覈實賬號是否設置正確
  • 將用戶的聯繫信息和賬號狀態加入數據庫

您必須以 root 的身份來執行每一步驟,或者也可以使用諸如 sudo 這樣讓您以 root 身份來執行命令的程序。

4.1 創建用戶的主目錄

系統管理員創建的任何目錄最初都由 root 所有,所以必須使用 chown 命令修改它的屬主和屬組。下面這一系列命令將爲我們舉例的用戶創建一個合適的主目錄:

$ sudo mkdir /home/tyler
$ 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 編輯器的選項
mail .mailrc 定義個人郵件別名

如果還沒有一組不錯的默認啓動文件,那麼也可以使用發行版在 /etc/skel 下提供的文件,把它們作爲修改的起點。還要保證給新用戶的 umask 設置一個合理的值(建議採用 077027 或者 022,具體是哪一個取決於站點的友好性和規模)。

5 刪除用戶

當某個用戶離開您的單位時,應該從系統中刪除該用戶的登錄賬號和文件。如果需要手工刪除一個用戶,可能需要對照下面的步驟來做:

  • 將用戶從所有本地用戶數據庫中刪除
  • 將用戶從 aliases 文件中刪除,或者添加一個轉發地址
  • 刪除用戶的 crontab 文件和所有掛起的 at 作業
  • 終止所有仍在運行的用戶進程
  • 將用戶從 /etc/passwd, /etc/shadow, /etc/group/etc/gshadow 文件中刪除
  • 刪除用戶的主目錄
  • 刪除用戶的郵件存儲文件

6 賬號管理工具

useradd 命令把用戶添加到 passwd 文件中去(如果可以的話還會添加到 shadow 文件中去)。它提供了一個命令行驅動的接口,很容易通過手工運行或從自制的 adduser 腳本調用。usermod 命令可以改變已有用戶在 passwd 文件中的條目。userdel 命令可以將用戶從系統中刪除,還可以刪除用戶的主目錄。groupaddgroupmodgroupdel 命令也可以對 /etc/group 文件進行操作。

例如,爲了用 useradd 命令(使用系統的默認設置)創建新用戶 hilbert,只需運行:

$ sudo useradd hilbert

這條命令將在 /etc/passwd 文件中創建下面的項

hilbert:*:105:20::/home/hilbert:/bin/bash

需要說明的是,useradd 在口令字段中旋轉了一個星號,直到您指派一個真實的口令之前,它都能有效地禁用該賬號。

當給出其他參數的時候,useradd 往往會更有用。在下面的例子中,我們指定 hilbert 的主屬組爲“faculty”,而且還應該把他加入到“famous”組裏。我們也重新指定了默認的主目錄位置,如果目錄不存在,還要讓 useradd 創建它:

$ sudo useradd -c "David Hilbert" -d /home/math/hilbert -g faculty \
-G famous -m -s /bin/sh hilbert

這條命令在 passwd 文件中創建了這麼一條:

hilbert:x:1005:30:David Hilbert:/home/math/hilbert:/bin/sh

(指派的 UID 比系統上最大的 UID 大 1)在 shadow 文件中相應的項爲:

hilbert:!:11508:0:99999:7:0::

它還在 /etc/group 中將 hilbert 添加到“faculty”組和“famous”組中,還創建 /home/math/hilbert 目錄,並按照 /etc/skel 的山窩在這個目錄下增加若干初始配置文件。

usermod 命令用來修改已經存在的賬號,並且使用了很多和 useradd 命令一樣的標誌。例如,我們能夠使用下面的命令將 hilbert 賬號的作廢日期設爲 2013 年 7 月 4 日:

$ sudo usermod -e 2013-07-04 hilbert

userdel 命令刪除用戶賬號,並且取消 useradd 命令所做的全部修改。要刪除 hilbert 這個賬號,我們可以使用下面的命令:

$ sudo userdel hilbert

這條命令刪除了 passwdshadowgroup 文件中與 hilbert 相關的資料。默認情況下,它不會刪除 hilbert 的主目錄。-r 選項讓 userdel 也刪除用戶的主目錄。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章