已經開始接觸Linux用戶管理,用戶組管理,以及權限管理這幾個逼格滿滿的關鍵字。這幾個關鍵字對於前端程序猿的我來講真的是很高大上有木有,之前嘗試學 Linux 的時候看到這些名詞老是下意識的跳過不敢看有木有,一提起這幾個名詞立刻腦海中老是升騰起無限的崇拜有木有!今天就硬着頭皮捯飭捯飭這幾個概念,但願能有所收穫。前端
前面的基本命令學習中,咱們介紹了使用 passwd 命令能夠修改用戶密碼。對於操做系統來講,用戶名和密碼是存放在哪裏的呢?咱們都知道一個站點的用戶名和密碼是存放在數據庫中,數據庫是用來保存記錄數據的,咱們經常使用的數據庫有 MySQL,Oracle,MongoDB等。其實,咱們把 MySQL 等叫作數據庫是不嚴謹的,由於它們只是數據庫的管理軟件,從廣義上來講,任何能保存數據的東東均可以叫作數據庫。好比文本。linux
數據庫是用來保存數據的,操做系統中的用戶名和密碼也理應存放在數據庫中,這個數據庫是啥呢?在 Linux 下,它是處於 /etc 下的一個叫 passwd 的文件。咱們不妨看一下這個文件中的內容。算法
大多數人看到這種東東通常都會說:什麼?你肯定這不是天書?這裏面能瞅到啥?說實話,除了行號,我一個都不認識!shell
好了,再仔細看看,找找規律。通過你的仔細觀察,你可能會注意到如下幾點訊息:數據庫
因而你大膽的猜想:對的!這就是咱們的用戶表,這些表也包含一個個字段,這些字段用來存放用戶的某些信息!事實上也正是如此,/etc/passwd 保存了用戶相關的信息,包括用戶名,密碼,所屬組等等。或許你還會有疑問:明明咱們只有兩個用戶,一個管理員帳戶 root,一個是普通用戶 charley,那其餘的東西是什麼呢?爲何他們也出如今這個表裏面?別急,先從分組形式講起。apache
下面,咱們就對用戶,用戶組以及上面的一些疑問進行展開討論。首先介紹一些對用戶或者用戶組分組的方式,站在不一樣的角度,能夠進行不一樣的區分。安全
上面的分組方式是否是看的你眼花繚亂呢?不要緊,其實對用戶或者用戶組分組,自己就是多解的,只是因爲站的角度不一樣,產生了不一樣的結果而已。換個角度,咱們還能夠再來 N 種分組形式,以上只是常規的分法。因爲這些分組的形式能夠體如今咱們建立用戶或者用戶分組命令選項中,在學習了建立用戶和建立用戶組的命令以後,天然能夠輕鬆的理解這些概念。學習
咱們知道 /etc/passwd 至關於操做系統保存用戶信息的數據庫,那麼如此能夠得出表中每行數據都是表明了一個特定的用戶,可是除了系統的 root 用戶和咱們建立的一個普通用戶 charley 以外,還有不少其餘的東西,這些東西是什麼呢?它們也是用戶嗎?是的,這些咱們不認識的東東,也是用戶,只不過不是有咱們建立,而是由操做系統建立的,因此叫作系統用戶。加密
某人若是想使用操做系統的某些功能,那麼他必須是這個系統上的一個用戶(客人用戶也是用戶)。用戶登陸操做系統以後,操做系統能夠由用戶的特徵碼進行權限的分配,以便使用操做系統的功能。spa
咱們使用計算機,使用操做系統,是爲了讓他們幫咱們完成某些任務,具體下來,是經過調用操做系統上的軟件來完成,讓軟件幫咱們作事。操做系統在啓動的時候,有一些必要的應用、服務等須要啓動,而遵循前面講到的簡單邏輯,啓動軟件的必須得是操做系統上的用戶。按照這個邏輯,Linux 系統爲咱們建立了一些系統用戶,經過它們來在操做系統啓動時執行相應的文件。可見系統用戶是不須要登陸的,也叫非登陸用戶,請先記住這一點。
上面講到了用戶特徵碼,操做系統時經過用戶特徵碼來識別用戶的。對於淫類,咱們識別用戶是經過用戶名,由於用戶名(字符串)好記。而計算機以爲數字更好記一些,因而在建立用戶時系統會爲其分配一個惟一的特徵碼,用以識別該用戶,這個特徵碼也叫UID。一樣的,用戶組也有特徵碼,叫作GID。
Linux 系統中,UID以以下的方式劃分:
/etc/passwd 中的字段分別表示以下信息(字段名字是我本身取的):
密碼佔位符,其值是 x,顯然這不是真正的密碼。真正的密碼保存在哪裏呢?在 /etc/shadow 文件中,此文件中保存的也不是明文密碼,而是通過加密處理以後的密碼。咱們來看一下 /etc/shadow 中的內容(root only):
可見,/etc/shadow 中保存的也是數據表,這個表也和用戶相關。還記得次日說到的 man 命令嗎?man 手冊的第五個章節是特殊文件,咱們來 man 一波試試:
對於 /etc/shadow 中每一個字段的含義,手冊中都給出了說明,咱們能夠去參考(這裏只給出了一部分截圖)。同理,對於 /etc/passwd,咱們也能夠經過 man 5 passwd 查看每個字段表示的含義。
好了,回到 PASSWORD 字段,咱們看一下 root 用戶和 charley 的此項字段值,能夠看到此值中有一些規律可循:
咱們能夠經過此字段來獲取以下信息:
既然談到了加密和鹽值,咱們來複習一下關於加密的基礎知識。咱們一般用到的加密方式有一下幾種:
對稱加密:使用同一套密碼進行加密和解密
單向加密(散列加密):只能加密不能解密。也就是說只能由明文取得密文,而不能由密文取得明文。通過單向加密獲得的是一份惟一的特徵碼,每一個數據的特徵碼是獨一無二的,所以也叫做指紋加密。若是兩次算法取得的特徵碼同樣,那麼就是同��份數據。單向加密能夠用來作數據校驗,若是數據被動了手腳,那麼數據的特徵碼就不同。經常使用的散列加密方式有:
說了那麼多,終於來點真格的了,Linux 中使用 useradd 命令添加一個用戶。這個命令很簡單,簡單到只使用 useradd USERNAME 就能夠添加一個用戶。
咱們新建一個用戶 MIKE,而後查看 /etc/passwd 中的對應內容:
在 /etc/passwd 的最後一行,咱們看到了剛剛添加的用戶,而且系統自動設置了用戶的一些屬性,好比UID,GID,HOME DIR等。咱們也能夠手動指定新增用戶的信息:
gpasswd GROUPNAME
爲何須要給組添加密碼呢?不妨先說一下用戶的基本組,好像到如今咱們尚未講基本組的狀況吧,嘿嘿。基本組很簡單,Linux 規定每一個用戶都須要在某一個組中,所以在建立用戶的時候,咱們能夠指定用戶的基本組(默認組):useradd -g GROUPNAME USERNAME。若是咱們不手動指定用戶的基本組,系統會默認建立一個和當前用戶名一致的組,而後將這個組設置爲用戶的基本組。基本組的 GID 默認和用戶 UID 一致(若是不被佔用的話)。
爲啥用戶必需要有一個組呢?由於 Linux 規定,一個文件的須要具有三種權限:文件所屬主的權限,文件所屬主所在組的權限,以及其餘用戶的權限。所以文件的所屬主要是沒有基本組的話,那是否是很是尷尬呢。這個問題先說到這裏。
回頭看一下 gpasswd 的做用,通常狀況下咱們是不須要爲組設置密碼的。如今提一個需求:在執行某項操做的時候,要使用到其餘組的權限,就須要臨時切換到其餘組,又不想改變現有組,那麼就須要使用 newgrp 命令,newgrp 命令就是用來臨時切換用戶基本組,注意此操做只對當前登陸有效。在使用 newgrp 的時候,可能須要咱們輸入組密碼。爲何是可能呢?由於在將額外組臨時設置爲用戶的基本組時,是不須要密碼的。只有將此前和用戶絕不相關的組臨時設置爲基本組纔會須要密碼。如需還原基本組:exit 或者 logout。
本文主要介紹了 Linux 的用戶管理和用戶組管理,並介紹了 /etc/passwd 和 /etc/shadow 這兩個和用戶有關的文件。和用戶組有關的文件位於 /etc/group 和 /etc/gshadow 中。此外介紹了常見的加密形式:對稱加密,公鑰加密和散列加密。關於用戶和用戶組就介紹到這裏,在此基礎上咱們將在下篇文章中介紹 Linux 的權限管理,和本文屬於同一個系列。