Kubernetes
Kubernetesドキュメントによると、KubernetesのAPIサーバーはOpenID Connect(OIDC)を使用して認証できます。 この記事では、Casdoorを使用してKubernetesで認証を設定する方法について説明します。
環境要件
開始する前に、以下の環境が整っていることを確認してください:
- Kubernetesクラスター。
- このようなデモウェブサイトのCasdoorアプリケーション。
- kubectlコマンドツール(オプション)。
Kubernetesのoidc-issuer-url
は、https://
プレフィックスを使用するURLのみを受け入れます。 したがって、CasdoorアプリケーションはHTTPSウェブサイトにデプロイされるべきです。
ステップ1:認証用のCasdoorアプリとユーザーアカウントを作成する
Casdoorアプリケーションに行き、Kubernetesという新しいアプリケーションを追加します。 作成したアプリにいくつかのグラントタイプを追加し、Name
、Organization
、client ID
、client Secret
を覚えておいてください。
次に、作成したアプリケーションに新しいユーザーを追加します。 ここで使用されるOrganization
とSignup application
は、以前に登録したアプリに対応している必要があります。
ステップ2:OIDC認証を使用してKubernetes APIサーバーを設定する
OIDCプラグインを有効にするには、APIサーバーに以下のフラグを設定する必要があります:
--oidc-issuer-url
:APIサーバーが公開署名キーを発見することを許可するプロバイダーのURL。--oidc-client-id
:すべてのトークンが発行される必要があるクライアントID。
この記事では、デモンストレーションのためにminikubeを使用しています。 以下のコマンドを使用して、起動時にminikubeのAPIサーバーのOIDCプラグインを設定できます:
minikube start --extra-config=apiserver.oidc-issuer-url=https://demo.casdoor.com --extra-config=apiserver.oidc-client-id=294b09fbc17f95daf2fe
ステップ3:OIDC認証をテストする
認証情報を取得する
kubectlにフロントエンドがないため、CasdoorサーバーにPOSTリクエストを送信することで認証を行うことができます。 以下は、CasdoorサーバーにPOSTリクエストを送信し、id_token
とrefresh_token
を取得するPythonのコードです:
import requests
import json
url = "https://demo.casdoor.com/api/login/oauth/access_token"
payload = json.dumps({
"grant_type": "password",
"client_id": "Kubernetes",
"client_secret": "72c65c3912aec24a9f3ec41b65a7577114ed2bae",
"username": "user_3u94sf",
"password": "123456"
})
response = requests.request("POST", url, data=payload)
print(response.text)
このコードを実行した後、以下のようなレスポンスを受け取るはずです:
{
"access_token": "xxx",
"id_token": "yyy",
"refresh_token": "zzz",
"token_type": "Bearer",
"expires_in": 72000,
"scope": ""
}
これで、取得したばかりのid_token
を使用してKubernetes APIサーバーで認証できます。
HTTPリクエストベースの認証
リクエストヘッダーにトークンを追加します。
curl https://www.xxx.com -k -H "Authorization: Bearer $(id_token)"
https://www.xxx.com
はKubernetes APIサーバーのデプロイメントアドレスです。
Kubectlクライアントベースの認証
設定ファイルメソッド
~/.kube/config
ファイルに以下の設定を書き込みます。 上記の設定ファイル内の各設定項目を、以前に取得した値に置き換える必要があります。
users:
- name: minikube
user:
auth-provider:
config:
client-id: Kubernetes
client-secret: 72c65c3912aec24a9f3ec41b65a7577114ed2bae
id-token: $(id_token)
idp-issuer-url: https://demo.casdoor.com
refresh-token: $(refresh_token)
name: oidc
これで、kubectlを使用して直接APIサーバーにアクセスできます。 テストコマンドを実行してみてください。
kubectl cluster-info
コマンドライン引数メソッド
または、kubectlのコマンドラインパラメータに直接id_token
を追加することで認証することもできます。
kubectl --token=$(id_token) cluster-info