為什么 Istio 要使用 SPIRE 做身份認證?

34f10de2bcc6b108e826937187646e5a.png

b32bf2fe51c4e3283831382aba39bbc1.gif

今年 6 月初,Istio 1.14 發布?[1]?,該版本中最值得關注的特性是新增對 SPIRE 的支持。SPIFFE[2]?和 SPIRE 都是 CNCF 孵化項目,其中 SPIRE 是 SPIFFE 的實現之一。本文將帶你了解 SPIRE 對于零信任架構的意義,以及 Istio 是為何使用 SPIRE 實現身份認證。

Kubernetes 中的身份認證

我們都知道 Istio 最初是基于 Kubernetes 建立起來的,在談在 Istio 中使用 SPIRE 做身份認證之前,我們先來看下 Kubernetes 中如何做身份認證。

我們來看一個 pod 的 token 的例子,下面是 default 命名空間下 sleep pod 的 Service Account 的 token。

apiVersion:?v1
data:ca.crt:?{CA_CRT}namespace:?ZGVmYXVsdA==token:?{TOKEN_STRING}
kind:?Secret
metadata:annotations:kubernetes.io/service-account.name:?sleepkubernetes.io/service-account.uid:?2c0d00e8-13a2-48d0-9ff8-f987f3325ecfcreationTimestamp:?"2022-06-14T03:01:35Z"name:?sleep-token-gwhwdnamespace:?defaultresourceVersion:?"244535398"uid:?b8822ceb-9553-4a17-96dc-d525bbaed0e0
type:?kubernetes.io/service-account-token

我們看到其中有?ca.crt?和?token?字段,如果這個 token 被竊取,會有什么后果?Kubernetes 中使用 Service Account 來管理 Pod 的身份,然后利用 RBAC 指定具有某 Service Account 的 Pod 對 Kubernetes API 的權限。Service Account 的 token 存儲在 Secret 中,token 中并不包含工作負載所運行的節點、pod 的聲明,一旦 token 被竊取破壞者就獲得了該賬戶的所有權限,偽裝成該用戶竊取信息或破壞。

一個 token 只能在一個集群中標記負載身份,Istio 同時支持 Kubernetes 環境和虛擬機,還有多集群多網格,如何統一這些異構環境中的工作負載身份?這時,一個統一的工作負載身份標準就呼之欲出了。

SPIFFE 與 SPIRE 簡介

SPIFFE 的目的是基于零信任的理念,建立一個開放、統一的工作負載身份標準,這有助于建立一個零信任的全面身份化的數據中心網絡。SPIFFE 的核心是通過簡單 API 定義了一個短期的加密身份文件 SVID,用作工作負載認證時使用的身份文件,例如建立 TLS 連接或簽署和驗證 JWT 令牌等。SPIRE 可以根據管理員定義的策略自動輪換 X.509 SVID 證書和秘鑰。Istio 可以通過 SPIRE 動態的消費工作負載標識,SPIRE 可以動態的提供工作負載標識。

下面我將為你簡單介紹一下與 SPIFFE 相關的一些術語。

  • ??SPIFFE(Secure Production Identity Framework For Everyone)是一套身份認證標準。

  • ??SPIRE(SPIFFE Runtime Environment) 是 SPIFFE 標準的一套生產就緒實現。

  • ??SVID(SPIFFE Verifiable Identity Document)是工作負載向資源或調用者證明其身份的文件。SVID 包含一個 SPIFFE ID,代表了服務的身份。它將 SPIFFE ID 編碼在一個可加密驗證的文件中,目前支持兩種格式:X.509 證書或 JWT 令牌。

  • ??SPIFFE ID?是一個統一資源標識符(URI),其格式如下:spiffe://trust_domain/workload_identifier

SPIRE 包含 Server 和 Agent 兩個部分,它們的作用如下。

SPIRE Server

  • ??身份映射

  • ??節點認證

  • ??SVID 頒發

SPIRE Agent

  • ??工作負載認證

  • ??提供工作負載 API

SPIFFE 與零信任安全

零信任的本質是以身份為中心的動態訪問控制。動態證書輪換、動態證書下發、動態權限控制。SPIFFE 解決的是標識工作負載的問題。

