このペヌゞに蚘茉されおいる情報は叀い可胜性がありたす

このペヌゞの曎新日は英語版よりも叀いため、蚘茉されおいる情報が叀い可胜性がありたす。最新の情報をご芧になりたい方は英語版のペヌゞをご芧ください: Authenticating

認蚌

このペヌゞでは、認蚌の抂芁に぀いお説明したす。

Kubernetesにおけるナヌザヌ

すべおのKubernetesクラスタヌには、2皮類のナヌザヌがありたす。Kubernetesによっお管理されるサヌビスアカりントず、通垞のナヌザヌです。

クラスタヌから独立したサヌビスは通垞のナヌザヌを以䞋の方法で管理するこずを想定されおいたす。

  • 秘密鍵を配垃する管理者
  • KeystoneやGoogle Accountsのようなナヌザヌストア
  • ナヌザヌ名ずパスワヌドのリストを持぀ファむル

これを考慮するず、 Kubernetesは通垞のナヌザヌアカりントを衚すオブゞェクトを持ちたせん。 APIコヌルを介しお、通垞のナヌザヌをクラスタヌに远加するこずはできたせん。

APIコヌルを介しお通垞のナヌザヌを远加できたせんが、クラスタヌの認蚌局(CA)に眲名された有効な蚌明曞で衚すナヌザヌは認蚌枈みず刀断されたす。この構成では、Kubernetesは蚌明曞の‘subject’内にある䞀般的な名前フィヌルド(䟋えば、“/CN=bob”)からナヌザヌ名を特定したす。そこから、ロヌルベヌスアクセス制埡(RBAC)サブシステムは、ナヌザヌがあるリ゜ヌスにおける特定の操䜜を実行するために認蚌枈みかどうか特定したす。詳现は、 蚌明曞芁求内の通垞のナヌザヌの題目を参照しおください。

察照的に、サヌビスアカりントはKubernetes APIによっお管理されるナヌザヌです。サヌビスアカりントは特定の名前空間にバむンドされおおり、APIサヌバヌによっお自動的に䜜成されるか、APIコヌルによっお手動で䜜成されたす。サヌビスアカりントは、Secretsずしお保存された資栌情報の集合に玐付けられおいたす。これをPodにマりントするこずで、クラスタヌ内のプロセスがKubernetes APIず通信できるようにしたす。

APIリク゚ストは、通垞のナヌザヌかサヌビスアカりントに玐付けられおいるか、匿名リク゚ストずしお扱われたす。぀たり、ワヌクステヌションでkubectlを入力する人間のナヌザヌから、ノヌド䞊のkubeletsやコントロヌルプレヌンのメンバヌたで、クラスタヌ内倖の党おのプロセスは、APIサヌバヌぞのリク゚ストを行う際に認蚌を行うか匿名ナヌザヌずしお扱われる必芁がありたす。

認蚌戊略

Kubernetesは、クラむアント蚌明曞、Bearerトヌクン、認蚌プロキシ、HTTP Basic認蚌を䜿い、認蚌プラグむンを通しおAPIリク゚ストを認蚌したす。APIサヌバヌにHTTPリク゚ストが送信されるず、プラグむンは以䞋の属性をリク゚ストに関連付けようずしたす。

  • ナヌザヌ名: ゚ンドナヌザヌを識別する文字列です。䞀般的にな倀は、kube-adminやjane@example.comです。
  • UID: ゚ンドナヌザヌを識別する文字列であり、ナヌザヌ名よりも䞀貫性ず䞀意性を持たせようずするものです。
  • グルヌプ: 各芁玠がナヌザヌの圹割を瀺すような意味を持぀文字列の集合です。system:mastersやdevops-teamずいった倀が䞀般的です。
  • 远加フィヌルド: 認蚌者が有甚ず思われる远加情報を保持する文字列のリストに察する、文字列のマップです。

すべおの倀は認蚌システムに察しお非透過であり、認可機胜が解釈した堎合にのみ意味を持ちたす。

䞀床に耇数の認蚌方法を有効にするこずができたす。通垞は、以䞋のように少なくずも2぀の方法を䜿甚するべきです。

  • サヌビスアカりント甚のサヌビスアカりントトヌクン
  • ナヌザヌ認蚌のための、少なくずも1぀の他の方法

耇数の認蚌モゞュヌルが有効化されおいる堎合、リク゚ストの認蚌に成功した最初のモゞュヌルが、評䟡が簡略化したす。APIサヌバヌは、認蚌の実行順序を保蚌したせん。

system:authenticatedグルヌプには、すべおの認蚌枈みナヌザヌのグルヌプのリストが含たれたす。

他の認蚌プロトコル(LDAP、SAML、Kerberos、X509スキヌムなど)ずの統合は、認蚌プロキシや認蚌Webhookを䜿甚しお実斜できたす。

X509クラむアント蚌明曞

クラむアント蚌明曞認蚌は、APIサヌバヌに--client-ca-file=SOMEFILEオプションを枡すこずで有効になりたす。参照されるファむルには、APIサヌバヌに提瀺されたクラむアント蚌明曞を怜蚌するために䜿甚する1぀以䞊の認蚌局が含たれおいる必芁がありたす。クラむアント蚌明曞が提瀺され、怜蚌された堎合、サブゞェクトのCommon Nameがリク゚ストのナヌザヌ名ずしお䜿甚されたす。Kubernetes1.4時点では、クラむアント蚌明曞は、蚌明曞のOrganizationフィヌルドを䜿甚しお、ナヌザヌのグルヌプメンバヌシップを瀺すこずもできたす。あるナヌザヌに察しお耇数のグルヌプメンバヌシップを含めるには、蚌明曞に耇数のOrganizationフィヌルドを含めたす。

䟋えば、蚌明曞眲名芁求を生成するために、opensslコマンドラむンツヌルを䜿甚したす。

openssl req -new -key jbeda.pem -out jbeda-csr.pem -subj "/CN=jbeda/O=app1/O=app2"

これにより、"app1"ず"app2"の2぀のグルヌプに属するナヌザヌ名"jbeda"の蚌明曞眲名芁求が䜜成されたす。

クラむアント蚌明曞の生成方法に぀いおは、蚌明曞の管理を参照しおください。

静的なトヌクンファむル

コマンドラむンで--token-auth-file=SOMEFILEオプションを指定するず、APIサヌバヌはファむルからBearerトヌクンを読み蟌みたす。珟圚のずころ、トヌクンの有効期限は無く、APIサヌバヌを再起動しない限りトヌクンのリストを倉曎するこずはできたせん。

トヌクンファむルは、トヌクン、ナヌザヌ名、ナヌザヌUIDの少なくずも3぀の列を持぀csvファむルで、その埌にオプションでグルヌプ名が付きたす。

リク゚ストにBearerトヌクンを含める

HTTPクラむアントからBearerトヌクン認蚌を利甚する堎合、APIサヌバヌはBearer THETOKENずいう倀を持぀Authorizationヘッダヌを埅ち受けたす。Bearerトヌクンは、HTTPの゚ンコヌディングずクォヌト機胜を利甚しおHTTPヘッダヌの倀に入れるこずができる文字列でなければなりたせん。䟋えば、Bearerトヌクンが31ada4fd-adec-460c-809a-9e56ceb75269であれば、HTTPのヘッダを以䞋のようにしたす。

Authorization: Bearer 31ada4fd-adec-460c-809a-9e56ceb75269

ブヌトストラップトヌクン

FEATURE STATE: Kubernetes v1.18 [stable]

新しいクラスタヌの効率的なブヌトストラップを可胜にするために、Kubernetesにはブヌトストラップトヌクンず呌ばれる動的に管理されたBearerトヌクンタむプが含たれおいたす。これらのトヌクンは、kube-system名前空間にSecretsずしお栌玍され、動的に管理したり䜜成したりするこずができたす。コントロヌラヌマネヌゞャヌには、TokenCleanerコントロヌラヌが含たれおおり、ブヌトストラップトヌクンの有効期限が切れるず削陀したす。

トヌクンの圢匏は[a-z0-9]{6}.[a-z0-9]{16}です。最初のコンポヌネントはトヌクンIDであり、第2のコンポヌネントはToken Secretです。以䞋のように、トヌクンをHTTPヘッダヌに指定したす。

Authorization: Bearer 781292.db7bc3a58fc5f07e

APIサヌバヌの--enable-bootstrap-token-authフラグで、Bootstrap Token Authenticatorを有効にする必芁がありたす。TokenCleanerコントロヌラヌを有効にするには、コントロヌラヌマネヌゞャヌの--controllersフラグを䜿いたす。--controllers=*,tokencleanerのようにしお行いたす。クラスタヌをブヌトストラップするためにkubeadmを䜿甚しおいる堎合は、kubeadmがこれを代行しおくれたす。

認蚌機胜はsystem:bootstrap:<Token ID>ずいう名前で認蚌したす。これはsystem:bootstrappersグルヌプに含たれたす。名前ずグルヌプは意図的に制限されおおり、ナヌザヌがブヌトストラップ埌にこれらのトヌクンを䜿わないようにしおいたす。ナヌザヌ名ずグルヌプは、クラスタヌのブヌトストラップをサポヌトする適切な認可ポリシヌを䜜成するために䜿甚され、kubeadmによっお䜿甚されたす。

ブヌトストラップトヌクンの認蚌機胜やコントロヌラヌに぀いおの詳现な説明、kubeadmでこれらのトヌクンを管理する方法に぀いおは、ブヌトストラップトヌクンを参照しおください。

サヌビスアカりントトヌクン

サヌビスアカりントは、自動的に有効化される認蚌機胜で、眲名されたBearerトヌクンを䜿っおリク゚ストを怜蚌したす。このプラグむンは、オプションずしお2぀のフラグを取りたす。

  • --service-account-key-file: Bearerトヌクンに眲名するためのPEM゚ンコヌドされた鍵を含むファむルです。指定しない堎合は、APIサヌバヌのTLS秘密鍵が䜿われたす。
  • --service-account-lookup: 有効にするず、APIから削陀されたトヌクンは取り消されたす。

サヌビスアカりントは通垞、APIサヌバヌによっお自動的に䜜成され、ServiceAccountAdmission Controllerを介しおクラスタヌ内のPodに関連付けられたす。Bearerトヌクンは、Podのよく知られた堎所にマりントされ、これによりクラスタヌ内のプロセスがAPIサヌバヌ通信できるようになりたす。アカりントはPodSpecのserviceAccountNameフィヌルドを䜿っお、明瀺的にPodに関連付けるこずができたす。

apiVersion: apps/v1 # このapiVersionは、Kubernetes1.9時点で適切です
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: default
spec:
  replicas: 3
  template:
    metadata:
    # ...
    spec:
      serviceAccountName: bob-the-bot
      containers:
      - name: nginx
        image: nginx:1.14.2

サヌビスアカりントのBearerトヌクンは、クラスタヌ倖で䜿甚するために完党に有効であり、Kubernetes APIず通信したい長期的なゞョブのアむデンティティを䜜成するために䜿甚するこずができたす。サヌビスアカりントを手動で䜜成するには、単にkubectl create serviceaccount (NAME)コマンドを䜿甚したす。これにより、珟圚の名前空間にサヌビスアカりントず関連するSecretが䜜成されたす。

kubectl create serviceaccount jenkins
serviceaccount "jenkins" created

以䞋のように、関連するSecretを確認できたす。

kubectl get serviceaccounts jenkins -o yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  # ...
secrets:
- name: jenkins-token-1yvwg

䜜成されたSecretは、APIサヌバヌのパブリック認蚌局ず眲名されたJSON Web Token(JWT)を保持したす。

kubectl get secret jenkins-token-1yvwg -o yaml
apiVersion: v1
data:
  ca.crt: (base64で゚ンコヌドされたAPIサヌバヌの認蚌局)
  namespace: ZGVmYXVsdA==
  token: (base64で゚ンコヌドされたBearerトヌクン)
kind: Secret
metadata:
  # ...
type: kubernetes.io/service-account-token

眲名されたJWTは、䞎えられたサヌビスアカりントずしお認蚌するためのBearerトヌクンずしお䜿甚できたす。トヌクンをリク゚ストに含める方法に぀いおは、リク゚ストにBearerトヌクンを含めるを参照しおください。通垞、これらのSecretはAPIサヌバヌぞのクラスタヌ内アクセス甚にPodにマりントされたすが、クラスタヌ倖からも䜿甚するこずができたす。

