Webhook を使用した Kubernetes のタグベースの権限制御の実装

Webhook を使用した Kubernetes のタグベースの権限制御の実装

[[387807]]

Kubernetes は名前空間レベルの権限制御をサポートしています。ただし、これが当社の要件を満たさない場合もあります。たとえば、Akraino ICN プロジェクトでは、高度な権限要件がいくつかあり、複数のユーザーが同じ名前空間内の 1 つのリソースを作成、更新、または削除できますが、他のユーザーが作成したオブジェクトを更新または削除することはできません。

この要件を満たすために、Webhook を使用して Kubernetes にラベルベースの権限制御メカニズムを設計および実装しました。通常、Webhook はリソースを認証したり、リソースのデフォルト値を設定したりするために使用されます。この記事では、Webhook を使用して権限を制御します。

ライセンス制度の設計

Kubernetes では、ユーザーまたはサービス アカウントを 1 つ以上のロールにバインドできます。各ロールは権限ルールを定義します。たとえば、次の定義では、sdewan-test ロールがデフォルトの名前空間で Mwan3Rule タイプのカスタム リソース インスタンス (CR) を作成または更新でき、Mwan3Policy CR を取得できることが必要です。

  1. apiバージョン: rbac。認証.k8s.io/v1
  2. 種類: 役割
  3. メタデータ:
  4. 注釈:
  5. 名前: sdewan-test
  6. 名前空間:デフォルト 
  7. ルール:
  8. -apiグループ:
  9. - 「」  
  10. リソース:
  11. -mwan3ルール
  12. 動詞:
  13. -作成する 
  14. -アップデート 
  15. -apiグループ:
  16. - 「」  
  17. リソース:
  18. - mwan3ポリシー
  19. 動詞:
  20. - 得る

json 形式のアノテーション sdewan-bucket-type-permission を使用してロールを拡張しました。

注釈では、タグベースの権限を定義できます。たとえば、以下に示すロールは sdewan-test ロールの権限を拡張します。sdewan-test は、タグ sdewan-bucket-type=app-intent または sdewan-bucket-type=k8s-service を持つ Mwan3Rule (json キーはカスタム リソース タイプを指定します) CR のみを作成/更新できます。また、ラベル sdewan-bucket-type=app-intent を持つ Mwan3Policy CR のみを取得できます。

実際、ワイルドカードマッチングもサポートしています。たとえば、mwan3* を使用すると、mwan3policies と mwan3rules の両方に一致させることができます。

  1. apiバージョン: rbac。認証.k8s.io/v1
  2. 種類: 役割
  3. メタデータ:
  4. 注釈:
  5. sdewan バケットタイプの権限: |-
  6. { "mwan3rules" : [ "アプリインテント" , "k8sサービス" ],
  7. "mwan3policies" : [ "アプリインテント" ] }
  8. 名前: sdewan-test
  9. 名前空間:デフォルト 
  10. ルール:
  11. -apiグループ:
  12. - 「」  
  13. リソース:
  14. -mwan3ルール
  15. 動詞:
  16. -作成する 
  17. -アップデート 
  18. -apiグループ:
  19. - 「」  
  20. リソース:
  21. - mwan3ポリシー
  22. 動詞:
  23. - 得る

Kubernetes Webhook は、ロール注釈の解析を担当します。 Admission Webhook とは何かを簡単に説明しましょう。 Webhook は、通常 Kubernetes クラスター内のポッドとして実行される Web サービスと考えることができます。

Kubernetes API がリクエストを受信すると、kube-api はオブジェクトを etcd に保存する前に webhook API を呼び出すことができます。 Webhook が allowed=true を返す場合、kube-api はオブジェクトを etcd に永続化します。それ以外の場合、kube-api はリクエストを拒否します。

Webhook リクエストの本文には、Kubernetes API リクエストを誰が行っているかを示す userInfo というフィールドがあります。 Webhook はユーザー情報からロール情報を取得し、ロール注釈を取得できます。コメントに記述されたタグレベルの権限を CR タグと比較することで、Webhook はリクエストを許可するかどうかを決定できます。

アクセス制御システムの実装

Akraino ICN プロジェクトでは、kubebuilder フレームワークを使用してラベルベースの権限システムを実装しました。ここでの前提は、いくつかのカスタム リソース定義 (CRD) (Mwan3Policy や Mwan3Rule など) と対応するコントローラーが実装されていることです。

Kubebuilder は、基本的な CRD、コントローラー コード、および Webhook コードを生成できます。新しい Webhook を作成するには、次の kubebuilder コマンドを実行します。

  1. kubebuilderwebhookを作成--group batch --version v1 --kind CronJob --programmatic-validation  

