HOWTO:Linux Shadow Password

作者: Michael H. Jackson, [MAILTO] [email protected]

v1.3, 3 April 1996 翻譯日期: 15 MAY 2000

轉為 Wiki: Ping (ping 'at' pingyeh 'dot' net), 2003 年 11 月 27 日


這份文件主要描述如何取得,安裝和設定 Shadow Suite 密碼。它也描述取得和安裝需要存取使用者密碼之其他軟體和網路監控程式(network daemons)。這些其他軟體不是 Shadow Suit 的真實部分,但是這些程式將需要被重新編譯用以支援Shadow



  1. 簡介
    1. 更改上一版本部分
    2. 回覆
  2. 版權聲明(暫不翻譯)
  3. Miscellaneous and Acknowledgments.
  4. 為何 shadow 你的 passwd 檔?
    1. 為何您不要 shadow 你的 passwd 檔
    2. 格式化 /etc/passwd 檔
    3. 格式化 shadow 檔
    4. 回顧 crypt(3).
  5. 取得 Shadow Suite.
    1. Shadow Suite for Linux 的歷史(暫不翻譯)
    2. History of the Shadow Suite for Linux
    3. 如何取得 Shadow Suite?
    4. Shadow Suite包含什麼?
  6. 編譯程式
    1. 解壓縮
    2. 設定 config.h 檔
    3. 備份原始程式
    4. 執行 make
  7. 安裝
    1. 手邊準備一個開機片
    2. 移除複製的 man pages
    3. 執行 make install
    4. 執行 pwconv
    5. 重新命名 npasswd 和 nshadow
  8. 其他你需要升級(upgrade)或補強(patch)程式
    1. Slackware adduser 程式
    2. wu_ftpd Server
    3. 標準 ftpd
    4. pop3d (Post Office Protocol 3)
    5. xlock
    6. xdm
    7. sudo
    8. imapd (E-Mail [pine package])
    9. pppd (Point-to-Point Protocol Server)
  9. 將 Shadow Suite 放進來使用。
    1. 新增、修改和刪除使用者
      1. useradd
      2. usermod
      3. userdel
    2. passwd 指令和 passwd 老化
    3. login.defs 檔
    4. 群組密碼
    5. 檢查程式一致性
      1. pwck
      2. grpck
    6. Dial-up 密碼
  10. 加入 shadow 支援 C 語言
    1. 標頭檔(Header files)
    2. libshadow.a 函式庫(library)
    3. Shadow 結構(Structure)
    4. Shadow 函式(Functions)
    5. 範例
  11. 常問問題及答案

1. 簡介

這篇文章為 Linux Shadow-Password-HOWTO。 主要是在描述為何及如何於 Linux 系統加入 shadow 密碼支援。 其亦包括如何使用 Shadow Suite's 某些範例。

當進行 Shadow Suite 安裝及使用許多的 utility 程式時‧你必須以 root 權限簽入。 且進行 Shadow Suite 安裝時,系統軟體將被改變,因此強烈的建議您照說明檔備分程式。在此強調在您開始作業前需先閱讀及了解所有的說明書。

1.1. 更改上一版本部分

新增:

更正/修改:

1.2. 回覆

請將任何評語、修改或建議寄至: [WWW] Michael H. Jackson [email protected] 我會盡快回覆並更正該文件。如果你發現任何問題,請直接 email 給我,我會將此最新技術張貼於新聞群組。

2. 版權聲明(暫不翻譯)

The Linux Shadow Password HOWTO is Copyright (c) 1996 Michael H. Jackson.

Permission is granted to make and distribute verbatim copies of this document provided the copyright notice and this permission notice are preserved on all copies.

Permission is granted to copy and distribute modified versions of this document under the conditions for verbatim copies above, provided a notice clearly stating that the document is a modified version is also included in the modified document.

Permission is granted to copy and distribute translations of this document into another language, under the conditions specified above for modified versions.

Permission is granted to convert this document into another media under the conditions specified above for modified versions provided the requirement to acknowledge the source document is fulfilled by inclusion of an obvious reference to the source document in the new media. Where there is any doubt as to what defines 'obvious' the copyright owner reserves the right to decide.

3. Miscellaneous and Acknowledgments.

The code examples for auth.c are taken from pppd-1.2.1d and ppp-2.1.0e, Copyright (c) 1993 and The Australian National University and Copyright (c) 1989 Carnegie Mellon University.

Thanks to Marek Michalkiewicz [MAILTO] [email protected]> for writing and maintaining the Shadow Suite for Linux, and for his review and comments on this document.

Thanks to Ron Tidd [MAILTO] [email protected]> for his helpful review and testing.

Thanks to everyone who has sent me feedback to help improve this document.

Please, if you have any comments or suggestions then mail them to me.

regards

[WWW] Michael H. Jackson [email protected]>

4. 為何 shadow 你的 passwd 檔?

大部分目前 Linux 發行版本預設值並未包含Shadow Suite 安裝。 這些版本包括 Slackware 2.3, Slackware 3.0 和其他受歡迎的發行版本。 主要原因之一是在原始Shadow Suite版權聲明中並未很清楚的描述該軟體是 否需使用者付費。 Linux 使用 GNU 版權通常允續使用者可免費且任意使用相關套件。

Shadow Suite現在維護人員 [WWW] Marek Michalkiewicz [email protected]> 已經可以從在 BSD 樣式允需再使用版權之原始作者那接收原始碼。 目前版權發行已 解決,因此可以預期在未來版本之預設值將包括 password shadowing。 即使如此, 你仍需要自行安裝。

如果你的版本是從 CD-ROM 安裝。你可能發現即使目前版本並未有Shadow Suite 安裝,但你仍然可以在該片 CD-ROM 找到你需要安裝的Shadow Suite。

