為何在Kubernetes容器中以root身份運行存在風險?

作者:馬辛·瓦西奧內克(Marcin Wasiucionek)
在這里插入圖片描述

引言

在Kubernetes安全領域,一個常見的建議是讓容器以非root用戶身份運行。但是,在容器中以root身份運行,實際會帶來哪些安全隱患呢?在Docker鏡像和Kubernetes配置中,這一最佳實踐常常被重點強調。在Kubernetes清單文件中,可以通過以下代碼實現:

securityContext:runAsNonRoot: true # 確保runAsUser指定的用戶ID不是0。如果用戶ID設置為0,Pod將無法運行。runAsUser: 1000 # 將容器中運行的進程的用戶ID設置為1000。

你可以只設置runAsUser字段,而不包含runAsNonRoot。然而,如果你指定了runAsNonRoot,那么也必須定義runAsUser

容器以root身份運行為何危險??

當容器以root身份運行時,會出現多種潛在的攻擊途徑。讓我們通過實驗來探究一下。

搭建實驗環境🛠?

為了說明以root身份運行容器的風險,我們將使用兩個相似的容器進行實際測試:

  1. 一個默認以root身份運行的alpine:3.20.2容器。
  2. 一個自定義的alpine:3.20.2容器,配置為以非root用戶身份運行。

以下是用于創建非root容器的Dockerfile:

# 使用Alpine鏡像作為基礎鏡像
FROM alpine:3.20.2# 添加一個名為'nonroot'的非root用戶,用戶ID為1000
RUN adduser -D -u 1000 nonroot# 將后續命令的用戶設置為'nonroot'
USER nonroot
# 可選:設置默認命令
CMD ["sh"]

在本地環境中,我們使用Minikube 1.32.0和Kubernetes版本v1.28.3。通過以下命令構建鏡像,并使其在Minikube集群中可用:

eval $(minikube docker-env)
docker build. -t nonroot:1.0.0

接下來,我們在Kubernetes中部署這些容器。在這個演示中,我使用hostPath卷來測試權限,不過強烈建議不要在家庭實驗室之外使用hostPath(我會在另一篇文章中解釋原因)!
root用戶的Pod定義如下:

apiVersion: v1
kind: Pod
metadata:name: root
spec:containers:- name: alpineimage: alpine:3.20.2command: ["/bin/sh", "-c"]args: ["while true; do sleep 100; done"]volumeMounts:- mountPath: /hostname: hostvolumes:- name: hosthostPath:path: /etc/kubernetes/manifests # 掛載節點上的靜態Pod目錄type: Directory

非root用戶的Pod定義如下:

apiVersion: v1
kind: Pod
metadata:name: nonroot
spec:containers:- name: alpineimage: nonroot:1.0.0command: ["/bin/sh", "-c"]args: ["while true; do sleep 100; done"]securityContext:runAsUser: 1000 # 確保容器以用戶ID為1000的非root用戶運行volumeMounts:- mountPath: /hostname: hostvolumes:- name: hosthostPath:path: /etc/kubernetes/manifests # 掛載節點上的靜態Pod目錄type: Directory
測試潛在攻擊🧪
  1. 下載惡意軟件🦠
    一種常見的攻擊方式是下載并執行惡意軟件包。我通過嘗試從dev.to獲取一些數據來測試這一點。
    在這里插入圖片描述

由于容器中最初未安裝curl,我嘗試安裝它:
在這里插入圖片描述

在root容器中安裝成功,但在非root容器中安裝失敗。讓我們嘗試獲取數據。
在這里插入圖片描述

