zaki work log

作業ログやら生活ログやらなんやら

OpenShiftの認証にプライベートのGitLab CEを認証プロバイダとして使用する(OCP v4編)

OpenShift v4の認証(web/oc login)に、GitLab CEの認証情報を使うための設定手順。

前提

GitLab CEはhttpsで構築してあり、証明書も(オレオレ認証局で良いので)設定してあること。(手元にcrtファイルがあること)
平たく言うと、以下の記事で構築したGitLab CEを前提にしている。

zaki-hmkc.hatenablog.com

httpsで通信しつつ証明書の検証も行う必要がある。(この設定ができてないとx509エラーになる/insecure設定があるのかはわからなかった)

OpenShift側は、記事中はOKD4.4で確認。

ドキュメントはこちら。

access.redhat.com

v3編はこちら

zaki-hmkc.hatenablog.com

決めごと

OCPクラスタ+GitLabの設定に使う認証プロバイダのアイデンティティ名を決める。
この記事ではgitlabauthとしている。

設定内のgitlabauthは全てこの認証プロバイダのアイデンティティ名を当てはめる。

複数の認証方式を併用する場合はここで決めた名前を選択することになるのでprivate-gitlab-ce-authとかの方が分かりやすいかもしれない。

GitLab CEのアプリケーション設定

ログインしてこのSettingsから、

f:id:zaki-hmkc:20200216193713p:plain

Applicationsを開く。

f:id:zaki-hmkc:20200216193805p:plain

Add new applicationで次のように入力。

項目 内容
Name OCP v4 auth (など、見てわかる文言で)
Redirect URI 下記参照
Scopes openid にチェック(他は不要)

Redirect URIは、oc get route -n openshift-authenticationで得られる認証用のrouteドメインをベースに、以下を入力する。
末尾のgitlabauthが最初に決めた認証プロバイダのアイデンティティ名。

https://oauth-openshift.apps.<cluster-name>.<cluster-domain>/oauth2callback/gitlabauth

作成されたApplication IDSecretをOpenShfit側で使用する。

OpenShiftの設定

secret作成

GitLab CEで作成したSecret値を持つsecretリソースをclientSecretというキーでopenshift-configネームスペースに作成する。(表現紛らわしいけど)

$ secret=<GitLab CE上で作成したSecretの値>
$ secret_name=gitlab-oauth-secret
$ oc create secret generic ${secret_name} --from-literal=clientSecret=${secret} -n openshift-config

ここではgitlab-oauth-secretという名前のsecretリソースを作成しているが、後述のoauthカスタムリソースの設定と合っていれば名称は何でも良い。

認証局のconfigmap作成

secretと同じ要領で、HTTPSアクセス用の認証局のファイルの内容を持つconfigmapリソースを作成する。
GitLab CEの証明書のcrtファイルがcert/gitlab-ce.example.org.crtにあれば、--from-fileでパスを指定し、ca.crtというキーでデータをセットする。

$ cert_path=~/gitlab-cert/gitlab-ce.example.org.crt
$ cm_name=gitlab-oauth-config
$ oc create configmap ${cm_name} --from-file=ca.crt=${cert_path} -n openshift-config

ここではgitlab-oauth-configという名前のconfigmapリソースを作成しているが、後述のoauthカスタムリソースの設定と合っていれば名称は何でも良い。

カスタムリソースマニフェスト

Secret値と認証局のデータを持つsecretリソースとconfigmapリソースを作成したら、GitLab認証プロバイダ用のカスタムリソースを作成する。

apiVersion: config.openshift.io/v1
kind: OAuth
metadata:
  name: cluster
spec:
  identityProviders:
  - name: gitlabauth                            # アイデンティティ名
    mappingMethod: claim
    type: GitLab
    gitlab:
      clientID: ............................    # GitLab CEのApplication IDの値
      clientSecret:
        name: gitlab-oauth-secret               # Secret値のsecretリソース名
      url: https://gitlab-ce.example.org:8443/  # 認証に使用するGitLab CEのURL
      ca:
        name: gitlab-oauth-config               # 認証局のconfigmapリソース名

