CKS認證 | Day3 K8s容器運行環境安全加固

一、最小特權原則(POLP)

1)最小特權原則 (Principle of least privilege,POLP) :
是一種信息安全概念,即為用戶提供執行其工作職責所需的最 小權限等級或許可。 最小特權原則被廣泛認為是網絡安全的最佳實踐,也是保護高價值數據和資產的特權訪問的基本方式。

2)最小特權原則 (POLP) 重要性:

  • 減少網絡攻擊面:當今,大多數高級攻擊都依賴于利用特權憑證。通過限制超級用戶和管理員權限,最小權限執行有 助于減少總體網絡攻擊面。
  • 阻止惡意軟件的傳播: 通過在服務器或者在應用系統上執行最小權限,惡意軟件攻擊(例如SQL注入攻擊)將很難 提權來增加訪問權限并橫向移動破壞其他軟件、設備。
  • 有助于簡化合規性和審核:許多內部政策和法規要求都要求組織對特權帳戶實施最小權限原則,以防止對關鍵業務系 統的惡意破壞。最小權限執行可以幫助組織證明對特權活動的完整審核跟蹤的合規性。

3)在團隊中實施最小特權原則 (POLP) :

  • 在所有服務器、業務系統中,審核整個環境以查找特權帳戶(例如SSH賬號、管理后臺賬號、跳板機賬號);
  • 減少不必要的管理員權限,并確保所有用戶和工具執行工作時所需的權限;
  • 定期更改管理員賬號密碼;
  • 監控管理員賬號操作行為,告警通知異常活動。


二、AppArmor 限制容器對資源訪問

AppArmor(Application Armor) 是一個 Linux 內核安全模塊,可用于限制主機操作系統上運行的進程的功能。每個 進程都可以擁有自己的安全配置文件。安全配置文件用來允許或禁止特定功能,例如:網絡訪問、文件讀/寫/執行權限等。(類似SELinux)

AppArmor 對操作系統和應用程序所受到的威脅進行從內到外的保護,簡單的說,AppArmor 是與 SELinux 類似的一個訪問控制系統,通過它可以指定程序可以讀、寫或運行哪些文件,是否可以打開 網絡端口等。作為對傳統 Unix 的自主訪問控制模塊的補充,AppArmor 提供了強制訪問控制機制,它 已經被整合到 2.6 版本的 Linux 內核中。目前 Ubuntu 自帶了 Apparmor。

官網:AppArmor - Ubuntu Wiki

Linux發行版內置:Ubuntu、Debian

使用場景:AppArmor 可以配置為任何應用程序減少潛在的攻擊面,并且提供更加深入的防御。 它通過調整配置文件進行配置,以允許特定程序或容器所需的訪問, 如 Linux 權能字、網絡訪問、文件權限等。防止黑客在二進制目錄下放如木馬文件替換常用命令等。

2.1 Apparmor兩種工作模式:

  1. Enforcement(強制模式) :在這種模式下,配置文件里列出的限制條件都會得到執行,并且對于違反這些限制條 件的程序會進行日志記錄。(類似SELinux的enforcing)
  2. Complain(投訴模式):在這種模式下,配置文件里的限制條件不會得到執行,Apparmor只是對程序的行為進行 記錄。一般用于調試。例如程序可以寫一個在配置文件里注明只讀的文件,但 Apparmor 不會對程序的行為進行限 制,只是進行記錄。(類似SELinux的permissive)

常用命令:
參考:Ubuntu Manpage: apparmor_parser - loads AppArmor profiles into the kernel

  • apparmor_status:查看AppArmor配置文件的當前狀態的
  • apparmor_parser:將AppArmor配置文件加載到內核中
    • apparmor_parser <profile> ? ? ? ?# 加載到內核中
    • apparmor_parser -r <profile> ? ? # 重新加載配置
    • apparmor_parser -R <profile> ? ?# 刪除配置
  • aa-complain:將AppArmor配置文件設置為投訴模式,需要安裝apparmor-utils軟件包
  • aa-enforce:將AppArmor配置文件設置為強制模式,需要安裝apparmor-utils軟件包

2.2 K8s使用AppArmor的先決條件:

K8s版本v1.4+,檢查是否支持:kubectl describe node | grep AppArmor

  • Linux內核已啟用AppArmor,查看cat /sys/module/apparmor/parameters/enabled
  • CRI 容器運行時 需要支持AppArmor,目前Docker已支持

官網:使用 AppArmor 限制容器對資源的訪問 | Kubernetes

示例:AppArmor 目前處于測試階段,因此在注解中指定AppArmor策略配置文件。