然而,所有Shadow Suite 3.3.1, 3.3.1-2 版本和 shadow-mk 伴隨簽入(login)程式和 其他suid root程式均有安全上問題,因此不應該使用太久。

所有必要檔案均可以透過匿名 FTP 站或網站找到。

在沒有安裝Shadow Suite的 Linux 系統,包括密碼的帳號使用者資訊通常儲存在 /etc/passwd 檔。 儲存的密碼為 加密(encrypted)格式。 然而,如果你問一個密碼專家,他/她將 告訴你真正的密碼檔只是編碼(encoded)而不是加密格式,因為當使用 crypt(3) 時,文字檔倍設為 null 且密碼是鍵值(key)。 因此,接下來我將在這篇文件中使用 編碼。

使用在密碼欄位編碼的演算法於技術上是使用one way hash function。這是一個 在單一方向計算簡單但逆向計算非常困難的演算法。關於這正確的演算法可以在 2.4 節或 於 crypt(3) 操作手冊找到。

當使用者挑選或指定一個密碼,系統將隨機產生一個值,叫做salt,將密碼進行 編碼。 這表示任何特定的密碼可以 4096 中不同方法儲存。 salt 值將儲存被編 碼的密碼 。

當使用者簽入或提供一個密碼, salt 首先接收欲儲存編碼密碼。然後這提供密碼 會和 salt 值一起編碼,且比較已經編碼密碼。如果有 match ,該使用者通過權限檢查。

隨機編碼和復原原始密碼是有計算複雜度的(但不是不可能的)。然而,在某些系統 很多使用者的密碼都設為一般文字(或是一般文字的簡單變化)

系統駭客知道這件事,且將簡單的加密文字和一般使用4096 salt 值密碼之目錄。然 後他們將比較在資料庫之 /etc/passwd 檔之編碼密碼,只要他們找到一個比對,他們 可以找到一個帳號之密碼。這和dictionary attack有關,且用於未經許可存取系統取 得和展開常用的方法之一。

如果你想過一個 8 碼的密碼編碼成 4096 * 13 碼的字串,那麼一個用在描述 400,000 一般文字 、名字、密碼和簡單變化的字典將需要 4GB 硬碟存取空間。 駭客需要做的只是分類字串跟檢查 比對結果。 自從 4GB 硬碟可以以美金 1000.00 以下買到後,對大多數系統駭客的意義可想而 知 。

如果駭客首先發現你的 /etc/passwd 檔,他們只需要將真正包含在 /etc/passwd 檔 salt 值的字典編碼,這方法可由擁有486級電腦或幾個有 幾百 MB 硬碟空間的十來歲的小孩適用。

即使沒有很大的磁碟空間,像 crack(1) 的工具程式通常可以在足夠使用者系統中至少破解一對 密碼(假設系統使用者倍允許挑選他們想要的密碼)。

/etc/passwd 檔也包括一些相關資訊,像使用者 ID 和群組 ID所使用的系統程式;因此 /etc/passwd 檔 必須 保持全世界可讀性. 如果你改變 /etc/passwd 檔以致於沒有人可以讀取,你將發現的第一件事是 ls -l 命令將取代名稱而顯示使用者 ID 。

Shadow Suite 透過將密碼存至另一個檔(通常是 /etc/shadow 檔)來解決該 問題。 /etc/shadow 檔對任何人設定可讀檔,只有 root 權限可以讀寫 /etc/shadow 檔。某些程式(像 xlock)不需要改變密碼,只需要確認密碼即可。這些程式 可以以 suid root 執行或者你可以設定一個群組 shadow 用來唯讀 /etc/shadow 檔,然後這些程式可以執行 sgid shadow。

透過移動密碼至 /etc/shadow 檔,我們可以有力的備有駭客從存取編碼密碼到執行 dictionary attack 的證據。

除此之外, Shadow Suite 新增許多特色:

安裝 Shadow Suite 貢獻為有更安全系統,但是還有其他方法可以改善 Linux 系統的安全 ,且最終將有一系列的 Linux 安全 HOWTO's 將討論其他安全基準和相關文件版本‧

針對目前其他 Linux 安全文件資訊,請參照網址: [WWW] Linux Security home page.

4.1. 為何您不要 shadow 你的 passwd 檔

有一些狀況跟設定運用在安裝 Shadow Suite 將 不是 好主意:  There are a few circumstances and configurations in which installing the Shadow Suite would NOT be a good idea:

4.2. 格式化 /etc/passwd 檔

一個 non-shadowed /etc/passwd 檔格式如下所示:

其中

username

使用者(簽入)名稱

passwd

編碼密碼

UID

使用者編號

GID

預設存組編號

full_name

使用者全名 - 事實上這個欄位稱作 GECOS (General Electric Comprehensive Operating System) 欄位且可以儲存全名外的資訊。Shadow commands and manual pages refer to this field as the comment field.

directory

使用者根目錄 (絕對路徑)

shell

使用者簽入的環境 (絕對路徑)

舉例說明:

已編碼的 salt/password 就像 kbeMVnZM0oL7I 且這兩個字串是一樣的密碼。對相同 密碼可能有 4096 種可能的編碼。(本範例的密碼是 "passwaor",這是比較 不好 的密碼)。

只要 shadow suite 已經安裝, /etc/passwd 檔將被替代成:

本範例之第二欄位 x 現在只是一個 place holder。 /etc/passwd檔的格式 並未真的改變,只是不再包含 編碼密碼。這表示任何程式可以讀取 /etc/passwd 檔,但並不真的需要確認密碼是不是正確地運作。

這些密碼現在被重新放在 shadow 檔(通常是在 /etc/shadow 檔)。

4.3. 格式化 shadow 檔

/etc/shadow 檔包括下列資訊:

其中

username

使用者名稱

passwd

編碼密碼

last

密碼上次更動日期,以從1970年1月1日算起的天數代表

may

密碼改變前天數

must

密碼最常使用天數

warn

代表期限前幾天就事先警告使用者

expire

超過密碼過期天數後,就關閉該帳號

disable

帳號關閉,以從1970年1月1日算起的天數代表

reserved

預備欄位

依照之前範例將變成:

4.4. 回顧 crypt(3).

從 crypt(3) 使用者文件得到:

crypt 是密碼加密方程式。 It is based on the Data Encryption Standard algorithm with variations intended (among other things) to discourage use of hardware implementations of a key search.

[The] key 是使用者輸入的密碼。 [編碼字串全是 NULLs]

[The] salt 是從 [a-zA-Z0-9./] 集合中選出的兩個位元字串。 該字串是用於擾亂在 4096 種不同方法之一個演算法。

透過得到 key 的每個位元的最低 7 bit[s],可以建立 56-bit key 。 這56-bit key 是用在重複加密一個常數字串(通常是包含所有靈的字串)。 傳回值指到加密密碼是一連串 可印出之13個 ASCII 字元(最前面的一兩個字元表示 salt 本身)。 透過每次的呼叫可將 傳回直指到靜態資料。

警告訊息: Key space 包括 2**56 即等於 7.2e16 可能的值。與用重大的平行電腦 將 Key space 極盡的搜尋是可能。像 crack(1) 軟體用來搜尋部分的由人 產生之密碼的 key space 是可獲得的。因此,密碼的選擇至少應該避免使用一般字及名字。 一個用來檢查解開密碼選擇的 passwd(1) 程式使用是值得推薦的。

DES 演算法本身有一些使 crypt(3) 在任何其他密碼權限區隔介面很差選擇的使用 方面劇變。如果你計畫使用 crypt(3) 介面來加密計畫,以下描述千萬別這麼作: 得要一本加密好書和廣泛獲得 DES 程式庫 . 一起使用。

大多 Shadow Suites 包括 16 位元的密碼長度兩倍之原始碼。 在 des 專 家建議避免使用當開始對較常密碼先簡單的編碼左半然後右半。由於 crypt 運作方法 ,這將造成 較差的 安全編碼密碼。除此之外,使用者有可能記住 16 位元密碼是 一件比較差的事情。

目前有允許權限理論用以取代某些更安全和支援較長密碼(例如 MD5 演算法)且保有和 crypt 方法相容的發展工作正在進行。

如果你正在尋找一本加密的好書,建議如下:

5. 取得 Shadow Suite.

5.1. Shadow Suite for Linux 的歷史(暫不翻譯)

5.2. History of the Shadow Suite for Linux

DO NOT USE THE PACKAGES IN THIS SECTION, THEY HAVE SECURITY PROBLEMS

The original Shadow Suite was written by John F. Haugh II.

There are several versions that have been used on Linux systems:

The shadow-mk package contains the shadow-3.3.1 package distributed by John F. Haugh II with the shadow-3.3.1-2 patch installed, a few fixes made by [WWW] Mohan Kokal [email protected]> that make installation a lot easier, a patch by Joseph R.M. Zbiciak for login1.c (login.secure) that eliminates the -f, -h security holes in /bin/login, and some other miscellaneous patches.

The shadow.mk package was the previously recommended package, but should be replaced due to a security problem with the login program.

There are security problems with Shadow versions 3.3.1, 3.3.1-2, and shadow-mk involving the login program. This login bug involves not checking the length of a login name. This causes the buffer to overflow causing crashes or worse. It has been rumored that this buffer overflow can allow someone with an account on the system to use this bug and the shared libraries to gain root access. I won't discuss exactly how this is possible because there are a lot of Linux systems that are affected, but systems with these Shadow Suites installed, and most pre-ELF distributions without the Shadow Suite are vulnerable!

For more information on this and other Linux security issues, see the [WWW] Linux Security home page (Shared Libraries and login Program Vulnerability)

5.3. 如何取得 Shadow Suite?

目前建議 Shadow Suite 版本目前還是 BETA 測試版,然後,最近版本在生產環境 是安全的且沒有包含易受攻擊的 簽入(login) 程式。

該套件(package)使用慣例命名為:

其中 YYMMDD 是Suite 的發行日期。

目前 BETA 測試版本是 Version 3.3.3 ,且由 [WWW] Marek Michalkiewicz [email protected]> 維護。

還可以從該處得到: [WWW] shadow-current.tar.gz.

下列網站也可以找到相關資訊:

你應該可以獲得目前最新的版本。

你應該不要是用比 shadow-960129 更舊版本,因為它們有 簽入 的安全問題。

於參考資料方面,我用 shadow-960129 檔進行安裝介紹。

如果你之前使用 shadow-mk ,你應該更信這個版本且重建編譯。

5.4. Shadow Suite包含什麼?

Shadow Suite 包括對下列功能之替代程式:

su, login, passwd, newgrp, chfn, chsh, and id

該套件還包括新程式:

chage, newusers, dpasswd, gpasswd, useradd, userdel, usermod, groupadd, groupdel, groupmod, groups, pwck, grpck, lastlog, pwconv, and pwunconv

除此之外,函式庫: libshadow.a 也包括需要存取使用者密碼之寫和編譯程式。

程式之操作手冊也包含在其中。

也有對簽入程式的 configuration file ,它將被安裝在 /etc/login.defs 檔。

6. 編譯程式

6.1. 解壓縮

在接收套件後第一個步驟就是 unpacking。該套件是 tar 檔案格式使用 gzip 壓縮 ,所以首先將該檔案移到 /usr/src ,然後輸入:

這將會 unpack 到一個目錄:/usr/src/shadow-YYMMDD

6.2. 設定 config.h 檔

第一件事是你需要複製 Makefile 和 config.h 檔:

