Keycloak을 이용한 Gitlab SSO 연동 (SAML)

참고 사이트 : https://edenmal.moe/post/2018/GitLab-Keycloak-SAML-2-0-OmniAuth-Provider/

 

Key Cloak

Key Cloak 설치

  • 사전 조건 : Docker 환경 구성

터미널에서 아래 명령어 입력

docker run -p 8080:8080 -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=admin quay.io/keycloak/keycloak:11.0.0

기본 8080 포트 구성. 포트 변경 필요시 해당 부분 변경 <container port>:<host port>

관리 콘솔 로그인

1. http://<IP주소 or localhost>:8080 접속

2. Administration console 클릭 한 후 admin 계정으로 로그인(keycloak 컨테이너 실행 시 입력한 ID/PW)

영역(realm) 생성

1. 화면 좌측 상단 Master 영역 > “Add realm” 버튼 클릭

2. 영역 이름 입력 > 활성화 enable on > “Create” 버튼 클릭

Client 생성

1. Clients > “Create” 버튼 클릭

 

2. 각 키값 입력

Key

Value

Key

Value

Client ID *

gitlab.example.com

Client Protocol

saml

Client SAML Endpoint

https://gitlab.example.com/users/auth/saml/callback

 

3. Setting Tab 설정

Key

Value

Key

Value

Client ID

gitlab.example.com

Name

Example GItlab

Description

some description

Enabled

ON

Consent Required

OFF

Login Theme

base

Client Protocol

saml

Include AuthnStatement

ON

Include OneTimeUse Condition

OFF

Sign Documents

ON

Optimize REDIRECT signing key lookup

OFF

Sign Assertions

ON

Signature Algorithm

RSA_SHA26

SAML Signature Key Name

KEY_ID

Canonicalization Method

EXCLUSIVE

Encrypt Assertions

OFF

Client Signature Required

ON

Force POST Binding

ON

Front Channel Logout

ON

Force Name ID Format

OFF

Name ID Format

persistant

Root URL

https://gitlab.example.com

Valid Redirect URIs

https://gitlab.example.com/users/auth/saml/callback

Base URL

/

Master SAML Processing URL

https://gitlab.example.com/users/auth/saml/callback

IDP Initiated SSO URL Name

gitlab.example.com

IDP Initiated SSO Relay State

 

####Fine Grain SAML Endpoint Configuration:

Key

Value

Key

Value

Assertion Consumer Service POST Binding URL

https://gitlab.example.com/users/auth/saml/callback

Assertion Consumer Service Redirect Binding URL

 

Logout Service POST Binding URL

 

Logout Service Redirect Binding URL

 

 

4. Roles Tab 설정

Role 이름

Composite

Role 이름

Composite

gitlab.example.com:access

false

gitlab.example.com:external

false

 

5. Mappers Tab 설정

Create 버튼 클릭하여 아래와 같이 생성

  • Name: name

    • Mapper Type: User Property

    • Property: Username

    • Friendly Name: Username

    • SAML Attribute Name: name

    • SAML Attribute NameFormat: Basic

  • Name: email

    • Mapper Type: User Property

    • Property: Email

    • Friendly Name: Email

    • SAML Attribute Name: email

    • SAML Attribute NameFormat: Basic

  • Name: first_name

    • Mapper Type: User Property

    • Property: FirstName

    • Friendly Name: First Name

    • SAML Attribute Name: first_name

    • SAML Attribute NameFormat: Basic

  • Name: last_name

    • Mapper Type: User Property

    • Property: LastName

    • Friendly Name: Last Name

    • SAML Attribute Name: name

    • SAML Attribute NameFormat: Basic

  • Name: roles

    • Mapper Type: Role list

    • Role attribute name: roles

    • Friendly Name: Roles

    • SAML Attribute NameFormat: Basic

    • Single Role Attribute: On

idp Fingerprint 생성

1. Realm Settings > Keys > RSA256 > Certificate 복사 (Client의 Certificate를 입력할 경우 Client not found 오류가 발생)

2. https://www.samltool.com/fingerprint.php 접속하여 fingerprint 생성 (fingerprint 생성이 안될때는 https://www.samlcomponent.net/tools/fingerprint.aspx 사이트를 사용해도 무방함)

-----BEGIN CERTIFICATE-----로 시작하고 -----END CERTIFICATE-----로 끝나는 형식으로 입력

Gitlab에서 지원하는 알고리즘은 sha1이므로 해당 알고리즘 선택 후 fingerprint 생성

fingerprint 는 GitLab의 gitlab.rb에 등록되어야 함

 

GitLab

SAML 설정

1. gitlab.rb에서 아래의 내용을 추가 또는 수정(기존의 OmniAuth Settings의 주석은 그대로 두고 아래의 내용을 복사하여 추가)

### OmniAuth Settings ###! Docs: https://docs.gitlab.com/ee/integration/omniauth.html ... gitlab_rails['omniauth_enabled'] = true gitlab_rails['omniauth_allow_single_sign_on'] = ['saml'] gitlab_rails['omniauth_block_auto_created_users'] = false gitlab_rails['omniauth_auto_link_saml_user'] = true gitlab_rails['omniauth_providers'] = [ { "name" => "saml", "label" => "Get Auth", ###<보여지는 버튼 이름> "groups_attribute" => "roles", "external_groups" => ['<roles tab에 구성한 external 이름'], "args" => { assertion_consumer_service_url: '<gitlab url>/users/auth/saml/callback', idp_cert_fingerprint: '생성한 fingerprint', idp_sso_target_url: '<keycloak url>/auth/realms/<realm 이름>/protocol/saml/clients/<client의 id>', allowed_clock_drift: 5, issuer: '<client 이름>', attribute_statements: { first_name: ['first_name'], last_name: ['last_name'], name: ['name'], username: ['name'], email: ['email'] }, name_identifier_format: 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent' } } ]

2. GitLab 재구성

$ gitlab-ctl reconfigure

3. GitLab 로그인 확인

4. Keycloak 로그인

Sign in with 버튼을 클릭할 경우 Realm 로그인 창이 나타나고 계정을 입력하여 로그인 (테마를 base로 하지 않고 keycloak로 선택할 경우 아래와 같은 화면이 나타남)

 

5. 버튼 없이 바로 리디렉션 하는 방법

모든 로그인 시도는 SAML 서버로 리디렉션되므로 로컬 자격 증명을 사용하여 로그인 불가. 하나 이상의 SAML 사용자에게 관리자 권한이 있는지 확인 필요.

1. /etc/gitlab/gitlab.rb 파일 수정

gitlab_rails['omniauth_auto_sign_in_with_provider'] = 'saml'

2. 변경 사항 재적용

gitlab-ctl reconfigure