Dex、dex-k8s-authenticator、GitHub を使用して Kubernetes クラスターへのアクセスを生成するためのチュートリアルを紹介します。
ロシア語の Kubernetes チャットからのローカル ミーム
導入
私たちは Kubernetes を使用して、開発チームと QA チームのための動的な環境を作成します。 したがって、ダッシュボードと kubectl の両方でクラスターへのアクセスを許可したいと考えています。 OpenShift とは異なり、標準の Kubernetes にはネイティブ認証がないため、これにはサードパーティのツールを使用します。
この構成では以下を使用します。
dex-k8s-authenticator — kubectl 構成を生成するための Web アプリケーションデックス — OpenID Connect プロバイダー- GitHub - 社内で GitHub を使用しているという理由だけで
Google OIDC を使用しようとしましたが、残念ながら
それでは、Kubernetes 認証プロセスは視覚的にどのように機能するのでしょうか。
認可プロセス
もう少し詳しく、ポイントごとに説明します。
- ユーザーは dex-k8s-authenticator にログインします (
login.k8s.example.com
) - dex-k8s-authenticator はリクエストを Dex に転送します (
dex.k8s.example.com
) - Dex は GitHub ログイン ページにリダイレクトします
- GitHub は必要な認証情報を生成し、Dex に返します。
- Dex は受信した情報を dex-k8s-authenticator に渡します
- ユーザーは GitHub から OIDC トークンを受け取ります
- dex-k8s-authenticator は kubeconfig にトークンを追加します
- kubectl はトークンを KubeAPIServer に渡します
- KubeAPIServer は、渡されたトークンに基づいて kubectl へのアクセスを返します
- ユーザーは kubectl からアクセスを取得します
準備行為
もちろん、Kubernetes クラスターはすでにインストールされています (k8s.example.com
)、HELM もプリインストールされています。 GitHub (super-org) 上にも組織があります。
HELM がない場合はインストールしてください
まず、GitHub を設定する必要があります。
組織設定ページに移動します (https://github.com/organizations/super-org/settings/applications
) して、新しいアプリケーション (承認された OAuth アプリ) を作成します。
GitHub で新しいアプリケーションを作成する
フィールドに必要な URL を入力します。例:
- ホームページURL:
https://dex.k8s.example.com
- 認可コールバック URL:
https://dex.k8s.example.com/callback
リンクには注意してください。スラッシュを失わないことが重要です。
入力済みのフォームに応答して、GitHub は Client ID
и Client secret
、それらを安全な場所に保管してください。それらは私たちにとって役立ちます(たとえば、私たちは次のように使用します)
Client ID: 1ab2c3d4e5f6g7h8
Client secret: 98z76y54x32w1
サブドメインの DNS レコードを準備する login.k8s.example.com
и dex.k8s.example.com
、イングレス用の SSL 証明書も同様です。
SSL 証明書を作成しましょう。
cat <<EOF | kubectl create -f -
apiVersion: certmanager.k8s.io/v1alpha1
kind: Certificate
metadata:
name: cert-auth-dex
namespace: kube-system
spec:
secretName: cert-auth-dex
dnsNames:
- dex.k8s.example.com
acme:
config:
- http01:
ingressClass: nginx
domains:
- dex.k8s.example.com
issuerRef:
name: le-clusterissuer
kind: ClusterIssuer
---
apiVersion: certmanager.k8s.io/v1alpha1
kind: Certificate
metadata:
name: cert-auth-login
namespace: kube-system
spec:
secretName: cert-auth-login
dnsNames:
- login.k8s.example.com
acme:
config:
- http01:
ingressClass: nginx
domains:
- login.k8s.example.com
issuerRef:
name: le-clusterissuer
kind: ClusterIssuer
EOF
kubectl describe certificates cert-auth-dex -n kube-system
kubectl describe certificates cert-auth-login -n kube-system
タイトル付きのクラスター発行者 le-clusterissuer
すでに存在しているはずですが、存在しない場合は、HELM を使用して作成します。
helm install --namespace kube-system -n cert-manager stable/cert-manager
cat << EOF | kubectl create -f -
apiVersion: certmanager.k8s.io/v1alpha1
kind: ClusterIssuer
metadata:
name: le-clusterissuer
namespace: kube-system
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: [email protected]
privateKeySecretRef:
name: le-clusterissuer
http01: {}
EOF
KubeAPIサーバーの構成
kubeAPIServer が機能するには、OIDC を構成し、クラスターを更新する必要があります。
kops edit cluster
...
kubeAPIServer:
anonymousAuth: false
authorizationMode: RBAC
oidcClientID: dex-k8s-authenticator
oidcGroupsClaim: groups
oidcIssuerURL: https://dex.k8s.example.com/
oidcUsernameClaim: email
kops update cluster --yes
kops rolling-update cluster --yes
を使用しております
Dex 構成と dex-k8s-authenticator
Dex が機能するには、Kubernetes マスターから証明書とキーが必要です。そこから取得しましょう。
sudo cat /srv/kubernetes/ca.{crt,key}
-----BEGIN CERTIFICATE-----
AAAAAAAAAAABBBBBBBBBBCCCCCC
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
DDDDDDDDDDDEEEEEEEEEEFFFFFF
-----END RSA PRIVATE KEY-----
dex-k8s-authenticator リポジトリのクローンを作成しましょう。
git clone [email protected]:mintel/dex-k8s-authenticator.git
cd dex-k8s-authenticator/
値ファイルを使用すると、変数を柔軟に設定できます。
Dex の構成を説明しましょう。
cat << EOF > values-dex.yml
global:
deployEnv: prod
tls:
certificate: |-
-----BEGIN CERTIFICATE-----
AAAAAAAAAAABBBBBBBBBBCCCCCC
-----END CERTIFICATE-----
key: |-
-----BEGIN RSA PRIVATE KEY-----
DDDDDDDDDDDEEEEEEEEEEFFFFFF
-----END RSA PRIVATE KEY-----
ingress:
enabled: true
annotations:
kubernetes.io/ingress.class: nginx
kubernetes.io/tls-acme: "true"
path: /
hosts:
- dex.k8s.example.com
tls:
- secretName: cert-auth-dex
hosts:
- dex.k8s.example.com
serviceAccount:
create: true
name: dex-auth-sa
config: |
issuer: https://dex.k8s.example.com/
storage: # https://github.com/dexidp/dex/issues/798
type: sqlite3
config:
file: /var/dex.db
web:
http: 0.0.0.0:5556
frontend:
theme: "coreos"
issuer: "Example Co"
issuerUrl: "https://example.com"
logoUrl: https://example.com/images/logo-250x25.png
expiry:
signingKeys: "6h"
idTokens: "24h"
logger:
level: debug
format: json
oauth2:
responseTypes: ["code", "token", "id_token"]
skipApprovalScreen: true
connectors:
- type: github
id: github
name: GitHub
config:
clientID: $GITHUB_CLIENT_ID
clientSecret: $GITHUB_CLIENT_SECRET
redirectURI: https://dex.k8s.example.com/callback
orgs:
- name: super-org
teams:
- team-red
staticClients:
- id: dex-k8s-authenticator
name: dex-k8s-authenticator
secret: generatedLongRandomPhrase
redirectURIs:
- https://login.k8s.example.com/callback/
envSecrets:
GITHUB_CLIENT_ID: "1ab2c3d4e5f6g7h8"
GITHUB_CLIENT_SECRET: "98z76y54x32w1"
EOF
dex-k8s-authenticator の場合:
cat << EOF > values-auth.yml
global:
deployEnv: prod
dexK8sAuthenticator:
clusters:
- name: k8s.example.com
short_description: "k8s cluster"
description: "Kubernetes cluster"
issuer: https://dex.k8s.example.com/
k8s_master_uri: https://api.k8s.example.com
client_id: dex-k8s-authenticator
client_secret: generatedLongRandomPhrase
redirect_uri: https://login.k8s.example.com/callback/
k8s_ca_pem: |
-----BEGIN CERTIFICATE-----
AAAAAAAAAAABBBBBBBBBBCCCCCC
-----END CERTIFICATE-----
ingress:
enabled: true
annotations:
kubernetes.io/ingress.class: nginx
kubernetes.io/tls-acme: "true"
path: /
hosts:
- login.k8s.example.com
tls:
- secretName: cert-auth-login
hosts:
- login.k8s.example.com
EOF
Dex と dex-k8s-authenticator をインストールします。
helm install -n dex --namespace kube-system --values values-dex.yml charts/dex
helm install -n dex-auth --namespace kube-system --values values-auth.yml charts/dex-k8s-authenticator
サービスの機能を確認してみましょう (Dex はコード 400 を返し、dex-k8s-authenticator はコード 200 を返すはずです)。
curl -sI https://dex.k8s.example.com/callback | head -1
HTTP/2 400
curl -sI https://login.k8s.example.com/ | head -1
HTTP/2 200
RBAC 構成
グループの ClusterRole を作成します。この例では読み取り専用アクセスを使用します。
cat << EOF | kubectl create -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: cluster-read-all
rules:
-
apiGroups:
- ""
- apps
- autoscaling
- batch
- extensions
- policy
- rbac.authorization.k8s.io
- storage.k8s.io
resources:
- componentstatuses
- configmaps
- cronjobs
- daemonsets
- deployments
- events
- endpoints
- horizontalpodautoscalers
- ingress
- ingresses
- jobs
- limitranges
- namespaces
- nodes
- pods
- pods/log
- pods/exec
- persistentvolumes
- persistentvolumeclaims
- resourcequotas
- replicasets
- replicationcontrollers
- serviceaccounts
- services
- statefulsets
- storageclasses
- clusterroles
- roles
verbs:
- get
- watch
- list
- nonResourceURLs: ["*"]
verbs:
- get
- watch
- list
- apiGroups: [""]
resources: ["pods/exec"]
verbs: ["create"]
EOF
ClusterRoleBinding の構成を作成しましょう。
cat <<EOF | kubectl create -f -
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: dex-cluster-auth
namespace: kube-system
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-read-all
subjects:
kind: Group
name: "super-org:team-red"
EOF
これでテストの準備が整いました。
テスト
ログインページに移動します (https://login.k8s.example.com
) をクリックし、GitHub アカウントを使用してログインします。
ログインページ
ログインページが GitHub にリダイレクトされました
生成された指示に従ってアクセスを取得します
Web ページからコピー&ペーストした後、kubectl を使用してクラスター リソースを管理できます。
kubectl get po
NAME READY STATUS RESTARTS AGE
mypod 1/1 Running 0 3d
kubectl delete po mypod
Error from server (Forbidden): pods "mypod" is forbidden: User "[email protected]" cannot delete pods in the namespace "default"
そしてそれは機能し、組織内のすべての GitHub ユーザーはリソースを表示してポッドにログインできますが、リソースを変更する権限はありません。
出所: habr.com