概要
ArgoCDを複数チームで使用しようとした場合、各開発チームに管理ユーザを渡すのではなく、個別のローカルユーザーを渡したい。デフォルトでは管理ユーザしか存在しないので、ローカルユーザーを作成する方法について調査して、試してみた。
結論から書くと、
ArgoCDは組込みのadminユーザ以外に自前でローカルユーザーを作成する手段を持ち合わせていない。
admin以外のユーザはSSOを介してログインさせる必要がある。
SSOを設定する方法は2つ用意されていて
- インストール時に同梱されているDexを認証プロバイダとして使用し、Dexのコネクタ機能を利用して外部の認証プロバイダと連携する方法
- Dexを使わずに認証プロバイダを直接設定する方法
今回は1.の方法を使ってGithubアカウントでログインできるようにしてみます。
SSO連携設定
今回は連携先をGithubとして、以下のページを参考にしながら進めていきます。
SSO Configuration
ArgoCDをセットアップ
まずは、以前私が書いた記事を参考にログインが確認できる部分までセットアップ。
GCPアカウントが既に有ればクラスタ起動までの待機時間込みで、脳死コピペで10分ぐらいでセットアップできます。
Github(設定するIDプロバイダ)にArgoCDを登録
Githubにログインして、以下のURLにアクセス。
https://github.com/settings/developers
OAuth Apps -> Register a new applicationと進む。
必要な情報を入力して、Regiter applicationをクリック。
callback URLの形式は/api/dex/callback
であること。
登録が完了すると、OAuth2クライアントIDとシークレットが発行される。(既に削除済みなのでSecretも公開していく)
ArgoCDにSSO連携設定
SSOの連携先を設定するために、argocdのconfigmapを編集する。
本当はArgoCD自体もGitOpsでやりたい。。その方法はまた今度。
kubectl edit configmap argocd-cm -n argocd
以下の設定を追加しました。
clientSecretは別途暗号化したほうが良いです。今回はそのまま書きました。
data:
#ArgoCDのURL
url: https://35.221.69.97
dex.config: |
connectors:
- type: github
id: github
name: GitHub
#先ほど取得したIDとシークレットを記入
config:
clientID: 183d1478019b1b089c78
clientSecret: 523641358a11ac37434bd92dd234e465b72bb305
あとは自動で反映されます。
ArgoCDにGithubアカウントでログイン
ArgoCDにアクセスします。
これまで無かったLOGIN VIA GITHUB
なる文字が追加されました。クリックしてみます。
Githubアカウントで認証するかの確認を求められます。進めます。
オマケ:ログインログの確認
監査対応のためにログインのログも確認する必要がありますよね。
podの標準出力を確認して、ログを吐いているか確認します。
$ kubectl get pod -n argocd
NAME READY STATUS RESTARTS AGE
argocd-application-controller-9c45ddc4c-v82th 1/1 Running 2 71m
argocd-dex-server-7b9ccb486-w2ljp 1/1 Running 0 71m
argocd-redis-ha-server-0 2/2 Running 0 71m
argocd-redis-ha-server-1 2/2 Running 0 70m
argocd-redis-ha-server-2 2/2 Running 0 70m
argocd-repo-server-5994b64ccb-2drhx 1/1 Running 0 71m
argocd-repo-server-5994b64ccb-v7vgw 1/1 Running 0 71m
argocd-server-569c655c64-cxwx4 1/1 Running 0 71m
argocd-server-569c655c64-dqvp5 1/1 Running 0 71m
まずは、OIDCプロバイダとの連携を担当している、dexサーバのログを確認してみます。
$ kubectl logs argocd-dex-server-7b9ccb486-w2ljp -n argocd
###一部省略
time="2019-07-07T01:31:25Z" level=info msg="login successful: connector \"github\", username=\"ssbtn\", email=\"aaaaa\", groups=[]"
githubアカウントでログインした際のログは確認できていますね。
ただ、adminアカウントでログインした際のログはありませんでした。
次に有用なログが有りそうなargocd-serverのログを確認してみます。
$ kubectl logs argocd-server-569c655c64-dqvp5 -n argocd
###一部省略
time="2019-07-07T01:44:40Z" level=info msg="received streaming call /application.ApplicationService/Watch" grpc.method=Watch grpc.request.claims="{\"iat\":1562463880,\"iss\":\"argocd\",\"nbf\":1562463880,\"sub\":\"admin\"}" grpc.request.content="resourceVersion:\"\" " grpc.service=application.ApplicationService grpc.start_time="2019-07-07T01:44:40Z" span.kind=server system=grpc
time="2019-07-07T01:46:23Z" level=info msg="received streaming call /application.ApplicationService/Watch" grpc.method=Watch grpc.request.claims="{\"at_hash\":\"qL7WGdPxHJ5K3vkBwGz44w\",\"aud\":\"argo-cd\",\"email\":\"aaaaaaa\",\"email_verified\":true,\"exp\":1562550382,\"iat\":1562463982,\"iss\":\"https://35.221.69.97/api/dex\",\"name\":\"ssbtn\",\"sub\":\"Cgg0NzkzNTU3NRIGZ2l0aHVi\"}" grpc.request.content="resourceVersion:\"\" " grpc.service=application.ApplicationService grpc.start_time="2019-07-07T01:46:23Z" span.kind=server system=grpc
adminのログインも含めて、ArgoCDの操作に関する諸々のログがargocd-serverに吐かれていました。
ただ、今回は冗長構成にしているので、どちらに吐かれるか分からず見づらかったです。。やっぱり、コンテナのログは生で見るものじゃないですね。
所感
SSOの連携先はOIDCプロバイダーやLDAPであれば何でも良いので、エンタープライズで利用する場合はプライベートクラウドやオンプレに立てたGitOpsをするためのGitlabサーバが有力な連携先になるのかなと思いました。
GitOpsをするに当たり、前提としてGithubやGitlabのアカウントが存在することになります。
ローカルユーザーの管理は作成機能を持たせずに、SSO連携のみに絞っていて、不用意にユーザ管理が多重化するのを防いでおり、クールだなと思いました。