然後你應該留意 config.h 檔。 該檔案包括某些設定選項的定義。如果你使用 建議 套件,我建議你在第一次設定關掉 group shadow support。

shadowed group passwords 預設值是開啟的。 在 config.h 檔關到這個設定, 且改變 #define SHADOWGRP 變成 #undef SHADOWGRP。我建議您一開始 關掉它們,然後如果你真的需要 group passwords 和 group administrators 時你在 開啟它們和重新編譯。 如果你開啟它, 你 必須 建立 /etc/gshadow 檔。

開啟長密碼的選項也不建議使用。

不要 改變 #undef AUTOSHADOW 的設定。

AUTOSHADOW 選項初始設計是用以讓 shadow 可以像 function 一樣執行。理論上 聽起來不錯,但是沒辦法正確的運作。 如果你開啟這個選項,且這個程式以 root 權限在執 行, 它會像 root 權限執行一項呼叫 getpwnam() ,然後變更 /etc/passwd 檔 (有no-longer-shadowed 密碼)。 這類程式包括 chfn 和 chsh。(如果 root 在呼叫 getpwnam() 之前使用 chfn 和 chsh,使用者帳號將 沒有辦法真實且有效交易。)

如果你要建立 libc,同樣的警告也有效,它有個 SHADOW_COMPAT 作相同的事。 它 不應該被使用!如果你開始從你的 /etc/passwd 檔擷取編碼密碼, 這會是個問題。

如果你正使用比 4.6.27 還高的 libc 版本,你將需要在 config.h 和 Makefile兩個檔做很多改變。 在 config.h 檔的編輯和改變: 從:

到:

然後在 Makefile 檔的改變:

這些包含在 basename.c 程式碼的改變均需倍包括在 libc 4.6.27 內。

6.3. 備份原始程式

在 shadow suite 要更新時,製作程式備份將是一個很好的點子。在 Slackware 3.0 系統中, 這些檔案是:

這 BETA 套件已經有個 儲存 在 Makefile 的目的檔,但是 因為不同的版本通常將程式放在不同的地方,因此常被人評論。

你應該備份你的 /etc/passwd 檔,但是你要很小心地命名,不然如我你將它放在 相同目錄,你將無法重寫 passwd 命令。

6.4. 執行 make

你需要以 root 權限簽入以執行安裝程序.

執行 make 來編譯套件中的執行檔:

你可能會看到警告語: rcsid defined but not used. 這沒關係, 因為作者使用版本控制套件才會發生。

7. 安裝

7.1. 手邊準備一個開機片

如果真的發生嚴重錯誤,有個開機磁片之有用的。如果你要 boot/root 合併的安裝,你可以 參考 [../Bootdisk-HOWTO/ Bootdisk-HOWTO] 以製作 root 開機之開機片。

7.2. 移除複製的 man pages

你也應該將操作手冊更新,即使你很厲害到足以不用備份安裝 Shadow Suite,你仍然要將 將舊的操作手冊移除,因為新版的操作手冊無法正常的覆蓋舊版本。

你可以使用一個組合: man -aW 命令 和 locate 命令 尋找需備移除 的操作手冊。在你執行 make install 前找出較舊版本比較容易。

如果你使用 Slackware 3.0 版本,然後你要移除的操作手冊是:

在 /var/man/cat[1-9] 次目錄也有相同的名字需要被刪除。

7.3. 執行 make install

現在你已經準備要輸入: (以 root 權限執行)

這將安裝最新和更新程式且修復檔案許可權。它也會安裝操作手冊。

這也將在安裝時考慮將 Shadow Suite 包含檔案放在正確的位置 /usr/include/shadow 。

使用 BETA 套件,你需要手動複製 login.defs 這個檔到 /etc 這個目錄下, 而且要確認只有 root 權限可以改變它。

這個檔案是 簽入 程式的 configuration file。 你應該檢查跟確定這個檔的改變狀況。 這是你決定哪個 tty 的 root 可以從哪裡簽入和設定其他安全方針的地方(像預設密碼的到期日)。

7.4. 執行 pwconv

接下來的步驟是執行 pwconv。 這也需以 root執行且最好在 /etc 目錄下執行:

pwconv 擷取你的 /etc/passwd 檔且刪除某些欄位為了建立兩個檔案: /etc/npasswd 和 /etc/nshadow.

一個 pwunconv 也提供你建立一個 /etc/passwd 和 /etc/shadow 組合的正常 /etc/passwd 檔案。

7.5. 重新命名 npasswd 和 nshadow

現在你已經執行 pwconv ,而且你已經建立 /etc/npasswd 和 /etc/nshadow 檔案。這需要複製到 /etc/passwd 和 /etc/shadow 檔。 我們也需要複製原始 /etc/passwd 檔,而且確定只有 root 可以讀它。 我們將該檔案放在 root 得根目錄:

你也應該確定檔案的擁有者跟存取權限是正確的。 如果你將要使用 X-Windows , xlock 和 xdm 可能需要讀取 shadow 檔(但需不要寫入該檔)。

有兩個方法可以做。 你可以設定 xlock 的 suid 是 root (xdm 通常以 root 權限執行)。 或者你可以使 root 成為 shadow 的群組可以擁有 shadow 檔 ,但是在作這之前,要確定你已經有個 shadow group (可以在 /etc/group 檔看到)。 不應改有任何使用者真的在 shadow group 。

你的系統現在有 shadow 的密碼檔囉。 你現在 應該 重開一個終端機視窗和確認你 可以簽入(login)。

請馬上確實的作這件事!

如過你不能,可能某些事情有錯誤囉! 為了要回到 to a non-shadowed 狀態,請作下列步驟:

你將重新儲存這些檔案到先前你儲存它們的正確位置。

8. 其他你需要升級(upgrade)或補強(patch)程式

即使 shadow suite 對大部分需要存取密碼檔的程式可以包含更新程式,但是仍有一些需要 存取密碼檔的額外程式在系統中。

如果你正執行 Debian 版本 (或者即使你不是),你可以找到 Debian 需要 rebuild 的原始碼: [WWW] ftp://ftp.debian.org/debian/stable/source/

這節剩餘的部分在討論更新 adduser, wu_ftpd, ftpd, pop3d, xlock,xdm 和 sudo 程式以便於讓這些程式支援 shadow suite。

請看 Adding Shadow Support to a C program 這節,主要是在 討論如何將 shadow 支援放到其他需要程式(雖然這些程式需要以 SUID root 執行或 SGID shadow 需正確存取 shadow 檔)。

8.1. Slackware adduser 程式

Slackware 版本包含一個新增使用者的交互程式叫做 [WWW] /sbin/adduser。能夠在網路上找到該程式的 shadow 版本。

我很鼓勵你使用 Shadow Suite 供應的程式(例如useradd, usermod, 和 userdel) 來取代 slackware 的adduser 程式。 它們只需花一點時間學習 ,但是它將值得的,因為你可以看到更多控制和在正確展現鎖住 /etc/passwd 和 /etc/shadow 的檔案(adduser 就沒有辦法囉)。

參考 Putting the Shadow Suite to use 該節得到更多相關資訊。

但是如果你已經擁有囉,接下來是你要做的部分:

8.2. wu_ftpd Server

大部分的 Linux 系統都有 wu_ftpd server。 如果你的版本沒有附帶 shadow 安裝, 那麼你的 wu_ftpd 就沒有辦法對 shadow 編譯。 wu_ftpd 是從 inetd/tcpd 開始且以 root 權限執行的程式。 如果你正在跑一個舊版的 wu_ftpd daemon, 無論如何你將要更新它因為較舊版本有 bug 將危及 root 權限。(參考 [WWW] Linux security home page 得到更多相關資訊)。

幸運的是你只需要取的有嵌入 shaow 的原始碼和重新編譯就可以囉!

如果你不是正在執行 ELF 系統, wu_ftp server 可以從 Sunsite 網址 [WWW] wu-ftp-2.4-fixed.tar.gz 找到。

當你獲得這個 server,把它放在 /usr/src目錄,然後輸入:

然後編輯 ./src/makefiles/Makefile.lnx,和改變

這一行到:

現在你已經準備好執行 script 建立跟安裝:

這是用在 Linux shadow configuration file、編譯和安裝 server。

在我的 Slackware 2.3 系統,我也需要在執行前作下列步驟:

build:

在 ELF 系統下會有編譯問題的報告,但是下一版的 Beta 版則可以正確的執行。 可以從 [WWW] wu-ftp-2.4.2-beta-10.tar.gz 找到。

當你獲得這個 server,把它放在 /usr/src目錄,然後輸入:

然後編輯 config.lnx,和改變:

這一行到:

然後,

且編輯 Makefile.lnx 檔和改變

這一行到:

然後建立(build)和安裝(install):

註:你應該檢查你的 /etc/inetd.conf 檔來確認你的 wu.ftpd server 是不是真的活著。 有些版本可能將 server daemons 放在不同的地方或用不同的名字表示。

8.3. 標準 ftpd

如果你正在執行標準的 ftpd server,我將建議你更新 wu_ftpd server。 離開上述的 bug ,系統會比較安全。

如果你堅持在標準模式,或者你需要 NIS 支援,在 Sunsite [WWW] ftpd-shadow-nis.tgz 有參考資料。

8.4. pop3d (Post Office Protocol 3)

如果你需要支援第三版 Post Office Protocol (POP3),你將需要重新編譯 pop3d 程式。 pop3d 可以透過 inetd/tcpd 以 root 權限正常的執行。

從 Sunsite 有兩個版本可以獲得: [WWW] pop3d-1.00.4.linux.shadow.tar.gz[WWW] pop3d+shadow+elf.tar.gz

這兩個都很簡單可以安裝。

8.5. xlock

如果你安裝 shadow suite,然後執行 X Windows System 和 lock 螢幕沒以更新你的 xlock 檔, 你將必須使用 CNTL-ALT-Fx 去切換 另一個 tty,簽入(login)和殺掉(kill) xlock process (或使用 CNTL-ALT-BS 殺掉 X server)。 很幸運的這也很容易可以更新你的 xlock 程式。

如果你正執行 XFree86 Versions 3.x.x,且正正確使用 xlockmore (是一個很棒的螢幕保護程式). 這個套件支援 shadow,只要重新編譯即可。如果你有任何較老的 xlock 版本,我建議你更新下列版本:

[WWW] xlockmore-3.5.tgz

基本上這是你所要的。

擷取 xlockmore-3.7.tgz ,並將它放在 /usr/src 目錄並解壓縮:

編輯這個檔: /usr/X11R6/lib/X11/config/linux.cf, 和改變

然後建立可執行檔:

然後搬移所以檔案到正確目錄且更新檔案擁有者及執行權限:

你的 xlock 將可以正確的運作囉!

8.6. xdm

xdm 是一個可以表示在 X-Windows 簽入畫面的程式。某些系統開始 xdm 當系統被告知道一個特定的執行水準(參考 /etc/inittab)。

伴隨著 Shadow Suite 安裝, xdm 需要被更新。 很幸運的這也很容易可以更新你的 xdm 程式。

[WWW] xdm.tar.gz

擷取 xdm.tar.gz 檔並將它放在 /usr/src目錄然後解壓縮:

編輯這個檔: /usr/X11R6/lib/X11/config/linux.cf,且改變

然後建立可執行檔:

然後搬移所有檔案正確目錄:

xdm 以 root 權限在執行,所以你不需要改變檔案存取權限。

8.7. sudo

