Upgrade to Pro — share decks privately, control downloads, hide ads and more …

認証の仕組みとclient-go credential plugin / authentication and client-go credential plugin

認証の仕組みとclient-go credential plugin / authentication and client-go credential plugin

2019.8.28
Kubernetes Meetup Tokyo #22

Hidetake Iwata

August 28, 2019
Tweet

More Decks by Hidetake Iwata

Other Decks in Programming

Transcript

  1. 認証の仕組みと
    client-go credential plugin
    2019/8/28
    Kubernetes Meetup Tokyo #22
    Hidetake Iwata (@int128)

    View Slide

  2. View Slide

  3. 今日お話しすること
    お話しすること
    ● ユーザがKubernetesクライアント(kubectl)を操作する時,どのように認証情報
    を取得しているか?
    お話ししないこと
    ● 内部コンポーネントの認証(scheduler, kubelet等)

    View Slide

  4. Kubernetesの認証
    Kubernetesには不正なリクエストを防ぐために認証/認可がある.
    クライアントとサーバの間の認証は,TLSクライアント証明書,トークン,ユーザ名/パ
    スワードがサポートされている.
    kubectl
    (scheduler)
    (kubelet)
    ...
    kube-apiserver
    authorization: Bearer TOKEN
    authorization: Basic XXXXXX
    TLSクライアント証明書 CA証明書

    View Slide

  5. Kubernetesクライアントはkubeconfig(デフォルトでは~/.kube/config)に書いてある
    静的な認証情報を利用してAPIサーバにアクセスする.
    Kubernetesクライアントの認証情報
    kubectl
    client-go
    ~/.kube/config
    users:
    - name: hello-basic
    user:
    client-certificate-data: LS...
    client-key-data: LS…
    password: YOUR_PASSWORD
    username: YOUR_USERNAME
    - name: hello-token
    user:
    token: YOUR_TOKEN
    証明書と秘密鍵
    ユーザ名/パスワード
    トークン

    View Slide

  6. 疑問:認証情報を更新するには?
    Q: トークン認証を利用している場合に,クライアントがサーバに送るトークンを新しい
    ものに更新したい.どうする?
    A: ユーザにkubeconfigのトークンを書き換えてもらう.
    Q: ユーザがつらいのでは?
    A: ・・・

    View Slide

  7. auth-provider
    静的な認証情報を扱うだけでなく,動的に認証情報を取得する仕組みが用意されて
    いる.コンパイル時に認証モジュール(auth-provider)を組み込む.
    https://github.com/kubernetes/client-go/tree/master/plugin/pkg/client/auth で実装されている
    kubectl
    client-go
    ~/.kube/config
    auth-provider
    外部の認証情報
    kubectlには以下のauth-providerが
    組み込まれている.
    gcp, azure, openstack, oidc

    View Slide

  8. 疑問:組み込みモジュールの弊害
    Q: 僕が考えた最強の認証方式に対応してください.
    A: ではgithub.com/kubernetes/client-goにプルリクをオナシャス!!
    Q: 強者のクラウドベンダしか対応してもらえないのでは・・・
    A: ()

    View Slide

  9. client-go credential plugin
    コンパイル時にモジュールを組み込むのではなく,外部コマンドを実行して動的に認
    証情報を取得する仕組みが用意されている.(v1.11からbeta)
    kubectl
    client-go
    ~/.kube/config
    credential plugin
    外部の認証情報
    credential pluginはstdoutにJSON
    で認証情報を出力する.
    client-goはkubeconfigに書いてあ
    るcredential pluginを実行する.

    View Slide

  10. Credential plugin
    の利用場面

    View Slide

  11. aws-iam-authenticator(EKSのIAM認証)
    kubectlの実行時に裏でaws eks get-tokenを実行してトークンを取得する.ユーザは
    トークンを意識せずに透過的にKubernetesにアクセスできる.
    https://github.com/kubernetes-sigs/aws-iam-authenticator/pull/72 にてcredential pluginに対応
    kubectl
    client-go
    ~/.kube/config
    aws eks get-token
    IAM
    master
    kube-
    apiserver
    aws-iam-au
    thenticator
    IAM
    トークン

    View Slide

  12. kubelogin(OpenID Connect認証)
    kubectlの実行時に裏でkubelogin get-tokenを実行してIDトークンを取得する.ユー
    ザはトークンを意識せずに透過的にKubernetesにアクセスできる.
    kubectl
    client-go
    ~/.kube/config
    kubelogin get-token
    OIDC
    Provider
    kube-apiserver
    OIDC
    Provider
    トークン
    authenticator
    https://github.com/int128/kubelogin からインストールできる

    View Slide

  13. まとめ
    Kubernetesクライアントは以下からTLSクライアント証明書,トークン,ユーザ名/パス
    ワードといった認証情報を読み込んで,APIサーバに送信する.
    ● kubeconfigに書いてある静的な認証情報
    ● 認証モジュール(auth-provider)が実行時に返す認証情報
    ● 外部コマンド(credential plugin)が実行時に返す認証情報
    Special thanks: icons by https://icons8.com

    View Slide

  14. 参考資料
    ● 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-proposal
    s/auth/kubectl-exec-plugins/.

    View Slide