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に取って代わる理由

推薦する

高品質な外部リンクはどこから来るのでしょうか?

外部リンクは SEO 担当者にとって馴染み深いものですが、外部リンクだけでウェブサイトのランキングを...

MiniDates: 見知らぬ人のための出会い系サイト

世の中が「独身男性」で溢れかえっている現状を受けて、さまざまな出会い系アプリが登場し始めている。 L...

Docker 使用状況レポート 2018

[[235661]]概要: 5 つの調査結果は、コンテナの使用傾向を把握するのに役立ちます。より多く...

hosteons: INAP(ロサンゼルス+ニューヨーク)を追加、評価データ+複数の割引コードが引き続き放送

Hosteons の INAP データ センターは、実際には数日間稼働しています。最近何かの理由で遅...

ユーザーの行動とソーシャルメディアがSEOVIPの現在のランキングに影響を与えている

seovipの件は、常にSEO実務者の注目を集めてきました。20日間で1ページを使ってBaiduのホ...

ウェブサイトブランディングへの道: スローガン

ほぼすべての業界で、Industrial Bank のリーダーを見ることができます。ウェブサイトの人...

分析インデックスの原則と SEO

SEO の仕事は、検索エンジンによってインデックスされた Web ページを最適化して、ランキングを向...

ウェブサイトがキーワードを積み重ねることで検索エンジンからのペナルティを回避する理由の分析

いわゆるキーワードスタッフィングとは、ウェブページの記述規則によれば、前後の文脈と明らかに矛盾する、...

Pinduoduoの積極的な成長は、AlibabaとJD.comにとって悩みの種となっている

昨日、人民日報の記者の質問に答える中で、馬化騰氏は、先日の春節期間中、WeChatとWeChatの月...

クラウド コンピューティングを活用して IT 業界で環境の持続可能性を実現するにはどうすればよいでしょうか?

クラウド コンピューティング サービスは、主にエネルギー効率の向上と持続可能な慣行の促進を通じて、I...

エッジコンピューティングの6つの特徴

1. エッジコンピューティングとは何ですか?エッジ コンピューティングとは、ネットワーク、コンピュー...

ユーザーエクスペリエンスの背後にある8つのユーザー本能についての簡単な説明

編集者注: この記事は、Teambition チームの @娄昊川 が寄稿したものです。Teambit...

dedipath: ロサンゼルスの格安サーバー、月額 79 ドル、e3-1240v2/16g メモリ/500gSSD/1Gbps 帯域幅無制限トラフィック/20g 防御

dedipath は昔から皆さんに親しまれています。主にトラフィック無制限の独立サーバー (独立サー...

AWS Glue が AWS 中国 (寧夏) リージョンで利用可能になりました

Amazon グループ会社の Amazon Web Services, Inc. (AWS) は本日...