apiVersion: v1
kind: Pod
metadata:name: hello-apparmorannotations:container.apparmor.security.beta.kubernetes.io/<container_name>: localhost/<profile_ref>
...
  • <container_name> ? ? # Pod中容器名稱
  • <profile_ref> ? ? # Pod所在宿主機上策略名,默認目錄/etc/apparmor.d/

補充:AppArmor 基于Linux內核實現,需要在宿主機上執行加載操作,kubelet會讀取加載的配置文件應用到容器中,執行相應的策略限制(包括容器文件、目錄、網絡等)

2.3 訪問控制與資源限制

1)文件系統的訪問控制
Apparmor 可以對某一個文件,或者某一個目錄下的文件進行訪問控制,包括以下幾種訪問模式:

字符

描述

r

w

a

追加

k

文件鎖定

l

鏈接

x

可執行

匹配目錄和文件:

通配符

描述

示例

*

在目錄級別匹配 零個或多個字符

/dir/* 匹配目錄中的任何文件

/dir/a* 匹配目錄中以a開頭的任意文件

/dir/*.png 匹配目錄中以.png結尾的任意文 件

/dir/a*/ 匹配/dir里面以a開頭的目錄

/dir/*a/ 匹配/dir里面以a結尾的目錄

**

在多個目錄級別 匹配零個或多個 字符

/dir/** 匹配/dir目錄或者/dir目錄下任何文件 和目錄

/dir/**/ 匹配/dir或者/dir下面任何目錄

[]、[^]

字符串,匹配其 中任意字符

/dir/[^.]* 匹配/dir目錄中以.之外的任何文件

