返回文章列表

Unix 系統檔案許可權安全強化

本文探討 Unix 系統檔案許可權的安全性強化方法,涵蓋全域可寫入檔案、無主檔案、SUID/SGID 執行檔等導向的風險描述、審核方法及修復措施,並提供相關指令碼以自動化檢查和修正使用者主目錄的許可權,確保系統安全性。

資安 系統管理

Unix 系統的安全性與檔案許可權管理息息相關,不當的許可權設定可能導致系統漏洞。本文針對常見的檔案許可權風險,如全域可寫入檔案、無主檔案以及 SUID/SGID 執行檔,提供實用的審核方法和修復建議,並輔以 shell 指令碼協助管理員自動化檢查和修正使用者主目錄許可權設定,進一步強化系統安全性,降低潛在風險。

加強 Unix 系統檔案許可權管理與安全性審核

在 Unix 系統中,檔案許可權的正確設定對於系統安全性至關重要。本篇文章將探討如何確保系統檔案的安全性,特別是在處理可寫入檔案、無主檔案、SUID 執行檔等方面提供詳細的指導與建議。

6.1.10 確保系統中不存在全域可寫入檔案

風險描述

全域可寫入檔案由於其對所有使用者開放寫入許可權,極易成為安全漏洞的來源。惡意使用者可以輕易修改這些檔案,從而對系統完整性造成威脅。

審核方法

執行以下指令以檢查系統中是否存在全域可寫入檔案:

df --local -P | awk '{if (NR!=1) print $6}' | xargs -I '{}' find '{}' -xdev -type f -perm -0002

此指令僅搜尋本地檔案系統,若需檢查網路掛載的分割槽,請手動針對各分割槽執行:

find <partition> -xdev -type f -perm -0002

修復措施

移除對「其他」類別的寫入許可權(使用 chmod o-w <filename>)是建議的做法,但務必參考相關供應商檔案以避免破壞應用程式對特設定檔案的依賴。

6.1.11 確保系統中不存在無主檔案或目錄

風險描述

當管理員刪除使用者帳號時,若未同時移除該使用者擁有的檔案,可能導致新使用者繼承這些檔案的擁有權,從而獲得非預期的系統存取許可權。

審核方法

執行以下指令以檢查系統中是否存在無主檔案或目錄:

df --local -P | awk '{if (NR!=1) print $6}' | xargs -I '{}' find '{}' -xdev -nouser

同樣地,此指令僅檢查本地檔案系統;若需檢查網路掛載分割槽,請手動執行:

find <partition> -xdev -nouser

修復措施

定位並重新設定無主檔案或目錄的擁有權,將其分配給系統中適當的活躍使用者。

6.1.12 確保系統中不存在無群組檔案或目錄

風險描述

刪除使用者或群組時,若未移除相關檔案,可能導致新使用者或群組繼承原有檔案的存取許可權。

審核方法

執行以下指令檢查無群組檔案或目錄:

df --local -P | awk '{if (NR!=1) print $6}' | xargs -I '{}' find '{}' -xdev -nogroup

對於網路掛載分割槽,請手動檢查:

find <partition> -xdev -nogroup

修復措施

重新設定無群組檔案或目錄的群組歸屬,將其分配給適當的活躍群組。

6.1.13 稽核 SUID 執行檔

風險描述

SUID 執行檔允許使用者以檔案擁有者的許可權執行程式,這在某些情況下可能被惡意利用。

審核方法

執行以下指令列出 SUID 檔案:

df --local -P | awk '{if (NR!=1) print $6}' | xargs -I '{}' find '{}' -xdev -type f -perm -4000

對於網路掛載分割槽,請手動檢查:

find <partition> -xdev -type f -perm -4000

修復措施

審查稽核結果中列出的 SUID 執行檔,確認其合法性與完整性,避免引入惡意程式。

6.1.14 稽核 SGID 可執行檔(手動)

設定檔適用性

  • 第一級 - 伺服器
  • 第一級 - 工作站

描述

檔案擁有者可以設定檔案許可權,使其以擁有者或群組的許可權執行,即使執行程式的使用者並非擁有者或群組成員。SGID 程式最常見的原因是允許使用者執行需要 root 許可權的功能(例如更改密碼)。

理由

SGID 程式有其合理存在的理由,但識別和檢視這些程式以確保其合法性非常重要。檢視稽核部分傳回的檔案,並檢查系統二進位檔案的 md5 校驗和是否與套件中的不同。這是二進位檔案可能被替換的跡象。

稽核

執行以下命令以列出 SGID 檔案:

# df --local -P | awk '{if (NR!=1) print $6}' | xargs -I '{}' find '{}' -xdev -type f -perm -2000