sudo 程式允許系統管理員讓使用者可以以 root 權限正常的執行程式。 這是非常方便的因為它可以限制管理者執行 root 帳號本身權限,還可以允許使用者作 像 mounte drives 的事情。

sudo 需要讀取密碼因為在執行時需確認使用者密碼。 sudo 已經執行 SUID root, 所以存取 /etc/shadow 黨不是問題。

也能取得 [WWW] sudo 支援 shadow suite 。

警告:當你安裝 sudo 你的 /etc/sudoers 檔將取代預設值,所以你 需要備份原始程式。如果你有家任何設定在預設程式,你可能要編輯 Makefile 且移除複製該檔到 /etc 的這行。

該套件已經對 shadow 進行設定,所以只要重新編譯該套件即可 (把它放在 /usr/src 目錄):

8.8. imapd (E-Mail [pine package])

imapd 是一個像 pop3d 的 email server。 imapd 隨著 Pine E-mail 套件發生。 其操作手冊在介紹該套件時即包含 shadow 支援。然而,我發現這不全然正確。 再加上在編譯時加上 libshadow.a 函式庫 和該套件結合 build script / Makefile 是非常不容易的。所以對 imapd 加入 shadow 支援是不太可能的。

如果有任何答案,可以 Email 給我,我會將該解答放到這裡。

8.9. pppd (Point-to-Point Protocol Server)

pppd server 可以使用幾種權限設定: Password Authentication Protocol (PAP) 和 Cryptographic Handshake Authentication Protocol (CHAP)。 pppd server 從 /etc/ppp/chap-secrets 和/或 /etc/ppp/pap-secrets 檔讀取密碼字串。 如果你正使用預設 pppd 的執行,就沒有必要再重新安裝 pppd 。

pppd 以允許你使用 login 參數。 如果 login 選項被選取, pppd 將使用 /etc/passwd 檔的帳號密碼給 PAP. 當然在不久密碼檔會是 shadowedm。pppd-1.2.1d 檔已經加入對 shadow 的支援。

下一節加入支援 shadow 的範例是針對 pppd-1.2.1d (一個較老版本的 pppd).

pppd-2.2.0 版就已經包括 shadow 支援囉。

9. 將 Shadow Suite 放進來使用。

這節描述你需要知道有些程式在安裝時就已經有 Shadow Suite。 大部分的資訊在操作手冊可以找到。

9.1. 新增、修改和刪除使用者

Shadow Suite 新增下列指令用來新增、修改和刪除使用者。 這也是可以安裝 adduser 程式。

9.1.1. useradd

useradd 使令可用在系統中新增使用者。 你也可以採用此指令來改變預設字串。

你應該做的第一件事是檢查預設值設定和針對你的系統進行改變:

預設值不全是你要的,所以如果你開始新增使用者,你必須詳閱每個使用者資訊。 而且,我們可能和應該改變設定值。

在我的系統上:

為了這些改變,我要使用:

現在執行 useradd -D 將得到:

儘管依照你需要修改,預設值將存在 /etc/default/useradd.

先在你可以使用 useradd 來新增系統使用者。舉例說明,新增一使用者 fred 使用預設值方式如下:

這將在 /etc/passwd 檔中的一行建立如下:

且在 /etc/shadow 檔中的一行建立如下;

fred的根目錄將被建立且 /etc/skel 的內容將被複製因為指令句中有 -m 設定。

因為我們並未詳述 UID,系統會直接尋找下一個可獲得的編號。

fred的帳號被建立囉,但是 fred 仍然不能簽入直到我們不再鎖住(unlock)這個帳號。 透過更改密碼完成 unlock 帳號,方法如下:

現在 /etc/shadow 檔將包含:

且 fred 將可以簽入和使用該系統。 useradd 和其他附帶 Shadow Suite 比較好的地方是可以自動改變 /etc/passwd 和 /etc/shadow 。 所以如果你正在新增一個使用者, 且另一個使用者正在更改密碼,這兩個操作都可以正確的執行。

你使用提供的指令比直接存取 /etc/passwd 和 /etc/shadow 檔還好。 如果你正編輯 /etc/shadow 檔,且有個使用者在你編輯時要改變他的密碼, 然後你儲存編輯結果,這個使用者的密碼將會遺失掉。

這裡是使用 useradd 和 passwd 新增使用者的一些 interactive script :

新增使用者是用 script 比直接編輯 /etc/passwd / /etc/shadow 檔或使用 像 Slackware 的 adduser 程式還要好。

需要更多 useradd 資訊請參照線上操作手冊。

9.1.2. usermod

usermod 程式是用在修改使用者資訊。 它的參數使用和 useradd 程式類似。

如果你要更新 fred 的 shell,你要作下列步驟:

現在 fred 的 /etc/passwd 檔將變成:

如果要使 fred 的帳號到期日為 09/15/97:

現在 fred 在 /etc/shadow 的欄位變成:

需要更多 usermod 資訊請參照線上操作手冊。

9.1.3. userdel

userdel 用在刪除使用者,使用方法為:

-r 參數可以將該使用者根目錄全部移除。位在期待目錄的檔案則需手動移除。

如果你只是要簡單的鎖住帳號而沒有要刪除它,建議你使用 passwd 指令。

9.2. passwd 指令和 passwd 老化

passwd 指令很明顯使用在改變密碼,除此之外, 可由 root 使用在:

舉例說明,如果要鎖死 fred 帳號:

這表示 fred 的密碼是有效的,它在 03/04/96 被修改且任何時間都可被修改 , fred 將不會收到警告且帳號將不會因密碼到期而關閉。

這表示如果 fred 在密碼到期後簽入,它將被要求用一個新密碼簽入。

如果我們決定要警告 fred 在密碼過期前 14 天,且讓它的帳號在到期後14天警告, 我們需要作下列步驟:

現在 fred 改變為:

需要更多 passwd 資訊請參照線上操作手冊。

9.3. login.defs 檔

/etc/login 檔是對 login 程式的 configuration file 且 對 Shadow Suite。

/etc/login 包含從預設值密碼改變的驅動設定。

/etc/login.defs 檔是一個很好的文件檔,然而仍有些事情要注意:

跟去上述你可以發現這是一個重要檔,且你應該確認目前設定及你將對你系統的設定內容。

9.4. 群組密碼

/etc/groups 檔包括允許是用者存取群組之密碼。 如果你定義 SHADOWGRP 在 /usr/src/shadow-YYMMDD/config.h 檔將開啟該功能。

如果你定義該常數且編譯它,你需建立一個 /etc/gshadow 檔來保存群組密碼 和群組管理者資訊。

當你建立 /etc/shadow。你使用一個呼叫程式叫做 pwconv, 該程式不會建立 /etc/gshadow 檔,但是這沒關係,只要你自行建立即可。

為了建立起始 /etc/gshadow 檔要執行下列步驟:

每次你建立一個新群組,它們會被加到 /etc/group 和 /etc/gshadow 檔。 如果你透過新增或移除使用者來修改群組或改變群組密碼,/etc/gshadow 檔都將被改變。

groups, groupadd, groupmod, 和 groupdel 程式是用來供應 Shadow Suite 部分可以變更群組。

/etc/group 檔格式如下:

其中:

groupname

The name of the group

!

The field that normally holds the password, but that is now relocated to the /etc/gshadow file.

GID

The numerical group ID number

member

List of group members

/etc/gshadow 檔格式如下:

其中:

groupname

The name of the group

password

The encoded group password.

admin

List of group administrators

member

List of group members

gpasswd 指令是用在新增或移除管理者和群組成員。 root 或其他在 群組管理者人員可新增或移除群組成員。

群組密碼可以透過 passwd 指令改變,需透過 root 或在該群組管理者有權限的帳號方可修改。

Despite the fact that there is not currently a manual page for gpasswd, typing gpasswd without any parameters gives a listing of options. It's fairly easy to grasp how it all works once you understand the file formats and the concepts.

9.5. 檢查程式一致性

9.5.1. pwck

pwck 程式提供在 /etc/passwd 和 /etc/shadow 檔的一致性檢查。 它將檢查每個使用者名稱且依照下列步驟確認:

它也會警告沒有密碼的帳號。

在安裝 Shadow Suite 後執行 pwck 是一個很好的點子。 它也可以每週或每月週期性的執行。 如果你使用 -r 參數,你可以用 cron 來執行且收到電子郵件報告

9.5.2. grpck

grpck 檢查 /etc/group 和 /etc/gshadow 檔一致性的程式。 它作下列檢查:

它也有 -r 參數自動產生報表。

9.6. Dial-up 密碼

Dial-up 密碼是另一個對系統防禦的選項列,該系統允許撥接存取。 如果你有一個系統允許許多人區域網路連結,但是你想限制撥接的權限,那你需使用 dial-up 密碼。 為了要開啟 dial-up 密碼,你必須編輯 /etc/login.defs 檔且確定將 DIALUPS_CHECK_ENAB 設定為 yes.

有兩個檔案包括 dial-up 資訊, /etc/dialups 包括 ttys (one per line, with the leading "/dev/" removed)。 如果 tty 有被列出, dial-up 表示已經被檢查。

第二個檔是 /etc/d_passwd 。 這個檔包括 shell 全部合法路徑名稱。

如果以個使用者簽入一條列在 /etc/dialups 的線(line),且他的 shell 被列在 /etc/d_passwd 檔,他將被允許存取透過提供正確的密碼。

另一個使用 dial-up 密碼的目的是設定指允許某些形式連結的線(可能是PPP 或 UUCP 連結)。 如果一個使用者試著得到另一種形式連結 (i.e. a list of shells),他必須知道使用這條線的密碼。

在你可以在未來使用 dial-up 前,你密需建立一些檔案。

dpasswd 指令提供對在 /etc/d_passwd 檔的 shells 指派密碼。 可以看操作手冊的到更多資訊。

10. 加入 shadow 支援 C 語言

新增支援 shadow 程式事實上是很直接的。 唯一的問題是程式需要以 root (或 SUID root) 權限執行,這樣才可以存取 /etc/shadow 檔。

這顯示一個大問題: 當建立 SUID 程式時需要很小心依照程式運作。舉例說明: 如果以個 程式有 shell escape,如果程式本身是 SUID root 將不需要以 root 方式呈現。

對程式新增支援 shadow 而言,它可以檢查密碼,但不需以 root 權限執行,而是以 SUID shadow 取代執行比較安全。 xlock 程式就是一個例子。

接下來範例介紹, pppd-1.2.1d 已經以 SUID as root 方式執行,所以新增 shadow 支援應該不會使程式產生任何影響。

10.1. 標頭檔(Header files)

標頭檔應存在 /usr/include/shadow。 應該有一個 /usr/include/shadow.h檔, 但是它將 symbolic link 到 /usr/include/shadow/shadow.h。

為了新增支援 shadow 程式,你需要 include 標頭檔:

10.2. libshadow.a 函式庫(library)

當你安裝 Shadow Suite, libshadow.a 檔被建立和安裝在 /usr/lib 目錄。

當編譯一個 shadow support 程式,linker 需要包括 libshadow.a 函式庫進入鏈結。

執行如下:

然而,就像我們接下來要看的例子,大部分大程式使用 Makefile 且 通常有變數呼叫 LIBS=... 需要被修改。

10.3. Shadow 結構(Structure)

libshadow.a 函式庫對它從 /etc/shadow 檔接收資訊使用結構化呼叫。 這是從 /usr/include/shadow/shadow.h 標頭檔的 spwd 結構定義:

