Unix/BSD/Linux的口令機制初探(轉)
Freebird
1.概述
早期U N I X系統把使用者口令儲存在一個純文字可讀的“口令檔案”中,這可能在系統管理員注意不到的情況下被擷取並暴露。它也可能在一次偶然事件中洩露。
從AT&T UNIX版本6開始,Thompson 等決定採用一個不同的方式: U N I X口令採用以美國軍方M - 2 0 9密碼機為模型的基於旋轉的演算法來進行編碼。這種快速演算法被證明對窮盡純文字搜尋有弱點並被AT&T UNIX版本7中出現的更先進的crypt ( )庫代替。
現在Unix/Linux將口令以不可讀的方式儲存在機器中。系統使用名為cryptographic hash的演算法將口令轉換成文字字串。這個串即稱為雜湊或者雜湊值。使用的演算法可以有多種,但它們都是不可逆的,也就是說不能從雜湊值中恢復出原始口令。不同的系統,所使用的密碼檔案以及加密演算法都可能不同。管理、維護好這些密碼檔案是保證系統安全的首要任務。(未特別說明,本文所有命令均在csh下以root身份執行。)
2.加密演算法簡介
2.1---crypt()簡介---key 和 salt
在Unix/Linux下存在多種雜湊演算法。可以透過庫函式crypt()呼叫這些系統支援的演算法。crypt()有key和salt兩個引數,並返回相應的雜湊值。salt亦即我們常說的“鹽”,它只是簡單的字串,它的長度取決於所使用的演算法,不同的雜湊演算法它有不同的取值範圍。所以,即使是相同的演算法,相同的原始口令,使用不同的salt,也會得到不同的加密口令。salt的目的也就是為了加大口令破解的難度,當我們使用passwd命令來修改密碼時,它會隨機選擇一個salt. s a l t使得使用預編譯字典對加密口令進行攻擊變得更困難。代替為字典中每個單詞做一次單獨加密,攻擊者現在不得不對字典中每個單詞的4 0 9 6種排列進行加密和儲存。在2 0年前,s a l t是作為本質上的資源障礙引入的,但現在1 2位s a l t不再被認為是一種有效的防禦方法。
crypt()可以在C程式中直接呼叫,甚至可以用perl直接呼叫,(詳細資訊請man 3 crypt),如下例:
%perl -e 'print crypt("mypass","s1")," "'s1tROevFyi.yQ%perl -e 'print crypt("mypass","s2")," "'s2JQ85JElCMeU
以上兩例中s1、s2分別為salt 值,可以看到,相同的口令(上例中為mypass)使用不同的salt將得到不同的雜湊值。 以上兩例使用的都是DES演算法,加密後的雜湊值將salt值作為其字首。
2.2DES演算法
由美國政府和IBM研製。所有的Linux版本和幾乎所有的Unix系統都支援DES.DES實際上為一個加密演算法,但是crypt(3)將之做為雜湊演算法。普通的DES演算法容許的原始口令長度為8個字元,多餘的口令也接受,但是多餘部分會被系統自動摒棄。但有些系統(例如HP-UX)使用DES的多次迭代來解決此問題,這樣就可以使用任意長度的密碼。但是使用DES加密後的口令為13個字元長。
2.3MD5演算法
它是真正的雜湊演算法。允許無限長的口令。它使用的salt空間也別DES演算法大得多,所以兩口令相同的可能性更小。它也透過呼叫crypt(3)函式實現。MD5演算法使用的 salt必須以$1$開頭,並以$結尾。且salt長度為8個字元。例如要用abcdef為salt 雜湊mypass,那麼如下:
%perl -e 'print crypt("mypass","$1$abcdef$")," "'$1$abcdef$nRHvewzGzJoYskdQAIEQr
注:上例中的" "均為跳脫字元。salt值為$1$abcdef$,原始密碼為mypass,雜湊值為:$1$abcdef$nRHvewzGzJoYskdQAIEQr
MD5演算法得到的雜湊值為31個字元長,並且都以$1$開頭。
2.4其他演算法:
BSDI風格的DES和Blowfish使用也比較廣泛,本文將在後面會有討論。
2.5 BSD使用的加密機制:
各種D E S很長一段時間內一直是U N I X口令加密的主要演算法,但還有其他演算法可以代替D E S。現代B S D系統提供了一些其他演算法的應用範例。預設情況下, FreeBSD預設使用MD5加密機制,因為MD5沒有出口限制,同時也更安全於DES。DES仍然可用,只不過DES存在的目的僅僅是為了和其他UNIX系統所用的密碼的向後相容性。並且使用DES的系統也能鑑別出MD5,因為MD5所用的Hash也在DES中被使用。
O p e n B S D走得更遠。其開發小組在加拿大,這樣就不受美國的出口限制。O p e n B S D可以被配置成使用傳統的UNIX crypt () 、比如“擴充加密”、M D 5或B l o w f i s h。M D 5由Ronald L.Rivest開發,它在RFC 1321中描述。F r e e B S D和O p e n B S D中基於M D 5的crypt ( ) 產生的口令條目包含版本號、s a l t和雜湊口令,彼此之間用“ $”符號分隔。一個M D 5口令看起來如下:
$ 1 $ c a e i H Q w X $ h s K q O j r F R R N 6 K 3 2 O W K C B f 1
這裡“$ 1”指明M D 5,“c a e i H Q w X”是s a l t。
B l o w f i s h由Bruce Schneier在1 9 9 3年開發,是D E S的一個快速、壓縮、簡單且免費的替代品]。雖然S c h n e i e r指出B l o w f i s h不適合產生單向雜湊,但O p e n B S D就為這個目的使用它。B l o w f i s h版的crypt ( )使用1 2 8位s a l t,足夠使最堅定的破壞者洩氣。用所有可能的s a l t值進行預編譯的字典將十分昂貴。其最大口令長度為7 2個字元。B l o w f i s h演算法是一個由p i的十六進位制數字組成的固定字串進行初始化的。初始化的B l o w f i s h狀態由s a l t和口令進行擴充套件,該過程重複一定的次數(該數值也被編入口令串中)。最後的B l o w f i s h口令條目是使用B l o w f i s h狀態對字串“ O r p h e a n B e h o l d e r S c r y D o u b t”加密6 4次而得到的。
加密的口令條目包含B l o w f i s h版本號、演算法重複次數以及s a l t和雜湊口令的連結—每個之間由“ $”字元隔開。一個編碼“ 8”將宣告2 5 6次迴圈。一個有效的B l o w f i s h口令看起來如下:
$2a$12$eIAq8PR8sIUnJlHaohxX209x9O1m2vk97LJ5dsXdmB.eXF42qjchC
在這個例子中,初始的擴充套件進行4 0 9 6次。給出了很大的重複次數和長的口令, B l o w f i s h加密的口令比其他基於傳統D E S機制加密的口令更難被攻擊。給出由這些演算法改進所提供的額外安全措施後,它被應用在其他U N I X系統中只是一個時間問題了。
2.6----如何得知你的系統使用的加密演算法
方法可以有很多,本人簡單列舉幾個:
方法(1)你可以透過檢視 libcrypt[._*]連結到/usr/lib下的哪些庫檔案來得知你的系統密碼所使用的加密演算法。如果連結到libcrypt*庫,那麼使用的為MD5,如果為libdescrypt*,就應該為DES了。具體操作如下:
%cd /usr/lib%ls -l libcrypt[._]*lrwxr-xr-x 1 root wheel 11 Jun 9 06:18 /usr/lib/libcrypt.a@ ->libscrypt.alrwxr-xr-x 1 root wheel 12 Jun 9 06:19 /usr/lib/libcrypt.so@ ->libscrypt.solrwxr-xr-x 1 root wheel 14 Jun 9 06:21 /usr/lib/libcrypt.so.2@ ->libscrypt.so.2lrwxr-xr-x 1 root wheel 13 Jun 9 06:22 /usr/lib/libcrypt_p.a@ ->libscrypt_p.a%
注意:在FreeBSD4.4中,從FreeBSD 4.4開始就完全由login.conf來控制所使用的加密演算法,並且預設已經設定為MD5,要改為DES,只須將其中:password_format段的md5替換成des。任何使修改生效,本文後面有詳細的說明。
附:我們強烈建議使用者儘可能的使用MD5庫而非DES.所以往往也很有必要將一些安裝了DES加密演算法的系統的DES庫轉換成MD5庫,操作也很簡單,只須先刪除libcrypt[._*]連結,然後將它們重新連結到相應到md5庫。(即以s代替des):
Links DES MD5
----- --- ---
libcrypt.a libdescrypt.a libscrypt.a
libcrypt.so libdescrypt.so libscrypt.so
libcrypt.so.2 libdescrypt.so.2 libscrypt.so.2
libcrypt_p.a libdescrypt_p.a libscrypt_p.a
方法(2)檢視/etc/login.conf中的password_format段。其值md5,des,blf分別對應MD5,DES和blowfish.
方法(3)檢視密碼檔案/etc/passwd或者/etc/shadow(BSD 下相應為/etc/master.passwd),根據密碼特徵得知使用的加密演算法。例如以$1$開頭的為MD5,以$2$開頭的為blowfish.DES沒有明顯的特徵,但它的密碼段相對較短,且均為字母,沒有$之類的字元,也很容易辨別!
3.密碼檔案
3.1概述:
正如大家所熟悉的,Unix下都存在一個/etc/passwd檔案以存放使用者的密碼檔案,但是在不同的Unix,Linux,BSD 中它們所起的作用也不盡相同。某些Unix和Linux還使用shadow檔案,但FreeBSD中相應的卻為/etc/master.passwd檔案。下面將對這些檔案進行詳細說明。
3.2/etc/passwd檔案
傳統的Unix中均使用該檔案來存放使用者密碼。該檔案以加密的方式儲存口令,其中的口令必須透過passwd口令來生成(如果使用NIS,相應的為ypasswd),或者從另一賬號中複製過來。
P a s s w d檔案中的每個條目看起來如下:
n a m e : c o d e d - p a s s w d : U I D : G I D : u s e r - i n f o : h o m e - d i r e c t o r y : s h e l l
7個域中的每一個由冒號隔開。空格是不允許的,除非在u s e r- i n f o域中使用。下面總結了
每個域的含義:
①name—給使用者分配的使用者名稱,這不是私有資訊。
② c o d e d - p a s s w d—經過加密的使用者口令。如果一個系統管理員需要阻止一個使用者登入,則經常用一個星號( : * :)代替。該域通常不手工編輯。使用者應該使用p a s s w d命令修改他們的口令。值得注意的一點是許多最近的U N I X 產品依賴“影子口令” — 不在/ e t c / p a s s w d中儲存的口令。
③ UID—使用者的唯一標識號。習慣上,小於1 0 0的U I D是為系統帳號保留的。
④ G I D—使用者所屬的基本分組。通常它將決定使用者建立檔案的分組擁有權。在Red Hat L i n u x中,每個使用者帳號被預設賦予一個唯一分組。
⑤ u s e r- i n f o—習慣上它包括使用者的全名。郵件系統和f i n g e r這樣的工具習慣使用該域中的資訊。該域也被稱作G E C O S域。
⑥ home-directory—該域指明使用者的起始目錄,它是使用者登入進入後的初始工作目錄。
⑦ s h e l l—該域指明使用者登入進入後執行的命令直譯器所在的路徑。有好幾種流行的S h e l l,包括Bourne Shell (/bin/sh),C Shell (/bin/csh),Korn Shell (/bin/ksh)和Bash Shell( / b i n / b a s h )。注意可以為使用者在該域中賦一個/ b i n / f a l s e值,這將阻止使用者登入。
注意:當編輯/etc/passwd檔案來建立一個新賬號時,應在密碼欄位放一個"*",(一些偽使用者,例如daemon也如此)以避免使用者未經權而使用該賬號。直到你為此新建賬號設定了真實密碼。
3.2/etc/shadow檔案
傳統上,/ e t c / p a s s w d檔案在很大範圍內是可讀的,因為許多程式需要用它來把U I D轉換為使用者名稱。例如,如果不能訪問/ e t c / p a s s w d,那麼ls -l命令將顯示數字U I D而不是使用者名稱。不幸的是,使用口令猜測程式,具有加密口令的可讀/ e t c / p a s s w d檔案表現出巨大的安全危險。多數近來的U N I X產品支援一個變通方法:影子口令檔案。影子口令系統把口令檔案分成兩部分: / e t c / p a s s w d和影子口令檔案。影子口令檔案儲存加密的口令;/ e t c / p a s s w d中的c o d e d - p a s s w o r d域都被置為“X”或其他替代符號。影子口令檔案只能被r o o t或像p a s s w d這樣的s e t _ u i d程式在需要合法訪問時讀取,其他所有非授權使用者都被拒絕訪問。習慣上,影子口令檔案儲存在/ e t c / s h a d o w中,儘管有些系統使用可選的路徑和檔名。例如B S D系統把加密的口令儲存在/ e t c / m a s t e r. p a s s w d。
/etc/shadow剖析
/ e t c / s h a d o w檔案包含使用者名稱和加密口令以及下面一些域:
(1) 上一次修改口令的日期,以從1 9 7 0年1月1日開始的天數表示。
(2) 口令在兩次修改間的最小天數。口令在建立後必須更改的天數。
(3)口令更改之前向使用者發出警告的天數。
(4)口令終止後帳號被禁用的天數。
(5)自從1 9 7 0年1月1日起帳號被禁用的天數。
(6)保留域。
下面是一個Red Hat Linux系統中/ e t c / s h a d o w檔案的例子:
root:mGqwuvdF41bc:10612:0:99999:7:::bin:*:10612:0:99999:7:::daemon*:10612:0:99999:7:::adm:*:10612:0:99999:7:::lp*:10612:0:99999:7:::sync:*:10612:0:99999:7:::shutdown:*:10612:0:99999:7:::halt:*:10612:0:99999:7:::mail:*:10612:0:99999:7:::news:*:10612:0:99999:7:::uucp:*:10612:0:99999:7:::operator:*:10612:0:99999:7:::freebird:sdfaBh45ZiQn1llfa:10612:0:99999:7:::
預設情況下,口令更新並不開啟。於是沒有口令更改前的最小天數,也沒有口令必須更改的日期。口令在99 999天內必須更換的宣告幾乎無用,因為從現在起幾乎還有2 5 0年。在口令終止前7天警告使用者的宣告也沒用,除非選擇使用口令更新。在本例中沒有宣告,還可以在口令終止和帳號禁用之間設定一個時間段。
在可選影子口令功能的系統中,用一條相對簡單的命令設定並更新影子口令檔案:p w c o n v。該命令在影子口令檔案不存在的情況下建立一個新的。如果已存在一個影子檔案,p w c o n v把/ e t c / p a s s w d中的新使用者新增到/ e t c / s h a d o w中,把/ e t c / p a s s w d中沒有的使用者從影子檔案中刪去,並把口令從/ e t c / p a s s w d移到影子檔案中。在Red Hat Linux中,p w c o n v把新的/ e t c / p a s s w d檔案寫到一個名為n p a s s w d的檔案中,把新影子檔案寫到n s h a d o w中。這些新檔案需要手工進行重新命名或複製。使用者可以用p w u n c o n v命令返回到不使用影子檔案的情況下,它把影子檔案中的資訊合併回傳統的口令檔案中。
提示:早期的L i n u x不支援影子口令。
注意:在solaris下,必須使用隱蔽口令檔案,在Linux下,如果使用者安裝了shadow軟體也可以使用。
3.2/etc/master.passwd
在BSD下,實際的口令檔案是/etc/master.passwd.,這裡的密碼都是簡單的文字資料庫,每個使用者佔一行,行中欄位用":"隔開。/etc/master.passwd許可權為0600,而/etc/passwd為0644,這就意味著任何人都人存取/etc/passwd.但只有root才能讀取/etc/master.passwd.
在BSD中,/etc/master.passwd是/etc/passwd的超集,它直接生成/etc/passwd檔案。所以在BSD中/etc/passwd檔案總是不需要直接進行編輯。一旦執行vipw,passwd,chfn,chsh或者chpass這些命令,也是對/etc/master.passwd進行修改。並且修改後會自動生成/etc/passwd.(一同生成的還有由pwd_mkdb工具生成的/etc/master.passwd的雜湊表形式。)
平面檔案資料庫(/etc/passwd,/etc/master.passwd)都只對少量使用者合適,使用者一多,查詢速度就慢。因此在BSD 下相應的還有兩個資料庫格式的雜湊表/etc/pwd.db和/etc/spwd.db,其許可權也和上面兩檔案對應。每次執行chfn,passwd等命令後,pwd_mkdb都會自動修改這兩個檔案。
提示:若希望根據另一個FreeBSD重新構件使用者列表或者從另一個FreeBSD機器移植一個使用者列表,只須簡單的把新的master.passwd(比如master.passwd.new)檔案置於/etc/下(或/ 下),然後執行如下命令(注意先備份):
%cp /etc/master.passwd /etc/master.passwd.bak%pwd_mkdb -p /etc/master.passwd.new
這樣/etc/master.passwd檔案將被覆蓋,其他三個檔案也得以重建。(-p即為生成新的/etc/passwd)
注意:/etc/master.passw檔案和shadow檔案形式和功能都相同,但是和/etc/master.passwd不同的是,Linux下(或其他系統)使用的/etc/shadow檔案並非/etc/passwd檔案的超集。/etc/passwd檔案也並非由/etc/shadow檔案產生,需要手工維護這兩個檔案。
4.BSD下使用“密碼過期機制”
“密碼過期”意即超過規定的時間密碼無效,使用者必須在此之前修改密碼。要實現此功能,需要修改/etc/login.conf檔案,在default段中加入passwordtime=90d(或者2y,6w,24h之類的)如:
default: :password_format=md5: :copyright=/etc/COPYRIGHT: :welcome=/etc/motd: :passwordtime=24h:
因為/etc/login.conf資料庫必須編譯成一個雜湊表,所以必須執行cap_mkdb程式,以生成此雜湊表,然後才能使修改生效。如下操作:
%cap_mkdb /etc/login.conf
這樣,若24小時內未修改密碼,登陸時將提示輸入新的密碼。
注意:在設定passwordtime屬性時,passwd會在/etc/master.passwd的第六欄位寫入最後一次修改密碼的時間。
/etc/login.conf在密碼及其他設定方面還有很多值得使用的地方,不妨man 看看。
後記
本文只簡要的說明了一下Unix/Linux特別是BSD的口令機制,要也因本人水平,不能在此文深入的論述此問題。關於密碼的安全性,以及密碼破解和任何使用更安全的加密機制等問題,本人會在以後撰文論述。
參考資料:
man 5 passwd
man 3 crypt
man md5
man des
man login.conf
DES-to-MD5-(mini)HOWTO
《Hacking Linux Exposed》
《Unix System Administrator Handbook》
作者簡介:
Freebird,姓名:匡萃彪。CNFUG核心成員。Unix/Linux/BSD的狂熱追隨者,熟悉BSD,Linux,Solaris,C,Shell。主要研究方向:各種伺服器架設、系統和網路安全、核心原始碼分析以及英文文件翻譯。歡迎您透過freebird@cnfug.org與本人聯絡。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-941470/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- UNIX系統的安全(口令篇)(轉)
- unix口令檔案介紹(轉)
- 初探Linux程式管理機制薦Linux
- 用DOS命令破除UNIX管理員口令 (轉)
- 用DOS命令破除 UNIX 管理員口令(轉)
- Free BSD,Linux之比較(轉)Linux
- Linux 命令列引數的三種風格 Unix/Posix、BSD、GNULinux命令列
- windows引導BSD和linux(轉)WindowsLinux
- Linux的安全機制(轉)Linux
- RedHat Linux口令恢復(轉)RedhatLinux
- Linux核心的同步機制(2)(轉)Linux
- Linux核心的同步機制(1)(轉)Linux
- BSD socket入門(轉)
- Unix之父Ken Thompson的BSD密碼終於被破解了密碼
- 【轉】linux非同步io機制Linux非同步
- JVM初探(三):類載入機制JVM
- Apache ZooKeeper - 事件監聽機制初探Apache事件
- RedHat Linux口令恢復任我行(轉)RedhatLinux
- linux的重啟方式為啥跟win和BSD不一樣(轉)Linux
- Basic LINUX/UNIX Commands(轉)Linux
- 實用Unix/Linux 命令(轉)Linux
- 崖山資料庫的共享叢集機制初探資料庫
- linux核心IDR機制詳解【轉】Linux
- Linux 與 BSD 有什麼不同?Linux
- Linux與BSD有什麼不同?Linux
- 【轉載】Linux 中直接 I/O 機制的介紹Linux
- 什麼是Linux,Linux與UNIX的關係(轉)Linux
- [下載]PHP 5.1.2 for Unix/Linux(轉)PHPLinux
- 用IPFW實現BSD防火牆(轉)防火牆
- Service初探與非同步訊息處理機制非同步
- TCP/IP堆疊中的路由漏洞 (BSD,缺陷) (轉)TCP路由
- Linux2.6 核心的 Initrd 機制解析(1)(轉貼好文)Linux
- Linux2.6 核心的 Initrd 機制解析(4)(轉貼好文)Linux
- Linux OOM 機制LinuxOOM
- Linux安全機制Linux
- Unix 和 Linux 雙機熱備 概念Linux
- WTL的訊息機制 (轉)
- linux與unix時間戳互轉Linux時間戳