上述命令僅搜尋本地檔案系統,網路掛載的分割槽上仍可能存在受損專案。此外,df 的 –local 選項並非通用於所有版本,可以省略以搜尋系統上的所有檔案系統,包括網路掛載的檔案系統,或手動為每個分割槽執行以下命令:

# find <partition> -xdev -type f -perm -2000

內容解密:

  1. df --local -P:列出本地檔案系統的使用情況。
  2. awk '{if (NR!=1) print $6}':從 df 的輸出中提取掛載點,排除標題行。
  3. xargs -I '{}' find '{}' -xdev -type f -perm -2000:在每個掛載點上搜尋具有 SGID 許可權的檔案。
    • -xdev 防止 find 跨越不同的檔案系統。
    • -type f 只搜尋檔案。
    • -perm -2000 搜尋具有 SGID 許可權的檔案。

修復

確保系統中未引入惡意的 SGID 程式。檢視稽核部分傳回的檔案,並確認這些二進位檔案的完整性。

CIS 控制項

版本 7 5.1 建立安全組態 維護所有授權作業系統和軟體的檔案化的標準安全組態標準。

6.2 使用者和群組設定

本文提供有關保護使用者和群組各方面的指導。

注意事項

本文中的建議檢查本地使用者和群組。來自其他來源(例如 LDAP)的任何使用者或群組將不會被稽核。在網域環境中,應對網域使用者和群組執行類別似的檢查。

6.2.1 確保 /etc/passwd 中的帳戶使用陰影密碼(自動化)

設定檔適用性

  • 第一級 - 伺服器
  • 第一級 - 工作站

描述

本地帳戶可以使用陰影密碼。陰影密碼儲存在陰影密碼檔案 /etc/shadow 中,使用加鹽的一次性雜湊加密。具有陰影密碼的帳戶在 /etc/passwd 的第二欄位中有一個 x。

理由

/etc/passwd 檔案還包含使用者 ID 和群組 ID 等資訊,這些資訊被許多系統程式使用。因此,/etc/passwd 檔案必須保持全域可讀。儘管密碼使用隨機產生的單向雜湊函式編碼,但攻擊者如果獲得 /etc/passwd 檔案的存取權,仍然可以破解系統。使用陰影密碼可以將密碼從 /etc/passwd 檔案移到 /etc/shadow,從而減輕這種風險。/etc/shadow 檔案被設定為只有 root 可以讀取和寫入。

稽核

執行以下命令並驗證沒有輸出傳回:

# awk -F: '($2 != "x" ) { print $1 " is not set to shadowed passwords "}' /etc/passwd

內容解密:

  1. awk -F::使用冒號作為欄位分隔符號。
  2. ($2 != "x" ):檢查第二欄位是否不等於 “x”,即密碼未使用陰影密碼。
  3. { print $1 " is not set to shadowed passwords "}:列印未使用陰影密碼的使用者名稱。

修復

執行以下命令將帳戶設定為使用陰影密碼:

# sed -e 's/^\([a-zA-Z0-9_]*\):[^:]*:/\1:x:/' -i /etc/passwd

調查以確定帳戶是否已登入及其用途,以決定是否需要強制登出。

CIS 控制項

版本 7 4.4 使用唯一密碼 在不支援多因素身份驗證的情況下(例如本地管理員、root 或服務帳戶),帳戶將使用該系統唯一的密碼。

6.2.2 確保密碼欄位不為空(自動化)

設定檔適用性

  • 第一級 - 伺服器
  • 第一級 - 工作站

描述

具有空密碼欄位的帳戶意味著任何人都可以不提供密碼而以該使用者身份登入。

理由

所有帳戶必須具有密碼或被鎖定,以防止未經授權的使用者使用該帳戶。

稽核

執行以下命令並驗證沒有輸出傳回:

# awk -F: '($2 == "" ) { print $1 " does not have a password "}' /etc/shadow

內容解密:

  1. awk -F::使用冒號作為欄位分隔符號。
  2. ($2 == "" ):檢查第二欄位是否為空,即密碼欄位為空。
  3. { print $1 " does not have a password "}:列印沒有密碼的使用者名稱。

修復

如果 /etc/shadow 檔案中的任何帳戶沒有密碼,請執行以下命令鎖定帳戶,直到可以確定它沒有密碼的原因:

# passwd -l <username>

同時,檢查帳戶是否已登入並調查其用途,以決定是否需要強制登出。

6.2.3 確保所有使用者的主目錄存在(自動化)

設定檔適用性

  • 第一級 - 伺服器
  • 第一級 - 工作站

描述

使用者可以在 /etc/passwd 中定義而不具有主目錄或主目錄不存在。

理由

如果使用者的主目錄不存在或未分配,使用者將被放置在 “/” 中,並且無法寫入任何檔案或設定本地環境變數。

稽核

執行以下指令碼並驗證沒有結果傳回:

#!/bin/bash
awk -F: '($1!~/(halt|sync|shutdown|nfsnobody)/ && $7!~/^(\/usr)?\/sbin\/nologin(\/)?$/ && $7!~/(\/usr)?\/bin\/false(\/)?$/) { print $1 " " $6 }' /etc/passwd | while read -r user dir; do if [ ! -d "$dir" ]; then echo "User: \"$user\" home directory: \"$dir\" does not exist." fi done

內容解密:

  1. awk -F::處理 /etc/passwd 檔案,使用冒號作為分隔符號。
  2. ($1!~/(halt|sync|shutdown|nfsnobody)/ && $7!~/.../):排除特定系統使用者和未授權登入的使用者。
  3. { print $1 " " $6 }:列印使用者名稱和主目錄路徑。
  4. while read -r user dir; do ... done:迴圈讀取使用者名稱和主目錄,如果主目錄不存在,則輸出警告訊息。

修復

如果任何使用者的主目錄不存在,請建立它們,並確保相應的使用者擁有該目錄。沒有分配主目錄的使用者應被刪除或適當地分配主目錄。

#!/bin/bash
awk -F: '($1!~/(halt|sync|shutdown|nfsnobody)/ && $7!~/^(\/usr)?\/sbin\/nologin(\/)?$/ && $7!~/(\/usr)?\/bin\/false(\/)?$/) { print $1 " " $6 }' /etc/passwd | while read -r user dir; do if [ ! -d "$dir" ]; then mkdir "$dir" chmod g-w,o-wrx "$dir" chown "$user" "$dir" fi done

內容解密:

  1. mkdir "$dir":建立缺失的主目錄。
  2. chmod g-w,o-wrx "$dir":設定適當的許可權,避免群組和其他使用者寫入或執行。
  3. chown "$user" "$dir":將主目錄的所有權變更為相應的使用者。

強化使用者主目錄的安全性

在 Linux 系統中,確保使用者主目錄的安全性至關重要。本篇文章將探討如何透過檢查和修正使用者主目錄的所有權和許可權,來提升系統的安全性。

6.2.4 確保使用者擁有自己的主目錄

描述

使用者主目錄是用於儲存個人檔案和設定環境變數的空間。為了確保使用者對其主目錄中的檔案負責,使用者必須是該目錄的所有者。

風險

如果使用者不是其主目錄的所有者,可能會導致安全問題,例如惡意使用者竊取或修改其他使用者的資料。

檢查方法

執行以下指令碼以驗證所有使用者的主目錄所有權是否正確:

#!/bin/bash
awk -F: '($1!~/(halt|sync|shutdown)/ && $7!~/^(\/usr)?\/sbin\/nologin(\/)?$/ && $7!~/(\/usr)?\/bin\/false(\/)?$/) { print $1 " " $6 }' /etc/passwd | while read -r user dir; do
  if [ ! -d "$dir" ]; then
    echo "User: \"$user\" home directory: \"$dir\" does not exist."
  else
    owner=$(stat -L -c "%U" "$dir")
    if [ "$owner" != "$user" ]; then
      echo "User: \"$user\" home directory: \"$dir\" is owned by \"$owner\""
    fi
  fi
done

修正方法

對於所有權不正確的主目錄,可以使用以下指令碼進行修正:

#!/bin/bash
awk -F: '($1!~/(halt|sync|shutdown)/ && $7!~/^(\/usr)?\/sbin\/nologin(\/)?$/ && $7!~/(\/usr)?\/bin\/false(\/)?$/) { print $1 " " $6 }' /etc/passwd | while read -r user dir; do
  if [ ! -d "$dir" ]; then
    echo "User: \"$user\" home directory: \"$dir\" does not exist, creating home directory"
    mkdir "$dir"
    chmod g-w,o-rwx "$dir"
    chown "$user" "$dir"
  else
    owner=$(stat -L -c "%U" "$dir")
    if [ "$owner" != "$user" ]; then
      chmod g-w,o-rwx "$dir"
      chown "$user" "$dir"
    fi
  fi
done

詳細解說:

此指令碼首先檢查 /etc/passwd 中的每個使用者,篩選出具有互動式 shell 的使用者。對於每個使用者,它檢查其主目錄是否存在,如果不存在,則建立該目錄並設定正確的所有權和許可權。如果主目錄存在但所有權不正確,則修正所有權並調整許可權。

CIS 控制措施

  • 14.6 透過存取控制清單保護資訊:保護系統上儲存的所有資訊,使用檔案系統、網路共用、宣告、應用程式或資料函式庫特定的存取控制清單。這些控制措施將根據責任需要存取資訊的原則,強制規定只有授權人員才能存取資訊。

