在 Linux 環境下,妥善管理使用者帳戶和許可權設定是確保系統安全的重要根本。本文將探討如何使用 useraddadduser 等工具,搭配 /etc/login.defs/etc/default/useradd 等設定檔,有效地控管使用者帳戶的建立、許可權賦予,以及密碼和帳戶過期策略。同時,我們也會探討密碼管理的演變,從傳統密碼的限制到現代密碼片語的優勢,並示範如何在 Linux 系統上建立加密家目錄,進一步提升資料安全性。此外,我們將詳細介紹如何使用 pam_pwquality 模組設定密碼複雜度,包含最小長度、字元類別信用和特定字元要求,並結合 PAM 組態設定密碼重試次數,有效防止暴力破解攻擊。最後,我們將說明如何設定和強制執行密碼及帳戶過期策略,提升整體系統的安全性。

管理Linux使用者帳戶與許可權設定

在Linux系統中,正確設定使用者帳戶與許可權是確保系統安全性的重要步驟。本文將探討在不同Linux發行版中,如何透過組態useraddadduser工具來建立具有適當許可權的使用者帳戶。

理解login.defs檔案中的UMASKHOME_MODE

在Red Hat系列的Linux發行版(如RHEL 8、RHEL 9和AlmaLinux)中,/etc/login.defs檔案包含了預設的使用者建立設定。檢視該檔案時,你會發現以下設定:

UMASK 022
HOME_MODE 0700

儘管UMASK被設定為022,這意味著相對寬鬆的許可權,但由於HOME_MODE被設定為0700,新建立的使用者主目錄仍然具有嚴格的許可權控制,確保只有目錄所有者能夠存取。

程式碼解密:

  • UMASK 022:定義了新建立檔案和目錄的預設許可權掩碼。在此設定下,新建目錄的許可權為755777 - 022 = 755)。
  • HOME_MODE 0700:明確指定了新建立使用者主目錄的許可權模式,確保只有使用者本人能夠讀取、寫入和進入該目錄。

在Debian/Ubuntu上使用useradd

Debian和Ubuntu預設並未為useradd組態適當的預設值。若直接使用sudo useradd frank,將導致Frank沒有主目錄且被分配錯誤的預設shell。

正確建立使用者帳戶的命令如下:

sudo useradd -m -d /home/frank -s /bin/bash frank

內容解密:

  • -m:建立使用者主目錄。
  • -d /home/frank:指定使用者主目錄的路徑。
  • -s /bin/bash:指定Frank的預設shell為/bin/bash

在Debian和Ubuntu 20.04上,這樣建立的主目錄許可權為755,允許所有人讀取和進入該目錄。為加強安全性,可以手動更改主目錄的許可權:

cd /home
sudo chmod 700 *

圖表翻譯:

此圖示呈現了修改前後的主目錄許可權變化。 圖表翻譯: 該圖表說明瞭透過執行 chmod 700 * 命令,將 /home 目錄下的所有子目錄許可權從 755 修改為 700 的過程,從而提升了安全性。

修改預設許可權設定

為確保新建立的使用者主目錄具有適當的許可權,需要編輯/etc/login.defs檔案,將UMASK更改為077

UMASK 077

在Ubuntu 22.04中,預設的HOME_MODE設定已經變更為0750,進一步限制了對使用者主目錄的存取。

使用adduser

在Debian和Ubuntu上,adduser提供了一種互動式建立使用者帳戶的方式。預設情況下,它在Ubuntu 20.04上建立具有755許可權的使用者主目錄,而在Ubuntu 22.04上則建立具有750許可權的目錄。

可以透過編輯/etc/adduser.conf檔案中的DIR_MODE變數來更改預設許可權設定。

程式碼範例與解說

若要在建立使用者帳戶時自動加密主目錄,首先需要安裝ecryptfs-utils套件:

sudo apt install ecryptfs-utils
sudo adduser --encrypt-home cleopatra

內容解密:

  • sudo apt install ecryptfs-utils:安裝加密工具。
  • sudo adduser --encrypt-home cleopatra:建立Cleopatra帳戶並加密其主目錄。

強化密碼安全:從傳統密碼到密碼片語的轉變

在資訊安全的領域中,密碼管理一直是個備受爭議的話題。傳統的密碼安全準則要求密碼必須達到一定的長度,並且包含大小寫字母、數字和特殊字元的組合,同時避免使用字典中的單詞或與使用者個人資料相關的資訊。然而,這些準則的有效性卻受到越來越多的質疑。

密碼管理的演變

前美國國家標準與技術研究所(NIST)工程師比爾·伯爾(Bill Burr)曾經是這些傳統密碼準則的制定者之一。然而,他現在卻公開表示遺憾,認為這些準則並不完全有效。伯爾建議使用長度足夠且容易記住的密碼片語(passphrase),並且只有在密碼被洩露時才需要更換。NIST現在也已經更新了他們的密碼實施準則,以符合伯爾的建議。

