Linux用戶管理安全寶典:密碼防破解與帳號文件保護
原創(chuàng)【51CTO獨家特稿】Linux作為一種多任務、多用戶的操作系統(tǒng),在同一時間段上可能為眾多用戶使用,且用戶的管理直接關系到整個系統(tǒng)的安全,用戶需要對其中的密碼管理和帳戶文件管理進行著重的強調(diào)和保護。
Linux用戶管理主要分為兩方面:密碼管理,以及用戶與用戶組的管理。下面將對這兩方面分別進行闡述。
本文隸屬于專題:Linux系統(tǒng)全方位管理
1. 密碼管理
密碼是用戶登錄Linux系統(tǒng)的鑰匙,如果沒有鑰匙總是要費一番力氣后,才能登錄到目標操作系統(tǒng)。無論入侵者采用何種遠程攻擊,如果無法獲得管理員或超級管理員的用戶密碼,就無法完全控制整個系統(tǒng)。若想訪問系統(tǒng),最簡單也是必要的方法就是竊取用戶的密碼。因此,對系統(tǒng)管理員賬戶來說,最需要保護的就是密碼,如果密碼被盜,也就意味著災難的降臨。
入侵者大多是通過各種系統(tǒng)和設置漏洞,獲得管理員密碼來獲得管理員權限的,然后,再實現(xiàn)對系統(tǒng)的惡意攻擊。賬號的弱密碼設置會使入侵者易于破解而得以訪問計算機和網(wǎng)絡,而強密碼則難以破解,即使是密碼破解軟件也難以在短時間內(nèi)辦到。密碼破解軟件一般使用3種方法進行破解:字典猜解、組合猜解和暴力猜解。毫無疑問,破解強密碼遠比破解弱密碼困難得多。因此,系統(tǒng)管理員賬戶必須使用強密碼。
據(jù)統(tǒng)計,大約80%的安全隱患是由于密碼設置不當引起的。因此,密碼的設置無疑是十分講究技巧的。在設置密碼時,請遵守密碼安全設置原則,該原則適用于任何使用密碼的場合,既包括Windows操作系統(tǒng),也包括UNIX/Linux操作系統(tǒng)。
John the Ripper是一個工具軟件,用于在已知密文的情況下嘗試破解出明文的破解密碼軟件。目前的最新版本是JOHN1.7版,主要支持對DES、MD5兩種加密方式的密文進行破解工作。它可以工作于多中不同的機型以及多種不同的操作系統(tǒng)之下,目前已經(jīng)測試過能夠正常運行的操作系統(tǒng)有:Linux x86、freeBSD、x86、Solaris、SPARC、OSF/1 Alpha、DOS、WinNT/WinXP系列等。
John the Ripper官網(wǎng):http://www.openwall.com/john/
John the Ripper 1.7是目前比較好的破解密碼工具,在解密過程中會自動定時存盤,用戶可以強迫中斷解密過程(使用ctrl+c組合鍵),下次還可以從中斷的地方繼續(xù)進行下去(john-restore命令)。任何時候敲擊鍵盤,用戶都可以看到整個解密的進行情況,所有已經(jīng)被破解的密碼會被保存在當前目錄下的JOHN.POT文件中,SHADOW中所有密文相同的用戶會被歸成一類,這樣JOHN就不會進行無謂的重復勞動了。在程序的設計中,關鍵的密碼生成的條件被放在JOHN.INI文件中,用戶可以自行修改設置,不僅支持單詞類型的變化,而且支持自己編寫C的小程序限制密碼的取值方式。
在使用該軟件前,我們可以從網(wǎng)上下載其最新版本john-1.7.3.4 for Linux版本,它包含DOC、SRC和RUN三個目錄,在SRC目錄下,在機器上執(zhí)行如下命令即可:
#make #make clean linux-x86-any
安裝好后,可以切換到RUN目錄下,進行測試,如下所示:
#cd ../run #./john –test
John the ripper提供了如下多達10余種的命令,供用戶選擇使用:
- pwfile:<file>[,..]:用于指定存放密文所在的文件名,(可以輸入多個,文件名一我“,”分隔,也可以使用*或者 這兩個通配符引用一批文件)。也可以不使用此參數(shù),將文件名放在命令行的最后即可。
- wordfile:<字典文件名>-stdin:指定的用于解密用的字典文件名。也可以使用STDIO來輸入,就是在鍵盤中輸入。
- rules:在解密過程中使用單詞規(guī)則變化功能。如將嘗試cool單詞的其他可能,如COOLER、Cool等,詳細規(guī)則可以在JOHN.INI文件中的[List.Rules:Wordlist]部分查到。
- incremental[:<模式名稱>]:使用遍歷模式,就是組合密碼的所有可能情況,同樣可以在JOHN.INI文件中的[Incremental:*****]部分查到。
- single:使用單一模式進行解密,主要是根據(jù)用戶名產(chǎn)生變化來猜測解密,可以消滅比較低級的用戶。其組合規(guī)則可以在JOHN.INI文件中的[List.Rules:Single]部分查到,我們在下面詳細解釋。
- external:<模式名稱>:使用自定義的擴展解密模式,用戶可以在john.ini中定義自己需要的密碼組合方式。JOHN也在INI文件中給出了幾個示例,在INI文件的[List.External:******]中所定義的自訂破解功能。
- restore[:<文件名>]:繼續(xù)上次的破解工作,JOHN被中斷后,當前的解密進度情況被存放在RESTORE文件中,用戶可以拷貝這個文件到一個新的文件中。如果參數(shù)后不帶文件名,JOHN默認使用RESTORE文件。
- makechars:<文件名>:制作一個字符表,用戶所指定的文件如果存在,則將會被覆蓋。JOHN嘗試使用內(nèi)在規(guī)則在相應密鑰空間中生成一個最有可能擊中的密碼組合,它會參考在JOHN.POT文件中已經(jīng)存在的密鑰。
- show:顯示已經(jīng)破解出的密碼,因為JOHN.POT文件中并不包含用戶名,同時用戶應該輸入相應的包含密碼的文件名,JOHN會輸出已經(jīng)被解密的用戶連同密碼的詳細表格。
- test:測試當前機器運行JOHN的解密速度,需要1分鐘,它會得出在當前的情況下解密的各種可能情況下相應的解密速度,如同時解密100個用戶時的平均速度,使用 遍歷法解密模式時解密的速度。salts指用戶個數(shù),如果給出的對于100個用戶解密的平均速度為18000次/秒,那么表明同時對100個用戶解密,解 密的速度為每個180次/秒。因為絕大多數(shù)的時間被用于密鑰比較過程中了。所以應該對用戶進行挑選。
- users:<login|uid>[,..]:只破解某類型的用戶或者屬于某個組的用戶。如果得到的PASSWD文件沒有包含密文,那么在得到SHADOW后應該進行組合,JOHN的附帶程序 UNSHADOW.EXE可以完成這一過程,當然了,用戶也可以手工做。一般的能夠進入CSH的用戶都是解密的首選對象。也可以要UID=0的ROOT級別 的用戶。
- shells:[!]<shell>[,..]:和上面的參數(shù)一樣,這一選項可以選擇對所有可以使用shell的用戶進行解密,對其他用戶不予理睬。“!”就是表示不要某些類型的用戶。例如:“-shells:csh”。
- salts:[!]<count>:只選擇解密用戶大于<count>的帳號,可以使用戶得到選擇的權利,盡快的得到所需要的用戶的PASS。
- lamesalts:指定用戶中密碼所使用的cleartext。(我不大清楚此功能的作用)。
- timeout:<幾分鐘>:指定解密持續(xù)的時間是幾分鐘,到時間JOHN自動停止運行。
- list:在解密過程中在屏幕上列出所有正在嘗試使用的密碼,建議不要使用,它會將大部分時間浪費在顯示上,極大地拖慢解密速度。一般只是適用于重定向輸出到文件后,檢驗用戶所設定的某些模式是否正常。
- beep-quiet:當解密出密碼時是否要讓PC喇叭叫一下,以提醒用戶。
- noname-nohash:不使用內(nèi)存來保存“用戶名”等內(nèi)容。
- des-md5:指定使用的解密方式是解DES還是MD5,對于解密DES密碼不用理會這一選項。
除了口令破解程序之外,在這個軟件包中,還包含了其他幾個實用工具,它們對于實現(xiàn)口令破解都有一定的幫助,這些工具都放置在run目錄下,下面分別予以簡要介紹。
(1)unshadow PASSWORD-FILE SHADOW-FILE
unshadow命令將passwd文件和shadow文件組合在一起,其結(jié)果用于John破解程序。通常應該使用重定向方法將這個程序的結(jié)果保存在文件中,之后將文件傳遞給John破解程序。
(2)unafs DATABASE-FILE CELL-NAME
unafs從二進制AFS數(shù)據(jù)庫中提取口令散列值,并生成John可用的輸出,通常應該把這個輸出重定向到文件中。
(3)unique OUTPUT-FILE
刪除字典表中的重復詞匯,但不改變字典表中各詞條項的順序。
安裝好后,我們可以靈活使用如下幾種方式來對自己的賬戶密碼進行測試:
通常情況下,許多用戶的密碼命名方式非常簡單,比如foo、hello、world等等,或者很多都是與用戶名相同的密碼口令,那么我們一般可以先采用簡單解密方式來對系統(tǒng)中的密碼進行簡單的初步試探,如果發(fā)現(xiàn)能夠成功破解,那么就需要對這些密碼口令的強度進行加強,如下所示:
#./john –single “/etc/shadow” Loaded 2 password hashes with 3 different salts (FreeBSD MD5 [32/32]) liyang (liyang) guesses: 1 time: 0:00:00:00 100% c/s: 6975 trying: 999991900
在上述命令中,我們發(fā)現(xiàn)系統(tǒng)存在一個liyang用戶,其用戶名和密碼均為liyang,因而通過最簡單的方式便能將其發(fā)現(xiàn)和利用,如果為黑客破解則將造成不可設想的后果,因而我們的用戶應該立即根據(jù)此種情況進行口令加強。
其次,用戶可以使用字典文件來對系統(tǒng)用戶的惡密碼強度進行試探和測試。人們常用hello、superman、cooler、asdfgh、123456等作為自己的密碼。而-rules參數(shù)則在此基礎上再加上些變化,如字典中有單詞cool,則JOHN還會嘗試使用cooler、CoOl、Cool等單詞變化進行解密。一般視SHADOW中的用戶多少及用戶的字典大小、用戶的機器速度,解密時間從幾小時到幾天不等。下面給出使用該方式進行解密的例子,假設我們已經(jīng)生成了一個password.lst文件,其中包含了常用的以字典單詞為依據(jù)的密碼,那么我們對系統(tǒng)中的用戶密碼使用該方式進行試探破解,由于字典中保留了young這樣一個單詞,因而用戶google的密碼所以也被試探出來,網(wǎng)絡管理員同樣需要對該密碼進行加固,比如添加適當?shù)暮缶Y、字母和數(shù)字等:
# ./john --wordlist=password.lst "/etc/shadow"
Loaded 2 password hashes with 2 different salts (FreeBSD MD5 [32/32])
young (google)
guesses: 1 time: 0:00:00:01 100% c/s: 3571 trying: zhongguo
#p#
2. 管理用戶及組文件安全
Linux操作系統(tǒng)采用了UNIX傳統(tǒng)的方法,把全部的用戶信息保存為普通的文本文件。用戶可以通過對這些文件進行修改來管理用戶和組。
(1) 用戶賬號文件——passwd
/etc/passwd文件是UNIX安全的關鍵文件之一。該文件用于用戶登錄時校驗用戶的登錄名、加密的口令數(shù)據(jù)項、用戶ID(UID)、默認的用戶分組ID(GID)、用戶信息、用戶登錄子目錄以及登錄后使用的shell。這個文件的每一行保存一個用戶的資料,而用戶資料的每一個數(shù)據(jù)項采用冒號“:”分隔。如下所示:
LOGNAME:PASSWORD:UID:GID:USERINFO:HOME:SHELL
每行的頭兩項是登錄名和加密后的口令,后面的兩個數(shù)是UID和GID,接著的一項是系統(tǒng)管理員想寫入的有關該用戶的任何信息,最后兩項是兩個路徑名:一個是分配給用戶的HOME目錄,另一個是用戶登錄后將執(zhí)行的shell(若為空格則默認為/bin/sh)。
下面是一個實際的系統(tǒng)用戶的例子:
cracker:x:6018: 6018: cracker:/home/ cracker:/bin/bash
該用戶的基本信息為:
- 登錄名:cracker
- 加密的口令表示:x
- UID:6018
- GID:6018
- 用戶信息:cracker
- HOME目錄:/home/ cracker
- 登錄后執(zhí)行的shell:/bin/bash
用戶的登錄名是用戶用來登錄的識別,由用戶自行選定,主要由方便用戶記憶或者具有一定含義的字符串組成。
所有用戶的口令的存放都是加密的,通常采用的是不可逆的加密算法,比如DES(Data Encryption Standard,數(shù)據(jù)加密標準)。當用戶在登錄提示符處輸入它們的口令時,輸入的口令將由系統(tǒng)進行加密。再把加密后的數(shù)據(jù)與機器中用戶的口令數(shù)據(jù)項進行比較。如果這兩個加密數(shù)據(jù)匹配,就可以讓這個用戶進入系統(tǒng)。在/etc/passwd文件中,UID信息也很重要。系統(tǒng)使用UID而不是登錄名區(qū)別用戶。一般來說,用戶的UID應當是獨一無二的,其他用戶不應當有相同的UID數(shù)值,只有UID等于0時可以例外。任何擁有0值UID的用戶都具有根用戶(系統(tǒng)管理員)訪問權限,因此具備對系統(tǒng)的完全控制。通常,UID為0這個特殊值的用戶的登錄名是“root”。根據(jù)慣例,從0到99的UID保留用做系統(tǒng)用戶的UID。如果在/etc/passwd文件中有兩個不同的入口項有相同的UID,則這兩個用戶對文件具有相同的存取權限。
每一個用戶都需要有地方保存專屬于自己的配置文件。這需要讓用戶工作在自己定制的操作環(huán)境中,以免改變其他用戶定制的操作環(huán)境,這個地方就叫做用戶登錄子目錄。在這個子目錄中,用戶不僅可以保存自己的配置文件,還可以保存自己日常工作用到的各種文件。出于一致性的考慮,大多數(shù)站點都從/home開始安排用戶登錄子目錄,并把每個用戶的子目錄命名為其上機使用的登錄名。
當用戶登錄進入系統(tǒng)時,都有一個屬于自己的操作環(huán)境。用戶遇到的第一個程序叫做shell。在Linux系統(tǒng)里,大多數(shù)shell都是基于文本的。Linux操作系統(tǒng)帶有好幾種shell供用戶選用。用戶可以在/etc/shells文件中看到它們中的絕大多數(shù)。用戶可以根據(jù)自己的喜好來選用不同的shell進行操作。按照最嚴格的定義,在上面所介紹的/etc/passwd文件中,每個用戶的口令數(shù)據(jù)項中并沒有定義需要運行某個特定的shell,其中列出的是這個用戶上機后第一個運行的程序是哪個。綜上所述,通過使用cat命令查看/etc/passwd文件(#cat /etc/passwd)。
(2) 用戶影子文件——shadow
Linux使用不可逆的加密算法如DES來加密口令,由于加密算法是不可逆的,所以黑客從密文是得不到明文的。但/etc/passwd文件是全局可讀的,加密的算法是公開的,惡意用戶取得了/etc/passwd文件,便極有可能破解口令。而且,在計算機性能日益提高的今天,對賬號文件進行字典攻擊的成功率會越來越高,速度越來越快。因此,針對這種安全問題,Linux/UNIX廣泛采用了“shadow(影子)文件”機制,將加密的口令轉(zhuǎn)移到/etc/shadow文件里,該文件只為root超級用戶可讀,而同時/etc/passwd文件的密文域顯示為一個x,從而最大限度地減少了密文泄露的機會。
/etc/shadow文件的每行是8個冒號分割的9個域,格式如下:
username: passwd: lastchg: min: max: warn: inactive: expire: flag
如下所示的是一個系統(tǒng)中實際影子文件的例子:
liyang:$1$ciY58zQZ$iKVHLSVZZgM75.lGp5Rmv.:14633:0:99999:7:::
我們對最后一個用戶的信息進行解釋,該信息表明了如下含義:
- 用戶登錄名:liyang
- 用戶加密的口令:liyang后緊跟的一段亂碼信息$1$ciY58zQZ$iKVHLSVZZgM75.lGp5Rmv.
- 從1970年1月1日起到上次修改口令所經(jīng)過的天數(shù)天數(shù)為:14633天
- 需要多少天才能修改這個命令:0天
- 該口令永不過期:采用99999表示
- 要在口令失效前7天通知用戶,發(fā)出警告
- 禁止登錄前用戶名還有效的天數(shù)未定義,以“:”表示
- 用戶被禁止登錄的時間未定義,以“:”表示
- 保留域,未使用,以“:”表示
(3) 組賬號文件——group
/etc/passwd文件中包含著每個用戶默認的分組ID(GID)。在/etc/group文件中,這個GID被映射到該用戶分組的名稱以及同一分組中的其他成員去。
/etc/group文件含有關于小組的信息,/etc/passwd中的每個GID在文件中應當有相應的入口項,入口項中列出了小組名和小組中的用戶,這樣可方便地了解每個小組的用戶,否則必須根據(jù)GID在/etc/passwd文件中從頭至尾地尋找同組用戶,這提供了一個比較快捷的尋找途徑。/etc/group文件對小組的許可權限的控制并不是必要的,因為系統(tǒng)用來自于/etc/passwd文件的UID、GID來決定文件存取權限,即使/etc/group文件不存在于系統(tǒng)中,具有相同的GID用戶也可以小組的存取許可權限共享文件。小組就像登錄用戶一樣可以有口令。如果/etc/group文件入口項的第二個域為非空(通常用x表示),則將被認為是加密口令。/etc/group文件中每一行的內(nèi)容如下所示:
- 用戶分組名
- 加過密的用戶分組口令
- 用戶分組ID號(GID)
- 以逗號分隔的成員用戶清單
如下是系統(tǒng)中一個具體的/etc/group文件中記錄的例子:
adm:x:4:root,adm,daemon
以上面文件第四行為例子,它說明在系統(tǒng)存在一個adm的用戶組,它的信息如下:
- 用戶分組名為adm
- 用戶組口令已經(jīng)加密,用“x”表示
- GID為4
- 同組的成員用戶有:root,adm,daemon
(4) 組賬號文件——gshadow
如同用戶賬號文件的作用一樣,組賬號文件也是為了加強組口令的安全性,防止黑客對其實行的暴力攻擊,而采用的一種將組口令與組的其他信息相分離的安全機制。其格式如下所示內(nèi)容:
- 用戶組名
- 加密的組口令
- 組成員列表
下面是系統(tǒng)中一個具體的/etc/gshadow文件的例子:
mail:::mail,postfix,exim
以組mail為例,其加密后的組口令被隱藏,其組成員包括mail、postfix和exim。其他的以“::”結(jié)尾的組表明沒有組成員,但是用戶可以自行添加。
總結(jié)
對于Linux系統(tǒng)的全方位保護,我們已經(jīng)介紹了文件系統(tǒng)保護、進程管理、以及本文的用戶管理。除了已經(jīng)介紹過的這三項,Linux日志管理也是必不可缺的一環(huán),這將在下篇文章中進行介紹。
【編輯推薦】