Linux基础知识之用户和用户组以及 Linux 权限管理
已經(jīng)開始接觸Linux用戶管理,用戶組管理,以及權(quán)限管理這幾個(gè)逼格滿滿的關(guān)鍵字。這幾個(gè)關(guān)鍵字對于前端程序猿的我來說真的是很高大上有木有,以前嘗試學(xué) Linux 的時(shí)候看到這些名詞總是下意識的跳過不敢看有木有,一提起這幾個(gè)名詞馬上腦海中總是升騰起無限的崇拜有木有!今天就硬著頭皮捯飭捯飭這幾個(gè)概念,希望能有所收獲。
1.從 /etc/passwd 說起
前面的基本命令學(xué)習(xí)中,我們介紹了使用 passwd 命令可以修改用戶密碼。對于操作系統(tǒng)來說,用戶名和密碼是存放在哪里的呢?我們都知道一個(gè)站點(diǎn)的用戶名和密碼是存放在數(shù)據(jù)庫中,數(shù)據(jù)庫是用來保存記錄數(shù)據(jù)的,我們常用的數(shù)據(jù)庫有 MySQL,Oracle,MongoDB等。其實(shí),我們把 MySQL 等叫做數(shù)據(jù)庫是不嚴(yán)謹(jǐn)?shù)?#xff0c;因?yàn)樗鼈冎皇菙?shù)據(jù)庫的管理軟件,從廣義上來說,任何能保存數(shù)據(jù)的東東都可以叫做數(shù)據(jù)庫。比如文本。
數(shù)據(jù)庫是用來保存數(shù)據(jù)的,操作系統(tǒng)中的用戶名和密碼也理應(yīng)存放在數(shù)據(jù)庫中,這個(gè)數(shù)據(jù)庫是啥呢?在 Linux 下,它是處于 /etc 下的一個(gè)叫 passwd 的文件。我們不妨看一下這個(gè)文件中的內(nèi)容。
大多數(shù)人看到這種東東一般都會說:什么?你確定這不是天書?這里面能瞅到啥?說實(shí)話,除了行號,我一個(gè)都不認(rèn)識!
好了,再仔細(xì)看看,找找規(guī)律。經(jīng)過你的仔細(xì)觀察,你可能會注意到以下幾點(diǎn)訊息:
-
- 每一行文本都有數(shù)個(gè)英文格式的冒號(:) ,它們對每一行文本進(jìn)行了分割
- 仔細(xì)數(shù)一數(shù),每行文本的冒號數(shù)量都是相同的
- 再仔細(xì)數(shù)一數(shù),如果我們把冒號前后的東東叫字段的話,每行文本中的字段數(shù)目都是相同的(包括空字段)
- 首行的 root 和尾行的 charley,不就分別是我們的兩個(gè)賬戶嗎
于是你大膽的猜測:對的!這就是我們的用戶表,這些表也包含一個(gè)個(gè)字段,這些字段用來存放用戶的某些信息!事實(shí)上也正是如此,/etc/passwd 保存了用戶相關(guān)的信息,包括用戶名,密碼,所屬組等等。或許你還會有疑問:明明我們只有兩個(gè)用戶,一個(gè)管理員賬戶 root,一個(gè)是普通用戶 charley,那其他的東西是什么呢?為什么他們也出現(xiàn)在這個(gè)表里面?別急,先從分組形式講起。
2.一些常見的分組形式
下面,我們就對用戶,用戶組以及上面的一些疑問進(jìn)行展開討論。首先介紹一些對用戶或者用戶組分組的方式,站在不同的角度,可以進(jìn)行不同的區(qū)分。
-
- 通過用戶類型分組,我們可以把用戶分為:
- 管理員
- 普通用戶
- 通過用戶組類型分組,我們可以把用戶組分為:
- 管理員組
- 普通用戶組
- 從用戶的角度,我們可以把用戶組分為:
- 基本組(默認(rèn)組)
- 額外組(附加組)
- 對于普通用戶,我們還可以分為:
- 系統(tǒng)用戶
- 普通用戶
- 因此,對于普通用戶組,我們也可以分為:
- 系統(tǒng)用戶組
- 普通用戶組
- 通過用戶類型分組,我們可以把用戶分為:
上面的分組方式是不是看的你眼花繚亂呢?沒關(guān)系,其實(shí)對用戶或者用戶組分組,本身就是多解的,只是由于站的角度不同,產(chǎn)生了不同的結(jié)果而已。換個(gè)角度,我們還可以再來 N 種分組形式,以上只是常規(guī)的分法。由于這些分組的形式可以體現(xiàn)在我們創(chuàng)建用戶或者用戶分組命令選項(xiàng)中,在學(xué)習(xí)了創(chuàng)建用戶和創(chuàng)建用戶組的命令之后,自然可以輕松的理解這些概念。
3.理解用戶
我們知道 /etc/passwd 相當(dāng)于操作系統(tǒng)保存用戶信息的數(shù)據(jù)庫,那么如此可以得出表中每行數(shù)據(jù)都是代表了一個(gè)特定的用戶,但是除了系統(tǒng)的 root 用戶和我們創(chuàng)建的一個(gè)普通用戶 charley 之外,還有很多其他的東西,這些東西是什么呢?它們也是用戶嗎?是的,這些我們不認(rèn)識的東東,也是用戶,只不過不是有我們創(chuàng)建,而是由操作系統(tǒng)創(chuàng)建的,所以叫做系統(tǒng)用戶。
某人如果想使用操作系統(tǒng)的某些功能,那么他必須是這個(gè)系統(tǒng)上的一個(gè)用戶(客人用戶也是用戶)。用戶登錄操作系統(tǒng)之后,操作系統(tǒng)可以由用戶的特征碼進(jìn)行權(quán)限的分配,以便使用操作系統(tǒng)的功能。
我們使用計(jì)算機(jī),使用操作系統(tǒng),是為了讓他們幫我們完成某些任務(wù),具體下來,是通過調(diào)用操作系統(tǒng)上的軟件來完成,讓軟件幫我們做事。操作系統(tǒng)在啟動的時(shí)候,有一些必要的應(yīng)用、服務(wù)等需要啟動,而遵循前面講到的簡單邏輯,啟動軟件的必須得是操作系統(tǒng)上的用戶。按照這個(gè)邏輯,Linux 系統(tǒng)為我們創(chuàng)建了一些系統(tǒng)用戶,通過它們來在操作系統(tǒng)啟動時(shí)執(zhí)行相應(yīng)的文件。可見系統(tǒng)用戶是不需要登錄的,也叫非登錄用戶,請先記住這一點(diǎn)。
上面講到了用戶特征碼,操作系統(tǒng)時(shí)通過用戶特征碼來識別用戶的。對于淫類,我們識別用戶是通過用戶名,因?yàn)橛脩裘?#xff08;字符串)好記。而計(jì)算機(jī)覺得數(shù)字更好記一些,于是在創(chuàng)建用戶時(shí)系統(tǒng)會為其分配一個(gè)唯一的特征碼,用以識別該用戶,這個(gè)特征碼也叫UID。同樣的,用戶組也有特征碼,叫做GID。
Linux 系統(tǒng)中,UID以如下的方式劃分:
-
- 0 表示管理員(root)
- 1 - 500 表示系統(tǒng)用戶
- 501 - 65535 表示普通用戶
- 不同的 Linux 發(fā)行版,這些數(shù)字可能不一樣
4. /etc/passwd 中的字段分析
/etc/passwd 中的字段分別表示如下信息(字段名字是我自己取的):
-
- ACCOUNT:用戶名
- PASSWORD:密碼占位符
- UID:用戶ID
- GID:用戶組ID
- COMMAND:注釋信息
- HOME DIR:用戶家目錄
- SHELL:用戶的默認(rèn) shell
密碼占位符,其值是 x,顯然這不是真正的密碼。真正的密碼保存在哪里呢?在 /etc/shadow 文件中,此文件中保存的也不是明文密碼,而是經(jīng)過加密處理之后的密碼。我們來看一下 /etc/shadow 中的內(nèi)容(root only):
可見,/etc/shadow 中保存的也是數(shù)據(jù)表,這個(gè)表也和用戶相關(guān)。還記得第二天說到的 man 命令嗎?man 手冊的第五個(gè)章節(jié)是特殊文件,我們來 man 一波試試:
對于 /etc/shadow 中每個(gè)字段的含義,手冊中都給出了說明,我們可以去參考(這里只給出了一部分截圖)。同理,對于 /etc/passwd,我們也可以通過?man 5 passwd 查看每一個(gè)字段表示的含義。
好了,回到 PASSWORD 字段,我們看一下 root 用戶和 charley 的此項(xiàng)字段值,可以看到此值中有一些規(guī)律可循:
-
- $1$XXXXXXXX$XXXXXXXXXX.....
我們可以通過此字段來獲取如下信息:
-
- 前兩個(gè)美元符號中的數(shù)字1表示加密方式是 md5
- 第二個(gè)和第三個(gè)美元符號之間的字串是經(jīng)過加密后的密碼鹽值
- 第三個(gè)美元符號之后的字串是密碼明文精加密的后的特征碼
既然談到了加密和鹽值,我們來復(fù)習(xí)一下關(guān)于加密的基礎(chǔ)知識。我們通常用到的加密方式有一下幾種:
-
-
對稱加密:使用同一套密碼進(jìn)行加密和解密
- 公鑰加密:每個(gè)密碼以私鑰(secret key)和公鑰(public key)成對出現(xiàn),公鑰進(jìn)行的加密使用與其配對的私鑰解密,反之亦然,相對于對稱加密,速度很慢,一般不用于加密,而是秘鑰交換
-
單向加密(散列加密):只能加密不能解密。也就是說只能由明文取得密文,而不能由密文取得明文。經(jīng)過單向加密得到的是一份唯一的特征碼,每個(gè)數(shù)據(jù)的特征碼是獨(dú)一無二的,因此也叫作指紋加密。如果兩次算法取得的��征碼一樣,那么就是同一份數(shù)據(jù)。單向加密可以用來做數(shù)據(jù)校驗(yàn),如果數(shù)據(jù)被動了手腳,那么數(shù)據(jù)的特征碼就不一樣。常用的散列加密方式有:
- MD5:定長128位輸出特征碼
- SHA1:定長160位輸出特征碼
- 還有其他方式,主要體現(xiàn)在特征碼輸出長度的不同
- 單向加密的特點(diǎn):
- 不可逆
- 雪崩效應(yīng):數(shù)據(jù)的微小改變,會引起特征碼的巨大變化
- 定長輸出:不管加密的內(nèi)容長度多少,輸出的特征碼長度都是一樣
- 加鹽:如果兩個(gè)用戶使用了同樣的密碼,那么經(jīng)過 MD5 散列加密后的特征碼就是一致的,如果一個(gè)用戶偶然發(fā)現(xiàn)另一個(gè)用戶的特征碼和他自己是一樣的,那么就可以推斷另一個(gè)用戶的密碼。這是不太安全的。為了安全起見,我們需要用到散列加密特點(diǎn)中的雪崩效應(yīng),往密碼中額外加點(diǎn)雜質(zhì)(內(nèi)容),這樣加密后的特征碼就千差萬別了。這個(gè)過程就是所謂的加鹽。
-
5.useradd 命令:添加用戶
說了那么多,終于來點(diǎn)真格的了,Linux 中使用 useradd 命令添加一個(gè)用戶。這個(gè)命令很簡單,簡單到只使用 useradd USERNAME 就可以添加一個(gè)用戶。
我們新建一個(gè)用戶 MIKE,然后查看 /etc/passwd 中的對應(yīng)內(nèi)容:
在 /etc/passwd 的最后一行,我們看到了剛剛添加的用戶,并且系統(tǒng)自動設(shè)置了用戶的一些屬性,比如UID,GID,HOME DIR等。我們也可以手動指定新增用戶的信息:
-
- useradd -u UID:指定 UID,這個(gè) UID 必須是大于等于500,并沒有其他用戶占用的 UID
- useradd -g GID/GROUPNAME:指定默認(rèn)組,可以是 GID 或者 GROUPNAME,同樣也必須真實(shí)存在
- useradd -G GROUPS:指定額外組
- useradd -c COMMENT:指定用戶的注釋信息
- useradd -d PATH:指定用戶的家目錄
- useradd -s SHELL:指定用戶的默認(rèn) shell,最好是在 /etc/shells 中存在的路徑
- useradd -s /sbin/nologin:該用戶不能登錄,還記得我們上面說到的系統(tǒng)用戶不能登錄吧?我們可以看到系統(tǒng)用戶的 shell 字段也是 /sbin/nologin
- echo $SHELL :查看當(dāng)前用戶的 shell 類型
- useradd -M USERNAME:創(chuàng)建用戶但不創(chuàng)建家目錄
- useradd -mk USERNAME:創(chuàng)建用戶的同時(shí)創(chuàng)建家目錄,并復(fù)制 /etc/skel 中的內(nèi)容到家目錄中。關(guān)于 /etc/skel 目錄會在下一篇 Linux 權(quán)限管理中再次講解。
- 如果用戶沒有家目錄,那么不能切換到該用戶
6.userdel 命令:刪除用戶
-
- userdel USERNAME:刪除用戶
- userdel -r USERNAME:刪除用戶的同時(shí)刪除用戶家目錄
7.id 命令:顯示賬號屬性信息
-
- id -g USERNAME:顯示默認(rèn)組ID
- id -G USERNAME:顯示附加組ID
- id -u USERNAME:顯示UID
- id -n -g/-G/-U:顯示默認(rèn)組/附加組/用戶的名稱
8.finger 命令:檢索用戶信息,比使用 id 命令更加友好
9.usermod 命令:修改用戶信息
-
- 基本用法和 useradd 相似,這里列出需要注意的點(diǎn)
- usermod -G GROUPS USERNAME:改變用戶的附加組,會完全替換原有的附加組
- usermod -G -a GROUPS USERNAME:在原有附加組的基礎(chǔ)上追加附加組
- usermod -d PATH USERNAME:修改家目錄。修改后原先家目錄中的文件不能訪問了,因?yàn)樵诋?dāng)前的家目錄中并不存在這些文件。
- usermod -l NEWNAME USERNAME:改變用戶名
- usermod -e USERNAME:指定該用戶的過期時(shí)間
- usermod -L USERNAME:鎖定用戶
- usermod -U USERNAME:解鎖用戶
10.快捷命令
-
- chsh SHELL USERNAME:改變默認(rèn) shell
- chfn USERNAME:修改注釋信息,用來增加用戶的詳細(xì)信息,如公司,地址等。可以由 finger 查看相應(yīng)的改變。
11.passwd
-
- passwd --stdin:標(biāo)準(zhǔn)輸入讀取密碼passwd -l:鎖定用戶賬號(root only)
- echo "newpassword" | passwd --stdin MIKE
- passwd -u:解鎖用戶賬號(root only)
- passwd -d:刪除用戶密碼。用戶密碼刪除后不能登錄。
- passwd --stdin:標(biāo)準(zhǔn)輸入讀取密碼passwd -l:鎖定用戶賬號(root only)
12.pwch(password check):檢查密碼文件的完整性,可獲取一些警告信息
13.groupadd 命令:添加組
-
- groupadd -g GID GROUPNAME:指定GID
- groupadd -r GROUPNAME:添加一個(gè)系統(tǒng)用戶組(-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 :臨時(shí)指定基本組,下文介紹。
17.給組添加密碼的作用
為什么需要給組添加密碼呢?不妨先說一下用戶的基本組,好像到現(xiàn)在我們還沒有講基本組的情況吧,嘿嘿。基本組很簡單,Linux 規(guī)定每個(gè)用戶都需要在某一個(gè)組中,因此在創(chuàng)建用戶的時(shí)候,我們可以指定用戶的基本組(默認(rèn)組):useradd -g GROUPNAME USERNAME。如果我們不手動指定用戶的基本組,系統(tǒng)會默認(rèn)創(chuàng)建一個(gè)和當(dāng)前用戶名一致的組,然后將這個(gè)組設(shè)置為用戶的基本組。基本組的 GID 默認(rèn)和用戶 UID 一致(如果不被占用的話)。
為啥用戶必須要有一個(gè)組呢?因?yàn)?Linux 規(guī)定,一個(gè)文件的需要具備三種權(quán)限:文件所屬主的權(quán)限,文件所屬主所在組的權(quán)限,以及其他用戶的權(quán)限。因此文件的所屬主要是沒有基本組的話,那是不是非常尷尬呢。這個(gè)問題先說到這里。
回頭看一下 gpasswd 的作用,一般情況下我們是不需要為組設(shè)置密碼的。現(xiàn)在提一個(gè)需求:在執(zhí)行某項(xiàng)操作的時(shí)候,要使用到其他組的權(quán)限,就需要臨時(shí)切換到其他組,又不想改變現(xiàn)有組,那么就需要使用 newgrp 命令,newgrp 命令就是用來臨時(shí)切換用戶基本組,注意此操作只對當(dāng)前登錄有效。在使用 newgrp 的時(shí)候,可能需要我們輸入組密碼。為什么是可能呢?因?yàn)樵趯㈩~外組臨時(shí)設(shè)置為用戶的基本組時(shí),是不需要密碼的。只有將此前和用戶毫不相關(guān)的組臨時(shí)設(shè)置為基本組才會需要密碼。如需還原基本組:exit 或者 logout。
18.總結(jié)
本文主要介紹了 Linux 的用戶管理和用戶組管理,并介紹了 /etc/passwd 和 /etc/shadow 這兩個(gè)和用戶有關(guān)的文件。和用戶組有關(guān)的文件位于 /etc/group 和 /etc/gshadow 中。此外介紹了常見的加密形式:對稱加密,公鑰加密和散列加密。關(guān)于用戶和用戶組就介紹到這里,在此基礎(chǔ)上我們將在下篇文章中介紹 Linux 的權(quán)限管理,和本文屬于同一個(gè)系列。
?
更多詳情見請繼續(xù)閱讀下一頁的精彩內(nèi)容:?http://www.linuxidc.com/Linux/2016-10/136251p2.htm
總結(jié)
以上是生活随笔為你收集整理的Linux基础知识之用户和用户组以及 Linux 权限管理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构与算法 -- 再论递归
- 下一篇: 领导者的资质——学习笔记(3):领导者的