在虛擬機時代我們可能根據一個 IP 地址和端口來標識一個工作負載,基于 IP 地址標識存在多個服務共享一個 IP 地址,IP 地址偽造和訪問控制列表過大等問題。到了 Kubernetes 時代,容器的生命周期是短暫的,我們無法再用 IP 地址來標識負載,而是通過 pod 或 service 名稱。但是,不同的云、軟件平臺對工作負載標識的方法不同,相互之間存在兼容性問題。尤其是在異構混合云的中,同時存在虛擬機和容器的工作負載。這時,建立一個細粒度、具有互操作性的標識系統,將具有重要意義。

在 Istio 中使用 SPIRE 做身份認證

Istio 會利用 SPIRE 為每個工作負載提供一個唯一標識,服務網格中的工作負載在進行對等身份認證、請求身份認證和授權策略都會使用到服務標識,用于驗證訪問是否被允許。SPIRE 原生支持 Envoy SDS API,SPIRE Agent 中的通過與工作負載中共享的 UNIX Domain Socket 通信,為工作負載頒發 SVID。請參考?Istio 文檔?[3]?了解如何在 Istio 中使用 SPIRE 做身份認證。

SDS 最重要的好處就是簡化了證書管理。如果沒有這個特性,在 Kubernetes deployment 中,證書就必須以 secret 的方式被創建,然后掛載進代理容器。如果證書過期了,就需要更新 secret 且代理容器需要被重新部署。如果使用 SDS,Istio 可以使用 SDS 服務器會將證書推送給所有的 Envoy 實例。如果證書過期了,服務器僅需要將新證書推送至 Envoy 實例,Envoy 將會立即使用新證書且不需要重新部署代理容器。

下圖展示了 Istio 中使用 SPIRE 進行身份認證的架構。

ef99a79b169803186e7ccbd041f8770e.png
Istio 中使用 SPIRE 進行身份認證的架構圖

在 Kubernetes 集群中的?spire?命名空間中使用 StatefulSet 部署 SPIRE Server 和 Kubernetes Workload Registrar,使用 DaemonSet 資源為每個節點部署一個 SPIRE Agent。假設你在安裝 Kubernetes 時使用的是默認的 DNS 名稱?cluster.local,Kubernetes Workload Registar[4]?會為 Istio Mesh 中的工作負載創建如下格式的身份:

  • ? SPRRE Server:spiffe://cluster.local/ns/spire/sa/server

  • ? SPIRE Agent:spiffe://cluster.local/ns/spire/sa/spire-agent

  • ? Kubernetes Node:spiffe://cluster.local/k8s-workload-registrar/demo-cluster/node/

  • ? Kubernetes Worload Pod:spiffe://cluster.local/{namespace}/spire/sa/{service_acount}

這樣不論是節點還是每個工作負載都有它們全局唯一的身份,而且還可以根據集群 (信任域)擴展。

Istio Mesh 中的工作負載身份驗證過程如下圖所示。

698ecf34e7e9104e19abb441ed1b8072.png
Istio 服務網格中的工作負載身份認證過程示意圖

詳細過程如下:

  1. 1.?工作負載的 sidecar 中的?pilot-agent?會通過共享的 UDS 調用 SPIRE Agent 來獲取 SIVD

  2. 2.?SPIRE Agent 詢問 Kubernetes(準確的說是節點上的 kubelet)獲取負載的信息

  3. 3.?Kubelet 將從 API server 查詢到的信息返回給工作負載驗證器

  4. 4.?驗證器將 kubelet 返回的結果與 sidecar 共享的身份信息比對,如果相同,則將正確的 SVID 緩存返回給工作負載

關于工作負載的注冊和認證的詳細過程請參考?SPIRE 文檔?[5]?。

總結

身份是零信任網絡的基礎,SPIFFE 統一了異構環境下的身份標準。在 Istio 中不論我們是否使用 SPIRE,身份驗證對于工作負載來說是不會有任何感知的。通過 SPIRE 來為工作負載提供身份驗證,可以有效地管理工作負載的身份,為實現零信任網絡打好基礎。

引用鏈接

