資安筆記 - Linux 使用者與群主

白龍 Lv3

文章目標

  • 了解帳號與群組類型與關係
  • 了解帳號與群組相關檔案
  • 帳號的建立、變更、刪除
  • 群組的建立、變更、刪除
  • 帳號與群組與權限的應用
  • 帳號與群組的查詢
  • 帳號於系統的登入狀況、歷史紀錄查詢
  • 身分切換與切換方式
  • 權力授權與建立授權機制

Linux中的帳號與群主

上一篇文章有講到權限的部分,我們有提到兩個詞 - 使用者和群主,這個東西聽起來簡單但是要複雜也可以很複雜,開始深入討論前我們要先了解一下最基本的帳號分類

帳號分類與類型

帳號分類

Linux總共分為兩種帳號,本機帳號和網域帳號

本機帳號 ( Local Account )

帳號特色

  • 在電腦主機內的帳號
  • 無法跨越不同主機驗證進行登入
  • 可遠端連線至本機,使用不同帳號 ( 相同亦可, Linux ) 登入
  • 使用範圍通常限於本機
  • 最簡單的帳號管理方式

網域帳號 ( Domain Account)

帳號特色

  • 多台主機上的各式服務,各有不同的帳號
  • 所有帳號由一台電腦統一管理
  • 可以跨越不同主機 ( 或統一網路上的主機 ) 驗證登入後,進行服務管理、應用…
  • 使用範圍小從區域網路,大致廣域網路
  • 較複雜的帳號管理方式…

帳號類型

除了有兩種不同的帳號,每個種類的帳號也有不同的類型…

超級使用者 ( Super User )

其實他就是root的意思,就是權限最高的帳號,名稱通常是 avatar, root, admin 等,稍微整理一下

  • 系統中擁有最高權限的帳號
  • 帳號 ( 名稱 ) 通常都為 root、avatar、toor…
  • 任何的行為與動作,均通行無阻,應設定一複雜密碼,並妥善保存,盡量不以此帳號做管理應用…
  • 有一專屬空間配置:/root/
  • UID 為 0 (電腦查看你權限是看這個,權限最高是0)

系統使用者 ( System user )

這個帳號是可以管理伺服器用的帳號,可以查看系統中運行的資源等

  • 系統服務的管理者
  • 網頁伺服器、郵件伺服器、FTP伺服器…
  • 不具備帳號登入功能
  • 有管理該服務之權
  • UID 為 201 ~ 999

一般使用者 ( Normal user )

這個就是一般的帳號,沒有甚麼好講的

  • 一般使用主機的帳號
  • 通常沒有管理、設定、變更系統主機之能
  • 執行權限、可進入的地方 ( 目錄 ) 會有所限制…
  • 有一專屬空間配置:/home/使用者帳號/
  • UID 為 1000 ~ 60000

身分識別

那我們要如何判斷使用者在使用哪個帳號呢,你可能在打script有發現表示起來了東西

1
xxx@xxxxxxx: "~#"

這個就是可以去判斷管理者和使用者的差別,如果是 # 就代表他是管理者;$ 就代表他是一般使用者

1
2
3
4
5
#超級使用者、系統使用者命令提示符號
root@Workstation: ~#

#一般使用者命令提示符號
user@Workstation: ~$

群主類型

群主並沒有類型,但是如果是以使用者的角度去看,那就有不同的類型了

群主類型

主要群組 ( Primary group )

也被稱為初始群組(Initial group)

  • 每個帳號都必須有一個主要群組
  • 作為檔案目錄建立時預設權限使用…

次要群組 ( Secondary group )

也被稱為有效群組(Effective group)

  • 主要群組之外增加的群組
  • 一個帳號可以加入很多次要群組

使用者私人群組 ( User private group )

  • 指群組名稱與使用者名稱相同的群組稱呼
  • 通常於建立帳號時,也會建立此群組並設為主要群組

群主資訊查詢

查詢群主的指令是 id,這個指令會顯示群主的相關資訊

語法:id [選項] [帳號]

  • 可用選項 (較常使用)
  • -u | 列出帳號 UID
  • -g | 列出帳號所屬主要群組 GID
  • -G | 列出帳號所屬群組 GID ( 主要群組、次要群組 )

帳號相關檔與結構

使用者和帳號都會需要有一個地方存使用者和群主相關的資料,我們提出兩個比較重要的

  • 帳號資訊

  • 功能:記錄相關帳號所有相關資訊,包跨密碼、名稱、時間等

  • 路徑:/etc/passwd

  • 結構:root:x:0:0:root:/root:/bin/bash

