首頁 > 軟體

Linux基礎知識之使用者和使用者組以及 Linux 許可權管理

2020-06-16 17:30:07

已經開始接觸Linux使用者管理,使用者組管理,以及許可權管理這幾個逼格滿滿的關鍵字。這幾個關鍵字對於前端程式猿的我來說真的是很高大上有木有,以前嘗試學 Linux 的時候看到這些名詞總是下意識的跳過不敢看有木有,一提起這幾個名詞馬上腦海中總是升騰起無限的崇拜有木有!今天就硬著頭皮捯飭捯飭這幾個概念,希望能有所收穫。

  1.從 /etc/passwd 說起

  前面的基本命令學習中,我們介紹了使用 passwd 命令可以修改使用者密碼。對於作業系統來說,使用者名稱和密碼是存放在哪裡的呢?我們都知道一個站點的使用者名稱和密碼是存放在資料庫中,資料庫是用來儲存記錄資料的,我們常用的資料庫有 MySQL,Oracle,MongoDB等。其實,我們把 MySQL 等叫做資料庫是不嚴謹的,因為它們只是資料庫的管理軟體,從廣義上來說,任何能儲存資料的東東都可以叫做資料庫。比如文字。

  資料庫是用來儲存資料的,作業系統中的使用者名稱和密碼也理應存放在資料庫中,這個資料庫是啥呢?在 Linux 下,它是處於 /etc 下的一個叫 passwd 的檔案。我們不妨看一下這個檔案中的內容。

  

  大多數人看到這種東東一般都會說:什麼?你確定這不是天書?這裡面能瞅到啥?說實話,除了行號,我一個都不認識!

  好了,再仔細看看,找找規律。經過你的仔細觀察,你可能會注意到以下幾點訊息:

    • 每一行文字都有數個英文格式的冒號(:) ,它們對每一行文字進行了分割    
    • 仔細數一數,每行文字的冒號數量都是相同的
    • 再仔細數一數,如果我們把冒號前後的東東叫欄位的話,每行文字中的欄位數目都是相同的(包括空欄位)
    • 首行的 root 和尾行的 charley,不就分別是我們的兩個賬戶嗎

  於是你大膽的猜測:對的!這就是我們的使用者表,這些表也包含一個個欄位,這些欄位用來存放使用者的某些資訊!事實上也正是如此,/etc/passwd 儲存了使用者相關的資訊,包括使用者名稱,密碼,所屬組等等。或許你還會有疑問:明明我們只有兩個使用者,一個管理員賬戶 root,一個是普通使用者 charley,那其他的東西是什麼呢?為什麼他們也出現在這個表裡面?別急,先從分組形式講起。

  2.一些常見的分組形式

  下面,我們就對使用者,使用者組以及上面的一些疑問進行展開討論。首先介紹一些對使用者或者使用者組分組的方式,站在不同的角度,可以進行不同的區分。

    • 通過使用者型別分組,我們可以把使用者分為:
      • 管理員
      • 普通使用者
    • 通過使用者組型別分組,我們可以把使用者組分為:
      • 管理員組
      • 普通使用者組
    • 從使用者的角度,我們可以把使用者組分為:
      • 基本組(預設組)
      • 額外組(附加組)
    • 對於普通使用者,我們還可以分為:
      • 系統使用者
      • 普通使用者
    • 因此,對於普通使用者組,我們也可以分為:
      • 系統使用者組
      • 普通使用者組

  上面的分組方式是不是看的你眼花繚亂呢?沒關係,其實對使用者或者使用者組分組,本身就是多解的,只是由於站的角度不同,產生了不同的結果而已。換個角度,我們還可以再來 N 種分組形式,以上只是常規的分法。由於這些分組的形式可以體現在我們建立使用者或者使用者分組命令選項中,在學習了建立使用者和建立使用者組的命令之後,自然可以輕鬆的理解這些概念。

  3.理解使用者

  我們知道 /etc/passwd 相當於作業系統儲存使用者資訊的資料庫,那麼如此可以得出表中每行資料都是代表了一個特定的使用者,但是除了系統的 root 使用者和我們建立的一個普通使用者 charley 之外,還有很多其他的東西,這些東西是什麼呢?它們也是使用者嗎?是的,這些我們不認識的東東,也是使用者,只不過不是有我們建立,而是由作業系統建立的,所以叫做系統使用者。

  某人如果想使用作業系統的某些功能,那麼他必須是這個系統上的一個使用者(客人使用者也是使用者)。使用者登入作業系統之後,作業系統可以由使用者的特徵碼進行許可權的分配,以便使用作業系統的功能。

  我們使用計算機,使用作業系統,是為了讓他們幫我們完成某些任務,具體下來,是通過呼叫作業系統上的軟體來完成,讓軟體幫我們做事。作業系統在啟動的時候,有一些必要的應用、服務等需要啟動,而遵循前面講到的簡單邏輯,啟動軟體的必須得是作業系統上的使用者。按照這個邏輯,Linux 系統為我們建立了一些系統使用者,通過它們來在作業系統啟動時執行相應的檔案。可見系統使用者是不需要登入的,也叫非登入使用者,請先記住這一點。

  上面講到了使用者特徵碼,作業系統時通過使用者特徵碼來識別使用者的。對於淫類,我們識別使用者是通過使用者名稱,因為使用者名稱(字串)好記。而計算機覺得數位更好記一些,於是在建立使用者時系統會為其分配一個唯一的特徵碼,用以識別該使用者,這個特徵碼也叫UID。同樣的,使用者組也有特徵碼,叫做GID。

  Linux 系統中,UID以如下的方式劃分:

    • 0 表示管理員(root)
    • 1 - 500 表示系統使用者
    • 501 - 65535 表示普通使用者
    • 不同的 Linux 發行版,這些數位可能不一樣

  4. /etc/passwd 中的欄位分析

  /etc/passwd 中的欄位分別表示如下資訊(欄位名字是我自己取的):

    • ACCOUNT:使用者名稱
    • PASSWORD:密碼預留位置
    • UID:使用者ID
    • GID:使用者組ID
    • COMMAND:注釋資訊
    • HOME DIR:使用者家目錄
    • SHELL:使用者的預設 shell

  密碼預留位置,其值是 x,顯然這不是真正的密碼。真正的密碼儲存在哪裡呢?在 /etc/shadow 檔案中,此檔案中儲存的也不是明文密碼,而是經過加密處理之後的密碼。我們來看一下 /etc/shadow 中的內容(root only):

  

  可見,/etc/shadow 中儲存的也是資料表,這個表也和使用者相關。還記得第二天說到的 man 命令嗎?man 手冊的第五個章節是特殊檔案,我們來 man 一波試試:

 

  對於 /etc/shadow 中每個欄位的含義,手冊中都給出了說明,我們可以去參考(這裡只給出了一部分截圖)。同理,對於 /etc/passwd,我們也可以通過 man 5 passwd 檢視每一個欄位表示的含義。

  好了,回到 PASSWORD 欄位,我們看一下 root 使用者和 charley 的此項欄位值,可以看到此值中有一些規律可循:

    • $1$XXXXXXXX$XXXXXXXXXX.....

  我們可以通過此欄位來獲取如下資訊:

    • 前兩個美元符號中的數位1表示加密方式是 md5
    • 第二個和第三個美元符號之間的字串是經過加密後的密碼鹽值
    • 第三個美元符號之後的字串是密碼明文精加密的後的特徵碼

  既然談到了加密和鹽值,我們來複習一下關於加密的基礎知識。我們通常用到的加密方式有一下幾種:

    • 對稱加密:使用同一套密碼進行加密和解密

    • 公鑰加密:每個密碼以私鑰(secret key)和公鑰(public key)成對出現,公鑰進行的加密使用與其配對的私鑰解密,反之亦然,相對於對稱加密,速度很慢,一般不用於加密,而是秘鑰交換
    • 單向加密(雜湊加密):只能加密不能解密。也就是說只能由明文取得密文,而不能由密文取得明文。經過單向加密得到的是一份唯一的特徵碼,每個資料的特徵碼是獨一無二的,因此也叫作指紋加密。如果兩次演算法取得的特徵碼一樣,那麼就是同一份資料。???向加密可以用來做資料校驗,如果資料被動了手腳,那麼資料的特徵碼就不一樣。常用的雜湊加密方式有:

      • MD5:定長128位元輸出特徵碼
      • SHA1:定長160位元輸出特徵碼
      • 還有其他方式,主要體現在特徵碼輸出長度的不同
    • 單向加密的特點:
      • 不可逆
      • 雪崩效應:資料的微小改變,會引起特徵碼的巨大變化
      • 定長輸出:不管加密的內容長度多少,輸出的特徵碼長度都是一樣
    • 加鹽:如果兩個使用者使用了同樣的密碼,那麼經過 MD5 雜湊加密後的特徵碼就是一致的,如果一個使用者偶然發現另一個使用者的特徵碼和他自己是一樣的,那麼就可以推斷另一個使用者的密碼。這是不太安全的。為了安全起見,我們需要用到雜湊加密特點中的雪崩效應,往密碼中額外加點雜質(內容),這樣加密後的特徵碼就千差萬別了。這個過程就是所謂的加鹽。

  5.useradd 命令:新增使用者

  說了那麼多,終於來點真格的了,Linux 中使用 useradd 命令新增一個使用者。這個命令很簡單,簡單到只使用 useradd USERNAME 就可以新增一個使用者。

  我們新建一個使用者 MIKE,然後檢視 /etc/passwd 中的對應內容:

  

  在 /etc/passwd 的最後一行,我們看到了剛剛新增的使用者,並且系統自動設定了使用者的一些屬性,比如UID,GID,HOME DIR等。我們也可以手動指定新增使用者的資訊:

    • useradd -u UID:指定 UID,這個 UID 必須是大於等於500,並沒有其他使用者占用的 UID
    • useradd -g GID/GROUPNAME:指定預設組,可以是 GID 或者 GROUPNAME,同樣也必須真實存在
    • useradd -G GROUPS:指定額外組
    • useradd -c COMMENT:指定使用者的注釋資訊
    • useradd -d PATH:指定使用者的家目錄
    • useradd -s SHELL:指定使用者的預設 shell,最好是在 /etc/shells 中存在的路徑
    • useradd -s /sbin/nologin:該使用者不能登入,還記得我們上面說到的系統使用者不能登入吧?我們可以看到系統使用者的 shell 欄位也是 /sbin/nologin
    • echo $SHELL :檢視當前使用者的 shell 型別
    • useradd -M USERNAME:建立使用者但不建立家目錄
    • useradd -mk USERNAME:建立使用者的同時建立家目錄,並複製 /etc/skel 中的內容到家目錄中。關於 /etc/skel 目錄會在下一篇 Linux 許可權管理中再次講解。
    • 如果使用者沒有家目錄,那麼不能切換到該使用者

  6.userdel 命令:刪除使用者

    • userdel USERNAME:刪除使用者
    • userdel -r USERNAME:刪除使用者的同時刪除使用者家目錄

  7.id 命令:顯示賬號屬性資訊

    • id -g USERNAME:顯示預設組ID
    • id -G USERNAME:顯示附加組ID
    • id -u USERNAME:顯示UID
    • id -n -g/-G/-U:顯示預設組/附加組/使用者的名稱

  8.finger 命令:檢索使用者資訊,比使用 id 命令更加友好

  9.usermod 命令:修改使用者資訊

    • 基本用法和 useradd 相似,這裡列出需要注意的點
    • usermod -G GROUPS USERNAME:改變使用者的附加組,會完全替換原有的附加組
    • usermod -G -a GROUPS USERNAME:在原有附加組的基礎上追加附加組
    • usermod -d PATH USERNAME:修改家目錄。修改後原先家目錄中的檔案不能存取了,因為在當前的家目錄中並不存在這些檔案。
    • usermod -l NEWNAME USERNAME:改變使用者名稱
    • usermod -e USERNAME:指定該使用者的過期時間
    • usermod -L USERNAME:鎖定使用者
    • usermod -U USERNAME:解鎖使用者

  10.快捷命令

    • chsh SHELL USERNAME:改變預設 shell
    • chfn USERNAME:修改註釋資訊,用來增加使用者的詳細資訊,如公司,地址等。可以由 finger 檢視相應的改變。

  11.passwd

    • passwd --stdio:標準輸入讀取密碼passwd -l:鎖定使用者賬號(root only)
      • echo "newpassword" | passwd --stdio MIKE
    • passwd -u:解鎖使用者賬號(root only)
    • passwd -d:刪除使用者密碼。使用者密碼刪除後不能登入。

  12.pwch(password check):檢查密碼檔案的完整性,可獲取一些警告資訊

  13.groupadd 命令:新增組

    • groupadd -g GID GROUPNAME:指定GID
    • groupadd -r GROUPNAME:新增一個系統使用者組(-r 也適用於 useradd)
      • groupadd -r apache

  13.groupmod 命令:修改組

    • groupmod -g NEWGID GROUPNAME:修改GID
    • groupmod -n NEWGROUPNAME GROUPNAME:修改組名

  14.groupdel 命令:刪除組

    • groupdel GROUPNAME

  15.gpasswd 命令:給組加密碼

    • gpasswd GROUPNAME

  16.newgrp :臨時指定基本組,下文介紹。

  17.給組新增密碼的作用

  為什麼需要給組新增密碼呢?不妨先說一下使用者的基本組,好像到現在我們還沒有講基本組的情況吧,嘿嘿。基本組很簡單,Linux 規定每個使用者都需要在某一個組中,因此在建立使用者的時候,我們可以指定使用者的基本組(預設組):useradd -g GROUPNAME USERNAME。如果我們不手動指定使用者的基本組,系統會預設建立一個和當前使用者名稱一致的組,然後將這個組設定為使用者的基本組。基本組的 GID 預設和使用者 UID 一致(如果不被占用的話)。

  為啥使用者必須要有一個組呢?因為 Linux 規定,一個檔案的需要具備三種許可權:檔案所屬主的許可權,檔案所屬主所在組的許可權,以及其他使用者的許可權。因此檔案的所屬主要是沒有基本組的話,那是不是非常尷尬呢。這個問題先說到這裡。

  回頭看一下 gpasswd 的作用,一般情況下我們是不需要為組設定密碼的。現在提一個需求:在執行某項操作的時候,要使用到其他組的許可權,就需要臨時切換到其他組,又不想改變現有組,那麼就需要使用 newgrp 命令,newgrp 命令就是用來臨時切換使用者基本組,注意此操作只對當前登入有效。在使用 newgrp 的時候,可能需要我們輸入組密碼。為什麼是可能呢?因為在將額外組臨時設定為使用者的基本組時,是不需要密碼的。只有將此前和使用者毫不相關的組臨時設定為基本組才會需要密碼。如需還原基本組:exit 或者 logout。

  18.總結

  本文主要介紹了 Linux 的使用者管理和使用者組管理,並介紹了 /etc/passwd 和 /etc/shadow 這兩個和使用者有關的檔案。和使用者組有關的檔案位於 /etc/group 和 /etc/gshadow 中。此外介紹了常見的加密形式:對稱加密,公鑰加密和雜湊加密。關於使用者和使用者組就介紹到這裡,在此基礎上我們將在下篇文章中介紹 Linux 的許可權管理,和本文屬於同一個系列。

 

更多詳情見請繼續閱讀下一頁的精彩內容http://www.linuxidc.com/Linux/2016-10/136251p2.htm

 


IT145.com E-mail:sddin#qq.com