緯育 2026-0402.2
出自頂極製作所
帳號與群組的管理概念
群組基本管理指令
- 新增群組 (groupadd)
- 基本用法:groupadd [群組名稱]。
- 指定 GID:groupadd -g [GID] [群組名稱]。
- 建立後可透過 cat /etc/group 檢視。
- 修改群組 (groupmod)
- 更改群組名稱:groupmod -n [新群組名稱] [原群組名稱]。
- 更改 GID:groupmod -g [新GID] [群組名稱]。
- 刪除群組 (groupdel)
- 基本用法:groupdel [群組名稱]。
- 若有成員正在使用該群組,系統會提示無法刪除。可使用 -f 強制刪除,但可能導致使用者程式出現問題。
- 刪除後,使用者無法再透過 newgrp 登入該群組。
群組成員與密碼管理
- 管理群組成員 (groupmems)
- 新增成員:groupmems -a [使用者帳號] -g [群組名稱]。
- 移除成員:groupmems -d [使用者帳號] -g [群組名稱]。
- 列出成員:groupmems -l -g [群組名稱]。
- 管理群組密碼與成員 (gpasswd)
- 設定/變更群組密碼:gpasswd [群組名稱]。講師建議非必要不設定密碼,因不設密碼反而更安全。
- 新增成員:gpasswd -a user1,user2 [群組名稱] 或 gpasswd -M user1,user2 [群組名稱] 可一次加入多位成員。注意:此操作會覆蓋原有的成員列表。
- 移除成員:gpasswd -d [使用者帳號] [群組名稱]。
- 設定群組管理者:gpasswd -A [管理者帳號] [群組名稱]。
- 群組設定檔案
- /etc/group:儲存群組基本資訊,包括群組名稱、GID 及成員列表。
- /etc/gshadow:儲存群組的加密密碼與管理者資訊。使用指令管理會自動同步這兩個檔案。
群組切換與權限應用
- 切換與識別使用者群組
- groups [使用者名稱]:查詢指定使用者所屬的所有群組。不加參數則顯示當前使用者。
- id:查看目前使用者詳細的群組資訊。
- newgrp [群組名稱]:切換有效群組。若使用者已是群組成員,無需密碼;若非成員,且群組設有密碼,則需輸入密碼才能切換。
- newgrp -:切換回使用者的主要群組。
- exit:登出當前切換的群組,返回上一層狀態。
- 群組管理者權限
- 群組管理者的唯一功能是新增或移除群組內的其他成員(例如使用 gpasswd -d)。一般群組成員無此權限。
- 應用場景與權限設定
- 共享唯讀資料:將檔案權限設為群組唯讀(如 chmod 640 file),非群組成員則無權限。群組成員無需切換即可讀取。
- 共用可讀寫專案:為實現群組協作(成員間可互相修改檔案),可建立一個共用目錄(如 chmod 770 dir),並要求成員使用 newgrp 切換到該群組後再建立檔案。這樣,新檔案的所屬群組會是共用群組,而非建立者個人的主要群組,確保了其他成員的寫入權限。
- 管理需求:將一般使用者加入特定管理群組(如 netplan 目錄所屬群組),使其在不改變帳號本質的情況下,獲得該資源的管理能力。
使用者帳號建立補充
- useradd -m 的重要性
- 建立使用者時應使用 useradd -m [帳號],-m 參數會自動為使用者建立家目錄 (/home/[帳號])。
- 若省略 -m,則需手動建立家目錄、複製設定檔、並修正擁有者與權限,過程繁瑣。
- 家目錄預設檔案來源 (/etc/skel)
- 新使用者家目錄中的預設檔案(如 .bashrc)是從 /etc/skel 目錄複製而來的。管理員可客製化此目錄以統一新使用者的預設環境。
- 使用者預設值設定檔 (/etc/default/useradd)
- useradd 指令的預設行為(如預設 Shell、家目錄根路徑等)定義在此檔案中。
帳號與身份認知
- Whoami/Id/Pwd 的基本辨識
- 透過 whoami(或「Who Am I」)快速確認當前使用者身份;講者提及 id 指令已在前面章節講過,兩者皆可用於辨識。
- 在共享環境或雲端登入時,常看不到完整提示,應用這類指令以自我確認「我是哪個帳號」與目前所在目錄(pwd)。
- 提醒在雲端環境初次登入時,花約 30 秒用這些指令確認基本狀況。
- 身份切換與授權的差異(概念引介)
- 身份切換:切換成他者身份後,所有操作被完整視為該身份行為;若用於不當行為,追查會指向被切換的帳號。
- 授權:保留自身帳號,授權他方執行特定操作;機制與概念不同,避免直接把帳號給對方。此為後續將深入的主題。
群組與帳號資訊查詢
- finger 與 /etc/passwd 的資訊欄位
- finger 可用來展示使用者資訊;/etc/passwd 第五欄為資訊欄,可分割為多欄位配合展示。
- 現代環境較少使用 finger,但在學習歷史或環境檢視時可作補充。
- 群組相關指令:groups 與 groupmems
- groups:以帳號查所屬群組,可查自己或指定帳號(加上帳號或 ID)。
- groupmems(或類似名稱,如講者口誤「Goover Members」):以群組查成員名單;區分「用帳號查群組」與「用群組查帳號」兩種向度。
線上使用者與主機狀態監控
- users 指令
- 顯示目前線上使用者列表,適合遠端登入後的第一步快速檢查。
- 有些主機可能未收錄 users 指令,需改用 w 或 who。
- w 指令的完整視圖與欄位解讀
- 無需參數即可提供豐富資訊:當前時間、系統開機時間(up)、線上使用者數、Load average(三個期間的 CPU 負載)、每位使用者的終端、登入來源與時間、idle(閒置時間)、CPU 使用(JCPU/PCPU)、當前執行命令。
- 時間與時區:示例中系統未調時區,顯示 3 點;台灣需加 +8,顯示 11 點。時間與時區另有專章。
- 終端類型與來源:
- tty 表示本機控制台登入;遠端登入則標示 pts/BTS(講者示例中提「BTS」字樣)與來源 IP(若為 public IP 可追查身分)。
- 登入時間(Login at)與 idle:
- Login at 顯示精確登入時間(如 3:13),idle 顯示未操作的持續時長(秒、分)。
- CPU 負載解讀(Load average 三值:1 分鐘、5 分鐘、15 分鐘平均):
- 單核心基準:1.0 代表 100%;0.5 代表 50%;2.0 代表已滿載且尚有等候作業排隊。
- 多核心換算:雙核心 2.0 代表兩核心滿載;4.0 代表兩核心滿載且額外兩核心等候量。
- 判讀策略:較少在意 1 分鐘瞬時值,重看 5 分鐘;若 1 分鐘高、5 分鐘低,可能是瞬間工作。若 1、5 都高,再看 15 分鐘以辨識是否長期滿載。
- 手機類比(Android 開發者選項顯示核心與負載):
- 若 8 核心手機跑遊戲時 Load 僅約 2.0,CPU 很輕鬆,lag 可能非 CPU 問題;若高達 12.x,表示 CPU 來不及處理。
- 進程觀察與強制登出:
- w 可配合顯示 PID(小 p 參數)定位某使用者進行的程序,如歷史查看(history、/etc/passwd 等)。
- 因「everything is a file;process 也是 file」,可用 kill 直接處理特定 PID(例如 kill 1297)以強制結束程序或登出。
- 日常操作偏好:
- 遠端檢查通常以 w 為首選,或先 users 後 w;w 無參數已涵蓋多數需求。
- who 指令(精簡版)
- 顯示線上誰在用:帳號、時間、日期、來源 IP、終端(如 pts0/pts1、tty)。
- who -b:顯示系統開機時間。
- 顯示 UID/使用者 ID 等資訊;與 users/w 有重疊,依環境選用。
登入歷史、最後登入與紀錄檔位置
- last 指令(講者口誤與變體說明:laster/lastlog)
- last:列出最近登入紀錄,可加 -n(或 -N、講者以「最後十筆」用語描述)限制顯示筆數;可指定終端(tty1、tty2、…)或帳號(如 user4)。
- 顯示內容含:帳號、登入來源(BTS/pts 與 IP)、時間範圍(起訖)、持續時長(例如 0 分 0 秒代表登入失敗或極短會話)。
- 實務中可能因 OS(如不同 distro,如 CentOS)有顯示差異或 bug,部分 tty 看不到;非指令問題,而是作業系統層面。
- 常見流程:遠端登入後先用 w 檢視,再用 last 查看最近登入狀態與時間是否合理(例如發現昨天非上班日仍有登入需追查)。
- last 的資料檔案位置與格式
- 檔案位於 /var/log/wtmp(講者以「RAR 底下 Log 底下 Wtemp/wtemplar」口語讀法,意指 /var/log/wtmp)。
- 該檔非純文字檔,不能用 cat;需以對應工具(如 last)讀取,格式類似資料庫。
- 若檔案被刪除或清空,相關指令輸出會變空白;駭客入侵離開前常會刪除此類檔案,需知路徑以便取證或監控。
- lastlog 指令(每帳號最後登入時間)
- 以帳號為主鍵,列出所有帳號的最後登入時間清單;未曾登入者標示 Never logged in。
- 可能配合選項如 -t(例如 T3 表示三天範圍)過濾時間,但講者認為此用法較少用。
- 資料來源於 /var/log/lastlog,亦非純文字檔。
- 清除紀錄的風險與不建議操作
- 使用「truncate -s 0」等方式可清空檔案內容,但一般不建議;在練習環境可嘗試了解後果。
- 清除會造成監控失效,實務上應保留紀錄以利稽核與事件溯源。
登入失敗偵測與防禦思路
- lastb 指令(登入失敗紀錄)
- 顯示登入失敗的帳號、時間、終端、來源;資料檔位於 /var/log/btmp(講者稱「BAR 底下 LOCKER 底下 BETEMP」)。
- 駭客傾向刪除此檔以掩蓋爆破紀錄;管理者應熟悉路徑與檔案性質。
- 常見情境:一早遠端登入先跑 lastb;若看到大量且密集的失敗紀錄,可能有人嘗試暴力破解(踹)。
- 示範:嘗試以不存在帳號(如 user999、use888)與錯誤密碼登入,lastb 即顯示 TTY1(本機)或遠端 pts 對應的失敗事件。
- 批次統計與告警
- 以管線統計嘗試次數:lastb | wc -l 可快速得知失敗嘗試筆數(例如 10 次)。
- 自動化腳本思路(後續課程以 shell script 實作):每小時掃描 lastb,篩選特定帳號或來源(遠端/本機),若超過閾值(如 100 或 1000 次),觸發動作。
- 因應動作:最強硬的是直接關機(poweroff),以阻斷持續爆破;也可先記錄、告警(寄信、訊息),再由管理者決策。
- 在無額外防禦系統的情況下,可自主建立基本偵測與防護。
實務快速檢查流程總結
- 遠端登入初步檢視步驟(數秒至數分鐘)
- users:快速看線上有誰。
- w:詳看負載、使用者、終端類型、來源 IP、登入時間、idle、目前執行的命令。
- last:檢視最近登入紀錄與時間是否合理;必要時限定筆數或查特定 tty/帳號。
- lastb:檢視近期登入失敗事件量與時間密度,判斷是否遭暴力嘗試。
- 錯誤或可疑狀況出現時,進一步追查或採取對應措施(例如 kill 程序、通知、隔離、關機)。
身份切換的必要性與概念
- 為何需要切換帳號
- 權限控管考量:在實務上,應盡量避免直接使用 root 帳號進行日常操作。通常會使用權限較低的帳號來執行任務,以降低對系統的影響範圍。
- 安全考量:為特定的服務(如 FTP、web server)配置專屬的系統使用者(system user)來進行管理,可以增強安全性。
- 系統維護需求:執行備份、升級等系統維護工作時,可能需要切換到擁有特定權限的專屬帳號。
- 軟體本身限制:某些軟體(如 Telnet、SSH)為了安全,預設會限制或禁止高權限帳號(如 root)直接登入,因此必須先以低權限帳號登入後再進行身份切換。
- 帳號使用的基本概念
- 最小權限原則:除非絕對必要,否則應避免使用 root 帳號。
- 安全切換流程:若確實需要使用 root 權限,應由一般使用者登入後再透過 su 指令切換身份。這種方式增加了破解難度,是目前主流作業系統(如 CentOS)的標準做法。
- 權限足夠即可:在操作時,應使用權限「低到足夠」的帳號來完成任務。
- 授權機制:可以使用授權機制(將在後續章節講述)來取代直接切換帳號,這樣無需共享 root 密碼。
- 監控與記錄:應建立完整的帳號監控機制、登入記錄與查詢系統。
- SSH 登入限制範例
- 講師以 Party(應為 PuTTY)軟體示範,當嘗試使用 root 帳號直接透過 SSH (Port 22) 登入時會失敗。
- 失敗原因並非密碼錯誤,而是基於安全考量,軟體預設不允許 root 帳號直接遠端登入。
- 正確的操作是先使用一個低權限的一般使用者帳號(如 user)登入,成功後再使用 su 指令切換到 root 帳號。
su(Switch User)指令詳解
- su 指令基本用法
- su 是 Switch User 的縮寫,用於切換使用者身份。
- su:不帶任何參數,預設切換到 root 帳號,需要輸入 root 的密碼。
- su [帳號名稱]:切換到指定的帳號,需要輸入目標帳號的密碼。
- su 的環境切換差異(* 參數)
- 不帶減號(su [帳號]):僅切換使用者「身份」與權限,但工作環境(如目前所在目錄、環境變數)沿用切換前帳號的設定,稱為「不完整切換」。
- 帶減號(su * [帳號]):身份、權限與工作環境皆完整切換為目標帳號的預設環境,稱為「完整切換」。例如,切換後當前目錄會變為目標使用者的家目錄(home directory),如同該使用者重新登入系統。
- su 的權限切換規則
- 高權限切換至低權限:root 切換到任何一般使用者帳號時,不需要輸入對方的密碼。
- 低權限切換至高權限/其他帳號:一般使用者切換到 root 或其他使用者帳號時,必須輸入目標帳號的正確密碼。
- su 的其他常用參數
- -c [指令]:允許以切換後的身分執行單一指令,執行完畢後自動回到原使用者身份,無需手動登出。例如:su * root -c 'ls -la /root'。
- -s [Shell 路徑]:在切換身份時指定要使用的 Shell。例如,當目標使用者的預設 Shell 不是 bash 時,可用 su user1 -s /bin/bash 強制使用 bash 環境。
補充技巧:列出系統帳號與群組
- 傳統方法:解析設定檔
- 透過讀取系統設定檔並搭配指令達成。
- 列出所有帳號:cut -d: -f1 /etc/passwd。此指令讀取 /etc/passwd(儲存所有帳號資訊),以冒號 : 為分隔符,取出第一欄位(帳號名稱)。
- 列出所有群組:cut -d: -f1 /etc/group。原理同上,但讀取的是群組設定檔 /etc/group。
- Bash 內建指令:compgen
- 在 bash 環境下,可使用更簡單的內建指令 compgen。
- 列出所有帳號:compgen -u。
- 列出所有群組:compgen -g。
- 限制:compgen 僅存在於 bash。在其他 Shell(如 sh、csh 或 macOS 預設的 zsh)中無法使用,需改採用傳統的 cut 方法。