[1]?Istio 1.14 發布:?https://istio.io/latest/news/releases/1.14.x/announcing-1.14/
[2]?SPIFFE:?https://spiffe.io/
[3]?Istio 文檔:?https://istio.io/latest/docs/ops/integrations/spire
[4]?Kubernetes Workload Registar:?https://github.com/spiffe/spire/blob/main/support/k8s/k8s-workload-registrar/README.md
[5]?SPIRE 文檔:?https://lib.jimmysong.io/kubernetes-handbook/concepts/spire/

更多云原生社區資訊,加入云原生社區討論群,歡迎加入云原生社區,點擊閱讀原文了解更多。

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

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

相關文章

C語言試題106之有一對兔子,從出生后第 3 個月起每個月都生一對兔子,小兔子長到第三個月 后每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數為多少?

1、題目 題目:有一對兔子,從出生后第 3 個月起每個月都生一對兔子,小兔子長到第三個月 后每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數為多少? 分析:兔子的規律為數列 1,1,2,3,5,8,13,21… 2 、溫馨提示 想獲取更多C語言題目請猛搓這里==========》200個C語言…

顯式強制類型轉換

1. 日期顯式轉換為數字new Date; //1478845373322javascript有個奇特的語法,即構造函數沒有參數時可以不用帶()。不過最好還是使用ES5中新加入的靜態方法:Date.now()。2. ~運算符按位運算符只適用于32位整數,運算符會強制操作數使用32位格式。…

【ArcGIS風暴】ArcGIS Editor for OSM中文教程(2):下載及加載OSM數據

本文講解在ArcGIS中借助OpenStreetMap工具下載并加載OSM數據。 文章目錄 1. 下載OSM數據2. 加載OSM數據1. 下載OSM數據 在工具箱中雙擊Download OSM Data(XAPI)工具。 Download URL:http://www.overpass-api.de/api/xapi_meta? Downlaod Extent:與圖層lanzhou相同

Object.observe將不加入到ES7

