Linux密碼 – 淺談 pam_cracklib 模組

Linux 使用 PAM 模組,設定密碼複雜原則,可以透過 /etc/pam.d/system-config-ac,但是,pam_cracklib這個模組,卻比想像中複雜~~~

測試環境是 RHEL 6.0 64位元版

先從最簡單的下手(其實並不簡單)

minlen = 8,要求密碼最少 8 位

image

將使用者的密碼變更為『NDUOWXFI』(只有大寫,長度 8 位)

image

可以成功修改密碼,看起來相當簡單,接著將 minlen 改成 9(密碼要求 9 位)

image

繼續使用相同的密碼『NDUOWXFI』(只有大寫,長度 8 位)

image

為什麼?不是需要 9 位嗎?為何 8 位密碼也可以過關?

原因在於 ucredit(大寫的 credit 預設值為 1 )

image

minlen = 密碼長度 + ucredit(大寫的 credit 值)+ lcredit(小寫的 credit 值)+ dcredit(數字的 credit 值) + ocredit(特殊符號(或其他)的 credit 值)

這個例子的 minlen = 9,密碼『NDUOWXFI長度 = 8,ucredit = 1,其他都是 0,所以,這是個符合規則的密碼。

將 ocredit 設定為 2

image

修改成 7 位的密碼『NDUOWXF,再加上 credit = 2,還是可以修改

image

但是,如果將 minlen 改成 10

image

7 位的密碼『NDUOWXF,再加上 credit = 2,只有 9 ,所以,無法修改密碼

image

再看看以下案例,應該會更清楚 credit 的定義:

minlen = 13,沒有指定 ucredit,所以,使用預設值,ucredit = 1

image

密碼『NDUOWXFI』長度 8 位,再加上 ucredit = 1(使用預設值),所以, 8+1=9,9小於 13,這組密碼檢查時會無法使用

image

但是,只要加上 ucredit=5

image

剛剛明明就是不合理的密碼『NDUOWXFI』,竟然就變成合理的密碼了

image

為什麼呢?因為 ucredit=5 指定大寫 credit 最多為 5,這組密碼『NDUOWXFI』的長度為 8,ucredit=5,其他 credit 都是 0,剛剛好就是 13

是真的嗎?為了驗證這件事,將 minlen 改成 14,如果剛剛的算法是對的,那麼,這組密碼『NDUOWXFI』將會是不合理的密碼。

image

果然,這組密碼『NDUOWXFI』變成是不合理的密碼。

image

相較於 ocredit 為正數,負數反為單純多了

image

ucredit=-8,就是至少 8 位,完全獨立,跟其他項目無關,跟 ucredit=5 也沒有關係

接下來,就針對幾個 use case 討論:

  • 密碼長度 12

不能夠只有 minlen = 12

image

因為 credit 的關係,這組密碼『NDUOWXFITPM』長度只有 11 位,但是,ucredit = 1(因為沒有指定 ucredit,預設值為 1),也是合理的密碼

image

這組密碼『NDUOWXFITPm』長度還是只有 11 位,但是 ucredit = 1,lcredit = 1,也是合理的密碼

image

所以,如果要求密碼長度 12,則必須要將 credit 通通歸 0

image

剛剛的兩組密碼『NDUOWXFITPM』『NDUOWXFITPm』,通通會因為長度只有 11 位,而變成無效的密碼

image

  • 密碼長度 8,大寫、小寫、數字、特殊符號四選三

image

用線上的密碼產生器隨機產生密碼 – Strong Password Generator

image

隨便挑一組密碼『Z6x*iEu}』試試:

image

這組密碼『Z6x*iEu}』大寫、小寫、數字、特殊符號都用上了,改成『Zax*iEu}』(改數字 6,改成小寫 a,變成只有用到大寫、小寫、特殊符號三種)試試看:

image

一樣是合理的密碼!

可不可以只寫 minlen = 8 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 minclass=3,而不指定 ucredit=0 lcredit=0 dcredit=0 ocredit=0 呢?

image

一樣透過線上的密碼產生器隨機產生密碼『hO6/C]B』- 長度 7,大寫、小寫、數字、特殊符號都有用,大寫出現了三次,ucredit是否為 3 呢?

image

結果,這組密碼『hO6/C]B』不可以使用,顯然,ucredit=-1,而不指定 ucredit=0,其效果跟ucredit = -1 ucredit = 0是一樣的!

最後,來個重點整理吧!

  • minlen = 密碼長度 + ucredit + lcredit + dcredit + ocredit
  • ucredit、lcredit、dcredit、ocredit不指定時(包括正數、0、負數都不指定),預設值為 1
  • ucredit = 5(正數,參考前面的例子),是指定大寫的credit最大值為 5
密碼 ucredit 註解、說明
沒使用大寫 0  
A 1  
AB 2  
ABC 3  
ABCD 4  
ABCDE 5  
ABCDEF 5 ucredit最大為 5
ABCDEFG 5 ucredit最大為 5

 

  • ucredit = -1(參考前面的例子),而不指定 ucredit 為 0 或正數,相當於 ucredit = 0 的效果
  • ucredit = -1 ucredit = 0,跟上一個一模一樣
  • ucredit = -1 ucredit = 5,就是 ucredit = 5,再加上至少一個大寫,換言之,負數跟正數是完全獨立的

ucredit數值的關係:((負數OR0 OR 正數))

負數 0 正數 註解、說明
不使用 不使用 5 ucredit最大為 5
-1 不使用 不使用 大寫至少 1 位
-1 0 不使用 同上一個
-1 不使用 5 ucredit最大為 5,大寫至少 1 位

 

最後的重點就是,作者應該是神經病,寫出一堆整人的參數!收工!

Advertisements
本篇發表於 網路, Linux, Secure資訊安全。將永久鏈結加入書籤。

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s