返回文章列表

Linux 使用者帳戶安全防護策略

本文探討 Linux 系統中使用者帳戶的安全防護策略,著重於 sudo 工具的使用與組態。從 root 帳戶的風險開始,說明 sudo 的優勢、許可權設定、進階技巧以及安全注意事項,並提供實際操作範例,指導讀者如何在不同 Linux 發行版中有效管理使用者許可權,提升系統安全性。

資安 系統管理

在 Linux 系統管理中,使用者帳戶安全至關重要。直接使用 root 帳戶存在安全風險,而 sudo 工具提供更安全的許可權管理機制。透過 sudo,系統管理員可以精細控制使用者許可權,僅授予必要的操作許可,避免濫用和提升系統安全性。本文將探討 sudo 的組態技巧,包含使用者別名、命令別名,以及如何根據不同職責分配特定許可權,並示範如何在混合 Linux 環境中有效管理 sudo 策略。同時也提醒管理員注意 sudo 計時器的安全隱患,並提供最佳實務建議,確保系統安全。

2. 保護使用者帳戶安全

管理使用者是 IT 管理中最具挑戰性的任務之一。我們需要確保使用者能夠存取自己的資源,並執行工作所需的任務。同時,也必須確保使用者的資源免受未經授權的使用者的侵害,並且限制使用者只能執行與其工作相關的任務。在本章中,我們將探討如何鎖定使用者帳戶和使用者憑證,以保護它們免受攻擊者和竊聽者的侵害。我們還將研究如何防止使用者擁有超出其工作所需的許可權。

本章涵蓋的具體主題如下:

  • 以 root 使用者登入的危險
  • 使用 sudo 的優勢
  • 為完全管理員使用者和具有特定委派許可權的使用者設定 sudo 許可權
  • 使用 sudo 的進階技巧和訣竅
  • 鎖定使用者的家目錄
  • 強制執行強密碼標準
  • 設定和強制執行密碼和帳戶過期
  • 防止暴力破解密碼攻擊
  • 鎖定使用者帳戶
  • 設定安全橫幅
  • 檢測受損密碼
  • 瞭解中央使用者管理系統

以 root 使用者登入的危險

Unix 和 Linux 作業系統相較於 Windows 的一大優勢在於,它們能夠更好地將特權管理帳戶與普通使用者帳戶分開。事實上,舊版 Windows 之所以容易受到安全性問題(如病毒感染)的困擾,其中一個原因是常見的做法是設定具有管理員許可權的使用者帳戶,而沒有新版 Windows 中的使用者存取控制(UAC)保護。即使有了 UAC,Windows 系統仍然會受到感染,只是頻率較低。對於 Unix 和 Linux 系統來說,感染一個組態正確的系統要困難得多。

您可能已經知道,Unix 或 Linux 系統上全能的管理員帳戶是 root 帳戶。如果您以 root 使用者登入,就可以對該系統執行任何操作。因此,您可能會想,「這很方便,我就這麼做吧。」然而,始終以 root 使用者登入可能會帶來一系列安全性問題。請考慮以下幾點。以 root 使用者登入可能會導致:

  • 更容易意外執行對系統造成損害的操作
  • 更容易讓其他人執行對系統造成損害的操作

如果您始終以 root 使用者登入,或者只是讓 root 使用者帳戶隨時可用,您可以說是在為攻擊者和入侵者做一大半的工作。此外,假設您是一家大公司的主要 Linux 管理員,而允許使用者執行管理任務的唯一方法是給他們 root 密碼。如果其中一位使用者離開公司會怎麼樣?您不會希望那個人仍然能夠登入系統,因此您必須更改密碼並將新密碼分發給所有其他使用者。如果您只想讓使用者擁有特定任務的管理員許可權,而不是擁有完整的 root 許可權,該怎麼辦?

我們需要一種機制,讓使用者能夠執行管理任務,而不必承擔始終以 root 使用者登入的風險,並且還能讓使用者只擁有執行特定工作所需的許可權。在 Linux 和 Unix 中,我們有 sudo 工具來實作這一機制。

使用 sudo 的優勢

正確使用 sudo 工具可以大大提高系統的安全性,並且使管理員的工作變得更加容易。使用 sudo,您可以:

為不同使用者分配不同的許可權

  • 為某些使用者分配完整的管理員許可權,同時為其他使用者分配執行與其工作直接相關的任務所需的許可權。
  • 允許使用者輸入自己的正常使用者密碼來執行管理任務,這樣就不必將 root 密碼分發給每個人。
  • 使入侵者更難破壞您的系統。如果您實施 sudo 並停用 root 使用者帳戶,潛在的入侵者將不知道該攻擊哪個帳戶,因為他們不知道哪個帳戶具有管理員許可權。
  • 建立可在整個企業網路中佈署的 sudo 策略,即使該網路混合了 Unix、BSD 和 Linux 機器。

