在自托管 GitLab 实例中集成 Keycloak SAML 登录

前置条件

本文中,git.todoit.tech 是 GitLab 的域名,keycloak.todoit.tech 是 Keycloak 的域名。

Keycloak

创建一个新的 Realm,本文将其命名为 sso。

gitlab-2023-08-14-12-15-47

添加用户

在 sso Realm 中创建测试用户。

gitlab-2023-08-14-14-24-55

gitlab-2023-08-14-14-26-04

gitlab-2023-08-14-14-33-30

创建 Client

在 sso Realm 下,创建一个新的 Client。

gitlab-2023-08-14-12-18-23

Client Type 选择 SAML,Client ID 为 gitlab,点击 Next 按钮。

gitlab-2023-08-14-12-19-44

配置登录选项,如图,点击 Save 按钮。

gitlab-2023-08-14-12-27-00

在 SAML capabilities 部分,将 NameID format 设置为 persistent

gitlab-2023-08-14-12-30-17

在 Signature and Encryption 部分,将 Sign Documents 和 Sign Assertions 都设置为 On。

gitlab-2023-08-14-12-33-23

点击 Save 按钮,保存以上配置。

点击 "Fine Grain SAML Endpoint Configuration"

gitlab-2023-08-14-12-37-37

设置 Assertion Consumer Service POST Binding URL 为 https://gitlab.todoit.tech/users/auth/saml/callback,点击 Save 按钮。

gitlab-2023-08-14-12-39-54

创建 gitlb:external Role

打开 "Roles" Tab, 点击 "Create Role" 按钮。

gitlab-2023-08-14-12-41-29

创建一个新的 Role,命名为 gitlab:external,点击 "Save" 按钮保存。

gitlab-2023-08-14-12-44-01

配置字段映射

打开 "Client scopes" Tab,点击 gitlab-dedicated

gitlab-2023-08-14-12-47-11

gitlab-2023-08-14-12-49-22

gitlab-2023-08-14-12-50-27

添加如下 5 个 mapper。

gitlab-2023-08-14-12-52-21

gitlab-2023-08-14-14-03-48

gitlab-2023-08-14-14-03-06

gitlab-2023-08-14-14-04-34

gitlab-2023-08-14-14-05-54

获取证书指纹

在浏览器打开:https://keycloak.todoit.tech/realms/sso/protocol/saml/descriptor

gitlab-2023-08-14-14-12-30

创建 gitlab-sso.pem 文件,将 X509 证书内容复制到该文件中。

-----BEGIN CERTIFICATE-----
MIIClTCCAX0CBgGJ8kLgOjANBgkqhkiG9<OMIT_SECRET>
-----END CERTIFICATE-----

运行以下命令,计算证书的 SHA1 指纹。

openssl x509 -sha1 -fingerprint -noout -in gitlab-sso.pem

# SHA1 Fingerprint=D6:53:57:72:32:E7:B2:CC:F9:1C:8B:7F:CD:6A:D2:6D:45:8E:1C:F8

GitLab

修改 gitlab-rc.yml,添加以下环境变量。

- name: OAUTH_ENABLED
  value: 'true'
- name: OAUTH_ALLOW_SSO
  value: saml
- name: OAUTH_AUTO_LINK_SAML_USER
  value: 'false'
- name: OAUTH_AUTO_LINK_LDAP_USER
  value: 'false'
# - name: OAUTH_AUTO_LINK_USER
#   value: 'true'
- name: OAUTH_BLOCK_AUTO_CREATED_USERS
  value: 'false'
- name: OAUTH_EXTERNAL_PROVIDERS
  value: saml
# SAML
- name: OAUTH_SAML_ASSERTION_CONSUMER_SERVICE_URL
  value: https://git.todoit.tech/users/auth/saml/callback
- name: OAUTH_SAML_IDP_CERT_FINGERPRINT
  value: 'D6:53:57:72:32:E7:B2:CC:F9:1C:8B:7F:CD:6A:D2:6D:45:8E:1C:F8'
# 对应 IDP-Initiated SSO URL name
- name: OAUTH_SAML_IDP_SSO_TARGET_URL
  value: https://keycloak.todoit.tech/realms/sso/protocol/saml/clients/git.todoit.tech
# 对应 keycloak 中的 Client ID
- name: OAUTH_SAML_ISSUER
  value: gitlab
- name: OAUTH_SAML_LABEL
  value: Login with keycloak
- name: OAUTH_SAML_NAME_IDENTIFIER_FORMAT
  value: urn:oasis:names:tc:SAML:2.0:nameid-format:persistent
- name: OAUTH_SAML_GROUPS_ATTRIBUTE
  value: roles
- name: OAUTH_SAML_EXTERNAL_GROUPS
  value: git:external
- name: OAUTH_SAML_ATTRIBUTE_STATEMENTS_EMAIL
  value: email
- name: OAUTH_SAML_ATTRIBUTE_STATEMENTS_NAME
  value: name
- name: OAUTH_SAML_ATTRIBUTE_STATEMENTS_USERNAME
  value: name
- name: OAUTH_SAML_ATTRIBUTE_STATEMENTS_FIRST_NAME
  value: first_name
- name: OAUTH_SAML_ATTRIBUTE_STATEMENTS_LAST_NAME
  value: last_name

重新启动 GitLab。

kubectl delete -f gitlab-rc.yml -n gitlab
kubectl create -f gitlab-rc.yml -n gitlab

测试

打开浏览器,访问 https://git.todoit.tech/,点击 "Login with keycloak" 按钮。

输入用户名,密码,并重置密码后,就可以看到如下画面。

gitlab-2023-08-14-14-40-24


参考

上次更新: