1. 程式人生 > >[一天幾個linux命令] Linux的賬號與群組

[一天幾個linux命令] Linux的賬號與群組

Linux的賬號與群組

管理員的工作中,相當重要的一環就是“管理賬號”啦!因為整個系統都是你在管理的,並且所有一般使用者的賬號申請,都必須要通過你的協助才行!所以你就必須要了解一下如何管理好一個伺服器主機的賬號啦!在管理Linux主機的賬號時,我們必須先來了解一下Linux到底是如何辨別每一個使用者的!

使用者識別碼:UID與GID

雖然我們登陸Linux主機的時候,輸入的是我們的賬號,但是其實Linux主機並不會直接認識你的“賬號名稱”的,他僅認識ID啊(ID就是一組號碼啦)。由於計算機僅認識0與1,所以主機對於數字比較有概念的;至於賬號只是為了讓人們容易記憶而已。而你的ID與賬號的對應就在/etc/passwd

當中哩。

那麼到底有幾種ID呢?每個檔案都具有“擁有者與擁有群組”的屬性嗎?沒錯啦!每個登陸的使用都至少都會取得兩個ID,一個是使用者ID(User ID, 簡稱UID),一個是群組ID(Group ID, 簡稱GID)。

那麼檔案如判別他的擁有者與群組呢?其實就是利用UID與GID啦!每個檔案都會有所謂的擁有者ID與擁有群組ID,當我們有要顯示檔案屬性的需求時,系統會依據/etc/passwd/etc/group的內容,找到UID/GID對應的賬號與群組名稱再顯示出來!我們可以作個小實驗,你可以用root的身份vim /etc/passwd,然後將你的一般身份的使用者的ID隨便改一個號碼,然後再到你的一般身份的目錄下看看原先該賬號擁有的檔案,你會發現該檔案的擁有人變成了“數字了”呵呵!這樣可以理解了嗎?來看看下面的例子

#1.先察看一下,系統裡面有沒有一個名為dmtsai的使用者
id dmtsai
uid=1000(dmtsai) gid=1000(dmtsai) groups=1000(dmtsai),10(whell) ⇐ 確定有這個賬號叫喔

ll -d /home/dmtsai
drwx------. 17 dmtsai dmtsai 4096 Jul 17 19:51 /home/dmtsai
#瞧一瞧,使用者的欄位正是dmtsai本身喔!

#2. 修改一下,將剛剛我們的dmtsai的1000UID改為2000看看:
vim /etc/passwd
.... (前面省略)....
dmtasi:2000:1000:dmtsai:/home/dmtsai
:/bin/bash <== 修改一下特殊字型部分,由1000改過來 ll -d /home/dmtsai drwx------. 17 1000 dmtsai 4096 Jul 17 19:51 /home/dmtsai #很害怕吧!怎麼變成1000了?因為檔案只會記錄UID的數字而已! #因為我們亂改,所以導致1000找不到對應的賬號,因此顯示數字! #3. 記得將剛剛的2000改回來! vim /etc/passwd .... (前面省略).... dmtsai:x:1000:1000:dmtsai:/home/dmtsai:/bin/bash ⇐ “務必一定要”改回來!

你一定要了解的是,上面的例子僅是在說明UID的賬號的對應性,在一部正常執行的Linux主機環境下,上面的動作不可隨便進行,這是因為系統上已經有很多的資料被建立存在了,隨意修改系統上某些賬號的UID很可能會導致某些程式無法進行,這將導致系統無法順利執行的結果,因為許可權的問題啊!,所以,瞭解了之後,請趕快回到/etc/passwd裡面,將數字改回來喔!

使用者賬號

Linux系統上面的使用者如果需要登陸主機以取得shell的環境來工作時,他需要如何進行呢?首先,他必須要在計算機前面利用tty1~tty6的終端機提供的login介面,並輸入賬號與密碼後才夠登陸。如果是通過網路的話,那至少使用者就得要學習ssh這個功能了。那麼你輸入賬號密碼後,系統幫你處理了什麼呢?

  • 先找尋/etc/passwd裡面是否有你輸入的賬號?如果沒有則跳出,如果有的話則將該賬號對應的UID與GID(在/etc/group中)讀出來,另外,該賬號的主資料夾與shell設定也一併讀出
  • 再來則是核對密碼錶啦!這時Linux會進入/etc/shadow裡面找出對應的賬號與UID,然後核對一下你剛剛輸入的密碼與裡頭的密碼是否相符?
  • 如果一切都OK的話,就進入Shell控管的階段囉!
    大致上的情況就像這樣,所以當你要登陸你的Linux主機的時候,那個/etc/passwd與/etc/shadow就必須要讓系統讀取啦(這也是很多攻擊者會將特殊賬號寫到/etc/passwd裡頭去的緣故),所以呢,如果你要備份Linux的系統賬號的話,那麼這兩個檔案就一定需要備份才行呦!
    由上述的流程我們也知道,跟使用者賬號有關的有兩個非常重要的檔案,一人是管理使用者UID/GID 重要引數的/etc/passwd, 一個則是專門管理密碼相關資料的/etc/shadow囉!那這兩個檔案的內容就非常值的進行研究啦!下面我們會簡單的介紹這兩個檔案,詳細的說明可以參考man 5 passwd 及 man 5 shadow

