2019.8.28 Kubernetes Meetup Tokyo #22
認証の仕組みとclient-go credential plugin2019/8/28Kubernetes Meetup Tokyo #22Hidetake Iwata (@int128)
View Slide
今日お話しすることお話しすること● ユーザがKubernetesクライアント(kubectl)を操作する時,どのように認証情報を取得しているか?お話ししないこと● 内部コンポーネントの認証(scheduler, kubelet等)
Kubernetesの認証Kubernetesには不正なリクエストを防ぐために認証/認可がある.クライアントとサーバの間の認証は,TLSクライアント証明書,トークン,ユーザ名/パスワードがサポートされている.kubectl(scheduler)(kubelet)...kube-apiserverauthorization: Bearer TOKENauthorization: Basic XXXXXXTLSクライアント証明書 CA証明書
Kubernetesクライアントはkubeconfig(デフォルトでは~/.kube/config)に書いてある静的な認証情報を利用してAPIサーバにアクセスする.Kubernetesクライアントの認証情報kubectlclient-go~/.kube/configusers:- name: hello-basicuser:client-certificate-data: LS...client-key-data: LS…password: YOUR_PASSWORDusername: YOUR_USERNAME- name: hello-tokenuser:token: YOUR_TOKEN証明書と秘密鍵ユーザ名/パスワードトークン
疑問:認証情報を更新するには?Q: トークン認証を利用している場合に,クライアントがサーバに送るトークンを新しいものに更新したい.どうする?A: ユーザにkubeconfigのトークンを書き換えてもらう.Q: ユーザがつらいのでは?A: ・・・
auth-provider静的な認証情報を扱うだけでなく,動的に認証情報を取得する仕組みが用意されている.コンパイル時に認証モジュール(auth-provider)を組み込む.https://github.com/kubernetes/client-go/tree/master/plugin/pkg/client/auth で実装されているkubectlclient-go~/.kube/configauth-provider外部の認証情報kubectlには以下のauth-providerが組み込まれている.gcp, azure, openstack, oidc
疑問:組み込みモジュールの弊害Q: 僕が考えた最強の認証方式に対応してください.A: ではgithub.com/kubernetes/client-goにプルリクをオナシャス!!Q: 強者のクラウドベンダしか対応してもらえないのでは・・・A: ()
client-go credential pluginコンパイル時にモジュールを組み込むのではなく,外部コマンドを実行して動的に認証情報を取得する仕組みが用意されている.(v1.11からbeta)kubectlclient-go~/.kube/configcredential plugin外部の認証情報credential pluginはstdoutにJSONで認証情報を出力する.client-goはkubeconfigに書いてあるcredential pluginを実行する.
Credential pluginの利用場面
aws-iam-authenticator(EKSのIAM認証)kubectlの実行時に裏でaws eks get-tokenを実行してトークンを取得する.ユーザはトークンを意識せずに透過的にKubernetesにアクセスできる.https://github.com/kubernetes-sigs/aws-iam-authenticator/pull/72 にてcredential pluginに対応kubectlclient-go~/.kube/configaws eks get-tokenIAMmasterkube-apiserveraws-iam-authenticatorIAMトークン
kubelogin(OpenID Connect認証)kubectlの実行時に裏でkubelogin get-tokenを実行してIDトークンを取得する.ユーザはトークンを意識せずに透過的にKubernetesにアクセスできる.kubectlclient-go~/.kube/configkubelogin get-tokenOIDCProviderkube-apiserverOIDCProviderトークンauthenticatorhttps://github.com/int128/kubelogin からインストールできる
まとめKubernetesクライアントは以下からTLSクライアント証明書,トークン,ユーザ名/パスワードといった認証情報を読み込んで,APIサーバに送信する.● kubeconfigに書いてある静的な認証情報● 認証モジュール(auth-provider)が実行時に返す認証情報● 外部コマンド(credential plugin)が実行時に返す認証情報Special thanks: icons by https://icons8.com
参考資料● client-go credential pluginsの仕様,https://kubernetes.io/docs/reference/access-authn-authz/authentication/#client-go-credential-plugins● client-go credential pluginsのプロポーザル,https://stupefied-goodall-e282f7.netlify.com/contributors/design-proposals/auth/kubectl-exec-plugins/.