我們說一下結構的部分,還有每個點點的意思,用我最愛的表格看一下吧

root x 0 0 root /root /bin/bash
帳號名稱 密碼 UID GID 說明 家目錄 Shell

不過一個需要特別注意的地方

  • 密碼:
    如果是像表格中填入 x,就表示密碼使用 /etc/shadow 中的密碼
    如果是空就代表沒有密碼

  • 密碼 Shadow

Shadow 是比較新的東西,他的出現是為了提升帳號密碼安全所新增的發明,Shadow 增加了要求密碼變更的要求、密碼時效、更新提醒等,所有帳號與資訊都記錄於此

  • 功能:紀錄帳號的密碼,但是使用加密技術提升安全性
  • 路徑:/etc/shadow
  • 結構:root:$6$NdCKA…:17999:0:99999:7:::

我們一樣直接進入結構介紹

root $6$NdCKA… 17999 0 99999 7
帳號名稱 加密密碼 密碼變更日期 密碼維持日期 密碼變更日數 密碼變更提醒日數 密碼失效寬限日 帳號失效寬限日 保留

東西開始變得複雜了,所以再來看看變了什麼吧

  • 加密密碼:
    => 如果是空的就表示沒有設定密碼,可以不用輸入密碼就登入
    * => 沒有設定密碼,但是就不能登入了
    ! => 無效的密碼,可能是因為密碼過期、帳號鎖定等
    $String$ => 被編碼的訊息

  • 密碼維持日期:
    這個表示密碼被更改後需要多久才能再次更改,單位是以天計算
    如果設為0表示不啟用功能

  • 密碼失效寬限日:
    => 與0一樣,失效後立即無法使用帳號
    0 => 過期立即無法登入
    -1 => 關閉功能
    n => 表示n天還可以登入

群主相關與結構

與使用者一樣,也會有一個地方記錄所有群主相關的資訊

群主資訊

  • 功能:主要記錄群組所有相關資訊
  • 路徑:/etc/group
  • 結構範例:root:x:0::

這個結構比使用者簡單了,只有四個資訊

root x 0
群主 密碼 GID 成員

群主密碼 Shadow

  • 功能:主要記錄群組的密碼
  • 路徑:/etc/gshadow
  • 結構範例:root:*::
root *
群主 密碼 管理帳號 成員

帳號與群主的管理

帳號相關

建立使用者帳號

非常值觀,就是 useradd / adduser

兩個指令有不同?

有,adduser 是Ubuntu系統專有的指令,與 useradd 不同的是他會一個一個你創建帳號的設定,不會直接創建一個帳號,類似於一個創建帳號的script

  • 使用語法:useradd <option> <name>

可以使用的選項有

  • m:建立使用者家目錄
  • d:指定家目錄位置 ( 自行建立 )
  • u:指定 UID ( 預設系統指定 )
  • p:指定帳號密碼 ( 已編碼過 )
  • g:指定主要群組 ( 預設為帳號同名 )
  • G:指定次要群組
  • e:指定帳號有效期 ( MM/DD/YY )
  • f:密碼過期寬限日 ( 0 立即無法使用,-1關閉功能 )
  • s:指定使用的 shell
  • r:建立為管理者帳號
  • D:顯示 useradd 建立預設屬性

設定帳號

使用 usermod 可以設定這個帳號的權限、時間等

  • 使用語法:usermod <option> <name>

可以使用的選項有

  • l:修改登入名稱
  • d:指定家目錄位置 ( 指已存在的目錄 )
  • m:移動家目錄 ( 通常搭配 -d 使用 )
  • u:修改 UID
  • p:修改帳號密碼
  • g:修改主要群組 ( 預設為帳號同名 )
  • G:修改次要群組
  • e:指定帳號有效期 ( MM/DD/YY )
  • f:密碼過期寬限日 ( 0 立即無法使用,-1關閉功能 )
  • s:指定使用的 shell
  • L:鎖定帳號 ( 無法登入 )
  • U:解除帳號鎖定

設定帳號密碼

這個應該很熟悉了,就是所謂的 passwd

  • 使用語法:passwd <option> <name>

但其實這個指令不是只有改密碼,我們只是比較常用改密碼,它可以做的密碼設定還很多

可用選項

  • d:刪除帳號的密碼
  • e:強制密碼過期
  • i:密碼失效寬限日數
  • w:密碼到期前提醒日數
  • x:密碼有效日數
  • l:鎖定帳號
  • u:解除帳號鎖定

刪除帳號

也很值觀,就是 userdel

  • 使用語法:userdel <option> <name>

可以使用的常用選項只有 -r,表示把家目錄也刪除,這個使用者的資料會完全清空

