10/16/2008

Solaris - 強化密碼的安全性

Solaris使用者帳號密碼的加密方式是很兩光的,解密的程式輕易的就可以解開。為了強化系統的安全性,Solaris 10在加密的功能上提供了不少好用的東西,現在先針對帳號密碼加密及安全上做個介紹。
Solaris 10提供了四種帳號密碼加密的演算法,下面的表是四種的說明。

試別字 加密法 說明 Man manual
1 crypt_bsdmd5 和BSD及Linux相容的MD5演算法,密碼最長可達255個字元。 crypt_bsdmd5(5)
2acrypt_bsdbf 相容於BSD的Blowfish演算法,密碼最長可達255個字元。 crypt_bsdbf(5)
md5crypt_sunmd5 Sun的MD5,比BSD及Linux更為安全,密碼最長可達255個字元。 crypt_sunmd5(5)
__unix__crypt_unix Unix傳統的演算法,並不安全,密碼最長為8個字元。 crypt_unix(5)

Solaris預設是使用__unix__,所以密碼長度限制為8個字元。我們來做個實驗,建立一個使用者abc並將其密碼設定為1234567890 共10個字元,然後使用abc這個帳號連入,輸入密碼的前8個字元也就是12345678。你會發現登入時的密碼和設定的並不相同,但是我們還是進入系統了。

# useradd abc
# passwd abc
New Password: 1234567890
Re-enter new Password: 1234567890
passwd: password successfully changed for abc
# ssh abc@.
Password: 12345678
Last login: Thu Sep 7 16:38:38 2006 from c01093.ncic.cor
Could not chdir to home directory /home/abc: No such file or directory
Sun Microsystems Inc. SunOS 5.10 Generic January 2005
$ id
uid=100(abc) gid=1(other)

果然是安全性很不夠,沒關係Solaris 10可以讓它變得更安全。
Solaris 10的密碼的加密演算法的相關設定是放在/etc/security/policy.conf裡面,讓我們先來看看裡面有些什麼內容

# cat /etc/security/policy.conf
......
# crypt(3c) Algorithms Configuration
#
# CRYPT_ALGORITHMS_ALLOW specifies the algorithms that are allowed to
# be used for new passwords. This is enforced only in crypt_gensalt(3c).
#
CRYPT_ALGORITHMS_ALLOW=1,2a,md5
# The Solaris default is the traditional UNIX algorithm. This is not
# listed in crypt.conf(4) since it is internal to libc. The reserved
# name __unix__ is used to refer to it.
#
CRYPT_DEFAULT=__unix__
......

因為相關的設定只有二行,所以我把不相關的部份都略去了。CRYPT_ALGORITHMS_ALLOW是在告訴系統,那些是可以使用的加密演算法。這裡要填入的是識別字,系統預設已經把三種都填進去了,所以我們不需要改。CRYPT_DEFAULT就是我們預設要使用什麼加密演算法。系統預設是使用傳統的也就是很爛的__unix__。我們要修改的就是這一行,把__unix__換成1就好 了,其他什麼事都不用做。在你修改之前先將此檔案備份,任何時候都要為自己的做為留退路。多留一個備份不會是壞事。

# cd /etc/security
# cp policy.conf policy.conf.orig
# vi policy.conf
......
#CRYPT_DEFAULT=__unix__
CRYPT_DEFAULT=1

修改完畢就立刻生效。我們立刻來做個實驗,一樣是拿abc這傢伙開刀,重設他的密碼為1234567890abcdef,然後再用8個 字元的密碼登入系統看看會發生什麼事。

# passwd abc
New Password: 1234567890abcdef
Re-enter new Password: 1234567890abcdef
passwd: password successfully changed for abc
-bash-3.00# ssh abc@.
Password: 12345678
Password: 1234567890abcdef
Last login: Fri Sep 8 10:00:29 2006 from localhost
Could not chdir to home directory /home/abc: No such file or directory
Sun Microsystems Inc. SunOS 5.10 Generic January 2005
$ id
uid=100(abc) gid=1(other)
$

將abc的密碼改為16個字元後,重新用abc登入系統,第一次先故意打錯密碼只打前8個字元,結果很明顯的是不給你進去。第二次我們把正確的密碼打進去後就可以登入系統了。
在使用新的加密方式後,原本的密碼依然是舊的加密方式,只有新建的使用者或是變更密碼才會使用新的加密方式。那沒變更過密碼的使用著還能登入嗎?因為系統是允許存在多個不同的加密演算法,就是CRYPT_ALGORITHMS_ALLOW中所設定的那三種,除非你手動的移除某一項,否則是都可以使用的。當然__unix__ 這一項是內建的,無法移除所以也就都可以使用。
或許有人會問,為什麼不用crypt_sunmd5呢?不是更安全更不易破解嗎?當然你可以視情況使用,不過使用crypt_bsdmd5的話,可以輕易的把帳號轉移到linux的平台去。不信你可以試著把/etc/passwd和/etc/shadow中abc那一行複製起來,然後貼到 linux系統上的/etc/passwd和/etc/shadow上,再使用abc登入看看。
最後,別忘了將root的密碼改一下,以使用更安全的密碼哦!

