嗬!沒想到吧!學習 Linux 的第三天,我們已經開始接觸用戶管理,用戶組管理,以及許可權管理這幾個逼格滿滿的關鍵字。這幾個關鍵字對於前端程式猿的我來說真的是很高大上有木有,以前嘗試學 Linux 的時候看到這些名詞總是下意識的跳過不敢看有木有,一提起這幾個名詞馬上腦海中總是升騰起無限的崇拜有木有!今 ...
嗬!沒想到吧!學習 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:刪除用戶密碼。用戶密碼刪除後不能登錄。
- passwd --stdio:標準輸入讀取密碼passwd -l:鎖定用戶賬號(root only)
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 的許可權管理,和本文屬於同一個系列。
加油!
作者:Charleylla 轉載請註明出處:http://www.cnblogs.com/charleylla/p/5978568.html