Kubernetes DashboardとAWS IAM認証
Amazon EKS #1 Advent Calendar 2019の13日目です。今日はKubernetes DashboardとIAM認証についてお話しします。
背景
Kubernetesのクラスタをチームで運用する場合、チーム全員がコマンドラインツールに習熟しているとは限らないため、GUIツールを併用することが望ましいです。新しく参画したメンバはKubernetesの概念に不慣れかもしれません。初学者はコマンドラインツールとGUIツールを併用することで、新しい概念を理解しやすくなり、効率的に学習を進められます。
KubernetesのGUIツールはいろいろありますが、まずは公式のKubernetes Dashboardを使ってみましょう。慣れてきたら別のGUIツールを探してみましょう。iOSのアプリもあります。
課題
AWSの公式チュートリアルでは、Service Accountを利用してEKSクラスタ上のKubernetes Dashboardにアクセスする方法が紹介されています。Kubernetes Dashboardを開くと下図のような入力画面が表示されるので、Service Accountのトークンを入力します。
チームでクラスタを利用する場合、Service Accountを共有すると以下のような課題があります。
- ユーザに応じた適切な権限付与ができない(アクセス制御)
- EKS Control Planeのログには同じService Accountが記録されるため、どのユーザが何の操作を行ったかを識別できない(ログ監査)
- 新規ユーザに安全な手段でトークンを共有する必要がある(Onboarding)
- ユーザがチームを離れた場合でもトークンが使えてしまう(Offboarding)
kubectlと同様にKubernetes DashboardでもIAM認証が使えると、これらの課題を解決できます。
本稿では、IAM認証を利用してKubernetes Dashboardにアクセスする方法を紹介します。
やってみよう
1. Kubernetes Dashboardをデプロイする
Kubernetes DashboardはHelm Chartを利用すると簡単にデプロイできます。以下のコマンドを実行します。
helm install stable/kubernetes-dashboard --namespace kube-system --name kubernetes-dashboard
Helmを利用しない場合は、以下のManifestをデプロイします。
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
2. kauthproxyをインストールする
kauthproxyコマンドはHomebrewからインストールできます。
brew install int128/kauthproxy/kauthproxy
Krewというプラグインマネージャを利用している場合は、以下のコマンドでインストールできます。
kubectl krew install auth-proxy
3. Kubernetes Dashboardを開く
Kubernetes Dashboardを開くには以下のコマンドを実行します。
kubectl auth-proxy -n kube-system https://kubernetes-dashboard.svc
このコマンドを実行すると、自動的にブラウザが開いてKubernetes Dashboardが表示されます。もしブラウザが表示されない場合は http://localhost:18000 を開いてください。
Kubernetes Dashboardはログイン済みの状態で表示されます。トークンを入力する必要はありません。
動作原理
aws-iam-authenticator
EKS Control Planeにはaws-iam-authenticatorが組み込まれており、KubernetesのUser AccountとIAMのユーザを紐づける役割を果たしています。詳しくは7日目に id:katainaka0503 さんが書かれた記事が参考になります。
EKSの推奨手順にしたがってkubeconfigを設定すると、kubectlコマンドを実行した契機でaws-iam-authenticatorが呼び出されます。aws-iam-authenticatorはSTSからトークンを取得し、標準出力を経由してkubectlコマンドにトークンを返します。kubectlコマンドはトークンを利用してEKS Control PlaneのAPIサーバにアクセスします。この一連の動作はEKS独自のものではなく、Kubernetesのclient-go credential pluginsを利用しています。
詳しくは下記のスライドを参照ください。
Kubernetes Dashboard
Kubernetes Dashboardは自身で認証の仕組みを持たず、HTTPリクエストに含まれるトークンをそのままAPIサーバに渡す設計になっています。したがって、aws-iam-authenticatorが取得したトークンをHTTPリクエストに付加することで、IAMユーザとしてKubernetes Dashboardにアクセスできます。
Kubernetes Dashboardの手前にリバースプロキシを入れると下図のようになります。
ここまでくると、kauthproxyが何をやっているか想像がつくかもしれません。
kauthproxy
kauthproxyにはリバースプロキシとポートフォワードの機能があります。
kauthproxyがやっていることは以下の3点です。
- aws-iam-authenticatorからトークンを取得する。
- Kubernetes DashboardのPodにポートフォワードする。
- リバースプロキシでHTTPリクエストの
authorization
ヘッダにトークンを付加する。
kauthproxyはEKSに限らず利用できる汎用的なツールになっています。1ではclient-go credentials pluginからトークンを取得しているため、aws-iam-authenticatorだけでなくOpenID Connectでも動作します。また、authorization
ヘッダを利用するアプリケーションであれば動作します。
まとめ
kauthproxyを利用すると、IAM認証を利用してKubernetes Dashboardにアクセスできます。