它是一種統一的認證方案。PAM 讓您能隨時改變您的認證方法以及需求,並且不需要重新編譯任何代碼就封裝了所有本地認證方法。具體見 PAM 網站。
對於 PAM 您只需要做:
-
對您的密碼采用不同於 DES 的加密方式(讓它們面對暴力解碼(brute-force decode)時更為堅固)。
-
對您所有用戶使用資源限額,以防止他們進行拒絕服務(denial-of-service)攻擊(進程數、占用內存量等等)。
-
隨時啟用 shadow password (見下文)
-
只在特定的時間允許特定的用戶從特定的地方登錄
上述介紹來源於http://man.ddvip.com/linux/Mandrakelinux10server/password-security.html。
========================================
我們看看shadow文件的格式:
格式是:
shadow是個可讀文件,普通用戶沒有讀寫權限,超級用戶權限為可讀寫。
如果密碼字符串為,表示系統用戶不能被登入,為表示用戶名被禁用,如果密碼字符串為空,表示沒有密碼,通過可以清空一個用戶的口令。
具體shadow可參考shadow how-to,盡管這是一份已經過時了的文檔。
下面探討下shadow中的密碼加密問題:
還是以上面的root用戶為例:
其中的密碼域為 ,參考linux標准的passwd.c源文件,在pw_encrypt函數中可以找到加密方法:
也就是說加密用明文密碼和一個叫salt的東西用crypt()加密生成密文。
再來看看crypt的幫助:
http://www.kernel.org/doc/man-pages/online/pages/man3/crypt.3.html
可發現原來crypt密文里是由三部分組成的,即:
目前常用的是當id為1時,使用md5加密,id為5,采用SHA256進行加密,id為6采用SHA512進行加密。
分析上面的函數,可看出我們的shadow密碼中,直接把 當做salt參數帶入進行crypt加密。
那好,我們可以寫個簡短的代碼進行試驗:
保存后執行gcc passwd.c -lcrypt -o passwd
編譯成功后運行./passwd root 123
其中./passwd是生成的命令,root是我們用來測試的賬戶,123是測試系統中root用戶的密碼,執行的結果是:
可見,我們得到了和系統shadow文件下相同結果的密文。
根據我們的運行結果我們可以看到,在root用戶的shadow中,他的salt是
我們之前也是用這個salt來進行加密匹配的。但是,問題是:這個salt到底是怎么來的??
還是分析標准的passwd.c,
在passwd.c中,找到了生成salt的函數:crypt_make_salt
除了一大段條件判斷語句,其實最重要的只有一句gensalt(salt_len)。
看看gensalt的定義:
哦,原來神秘的salt只是某個的固定長度的隨機的可見的字符串而已。
每次改寫密碼時,都會再隨機生成一個這樣的salt。而用戶登入時,會拿用戶登入的明文密碼經過上述演示的步驟生成密文后和shadow里的密碼域進行比較。
有了上述的分析,要暴利破解linux下的口令也不是什么問題,但前提是你有機會拿到shadow文件,這個前提條件貌似很難。
本文只是篇技術分析文章,沒有其它任何初衷。
