description: “本文深入探討容器安全議題,涵蓋秘密資料的保護機制、環境變數的風險,並示範如何利用 Tracee 和 AppArmor 等工具強化容器安全,限制系統呼叫和檔案存取,提升整體防護能力。”
" 容器技術的興起,同時也帶來了新的安全挑戰。保護容器內的敏感資料,例如資料函式庫密碼、API 金鑰等,是確保應用程式安全的關鍵。環境變數雖然方便,卻也存在風險,因為它們可能被其他行程讀取,導致資料洩露。因此,我們需要更安全的機制來管理和保護這些秘密資料。
在 Linux 系統中,/proc 目錄包含了大量的行程資訊,其中也包含了環境變數。雖然可以透過環境變數將敏感資料傳遞給容器內的行程,但這種方式存在安全風險。惡意程式或未經授權的使用者可以透過存取 /proc 目錄讀取這些環境變數,進而取得敏感資料。因此,在容器環境中,需要更安全的做法來管理和保護秘密資料。
圖表翻譯:
此圖示說明瞭在容器中設定環境變數的兩種可能結果。啟動容器後,如果以安全的方式設定和管理環境變數,則應用程式可以安全地存取秘密資料。然而,如果不採取適當的安全措施,環境變數中的秘密資料就可能面臨洩露的風險。
#include <iostream>
#include <fstream>
#include <string>
int main() {
// 從環境變數讀取敏感資料
const char* secret_key = std::getenv("SECRET_KEY");
if (secret_key) {
std::string key(secret_key);
std::cout << "Secret key: " << key << std::endl;
// 將秘密資料寫入檔案
std::ofstream outfile("secret.txt");
if (outfile.is_open()) {
outfile << key << std::endl;
outfile.close();
std::cout << "Secret key written to secret.txt" << std::endl;
} else {
std::cerr << "Unable to open file" << std::endl;
}
} else {
std::cerr << "SECRET_KEY environment variable not set" << std::endl;
}
return 0;
}
內容解密:
這段 C++ 程式碼示範瞭如何從環境變數中讀取名為 SECRET_KEY 的敏感資料,並將其寫入名為 secret.txt 的檔案中。程式碼首先使用 std::getenv() 函式嘗試從環境變數中取得 SECRET_KEY 的值。如果環境變數存在,則將其值儲存到 key 字串變數中,並印出到終端機。接著,程式碼嘗試開啟名為 secret.txt 的檔案,如果檔案開啟成功,則將 key 的值寫入檔案,並關閉檔案。如果環境變數不存在或無法開啟檔案,則程式碼會印出錯誤訊息。
圖表翻譯:
此流程圖展示了 C++ 程式碼的執行流程。程式碼首先嘗試從環境變數中讀取 SECRET_KEY。如果 SECRET_KEY 存在,則將其值儲存到 key 變數,並印出到終端機。接著,程式碼嘗試開啟 secret.txt 檔案。如果檔案開啟成功,則將 key 值寫入檔案並關閉檔案;否則,印出錯誤訊息。如果 SECRET_KEY 不存在,程式碼也會印出錯誤訊息。最後,程式結束。
利用工具如 Tracee 和 AppArmor 可以有效提升容器安全性。Tracee 可以追蹤系統呼叫,幫助我們瞭解應用程式行為和潛在的安全性問題。AppArmor 則可以建立安全設定檔,限制應用程式對系統資源的存取,進一步降低安全風險。透過結合這些工具,可以建立更安全的容器環境。
使用Tracee建立系統呼叫檔案列表
使用Tracee可以輕鬆建立系統呼叫檔案列表,幫助您瞭解應用程式在執行時需要存取哪些檔案。以下是使用Tracee建立系統呼叫檔案列表的步驟:
步驟1:安裝Tracee
首先,您需要安裝Tracee。您可以使用以下命令安裝Tracee:
sudo apt-get install tracee
步驟2:啟動Tracee
啟動Tracee,並指定要追蹤的應用程式:
sudo tracee -p <pid>
將 <pid> 替換為應用程式的程式ID。
步驟3:生成系統呼叫檔案列表
啟動Tracee後,它將開始追蹤應用程式的系統呼叫。您可以使用以下命令生成系統呼叫檔案列表:
sudo tracee -l
這將生成一個包含所有系統呼叫的檔案列表。
步驟4:分析系統呼叫檔案列表
分析生成的系統呼叫檔案列表,以瞭解應用程式在執行時需要存取哪些檔案。您可以使用以下命令檢視檔案列表:
sudo tracee -l | grep openat
這將顯示所有與 openat 系統呼叫相關的檔案。
範例輸出
以下是使用Tracee生成的系統呼叫檔案列表範例輸出:
openat /lib/x86_64-linux-gnu/libdl.so.2
openat /lib/x86_64-linux-gnu/libpthread.so.0
openat /lib/x86_64-linux-gnu/libcrypt.so.1
openat /lib/x86_64-linux-gnu/libpcre.so.3
openat /usr/lib/x86_64-linux-gnu/libssl.so.1.1
openat /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1
openat /lib/x86_64-linux-gnu/libz.so.1
openat /lib/x86_64-linux-gnu/libc.so.6
openat /etc/localtime
openat /var/log/nginx/error.log
openat /usr/lib/ssl/openssl.cnf
openat /sys/devices/system/cpu/online
openat /etc/ld.so.cache
這個列表顯示了nginx應用程式在執行時需要存取的檔案。
使用AppArmor建立安全組態檔案
使用AppArmor可以建立安全組態檔案,以限制應用程式存取的檔案和資源。以下是使用AppArmor建立安全組態檔案的步驟:
步驟1:安裝AppArmor
首先,您需要安裝AppArmor。您可以使用以下命令安裝AppArmor:
sudo apt-get install apparmor
步驟2:建立安全組態檔案
建立一個新的安全組態檔案,並指定要限制的應用程式:
sudo aa-genprof <application_name>
將 <application_name> 替換為應用程式的名稱。
步驟3:組態安全組態檔案
組態安全組態檔案,以限制應用程式存取的檔案和資源。您可以使用以下命令組態安全組態檔案:
sudo aa-logprof
這將啟動一個互動式的組態工具,幫助您組態安全組態檔案。
步驟4:啟用安全組態檔案
啟用安全組態檔案,以限制應用程式存取的檔案和資源。您可以使用以下命令啟用安全組態檔案:
sudo aa-enforce <application_name>
將 <application_name> 替換為應用程式的名稱。
範例輸出
以下是使用AppArmor建立的安全組態檔案範例輸出:
#include <tunables/global>
/usr/sbin/nginx {
# 允許存取的檔案
/lib/x86_64-linux-gnu/libdl.so.2 r,
/lib/x86_64-linux-gnu/libpthread.so.0 r,
/lib/x86_64-linux-gnu/libcrypt.so.1 r,
/lib/x86_64-linux-gnu/libpcre.so.3 r,
/usr/lib/x86_64-linux-gnu/libssl.so.1.1 r,
/usr/lib/x86_64-linux-gnu/libcrypto.so.1.1 r,
/lib/x86_64-linux-gnu/libz.so.1 r,
/lib/x86_64-linux-gnu/libc.so.6 r,
/etc/localtime r,
/var/log/nginx/error.log w,
/usr/lib/ssl/openssl.cnf r,
/sys/devices/system/cpu/online r,
/etc/ld.so.cache r,
# 禁止存取的檔案
deny /etc/passwd r,
deny /etc/group r,
}
這個安全組態檔案限制了nginx應用程式存取的檔案和資源。
深入容器安全:保護敏感資料與強化防禦
保護容器化應用程式中的敏感資料至關重要。本文深入探討在容器環境中保護秘密資料的最佳實務,並示範如何利用 Tracee 和 AppArmor 等工具強化容器安全。
環境變數的風險與替代方案
雖然環境變數提供一種便捷的方式將設定資訊傳遞給容器內的應用程式,但直接以明文形式儲存敏感資料(如資料函式庫密碼、API 金鑰)存在嚴重風險。任何有權存取容器的使用者或程式都能輕易讀取這些環境變數,造成資料洩露。
因此,應避免使用環境變數儲存敏感資料。較安全的做法包括:
- 秘密管理工具: 使用專門的秘密管理工具,例如 HashiCorp Vault、AWS Secrets Manager 或 Kubernetes Secrets,將敏感資料儲存於安全的金鑰函式庫中,並透過安全機制讓容器化應用程式存取。
- 加密的環境變數: 將敏感資料加密後再儲存於環境變數中。容器化應用程式需使用對應的金鑰解密才能使用。此方法需要謹慎管理解密金鑰。
以 Tracee 建立系統呼叫檔案清單
Tracee 是一款功能強大的動態追蹤工具,能捕捉系統呼叫,協助分析應用程式行為並識別潛在安全風險。以下示範如何使用 Tracee 建立系統呼叫檔案清單:
sudo apt-get install tracee # 安裝 Tracee
sudo tracee -p <PID> # 追蹤特定程式,<PID> 為程式 ID
sudo tracee -f <filename> -e openat # 追蹤特設定檔案操作,例如 openat
內容解密:
sudo apt-get install tracee:安裝 Tracee 工具。sudo tracee -p <PID>:追蹤指定程式 ID (<PID>) 的系統呼叫。這能幫助我們瞭解應用程式執行期間與作業系統的互動。sudo tracee -f <filename> -e openat:這個指令更精確地追蹤特設定檔案的開啟操作。-f選項指定要監控的檔案,-e選項指定要追蹤的事件型別,這裡是openat系統呼叫,用於開啟檔案。
圖表翻譯:
此圖示說明使用 Tracee 追蹤系統呼叫的流程。首先,需要安裝 Tracee 工具。接著,可以選擇追蹤特定程式的系統呼叫,此時需提供程式的 PID。或者,可以選擇追蹤特設定檔案的操作,例如 openat 系統呼叫,此時需提供檔案名稱。Tracee 會根據指定的條件捕捉系統呼叫並輸出相關資訊,方便後續分析。
利用 AppArmor 限制應用程式存取
AppArmor 是一款 Linux 核心安全模組,能透過強制存取控制 (MAC) 限制應用程式存取系統資源,例如檔案、網路和能力。以下示範如何使用 AppArmor 建立安全設定檔:
sudo apt-get install apparmor # 安裝 AppArmor
sudo aa-genprof /usr/sbin/nginx # 為 nginx 建立 AppArmor 設定檔
# ...根據需求編輯設定檔...
sudo aa-enforce /usr/sbin/nginx # 啟用設定檔
內容解密:
sudo apt-get install apparmor:安裝 AppArmor。sudo aa-genprof /usr/sbin/nginx:為 nginx 產生一個預設的 AppArmor 設定檔。這個指令會進入互動模式,引導使用者設定 nginx 的存取許可權。sudo aa-enforce /usr/sbin/nginx:載入並啟用 nginx 的 AppArmor 設定檔,開始限制 nginx 的行為。
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title 強化容器安全:秘密資料防護與系統呼叫控制
package "Docker 架構" {
actor "開發者" as dev
package "Docker Engine" {
component [Docker Daemon] as daemon
component [Docker CLI] as cli
component [REST API] as api
}
package "容器運行時" {
component [containerd] as containerd
component [runc] as runc
}
package "儲存" {
database [Images] as images
database [Volumes] as volumes
database [Networks] as networks
}
cloud "Registry" as registry
}
dev --> cli : 命令操作
cli --> api : API 呼叫
api --> daemon : 處理請求
daemon --> containerd : 容器管理
containerd --> runc : 執行容器
daemon --> images : 映像檔管理
daemon --> registry : 拉取/推送
daemon --> volumes : 資料持久化
daemon --> networks : 網路配置
@enduml圖表翻譯:
此流程圖說明使用 AppArmor 保護應用程式的步驟。首先安裝 AppArmor,接著使用 aa-genprof 工具產生應用程式的設定檔。接下來,可以根據應用程式的需求編輯設定檔,例如限制其可讀取的檔案、可連線的網路埠等等。最後,使用 aa-enforce 指令啟用設定檔,讓 AppArmor 開始強制執行設定檔中定義的規則。
容器安全需要多層次的防護策略。除了避免使用環境變數儲存敏感資料外,善用系統呼叫追蹤工具 (如 Tracee) 和強制存取控制機制 (如 AppArmor) 能有效強化容器安全,降低潛在風險。透過持續監控和調整安全設定,才能確保容器化應用程式的安全性和穩定性。