/etc/passwd檔案結構

這個檔案的構造是這樣的:每一行都代表一個賬號,有幾行就代表有幾個賬號在你的系統中!不過需要特別留意的是,裡頭很多賬號本來就是系統正常執行所必須要的,我們可以簡稱他為
系統賬號,例如bin, daemon, adm, nobody等等,這些賬號請不要隨意的殺掉他呢!這個檔案內容有點像這樣:

head -n 4 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

我們先來看一下每一個Linux系統都會有的第一行,就是root這個系統管理員那一行了,你可以明顯的看出來,第一行使用”:”分隔開,共有七個咚咚,分別是:

  1. 賬號名稱:就是賬號啦!用來提供給對數字不太敏感的人類使用來登陸系統的!需要用來對應UID喔。例如root的UID對應就是0(第三個欄位)
  2. 密碼:早期Unix系統的密碼就是放在這欄位上!但是因為這個檔案的特性是所有的程式都能夠讀取,這樣一來很容易造成密碼資料被竊取,因此後來就將這個欄位的密碼資料給他改放到/etc/shadow中了。所以裡你會看到一個”x”,呵呵!
  3. UID:這個就是使用者識別碼囉!通常Linux對於UID有幾個限制需要給您瞭解一下:
id範圍 該ID使用者特性
0(系統管理員) 當UID是0時,代表這個賬號是“系統管理員”!所以當你要讓其他的賬號名稱也具有root的許可權時,將該賬號的UID改為0即可。你也就是說,一部系統上面的系統管理員不見得只有root喔!不過,很不建議有多個賬號的UID是0啦~容易讓系統管理員混亂!
1~999(系統賬號) 保留給系統使用的ID,其實除了0之外,其他的UID許可權與特性並沒有不一樣。預設1000以下的數字讓給系統作為保留賬號只是一個習慣。 由於系統上面啟動的網路服務或背景服務希望使用較小的許可權去執行,因此不希望使用root的身份去執行這些服務,所以我們就得要提供這些執行中程式的擁有賬號才行。這些系統賬號通常是不可登陸的所以才會有/sbin/nologin這個特殊的shell存在。根據系統賬號的由來,通常這類賬號又約被區分為兩種:1~200:由distributions自行建立的系統賬號;201~999:若使用者有系統賬號需求時,可以使用的賬號UID。
1000-60000(可登陸賬號) 給一般使用者用的。事實上,目前的linux核心(3.10.x版)已經可以支援到2^32-1這麼大的UID號碼喔!

上面這樣說明可以瞭解了嗎?是的,UID為0的時候,就是root呦!所以請特別留意一下你的/etc/passwd檔案!

  1. GID:這個與/etc/group有關!其實/etc/group的觀念與/etc/passwd差不多,只有他是用來規範組名稱與GID對應而已
  2. 使用者資訊說明欄:這個欄位基本上並沒有什麼重要用途,只是用來解釋這個賬號的意義而已!不過,如果您提供使用finger的功能時,這個欄位可以提供很多的訊息呢!
  3. 主資料夾:這是使用者的主資料夾,以上面為例,root的主資料夾在/root,所以當root登陸之後,就會立刻跑到/root目錄裡頭啦!呵呵!如果你有個賬號的使用空間特別大,你想要將該賬號的主資料夾移動到其他的硬碟去該怎麼作?沒有錯!可以在這個欄位進行個性呦!預設的使用者主資料夾在/home/yourIDname
  4. Shell:當使用者登陸系統後就會取得一個Shell來與系統的核心溝通以進行使用者的操作任務。那為何預設shell會使用bash呢?就是在這個欄位指定的囉!這裡比較需要注意的是,有一個shell可以用來替代成讓賬號無法取得shell環境的登陸動作!那就是/sbin/nologin這個東西!這也可以用來製作純pop郵件賬號者的資料呢!

/etc/shadow檔案結構

我們知道很多程式的執行都與許可權有關,而許可權與UID/GID有關!因此各程式當然需要讀取/etc/passwd來了解不同賬號的許可權。因此/etc/passwd的許可權需設定-rw-r–r–這樣的情況,雖然早期的密碼也有加密過,但卻放置到/etc/passwd的第二個欄位上!這樣一來很容易被有心人士竊取的,加密過的密碼也能夠通過暴力破解法去找出來