6.2.5 確保使用者主目錄的許可權為 750 或更具限制性

描述

雖然系統管理員可以為使用者的主目錄設定安全的許可權,但使用者可以輕易地覆寫這些設定。

風險

群組或全域可寫的使用者主目錄可能會使惡意使用者竊取或修改其他使用者的資料,或獲得其他使用者的系統許可權。

檢查方法

執行以下指令碼以驗證所有使用者的主目錄許可權:

#!/bin/bash
awk -F: '($1!~/(halt|sync|shutdown)/ && $7!~/^(\/usr)?\/sbin\/nologin(\/)?$/ && $7!~/(\/usr)?\/bin\/false(\/)?$/) {print $1 " " $6}' /etc/passwd | while read -r user dir; do
  if [ ! -d "$dir" ]; then
    echo "User: \"$user\" home directory: \"$dir\" doesn't exist"
  else
    dirperm=$(stat -L -c "%A" "$dir")
    if [ "$(echo "$dirperm" | cut -c6)" != "-" ] || [ "$(echo "$dirperm" | cut -c8)" != "-" ] || [ "$(echo "$dirperm" | cut -c9)" != "-" ] || [ "$(echo "$dirperm" | cut -c10)" != "-" ]; then
      echo "User: \"$user\" home directory: \"$dir\" has permissions: \"$(stat -L -c "%a" "$dir")\""
    fi
  fi
done

修正方法

可以使用以下指令碼移除過於寬鬆的許可權:

#!/bin/bash
awk -F: '($1!~/(halt|sync|shutdown)/ && $7!~/^(\/usr)?\/sbin\/nologin(\/)?$/ && $7!~/(\/usr)?\/bin\/false(\/)?$/) {print $6}' /etc/passwd | while read -r dir; do
  if [ -d "$dir" ]; then
    dirperm=$(stat -L -c "%A" "$dir")
    if [ "$(echo "$dirperm" | cut -c6)" != "-" ] || [ "$(echo "$dirperm" | cut -c8)" != "-" ] || [ "$(echo "$dirperm" | cut -c9)" != "-" ] || [ "$(echo "$dirperm" | cut -c10)" != "-" ]; then
      chmod o-w,g-rwx "$dir"
    fi
  fi
done

詳細解說:

此指令碼檢查每個互動式使用者的主目錄許可權,如果發現群組或其他使用者具有不當的寫入或執行許可權,則調整許可權至 750 或更具限制性。

6.2.6 確保使用者的點檔案不是群組或全域可寫的

描述

雖然系統管理員可以為使用者的點檔案(dot files)設定安全的許可權,但使用者可以輕易地覆寫這些設定。

風險

群組或全域可寫的使用者設定檔案可能會使惡意使用者竊取或修改其他使用者的資料,或獲得其他使用者的系統許可權。

檢查方法

執行以下指令碼以驗證所有使用者的點檔案許可權:

#!/bin/bash
awk -F: '($1!~/(halt|sync|shutdown)/ && $7!~/^(\/usr)?\/sbin\/nologin(\/)?$/ && $7!~/(\/usr)?\/bin\/false(\/)?$/) { print $1 " " $6 }' /etc/passwd | while read -r user dir; do
  if [ -d "$dir" ]; then
    for file in "$dir"/.*; do
      if [ ! -h "$file" ] && [ -f "$file" ]; then
        fileperm=$(stat -L -c "%A" "$file")
        if [ "$(echo "$fileperm" | cut -c6)" != "-" ] || [ "$(echo "$fileperm" | cut -c9)" != "-" ]; then
          echo "User: \"$user\" file: \"$file\" has permissions: \"$fileperm\""
        fi
      fi
    done
  fi
done

修正方法

可以使用以下指令碼移除點檔案的過度許可權:

#!/bin/bash
awk -F: '($1!~/(halt|sync|shutdown)/ && $7!~/^(\/usr)?\/sbin\/nologin(\/)?$/ && $7!~/(\/usr)?\/bin\/false(\/)?$/) { print $1 " " $6 }' /etc/passwd | while read -r user dir; do
  if [ -d "$dir" ]; then
    for file in "$dir"/.*; do
      if [ ! -h "$file" ] && [ -f "$file" ]; then
        fileperm=$(stat -L -c "%A" "$file")
        if [ "$(echo "$fileperm" | cut -c6)" != "-" ] || [ "$(echo "$fileperm" | cut -c9)" != "-" ]; then
          chmod go-w "$file"
        fi
      fi
    done
  fi
done

詳細解說:

此指令碼檢查每個互動式使用者的點檔案許可權,如果發現群組或其他使用者具有不當的寫入許可權,則調整許可權,移除群組和其他使用者的寫入許可權。