このコマンドは、コントローラー ランタイム ビルダーを使用して認証 Webhook を作成します。このコマンドは、kube-api サーバーからの https リクエストを受け入れる webhook サーバーも作成します。さらに、http リクエスト本文を解析し、それを CRD 構造インスタンスに変換するコードも生成します。

開発者は、CRD インスタンスの内容を検証するためのコードを記述するだけで済みます。これはほとんどの Webhook 状況で役立ちます。しかし、CRD インスタンスではなく、https リクエストの本文にある UserInfo が必要なので、これは要件を満たしません。

kubebuilder によって生成された webhook サーバーを再利用しましたが、ハンドラーは独自に実装しました。上図はハンドラーの処理フローを示しています。ハンドラは、UserInfo を含む「admission.Request」を入力として受け入れます。ハンドラーでは、ユーザー ロール情報と CR ラベルを取得します。

  • ユーザーロール情報を取得します。

ユーザー情報はリクエスト本文にあります。 userinfo からロール情報を取得するには、ハンドラーは kube-api からユーザーのロール情報を要求する必要があります。ハンドラーは、認証としてサービス アカウント トークンを使用して、kube-api にリクエストを送信します。まず、ハンドラーはユーザーのロール バインディング情報を取得するための要求を送信します。次に、ロール バインディング情報からロール情報を取得するための 2 番目の要求を送信します。デフォルトでは、ロールバインディング リソースには ".subjects" フィールドにインデクサーがありません。つまり、ロールバインディングに次のインデクサーを追加しない限り、kube-api リクエストでロールバインディングをフィルター処理することはできません。

  1. err = mgr.GetFieldIndexer().IndexField(context.Background(), &rbacv1.RoleBinding{}, ".subjects" , func(rawObjruntime.Object) []string {
  2. var フィールド値[]文字列
  3. ロールバインディング := rawObj.(*rbacv1.RoleBinding)
  4. _の場合、subject := range rolebinding.Subjects {
  5. subject.Kind == "ServiceAccount"の場合{
  6. fieldValues ​​= append(fieldValues, fmt.Sprintf( "system:serviceaccount:%s:%s" , subject.Namespace, subject.Name ) )
  7. }それ以外{
  8. fieldValues ​​= append(fieldValues, subject.Name )
  9. }
  10. }
  11. フィールド値を返す
  • CR情報を取得する

ユーザーからのリクエストには、リソースの作成、更新、または削除などがあります。作成または更新リクエストの場合、ハンドラーはリクエスト本体から CR 情報を抽出します。削除リクエストの場合、ハンドラーはインスタンス全体ではなく、CR 名のみを取得できます。したがって、CR情報を取得するにはkube-apiを呼び出す必要があります。

  • ロールと ClusterRole を検討する

ClusterRole では、ロールに加えて、ユーザー権限も定義できます。違いは、Role は常に単一の名前空間内の権限を定義するのに対し、ClusterRole はクラスター全体にわたる権限を定義できることです。したがって、ClusterRole の注釈も確認する必要があります。ロール情報を解析するときは、CR と同じ名前空間を持つロールのみを考慮します。

テストと実験

ここでは、タグベースの権限をテストして実験する方法を説明します。 ICN では、この機能はいくつかの CRD/コントローラーとともに kubebuilder を介して開発されます。 Webhook は https をサポートしますが、http はサポートしません。そのため、Webhook サーバーの認証が必要になります。

cert-manager プラグインを使用して、Webhook サーバーの証明書を入力します。同時に、kube-api が webhook リクエストを送信するときに証明書を使用できるように、証明書を webhook 構成に挿入します。開発またはローカル テストのユースケースで、Webhook が Pod ではなくローカルから実行される場合は、証明書を手動で構成する必要があります。

ネットワーク接続が確立されると、テスト用のロールとロール バインディングを作成できます。次のロールを作成し、ユーザーにバインドしてみましょう。

  1. apiバージョン: rbac。認証.k8s.io/v1
  2. 種類: 役割
  3. メタデータ:
  4. 名前空間:デフォルト 
  5. 名前:作成意図
  6. 注釈:
  7. sdewan バケットタイプの権限: |-
  8. { "mwan3policies" : [ "アプリインテント" ] }
  9. ルール:
  10. - apiグループ: [ "batch.sdewan.akraino.org" ]
  11. リソース: [ "mwan3policies" ]
  12. 動詞: [ 「取得」 「監視」 「一覧表示」 「削除」 「作成」 ]

ユーザーは「sdewan-bucket-type:app-intent」タグ付きの mwan3policies を作成できますが、他のタグは作成できません。ここでの具体的な例としては、ユーザーは下の左側の CR は作成できますが、下の右側の CR は作成できないことが挙げられます。

下記の右側の CR を作成しようとすると、「サーバーからのエラー (ロールに権限がありません): 「config/samples/batch_v1alpha1_mwan3policy.yaml」の作成時にエラーが発生しました」というエラー メッセージが表示されます。

結論は

Webhook は Kubernetes の優れた機能であり、Kubernetes の柔軟性を高めます。開発者はこれを使用して多くの便利な機能を実装できます。

Controller-runtime プロジェクトはビルダー ツールを提供しており、これを使用して、検証 Webhook と変更 Webhook の 2 種類の Webhook を簡単に作成できます。検証 Webhook は kube-api リソースを検証するために使用され、ミュート Webhook はデフォルト値の設定など、リソース フィールドの値を更新できます。

場合によっては、これら 2 種類の Webhook のどちらも要件を満たさないことがあります。たとえば、この記事では、リソース本体に含まれていないユーザー情報を取得する必要があります。この場合、ビルダー ツールを使用するのではなく、ハンドラー コードの大部分を自分で開発する必要があります。

参考リンク:

Kubebuilder ブック: https://book.kubebuilder.io/introduction.html

コントローラーランタイムドキュメント: https://github.com/kubernetes-sigs/controller-runtime/blob/master/pkg/doc.go

Akraino SDEWAN エージェント設計: https://wiki.akraino.org/display/AK/Sdewan+config+Agent

ラベルベースの権限制御パッチ: https://gerrit.akraino.org/r/c/icn/sdwan/+/3509

※この記事の一部は https://01.org/kubernetes/blogs/chengli3/2020/implement-label-based-permission-control-kubernetes-using-webhook から翻訳したものです。違反行為があった場合は削除いたしますのでご連絡ください。

<<:  [Sticky JVM] 面接の質問がきっかけで「スタックフレーム」が登場! ! !

>>:  KubernetesがDockerに取って代わる理由

推薦する

racknerd: US クラスター (253IP、16 C セグメント)、月額 350 ドル、AMD Ryzen 3900X+128G DDR4+12.5T NVMe+1Gps 帯域幅

racknerd は、16 個の C セグメント、1Gbps の帯域幅へのアクセスを提供し、ほぼすべ...

VMware は、企業のデジタル変革を実現する最新アプリケーションの導入を加速します。

[51CTO.comよりオリジナル記事] 今年のVMworld 2020カンファレンスは、COVID...

仮想化データセンター向けレイヤー2テクノロジー

仮想化されたデータ センターでは、物理サーバーが仮想マシン (VM) と呼ばれる複数の論理サーバーに...

記事を製品と比較すると、より幅広い読者に届くかもしれません

ウェブサイトやブログの成功は、ウェブマスターの優れたマーケティング能力だけでなく、ウェブマスターが持...

企業サイト構築時に外部リンクの品質を判断する方法

ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービス多くのウェブマスターやウ...

ゼロコスト - ウェブサイトの更新と最適化の方法

ウェブサイトのコンテンツが重要視される現代では、多くの企業がウェブサイトの構築だけにとどまらず、ウェ...

ディディ、今回は本当に失敗するの?

最近、米国でひっそりと上場していた滴滴出行が国家安全法に基づくサイバーセキュリティ審査の対象となり、...

Baiduは贈り物は受け付けず、オリジナル作品のみ受け付けます

オリジナルコンテンツといえば、SEOを行う私のウェ​​ブマスターの友人たちは、オリジナルコンテンツに...

Netty を使用して高性能な分散サービス フレームワークを作成する方法は?

[[407122]] 1. Nettyとは何ですか?それは何ができるのでしょうか? Netty は、...

マルチクラウド/ハイブリッドIT環境の企業導入が主流になる

451 Research によると、2019 年までに企業の 69% がマルチクラウド/ハイブリッド...

中間レビュー: 2023 年に注目を集める Kubernetes スタートアップ 10 社

Kubernetes は、元の開発者である Google が、複数のクラスターとマシンにわたって何千...

母子向けサイトの動向は?

今日の社会において最も重要な家族関係は何でしょうか?夫婦関係?親子関係?義母と嫁の関係?親子関係こそ...

ウェブマスターネットワークからの毎日のレポート:JD.comが速達ライセンスを取得、Xiaomiは月間利益が1億円を超えたと主張

1. JD.comとUPSの速達ライセンス取得の背景:STOとSFエクスプレスが影響を受ける可能性6...