VaultのKubernetes Auth Methodsを理解する為に、以下の公式Docを読んだ内容をまとめてみる。
Overview
kubernetes
Auth Methodは、Kubernetes Service Account Tokenを用いてVaultに対して認証することができる。
この認証方法は、Kubernetes Podに対して、Vault Tokenを簡単に導入できる。
Authentication
Via the CLI
- デフォルトのpathは
/kubernetes
になる。 - もしこのAuth Methodが異なるpathで有効化されていれば、
-path=/my-path
のように指定する。
$ vault write auth/kubernetes/login role=demo jwt=...
Via the API
- デフォルトのendpointは、
auth/kubernetes/login
である。 - もしこのAuth Methodが異なるpathで有効化されていれば、その値を用いる。
- レスポンスはTokenを含み、
auth.client_token
の値として返ってくる。
$ curl \
--request POST \
--data '{"jwt": "your_service_account_jwt", "role": "demo"}' \
http://127.0.0.1:8200/v1/auth/kubernetes/login
Configuration
- ユーザやマシンが認証出来るようになる前に、Auth Methodが構成されている必要がある。
- これらのステップは、一般的には運用者あるいは構成管理ツールにて行われている必要がある。
1. Kubernetes Auth Methodを有効化する
$ vault auth enable kubernetes
2. VaultがKubernetesと接続する為に、/config
endpointを用いる。
- 利用可能なconfiguration optionsのリストは、APIドキュメントを参照すること。
$ vault write auth/kubernetes/config \
token_reviewer_jwt="reviewer_service_account_jwt" \
kubernetes_host=https://192.168.99.100:8443 \
kubernetes_ca_cert=@ca.crt
3. 名前付きRoleを作成する
- このRoleは
default
namespaceのvault-auth
Service Accountを認可し、それに対してdefault policyを付与する。
$ vault write auth/kubernetes/role/demo \
bound_service_account_names=vault-auth \
bound_service_account_namespaces=default \
policies=default \
ttl=1h
注意事項
- VaultがPodの認証に使用するpatternは、
JWT token
を、ネットワーク越しに共有することに依存している。 - security model of Vaultに記載があるように、Vaultは
trusted compute base
(セキュリティ関連のイベントを処理する部分)の一部であるため、これを許容される。 - 一般的に、Kubernetesアプリケーションは、
JWT token
を、他のアプリケーションと共有するべきではない。 - Podに代わってAPIを呼び出す事が出来てしまい、サードパーティ製品に対して、意図しないアクセス許可を与える可能性があるため。
Configuring Kubernetes
- このAuth Methodは、「与えられたJWTがまだ有効化かどうか」を検証する為に、Kubernetes TokenReview APIにアクセスする。
- Kubernetesは
--service-account-lookup
オプションと共に起動するべきである。- Kubernetes1.7でデフォルトになっているが、それ以前のバージョンではKubernetes API server起動時に設定する必要がある。
- これ以外の場合、Kubernetesで削除されたTokenが適切にRevokeされない。
- このAuth Methodで用いられてるService Accountは、TokenPreview APIに対してのアクセス権限をもつ必要がある。
- もしKubernetesがRBACロールを使用するように構成されている場合、Service Accountには、このAPIにアクセスする権限を付与する必要がある。
- 以下のCluterRoleBindingのサンプルは、これらのpermissionを与えたものである。
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: role-tokenreview-binding
namespace: default
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:auth-delegator
subjects:
- kind: ServiceAccount
name: vault-auth
namespace: default
API
Kubernete Auth PluginはHTTP APIを持っている。API docsに詳細が書いてある。