sudo 與 sudoers:最小權限原則實踐 文章首圖

sudo 與 sudoers:最小權限原則實踐

sudo 與 sudoers:最小權限原則實踐

在 Linux 系統管理中,「最小權限原則」(Principle of Least Privilege)是安全架構的基石。這意味著使用者或程序僅應擁有完成其任務所需的最小權限,而非無限制的 root 權限。sudo(superuser do)正是實踐這一原則的核心工具,而 /etc/sudoers 則是定義這些權限邊界的關鍵配置文件。本文將深入探討如何正確配置 sudo,以確保系統安全與操作效率兼顧。

sudo 的基本運作與常用選項

sudo 允許授權的使用者以其他使用者(預設為 root)的身份執行指令。當您首次執行 sudo 時,系統會要求輸入當前使用者的密碼,而非 root 密碼。這不僅區分了日常操作與管理操作,也便於審計追蹤。

以下是一些高頻使用的選項:

  • -u, --user:指定要模擬的使用者名稱。若不指定,預設為 root。
  • -i, --login:模擬該使用者的登入環境,載入其 .bashrc 等環境變數。
  • -s, --shell:以非登入殼層模式執行指定的 shell。
  • -l, --list:列出當前使用者被允許執行的 sudo 命令。這是檢查權限配置是否生效的最佳方式。

例如,檢查當前使用者有哪些 sudo 權限:

$ sudo -l
Matching Defaults entries for user1 on ubuntu:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User user1 may run the following commands on ubuntu:
    (ALL : ALL) ALL

這表示 user1 可以執行任何命令。然而,在生產環境中,我們通常不希望給予如此寬鬆的權限。

精細化 sudoers 配置

/etc/sudoers 文件的語法雖然看似簡單,但錯誤的寫法可能導致系統無法使用 sudo,甚至鎖定管理者帳號。因此,強烈建議使用 visudo 命令來編輯此文件,它會在保存前進行語法檢查。

1. 限制特定命令

假設我們希望 user1 僅能重啟 Nginx 服務,而不能執行其他管理命令。我們可以在 /etc/sudoers.d/ 目錄下創建一個單獨的配置文件(例如 nginx-admin),內容如下:

user1 ALL=(root) /usr/sbin/service nginx restart

或者使用 systemctl 語法:

user1 ALL=(root) /usr/bin/systemctl restart nginx

驗證配置是否生效:

$ sudo -l
...
    (root) /usr/bin/systemctl restart nginx

此時,若 user1 嘗試執行 sudo apt update,系統將拒絕並顯示錯誤:user1 is not in the sudoers file. This incident will be reported.

2. 免密碼執行(NOPASSWD)

對於自動化腳本或特定服務帳戶,有時需要免密碼執行。使用 NOPASSWD 標籤:

deployer ALL=(root) NOPASSWD: /usr/bin/systemctl restart app-service

注意:應謹慎使用此選項,僅限於高度可信的環境與腳本中。

3. 別名(Aliases)的應用

當管理多個使用者或命令時,使用別名可簡化配置。在 /etc/sudoers 中定義:

# 定義使用者別名
User_Alias WEBAUTHORS = user1, user2, user3

# 定義命令別名
Cmnd_Alias WEBADMIN = /usr/bin/systemctl restart nginx, /usr/bin/systemctl reload nginx

# 應用別名
WEBAUTHORS ALL=(root) WEBADMIN

常見問題與排除

Q1:為什麼我修改了 sudoers 文件,但權限沒有生效?

最常見的原因是語法錯誤導致 visudo 拒絕保存,或者您編輯了錯誤的文件。請務必使用 visudovisudo -f /etc/sudoers.d/your_file 來編輯。此外,確認配置文件權限為 0440

sudo chmod 0440 /etc/sudoers.d/nginx-admin

若權限過寬(如 0644),sudo 會出於安全考慮忽略該文件。

Q2:如何防止使用者利用 sudo 繞過限制?

使用者可能嘗試通過 shell 擴展或變量注入來執行未授權的命令。例如,執行 sudo /bin/sh 如果未明確禁止,可能允許獲得 root shell。解決方案是明確禁止危險命令,或使用 ! 否定語法:

user1 ALL=(root) /usr/bin/systemctl restart nginx, !/bin/sh, !/bin/bash

更進階的做法是使用 sudoenv_keepenv_check 選項,嚴格控制環境變數的傳遞,防止 LD_PRELOAD 等攻擊向量。

小結

正確配置 sudosudoers 是 Linux 系統安全的關鍵一環。透過遵循最小權限原則,我們不僅能降低誤操作風險,還能有效阻擋潛在的安全威脅。記住,永遠使用 visudo 編輯配置文件,並定期審視 /etc/sudoers.d/ 下的權限設定,確保其符合當前的業務需求與安全規範。安全不是障礙,而是穩健運作的基石。