1. 程式人生 > >Kubernetes實現SSO登入 (二)

Kubernetes實現SSO登入 (二)

上一篇文章中,我們討論了Kubernetes的幾種使用者認證方法,還說了我的團隊在Pusher希望為我們的工程師建立一個無縫的SSO(單點登入)環境,以及是如何開始對Open ID Connect(OIDC)進行調查並找出解決方案的。

這其中有個問題是Kubernetes沒有登入的過程。通常,客戶端軟體會啟動登入,但kubectl沒有內建該功能。Kubernetes留給你去設計你自己的登入方式。

這篇文章,我將闡述如何實現讓工程師從終端登入以及我們在這過程中趟過的坑。

我們的身份提供商

實現SSO的第一步是把Dex設定為我們的身份提供商。Dex充當認證流程的代理,用Google GSuite帳戶對使用者進行身份驗證。


我們在Elastic Load Balancer後面使用AWS EC2例項集執行Dex,暴露一臺Dex來驗證所有Pusher內部的Kubernetes叢集。雖然可以在Kubernetes中執行Dex,在各個叢集分別驗證,但我們選擇了集中的方式。這意味著允許一個令牌訪問所有群集,但考慮到想用Dex撤銷令牌的功能,我們決定接受這個折衷的結果。

Kubernetes叢集連線到Dex,只在Kubernetes API伺服器的配置中新增一些引數:

# The URL where Dex was available
--oidc-issuer-url=https://auth.example.com/dex
# The client ID we configured in dex. Kubernetes will compare this to the `aud` field
# in any bearer token from Dex before accepting it.
--oidc-client-id=kubernetes
# Since Dex is configured with TLS, add the CA cert to initiate trust
--oidc-ca-file=/etc/kubernetes/ssl/dex-ca.pem
# The claim field to identify users. For us this means users are granted the username # of their Pusher email address
--oidc-username-claim=email

當使用Dex叢集生成的ID令牌時,Kubernetes可以驗證令牌並使用令牌驗證使用者。

當前的Dex版本不支援用OIDC聯結器進行令牌重新整理,所以Dex不會返回Google去確認該使用者是否還具備登入許可權。對此,我們已經在Github提交了請求,並且目前用我們的自定義實現。

連線kubectl——錯誤的開啟放式

開始接觸Dex,我用他們的示例程式生成了第一個ID令牌。
staticClients:
- id: kubernetes
redir 'http://127.0.0.1:5555/callback' # Allowed redirect URI
name: 'Kubernetes API'
secret: <SOME_SUPER_SECRET_STRING> # Pre-shared client-application secret

通過給Dex新增靜態客戶端並回調到127.0.0.1,我可以在膝上型電腦上執行示例程式,並用它生成我的第一個令牌。注意,Dex不會直接與應用程式互動,因此可以在回撥地址上配置客戶端。

Dex(和其他OIDC提供商)使用redirectURI的白名單來驗證請求使用者令牌的軟體身份。認證過程的令牌交換階段,通過向Dex傳送包含redirectURI的初始請求,Dex向其已知的客戶端(這次的場景是使用ID kubernetes)簽發ID令牌,並期待客戶端軟體提供匹配的共享金鑰。這保證了可信度並防止中間過程的人為攻擊。
./example-app -client-id=kubernetes -client-secret=<SOME_SUPER_SECRET_STRING> -issuer=https://auth.example.com/dex -issuer-root-ca=ca.pem

上述命令啟動了一個Web伺服器,並監聽127.0.0.1:5555(你可能注意到這正是Dex中redirectURI的一部分)。通過訪問該地址,我可以開始登入流程,並生成一個ID令牌和一個重新整理令牌。

有了這些資訊,我在kubeconfig檔案中添加了如下內容:

- name: [email protected]
user:
auth-provider:
config:
client-id: kubernetes
client-secret: <SOME_SUPER_SECRET_STRING> # Pre-shared client auth
id-token: <TOKEN_RETRIEVED_FROM_THE_EXAMPLE_APP>
idp-issuer-url: https://auth.example.com/dex
refresh-token: <REFRESH_TOKEN_RETRIEVED_FROM_THE_EXAMPLE_APP>
name: oidc

kubectl可以用該配置與Kubernetes群集互動,當ID令牌過期時,可以用重新整理令牌獲取新的ID令牌。

雖然這次嘗試還算成功,但我不想推廣這種登入方式,而想建立一個使用者友好的登入方式。對我而言,這種需要檢索金鑰,執行一個工具,然後將資訊從瀏覽器複製到kubeconfig的方式,算不上使用者友好的方式。

