在自托管 GitLab 实例中集成 Keycloak SAML 登录
前置条件
本文中,git.todoit.tech 是 GitLab 的域名,keycloak.todoit.tech 是 Keycloak 的域名。
Keycloak
创建一个新的 Realm,本文将其命名为 sso。
添加用户
在 sso Realm 中创建测试用户。
创建 Client
在 sso Realm 下,创建一个新的 Client。
Client Type 选择 SAML,Client ID 为 gitlab,点击 Next 按钮。
配置登录选项,如图,点击 Save 按钮。
在 SAML capabilities 部分,将 NameID format 设置为 persistent
。
在 Signature and Encryption 部分,将 Sign Documents 和 Sign Assertions 都设置为 On。
点击 Save 按钮,保存以上配置。
点击 "Fine Grain SAML Endpoint Configuration"
设置 Assertion Consumer Service POST Binding URL 为 https://gitlab.todoit.tech/users/auth/saml/callback
,点击 Save 按钮。
创建 gitlb:external Role
打开 "Roles" Tab, 点击 "Create Role" 按钮。
创建一个新的 Role,命名为 gitlab:external
,点击 "Save" 按钮保存。
配置字段映射
打开 "Client scopes" Tab,点击 gitlab-dedicated
。
添加如下 5 个 mapper。
获取证书指纹
在浏览器打开:https://keycloak.todoit.tech/realms/sso/protocol/saml/descriptor
创建 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" 按钮。
输入用户名,密码,并重置密码后,就可以看到如下画面。
参考