Linux基礎知識之用戶和用戶組以及 Linux 權限管理

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

  1.從 /etc/passwd 提及

  前面的基本命令學習中,咱們介紹了使用 passwd 命令能夠修改用戶密碼。對於操做系統來講,用戶名和密碼是存放在哪裏的呢?咱們都知道一個站點的用戶名和密碼是存放在數據庫中,數據庫是用來保存記錄數據的,咱們經常使用的數據庫有 MySQL,Oracle,MongoDB等。其實,咱們把 MySQL 等叫作數據庫是不嚴謹的,由於它們只是數據庫的管理軟件,從廣義上來講,任何能保存數據的東東均可以叫作數據庫。好比文本。linux

  數據庫是用來保存數據的,操做系統中的用戶名和密碼也理應存放在數據庫中,這個數據庫是啥呢?在 Linux 下,它是處於 /etc 下的一個叫 passwd 的文件。咱們不妨看一下這個文件中的內容。算法

  

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

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

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

  因而你大膽的猜想:對的!這就是咱們的用戶表,這些表也包含一個個字段,這些字段用來存放用戶的某些信息!事實上也正是如此,/etc/passwd 保存了用戶相關的信息,包括用戶名,密碼,所屬組等等。或許你還會有疑問:明明咱們只有兩個用戶,一個管理員帳戶 root,一個是普通用戶 charley,那其餘的東西是什麼呢?爲何他們也出如今這個表裏面?別急,先從分組形式講起。apache

  2.一些常見的分組形式

  下面,咱們就對用戶,用戶組以及上面的一些疑問進行展開討論。首先介紹一些對用戶或者用戶組分組的方式,站在不一樣的角度,能夠進行不一樣的區分。安全

    • 經過用戶類型分組,咱們能夠把用戶分爲:
      • 管理員
      • 普通用戶
    • 經過用戶組類型分組,咱們能夠把用戶組分爲:
      • 管理員組
      • 普通用戶組
    • 從用戶的角度,咱們能夠把用戶組分爲:
      • 基本組(默認組)
      • 額外組(附加組)
    • 對於普通用戶,咱們還能夠分爲:
      • 系統用戶
      • 普通用戶
    • 所以,對於普通用戶組,咱們也能夠分爲:
      • 系統用戶組
      • 普通用戶組

  上面的分組方式是否是看的你眼花繚亂呢?不要緊,其實對用戶或者用戶組分組,自己就是多解的,只是因爲站的角度不一樣,產生了不一樣的結果而已。換個角度,咱們還能夠再來 N 種分組形式,以上只是常規的分法。因爲這些分組的形式能夠體如今咱們建立用戶或者用戶分組命令選項中,在學習了建立用戶和建立用戶組的命令以後,天然能夠輕鬆的理解這些概念。學習

  3.理解用戶

  咱們知道 /etc/passwd 至關於操做系統保存用戶信息的數據庫,那麼如此能夠得出表中每行數據都是表明了一個特定的用戶,可是除了系統的 root 用戶和咱們建立的一個普通用戶 charley 以外,還有不少其餘的東西,這些東西是什麼呢?它們也是用戶嗎?是的,這些咱們不認識的東東,也是用戶,只不過不是有咱們建立,而是由操做系統建立的,因此叫作系統用戶。加密

  某人若是想使用操做系統的某些功能,那麼他必須是這個系統上的一個用戶(客人用戶也是用戶)。用戶登陸操做系統以後,操做系統能夠由用戶的特徵碼進行權限的分配,以便使用操做系統的功能。spa

  咱們使用計算機,使用操做系統,是爲了讓他們幫咱們完成某些任務,具體下來,是經過調用操做系統上的軟件來完成,讓軟件幫咱們作事。操做系統在啓動的時候,有一些必要的應用、服務等須要啓動,而遵循前面講到的簡單邏輯,啓動軟件的必須得是操做系統上的用戶。按照這個邏輯,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 的權限管理,和本文屬於同一個系列。

相關文章
相關標籤/搜索