Kubernetes は主に API サーバーを通じて外部サービスを提供します。このようなシステムでは、セキュリティ制限が課されていない場合、リクエストが悪用され、クラスター全体が崩壊する可能性があります。 これを考慮して、Kubernetes は API にアクセスするユーザーに対して、認証と承認という対応するセキュリティ制御を提供します。認証はユーザーが誰であるかという問題を解決し、認可はユーザーが何ができるかという問題を解決します。適切な権限制御を通じてのみ、クラスター システム全体のセキュリティと信頼性が保証されます。 次の図は、API アクセスに必要な 3 つのステップ、つまり認証、承認、アクセスを示しています。この章ではリソース管理に重点を置いているため、アクセスについては説明しません。 認証認証とは、ユーザーが Kubernetes にログインできるかどうか、つまりユーザーが API サーバーにリクエストを送信できるかどうかを指します。 Kubernetes には、次の 2 種類のユーザーが存在します。
ユーザーの認証通常ユーザー 通常のユーザーは Kubernetes から独立しており、Kubernetes によって管理されません。これらのユーザーは次のとおりです。
ユーザーが Kubernetes 内に存在せず、Kubernetes によって管理されていない場合、どのように認証するのでしょうか? 一般的なアプリケーション システムの場合、ユーザーはユーザー名とパスワードを提供します。サーバーは、それらを受信すると、それらがデータベースに存在し、有効であるかどうかを確認します。一致すれば認証は成功し、一致しなければ認証は失敗します。 では、Kubernetes ではこれをどのように実現するのでしょうか? API 呼び出しを通じて通常のユーザーを追加することはできませんが、Kubernetes は証明書を通じてユーザーを巧みに認証します。つまり、有効な証明書を提供できる限り、どのユーザーでも Kubernetes ユーザー認証に合格できます。 ユーザー認証後、Kubernetes は証明書内の CN をユーザー名として使用し (たとえば、証明書に「/CN=joker」がある場合、ユーザー名は Joker になります)、組織をユーザー グループとして使用します。ユーザーの権限は、ユーザー名とユーザー グループにバインドされたロールによって決定されます。 サービスアカウント サービス アカウントは Kubernetes によって管理されます。これらは特定の名前空間にバインドされており、API サーバー自体によって、または kubectl クライアント ツールを使用するなどして API を呼び出すことによって作成できます。 通常のユーザーとは異なり、サービス アカウントには対応する Kubernetes オブジェクトがあります。サービス アカウントを作成すると、対応するシークレットが作成され、対応するパスワード情報が保存されます (バージョン 1.24.x では、対応するシークレットは作成されません)。作成されたポッドにサービス アカウントが指定されると、そのシークレットがポッドにマウントされ、ポッド内のプロセスが Kubernetes API にアクセスできるようになります。 認証戦略Kubernetes には次の認証方法があります。
HTTP リクエストが API サーバーに送信されると、Kubernetes はリクエストから次の情報を関連付けます。 ユーザー名: ユーザー名。エンドユーザーを識別するために使用される文字列。例: kube-admin または [email protected] UID: ユーザーID。ユーザーの一意のIDを表します。 グループ: 論理的に関連するユーザーのグループを表すユーザー グループ。 追加フィールド: 拡張フィールド、認証に必要なその他の情報 複数の認証方法を同時に有効にした場合、最初に認証に成功した認証方法が検証され、他の方法は認証されなくなることに注意してください。同時に、api-server は認証方法の順序を保証しません。正常に認証されたすべてのユーザーは、グループ「system:authenticated」に追加されます。 クライアント証明書認証にクライアント証明書を使用する場合は、Kubernetes に有効な証明書を提供する必要があります。この証明書は、外部証明書または Kubernetes 自体によって承認された証明書にすることができます。 外部証明書の場合は、API サーバーを起動してクライアント証明書の有効性を検証するときに、--client-ca-file=SOMEFILE パラメータを使用して外部証明書の CA およびその他の情報を入力する必要もあります。 認証が成功すると、Kubernetes は証明書の Subject CN をユーザー名として使用し、組織をユーザー グループ (グループ) として使用します。 無記名トークン ベアラー トークンを使用して HTTP クライアントを認証する場合、API サーバーは Bearer 形式の値を持つ Authorization という HTTP ヘッダーを期待します。ベアラー トークンは、HTTP のエンコードおよび引用メカニズムを使用して、HTTP ヘッダーの値フィールドに配置できる文字シーケンスである必要があります。たとえば、ベアラー トークンが 31ada4fd-adec-460c-809a-9e56ceb75269 の場合、HTTP ヘッダーには次のように表示されます。 承認:所有者31 ada4fd - adec - 460c - 809a - 9e56ceb75269 Kubernetes では、ベアラー トークンを使用する方法がいくつかあります。
静的トークンファイル 静的トークンを使用する場合、API サーバーは --token-auth-file=SOMEFILE を介して外部から CSV ファイルをインポートし、API サーバーはこのファイルから対応するユーザー名とユーザー グループを読み取ります。 クライアントがリクエストを行うと、API サーバーはリクエスト ヘッダー内の Bearer トークンとファイル内のトークンを比較し、トークンが有効かどうかを判断します。 サービス アカウント トークン サービス アカウントが手動または自動で作成されると、Kubernetes は自動的にサービス アカウント トークンを作成します。 v1.24 より前では、対応するシークレットが作成され、対応する名前空間に保存されます。 v1.24 以降では、シークレットは別途作成されなくなりました。代わりに、Pod が起動されると、kubelet は TokenRequest API を通じてトークンを生成し、それを Pod にマウントします。 前述のように、サービス アカウントは主にポッドに API サーバーにアクセスする機能を提供します。 Pod が作成されると、サービス アカウント トークンが Pod にマウントされ、Pod は API サーバーにアクセスできるようになります。 もちろん、サービス アカウント トークンは Pod 上だけでなく外部でも使用できます。 Kubernetes Cluster Management のクラスターインストールの章では、Kubernetes Dashboard にアクセスするためにトークンを使用する方法が紹介されており、このときにサービス アカウント トークンも使用されます。 OpenID Connect トークン OpenID Connect は OAuth2 認証方式です。 Kubernetes は、OAuth2 トークン レスポンス内の ID トークンを認証アクセスのベアラー トークンとして使用できます。 プロセスは次のとおりです。
ユーザーが認証に使用する方法に関係なく、認証に合格しても、ユーザーが操作する権限を持っていることを意味するわけではありません。最初の防御線を通過するだけです。次のステップは、ユーザーが特定の操作権限を持っているかどうかを判断するために認証を実行することです。 認証認証プロセスリクエストが認証に合格すると、承認フェーズに入ります。この段階で、Kubernetes はリクエストに必要なリソースにアクセスする権限があるかどうかを確認します。許可があれば、リクエストの処理を開始します。そうでない場合は、不十分な権限が返されます。 API サーバーはすべてのポリシーをチェックし、リクエスト内のアクションを許可するポリシーがあるかどうかを確認します。そうであれば、リクエストの実行が許可されます。それ以外の場合、リクエストは拒否され、403 エラーが返されます。複数の認証モジュールが設定されている場合、リクエストは順番に各テンプレートに対してチェックされます。いずれかのモジュールがチェックに失敗した場合、リクエストは拒否され、それ以上のチェックは実行されません。 Kubernetes が認証を実行する際、主に以下の情報をチェックします。
認証モジュールKubernetes は次の 4 つの認証モードを提供します。
ここでは、RBAC (ロールベースのアクセス制御) についてのみ紹介します。実際には、このモードは多くのシナリオで使用されます。 RBAC RBAC は、Kubernetes でよく使用される認証モードです。その基本的な概念は次のとおりです。 ルール: 異なる API グループに属する操作のセット。 ロール: ロールは、現在の名前空間に適用可能な Kubernetes API オブジェクトを操作するための一連のルールを定義するために使用されます。 ClusterRole: 名前空間によって制限されないクラスター ロール。 主体: 行為の対象となる人、つまり規則の対象。 RoleBinding: ロールとアクターをバインドし、名前空間で動作します。 ClusterRoleBinding: 名前空間の制限なしにクラスターのロールとアクターをバインドします。 ロールと ClusterRole Role と ClusterRole は、関連する権限の一連のルールを定義します。これらの権限は累積的です (操作を拒否するルールはありません)。 Role は Namespace レベルですが、ClusterRole はクラスター レベルです。 役割の定義は次のとおりです。 apiバージョン: rbac .authorization .k8s .io / v1 つまり、アクターは devops 名前空間内のポッドとデプロイメントに対して作成、削除、監視、一覧表示、取得操作を実行できるようになります。ロールは名前空間レベルであるため、上記のルールは devops 名前空間に対してのみ有効です。 ClusterRole の定義は次のとおりです。 apiバージョン: rbac .authorization .k8s .io / v1 これは、すべてのリソースに対する監視、一覧表示、および取得の権限があることを意味します。 すべての権限を定義する場合は、次のように verbs フィールドを定義できます。 動詞: [ 「取得」 、 「一覧表示」 、 「監視」 、 「作成」 、 「更新」 、 「パッチ」 、 「削除」 ] RoleBinding と ClusterRoleBinding ロール バインディングは、ロールで定義されたさまざまな権限を 1 人またはユーザー グループに付与します。ロール バインディングには、関連するサブジェクト (ユーザー、ユーザー グループ、サービス アカウントなどのサブジェクト) のセットと、付与されたロールへの参照が含まれます。名前空間内の権限は RoleBinding オブジェクトを通じて付与できますが、クラスター全体の権限は ClusterRoleBinding オブジェクトを通じて付与されます。 RoleBinding は、同じ名前空間で定義された Role オブジェクトを参照できます。次のように: apiバージョン: rbac .authorization .k8s .io / v1 これにより、joker ユーザーと role-demo ロールの間にバインド関係が確立されます。ジョーカー ユーザーは、認証システムにおける単なる論理的な概念です。 Keystone などの外部認証サービスを経由するか、API サーバーのユーザー名とパスワード ファイルを直接指定する必要があります。 上記の YAML ファイルの重要なフィールドの 1 つは、「件名」を定義する Subjects フィールドです。 kind は対象の種類を示し、次の 3 つの種類があります。
もう 1 つの重要なフィールドは roleRef です。これは、RoleBing オブジェクトが Role 名を通じて定義した Role オブジェクトを直接参照できることを定義し、それによってオペレーターとロール間のバインディング関係を定義します。 RoleBinding は名前空間レベルにあります。クラスター レベルの場合は、次のように ClusterRoleBinding を使用します。 apiバージョン: rbac .authorization .k8s .io / v1 上記の定義では、joker ユーザーは名前空間内のすべてのリソースに対する監視、一覧表示、および取得の権限を持ちます。 サービスアカウント サービスアカウントもアカウントの一種ですが、Kubernetes クラスターのユーザー (システム管理者、運用保守担当者、テナントユーザーなど) ではなく、Pod 内で実行されるプロセスに使用されます。これは、Pod 内のプロセスに必要な ID 証明を提供します。 ServiceAccount の承認プロセスを理解するために例を見てみましょう。 (1)まずServiceAccountを定義します。 APIバージョン: v1 単純な ServiceAccount には、単純な名前空間と名前のみが必要です。 (2)このServiceAccountに権限を割り当てるためのRoleBinding YAMLファイルを作成します。 apiバージョン: rbac .authorization .k8s .io / v1 次に、上記で定義した YAML ファイルを作成し、作成後の情報を表示します。 $ kubectl get sa -n devops 次に、ポッドを作成し、sa-demo サービス アカウントを使用します。 APIバージョン: v1 次のようにしてポッド情報を表示します。 $ kubectl get po - n devops ポッド- sa -デモ- oyaml 上記から、サービス アカウント トークンが Pod にマウントされていることがわかります。 $ kubectl exec -it -n devops pod -sa -demo --/bin/sh このうち、ca と crt は API サーバーへのアクセスに使用されます。 Pod を定義するときに spec.serviceAccountName プロパティを指定しない場合、システムは自動的に default の値を割り当てます。つまり、すべてのユーザーが同じ名前空間でデフォルトのサービス アカウントを使用することになります。 Subjects の種類には、User と ServiceAccount に加えて、ユーザーのグループを意味する Group もあります。 Kubernetes の外部認証サービスを構成する場合、このユーザー グループは外部認証サービスによって提供されます。 Kubernetes 組み込みユーザー ServiceAccount には、ユーザーとユーザー グループの概念もあります。 ServiceAccount の場合、Kubernetes 内の対応するユーザーは次のとおりです。 system : serviceaccount : <サービスアカウント名> ユーザーグループは次のとおりです。 system : serviceaccounts : <名前空間名> たとえば、次の RoleBinding を定義します。 科目: つまり、ロールのアクセス許可ルールは、devops 名前空間内のすべての ServiceAccounts に適用されます。 例えば: 科目: つまり、ロール ルールはクラスター全体のすべての ServiceAccount に適用されます。 Kubernetes には、system: で始まる組み込み ClusterRole が多数あり、kubectl get clusterrole を使用して表示できます。 さらに、Kubernetes では、ユーザーが直接使用できるように、次の 4 つの定義済み ClusterRole も提供されています。
RoleBinding または ClusterRolebinding を定義するときに直接使用できます。 やっとこれで、Kubernetes 権限管理の紹介は終了です。このセクションでは、主に認証と認可の一般的なプロセスと、Kubernetes で認証と認可を実装する方法について説明します。この章を学習すると、どのような認証ユーザーがいるのか、どのような認証戦略があるのか、RBAC を使用して認証を実装する方法を理解できるようになります。 |
<<: フルスタック クラウド ネットワーク テクノロジーにおける VPC/VBC の概要
>>: AWS、Google Cloud、Azure: クラウド コンピューティング大手のセキュリティ機能の比較
クリスマスが近づいており、人気の webhostingbuzz が半額プロモーションを開始し、サイト...
SEO は最近ますます難しくなってきています。現在、SEO はキーワードのランキングだけではなく、ユ...
UK2 グループの公式ウェブサイトでは、仮想ホスティング、ネイティブ UK IP、VPS、VPS ク...
戦争について書面で語ることは軍事戦略においては大きなタブーである。ビジネスは戦場のようなものです。自...
オンライン教育は起業分野でホットな話題になりつつあります。各方面の意見を読んでみると、話題のほとんど...
ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービスWeChatが使われるよ...
Baidu 緑大根アルゴリズムの導入から 1 か月が経ちました。Baidu 緑大根アルゴリズムが徐々...
まず、2つの興味深いマーケティング仮説を見てみましょう。仮説 1: いつか、Apple は本当にリン...
AWS は本日、グローバル テクノロジー サミット (上海) において、教育テクノロジー スタートア...
突然、Weiboにニュースが載りました:蒼井そらが下着を販売しています!驚きました、本当に驚きました...
最近では、クラウド上に配置されるアプリケーションがますます増えてきており、当社も例外ではありません。...
長い間何も書いていませんでした。今日は少し自由な気分なので、何か書きたいので、キーボードで何か入力す...
ほとんどのウェブマスターにとって、ウェブサイトのハッキングは日常的な話題ですが、もし自分が被害に遭っ...
『兵法書』にはこうあります。「三十六計の中で、最善のものが最良である。」どのような戦略であっても、必...
ここ数年、IoT プラットフォームについては多くの議論が行われてきました。アナリストは、今後発展して...