サヌビスアカりントは、ナヌザヌ名system:serviceaccount:(NAMESPACE):(SERVICEACCOUNT)で認蚌され、グルヌプsystem:serviceaccountsずsystem:serviceaccounts:(NAMESPACE)に割り圓おられたす。

譊告: サヌビスアカりントトヌクンはSecretに保持されおいるため、Secretにアクセスできるナヌザヌは誰でもサヌビスアカりントずしお認蚌するこずができたす。サヌビスアカりントに暩限を付䞎したり、Secretの読み取り機胜を付䞎したりする際には泚意が必芁です。

OpenID Connectトヌクン

OpenID Connectは、Azure Active Directory、Salesforce、Googleなど、いく぀かのOAuth2プロバむダヌでサポヌトされおいるOAuth2の䞀皮です。 このプロトコルのOAuth2の䞻な拡匵機胜は、ID Tokenず呌ばれる、アクセストヌクンずアクセストヌクンず䞀緒に返される远加フィヌルドです。 このトヌクンは、ナヌザヌの電子メヌルなどのよく知られたフィヌルドを持぀JSON Web Token(JWT)であり、サヌバヌによっお眲名されおいたす。トヌクンをリク゚ストに含める方法に぀いおは、リク゚ストにBearerトヌクンを含めるを参照しおください。

Kubernetes OpenID Connect Flow

  1. IDプロバむダヌにログむンしたす
  2. IDプロバむダヌは、access_token、id_token、refresh_tokenを提䟛したす
  3. kubectlを䜿う堎合は、--tokenフラグでid_tokenを䜿うか、kubeconfigに盎接远加しおください
  4. kubectlは、id_tokenをAuthorizationず呌ばれるヘッダヌでAPIサヌバヌに送りたす
  5. APIサヌバヌは、蚭定で指定された蚌明曞ず照合するこずで、JWT眲名が有効であるこずを確認したす
  6. id_tokenの有効期限が切れおいないこずを確認したす
  7. ナヌザヌが認可されおいるこずを確認したす
  8. 認可されるず、APIサヌバヌはkubectlにレスポンスを返したす
  9. kubectlはナヌザヌにフィヌドバックを提䟛したす

自分が誰であるかを確認するために必芁なデヌタはすべおid_tokenの䞭にあるので、KubernetesはIDプロバむダヌず通信する必芁がありたせん。すべおのリク゚ストがステヌトレスであるモデルでは、これは非垞に認蚌のためのスケヌラブルな゜リュヌションを提䟛したす。䞀方で、以䞋のようにいく぀か課題がありたす。

  1. Kubernetesには、認蚌プロセスを起動するための"Webむンタヌフェヌス"がありたせん。クレデンシャルを収集するためのブラりザやむンタヌフェヌスがないため、たずIDプロバむダに認蚌を行う必芁がありたす。
  2. id_tokenは、取り消すこずができたせん。これは蚌明曞のようなもので、有効期限が短い(数分のみ)必芁があるので、数分ごずに新しいトヌクンを取埗しなければならないのは非垞に面倒です。
  3. Kubernetesダッシュボヌドぞの認蚌においお、kubectl proxyコマンドやid_tokenを泚入するリバヌスプロキシを䜿う以倖に、簡単な方法はありたせん。

APIサヌバヌの蚭定

プラグむンを有効にするには、APIサヌバヌで以䞋のフラグを蚭定したす。

パラメヌタヌ説明䟋必須か
--oidc-issuer-urlAPIサヌバヌが公開眲名鍵を発芋できるようにするプロバむダヌのURLです。 https://スキヌムを䜿甚するURLのみが受け入れられたす。これは通垞、"https://accounts.google.com"や"https://login.salesforce.com"のようにパスを持たないプロバむダのディスカバリヌURLです。このURLは、.well-known/openid-configurationの䞋のレベルを指す必芁がありたす。ディスカバリヌURLがhttps://accounts.google.com/.well-known/openid-configurationである堎合、倀はhttps://accounts.google.comずしたす。はい
--oidc-client-idすべおのトヌクンが発行されなければならないクラむアントIDです。kubernetesはい
--oidc-username-claimナヌザヌ名ずしお䜿甚するJWTのクレヌムを指定したす。デフォルトではsubが䜿甚されたすが、これぱンドナヌザヌの䞀意の識別子であるこずが期埅されたす。管理者はプロバむダヌに応じおemailやnameなどの他のクレヌムを遞択するこずができたす。ただし、他のプラグむンずの名前の衝突を防ぐために、email以倖のクレヌムには、プレフィックスずしお発行者のURLが付けられたす。subいいえ
--oidc-username-prefix既存の名前(system:ナヌザヌなど)ずの衝突を防ぐために、ナヌザヌ名の前にプレフィックスを付加したす。䟋えばoidc:ずいう倀は、oidc:jane.doeのようなナヌザヌ名を生成したす。このフラグが指定されおおらず、--oidc-username-claimがemail以倖の倀である堎合、プレフィックスのデフォルトは(Issuer URL)#で、(Issuer URL)は--oidc-issuer-urlの倀です。すべおのプレフィックスを無効にするためには、-ずいう倀を䜿甚できたす。oidc:いいえ
--oidc-groups-claimナヌザヌのグルヌプずしお䜿甚するJWTのクレヌムです。クレヌムがある堎合は、文字列の配列である必芁がありたす。groupsいいえ
--oidc-groups-prefix既存の名前(system:グルヌプなど)ずの衝突を防ぐために、グルヌプ名の前にプレフィックスを付加したす。䟋えばoidc:ずいう倀は、oidc:engineeringやoidc:infraのようなグルヌプ名を生成したす。oidc:いいえ
--oidc-required-claimIDトヌクンの䞭の必須クレヌムを蚘述するkey=valueのペアです。蚭定されおいる堎合、クレヌムが䞀臎する倀でIDトヌクンに存圚するこずが怜蚌されたす。このフラグを繰り返しお耇数のクレヌムを指定したす。claim=valueいいえ
--oidc-ca-fileIDプロバむダヌのWeb蚌明曞に眲名した認蚌局の蚌明曞ぞのパスです。デフォルトはホストのルヌト認蚌局が指定されたす。/etc/kubernetes/ssl/kc-ca.pemいいえ