因為這樣的關係,所以後來發展出將密碼移動到/etc/shadow這個檔案分隔開來的技術,而且還加入很多的密碼限制引數在/etc/shadow裡頭呢!在這裡,我們先來了解一下這個檔案的構造吧!
這裡寫圖片描述

  1. 賬號名稱:由於密碼也需要與賬號對應啊~因此,這個檔案的第一欄就是賬號,必須要與/etc/passwd相同才行!
  2. 密碼:這個欄位內的資料才是真正的密碼,而且是經過編碼的密碼(加密)啦!你只會看到有一些特殊符號的字母就是了!需要特別留意的是,雖然這些加密很難被解出來,但是“很難”不等於“不會”,所以,這個檔案的預設許可權是“-rw——–”或者是“———-”,亦即只有root才可以讀寫就是了!你得隨時注意,不要不小心更動了這個檔案的許可權呢!
    另外,由於各種密碼編碼的技術不一樣,因些不同的編碼系統會造成這個欄位的長度不相同。舉例來說,舊式的DES, MD5編碼系統產生的密碼長度就與目前慣用的SHA不同!SHA的密碼長度明顯的比較長些。由於固定的編碼系統產生的密碼長度必須一致,因此“當你讓這個欄位的長度改變後,該密碼就會失效(算不出來)”。很多軟體通過這個功能,在此欄位前加上!或*改變密碼欄位長度,就會讓密碼“暫時失效了”
  3. 最近更動密碼的日期:這個欄位記錄了“更動密碼那一天”的日期,不過,很奇怪呀!在我的例子中怎麼會是16559呢?呵呵,這個是因為計算Linux日期的時間是以1970年1月1日作為1而累加的日期,1971年1月1日則為366啦!得注意一下這個資料呦!上述的16559指的就是2015-05-04那一天啦!瞭解乎?而想要了解該日期可以使用本章後面chage指令的幫忙!至於想要知道某個日期的累積日數,可以使用如下的程式計算:
echo $(( $(date --date="2015/05/04" +%s)/86400+1))

上述指令中,2015/05/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:$68765432fsdfer...:16559:5:60:7:5:16679:

這表示什麼呢?先要注意的是16559是2015/05/04。所以dmtsai這個使用者的密碼相關意義是:

  • 由於密碼幾乎僅能單向運算(由明碼計算成為密碼,無法由密碼反推明碼),因此由上表的資料我們無法得知dmstai的實際密碼明文(第二個欄位)
  • 此賬號最近一次更動密碼的日期是2015/05/04(16559)
  • 能夠再次修改密碼的時間是5天以後,也就是2015/05/09以前dmtsai不能修改自己的密碼;如果使用者還是嘗試要更動自己的密碼,系統就會出現這樣的訊息:
You must wait longer to change your password
passwd: Authentication token manipulation error

畫面中告訴我們:你必須要等待更久的時間才能夠變更密碼之意啦!
- 由於密碼過期日期定義為60天后,亦即累積日數為:16559+60=16619,經過計算得到此日數代表日期為2015/07/03。這表示:“使用者必須要在2015/05/09(前5天不能改)到2015/07/03之間的60天限制內修改自己的密碼,若2015/07/03這後還是沒有變更密碼時,該密碼就宣告為過期”了!
- 警告日期設定為7天,亦即是密碼過期日前的7天,在本例中則代表2015/06/26 ~ 2015/07/03這七天。如果使用者一直沒有更改密碼,那麼在這7天中,只要dmtsai登陸系統就會發現如下的訊息:

Warning:your password will expire in 5 days
  • 如果該賬號一直到2015/07/03都沒有更改密碼,那麼密碼就過期了。但是由於有5天的寬限天數,因此dmtsai在2015/07/08前都還可以使用舊密碼登陸主機。不過登陸時會出現強制更改密碼的情況,畫面有點像下面這樣:
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:

你密碼要輸入一次舊密碼以級兩次新密碼後,才能夠開始使用系統的各項資源。如果你是在2015/07/08以後嘗試以dmtsai登陸的話,那麼就會出現如下的錯誤訊息且無法登陸,因為此時你的密碼就失效去啦!

Your account has expired; please contact your system administrator
  • 如果使用者在2015/07/03以前變更過密碼,那麼第3個欄位的那個16559的天數就會跟著改變,因此,所有的限制日期也會跟著相對變動喔!
  • 無論使用者如何動作,到了16679(大約是2015/09/01左右)該賬號就失效了

總結

記憶id這個命令
記憶/etc/passwd /etc/shadow檔案的格式和代表的意義

參考文獻

《鳥哥的私房菜-基礎學習篇》