在root容器中操作正常,但在非root容器中被阻止。這表明以非root用戶身份運行可以有效地緩解這種攻擊。其他措施,如使用只讀文件系統,可以進一步增強安全性,我將在未來的文章中介紹。

  1. 訪問主機資源🔒
    我將一個主機目錄掛載到了Pod(再次強調 —— 請不要在家庭實驗室之外這樣做!)。通過這種訪問權限,攻擊者可以嘗試訪問包含靜態Pod manifests 的目錄,并嘗試運行惡意Pod(盡管下載惡意鏡像應該會被集群策略阻止)。這可以通過向靜態清單目錄(通常是Kubernetes節點上的/etc/kubernetes/manifests)添加新的清單文件來實現。有了這種訪問權限,攻擊者可以嘗試:
    • 通過部署攔截集群內網絡流量的Pod來執行中間人攻擊,并捕獲敏感信息。
    • 部署帶有反向shell的后門Pod(你可以在https://www.revshells.com/ 找到示例),接受來自黑客機器的連接。
    • 運行一個Pod,將包含敏感數據的卷中的數據傳輸到外部實體。
    • 通過從ETCD存儲中讀取機密信息來擴大攻擊范圍,并進一步滲透基礎設施。
    • 使用你的資源運行加密貨幣挖掘程序以獲取經濟利益。

讓我們使用以下清單文件部署一個加密貨幣挖掘程序的模擬:

apiVersion: v1
kind: Pod
metadata:name: crypto - miner
spec:containers:- name: miner - containerimage: busyboxcommand: ["/bin/sh", "-c", "while true; do echo 'Mining in progress...'; sleep 5; done"]

并從兩個Pod中添加靜態Pod文件:
在這里插入圖片描述

如你所見,非root用戶的Pod上的命令被拒絕。它在root用戶的Pod上成功運行,并將加密貨幣挖掘程序的清單文件添加到了靜態Pod目錄中。集群中創建了這個Pod嗎?
在這里插入圖片描述
是的,它在集群中運行,并且在出現故障或重啟時將被重新調度。

攻擊者通過訪問節點上的hostPath還可以做的另一件事是讀取主機上的/etc/passwd文件。該文件不包含明文密碼,但它讓攻擊者了解系統中存在的用戶。結合其他一些數據源和/etc/shadow,這些信息可能會讓攻擊者進一步利用系統。

  1. 權限提升🚫
    你難道不能將非root用戶切換為root用戶,然后做同樣的事情嗎?讓我們試試。
    在這里插入圖片描述

不,你不能。從非root用戶切換到root用戶的嘗試失敗了,這表明在沒有sudo權限的情況下,權限提升是不可行的。因此,如果非root用戶不在sudoers列表中,風險就會降低。

如何預防?🛡?

為了防止與以root身份運行容器相關的安全問題,請遵循以下最佳實踐:

  1. 使用非root用戶:始終在你的Docker容器中定義并使用非root用戶。🧑?💻
  2. 利用Kubernetes安全上下文:使用Kubernetes安全上下文(Security Context)指定容器執行的用戶。🔐
結論?

在Kubernetes中以非root用戶身份運行容器,通過緩解常見的攻擊途徑,顯著增強了安全性。希望本文能讓你了解這一最佳實踐的重要性。

參考文獻
  1. Understanding the Docker USER instruction
  2. Kubernetes Security Context
  3. Alpine Docker images on Docker Hub
  4. Kubernetes Pod Security Standards
  5. https://medium.com/@marcin.wasiucionek/why-is-running-as-root-in-kubernetes-containers-dangerous-e5f1a116080e

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

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

相關文章

js --- 獲取時間戳

介紹 使用js獲取當前時間戳 語法 Date.now()

ConcurrentHashMap線程安全:分段鎖 到 synchronized + CAS

專欄系列文章地址:https://blog.csdn.net/qq_26437925/article/details/145290162 本文目標: 理解ConcurrentHashMap為什么線程安全;ConcurrentHashMap的具體細節還需要進一步研究 目錄 ConcurrentHashMap介紹JDK7的分段鎖實現JDK8的synchr…

Vue和Java使用AES加密傳輸

背景:Vue對參數進行加密,對響應進行解密。Java對參數進行解密,對響應進行解密。不攔截文件上傳類請求、GET請求。 【1】前端配置 安裝crypto npm install crypto-js編寫加解密工具類encrypt.js import CryptoJS from crypto-jsconst KEY …

開發板目錄 /usr/lib/fonts/ 中的字體文件 msyh.ttc 的介紹【微軟雅黑(Microsoft YaHei)】

本文是博文 https://blog.csdn.net/wenhao_ir/article/details/145433648 的延伸擴展。 本文是博文 https://blog.csdn.net/wenhao_ir/article/details/145433648 的延伸擴展。 問:運行 ls /usr/lib/fonts/ 發現有一個名叫 msyh.ttc 的字體文件,能介紹…

[ESP32:Vscode+PlatformIO]新建工程 常用配置與設置

2025-1-29 一、新建工程 選擇一個要創建工程文件夾的地方,在空白處鼠標右鍵選擇通過Code打開 打開Vscode,點擊platformIO圖標,選擇PIO Home下的open,最后點擊new project 按照下圖進行設置 第一個是工程文件夾的名稱 第二個是…

述評:如果抗拒特朗普的“普征關稅”

題 記 美國總統特朗普宣布對美國三大貿易夥伴——中國、墨西哥和加拿大,分別征收10%、25%的關稅。 他威脅說,如果這三個國家不解決他對非法移民和毒品走私的擔憂,他就要征收進口稅。 去年,中國、墨西哥和加拿大這三個國家&#…

九. Redis 持久化-AOF(詳細講解說明,一個配置一個說明分析,步步講解到位 2)

九. Redis 持久化-AOF(詳細講解說明,一個配置一個說明分析,步步講解到位 2) 文章目錄 九. Redis 持久化-AOF(詳細講解說明,一個配置一個說明分析,步步講解到位 2)1. Redis 持久化 AOF 概述2. AOF 持久化流程3. AOF 的配置4. AOF 啟…

C++11新特性之long long超長整形

1.介紹 long long 超長整形是C11標準新添加的,用于表示更大范圍整數的類型。 2.用法 占用空間:至少64位(8個字節)。 對于有符號long long 整形,后綴用“LL”或“II”標識。例如,“10LL”就表示有符號超長整…

瀏覽器查詢所有的存儲信息,以及清除的語法

要在瀏覽器的控制臺中查看所有的存儲(例如 localStorage、sessionStorage 和 cookies),你可以使用瀏覽器開發者工具的 "Application" 標簽頁。以下是操作步驟: 1. 打開開發者工具 在 Chrome 或 Edge 瀏覽器中&#xf…

基于Springboot框架的學術期刊遴選服務-項目演示

項目介紹 本課程演示的是一款 基于Javaweb的水果超市管理系統,主要針對計算機相關專業的正在做畢設的學生與需要項目實戰練習的 Java 學習者。 1.包含:項目源碼、項目文檔、數據庫腳本、軟件工具等所有資料 2.帶你從零開始部署運行本套系統 3.該項目附…

新版231普通阿里滑塊 自動化和逆向實現 分析

聲明: 本文章中所有內容僅供學習交流使用,不用于其他任何目的,抓包內容、敏感網址、數據接口等均已做脫敏處理,嚴禁用于商業用途和非法用途,否則由此產生的一切后果均與作者無關! 逆向過程 補環境逆向 部分補環境 …

java-(Oracle)-Oracle,plsqldev,Sql語法,Oracle函數

卸載好注冊表,然后安裝11g 每次在執行orderby的時候相當于是做了全排序,思考全排序的效率 會比較耗費系統的資源,因此選擇在業務不太繁忙的時候進行 --給表添加注釋 comment on table emp is 雇員表 --給列添加注釋; comment on column emp.empno is 雇員工號;select empno,en…

泰山派Linux環境下自動燒錄腳本(EMMC 2+16G)

腳本名字: download.sh 輸入./download -h獲取幫助信息 ,其中各個IMG/TXT燒錄的地址和路徑都在前幾行修改即可 #!/bin/bash# # DownLoad.sh 多鏡像燒錄腳本 # 版本:1.1 # 作者:zhangqi # 功能:通過參數選擇燒錄指定鏡…

正大杯攻略|分層抽樣+不等概率三階段抽樣

首先,先進行分層抽樣,確定主城區和郊區的比例 然后對主城區分別進行不等概率三階段抽樣 第一階段,使用PPS抽樣,確定行政區(根據分層抽樣比例合理確定主城區和郊區行政區數量) 第二階段,使用分…

開源智慧園區管理系統對比其他十種管理軟件的優勢與應用前景分析

內容概要 在當今數字化快速發展的時代,園區管理軟件的選擇顯得尤為重要。而開源智慧園區管理系統憑借其獨特的優勢,逐漸成為用戶的新寵。與傳統管理軟件相比,它不僅靈活性高,而且具有更強的可定制性,讓各類園區&#…

計算機網絡 應用層 筆記1(C/S模型,P2P模型,FTP協議)

應用層概述: 功能: 常見協議 應用層與其他層的關系 網絡應用模型 C/S模型: 優點 缺點 P2P模型: 優點 缺點 DNS系統: 基本功能 系統架構 域名空間: DNS 服務器 根服務器: 頂級域…

人類心智逆向工程:AGI的認知科學基礎

文章目錄 引言:為何需要逆向工程人類心智?一、逆向工程的定義與目標1.1 什么是逆向工程?1.2 AGI逆向工程的核心目標二、認知科學的四大支柱與AGI2.1 神經科學:大腦的硬件解剖2.2 心理學:心智的行為建模2.3 語言學:符號與意義的橋梁2.4 哲學:意識與自我模型的爭議三、逆向…

游戲引擎學習第86天

倉庫: https://gitee.com/mrxiao_com/2d_game_2 回顧 繼續之前的工作。 昨天已經讓地形系統基本運行起來,但目前仍然需要進一步完善,使其能夠生成更多的地塊。目前的情況是,僅僅有一個地塊位于中心區域,而真正需要的是讓地塊覆蓋…

Python在線編輯器

from flask import Flask, render_template, request, jsonify import sys from io import StringIO import contextlib import subprocess import importlib import threading import time import ast import reapp Flask(__name__)RESTRICTED_PACKAGES {tkinter: 抱歉&…

力扣動態規劃-20【算法學習day.114】

前言 ###我做這類文章一個重要的目的還是記錄自己的學習過程,我的解析也不會做的非常詳細,只會提供思路和一些關鍵點,力扣上的大佬們的題解質量是非常非常高滴!!! 習題 1.網格中的最小路徑代價 題目鏈接…