連線kubectl——使用者友好的方式

為了改善使用者體驗,我通過gcloud身份驗證登入流程找尋靈感。如果你沒有體驗過gcloud登入,則可以在終端用命令開啟瀏覽器的方式,開啟Google的登入畫面。登入後,它會指示您返回終端,告知您已登入且您的環境已配置。從Dex示例應用程式開始一步一步,我建立了一個工具(稱為k8s-auth)。

作為入職的一部分,Pusher的工程師需要簽入Vault。k8s-auth正是利用了這一點。我們在Vault中儲存了k8s-auth的配置,在執行時使用工程師的Vault令牌將其載入到程式。因此,假如我們要改共享的客戶端金鑰,我們只需要更新Vault。

k8s-auth使用kubernetes客戶端庫中的程式碼為該使用者配置kubeconfig,而不是在Web瀏覽器中出示令牌。由於我們的叢集遵循命名規則,因此我還添加了一項功能,將新叢集和相應上下文配置為同一應用程式的一部分。

當新工程師加入時,為了配置kubectl並連線到我們的叢集,他們按照以下說明操作:
  • 按照我們的入職說明登入Vault
  • 安裝k8s-auth和kubectl
  • 執行k8s-auth cluster1 cluster2 <想要連線的叢集名>
  • 執行kubectl config set-context來選擇群集。

如果我們撤銷了他們的令牌,他們只需要執行一次k8s-auth來生成一個新的ID令牌和refresh令牌。
961a7f68-kube-sso.gif

總結

我們希望使用者友好的SSO登入,能讓我們的工程師可以更好的使用kubectl。我們發現我們喜歡gcloud的身份驗證登入方式,併成功實現了。

通過對原有的擴充套件以及將叢集的配置整合到同一個工具,我們的工程師現在可以通過一種簡單的方式,對現有的及以後的叢集進行kubectl配置。

雖然我無法開源我們特定版本的k8s-auth,但我建立了一個抽象版的例子。你可以原封不動使用該例子來體驗OIDC登入流程,也可以將其作為你自己建立叢集登入工具的範本。

話說,kubectl並不是工程師們訪問API的唯一途徑。Kubernetes Dashboard也不提供OIDC的登入方法。在下一篇文章中,我將介紹我們設計的Dashboard SSO登入方式,以及它的實現方法。

相關推薦

Kubernetes實現SSO登入

上一篇文章中,我們討論了Kubernetes的幾種使用者認證方法,還說了我的團隊在Pusher希望為我們的工程師建立一個無縫的SSO(單點登入)環境,以及是如何開始對Open ID Connect(OIDC)進行調查並找出解決方案的。這其中有個問題是Kubernetes沒有登

【SSH進階之路】Struts基本原理 + 實現簡單登入

      上面博文,主要簡單的介紹了一下SSH的基本概念,比較巨集觀,作為初學者能夠有一個整體上的認識,個人認為對學習有很好的輔助功能,它不僅僅是一個“瞭望塔”,更是檢驗是否真正掌握所有內容的一個前

CAS實現單點登入:自定義的使用者驗證登入

上一篇演示單點登入服務端認證機制採用的是cas server預設的使用者名稱和密碼(admin/admin)。今天介紹正常專案中如何通過驗證DB中的使用者資料,來驗證使用者的密碼的合法性 自定義驗證登入有兩種方式: 採用cas-server預設的資料庫查詢

Android進階筆記:AIDL內部實現詳解

ucc == 筆記 null stack 直接 android 最好 public 接著上一篇分析的aidl的流程解析。知道了aidl主要就是利用Ibinder來實現跨進程通信的。既然是通過對Binder各種方法的封裝,那也可以不使用aidl自己通過Binder來實現跨進

Android開發技巧之:QQ第三方登入

接 android QQ第三方登入(一)  獲取登入使用者名稱資訊,這邊先抱怨一下,官方API有點坑 Constants原始碼類下就是找不到GRAPH_SIMPLE_USER_INFO這個屬性!無語! 根據官方提供返回的的JSONObject資訊解析:

RxDataSources與TableView中實現介面展示

通過按鈕重新整理介面引數,設定延時為2s // ViewController.swift // RxSwiftTest // // Created by travey on 2018/11/5. // Copyright © 2018年 ZhouShijie. All rights r

SSM整合系列之 基於Shiro框架實現自動登入RememberMe

一、前言:Shiro框架提供了記住我(RememerMe)的功能,比如我們訪問一些網站,關閉了瀏覽器,下次再開啟還是能記住你是誰,下次訪問的時候無需登入即可訪問,本文將實現記住我的功能。 專案git地址:https://github.com/gitcaiqing/SSM_DEMO.git