Shadow Suite 可以放除了編碼密碼之外的資料到 sp_pwdp 欄位。 密碼欄位可包括:

這表示一個額外的密碼, /sbin/extra 程式應該被更多的權限呼叫。 程式的呼叫需取得使用者名稱和指出為何需被呼叫的 switch才可通過。 查看 /usr/include/shadow/pwauth.h 和原始碼 pwauth.c 獲得更多資訊。

為何我們應使用 pwauth 去表示真正的權限,這是什麼意思,它將使第二組權限也 跑得很好。

Shadow Suite 作者指出因為大部分存在的程式都不這麼作囉,所以 Shadow Suite未來的版本將移除。

10.4. Shadow 函式(Functions)

shadow.h 包含 libshadow.a 函式庫:

我們將使用的範例程式是: getspnam 將對供應名稱恢復對我們 spwd 結構。

10.5. 範例

這是一個範例描述新增 shadow 支援程式,但預設值並沒有。

本範例使用 Point-to-Point Protocol Server (pppd-1.2.1d),它有個模式是表示 從 /etc/passwd 檔取代 PAP 或 CHAP 檔使用帳號密碼的 PAP 權限,你將不需要在 pppd-2.2.0 加這些程式碼,因為它已經存在囉。

pppd 的未來大致上不會被使用很多,但是如果你安裝 Shadow Suite,儲存在 /etc/passwd 檔的密碼將無法運作。

在 pppd-1.2.1d 權限使用的程式碼是位在 /usr/src/pppd-1.2.1d/pppd/auth.c 檔。

接下來程式碼需要被加在所有其他 #include 指令檔案的最上頭,我們將注意有環境指令的 #includes。

接下來要做的事情是變更實際碼, 我們將變更 auth.c 檔。

變更前 auth.c 檔 function 為:

使用者的密碼被放在 pw->pw_passwd,所以我們需新增 getspnam function,這將會把密碼放到 spwd->sp_pwdp。

我們將新增 pwauth function 來表示真正的權限。 這將在 shadow 檔設定時 自動產生第二個權限。

變更為可以支援 shadow 後的 auth.c function:

嚴謹的範例將啟發我們在作其他改變的幫助。 原始的版本如果在 /etc/passwd 檔 沒有任何密碼,可允許存取傳回的 UPAP_AUTHACK 。這是不好的,因為 簽入的使用是使用一個允許存取 PPP process的帳號,然後檢查帳號密碼,該帳號密碼是由 RAP 、在 /etc/passwd 檔的帳號和 /etc/shadow 檔的密碼供應。

所以如果我們設定原本版本對每個使用者,如 ppp 可以在 shell 執行,然後任何人可以 獲得 ppp 鏈結透過設定他們對使用者 ppp 的 PAP 和 null 的密碼。

我們修正 UPAP_AUTHNAK 取代 UPAP_AUTHACK 如果密碼欄位是空的。

有趣的是 pppd-2.2.0 有相同的問題。

接下來我們需要變更 Makefile 以便讓兩件事發生:

USE_SHADOW 必須被重新定義且libshadow.a 需要被新增到鏈結 process。

編輯 Makefile 且新增:

然後我們找到這一行:

然後改變它變成:

現在執行 make 跟 install.

11. 常問問題及答案

Q: 我用 tty's 用root 權限使用 /etc/securettys 檔,但是都沒有 任何運作,該如何解決?

A: /etc/securettys 檔在 Shadow Suite 安裝後就不具任何意義囉。

tty's 用 root 權限可以使用一個放在 /etc/login.defs 簽入設定檔進行修改。 該設定檔也可能指到另一個檔。

Q: 我對 Shadow Suite 進行安裝後,現在我沒辦法簽入(login)系統, 我有忽略什麼步驟嗎?

A: 你是真的安裝 Shadow 程式囉,但是並未執行 pwconv 或你忘記複製 /etc/npasswd 到 /etc/passwd 且複製 /etc/nshadow 到 /etc/shadow囉。 你也需要複製 login.defs 到 /etc。

Q: 在 xlock 那一章節有提到改變 /etc/shadow 檔的群組擁有者到 shadow。我沒有 shadow 群組,該如何處理?

A: 你可以新增一個。 簡單的編輯 /etc/group 檔,然後新增一行給 shadow 群組,你需要確認群組編號並未被其他群組使用,且你需要在 nogroup 紀錄之前插入該設定。 或這你可以簡化對 root權限設定 suid xlock。

Q: 有任何對 Linux Shadow Password Suite 的電子郵件列表嗎?

A: 有,但是它的目的是針對 Linux 下一個 Shadow Suite版本發展跟測試,你可以 [MAILTO][email protected] 電子郵件摘要輸入: subscribe。 這是在討論 Linux shadow-YYMMSS系列版本。你應該參加如果你 想參予未來發展或你安裝 Suite 在你的電腦且想要得到新版本的資訊。

Q: 我安裝 Shadow Suite,但是當我使用 userdel 命令後, 我得到 "userdel: cannot open shadow group file" 訊息,我有哪裡作錯了嗎?

A: 你編譯 Shadow Suite 時有開啟 SHADOWGRP 選項,但是 你沒有一個 /etc/gshadow 檔案,你需要編輯 config.h 檔和重新編 譯或建立一個 /etc/group 檔,請看 shadow groups 那一節。

Q: 我安裝 Shadow Suite 但是我無法找到編碼密碼在我的 /etc/passwd 檔,發生什麼問題?

A: 你可能在 Shadow config.h 檔開啟 AUTOSHADOW 選項或者 你的 libc 被 SAHDOW_COMPAT 選項編譯,你需要決定是哪個問題,然後 再重新編譯。

last edited 2004-12-25 08:45:57 by PingYeh