Kubernetes は API リクエストを認証、認可、アドミッション制御の順に処理します。認証はアイデンティティを確立し、 認可はそのアイデンティティが操作を実行できるかを決定し、アドミッションは受け入れたオブジェクトを検証または変更できます。 これらは別個の制御であり、個別に設定・監査すべきです。
OIDC による認証 #
OpenID Connect(OIDC)により、API サーバーは外部アイデンティティプロバイダーが発行したベアラートークンを検証できます。 API サーバーには issuer URL、クライアント ID、任意のユーザー名・グループクレームのマッピングを設定します。 issuer は API サーバーから到達可能であり、TLS 証明書が検証できなければなりません。
アイデンティティプロバイダーがユーザーライフサイクルと多要素認証を管理し、Kubernetes は有効なトークンからユーザー名とグループを受け取ります。
人に共有静的トークンを使ってはいけません。kubectl では承認済みの OIDC ログインプラグインまたは exec credential provider を使い、
長期資格情報を kubeconfig ファイルに保存せず短命トークンを更新します。
RBAC による認可 #
RBAC は Role と ClusterRole オブジェクトを通じてリソース型に対する verb を許可し、バインディングで権限を関連付けます。
Role は名前空間スコープであり、ClusterRole はクラスタースコープのアクセスを許可するか、名前空間内でバインドできます。
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: deployment-reader
namespace: payments
rules:
- apiGroups: ["apps"]
resources: ["deployments"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: developers-can-read-deployments
namespace: payments
subjects:
- kind: Group
name: payments-developers
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: deployment-reader
apiGroup: rbac.authorization.k8s.io必要な verb、リソース、名前空間、非リソース URL だけを最小範囲で許可します。厳格に管理されたプラットフォーム管理を除き、
cluster-admin、ワイルドカードの verb、ワイルドカードのリソースは避けます。提案した許可は kubectl auth can-i で確認します。
リソースとサービスアカウントの制御 #
ResourceQuota は名前空間全体の消費量を制限し、LimitRange はコンテナ単位の requests と limits を設定または制約します。
クォータだけでは公平なスケジューリングは保証されません。ワークロードは CPU とメモリの requests を指定し、名前空間には運用監視が必要です。
サービスアカウントはワークロードのアイデンティティです。不要な場所では自動トークンマウントを無効にし、 投影された短命トークンを使い、各ワークロードのサービスアカウントを最小権限のロールにバインドします。 アプリケーションに default サービスアカウントの広範な権限を与えてはいけません。アドミッションポリシー、Pod Security Standards、 ネットワークポリシー、イメージ制御は RBAC を補完しますが、置き換えるものはありません。
コメント
GitHub で閲覧・コメントする(投稿にはログインが必要です)