/dir/**[^/] 匹配/dir目錄或者/dir下面的任何 目錄中的任何文件

在配置文件中的寫法,如:/tmp r, (表示可對/tmp 目錄下的文件進行讀取)

注意:沒在配置文件中列出的文件,程序是不能訪問

2)資源限制
Apparmor 可以提供類似系統調用 setrlimit 一樣的方式來限制程序可以使用的資源。要限制資源, 可在配置文件中這樣寫:
set rlimit [resource] <= [value],
其 resource 代表某一種資源,value 代表某一個值,要對程序可以使用的虛擬內存做限制時,可以 這樣寫:
set rlimit as<=1M, (可以使用的虛擬內存最大為 1M)

3)訪問網絡
Apparmor 可以程序是否可以訪問網絡進行限制,在配置文件里的語法是:
network [ [domain] [type] [protocol] ]
要讓程序可以進行所有的網絡操作,只需在配置文件中寫:
network,?
要允許程序使用在 IPv4 下使用 TCP 協議,可以這樣寫:
network inet tcp,

使用Ubuntu搭建k8s環境下安裝apparmor

apt-get install apparmor-utils apparmor-profiles apparmor-profiles-extra -y

注:Apparmor 的 profile 配置文件保存在目錄/etc/apparmor.d,對應的日志3721
文件記錄在 /var/log/messages


案例:限制容器對目錄或者文件的訪問

實施步驟:
1.將自定義策略配置文件保存到 /etc/apparmor.d/
2.加載配置文件到內核:apparmor_parser <profile>
3.創建Pod時,注解指定策略配置名

工作流程:


1)自定義策略配置文件

vi /etc/apparmor.d/k8s-deny-write
# include <tunables/global>    //導入依賴
profile k8s-deny-write flags=(attach_disconnected) {   //指定策略名# include <abstractions/base>file,              # 允許所有文件讀寫deny /bin/** w,    # 拒絕所有文件寫deny /data/www/** w,
}
  • 第一行:導入依賴,遵循C語言約定
  • 第二行:指定策略名
  • 第三行:{} 策略塊

2)加載配置文件到內核

# 查看加載的配置文件
apparmor_parser status

# 加載配置文件到內核
apparmor_parser k8s-deny-write

3)創建Pod并注解指定策略配置名YAML文件

apiVersion: v1
kind: Pod
metadata:name: hello-apparmorannotations:container.apparmor.security.beta.kubernetes.io/hello: localhost/k8s-deny-write
spec:nodeName: k8s-node1   # 由于策略是指定加載在宿主機,需要指定該宿主機節點containers:- name: helloimage: busyboxcommand: [ "sh", "-c", "echo 'Hello AppArmor!' && sleep 1h" ]

注釋:container.apparmor.security.beta.kubernetes.io/hello: localhost/k8s-deny-write

  • hello 指定的【spec】字段中創建的容器名字;表示對這個容器進行實在策略的應用。
  • localhost 表示指定本地的策略文件的策略名(注:是配置策略中的策略名,非文件名)


三、Seccomp 限制容器進程系統調用

對于 Linux 來說,用戶層一切資源相關操作都需要通 過系統調用來完成;系統調用實現技術層次上解耦, 內核只關心系統調用API的實現,而不必關心誰調用的。

調用關系圖:

Seccomp(Secure computing mode) 是一個 Linux 內核安全模塊,可用于應用進程允許使用的系統調用。 容器實際上是宿主機上運行的一個進程,共享宿主機內核,如果所有容器都具有任何系統調用的能力,那么容器如果被 入侵,就很輕松繞過容器隔離更改宿主機系統權限或者進入宿主機。 使用Seccomp機制就可以限制容器系統調用,有效減少攻擊面。

Linux發行版內置:CentOS、Ubuntu

K8s使用Seccomp的先決條件:

Seccomp在Kubernetes 1.3版本引入,在1.19版本成為GA版本,因此K8s中使用Seccomp可以通過以下兩種方式:

  • <profile> ? # Pod所在宿主機上策略文件名,默認目錄:/var/lib/kubelet/seccomp

1)1.19版本之前

annotations:seccomp.security.alpha.kubernetes.io/pod: "localhost/<profile>"

2)1.19版本+

apiVersion: v1
kind: Pod
metadata:name: hello-seccomp
spec:securityContext:seccompProfile:type: LocalhostlocalhostProfile: <profile>    # Pod所在宿主機上策略文件名,默認目錄:/var/lib/kubelet/seccompcontainers:
...


seccomp 基本配置文件包括三個元素:

  • defaultAction:在 syscalls部分未定義的任何 系統調用默認動作為允許
    • SCMP_ACT_ALLOW 允許
  • syscalls
    • names 系統調用名稱,可以換行寫多個
    • SCMP_ACT_ERRNO 阻止系統調用

示例:禁止容器使用chmod

1)自定義seccomp策略配置文件:

注意:Pod所在宿主機上配置策略文件,默認目錄/var/lib/kubelet/seccomp(沒有該目錄則自己創建)

[root@k8s-node1-1-72 ~]# mkdir /var/lib/kubelet/seccomp
[root@k8s-node1-1-72 ~]# vi /var/lib/kubelet/seccomp/chmod.json
{"defaultAction": "SCMP_ACT_ALLOW","syscalls": [{"names": ["chmod"],"action": "SCMP_ACT_ERRNO"}]
}

2)創建Pod并注解指定策略配置名YAML文件

[root@k8s-master-1-71 ~]# kubectl apply -f test-seccomp.yaml
apiVersion: v1
kind: Pod
metadata:name: hello-seccomp
spec:nodeName: k8s-node1-1-72           # 由于策略是指定加載在宿主機,需要指定該宿主機節點securityContext:seccompProfile:type: LocalhostlocalhostProfile: chmod.json     # 指定Pod所在宿主機上策略文件名containers:- image: busyboxname: bscommand:- sleep- 24h

測試:在Pod中授予 /etc/hosts 執行權限

[root@k8s-master-1-71 ~]# kubectl get pods
NAME                        READY   STATUS    RESTARTS        AGE
hello-seccomp               1/1     Running   0               5s
[root@k8s-master-1-71 ~]# kubectl exec -it hello-seccomp -- sh/ # chmod +x /etc/hosts
chmod: /etc/hosts: Operation not permitted

示例:禁止容器使用mkdir

注意:編輯策略文件后,需要重啟Pod才生效

vi /var/lib/kubelet/seccomp/chmod.json
{"defaultAction": "SCMP_ACT_ALLOW","syscalls": [{"names": ["chmod","mkdir"     # 注意:增加系統調用需要添加【,】],"action": "SCMP_ACT_ERRNO"}]
}# 需要重啟Pod,加載生效
[root@k8s-master-1-71 ~]# kubectl delete -f test-seccomp.yaml
[root@k8s-master-1-71 ~]# kubectl apply -f test-seccomp.yaml
[root@k8s-master-1-71 ~]# kubectl exec -it hello-seccomp -- sh
/ # mkdir /data
mkdir: can't create directory '/data': Operation not permitted

補充:大多數容器運行時都提供一組允許或不允許的默認系統調用。通過使用 runtime/default 注釋 或將 Pod 或容器的安全上下文中的 seccomp 類型設置為 RuntimeDefault,可以輕松地在 Kubernetes 中應用默認值。

Docker默認配置說明:Seccomp security profiles for Docker | Docker Docs

課后作業

1、在工作節點上加載課堂上講解的apparmor策略文件k8s-deny-write,并在 Pod中應用該策略
2、在工作節點上加載課堂上講解的seccomp文件,禁止容器里使用chmod命令, 并在Pod中應用該策略
?

小結

本篇為 【Kubernetes CKS認證 DAY3】的開篇學習筆記,希望這篇筆記可以讓您初步了解到 最小特權原則(POLP)、AppArmor 限制容器對資源訪問,不妨跟著我的筆記步伐親自實踐一下吧!


Tip:畢竟兩個人的智慧大于一個人的智慧,如果你不理解本章節的內容或需要相關筆記、視頻,可私信小安,請不要害羞和回避,可以向他人請教,花點時間直到你真正的理解。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/76225.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/76225.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/76225.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux wifi 驅動移植適配流程詳解

基礎內容概要 將tplink wn725n 無線網卡驅動移植到ubuntu將tplink wn725n 無線網卡驅動移植到Linux開發板&#xff08;交叉編譯&#xff09;將tplink wn725n 無線網卡驅動移植到Linux開發板&#xff0c;在開發板中編譯 為什么還要包涵交叉編譯&#xff1f; 目標設備是ARM架構…

Day14 動態規劃(3)

一.746. 使用最小花費爬樓梯 FS記憶化搜索優化: const int N 1010;class Solution { public:int mem[N];int dfs(vector<int>& cost, int x){if(mem[x]) return mem[x];int sum 0;if(x 0 || x 1) return 0;else{sum min(dfs(cost, x - 1) cost[x - 1], dfs(c…

解鎖AI潛能:模型上下文協議(MCP)的革新與應用

解鎖AI潛能:模型上下文協議(MCP)的革新與應用 在人工智能發展的當下,大語言模型(LLM)正逐步滲透到各個領域。從智能客服快速響應客戶咨詢,到智能編程助手協助開發者高效編寫代碼,LLM展現出強大的能力。然而,隨著應用的深入會面臨一個問題:模型與數據之間的連接困境。…

windows與ubuntu雙硬盤雙系統安裝及啟動(全流程成功)

&#x1f451;主頁&#xff1a;吾名招財 &#x1f453;簡介&#xff1a;工科學碩&#xff0c;研究方向機器視覺&#xff0c;愛好較廣泛… ?&#x1f4ab;簽名&#xff1a;面朝大海&#xff0c;春暖花開&#xff01; windows與ubuntu雙硬盤雙系統安裝及啟動&#xff08;全流程成…

【學習筆記】計算機網絡(六)

第6章應用層 文章目錄 第6章應用層6.1 域名系統DNS6.1.1 域名系統概述6.1.2 互聯網的域名結構6.1.3 域名服務器域名服務器的分區管理DNS 域名服務器的層次結構域名服務器的可靠性域名解析過程-兩種查詢方式DNS 高速緩存機制 6.2 文件傳送協議6.2.1 FTP 概述6.2.2 FTP 的基本工作…

Python擴展知識詳解:lambda函數

目錄 前言 1 基本知識點 語法 特點 代碼示例 2 常見使用場景 1. 與高階函數配合使用 2. 作為排序鍵來使用 3. 立即調用函數 4. 在字典中使用 3 高級用法&#xff08;進階版&#xff09; 1. 多參數lambda 2. 設置默認參數 3. 嵌套lambda 注意事項 何時…

Android: Fragment 的使用指南

Android 中 Fragment 的使用指南 Fragment 是 Android 應用開發中的重要組件&#xff0c;它代表 Activity 中的一部分 UI 或行為&#xff0c;可以組合多個 Fragment 在一個 Activity 中構建多窗格 UI&#xff0c;并在不同 Activity 中重復使用某個 Fragment。 基本概念 Frag…

Vue React

Vue 的源碼主要分為以下幾個部分&#xff1a; 主要涉及 響應式、虛擬 DOM、組件系統、編譯器、運行時。 ├── packages/ │ ├── compiler-core/ # 編譯器核心 │ ├── compiler-sfc/ # 處理 .vue 單文件組件 │ ├── compiler-dom/ # 處理 DOM 相關…

項目實戰--權限列表

后端數據&#xff1a; 用表格實現權限列表 const dataSource [{key: 1,name: 胡彥斌,age: 32,address: 西湖區湖底公園1號,},{key: 2,name: 胡彥祖,age: 42,address: 西湖區湖底公園1號,}, ];const columns [{title: 姓名,dataIndex: name,key: name,},{title: 年齡,dataInd…

私有知識庫 Coco AI 實戰(一):Linux 平臺部署

Coco AI 是一個完全開源、跨平臺的統一搜索和生產力工具&#xff0c;能夠連接各種數據源&#xff0c;包括應用程序、文件、Google Drive、Notion、Yuque、Hugo 等&#xff0c;幫助用戶快速智能地訪問他們的信息。通過集成 DeepSeek 等大型模型&#xff0c;Coco AI 實現了智能個…

【大模型】微調一個大模型需要多少 GPU 顯存?

視頻鏈接&#xff1a;微調一個模型需要多少GPU顯存&#xff1f; up 主頁&#xff1a;AI老兵tags&#xff1a; #GPU顯存 #模型微調 #LoRA #QLoRA #參數計算 本集視頻詳細介紹了在模型微調過程中 GPU顯存需求的計算方法&#xff0c;包括全量微調和高效微調&#xff08;如 LoRA&am…

Lambda 表達式是什么以及如何使用

目錄 &#x1f4cc; Kotlin 的 Lambda 表達式詳解 &#x1f3af; 什么是 Lambda 表達式&#xff1f; &#x1f525; 1. Lambda 表達式的基本語法 ? 示例 1&#xff1a;Lambda 基本寫法 ? 示例 2&#xff1a;使用 it 關鍵字&#xff08;單參數簡化&#xff09; ? 示例 3…

全文 MLIR TOY -- Chapter2: 發出基本的 MLIR——把AST變成SSA的 MLIR Dialect IR

現在我們已經熟悉 Toy 語言和它的AST表示&#xff0c;現在讓我們看看 MLIR 是怎樣幫助編譯 Toy 源程序的。 簡介&#xff1a;多層中間表示 其他的編譯器&#xff0c;像 LLVM&#xff0c;是提供一個固定的預定義類型和指令&#xff08;通常是底層的像 RISC的指令&#xff09;。對…

一個判斷A股交易狀態的python腳本

最近在做股票數據相關的項目&#xff0c;需要用到判斷某一天某個時刻A股的狀態&#xff0c;比如休市&#xff0c;收盤&#xff0c;交易中等&#xff0c;發動腦筋想了一下&#xff0c;這個其實還是比較簡單的&#xff0c;這里我把實現方法分享給大家。 思路 當天是否休市 對于某…

LLaMA Factory微調后的大模型在vLLM框架中對齊對話模版

LLaMA Factory微調后的大模型Chat對話效果&#xff0c;與該模型使用vLLM推理架構中的對話效果&#xff0c;可能會出現不一致的情況。 下圖是LLaMA Factory中的Chat的對話 下圖是vLLM中的對話效果。 模型回答不穩定&#xff1a;有一半是對的&#xff0c;有一半是無關的。 1、未…

004 健身房個性化訓練計劃——金丹期(體態改善)

個人筆記使用。 01 肱骨前移 1.放松肩前束 2.放松肩后束 2.5kg啞鈴側展 泡沫軸上下滾 招財貓 肱二頭 02 溜肩 寬距的坐姿劃船 上頂

【已開源】UniApp+vue3跨端應用從0到1開發指南、uniapp+vue3模板應用

在跨端開發日益成為主流的今天&#xff0c;如何高效構建規范、可維護的企業級應用&#xff1f;本文以UniAppVue3* *TypeScript**為核心技術棧&#xff0c;手把手帶你從零搭建高標準的跨平臺項目。 通過本文&#xff0c;你將系統掌握&#xff1a; ? 環境配置&#xff1a;Node…

線程池設計

線程池實際上也是一個生產者消費者模型&#xff0c;線程池可以讓多個線程去任務隊列中取任務&#xff0c;執行任務&#xff0c;適用于需要大量的線程來完成任務且完成任務的時間較短。 #include "log.hpp" #include <mutex> #include <condition_variable&…

黑盒測試的正交實驗法

背景: 利用因果圖法、判定表法可以幫助我們對于輸入數據的組合情況進行用例設計&#xff0c;但當輸入數據的組合數量巨大時&#xff0c;由于不太可能覆蓋到每個輸入組合的測試情況&#xff0c;因果圖法或判定表法可能就不太適用了&#xff0c;可以采用正交實驗法、來合理地減少…

Linux內核編程

linux 系 統 在 2 4 4 0 上 的 啟 動 過 程 分 三個 階 段 u-boot的啟動 1.先分清寄存器的分類 RAM的分類 ROM的分類 Mini2440開發板的存 儲器配置 Mini2440開發板板載: 1. 64MB sdram; 2. 256MB nand-flash; 3. 2MB nor-flash; 4. s3c2440內部還有4KB iram; Mini2440的啟…