提升稽核能力

  • 由於您能夠檢視使用者在使用其管理員許可權時執行的操作,因此可以提高稽核能力。

關於最後一點,請考慮以下來自我的 CentOS 7 虛擬機器安全日誌的片段:

Sep 29 20:44:33 localhost sudo: donnie : TTY=pts/0 ; PWD=/home/donnie ; USER=root ; COMMAND=/bin/su -
Sep 29 20:44:34 localhost su: pam_unix(su-l:session): session opened for user root by donnie(uid=0)
Sep 29 20:50:39 localhost su: pam_unix(su-l:session): session closed for user root

從上述日誌中可以看到,我使用了 su - 登入到 root 命令提示字元,然後又登出了。在我登入期間,我執行了幾項需要 root 許可權的操作,但這些操作都沒有被記錄下來。然而,我使用 sudo 執行的操作卻被記錄了下來。也就是說,由於這台機器上的 root 帳戶被停用,我使用我的 sudo 許可權使 su - 命令為我工作。再來看另一個片段,以展示這是如何運作的更多細節:

Sep 29 20:50:45 localhost sudo: donnie : TTY=pts/0 ; PWD=/home/donnie ; USER=root ; COMMAND=/bin/less /var/log/secure
Sep 29 20:55:30 localhost sudo: donnie : TTY=pts/0 ; PWD=/home/donnie ; USER=root ; COMMAND=/sbin/fdisk -l
Sep 29 20:55:40 localhost sudo: donnie : TTY=pts/0 ; PWD=/home/donnie ; USER=root ; COMMAND=/bin/yum upgrade
Sep 29 20:59:35 localhost sudo: donnie : TTY=tty1 ; PWD=/home/donnie ; USER=root ; COMMAND=/bin/systemctl status sshd
Sep 29 21:01:11 localhost sudo: donnie : TTY=tty1 ; PWD=/home/donnie ; USER=root ; COMMAND=/bin/less /var/log/secure

內容解密:

上述日誌片段展示了使用 sudo 的稽核能力。可以看到,使用者的每一步操作都被記錄下來,包括使用的命令、工作目錄等。這對於追蹤和管理使用者的管理員許可權操作非常有幫助。

圖表翻譯:

此圖示展示了sudo的日誌記錄功能,可以清楚地看到使用者的操作都被記錄下來,方便管理員進行稽核和追蹤。

@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultTextAlignment center
skinparam rectangleBackgroundColor #F5F5F5
skinparam rectangleBorderColor #333333
skinparam arrowColor #333333

title 圖表翻譯:

rectangle "使用sudo" as node1
rectangle "記錄日誌" as node2
rectangle "稽核" as node3

node1 --> node2
node2 --> node3

@enduml

圖表翻譯: 此圖表展示了sudo工具如何記錄使用者的操作並將日誌儲存到安全日誌中,以便管理員進行稽核。

在混合Linux環境中設定sudo許可權

在管理多台Linux機器時,無論是單一機器還是跨網域佈署,設定適當的sudo許可權是至關重要的安全措施。本文將討論如何在不同Linux發行版中設定sudo許可權,包括將使用者新增到預定義的管理群組以及直接在sudo政策檔中建立條目。

為完全管理員使用者設定sudo許可權

在限制使用者能做的事之前,我們先來看看如何允許使用者執行所有操作,包括登入root命令提示字元。有幾種方法可以實作這一點。

將使用者新增到預定義的管理群組

第一種方法,也是最簡單的方法,就是將使用者新增到預定義的管理員群組,然後組態sudo政策以允許該群組執行其工作。不同的Linux發行版使用不同的管理群組。

在Unix、BSD和大多數Linux系統上,您需要將使用者新增到wheel群組。(紅帽系列,包括CentOS和AlmaLinux,都屬於這一類別。)在RHEL型別的機器上執行groups命令,會顯示如下結果:

[donnie@localhost ~]$ groups
donnie wheel
[donnie@localhost ~]$

這表明我是wheel群組的成員。執行sudo visudo命令,可以開啟sudo政策檔。向下滾動,可以看到賦予wheel群組強大權力的行:


## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL

百分號表示我們正在處理一個群組。三個ALL的出現意味著該群組成員可以在佈署此政策的網路中的任何機器上,以任何使用者身份執行任何命令。唯一的缺點是,群組成員在執行sudo任務時需要輸入自己的正常使用者帳戶密碼。再向下滾動一點,可以看到以下內容:


