帳號與群組管理
1. 核心檔案解析 (理論篇)
passwd、shadow、group 之間的關係圖
在 Linux 的底層設計中,「帳號與群組」其實就是由這三個純文字檔共同交織而成的資訊網。 很多新手會疑惑,為什麼要把帳號跟密碼分開存放?這其實是基於資安考量的絕妙設計!
我們可以用一張關係圖來快速理解它們各自的定位與關聯:
/etc/passwd(公開的使用者名冊): 這是系統的「公開名冊」,所有的應用程式都可以讀取它來查詢系統裡有哪些帳號、這個帳號的 ID (UID) 是多少、預設的家目錄在哪裡。但裡面沒有真正的密碼。/etc/shadow(機密的密碼保險箱): 因為/etc/passwd必須讓所有人都能讀取,如果把密碼寫在裡面就太危險了!所以 Linux 將真正的加密密碼與過期政策,獨立抽離到/etc/shadow中,並且嚴格限制只有 Root 才有權限讀取。/etc/group(群組名冊): 用來記錄系統裡有哪些群組(Group),以及每個群組的 ID (GID)。每個使用者在/etc/passwd裡都會被指定一個「主要群組 GID」,用來跟這裡的資料做綁定與對應。
passwd 結構
/etc/passwd 是系統中最核心的帳號名冊,每一行代表一個帳號。你可以用前面學過的 head 指令來查看第一行:head -n 1 /etc/passwd。
你會看到類似這樣用冒號 : 隔開的 7 個欄位:
root:x:0:0:root:/root:/bin/bash
這 7 個欄位分別代表的意義如下(這是 Linux 維運面試或考證照的必考題):
- 帳號名稱 (Account):
root使用者登入時輸入的名稱。 - 密碼佔位符 (Password):
x早期的 Linux 真的把密碼寫在這裡,但後來為了資安,這裡統一改成x,代表「真正的密碼已經移交給/etc/shadow去保管了」。 - 使用者 ID (UID):
0Linux 系統真正在識別使用者的「身分證字號」(系統只認數字不認名字)。0:永遠保留給 Root (超級管理員)。1 ~ 999:通常保留給系統服務 (例如伺服器程式運作時用的虛擬帳號)。1000 以上:一般使用者 (我們用指令建立的新帳號,預設都是從 1000 開始)。
- 主要群組 ID (GID):
0這個帳號所屬的「主要群組」的 ID,用來去對應/etc/group檔案裡的群組名稱。 - 備註說明 (GECOS):
root這只是一個附屬欄位,通常用來記錄使用者的全名、分機、信箱等,沒有實質作用。 - 家目錄 (Home Directory):
/root使用者登入後,預設會抵達的目錄路徑。 - 預設 Shell (Default Shell):
/bin/bash使用者登入後,系統派發給他的命令列環境(在 Rocky/CentOS 通常是 Bash)。 (💡 實務提醒:如果你看到這個欄位寫著/sbin/nologin,代表這個帳號「被禁止登入終端機」,這是系統服務帳號常見的安全防護機制。)
shadow 結構
/etc/shadow 是系統的「機密保險箱」,只有 Root 才有權限讀取(權限通常是 000 或 400)。裡面存放了真正的加密密碼,以及密碼的「過期政策」。
你可以用指令查看它(需有 root 權限):sudo head -n 1 /etc/shadow
你會看到類似這樣用冒號 : 隔開的 9 個欄位:
root:$6$xyz...:19500:0:99999:7:::
這 9 個欄位的意義如下:
- 帳號名稱:對應
/etc/passwd的帳號。 - 加密密碼:一長串雜湊過後的亂碼(通常以
$6$開頭代表 SHA-512 加密)。如果這個欄位開頭是!或*,代表該帳號被鎖定或禁止密碼登入。 - 最後一次修改密碼的日期:自 1970 年 1 月 1 日以來的「天數」。
- 密碼不可變更的天數 (Min):改完密碼後,至少要等幾天才能再次修改(防禦頻繁改密碼)。設定
0代表隨時可改。 - 密碼需要重新設定的天數 (Max):密碼的有效期限(預設通常是
99999天,約等於 273 年,也就是永遠不過期)。 - 密碼過期前的警告天數 (Warn):到期前幾天系統會開始發出警告(預設通常是
7天)。 - 密碼過期後的寬限天數 (Inactive):密碼過期後,如果過了這個天數都沒改密碼,帳號就會被正式鎖定。
- 帳號失效日期 (Expire):直接指定該帳號在哪一天自動報廢(通常用於約聘人員或臨時帳號,同樣是以 1970 年起算的天數)。
- 保留欄位:目前沒有意義,保留給未來功能使用。
group 結構
/etc/group 記錄了系統內所有的群組資訊。可以透過 head -n 1 /etc/group 查看,通常長這樣:
root:x:0:
由冒號 : 隔開的 4 個欄位:
- 群組名稱:
root - 群組密碼佔位符:
x(與 passwd 類似,真正的群組密碼被移到了/etc/gshadow,但實務上現代 Linux 極少使用群組密碼)。 - 群組 ID (GID):
0(用來跟/etc/passwd的第四個欄位做主要群組對應)。 - 支援群組的使用者 (Members):這個欄位會列出哪些帳號將這個群組作為「次要群組」。如果有多個帳號,會用逗號
,隔開。
如果把 Linux 系統當作一家「公司」,群組的概念可以用以下比喻來快速理解:
- 主要群組 (Primary Group) 👉 你的「直屬部門」
- 在公司裡,每個人必須且只能有一個直屬部門。
- 記錄在哪裡? 直接寫死在
/etc/passwd的第 4 個欄位 (GID)。 - 有什麼作用? 當你在伺服器上建立一份新檔案時,這份檔案的擁有部門預設就會是你的直屬部門。
- 次要群組 (Secondary Group) 👉 你的「跨部門專案組」或「特權通行證」
- 除了直屬部門,你可能還兼任了福委會、或是擁有進出機房的權限。一個人可以有零個或多個這樣的次要身分。
- 記錄在哪裡? 寫在
/etc/group的第 4 個欄位(Members 欄位)。 - 有什麼作用? 用來取得額外的特權。
🏢 實戰情境演練:新進工程師 Alice 的報到
今天公司來了一位後端工程師 Alice,身為系統管理員的你會這樣設定她的帳號:
- 設定主要群組 (直屬部門):
你先建立了一個名為
backend的群組,並將 Alice 的主要群組設為backend。 從此以後,Alice 在伺服器上寫的每一支程式,預設的群組擁有權都會是backend,這讓其他後端同事可以共同編輯這些程式碼。 - 發派次要群組 (特權通行證):
雖然 Alice 是後端部門,但專案需求讓她需要跨部門的特權。於是你透過
usermod -aG發放了三張通行證給她(將她加入三個次要群組):docker群組:讓她可以直接執行容器指令。adm群組:讓她有權限去讀取/var/log裡面的系統日誌。wheel群組:讓她擁有sudo的最高權限。
這就是次要群組最強大的地方:我們不需要改變 Alice 的直屬部門(她依然是後端工程師),就能靈活地賦予她各種跨部門的特殊權限!
login.defs 設定
/etc/login.defs 是系統建立新帳號時的「全域預設政策檔」。
當你執行 useradd 指令,但沒有加上任何參數時,系統就是從這個檔案裡去讀取預設值。
裡面常見的關鍵設定包含:
UID_MIN / UID_MAX:一般使用者的 UID 範圍(預設從 1000 開始,上限通常是 60000)。這解釋了為什麼你自己建立的帳號 UID 都是一千多起跳。PASS_MAX_DAYS:預設的密碼有效天數(建帳號時,會自動寫入 shadow 的第 5 欄)。CREATE_HOME:預設是否自動建立家目錄(設為yes時,建立帳號就會同時產生/home/username目錄)。UMASK:(極度重要的資安設定) 決定了新建立帳號時,家目錄的預設權限屏蔽。通常預設是077,這確保了除了帳號本人,其他同事都絕對無法進入或偷看這個目錄的內容。USERGROUPS_ENAB:決定是否要建立「與帳號同名」的專屬群組 (UPG 機制)。如果設為yes,當你建立alice時,系統會自動建一個叫alice的主要群組給她;如果設為no,所有新帳號都會被統一丟進系統預設的共同群組(例如users)。ENCRYPT_METHOD:決定密碼要用什麼演算法加密。現代 Linux 預設通常是SHA512,這也就完美解釋了為什麼你在/etc/shadow看到那串亂碼密碼都是以$6$開頭!
【實戰範例:修改全域密碼政策】
假設公司通過了新的資安稽核規範:「所有新進員工的密碼,每 90 天就必須強制更換一次,且密碼過期前 14 天要提早警告」。
與其每次建立帳號都手動打一堆參數,系統管理員的標準做法是直接去修改 /etc/login.defs:
# 使用 vi 打開 /etc/login.defs 後,找到並修改以下參數:
PASS_MAX_DAYS 90 # 密碼最長有效天數改為 90
PASS_MIN_DAYS 0 # 密碼最短修改間隔
PASS_WARN_AGE 14 # 提早 14 天發出過期警告
設定存檔後,未來只要是用 useradd 新建立的帳號,都會自動繼承這個「90天強制換密碼」的鐵律,這才是系統管理員該有的自動化思維!
skel (預設環境模板)
/etc/skel(Skeleton,骨架的意思)是一個非常有趣的**「目錄」**。
(💡 新手常犯錯誤:因為它長得很像設定檔,很多人會直覺用 cat /etc/skel 去看它然後報錯。請記住,查看目錄必須用 ls,而且因為裡面的檔案都是以 . 開頭的隱藏檔,所以你必須下 ls -la /etc/skel 才看得到裡面的東西!)
可以把它想像成發給每一位新帳號的「新手村初始裝備包」。
當你使用 useradd 建立一個新帳號並要求產生家目錄時,系統會去把 /etc/skel 裡面的所有檔案與隱藏設定檔(例如 .bashrc, .bash_profile),完整複製一份到該使用者的家目錄 /home/username 底下。
【實戰範例:統一配發新人的初始裝備包】 在企業環境中,我們常希望每位新進工程師的終端機環境能有一致的體驗。假設公司有以下三個規範:
- 一登入家目錄就必須擁有一個
projects開發資料夾。 - 終端機預設要配置好
ll(等同於ls -lah) 的快捷別名。 - 預設的 Vim 編輯器必須開啟行號顯示 (
set nu)。
與其等工程師報到後一個一個去手動設定,系統管理員的標準做法是直接去修改 /etc/skel 這個**「模板目錄」**裡面的檔案:
(💡 觀念澄清:這裡沒有所謂的「開啟模板專屬指令」,因為 /etc/skel 就只是一個普通的資料夾!管理員只需要用 cd /etc/skel 走進去,然後用 vi 去編輯裡面的隱藏檔就可以了。)
# 1. 建立預設資料夾 (未來建帳號時,這個資料夾會被連同複製過去)
sudo mkdir /etc/skel/projects
# 2. 修改模板中的 .bashrc,加入快捷別名
sudo vi /etc/skel/.bashrc
# (打開檔案後,在最下面新增一行: alias ll='ls -lah')
# 3. 在模板中新增 .vimrc,設定 Vim 預設開啟行號
sudo vi /etc/skel/.vimrc
# (打開空白檔案後,寫入一行: set nu)
設定完成後,當你執行 useradd -m bob 建立新帳號 Bob 時,系統會在背後默默做這三件事:
- 建立
/home/bob/目錄。 - 把
/etc/skel/裡的所有東西(包含我們剛放進去的projects目錄、改過的.bashrc、新建的.vimrc)一字不漏地完整複製到/home/bob/裡面。 - 將這些複製過去的檔案,擁有權全部自動改為
bob。
結果就是:Bob 第一次登入系統時,不用做任何設定,他的家目錄就已經有 projects 資料夾,敲下 ll 就能用,打開 Vim 也自動顯示行號了!這就是 /etc/skel 在自動化維運上的強大威力。
很多新手會誤以為把 alias 寫進 /etc/skel/.bashrc,全系統的人都會立刻生效,這是一個非常經典的誤解!
/etc/skel只是「複製用的母版」:它只在帳號建立的那一瞬間有作用(系統會把裡面的東西 Copy 一份到新帳號的家目錄)。如果某個帳號是昨天建好的,你今天才去改/etc/skel,那個舊帳號是絕對不會有ll可以用的!- 真正的全域設定 (
/etc/profile或/etc/bashrc):如果你希望「不管新舊帳號,全公司所有人立刻都能用ll」,那你應該去改/etc/bashrc這種全域設定檔,而不是改/etc/skel喔! - 那會不會改到我自己的
.bashrc?:絕對不會!你自己的設定檔放在你的家目錄(例如/home/qiuliwen/.bashrc),而你剛才編輯的是/etc/skel/.bashrc,這是兩個完全獨立的檔案。你去修改模板,並不會影響到你目前自己正在使用的環境。
2. 帳號與群組操作 (實戰篇)
與其死記硬背每一個指令,不如讓我們跟著日常維運最常見的 4 個實戰任務,把這些指令串連起來!
🕵️♂️ 任務零:狀態檢視 (動手前先確認現狀)
在進行任何修改前,我們必須先確認目前的狀態。
id [帳號名稱]:查詢指定帳號的 UID、主要群組 GID,以及隸屬的所有次要群組。- 不加帳號名稱時,會顯示「當前登入使用者」的資訊。
- 實戰範例:
$ id aliceuid=1001(alice) gid=1001(alice) groups=1001(alice),10(wheel),981(docker)# (這表示 alice 的主要群組是 alice,但她同時擁有 wheel 和 docker 的次要特權)
groups [帳號名稱]:單純列出該帳號隸屬的所有群組名稱。- 實戰範例:
$ groups alicealice : alice wheel docker
- 實戰範例:
getent(Get entries):用來查詢系統資料庫的萬用指令。getent passwd:列出系統所有的使用者清單(比單純cat /etc/passwd更準確,因為能抓到 LDAP 等網路認證帳號)。- 實戰範例(實務上通常會搭配指定名稱來單獨查詢):
$ getent passwd alicealice:x:1001:1001::/home/alice:/bin/bash# (輸出的格式就跟理論篇教的 /etc/passwd 結構一模一樣!)$ getent group wheelwheel:x:10:alice,bob# (這代表 alice 和 bob 目前都在 wheel 這個擁有 sudo 特權的次要群組內)
🎒 任務一:新人報到 (Onboarding)
今天公司來了一位新工程師 Alice,你需要幫她把帳號與權限辦妥。這是一套標準的連續技:
- 建立帳號 (
useradd)- 常用參數說明:
-m(make home):強制建立家目錄,並將/etc/skel初始裝備包複製進去。-s /bin/bash(shell):指定帳號登入後預設使用的 Shell。- (💡 另外還有
-g 群組名指定主要群組、-G 群組名附加到次要群組)
- 實戰範例:
$ sudo useradd -m -s /bin/bash alice
- 常用參數說明:
- 設定初始密碼 (
passwd)- 說明:Root 強制配發一組臨時密碼。
- 實戰範例:
$ sudo passwd aliceChanging password for user alice.New password: # 盲打輸入密碼不會顯示字元Retype new password:passwd: all authentication tokens updated successfully.
- 強制重設密碼 (
chage)- 常用參數說明:
-d 0(day):將最後修改密碼的日期設為 0 (亦即 1970/1/1)。
- 說明:(極度常用的企業技巧) 將最後修改日期歸零,這會導致 Alice 下一次登入時,系統就會強制要求她立刻重設密碼。這是發派新帳號的標準資安起手式!
- 實戰範例:
$ sudo chage -d 0 alice# (可用 chage -l alice 來檢查,會看到 "Last password change" 變成 "password must be changed")
- 常用參數說明:
🏢 任務二:建立專屬部門群組 (Group Management)
在 Alice 報到後,公司決定成立一個新的跨部門專案組 dev_team,你需要將這個群組建立起來。
- 建立群組 (
groupadd)- 說明:建立一個全新的群組。
- 實戰範例:
$ sudo groupadd developers
- 修改群組 (
groupmod)- 常用參數說明:
-n(new name):為群組重新命名。
- 說明:老闆覺得
developers這個名字不好,要求改成dev_team。 - 實戰範例:
$ sudo groupmod -n dev_team developers
- 常用參數說明:
- 刪除群組 (
groupdel)- 說明:專案結束後,將這個群組刪除。
- (💡 注意:如果這個群組是某個現存使用者的「主要群組」,系統會拒絕刪除,必須先去修改該使用者的設定。)
- 實戰範例:
$ sudo groupdel dev_team
🛡️ 任務三:權限擴充與提權 (Privilege Escalation)
Alice 過了試用期,主管要求你發給她 docker 操作權限,以及伺服器的最高管理權限 sudo。
- 加入次要群組:發放特權通行證 (
usermod -aG或gpasswd -a)- 常用參數說明:
usermod:-a(append) 附加,-G(Groups) 次要群組。gpasswd:-a(add) 加入一位成員。
- ⚠️ 致命警告:使用 usermod 時千萬、絕對、務必記得加上
-a(append)!如果只打-G,系統會把 Alice 從她原本隸屬的其他所有次要群組中踢出,這在企業中是一場災難! - 實戰範例:
# 做法 A (使用 usermod):$ sudo usermod -aG docker,wheel alice# 做法 B (使用 gpasswd,一次只能加一個,但語法直覺,不容易闖禍):$ sudo gpasswd -a alice dockerAdding user alice to group docker
- 常用參數說明:
- 編輯 sudo 授權名單 (
visudo)- 說明:為什麼把 Alice 加入
wheel群組她就有 sudo 權限?因為系統預設的授權名單寫在/etc/sudoers檔案裡。 - 實戰範例:
$ sudo visudo# 絕對不要用 vi 直接編輯這個檔案!visudo 會在存檔前自動檢查語法。# 找到這一行,確保沒有被註解掉,這代表 wheel 群組的人都有 sudo 權限:%wheel ALL=(ALL) ALL
- 說明:為什麼把 Alice 加入
- 切換身分測試 (
su)- 常用參數說明:
-(login shell):這代表連同「環境變數與家目錄」一起完全切換,就像該使用者真的從終端機登入一樣。
- 說明:切換成 Alice 身分測試看看。(極度重要) 強烈建議加上
-!才不會發生路徑與變數錯亂的問題。 - 實戰範例:
$ su - alice[alice@server ~]$ pwd/home/alice
- 常用參數說明:
- 借用 Root 權限執行指令 (
sudo)- 說明:既然 Alice 已經在
wheel群組裡了,她不需要知道 root 的密碼,只要在任何指令前面加上sudo,並輸入她自己的密碼,就能短暫借用特權。 - 實戰範例:
[alice@server ~]$ sudo cat /etc/shadow[sudo] password for alice: # 這裡要輸入 Alice 自己的密碼root:$6$xxxxxx...:19000:0:99999:7:::# (成功查看到原本只有 root 才能看的系統密碼檔!)
- 說明:既然 Alice 已經在
👋 任務四:員工離職 (Offboarding)
幾年後 Alice 決定離職了,身為管理員,你不能直接把她刪掉,因為她家目錄裡可能還有交接資料!標準的離職流程是這樣的:
- 鎖定帳號 (
passwd -l)- 常用參數說明:
-l(lock):鎖定帳號。- (💡 相對應的解鎖參數是
-u(unlock))
- 說明:這會在她的
/etc/shadow密碼前加上驚嘆號!,讓她立刻無法登入,但資料都還在。 - 實戰範例:
$ sudo passwd -l aliceLocking password for user alice.
- 常用參數說明:
- 踢出特權群組 (
gpasswd -d)- 常用參數說明:
-d(delete):將成員從群組中刪除。
- 說明:先將她從 sudo 特權群組中移除,以防萬一。
- 實戰範例:
$ sudo gpasswd -d alice wheelRemoving user alice from group wheel
- 常用參數說明:
- 保留資料刪除帳號 (
userdel)- 常用參數說明:
-r(remove):連同家目錄與使用者的信箱一起徹底刪除。
- 說明:單純
userdel會保留家目錄,實務上常為了保留離職信件與交接資料而這麼做。 - 實戰範例:
$ sudo userdel alice# 如果要毀屍滅跡,加上 -r 會連同家目錄一起徹底刪除,請小心使用!$ sudo userdel -r alice
- 常用參數說明:
5. 現代 MIS 實務:權限與群組架構設計 (RBAC + UPG)
在現代雲端主機與 DevOps 時代,Linux 伺服器的定位已從舊時代的「多人共同辦公桌」轉變為「應用服務與軟體執行的隔離平台」。身為企業 MIS 與系統維運工程師,應遵循 「以職能群組作為角色邊界 (RBAC) + 使用者私有群組 (UPG)」 的黃金架構來規劃主機權限。
現代 Linux 群組的真實業界定位 (UPG vs 服務隔離)
| 群組分類 | 代表案例 | 業界真實定位與實務原則 |
|---|---|---|
| 真人帳號的主要群組 (Primary Group - UPG) | amy : amyalex : alex | 身分基本盤與防護隔離: 現代主機上不會把部門(如 IT)設為個人的主要群組。保留同名的私有群組 (amy:amy) 主要是為了保護其私有家目錄、 .bash_history 以及 .ssh 登入金鑰目錄的安全(防止因為目錄權限開放給同事,遭 sshd 判定危險而拒絕登入)。實務上我們從不更改別人的主要群組。 |
| 系統服務的主要群組 (Service Accounts) | nginx : nginxmysql : mysqldocker : docker | 應用服務沙盒隔離 (Sandbox & Isolation): 現代「專屬一對一群組」發揮大威力之處!為 Nginx、MySQL 建立獨佔身分,萬一 Web 服務遭駭客攻破,也能被限制在 nginx 的群組牢籠裡,無法跨越邊界去讀寫旁邊 mysql:mysql 的資料庫。 |
| 次要群組 (Supplementary Groups) | sysadminmis_opsdevelopers | 真正的權限控管與職能通行證 (RBAC): 透過將工程師個人帳號掛載不同「次要群組 (-aG)」,賦予他能執行哪些系統命令、以及參與哪些專案目錄的開發協作。 |
企業 MIS 權限管理核心黃金法則
- 95% 用「角色 (
%群組)」,5% 用「單人」: 在/etc/sudoers裡,切勿把 50 個工程師的名字一筆筆寫進去(容易造成管理混亂與離職漏刪漏洞)。應一律以%群組名稱(角色) 宣告權限,人員異動時僅需使用usermod -aG或gpasswd -d增減次要群組即可。 - 嚴禁外單位直接加入
docker群組 (等同 Root 提權隱患): 在 Linux 中,把成員加入docker群組實質上就等於送他 Root 權限。任何 docker 群組成員都可以執行docker run -v /:/host -it ubuntu bash,把主機根目錄/完整掛進容器中進行任意竄改。
經典 MIS 4 層職能群組與 visudo 白名單示範
在企業實務中,我們會為 MIS / Ops 團隊設定至少 3~4 層的職能白名單:
| 群組名稱 | 賦予對象 | 權限定位與實務原則 |
|---|---|---|
mis_admin(或 wheel) | MIS 主管、資深 SRE 架構師 | 整台系統最高權限:具備 ALL=(ALL:ALL) ALL 權限;強制必須驗證個人密碼 (NOPASSWD 嚴禁開放)。 |
mis_ops | 全體 MIS 團隊 (含新進工程師 amy) | 日常維運白名單:無完整 root 權限!僅開放低風險常規指令(服務重啟 systemctl、查看系統狀態 journalctl/df/du/ps 等)。 |
developers | 應用程式 / 後端開發同仁 | 無系統 sudo 權限:透過專案資料夾的 SGID (2775) 共同協作讀寫,可查看應用層日誌但不可更改系統設定。 |
# 1. 系統最高管理者角色:必輸入密碼
%mis_admin ALL=(ALL:ALL) ALL
# 2. MIS 日常維運與新人角色:白名單機制 (絕對路徑防護)
%mis_ops ALL=(ALL) /usr/bin/systemctl restart *, \
/usr/bin/systemctl status *, \
/usr/bin/journalctl *, \
/usr/bin/df *, \
/usr/bin/du *
# 3. 嚴格限縮外單位人員 (如 ext_ken) 只有單一特定 Docker 專案的重啟權
ext_ken ALL=(ALL) NOPASSWD: /usr/bin/docker compose -f /opt/myapp/docker-compose.yml up -d, \
/usr/bin/docker restart my-app, \
/usr/bin/docker logs --tail=100 my-app
- 新人到職 (如
amy):$ sudo useradd -m -s /bin/bash amy # 自帶 amy:amy 主要群組保護 SSH 隱私$ sudo usermod -aG mis_ops amy # 掛上日常維運次要群組 - 通過考核晉升為資深管理員:
$ sudo usermod -aG mis_admin amy # 直接多掛最高特權群組,不用改 sudoers!
- 離職卸除權限:
$ sudo gpasswd -d amy mis_admin # 1 秒移除最高特權$ sudo passwd -l amy # 立即鎖定登入
特殊情境:如何安全授權「外單位 Docker 部署任務」?
當外單位同仁需要部署 Docker 服務,又不能給予 docker 群組權限時,MIS 最紮實的解決方案是 「封裝專屬安全部署腳本 + visudo 單條指令授權」:
- MIS 撰寫唯讀的部署腳本 (
/usr/local/bin/deploy-myapp.sh):/usr/local/bin/deploy-myapp.sh#!/bin/bashcd /opt/myapp && git pull origin main && docker compose up -d --remove-orphans - 用
visudo只開放該隻 Shell Script 的執行權:/etc/sudoers.d/external-deployersext_ken ALL=(ALL) NOPASSWD: /usr/local/bin/deploy-myapp.sh
只要對方嘗試下其他 Docker 指令或想掛載主機根目錄,系統將無條件攔截拒絕,真正達成**「只給予目標任務權限」**的極致安全!