本來寫到這裡就要結束了,但是又想到了二個東西也很有趣,也和帳號有關所以順便也寫了下來。
solaris 10新增了一項歷史密碼的功能。開啟這個功能後,系統會記憶使用者所使用過的密碼,並且在更換密碼時不允許重複前幾次的密碼。這個功能可以防止有些人很懶老是使用相同的密碼,進而造成系統的安全缺口。最高記憶組數可達26組,這記憶力果然驚人。要開啟這個功能只要修改/etc/default/passwd,將HISTORY前的#拿掉,並且值設成HISTORY=n即可。

# grep HISTORY /etc/default/passwd
HISTORY=2
# su - abc
$ passwd abc
Enter existing login password:
New Password:
Re-enter new Password:
passwd: password successfully changed for abc
$ passwd abc
Enter existing login password:
New Password:
passwd: Password in history list.

Please try again
New Password:

如上面的範例所示,將HISTORY設定為2,然後以abc的身份修改密碼,第一次使用了1q2w3e4r。第二次再使用相同的密碼時,系統便會出訊息告訴你,這個密碼你之前用過了哦!然後要你重新輸入。很麻煩的新功能吧!
那歷史密碼放在那裡呢?就放在/etc/security/passhistory,裡頭放的依然是加密過的字串,以使用者名稱為開頭,每個欄位以: 分隔。有興趣自己去看一下吧!
另一個是當使用者登入錯誤幾次後就會被鎖住的功能,這個功能好像Solaris 8開始就有了。使用也很簡單,編輯 /etc/security/policy.conf,將LOCK_AFTER_RETRIES的值設定為YES,並將開頭的#字去掉存檔就ok了。這一個設定是全域的,也就是說每個使用者都受到影響。這個設定是開啟錯誤幾次後會鎖住,至於是幾次要鎖住則是要修改/etc/default/login的 RETRIES。另外有一個相關的是SYSLOG_FAILED_LOGINS,這一個是設定幾次登入錯誤後才會送訊息給syslog。如果設成0,那每次的錯誤都會被記錄起來。

#vi /etc/security/policy.conf
......
LOCK_AFTER_RETRIES=YES
#vi /etc/default/
......
RETRIES=3
SYSLOG_FAILED_LOGINS=3
# ssh abc@.
Password:
Password:
Password:
Permission denied (gssapi-keyex,gssapi-with-mic,publickey,keyboard-interactive).
# grep abc /etc/shadow
abc:*LK*$1$wzOJK8UX$JP2AcxvJh6pXQYfLj9k1w0:13399::::::9

上面的範例,開啟了帳號鎖住的功能,並將次數設定為三次。接著用ssh故意登入失敗,在三次失敗後我們可以看到 /etc/shadow中abc在密碼那一欄的最前面已經被加了*LK*,即表示這個帳號被鎖住了。
對於被鎖住的帳號可以使用passwd -u username來解開(-u 好像10才有),或者是手動的把/etc/shadow裡的*LK*拿掉就可以了。


假設你有一個同事常常打錯密碼而鎖住,因此來求你可不可以不要老是鎖住她的帳號時,你該怎麼辦?1.放棄討好漂亮妹妹的機會,凜然的告訴她,這是公司政策不可能為她而更改。2. 繼續看下去,學到最終奧義,然後幫她個人的帳號解套,最後還是落得好人卡一張。
我想多數人會選2,因為好機會不是天天有的,而且誰說未來一定是一張好人卡,說不定是抱得美人歸,或是......更多張好人卡呢!好啦!不管是什麼,總之呢,如果有的人不要套用帳號鎖定的功能的話,請編輯/etc/user_attr然後加入如下的資料
username::::lock_after_retries=no
帳號後接4個:,然後接著lock_after_retries=no這樣子就可以了。我們再以abc為例,修改好後的檔案長得像這個樣子。

# vi /etc/user_attr
adm::::profiles=Log Management
lp::::profiles=Printer Management
root::::auths=solaris.*,solaris.grant;profiles=Web Console Management,All;lock_after_retries=no
abc::::lock_after_retries=no

你可以再試看看,abc這個帳號還會不會被鎖住。最後還是要講一句,做任何的改變之前,一定要做備份。還有希望你不要領到好人卡。

沒有留言: