2011年3月24日 星期四

/etc/shadow 檔案結構

我們知道很多程式的運作都與權限有關,而權限與 UID/GID 有關!因此各程式當然需要讀取 /etc/passwd 來瞭解不同帳號的權限。 因此 /etc/passwd 的權限需設定為 -rw-r--r-- 這樣的情況, 雖然早期的密碼也有加密過,但卻放置到 /etc/passwd 的第二個欄位上!這樣一來很容易被有心人士所竊取的, 加密過的密碼也能夠透過暴力破解法去 try and error (試誤) 找出來!
因為這樣的關係,所以後來發展出將密碼移動到 /etc/shadow 這個檔案分隔開來的技術, 而且還加入很多的密碼限制參數在 /etc/shadow 裡頭呢!在這裡,我們先來瞭解一下這個檔案的構造吧! 鳥哥的 /etc/shadow 檔案有點像這樣:
[root@www ~]# head -n 4 /etc/shadow
root:$1$/30QpE5e$y9N/D0bh6rAACBEz.hqo00:14126:0:99999:7:::  <==底下說明用
bin:*:14126:0:99999:7:::
daemon:*:14126:0:99999:7:::
adm:*:14126:0:99999:7:::
基本上, shadow 同樣以『:』作為分隔符號,如果數一數,會發現共有九個欄位啊,這九個欄位的用途是這樣的:
  1. 帳號名稱
    由於密碼也需要與帳號對應啊~因此,這個檔案的第一欄就是帳號,必須要與 /etc/passwd 相同才行!
  2. 密碼
    這個欄位內的資料才是真正的密碼,而且是經過編碼的密碼 (加密) 啦! 你只會看到有一些特殊符號的字母就是了!需要特別留意的是,雖然這些加密過的密碼很難被解出來, 但是『很難』不等於『不會』,所以,這個檔案的預設權限是『-rw-------』或者是『-r--------』,亦即只有 root 才可以讀寫就是了!你得隨時注意,不要不小心更動了這個檔案的權限呢!

    另外,由於各種密碼編碼的技術不一樣,因此不同的編碼系統會造成這個欄位的長度不相同。 舉例來說,舊式的 DES 編碼系統產生的密碼長度就與目前慣用的 MD5 不同(註2)!MD5 的密碼長度明顯的比較長些。由於固定的編碼系統產生的密碼長度必須一致,因此『當你讓這個欄位的長度改變後,該密碼就會失效(算不出來)』。 很多軟體透過這個功能,在此欄位前加上 ! 或 * 改變密碼欄位長度,就會讓密碼『暫時失效』了。
  3. 最近更動密碼的日期
    這個欄位記錄了『更動密碼那一天』的日期,不過,很奇怪呀!在我的例子中怎麼會是 14126 呢?呵呵,這個是因為計算 Linux 日期的時間是以 1970 年 1 月 1 日作為 1 而累加的日期,1971 年 1 月 1 日則為 366 啦! 得注意一下這個資料呦!上述的 14126 指的就是 2008-09-04 那一天啦!瞭解乎? 而想要瞭解該日期可以使用本章後面 chage 指令的幫忙!至於想要知道某個日期的累積日數, 可使用如下的程式計算:
    [root@www ~]# echo $(($(date --date="2008/09/04" +%s)/86400+1))
    14126
    上述指令中,2008/09/04 為你想要計算的日期,86400 為每一天的秒數, %s 為 1970/01/01 以來的累積總秒數。 由於 bash 僅支援整數,因此最終需要加上 1 補齊 1970/01/01 當天。
  4. 密碼不可被更動的天數:(與第 3 欄位相比)
    第四個欄位記錄了:這個帳號密碼在最近一次被更改後需要經過幾天才可以再被變更!如果是 0 的話, 表示密碼隨時可以更動的意思。這的限制是為了怕密碼被某些人一改再改而設計的!如果設定為 20 天的話,那麼當你設定了密碼之後, 20 天之內都無法改變這個密碼呦!
  5. 密碼需要重新變更的天數:(與第 3 欄位相比)
    經常變更密碼是個好習慣!為了強制要求使用者變更密碼,這個欄位可以指定在最近一次更改密碼後, 在多少天數內需要再次的變更密碼才行。你必須要在這個天數內重新設定你的密碼,否則這個帳號密碼將會『變為過期特性』。 而如果像上面的 99999 (計算為 273 年) 的話,那就表示,呵呵,密碼的變更沒有強制性之意。
  6. 密碼需要變更期限前的警告天數:(與第 5 欄位相比)
    帳號密碼有效期限快要到的時候 (第 5 欄位),系統會依據這個欄位的設定,發出『警告』言論給這個帳號,提醒他『再過 n 天你的密碼就要過期了,請盡快重新設定你的密碼呦!』,如上面的例子,則是密碼到期之前的 7 天之內,系統會警告該用戶。
  7. 密碼過期後的帳號寬限時間(密碼失效日):(與第 5 欄位相比)
    密碼有效日期為『更新日期(第3欄位)』+『重新變更日期(第5欄位)』,過了該期限後使用者依舊沒有更新密碼,那該密碼就算過期了。 雖然密碼過期但是該帳號還是可以用來進行其他工作的,包括登入系統取得 bash 。不過如果密碼過期了, 那當你登入系統時,系統會強制要求你必須要重新設定密碼才能登入繼續使用喔,這就是密碼過期特性

    那這個欄位的功能是什麼呢?是在密碼過期幾天後,如果使用者還是沒有登入更改密碼,那麼這個帳號密碼將會『失效』, 亦即該帳號再也無法使用該密碼登入了。要注意密碼過期與密碼失效並不相同
  8. 帳號失效日期
    這個日期跟第三個欄位一樣,都是使用 1970 年以來的總日數設定。這個欄位表示: 這個帳號在此欄位規定的日期之後,將無法再使用。 就是所謂的『帳號失效』,此時不論你的密碼是否有過期,這個『帳號』都不能再被使用! 這個欄位會被使用通常應該是在『收費服務』的系統中,你可以規定一個日期讓該帳號不能再使用啦!
  9. 保留
    最後一個欄位是保留的,看以後有沒有新功能加入。
舉個例子來說好了,假如我的 dmtsai 這個使用者的密碼欄如下所示:
dmtsai:$1$vyUuj.eX$omt6lKJvMcIZHx4H7RI1V.:14299:5:60:7:5:14419:
這表示什麼呢?先要注意的是 14299 是 2009/02/24 。所以 dmtsai 這個使用者的密碼相關意義是:
  • 由於密碼幾乎僅能單向運算(由明碼計算成為密碼,無法由密碼反推回明碼),因此由上表的資料我們無法得知 dmstai 的實際密碼明文
  • 帳號最近一次更動密碼的日期是 2009/02/24 (14299);
  • 能夠再次修改密碼的時間是 5 天以後,也就是 2009/03/01 以前 dmtsai 不能修改自己的密碼;如果使用者還是嘗試要更動自己的密碼,系統就會出現這樣的訊息:
    You must wait longer to change your password
    passwd: Authentication token manipulation error
    畫面中告訴我們:你必須要等待更久的時間才能夠變更密碼之意啦!
  • 由於密碼過期日期定義為 60 天後,亦即累積日數為: 14299+60=14359,經過計算得到此日數代表日期為 2009/04/25。 這表示:『使用者必須要在 2009/03/01 到 2009/04/25 之間的 60 天限制內去修改自己的密碼,若 2009/04/25 之後還是沒有變更密碼時,該密碼就宣告為過期』了!
  • 警告日期設為 7 天,亦即是密碼過期日前的 7 天,在本例中則代表 2009/04/19 ~ 2009/04/25 這七天。 如果使用者一直沒有更改密碼,那麼在這 7 天中,只要 dmtsai 登入系統就會發現如下的訊息:
    Warning: your password will expire in 5 days
  • 如果該帳號一直到 2009/04/25 都沒有更改密碼,那麼密碼就過期了。但是由於有 5 天的寬限天數, 因此 dmtsai 在 2009/04/30 前都還可以使用舊密碼登入主機。 不過登入時會出現強制更改密碼的情況,畫面有點像底下這樣:
    You are required to change your password immediately (password aged)
    WARNING: Your password has expired.
    You must change your password now and login again!
    Changing password for user dmtsai.
    Changing password for dmtsai
    (current) UNIX password:
    你必須要輸入一次舊密碼以及兩次新密碼後,才能夠開始使用系統的各項資源。如果你是在 2009/04/30 以後嘗試以 dmtsai 登入的話,那麼就會出現如下的錯誤訊息且無法登入,因為此時你的密碼就失效去啦!
    Your account has expired; please contact your system administrator
  • 如果使用者在 2009/04/25 以前變更過密碼,那麼第 3 個欄位的那個 14299 的天數就會跟著改變,因此, 所有的限制日期也會跟著相對變動喔!^_^
  • 無論使用者如何動作,到了 14419 (大約是 2009/07/24 左右) 該帳號就失效了~
透過這樣的說明,您應該會比較容易理解了吧?由於 shadow 有這樣的重要性,因此可不能隨意修改喔! 但在某些情況底下你得要使用各種方法來處理這個檔案的!舉例來說,常常聽到人家說:『我的密碼忘記了』, 或者是『我的密碼不曉得被誰改過,跟原先的不一樣了』,這個時候怎麼辦?
  • 一般用戶的密碼忘記了:這個最容易解決,請系統管理員幫忙, 他會重新設定好你的密碼而不需要知道你的舊密碼!利用 root 的身份使用 passwd 指令來處理即可。
  • root 密碼忘記了:這就麻煩了!因為你無法使用 root 的身份登入了嘛! 但我們知道 root 的密碼在 /etc/shadow 當中,因此你可以使用各種可行的方法開機進入 Linux 再去修改。 例如重新開機進入單人維護模式(第二十章)後,系統會主動的給予 root 權限的 bash 介面, 此時再以 passwd 修改密碼即可;或以 Live CD 開機後掛載根目錄去修改 /etc/shadow,將裡面的 root 的密碼欄位清空, 再重新開機後 root 將不用密碼即可登入!登入後再趕快以 passwd 指令去設定 root 密碼即可。
Tips:
曾經聽過一則笑話,某位老師主要是在教授 Linux 作業系統,但是他是兼任的老師,因此對於該系的電腦環境不熟。 由於當初安裝該電腦教室 Linux 作業系統的人員已經離職且找不到聯絡方式了,也就是說 root 密碼已經沒有人曉得了! 此時該老師就對學生說:『在 Linux 裡面 root 密碼不見了,我們只能重新安裝』...感覺有點無力~ 又是個被 Windows 制約的人才!
鳥哥的圖示

沒有留言:

張貼留言