嗬!沒想到吧!學習 Linux 的第三天,我們已經開始接觸用戶管理,用戶組管理,以及權限管理這幾個逼格滿滿的關鍵字。這幾個關鍵字對於前端程序猿的我來說真的是很高大上有木有,以前嘗試學 Linux 的時候看到這些名詞總是下意識的跳過不敢看有木有,一提起這幾個名詞馬上腦海中總是升騰起無限的崇拜有木有!今天就硬著頭皮捯饬捯饬這幾個概念,希望能有所收獲。
前面的基本命令學習中,我們介紹了使用 passwd 命令可以修改用戶密碼。對於操作系統來說,用戶名和密碼是存放在哪裡的呢?我們都知道一個站點的用戶名和密碼是存放在數據庫中,數據庫是用來保存記錄數據的,我們常用的數據庫有 MySQL,Oracle,MongoDB等。其實,我們把 MySQL 等叫做數據庫是不嚴謹的,因為它們只是數據庫的管理軟件,從廣義上來說,任何能保存數據的東東都可以叫做數據庫。比如文本。
數據庫是用來保存數據的,操作系統中的用戶名和密碼也理應存放在數據庫中,這個數據庫是啥呢?在 Linux 下,它是處於 /etc 下的一個叫 passwd 的文件。我們不妨看一下這個文件中的內容。
大多數人看到這種東東一般都會說:什麼?你確定這不是天書?這裡面能瞅到啥?說實話,除了行號,我一個都不認識!
好了,再仔細看看,找找規律。經過你的仔細觀察,你可能會注意到以下幾點訊息:
於是你大膽的猜測:對的!這就是我們的用戶表,這些表也包含一個個字段,這些字段用來存放用戶的某些信息!事實上也正是如此,/etc/passwd 保存了用戶相關的信息,包括用戶名,密碼,所屬組等等。或許你還會有疑問:明明我們只有兩個用戶,一個管理員賬戶 root,一個是普通用戶 charley,那其他的東西是什麼呢?為什麼他們也出現在這個表裡面?別急,先從分組形式講起。
下面,我們就對用戶,用戶組以及上面的一些疑問進行展開討論。首先介紹一些對用戶或者用戶組分組的方式,站在不同的角度,可以進行不同的區分。
上面的分組方式是不是看的你眼花缭亂呢?沒關系,其實對用戶或者用戶組分組,本身就是多解的,只是由於站的角度不同,產生了不同的結果而已。換個角度,我們還可以再來 N 種分組形式,以上只是常規的分法。由於這些分組的形式可以體現在我們創建用戶或者用戶分組命令選項中,在學習了創建用戶和創建用戶組的命令之後,自然可以輕松的理解這些概念。
我們知道 /etc/passwd 相當於操作系統保存用戶信息的數據庫,那麼如此可以得出表中每行數據都是代表了一個特定的用戶,但是除了系統的 root 用戶和我們創建的一個普通用戶 charley 之外,還有很多其他的東西,這些東西是什麼呢?它們也是用戶嗎?是的,這些我們不認識的東東,也是用戶,只不過不是有我們創建,而是由操作系統創建的,所以叫做系統用戶。
某人如果想使用操作系統的某些功能,那麼他必須是這個系統上的一個用戶(客人用戶也是用戶)。用戶登錄操作系統之後,操作系統可以由用戶的特征碼進行權限的分配,以便使用操作系統的功能。
我們使用計算機,使用操作系統,是為了讓他們幫我們完成某些任務,具體下來,是通過調用操作系統上的軟件來完成,讓軟件幫我們做事。操作系統在啟動的時候,有一些必要的應用、服務等需要啟動,而遵循前面講到的簡單邏輯,啟動軟件的必須得是操作系統上的用戶。按照這個邏輯,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 的權限管理,和本文屬於同一個系列。
加油!
作者:油炸丸子 轉載請注明出處:http://www.cnblogs.com/charleylla/p/5978568.html
http://xxxxxx/Linuxjc/1166450.html TechArticle