群主相關指令

建立群主

使用 groupadd 指令來建立群組。

  • 使用語法:groupadd <option> <name>

可用選項:

  • f:指定 GID 重複時,自動建立新 GID
  • g:指定 GID (預設系統指定)
  • p:指定群組密碼
  • r:建立為管理者群組

編輯群主

若群組設置錯誤,可使用 groupmod 編輯群組。

  • 使用語法:groupmod <option> <name>

可用選項:

  • n:修改群組名稱
  • g:修改 GID
  • p:修改群組密碼

管理群主成員

使用 groupmems 管理群組成員。

  • 使用語法:groupmems <option1> <member> <option2> <group>

可用選項:

  • Option1:
    • a:新增帳號到群組
    • d:移除群組中的帳號
    • l:列出群組成員
  • Option2:
    • g:群組名稱

編輯群主密碼

若需要設置群組密碼,可以使用 gpasswd

  • 使用語法:gpasswd <option> <password>

可用選項:

  • r:刪除群組密碼
  • a:將帳號增加到群組
  • d:移除群組中的帳號
  • M:指定群組成員 (例如:user1,user2,user3)
  • A:指定管理帳號

刪除群主

要刪除群組使用 groupdel

  • 使用語法:groupdel <groupname>

可用選項:

  • f:強制刪除群組 (即使是某帳號的主要群組)

群主切換

群主切換時,可以依照需要提升或下降權限。切換群組有可能是因為以下情況:

  • 共享資料:加入分享群組,僅分享特定資料
  • 共用資料:加入專案群組,共同管理資料檔案
  • 管理需要:加入管理群組,擁有系統管理、網路管理、帳密管理等能力

群主查詢

要查詢目前使用者所屬的群組,可使用 groups

  • 使用語法:groups <UserName>
  • 如果沒有指定 UserName,則會查詢當前使用者的群組。

群主登入

若要切換到指定的群組,可以使用 newgrp

  • 使用語法:newgrp <groupName>

查詢指令

查詢自己

  • whoami:查詢當前使用的帳號
  • id:顯示更多關於當前使用者的資訊

帳號綜合查詢

  • finger:查詢當前帳號的詳細資訊

線上使用者查詢

  • users:查詢當前線上的使用者
  • w:查詢當前線上的使用者,並顯示詳細資訊
  • who:列出線上使用者的相關資訊 (包括用戶、登錄時間等)
    • b:顯示系統啟動時間
    • d:列出已關閉的程序
    • u:顯示帳號的詳細信息 (包括 PID)
    • q:僅列出帳號並計算帳號數

顯示最近登入退出帳號

  • last:顯示最近登入的帳號和時間
    • 用法:last <option> <cmd|user>
  • lastlog:顯示每個帳號的最後登入時間和其他重要資訊
    • 用法:lastlog <option>
    • b:列出 N 天前的登入帳號
    • C:清除登入記錄 (不建議)
    • u:列出指定帳號的最後登入資訊
    • t:列出 N 天後的登入帳號
  • lastb:顯示最近登入失敗的帳號
    • 用法:lastb <option> <cmd|user>

切換使用者

身分切換

切換使用者是基於安全考量或測試便利性。常見原因包括:

  • 降低權限:轉換為權限較低的帳號,減少系統影響
  • 啟動服務:以特定帳號啟動服務,避免使用 root 帳號
  • 系統維護:使用專屬帳號進行備份、升級等維護工作

基礎指令

切換使用者

  • su:切換使用者
    • 使用語法:su <option> <UserName>

可用選項:

  • m:僅變更身分,環境不變更
  • -:完全切換
  • l:切換為 root 或指定帳號
  • c:執行指定命令
  • s:使用指定的 shell

以使用者執行

  • sudo:以授權的使用者身分執行指令,預設為 root
    • 使用語法:sudo <option> <command>

可用選項:

  • l:顯示被授權的內容
  • e:編輯授權清單 (等同於 sudoeditvisudo)
  • b:在背景執行授權指令
  • u:使用指定授權者的授權
  • g:使用指定授權群組的授權
  • s:使用指定的 shell 執行授權內容

sudo 權限授權

使用 visudo 編輯 sudo 設定檔來授權使用者執行特定指令。

  • 格式:root ALL=(ALL:ALL) ALL
  • 表格格式:
被授權對象 要求來源 授權帳號 授權內容
root ALL= (ALL:ALL) 內容

列出所有帳號及群主

  • 列出所有帳號:cat /etc/passwd | cut -d ":" -f 1
  • 列出所有使用者帳號:compgen -u
  • 列出所有群組:compgen -g