web-dev-qa-db-ja.com

Kubernetesにユーザーを追加する方法(kubectl)

AWSで kops を使用してKubernetesクラスターを作成し、ローカルマシンからkubectl経由で正常に管理できます。

現在の構成をkubectl config viewで表示できるだけでなく、次のような~/.kube/configに保存されている状態に直接アクセスすることもできます。

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: REDACTED
    server: https://api.{CLUSTER_NAME}
  name: {CLUSTER_NAME}
contexts:
- context:
    cluster: {CLUSTER_NAME}
    user: {CLUSTER_NAME}
  name: {CLUSTER_NAME}
current-context: {CLUSTER_NAME}
kind: Config
preferences: {}
users:
- name: {CLUSTER_NAME}
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED
    password: REDACTED
    username: admin
- name: {CLUSTER_NAME}-basic-auth
  user:
    password: REDACTED
    username: admin

他のユーザーも管理できるようにする必要があります。この ユーザーガイド は、別のユーザーマシンでこれらを定義する方法を説明していますが、クラスター自体にユーザーの資格情報を実際に作成する方法は説明していません。これどうやってやるの?

また、cluster.certificate-authority-dataを共有するだけでも安全ですか?

58
peterl

認証の概要については、Kubernetesの公式ドキュメント Authentication および Authorization を参照してください。

ユーザーの場合、理想的にはKubernetes(OpenID Connect)のIDプロバイダーを使用します。

GKE/ACSを使用している場合は、それぞれのIDおよびアクセス管理フレームワークと統合します

Kubernetesをセルフホストする場合(kopsを使用する場合)、 coreos/dex を使用してLDAP/OAuth2 IDプロバイダーと統合できます-この詳細な2部が参考になります KubernetesのSSO 記事。

kops(1.10+)に組み込みの 認証サポート が追加され、AWSを使用している場合、IDプロバイダーとしてのAWS IAMとの統合が容易になりました。

dexには、次のようなオープンソースのcliクライアントがいくつかあります。

迅速で簡単な(長期的には最も安全で管理しにくい)方法を探している場合は、アクセスを制御する特殊なポリシーの2つのオプションを使用して、serviceaccountsを悪用する可能性があります。 (下記参照)

1.6ロールベースのアクセス制御が強く推奨されているため、注意してください!この回答はRBACのセットアップをカバーしていません

編集RBACによるユーザー設定 に関するBitnamiの優れたガイドも利用可能です。

サービスアカウントアクセスを有効にする手順は次のとおりです(クラスター構成にRBACまたはABACポリシーが含まれているかどうかに応じて、これらのアカウントには完全な管理者権限があります!)。

EDITサービスアカウントの作成を自動化するbashスクリプトです-以下の手順を参照

  1. ユーザーAliceのサービスアカウントを作成します

    kubectl create sa alice
    
  2. 関連する秘密を取得

    secret=$(kubectl get sa alice -o json | jq -r .secrets[].name)
    
  3. シークレットからca.crtを取得します(OSX base64-Dフラグを使用してデコードします)

    kubectl get secret $secret -o json | jq -r '.data["ca.crt"]' | base64 -D > ca.crt
    
  4. シークレットからサービスアカウントトークンを取得する

    user_token=$(kubectl get secret $secret -o json | jq -r '.data["token"]' | base64 -D)
    
  5. Kubectl config(current-context、server ..)から情報を取得します

    # get current context
    c=`kubectl config current-context`
    
    # get cluster name of context
    name=`kubectl config get-contexts $c | awk '{print $3}' | tail -n 1`
    
    # get endpoint of current context 
    endpoint=`kubectl config view -o jsonpath="{.clusters[?(@.name == \"$name\")].cluster.server}"`
    
  6. 新しいマシンで、次の手順に従います(上記で取得したca.certおよび$endpoint情報を指定します:

    1. kubectlをインストールします

      brew install kubectl
      
    2. クラスターの設定(ca.crtが保存されているディレクトリで実行)

      kubectl config set-cluster cluster-staging \
        --embed-certs=true \
        --server=$endpoint \
        --certificate-authority=./ca.crt
      
    3. ユーザー資格情報を設定する

      kubectl config set-credentials alice-staging --token=$user_token
      
    4. Aliceユーザーとステージングクラスターの組み合わせを定義する

      kubectl config set-context alice-staging \
        --cluster=cluster-staging \
        --user=alice-staging \
        --namespace=alice
      
    5. ユーザーのcurrent-contextをalice-stagingに切り替えます

      kubectl config use-context alice-staging
      

ポリシーでユーザーアクセスを制御するには( ABAC を使用)、 policy ファイルを作成する必要があります(例):

{
  "apiVersion": "abac.authorization.kubernetes.io/v1beta1",
  "kind": "Policy",
  "spec": {
    "user": "system:serviceaccount:default:alice",
    "namespace": "default",
    "resource": "*",
    "readonly": true
  }
}

すべてのマスターノードでこのpolicy.jsonをプロビジョニングし、--authorization-mode=ABAC --authorization-policy-file=/path/to/policy.jsonフラグをAPIサーバーに追加します

これにより、Aliceは(彼女のサービスアカウントを介して)デフォルト名前空間のすべてのリソースに対する読み取り専用権限のみを許可します。

82
Vincent De Smet

あなたは言う :

他のユーザーも管理できるようにする必要があります。

しかし ドキュメント

通常のユーザーは、外部の独立したサービスによって管理されていると想定されます。秘密鍵を配布する管理者、KeystoneやGoogleアカウントなどのユーザーストア、ユーザー名とパスワードのリストを含むファイル。この点で、Kubernetesには通常のユーザーアカウントを表すオブジェクトがありません。 API呼び出しを介して、通常のユーザーをクラスターに追加することはできません。

これにはサードパーティのツールを使用する必要があります。

==編集==

1つの解決策は、手動で kubeconfigファイル にユーザーエントリを作成することです。 ドキュメント から:

# create kubeconfig entry
$ kubectl config set-cluster $CLUSTER_NICK \
    --server=https://1.1.1.1 \
    --certificate-authority=/path/to/apiserver/ca_file \
    --embed-certs=true \
    # Or if tls not needed, replace --certificate-authority and --embed-certs with
    --insecure-skip-tls-verify=true \
    --kubeconfig=/path/to/standalone/.kube/config

# create user entry
$ kubectl config set-credentials $USER_NICK \
    # bearer token credentials, generated on kube master
    --token=$token \
    # use either username|password or token, not both
    --username=$username \
    --password=$password \
    --client-certificate=/path/to/crt_file \
    --client-key=/path/to/key_file \
    --embed-certs=true \
    --kubeconfig=/path/to/standalone/.kube/config

# create context entry
$ kubectl config set-context $CONTEXT_NAME \
    --cluster=$CLUSTER_NICK \
    --user=$USER_NICK \
    --kubeconfig=/path/to/standalone/.kube/config
1
Ortomala Lokni

minikubeを使用している場合でも、bitnamiガイドが機能します。最も重要なのは、クラスターがRBACをサポートしていることです。 https://docs.bitnami.com/kubernetes/how-to/configure-rbac-in-your-kubernetes-cluster/

0
Gabriel Wu