ファイルができたらapplyする

[zaki@okd4-manager gitlab-auth]$ oc apply -f oauth-custom-resource.yaml 
Warning: oc apply should be used on resource created by either oc create --save-config or oc apply
oauth.config.openshift.io/cluster configured

web認証

認証されてない状態でwebコンソールにアクセスすると、(既存の認証方式があれば、それに追加する形で)このようにアイデンティティ名が表示されて認証方式を選択する画面になる。
(認証済みの場合は一度ログアウトする)

f:id:zaki-hmkc:20200216201416p:plain

GitLab CEを使った認証であるgitlabauthをクリックすると、GitLab CEの認証画面に遷移し、そこで認証するとOpenShiftの認証との連携許可を求める画面になるのでAuthorizeする。

f:id:zaki-hmkc:20200216201740p:plain

そうすればOpenShiftにログインできる。

f:id:zaki-hmkc:20200216201831p:plain

なお、ロールは何も与えられてないので、管理権限が必要であれば別途oc adm policy add-role-to-userなどで設定する。

一度認証すると、OpenShift上でもuserとidentitiesが作成される。

[zaki@okd4-manager gitlab-auth]$ oc get user
NAME   UID                                    FULL NAME   IDENTITIES
zaki   ********-f761-4d7e-a561-************   zaki        gitlabauth:2
[zaki@okd4-manager gitlab-auth]$ oc get identities
NAME           IDP NAME     IDP USER NAME   USER NAME   USER UID
gitlabauth:2   gitlabauth   2               zaki        ********-f761-4d7e-a561-************

(IDを伏せる必要あるかわからんけどとりあえず…)


クローズドな開発環境でプライベートネットワーク上にGitLab CEがあるなら、htpasswdよりもこれを使うとユーザ管理は楽かなーと。
(それを運用するようなチームにいないけど…)


identityProvidersはリストなので、認証方式はhtpasswdやGitHubなど複数のものを併用可能。
上のwebコンソールの画面のように、ログイン時に選択するUIとなる。


CLI認証

CLIだとクラスタに設定した証明書が無視されて認証できない…

[zaki@okd4-manager ~]$ oc login -u zaki
error: x509: certificate signed by unknown authority

crtファイルを指定すれば行けた

[zaki@okd4-manager ~]$ oc login -u zaki --certificate-authority=/home/zaki/gitlab-cert/gitlab-ce.example.org.crt 
The server uses a certificate signed by an unknown authority.
You can bypass the certificate check, but any data you send to the server could be intercepted by others.
Use insecure connections? (y/n): y

Authentication required for https://api.okd4.naru.jp-z.jp:6443 (openshift)
Username: zaki
Password: 
Login successful.

You don't have any projects. You can try to create a new project, by running

    oc new-project <projectname>

[zaki@okd4-manager ~]$ 

次回以降は省略可能。

[zaki@okd4-manager ~]$ oc whoami 
zaki
[zaki@okd4-manager ~]$ oc login -u system:admin
Logged into "https://api.okd4.naru.jp-z.jp:6443" as "system:admin" using existing credentials.

You have access to 58 projects, the list has been suppressed. You can list all projects with 'oc projects'

Using project "default".
[zaki@okd4-manager ~]$ 
[zaki@okd4-manager ~]$ 
[zaki@okd4-manager ~]$ oc login -u zaki
Logged into "https://api.okd4.naru.jp-z.jp:6443" as "zaki" using existing credentials.

You don't have any projects. You can try to create a new project, by running

    oc new-project <projectname>

[zaki@okd4-manager ~]$ 

クラスタでなくOSの証明書情報を見ていたのかな。


参考図書にKindle Unlimitedだと現在0円のGitLab実践ガイドもどうぞ

https://www.amazon.co.jp/dp/B079DL362C/