cas單點登入 客戶端與springboot整合

在springboot專案中實現cas單點登入統一認證,只需要在專案中配置 cas過濾器即可使用. 1. springboot專案pom.xml中 新增web支援依賴 、cas客戶端依賴包 <dependency> <groupId>org

Spring AOP實現原理筆記 -- 原始碼分析

1、註冊AnnotationAwareAspectJAutoProxyCreator 首先要了解Spring解析XML配置檔案時,遇到自定義節點是如何解析的。可以參考Spring自定義XML標籤解析及其原理分析 當Spring遇到這個標籤的時候,它會

windows下使用net-snmp實現agent擴充套件

剛剛實現了int型的get命令,可能更多的情況下,我們更需要的是字串型別的。在實現int型的時候,用到了netsnmp_register_int_instance這個函式,很自然想到如果是string型的,用類似的netsnmp_register_string_instanc

[原創] uniapp第三方登入

一般我們在進入登入頁面的時候回選擇登入方式,以按鈕的方式進行選擇觸發第三方的登入型別。 在小程式中的登入授權時,格式被確定為使用 vue檔案 <!-- #ifdef MP-WEIXIN --> <button type="primary" open-type=

實現簡單工廠

//建立一個工廠的環境 //賣車的商店 function CarShop(){}; CarShop.prototype = { constructor : CarShop, //還原構造器 sellC

應用統計學與R語言實現學習筆記——資料收集

Chapter 2 Data Collection 本篇是第二章,內容是資料收集。 1.資料來源 做科學研究離不開資料,而資料的來源有哪些呢? 這裡比較簡單地將資料來源分為兩類:直接(一手)資料和間接(二手)資料。 直接資料的資料獲取來源包括

Android廣播機制實現原始碼淺析

緊接著上篇的分析,我們現在來分析一下處理廣播的程式碼流程,也就是在方法queue.scheduleBroadcastsLocked();之後的操作 這些方法在BroadcastQueue.java中。在這裡能看到我們常說的廣播超時,以及我們重寫onReceive什麼時候執行

搭建redis叢集實現分散式快取

第一篇那redis的基礎命令都差不多講了一遍了,這篇就將怎麼配置叢集了,最後要達到的效果是一臺主redis,還有幾臺從的redis,每次資料都是同步的,當主redis掛掉了,那麼就會從幾臺從redis挑選出一臺作為主的redis,如果之後剛開始的主redis啟動以後,又會變為剛開始的狀態,   因為要做叢集

Python入門:模擬登入或註冊之requests處理帶token請求

首先說一下使用python模擬登入或註冊時,對於帶token的頁面怎麼登入註冊模擬的思路: 1、對於帶token的頁面,需要先從最開始的頁面獲取合法token 2、然後使用獲取到的合法token進行

CSS+JS實現圖片集展示

題目與上面的兩篇文章有所重複,但是內容與上兩篇上有所區別,本文中,實現的圖片集展示的效果為: 1、詳細圖和縮圖的同步展示; 2、圖片的自動播放; 3、顯示圖片的縮影圖的焦點顯示與別的圖片的遮蓋顯示; 4、滑鼠移動至詳圖顯示圖片控制控制元件。 具體效果圖如下: 初始化或

C語言實現貪吃蛇----區域性重新整理

前言: 在上一篇部落格《C語言實現貪吃蛇(一)—-陣列實現》,我們使用陣列來儲存座標,並且不斷的通過全屏重新整理的方式來實現蛇移動的動態效果。但是全屏重新整理使得該遊戲整個過程中的閃爍現象,究其原因,無非就是在於頻繁的清空與列印。 但是想想看,整個遊戲過程中

架構之路:nginx與IIS服務器搭建集群實現負載均衡

原創 not c盤 鏈接 發布 原創文章 hang 實戰 負載均衡 【前言】 在《架構之路:nginx與IIS服務器搭建集群實現負載均衡(一)》中小編簡單的講解了Nginx的原理!俗話說:光說不練假把式。接下來,小編就和大家一起來做個小Demo來體會一下Nginx的

自己實現Spring AOPJDK代理實現AOP

前言 上一篇文章自己實現Spring AOP(一)環境搭建及知識準備,我搭建好了專案也寫了一個例子,接下來我就要實現這個例子中的AOP功能。 在Spring中如果目標物件實現了介面,預設情況下會採用JDK的動態代理實現AOP,如果目標物件沒有實現介面,必須採