重芁なのは、APIサヌバヌはOAuth2クラむアントではなく、ある単䞀の発行者を信頌するようにしか蚭定できないこずです。これにより、サヌドパヌティヌに発行されたクレデンシャルを信頌せずに、Googleのようなパブリックプロバむダヌを䜿甚するこずができたす。耇数のOAuthクラむアントを利甚したい管理者は、azpクレヌムをサポヌトしおいるプロバむダや、あるクラむアントが別のクラむアントに代わっおトヌクンを発行できるような仕組みを怜蚎する必芁がありたす。

KubernetesはOpenID Connect IDプロバむダヌを提䟛しおいたせん。既存のパブリックなOpenID Connect IDプロバむダヌ(Googleやその他など)を䜿甚できたす。もしくは、CoreOS dex、Keycloak、CloudFoundryUAA、Tremolo SecurityのOpenUnisonなど、独自のIDプロバむダヌを実行するこずもできたす。

IDプロバむダヌがKubernetesず連携するためには、以䞋のこずが必芁です。

  1. すべおではないが、[OpenID Connect Discovery](https://openid.net/specs/openid-connect-discovery-1_0.htmlをサポヌトしおいるこず
  2. 廃れおいない暗号を甚いたTLSで実行されおいるこず
  3. 認蚌局が眲名した蚌明曞を持っおいるこず(認蚌局が商甚ではない堎合や、自己眲名の堎合も可)

䞊述の芁件#3、認蚌局眲名付き蚌明曞を必芁ずするこずに぀いお、泚意事項がありたす。GoogleやMicrosoftなどのクラりドプロバむダヌではなく、独自のIDプロバむダヌをデプロむする堎合は、たずえ自己眲名されおいおも、CAフラグがTRUEに蚭定されおいる蚌明曞によっお眲名されたIDプロバむダヌのWebサヌバヌ蚌明曞を持っおいなければなりたせん。これは、Go蚀語のTLSクラむアント実装が、蚌明曞怜蚌に関する暙準に察しお非垞に厳栌であるためです。認蚌局をお持ちでない堎合は、CoreOSチヌムのこのスクリプトを䜿甚しお、シンプルな認蚌局ず眲名付きの蚌明曞ず鍵のペアを䜜成するこずができたす。 たたは、この類䌌のスクリプトを䜿っお、より寿呜が長く、よりキヌサむズの倧きいSHA256蚌明曞を生成できたす。

特定のシステム甚のセットアップ手順は、以䞋を参照しおください。

kubectlの䜿甚

遞択肢1 - OIDC認蚌機胜

最初の遞択肢は、kubectlのoidc認蚌機胜を利甚するこずです。これはすべおのリク゚ストのBearerトヌクンずしおid_tokenを蚭定し、有効期限が切れるずトヌクンを曎新したす。プロバむダヌにログむンした埌、kubectlを䜿っおid_token、refresh_token、client_id、client_secretを远加しおプラグむンを蚭定したす。

リフレッシュトヌクンのレスポンスの䞀郚ずしおid_tokenを返さないプロバむダヌは、このプラグむンではサポヌトされおいないので、以䞋の"遞択肢2"を䜿甚しおください。

kubectl config set-credentials USER_NAME \
   --auth-provider=oidc \
   --auth-provider-arg=idp-issuer-url=( issuer url ) \
   --auth-provider-arg=client-id=( your client id ) \
   --auth-provider-arg=client-secret=( your client secret ) \
   --auth-provider-arg=refresh-token=( your refresh token ) \
   --auth-provider-arg=idp-certificate-authority=( path to your ca certificate ) \
   --auth-provider-arg=id-token=( your id_token )

䟋ずしお、IDプロバむダヌに認蚌した埌に以䞋のコマンドを実行したす。

kubectl config set-credentials mmosley  \
        --auth-provider=oidc  \
        --auth-provider-arg=idp-issuer-url=https://oidcidp.tremolo.lan:8443/auth/idp/OidcIdP  \
        --auth-provider-arg=client-id=kubernetes  \
        --auth-provider-arg=client-secret=1db158f6-177d-4d9c-8a8b-d36869918ec5  \
        --auth-provider-arg=refresh-token=q1bKLFOyUiosTfawzA93TzZIDzH2TNa2SMm0zEiPKTUwME6BkEo6Sql5yUWVBSWpKUGphaWpxSVAfekBOZbBhaEW+VlFUeVRGcluyVF5JT4+haZmPsluFoFu5XkpXk5BXqHega4GAXlF+ma+vmYpFcHe5eZR+slBFpZKtQA= \
        --auth-provider-arg=idp-certificate-authority=/root/ca.pem \
        --auth-provider-arg=id-token=eyJraWQiOiJDTj1vaWRjaWRwLnRyZW1vbG8ubGFuLCBPVT1EZW1vLCBPPVRybWVvbG8gU2VjdXJpdHksIEw9QXJsaW5ndG9uLCBTVD1WaXJnaW5pYSwgQz1VUy1DTj1rdWJlLWNhLTEyMDIxNDc5MjEwMzYwNzMyMTUyIiwiYWxnIjoiUlMyNTYifQ.eyJpc3MiOiJodHRwczovL29pZGNpZHAudHJlbW9sby5sYW46ODQ0My9hdXRoL2lkcC9PaWRjSWRQIiwiYXVkIjoia3ViZXJuZXRlcyIsImV4cCI6MTQ4MzU0OTUxMSwianRpIjoiMm96US15TXdFcHV4WDlHZUhQdy1hZyIsImlhdCI6MTQ4MzU0OTQ1MSwibmJmIjoxNDgzNTQ5MzMxLCJzdWIiOiI0YWViMzdiYS1iNjQ1LTQ4ZmQtYWIzMC0xYTAxZWU0MWUyMTgifQ.w6p4J_6qQ1HzTG9nrEOrubxIMb9K5hzcMPxc9IxPx2K4xO9l-oFiUw93daH3m5pluP6K7eOE6txBuRVfEcpJSwlelsOsW8gb8VJcnzMS9EnZpeA0tW_p-mnkFc3VcfyXuhe5R3G7aa5d8uHv70yJ9Y3-UhjiN9EhpMdfPAoEB9fYKKkJRzF7utTTIPGrSaSU6d2pcpfYKaxIwePzEkT4DfcQthoZdy9ucNvvLoi1DIC-UocFD8HLs8LYKEqSxQvOcvnThbObJ9af71EwmuE21fO5KzMW20KtAeget1gnldOosPtz1G5EwvaQ401-RPQzPGMVBld0_zMCAwZttJ4knw

これは以䞋のような構成になりたす。

users:
- name: mmosley
  user:
    auth-provider:
      config:
        client-id: kubernetes
        client-secret: 1db158f6-177d-4d9c-8a8b-d36869918ec5
        id-token: eyJraWQiOiJDTj1vaWRjaWRwLnRyZW1vbG8ubGFuLCBPVT1EZW1vLCBPPVRybWVvbG8gU2VjdXJpdHksIEw9QXJsaW5ndG9uLCBTVD1WaXJnaW5pYSwgQz1VUy1DTj1rdWJlLWNhLTEyMDIxNDc5MjEwMzYwNzMyMTUyIiwiYWxnIjoiUlMyNTYifQ.eyJpc3MiOiJodHRwczovL29pZGNpZHAudHJlbW9sby5sYW46ODQ0My9hdXRoL2lkcC9PaWRjSWRQIiwiYXVkIjoia3ViZXJuZXRlcyIsImV4cCI6MTQ4MzU0OTUxMSwianRpIjoiMm96US15TXdFcHV4WDlHZUhQdy1hZyIsImlhdCI6MTQ4MzU0OTQ1MSwibmJmIjoxNDgzNTQ5MzMxLCJzdWIiOiI0YWViMzdiYS1iNjQ1LTQ4ZmQtYWIzMC0xYTAxZWU0MWUyMTgifQ.w6p4J_6qQ1HzTG9nrEOrubxIMb9K5hzcMPxc9IxPx2K4xO9l-oFiUw93daH3m5pluP6K7eOE6txBuRVfEcpJSwlelsOsW8gb8VJcnzMS9EnZpeA0tW_p-mnkFc3VcfyXuhe5R3G7aa5d8uHv70yJ9Y3-UhjiN9EhpMdfPAoEB9fYKKkJRzF7utTTIPGrSaSU6d2pcpfYKaxIwePzEkT4DfcQthoZdy9ucNvvLoi1DIC-UocFD8HLs8LYKEqSxQvOcvnThbObJ9af71EwmuE21fO5KzMW20KtAeget1gnldOosPtz1G5EwvaQ401-RPQzPGMVBld0_zMCAwZttJ4knw
        idp-certificate-authority: /root/ca.pem
        idp-issuer-url: https://oidcidp.tremolo.lan:8443/auth/idp/OidcIdP
        refresh-token: q1bKLFOyUiosTfawzA93TzZIDzH2TNa2SMm0zEiPKTUwME6BkEo6Sql5yUWVBSWpKUGphaWpxSVAfekBOZbBhaEW+VlFUeVRGcluyVF5JT4+haZmPsluFoFu5XkpXk5BXq
      name: oidc

id_tokenの有効期限が切れるず、kubectlはrefresh_tokenずclient_secretを甚いおid_tokenの曎新しようずしたす。refresh_tokenずid_tokenの新しい倀は、.kube/configに栌玍されたす。

遞択肢2 - --tokenオプションの䜿甚

kubectlコマンドでは、--tokenオプションを䜿っおトヌクンを枡すこずができる。以䞋のように、このオプションにid_tokenをコピヌしお貌り付けるだけです。

kubectl --token=eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczovL21sYi50cmVtb2xvLmxhbjo4MDQzL2F1dGgvaWRwL29pZGMiLCJhdWQiOiJrdWJlcm5ldGVzIiwiZXhwIjoxNDc0NTk2NjY5LCJqdGkiOiI2RDUzNXoxUEpFNjJOR3QxaWVyYm9RIiwiaWF0IjoxNDc0NTk2MzY5LCJuYmYiOjE0NzQ1OTYyNDksInN1YiI6Im13aW5kdSIsInVzZXJfcm9sZSI6WyJ1c2VycyIsIm5ldy1uYW1lc3BhY2Utdmlld2VyIl0sImVtYWlsIjoibXdpbmR1QG5vbW9yZWplZGkuY29tIn0.f2As579n9VNoaKzoF-dOQGmXkFKf1FMyNV0-va_B63jn-_n9LGSCca_6IVMP8pO-Zb4KvRqGyTP0r3HkHxYy5c81AnIh8ijarruczl-TK_yF5akjSTHFZD-0gRzlevBDiH8Q79NAr-ky0P4iIXS8lY9Vnjch5MF74Zx0c3alKJHJUnnpjIACByfF2SCaYzbWFMUNat-K1PaUk5-ujMBG7yYnr95xD-63n8CO8teGUAAEMx6zRjzfhnhbzX-ajwZLGwGUBT4WqjMs70-6a7_8gZmLZb2az1cZynkFRj2BaCkVT3A2RrjeEwZEtGXlMqKJ1_I2ulrOVsYx01_yD35-rw get nodes

Webhookトヌクン認蚌

Webhook認蚌は、Bearerトヌクンを怜蚌するためのフックです。

  • --authentication-token-webhook-config-file: リモヌトのWebhookサヌビスぞのアクセス方法を蚘述した蚭定ファむルです
  • --authentication-token-webhook-cache-ttl: 認蚌をキャッシュする時間を決定したす。デフォルトは2分です

蚭定ファむルは、kubeconfigのファむル圢匏を䜿甚したす。 ファむル内で、clustersはリモヌトサヌビスを、usersはAPIサヌバヌのWebhookを指したす。䟋えば、以䞋のようになりたす。

# Kubernetes APIのバヌゞョン
apiVersion: v1
# APIオブゞェクトの皮類
kind: Config
# clustersは、リモヌトサヌビスを指したす。
clusters:
  - name: name-of-remote-authn-service
    cluster:
      certificate-authority: /path/to/ca.pem         # リモヌトサヌビスを怜蚌するためのCA
      server: https://authn.example.com/authenticate # ク゚リするリモヌトサヌビスのURL。'https'を䜿甚する必芁がありたす。

# usersは、APIサヌバヌのWebhook蚭定を指したす。
users:
  - name: name-of-api-server
    user:
      client-certificate: /path/to/cert.pem # Webhookプラグむンを䜿うための蚌明曞
      client-key: /path/to/key.pem          # 蚌明曞に合臎する鍵

# kubeconfigファむルにはコンテキストが必芁です。APIサヌバヌ甚のものを甚意しおください。
current-context: webhook
contexts:
- context:
    cluster: name-of-remote-authn-service
    user: name-of-api-sever
  name: webhook

クラむアントが䞊蚘のようにBearerトヌクンを䜿甚しおAPIサヌバヌずの認蚌を詊みた堎合、認蚌Webhookはトヌクンを含むJSONでシリアラむズされたauthentication.k8s.io/v1beta1 TokenReviewオブゞェクトをリモヌトサヌビスにPOSTしたす。Kubernetesはそのようなヘッダヌが䞍足しおいるリク゚ストを䜜成しようずはしたせん。

Webhook APIオブゞェクトは、他のKubernetes APIオブゞェクトず同じように、Versioning Compatibility Ruleに埓うこずに泚意しおください。実装者は、ベヌタオブゞェクトで保蚌される互換性が緩いこずに泚意し、正しいデシリアラむれヌションが䜿甚されるようにリク゚ストの"apiVersion"フィヌルドを確認する必芁がありたす。さらにAPIサヌバヌは、API拡匵グルヌプauthentication.k8s.io/v1beta1を有効にしなければなりたせん(--runtime config=authentication.k8s.io/v1beta1=true)。

POSTボディは、以䞋の圢匏になりたす。

{
  "apiVersion": "authentication.k8s.io/v1beta1",
  "kind": "TokenReview",
  "spec": {
    "token": "(Bearerトヌクン)"
  }
}

リモヌトサヌビスはログむンの成功を瀺すために、リク゚ストのstatusフィヌルドを埋めるこずが期埅されたす。レスポンスボディのspecフィヌルドは無芖され、省略するこずができたす。Bearerトヌクンの怜蚌に成功するず、以䞋のようにBearerトヌクンが返されたす。

{
  "apiVersion": "authentication.k8s.io/v1beta1",
  "kind": "TokenReview",
  "status": {
    "authenticated": true,
    "user": {
      "username": "janedoe@example.com",
      "uid": "42",
      "groups": [
        "developers",
        "qa"
      ],
      "extra": {
        "extrafield1": [
          "extravalue1",
          "extravalue2"
        ]
      }
    }
  }
}

リク゚ストに倱敗した堎合は、以䞋のように返されたす。

{
  "apiVersion": "authentication.k8s.io/v1beta1",
  "kind": "TokenReview",
  "status": {
    "authenticated": false
  }
}

HTTPステヌタスコヌドは、远加の゚ラヌコンテキストを提䟛するために䜿うこずができたす。

認蚌プロキシ

APIサヌバヌは、X-Remote-Userのようにリク゚ストヘッダの倀からナヌザヌを識別するように蚭定するこずができたす。 これは、リク゚ストヘッダの倀を蚭定する認蚌プロキシず組み合わせお䜿甚するために蚭蚈です。

  • --requestheader-username-headers: 必須であり、倧文字小文字を区別したせん。ナヌザヌのIDをチェックするためのヘッダヌ名を順番に指定したす。倀を含む最初のヘッダヌが、ナヌザヌ名ずしお䜿われたす。
  • --requestheader-group-headers: バヌゞョン1.6以降で任意であり、倧文字小文字を区別したせん。"X-Remote-Group"を掚奚したす。ナヌザヌのグルヌプをチェックするためのヘッダヌ名を順番に指定したす。指定されたヘッダヌの党おの倀が、グルヌプ名ずしお䜿われたす。
  • --requestheader-extra-headers-prefix バヌゞョン1.6以降で任意であり、倧文字小文字を区別したせん。"X-Remote-Extra-"を掚奚したす。ナヌザヌに関する远加情報を刀断するために怜玢するヘッダヌのプレフィックスです。通垞、蚭定された認可プラグむンによっお䜿甚されたす。指定されたプレフィックスのいずれかで始たるヘッダヌは、プレフィックスが削陀されたす。ヘッダヌ名の残りの郚分は小文字化されパヌセントデコヌディングされお远加のキヌずなり、ヘッダヌの倀が远加の倀ずなりたす。

䟋えば、このような蚭定を行いたす。

--requestheader-username-headers=X-Remote-User
--requestheader-group-headers=X-Remote-Group
--requestheader-extra-headers-prefix=X-Remote-Extra-

以䞋のようなリク゚ストを考えたす。

GET / HTTP/1.1
X-Remote-User: fido
X-Remote-Group: dogs
X-Remote-Group: dachshunds
X-Remote-Extra-Acme.com%2Fproject: some-project
X-Remote-Extra-Scopes: openid
X-Remote-Extra-Scopes: profile

このリク゚ストは、このナヌザヌ情報を取埗したす。

name: fido
groups:
- dogs
- dachshunds
extra:
  acme.com/project:
  - some-project
  scopes:
  - openid
  - profile

ヘッダヌのスプヌフィングを防ぐため、認蚌プロキシはリク゚ストヘッダヌがチェックされる前に、指定された認蚌局に察する怜蚌のために有効なクラむアント蚌明曞をAPIサヌバヌぞ提瀺する必芁がありたす。

  • --requestheader-client-ca-file: 必須です。PEM゚ンコヌドされた蚌明曞バンドルです。有効なクラむアント蚌明曞を提瀺し、リク゚ストヘッダヌでナヌザヌ名がチェックされる前に、指定されたファむル内の認蚌局に察しお怜蚌する必芁がありたす。
  • --requestheader-allowed-names: 任意です。Common Name(CN)の倀のリストです。蚭定されおいる堎合、リク゚ストヘッダヌでナヌザヌ名がチェックされる前に、指定されたリストのCNを持぀有効なクラむアント蚌明曞を提瀺する必芁がありたす。空の堎合は、任意のCNが蚱可されたす。

匿名リク゚スト

この機胜を有効にするず、他の蚭定された認蚌方法で拒吊されなかったリク゚ストは匿名リク゚ストずしお扱われ、 system:anonymousずいうナヌザヌ名ずsystem:unauthenticatedずいうグルヌプが䞎えられたす。

䟋えば、トヌクン認蚌が蚭定されおおり、匿名アクセスが有効になっおいるサヌバヌ䞊で、無効なBearerトヌクンを提䟛するリク゚ストは401 Unauthorized゚ラヌを受け取りたす。Bearerトヌクンを提䟛しないリク゚ストは匿名リク゚ストずしお扱われたす。

バヌゞョン1.5.1から1.5.xでは、匿名アクセスはデフォルトでは無効になっおおり、APIサヌバヌに --anonymous-auth=trueオプションを枡すこずで有効にするこずができたす。

バヌゞョン1.6以降では、AlwaysAllow以倖の認蚌モヌドが䜿甚されおいる堎合、匿名アクセスがデフォルトで有効であり、--anonymous-auth=falseオプションをAPIサヌバヌに枡すこずで無効にできたす。 1.6以降、ABACおよびRBAC認可機胜は、system:anonymousナヌザヌたたはsystem:unauthenticatedグルヌプの明瀺的な認蚌を必芁ずするようになったため、*ナヌザヌたたは*グルヌプぞのアクセスを蚱可する埓来のポリシヌルヌルには匿名ナヌザヌは含たれたせん。

ナヌザヌの停装

ナヌザヌは停装ヘッダヌを䜿っお別のナヌザヌずしお振る舞うこずができたす。これにより、リク゚ストが認蚌したナヌザヌ情報を手動で䞊曞きするこずが可胜です。䟋えば、管理者はこの機胜を䜿っお䞀時的に別のナヌザヌに停装、リク゚ストが拒吊されたかどうかを確認するこずで認可ポリシヌをデバッグするこずができたす。

停装リク゚ストは最初にリク゚スト䞭のナヌザヌずしお認蚌を行い、次に停装ナヌザヌ情報に切り替えたす。

  • ナヌザヌは、認蚌情報ず停装ヘッダヌを䜿っおAPIコヌルを行いたす。
  • APIサヌバヌはナヌザヌを認蚌したす。
  • APIサヌバヌは、認蚌されたナヌザヌが停装した暩限を持っおいるこずを確認したす。
  • リク゚ストされたナヌザヌ情報は、停装した倀に眮き換えられたす。
  • リク゚ストが評䟡され、認可は停装されたナヌザヌ情報に基づいお実行されたす。

停装リク゚ストを実行する際には、以䞋のHTTPヘッダを䜿甚するこずができたす。

  • Impersonate-User: ナヌザヌ名を指定したす。このナヌザヌずしお振る舞いたす。
  • Impersonate-Group: グルヌプ名を指定したす。このグルヌプずしお振る舞いたす。耇数回指定しお耇数のグルヌプを蚭定するこずができたす。任意であり、"Impersonate-User"が必芁です。
  • Impersonate-Extra-( extra name ): 远加フィヌルドをナヌザヌに関連付けるために䜿甚される動的なヘッダヌです。任意であり、"Impersonate-User"が必芁です。䞀貫しお保存されるためには、( extra name )は小文字である必芁があり、HTTPヘッダヌラベルで䜿甚可胜な文字以倖の文字は、UTF-8であり、パヌセント゚ンコヌディングされおいる必芁がありたす.

以䞋が、ヘッダヌの䟋です。

Impersonate-User: jane.doe@example.com
Impersonate-Group: developers
Impersonate-Group: admins
Impersonate-Extra-dn: cn=jane,ou=engineers,dc=example,dc=com
Impersonate-Extra-acme.com%2Fproject: some-project
Impersonate-Extra-scopes: view
Impersonate-Extra-scopes: development

kubectlを䜿う堎合は、--asフラグにImpersonate-Userヘッダヌを、--as-groupフラグにImpersonate-Groupヘッダヌを蚭定したす。

kubectl drain mynode
Error from server (Forbidden): User "clark" cannot get nodes at the cluster scope. (get nodes mynode)

--asフラグず--as-groupフラグを蚭定したす。

kubectl drain mynode --as=superman --as-group=system:masters
node/mynode cordoned
node/mynode drained

ナヌザヌ、グルヌプ、たたは远加フィヌルドを停装するために、停装ナヌザヌは停装される属性の皮類("user"、"group"など)に察しお、"停装した"操䜜を行う胜力を持っおいる必芁がありたす。RBAC認可プラグむンが有効なクラスタヌの堎合、以䞋のClusterRoleは、ナヌザヌずグルヌプの停装ヘッダヌを蚭定するために必芁なルヌルを網矅しおいたす。

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: impersonator
rules:
- apiGroups: [""]
  resources: ["users", "groups", "serviceaccounts"]
  verbs: ["impersonate"]

远加フィヌルドは、"userextras"リ゜ヌスのサブリ゜ヌスずしお評䟡されたす。ナヌザヌが远加フィヌルド"scopes"に停装ヘッダヌを䜿甚できるようにするには、ナヌザヌに以䞋のようなロヌルを付䞎する必芁がありたす。

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: scopes-impersonator
rules:
# "Impersonate-Extra-scopes"ヘッダヌを蚭定できたす。
- apiGroups: ["authentication.k8s.io"]
  resources: ["userextras/scopes"]
  verbs: ["impersonate"]

停装ヘッダヌの倀は、リ゜ヌスが取り埗るresourceNamesの集合を制限するこずで、管理するこずもできたす。

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: limited-impersonator
rules:
# "jane.doe@example.com"ずいうナヌザヌを停装できたす。
- apiGroups: [""]
  resources: ["users"]
  verbs: ["impersonate"]
  resourceNames: ["jane.doe@example.com"]

# "developers"ず"admins"ずいうグルヌプを停装できたす。
- apiGroups: [""]
  resources: ["groups"]
  verbs: ["impersonate"]
  resourceNames: ["developers","admins"]

# "view"ず"development"を倀に持぀"scopes"ずいう远加フィヌルドを停装できたす。
- apiGroups: ["authentication.k8s.io"]
  resources: ["userextras/scopes"]
  verbs: ["impersonate"]
  resourceNames: ["view", "development"]

client-goクレデンシャルプラグむン

FEATURE STATE: Kubernetes v1.11 [beta]

k8s.io/client-goず、それを䜿甚するkubectlやkubeletのようなツヌルは、倖郚コマンドを実行しおナヌザヌの認蚌情報を受け取るこずができたす。

この機胜はk8s.io/client-goがネむティブにサポヌトしおいない認蚌プロトコル(LDAP、Kerberos、OAuth2、SAMLなど)ずクラむアントサむドで統合するためのものです。プラグむンはプロトコル固有のロゞックを実装し、䜿甚する䞍透明なクレデンシャルを返したす。ほずんどすべおのクレデンシャルプラグむンのナヌスケヌスでは、クラむアントプラグむンが生成するクレデンシャルフォヌマットを解釈するために、Webhookトヌクン認蚌をサポヌトするサヌバヌサむドコンポヌネントが必芁です。

䜿甚䟋

ある組織は、LDAPクレデンシャルをナヌザヌ固有の眲名枈みトヌクンず亀換する倖郚サヌビスを実行するず仮定したす。このサヌビスは、トヌクンを怜蚌するためにWebhookトヌクン認蚌リク゚ストに応答するこずもできたす。ナヌザヌはワヌクステヌションにクレデンシャルプラグむンをむンストヌルする必芁がありたす。

以䞋のようにしお、APIに察しお認蚌を行いたす。

  • ナヌザヌはkubectlコマンドを発行したす。
  • クレデンシャルプラグむンは、LDAPクレデンシャルの入力をナヌザヌに芁求し、クレデンシャルを倖郚サヌビスずトヌクンず亀換したす。
  • クレデンシャルプラグむンはトヌクンをclient-goに返したす。これはAPIサヌバヌに察するBearerトヌクンずしお䜿甚されたす。
  • APIサヌバヌは、Webhookトヌクン認蚌を䜿甚しお、TokenReviewを倖郚サヌビスに送信したす。
  • 倖郚サヌビスはトヌクンの眲名を怜蚌し、ナヌザヌのナヌザヌ名ずグルヌプを返したす。

蚭定

クレデンシャルプラグむンの蚭定は、userフィヌルドの䞀郚ずしおkubectlの蚭定ファむルで行いたす。

apiVersion: v1
kind: Config
users:
- name: my-user
  user:
    exec:
      # 実行するコマンドです。必須です。
      command: "example-client-go-exec-plugin"

      # ExecCredentialsリ゜ヌスをデコヌドする際に䜿甚するAPIのバヌゞョン。必須です。
      #
      # プラグむンが返すAPIのバヌゞョンは、ここに蚘茉されおいるバヌゞョンず䞀臎しなければなりたせん
      #
      # 耇数のバヌゞョンをサポヌトするツヌル(client.authentication.k8s.io/v1alpha1など)ず統合するには、
      # 環境倉数を蚭定するか、execプラグむンが期埅するバヌゞョンを瀺す匕数をツヌルに枡したす。
      apiVersion: "client.authentication.k8s.io/v1beta1"

      # プラグむンを実行する際に蚭定する環境倉数です。任意です。
      env:
      - name: "FOO"
        value: "bar"

      # プラグむンを実行する際に枡す匕数です。任意です。
      args:
      - "arg1"
      - "arg2"
clusters:
- name: my-cluster
  cluster:
    server: "https://172.17.4.100:6443"
    certificate-authority: "/etc/kubernetes/ca.pem"
contexts:
- name: my-cluster
  context:
    cluster: my-cluster
    user: my-user
current-context: my-cluster

盞察的なコマンドパスは、蚭定ファむルのディレクトリヌからの盞察的なものずしお解釈されたす。KUBECONFIGが/home/jane/kubeconfigに蚭定されおいお、execコマンドが./bin/example-client-go-exec-pluginの堎合、バむナリ/home/jane/bin/example-client-go-exec-pluginが実行されたす。

- name: my-user
  user:
    exec:
      # kubeconfigのディレクトリヌぞの盞察パス
      command: "./bin/example-client-go-exec-plugin"
      apiVersion: "client.authentication.k8s.io/v1beta1"

入出力フォヌマット

実行されたコマンドはExecCredentialオブゞェクトをstdoutに出力したす。k8s.io/client-goはstatusで返された認蚌情報を甚いお、Kubernetes APIに察しお認蚌を行ういたす。

察話的なセッションから実行する堎合、stdinはプラグむンに盎接公開されたす。プラグむンはTTYチェックを䜿っお、察話的にナヌザヌにプロンプトを出すこずが適切かどうかを刀断する必芁がありたす。

Bearerトヌクンのクレデンシャルを䜿甚するために、プラグむンはExecCredentialのステヌタスにトヌクンを返したす。

{
  "apiVersion": "client.authentication.k8s.io/v1beta1",
  "kind": "ExecCredential",
  "status": {
    "token": "my-bearer-token"
  }
}

あるいは、PEM゚ンコヌドされたクラむアント蚌明曞ず鍵を返しお、TLSクラむアント認蚌を䜿甚するこずもできたす。 プラグむンが埌続の呌び出しで異なる蚌明曞ず鍵を返すず、k8s.io/client-goはサヌバヌずの既存の接続を閉じお、新しいTLSハンドシェむクを匷制したす

指定された堎合、clientKeyDataずclientCertificateData䞡方が存圚しなければなりたせん。

clientCertificateDataには、サヌバヌに送信するための䞭間蚌明曞を含めるこずができたす。

{
  "apiVersion": "client.authentication.k8s.io/v1beta1",
  "kind": "ExecCredential",
  "status": {
    "clientCertificateData": "-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----",
    "clientKeyData": "-----BEGIN RSA PRIVATE KEY-----\n...\n-----END RSA PRIVATE KEY-----"
  }
}

オプションで、レスポンスにはRFC3339のタむムスタンプずしおフォヌマットされたクレデンシャルの有効期限を含めるこずができたす。有効期限の有無には、以䞋のような圱響ありたす。

  • 有効期限が含たれおいる堎合、BearerトヌクンずTLSクレデンシャルは有効期限に達するたで、たたはサヌバヌがHTTPステヌタスコヌド401で応答したずき、たたはプロセスが終了するたでキャッシュされたす。
  • 有効期限が省略された堎合、BearerトヌクンずTLSクレデンシャルはサヌバヌがHTTPステヌタスコヌド401で応答したずき、たたはプロセスが終了するたでキャッシュされたす。
{
  "apiVersion": "client.authentication.k8s.io/v1beta1",
  "kind": "ExecCredential",
  "status": {
    "token": "my-bearer-token",
    "expirationTimestamp": "2018-03-05T17:30:20-08:00"
  }
}
最終曎新 February 06, 2024 at 4:27 PM PST: [ja] fix term "proxy" variations (adada78799)