先請看 Object.observe 的 API Object.observe(obj, callback[, acceptList])它用來監聽對象的變化,當給該對象添加屬性,修改屬性時都會被依次記錄下來 看一個示例 var person {} Object.observe(person, function(arr) {var change arr[0]console.log…

Kafka學習征途:.NET Core操作Kafka

【Kafka】| 總結/Edison Zhou1可用的Kafka .NET客戶端作為一個.NET Developer,自然想要在.NET項目中集成Kafka實現發布訂閱功能。那么,目前可用的Kafka客戶端有哪些呢?目前.NET圈子主流使用的是 Confluent.Kafkaconfluent-kafka-dotnet : htt…

C語言試題107之判斷 101至200 之間有多少個素數,并輸出所有素數。

?作者簡介:大家好我是碼莎拉蒂,CSDN博客專家?????? ??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款模擬面試、刷題神器?? 點擊跳轉進入網站 1、題目 題目:判斷 101至200 之間有多少個素數,并輸出所有素數 分析:判斷素數的方法:用一個數分…

C語言將十進制輸出二進制、八進制、十六進制的方法總結

文章目錄 方法一:直接輸出方法二:itoa函數方法一:直接輸出 C語言中,控制printf函數輸出格式的是格式字符,printf沒有直接打出2進制數的格式符,直接打出16進制的格式符是x格式符,即%x。 printf函數中輸出的格式為printf("<格式化字符串>", <參量表&…

[Android] 修改ImageView的圖片顏色

有兩種方法&#xff1a; 方法1&#xff1a; ImageView imageView (ImageView) findViewById(R.id.arrow_image); Drawable tipsArrow imageView.getDrawable(); tipsArrow.setColorFilter(mContext.getResources().getColor(R.color.red_bg1), PorterDuf…

四叉樹算法

2019獨角獸企業重金招聘Python工程師標準>>> title: 四叉樹算法 date: 2016-1-11 15:10 categories: IOS tags: 算法 小小程序猿我的博客&#xff1a;http://daycoding.com 轉載&#xff1a;http://blog.csdn.net/zhanxinhang/article/details/6706217 高德iOS聚合…

2019年中國教育信息化行業研究報告

2019年中國教育信息化行業研究報告 教育行業丨研究報告 本文轉自&#xff1a;艾瑞咨詢 核心摘要&#xff1a; 教育信息化2.0時代&#xff0c;教育相關政府/學校以更開放的姿態對待社會各類業態的進入&#xff0c;共建共享優質教育資源&#xff0c;提升教育公平與教育質量。同…

C語言試題109之將一個正整數分解質因數。例如:輸入 90,打印出 90=2乘3乘3乘5

?作者簡介:大家好我是碼莎拉蒂,CSDN博客專家?????? ??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款模擬面試、刷題神器?? 點擊跳轉進入網站 1、題目 題目:將一個正整數分解質因數。例如:輸入 90,打印出 90=233*5。 分析:對 n 進行分解質因…

【ArcGIS遇上Python】使用add-in向導開發ArcGIS插件(1):add-in工具介紹及安裝

文章目錄 addin介紹addin開發方式Python Add-In開發addin下載addin安裝基于ArcObject/ArcGIS Engine的Add-In開發addin介紹 ArcGIS從10.0開始支持addin(ArcGIS軟件中又叫作加載項)的方式進行插件制作。相對于以往9.x系列,addin的無論是從使用或者編寫都更加方便快捷。通過開…

dotnet 使用 Crossgen2 對 DLL 進行 ReadyToRun 提升啟動性能

我對幾個應用進行嚴格的啟動性能評估&#xff0c;對比了在 .NET Framework 和 dotnet 6 下的應用啟動性能&#xff0c;非常符合預期的可以看到&#xff0c;在用戶的設備上&#xff0c;經過了 NGen 之后的 .NET Framework 可以提供非常優越的啟動性能&#xff0c;再加上 .NET Fr…

使用myeclipse建立maven項目(重要)

maven是管理項目的&#xff0c;myeclipse是編寫代碼的。第一次寫項目都要配置好多東西&#xff0c;很麻煩&#xff0c;now 來看看怎樣新建一個maven項目。 工具/原料 myeclipsemaven方法/步驟 因為教程使用的maven是自己下載配置的&#xff0c;并沒有使用myeclipse自帶的&#…

LeetCode 每日一題 Day 22 || 枚舉(數學方法)/二分

1954. 收集足夠蘋果的最小花園周長 給你一個用無限二維網格表示的花園&#xff0c;每一個 整數坐標處都有一棵蘋果樹。整數坐標 (i, j) 處的蘋果樹有 |i| |j| 個蘋果。 你將會買下正中心坐標是 (0, 0) 的一塊 正方形土地 &#xff0c;且每條邊都與兩條坐標軸之一平行。 給你…

不用@微信官網了,用python給自己的微信頭像加個小國旗

國旗LOGO&#xff08;png透明格式&#xff09;&#xff1a; 微信頭像 合成結果&#xff1a; import base64 import os import re from io import BytesIO from PIL import Image import tkinter as tk from tkinter import filedialog# 水印圖片 可以自己指定 #markImageImage…

getContentResolver().query()方法selection參數使用詳解(轉)

如何在managedQuery()和getContentResolver().query()方法中實現結果去重 有時候&#xff0c;我們需要對查詢的數據庫結果進行去重。在SQL中我們可以通過distinct關鍵字實現&#xff0c;但是當我們使用android提供的managedQuery()或getContentResolver().query()方法對數據庫進…

C語言試題106之有一對兔子問題

?作者簡介:大家好我是碼莎拉蒂,CSDN博客專家?????? ??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款模擬面試、刷題神器?? 點擊跳轉進入網站 1、題目 題目:有一對兔子,從出生后第 3 個月起每個月都生一對兔子,小兔子長到第三個月 后每個月又…

【C#程序設計】教學講義——第二章:簡單C#程序設計

教學目錄 2.1 面向對象的概念2.2 建立簡單的應用程序2.3 窗體和Label控件2.4 文本框-屬性2.5 按鈕控件本章小結2.1 面向對象的概念 2.1.1 對象和類 1.對象 對象是客觀世界中對象的模型化。對象是有著特殊數據(屬性)與操作(行為)的實體,對象的操作(行為)稱為方法。 程…

Blazor University (34)表單 —— 獲得表單狀態

原文鏈接&#xff1a;https://blazor-university.com/forms/accessing-form-state/獲得表單狀態源代碼[1]有時&#xff0c;我們需要獲得 <EditForm> 子內容中的表單狀態。最常見的用途是當我們需要訪問輸入的 CSS 類時&#xff0c;指示輸入是否被修改或有效/無效。例如&a…