## Same thing without a password
# %wheel ALL=(ALL) NOPASSWD: ALL

如果我們註解掉前一個程式碼段中的%wheel行,並刪除這個程式碼段中%wheel行前的註解符號,那麼wheel群組的成員就可以在不輸入任何密碼的情況下執行所有sudo任務。即使在家用環境中,我也不建議這樣做。在商業環境中,允許人們擁有無密碼的sudo許可權絕對是不允許的。

要將現有使用者新增到wheel群組,請使用帶有-G選項的usermod命令。您可能還想使用-a選項,以避免將使用者從屬於的其他群組中移除。以下示例將Maggie新增到wheel群組:

sudo usermod -a -G wheel maggie

您也可以在建立使用者帳戶時將其新增到wheel群組。以下示例為Frank建立一個新帳戶,並將其新增到wheel群組:

sudo useradd -G wheel frank

內容解密:

  1. usermod -a -G wheel maggie:將現有使用者Maggie新增到wheel群組,-a確保Maggie不會被從其他群組中移除。
  2. useradd -G wheel frank:在建立新使用者Frank的同時,將其直接新增到wheel群組,使其具有管理員許可權。
  3. sudo visudo:編輯sudo政策檔,定義哪些使用者或群組可以執行哪些命令。

對於Debian系列,包括Ubuntu,步驟相同,只是使用sudo群組代替了wheel群組。

在sudo政策檔中建立條目

將使用者新增到wheel群組或sudo群組適用於單一機器或使用相同管理群組的網路佈署。但如果您需要在包含紅帽和Ubuntu機器的混合網路中佈署sudo政策,或者不想逐一在每台機器上新增使用者到管理群組,那麼直接在sudo政策檔中建立條目就非常有用了。您可以為個別使用者建立條目,也可以建立使用者別名。

建立使用者別名

在CentOS或AlmaLinux虛擬機器上執行sudo visudo,可以看到一個被註解掉的使用者別名範例:

# User_Alias ADMINS = jsmith, mikem

您可以取消註解這行並新增自己的使用者名稱,或者新增一行新的使用者別名。要賦予使用者別名成員完整的sudo權力,可以新增類別似如下的行:

ADMINS ALL=(ALL) ALL

為單一使用者建立條目

也可以為單一使用者新增visudo條目,在特殊情況下可能需要這樣做。範例如下:

frank ALL=(ALL) ALL

但為了便於管理,最好使用使用者群組或使用者別名。

內容解密:

  1. User_Alias ADMINS = jsmith, mikem:定義一個名為ADMINS的使用者別名,包含jsmith和mikem兩個使用者。
  2. ADMINS ALL=(ALL) ALL:賦予ADMINS別名中的所有成員完整的sudo許可權。
  3. 編輯/etc/sudoers檔案時,必須使用visudo命令,以確保語法正確並避免錯誤。

設定具有特定許可權的使用者的sudo

IT安全哲學的一個基本原則是給予網路使用者足夠的許可權,以便他們能夠完成工作,但不能超過所需的許可權。因此,擁有完整sudo許可權的人數應該盡可能少。(如果啟用了root使用者帳戶,則知道root密碼的人數應該更少。)您還需要根據使用者的特定工作內容來委派許可權。備份管理員需要能夠執行備份任務,幫助台人員需要執行使用者管理任務,等等。透過sudo,您可以委派這些許可權,並禁止使用者執行不符合其工作說明的其他管理任務。

編輯sudoers檔案

開啟任何一個RHEL型別的虛擬機器的visudo,以便更好地理解這一點。 CentOS 7、AlmaLinux 8和AlmaLinux 9都適用於此。請啟動其中一個虛擬機器並輸入:

sudo visudo

與Ubuntu不同,RHEL型別的發行版具有完整註解和檔案齊全的sudoers檔案。您已經看到了建立ADMIN使用者別名的那一行,您可以為其他目的建立其他使用者別名。例如,您可以為備份管理員建立BACKUPADMINS使用者別名,為網頁伺服器管理員建立WEBADMINS使用者別名,或其他您需要的別名。因此,您可以新增一行類別似於以下內容:

User_Alias SOFTWAREADMINS = vicky, cleopatra

內容解密:

此行定義了一個名為SOFTWAREADMINS的使用者別名,包含使用者vickycleopatra。這意味著您可以將特定的管理許可權分配給這兩個使用者。

分配命令別名

如果您檢視稍後提到的範例使用者別名,您將看到範例命令別名的列表。其中一個範例恰好是SOFTWARE,其中包含管理員安裝或移除軟體或更新系統所需的命令。它被註解掉了,就像所有其他範例命令別名一樣,因此您需要在使用之前刪除行首的井號符號:

Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum

現在,只需將SOFTWARE命令別名分配給SOFTWAREADMINS使用者別名即可:

SOFTWAREADMINS ALL=(ALL) SOFTWARE

內容解密:

此組態允許vickycleopatra以root許可權在所有伺服器上執行rpmup2dateyum命令。

SERVICES命令別名的問題與解決方案

其中一個預定義的命令別名是SERVICES:

Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig, /usr/bin/systemctl start, /usr/bin/systemctl stop

這個SERVICES別名的問題在於它列出了不同的子命令。如果一個命令單獨列出,則被分配的使用者可以使用該命令以及任何子命令、選項或引數。但是,當命令與子命令、選項或引數一起列出時,被分配的使用者只能執行該特定的命令。因此,在目前的組態中,systemctl命令無法正常運作。

解決方案:

新增萬用字元到每個systemctl子命令:

Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig, /usr/bin/systemctl start *, /usr/bin/systemctl stop *

內容解密:

此變更允許Charlie和Lionel執行列出的任何systemctl功能,用於任何服務,並且避免了過度授權的風險。

靈活的許可權分配

您可以將許可權分配給Linux群組或個別使用者,也可以將個別命令分配給使用者別名、Linux群組或個別使用者。範例如下:

katelyn ALL=(ALL) STORAGE
gunther ALL=(ALL) /sbin/fdisk -l
%backup_admins ALL=(ALL) BACKUP

內容解密:

Katelyn現在可以執行STORAGE命令別名中的所有命令,而Gunther只能使用fdisk來檢視磁碟分割表。backup_admins Linux群組的成員可以執行BACKUP命令別名中的命令。

進階sudo使用技巧與安全注意事項

在前面的章節中,我們已經瞭解瞭如何設定基本的sudo組態。然而,sudo本身雖然是一個安全工具,但某些使用方式卻可能使系統變得更加不安全。現在,讓我們來看看如何避免這些問題。

sudo計時器

預設情況下,sudo計時器設定為五分鐘。這意味著一旦使用者執行了一個sudo命令並輸入密碼,在接下來的五分鐘內,使用者可以執行其他sudo命令而無需再次輸入密碼。雖然這很方便,但如果使用者離開工作站而沒有關閉終端,這也可能帶來安全風險。

如果五分鐘的計時器尚未過期,其他人就可以利用這個機會執行一些需要root許可權的操作。如果你的安全需求需要,你可以透過在sudoers檔案的Defaults部分新增一行組態來停用這個計時器。這樣,使用者每次執行sudo命令時都需要輸入密碼。你可以為所有使用者設定這個全域性組態,也可以只針對特定的使用者。

停用sudo計時器的組態方法

  1. 開啟visudo編輯器:
sudo visudo
  1. 在Defaults部分新增以下組態:
Defaults timestamp_timeout=0

這將停用sudo計時器,要求使用者每次執行sudo命令時都輸入密碼。

遠端登入的安全考量

假設你坐在自己的隔間裡,遠端登入到一台Linux伺服器,而這台伺服器仍然啟用了五分鐘的計時器。如果你需要暫時離開,最好先登出伺服器。如果無法做到這一點,你可以透過執行以下命令來重置sudo計時器:

sudo -k

這個命令會立即使sudo計時器過期,下次執行sudo命令時需要重新輸入密碼。

使用sudo的最佳實踐

  • 限制root許可權的使用:只有絕對需要使用root許可權的使用者才應該被授予相關許可權。
  • 使用sudo執行管理任務:盡可能使用sudo來執行管理任務,而不是直接以root使用者身份登入。
  • 定期檢查sudo組態:定期檢查和更新sudo組態,以確保它符合當前組織的安全政策。

Hands-on Lab:體驗sudo的進階使用

在本實驗中,你將進一步體驗sudo的進階使用技巧。

  1. 登入到你的AlmaLinux 9虛擬機器。
  2. 使用visudo編輯sudoers檔案,停用sudo計時器。
  3. 驗證組態是否生效。

程式碼範例:驗證sudo計時器組態

# 編輯sudoers檔案
sudo visudo

# 新增以下組態以停用計時器
Defaults timestamp_timeout=0

# 儲存並離開visudo

# 測試sudo命令是否需要每次輸入密碼
sudo ls
# 應該提示輸入密碼

sudo ls
# 應該再次提示輸入密碼,因為計時器已被停用

內容解密:

  • Defaults timestamp_timeout=0:這行組態用於停用sudo計時器,強制使用者每次執行sudo命令時都輸入密碼。
  • sudo -k:這個命令用於手動使sudo計時器過期,確保下次執行sudo命令時需要重新輸入密碼。