傳統密碼準則的侷限性

許多組織仍然堅持使用複雜且定期更換的密碼。然而,如果能夠說服他們採用更現代化的密碼管理策略,使用密碼片語將會是一個更好的選擇。密碼片語比傳統密碼更難被破解,同時也更容易被使用者記住。

實踐:在Linux系統上建立加密家目錄

在建立使用者帳戶時,可以選擇為其家目錄進行加密。下面是在Ubuntu 22.04虛擬機器上使用adduser工具建立具有加密家目錄的使用者帳戶的操作步驟:

  1. 安裝ecryptfs-utils套件

    sudo apt install ecryptfs-utils
    
  2. 建立具有加密家目錄的使用者帳戶

    sudo adduser --encrypt-home cleopatra
    
  3. 檢視結果

    ls -l /home
    
  4. 以新使用者身份登入並執行ecryptfs-unwrap-passphrase命令

    su - cleopatra
    ecryptfs-unwrap-passphrase
    exit
    

在建立使用者帳戶的過程中,系統會提示輸入新的UNIX密碼,並詢問是否要設定加密。務必記錄下掛載密碼短語(mount passphrase),並將其存放在安全的位置。

強化密碼安全:使用pwquality模組

為了強化密碼安全,Linux系統可以使用PAM(Pluggable Authentication Module)的pwquality模組。pwquality模組預設安裝在Red Hat 7或更新的系統,以及SUSE和OpenSUSE系統上。

組態pwquality

可以透過編輯/etc/pam.d/目錄下的PAM組態檔案來組態pwquality。例如,使用grep命令來檢查相關組態:

grep pwquality /etc/pam.d/*

程式碼解析:設定重試次數

在PAM組態檔案中,可以設定使用者輸入密碼的重試次數。例如:

retry=3

這表示使用者在登入系統時只有三次機會輸入正確的密碼。

內容解密:

此設定可以有效防止暴力破解攻擊。透過限制重試次數,系統可以在一定程度上保護使用者帳戶的安全。此外,系統管理員還可以根據實際需求調整重試次數,以平衡安全性和便利性。

密碼複雜度設定:使用 pam_pwquality 模組

在 Linux 系統中,設定密碼複雜度是一項重要的安全措施。本文將介紹如何使用 pam_pwquality 模組來設定密碼複雜度。

安裝 pam_pwquality 模組

在 Debian 和 Ubuntu 系統中,需要手動安裝 libpam-pwquality 套件:

sudo apt install libpam-pwquality

在 CentOS 和 AlmaLinux 中,pam_pwquality 模組已經預設安裝。

設定密碼複雜度

編輯 /etc/security/pwquality.conf 檔案以設定密碼複雜度。該檔案中的所有設定專案都預設被註解掉,因此需要手動取消註解並設定相應的值。

最小密碼長度:minlen

minlen 引數控制密碼的最小長度。預設情況下,該引數使用信用系統,即每種不同型別的字元都可以減少一個字元的最小長度要求。

例如,將 minlen 設定為 19:

minlen = 19

嘗試為使用者 Katelyn 設定密碼 turkeylips

[donnie@localhost ~]$ sudo passwd katelyn
Changing password for user katelyn.
New password:
BAD PASSWORD: The password is shorter than 18 characters
Retype new password:
[donnie@localhost ~]$

由於 turkeylips 中包含小寫字母,因此只需要 18 個字元。如果設定密碼為 TurkeyLips,則只需要 17 個字元,因為它包含大寫和小寫字母。

字元類別信用:lcredit

可以設定不同字元類別的信用值。例如,將小寫字母的信用值設為 0:

lcredit = 0

這樣,密碼 turkeylips 就需要至少 19 個字元。

要求特定字元類別:minclass

與其使用負信用值來要求特定字元類別,不如使用 minclass 引數。例如:

minclass = 3

這要求密碼中至少包含三種不同類別的字元。

實驗室練習

  1. 在 Ubuntu 上安裝 libpam-pwquality 套件(CentOS 和 AlmaLinux 可省略此步驟)。
  2. 編輯 /etc/security/pwquality.conf 檔案,將 minlen 設定為 19。
  3. 為使用者 Goldie 設定密碼 turkeylipsTurkeyLipsTurkey93Lips,觀察警告訊息的變化。
  4. pwquality.conf 檔案中註解掉 minlen,並取消註解 minclassmaxclassrepeat。將 maxclassrepeat 的值設為 5。

重點提示

  • 使用 sudo 許可權設定其他使用者的密碼時,即使密碼不符合複雜度標準,系統也會允許,但會發出警告。
  • 普通使用者在更改自己的密碼時,如果密碼不符合複雜度標準,系統將不允許。

程式碼解析:

以下是一個範例程式碼,用於檢查密碼是否符合複雜度標準:

import re

def check_password_complexity(password):
    # 定義密碼複雜度標準
    min_length = 19
    min_classes = 3

    # 檢查密碼長度
    if len(password) < min_length:
        return False

    # 檢查密碼中包含的字元類別
    classes = 0
    if re.search(r"[a-z]", password):
        classes += 1
    if re.search(r"[A-Z]", password):
        classes += 1
    if re.search(r"\d", password):
        classes += 1
    if re.search(r"[!@#$%^&*()_+=-{};:'<>,./?]", password):
        classes += 1

    # 檢查是否符合字元類別要求
    if classes < min_classes:
        return False

    return True

# 測試密碼
passwords = ["turkeylips", "TurkeyLips", "Turkey93Lips"]
for password in passwords:
    if check_password_complexity(password):
        print(f"{password} 符合密碼複雜度標準")
    else:
        print(f"{password} 不符合密碼複雜度標準")

內容解密:

此 Python 程式碼用於檢查密碼是否符合複雜度標準。它定義了兩個標準:最小長度和最小字元類別數。程式碼首先檢查密碼長度是否達到最小要求,然後檢查密碼中包含的字元類別數是否達到最小要求。最後,它測試了三個不同的密碼,並輸出是否符合密碼複雜度標準的結果。

此程式碼示範瞭如何使用正規表示式來檢查密碼中包含的不同字元類別。它還示範瞭如何定義和檢查密碼複雜度標準。

圖表說明:

圖表翻譯:

此流程圖描述了檢查密碼複雜度的過程。首先,檢查密碼長度是否達到最小要求。如果達到,則繼續檢查密碼中包含的字元類別數是否達到最小要求。如果兩個條件都滿足,則密碼符合複雜度標準;否則,不符合。

設定與強制密碼及帳戶過期策略

在管理Linux系統時,設定密碼及帳戶過期策略是確保系統安全性的重要步驟。本篇文章將探討如何在CentOS 7及AlmaLinux 9等Red Hat型系統上設定密碼及帳戶過期。

瞭解密碼過期與帳戶過期的區別

密碼過期與帳戶過期是兩個不同的概念。當密碼過期時,使用者可以自行更改密碼以繼續存取系統。然而,當帳戶過期時,只有具備管理員許可權的使用者才能重新啟用該帳戶。

檢視目前的過期設定

使用chage -l命令可以檢視目前使用者的過期設定,無需sudo許可權:

donnie@packt:~$ chage -l donnie
Last password change : Oct 03, 2017
Password expires : never
Password inactive : never
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7

內容解密:

  • Last password change:上次密碼更改日期。
  • Password expires:密碼過期日期。
  • Password inactive:密碼失效後,帳戶被鎖定前的天數。
  • Account expires:帳戶過期日期。
  • Minimum number of days between password change:兩次密碼更改之間的最短天數。
  • Maximum number of days between password change:兩次密碼更改之間的最長天數。
  • Number of days of warning before password expires:密碼過期前的警告天數。

修改預設的過期設定

預設的過期設定儲存在/etc/login.defs檔案中:

PASS_MAX_DAYS 99999
PASS_MIN_DAYS 0
PASS_WARN_AGE 7

您可以編輯這些值以符合組織的需求。例如,將PASS_MAX_DAYS設定為30,將使所有新使用者的密碼在30天后過期。

設定Red Hat型系統的useradd預設值

在Red Hat型系統中,/etc/default/useradd檔案包含了useradd命令的預設設定:

# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

圖表翻譯:

此圖示說明瞭useradd命令的預設引陣列態。

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Linux使用者帳戶與許可權管理

package "安全架構" {
    package "網路安全" {
        component [防火牆] as firewall
        component [WAF] as waf
        component [DDoS 防護] as ddos
    }

    package "身份認證" {
        component [OAuth 2.0] as oauth
        component [JWT Token] as jwt
        component [MFA] as mfa
    }

    package "資料安全" {
        component [加密傳輸 TLS] as tls
        component [資料加密] as encrypt
        component [金鑰管理] as kms
    }

    package "監控審計" {
        component [日誌收集] as log
        component [威脅偵測] as threat
        component [合規審計] as audit
    }
}

firewall --> waf : 過濾流量
waf --> oauth : 驗證身份
oauth --> jwt : 簽發憑證
jwt --> tls : 加密傳輸
tls --> encrypt : 資料保護
log --> threat : 異常分析
threat --> audit : 報告生成

@enduml

圖表翻譯: 上述Plantuml圖表呈現了useradd命令的預設組態引數及其對應的值,包括群組、家目錄、密碼失效後的處理、帳戶過期日期、預設Shell、骨架目錄以及郵件池的建立。

您可以手動編輯該檔案或使用useradd -D命令來修改預設值。例如,設定預設的帳戶過期日期為2025年12月31日,可以使用以下命令:

sudo useradd -D -e 2025-12-31

檢視新的組態:

[donnie@localhost ~]$ sudo useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=2025-12-31
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
[donnie@localhost ~]$

這樣,所有新建立的使用者帳戶都將具有相同的過期日期。