GitLab을 SSO 프로바이더로 사용한 인증
Teleport v18.9이 가이드는 특정 사용자 그룹에게 자격 증명을 발급하도록 GitLab을 구성하는 방법을 다룹니다. Teleport cluster를 GitLab에 애플리케이션으로 등록한 다음, 애플리케이션에 대한 정보를 Teleport에 제공하는 authentication connector 리소스를 생성할 수 있습니다.
이 가이드는 특정 사용자 그룹에게 자격 증명을 발급하도록 GitLab을 구성하는 방법을 다룹니다. 역할 기반 접근 제어(RBAC)와 함께 사용하면 관리자가 다음과 같은 정책을 정의할 수 있습니다:
- "DBA" 그룹의 구성원만 PostgreSQL 데이터베이스에 접근할 수 있습니다.
- "ProductionKubernetes"의 구성원만 프로덕션 Kubernetes 클러스터에 접근할 수 있습니다.
- 개발자는 프로덕션 서버에 절대 SSH 접근을 하면 안 됩니다.
작동 방식#
Teleport cluster를 GitLab에 애플리케이션으로 등록한 다음, 애플리케이션에 대한 정보를 Teleport에 제공하는 authentication connector 리소스를 생성할 수 있습니다. 사용자가 Teleport에 로그인하면 GitLab가 자체 인증 플로우를 실행한 후, 인증이 완료되었음을 알리기 위해 Teleport cluster에 HTTP 요청을 보냅니다.
Teleport는 수명이 짧은 인증서를 발급하여 사용자를 인프라에 인증합니다. 사용자가 SSO 인증 플로우를 완료하면 Teleport는 사용자에게 수명이 짧은 TLS 및 SSH 인증서를 발급합니다. 또한 Teleport는 Auth Service 백엔드에 임시 사용자를 생성합니다.
Teleport role은 사용자의 인증서에 인코딩됩니다. 사용자에게 Teleport role을 할당하기 위해 Auth Service는 authentication connector 내의 role mapping을 검사하며, 이는 GitLab의 사용자 데이터를 하나 이상의 Teleport role 이름과 연결합니다.
사전 요구 사항#
-
사용자가 할당된 최소 두 개의 GitLab 그룹. 아래 예제에서는 두 개의 서브그룹
admin과dev가 있는company라는 그룹을 가정합니다. -
oidc리소스를 유지 관리할 수 있는 접근 권한이 있는 Teleport 역할. 기본editor역할에서 사용 가능합니다. -
실행 중인 Teleport Enterprise 클러스터. Teleport를 시작하려면 무료 체험판에 가입하거나 데모 환경을 구성하세요.
-
tctlandtshclients.Installing `tctl` and `tsh` clients
-
Teleport 클러스터의 버전을 확인합니다.
tctlandtshclients는 Teleport 클러스터 버전보다 최대 한 개의 메이저 버전까지만 뒤처질 수 있습니다. Proxy Service의/v1/webapi/find로 GET 요청을 보내고 JSON 쿼리 도구를 사용하여 클러스터 버전을 확인합니다.teleport.example.com:443를 Teleport Proxy Service의 웹 주소로 바꿉니다:$ TELEPORT_DOMAIN=teleport.example.com:443 $ TELEPORT_VERSION="$(curl -s https://$TELEPORT_DOMAIN/v1/webapi/find | jq -r '.server_version')" -
사용 중인 플랫폼에 대한 지침에 따라
tctlandtshclients를 설치합니다:
-
Mac
`tctl` and `tsh` clients가 포함된, 서명된 Teleport macOS .pkg 설치 프로그램을 다운로드합니다:
```code
$ curl -O https://cdn.teleport.dev/teleport-${TELEPORT_VERSION?}.pkg
```
Finder에서 `pkg` 파일을 더블 클릭하여 설치를 시작합니다.
Homebrew를 사용하여 Teleport를 설치하는 것은 지원되지 않습니다. Homebrew의
Teleport 패키지는 Teleport에서 유지 관리하지 않으므로 신뢰성이나 보안을
보장할 수 없습니다.
Windows - Powershell
```code
$ curl.exe -O https://cdn.teleport.dev/teleport-v${TELEPORT_VERSION?}-windows-amd64-bin.zip
# Unzip the archive and move the `tctl` and `tsh` clients to your %PATH%
# NOTE: Do not place the `tctl` and `tsh` clients in the System32 directory, as this can cause issues when using WinSCP.
# Use %SystemRoot% (C:\Windows) or %USERPROFILE% (C:\Users\<username>) instead.
```
Linux
Linux 설치판의 모든 Teleport 바이너리에는 `tctl` and `tsh` clients가 포함되어 있습니다. RPM/DEB
패키지 및 i386/ARM/ARM64용 다운로드를 포함한 더 많은 옵션은
[설치 페이지](../installation/installation.mdx)를 참조하세요.
```code
$ curl -O https://cdn.teleport.dev/teleport-v${TELEPORT_VERSION?}-linux-amd64-bin.tar.gz
$ tar -xzf teleport-v${TELEPORT_VERSION?}-linux-amd64-bin.tar.gz
$ cd teleport
$ sudo ./install
# Teleport binaries have been copied to /usr/local/bin
```
Teleport cluster에 연결할 수 있는지 확인하려면 tsh login으로 로그인한 다음,
현재 자격 증명으로 tctl 명령을 실행할 수 있는지 확인합니다.
예를 들어, teleport.example.com에 cluster 내 Teleport Proxy Service의
도메인 이름을, email@example.com에 Teleport 사용자 이름을 지정하여
다음 명령을 실행합니다:
$ tsh login --proxy=teleport.example.com --user=email@example.com
$ tctl status
# Cluster (=teleport.url=)
# Version (=teleport.version=)
# CA pin (=presets.ca_pin=)
cluster에 연결하여 tctl status 명령을 실행할 수 있다면, 현재 자격 증명을 사용하여
워크스테이션에서 이후의 tctl 명령을 실행할 수 있습니다.
자체 Teleport cluster를 호스팅하는 경우, 전체 권한을 얻기 위해 Teleport Auth Service를
호스팅하는 컴퓨터에서 tctl 명령을 실행할 수도 있습니다.
1/3단계. GitLab 구성#
Teleport 역할에 매핑할 GitLab 그룹이 하나 이상 구성되어 있어야 합니다. 이 예제에서는 devs와 admins라는 이름을 사용합니다. 각 그룹에 사용자를 할당합니다.
-
GitLab OAuth 프로바이더로 Teleport를 사용할 수 있도록 하는 애플리케이션을 그룹 중 하나에 만듭니다(Group overview -> Settings -> Applications).
teleport.example.com을 Teleport Proxy Service의 공개 주소에 할당합니다. 여러 공개 주소를 가진 셀프 호스팅 클러스터가 있는 경우 이 주소가 첫 번째로 나열된 것을 가리키도록 합니다.설정:
- 리다이렉트 URL:
https://<code>teleport.example.com</code>/v1/webapi/oidc/callback. Confidential,openid,profile,email체크.

- 리다이렉트 URL:
-
애플리케이션에서
Application ID와Secret을 수집합니다. Teleport OIDC 인증 커넥터에서 사용됩니다:
-
GitLab 발급자 주소를 확인합니다.
GitLab.com의 경우 발급자 주소는
https://gitlab.com입니다. 이를 통해 Teleport가https://gitlab.com/.well-known/openid-configuration에서 Open-ID 구성에 접근할 수 있습니다. 셀프 호스팅의 경우 발급자 주소는 GitLab 인스턴스의 경로입니다.
2/3단계. GitLab을 Teleport에 연결#
이 섹션에서는 Teleport가 GitLab과 OIDC 메시지를 교환하고 사용자에게 인증서를 발급하는 데 필요한 정보를 제공하는 인증 커넥터를 만듭니다.
역할 매핑 할당#
사용자가 Teleport에 인증하면, Teleport Auth Service는 사용자의 Teleport 역할이 포함된 SSH 및 TLS 인증서를 사용자에게 발급합니다.
SSO 인증 커넥터의 경우, Auth Service는 인증 커넥터의 역할 매핑을 읽어 인증서에 어떤 역할을 인코딩할지 결정합니다. 역할 매핑은 아이덴티티 제공자가 사용자에 대해 저장하는 데이터를 기반으로 어떤 Teleport 역할을 할당할지 나타냅니다.
tctl CLI를 사용하여 인증 커넥터를 구성할 때, 역할 매핑은 다음 형식을
따릅니다:
<claim_name>,<claim_value>,<teleport_role_1>,<teleport_role_2>,...,<teleport_role_n>
예를 들어, 다음 역할 매핑은 값이 admins인 claim groups를 가진 모든
사용자가 Teleport 역할 auditor와 editor를 받는다는 것을 의미합니다:
groups,admins,auditor,editor
이 가이드의 목적을 위해 두 개의 개별 역할 매핑을 할당합니다:
- 더 관대한 역할 매핑:
groups,admins,auditor,editor - 더 제한적인 역할 매핑:
groups,devs,access
OIDC 커넥터 구성#
tctl을 사용하여 OIDC 커넥터 리소스를 만듭니다.
워크스테이션에서 클라이언트 시크릿만 포함된 client-secret.txt 파일을 만듭니다.
GitLab의 애플리케이션 ID와 시크릿으로 교체합니다:
$ tctl sso configure oidc --preset gitlab \
--id \
--secret $( cat client-secret.txt) \
--claims-to-roles mapping_1 \
--claims-to-roles mapping_2 > oidc.yaml
GitLab의 애플리케이션 ID와 시크릿으로 교체하고, https://gitlab.company.com을 셀프 호스팅 GitLab 인스턴스의 경로로 교체합니다:
$ tctl sso configure oidc --preset gitlab \
--id \
--issuer-url https://gitlab.company.com \
--secret $( cat client-secret.txt) \
--claims-to-roles mapping_1 \
--claims-to-roles mapping_2 > oidc.yaml
이 예제는 부모 그룹 company의 두 서브그룹 admins와 devs를 Teleport의 auditor 및 access 역할에 매핑하고 oidc.yaml 파일을 만듭니다:
kind: oidc
metadata:
name: gitlab
spec:
claims_to_roles:
- claim: groups
roles:
- auditor
- editor
value: company/admins
- claim: groups
roles:
- access
value: company/devs
client_id:
client_secret:
display: GitLab
issuer_url: https://gitlab.com
prompt: none
redirect_url: https://teleport.example.com:443/v1/webapi/oidc/callback
version: v3
기본적으로 Teleport는 OIDC claim에 email claim이 있을 것으로 예상합니다.
email claim의 값이 Teleport에서 사용자 이름으로 사용됩니다. 사용자 이름을 구성하는 데
다른 claim을 사용하려면 auth connector 스펙의 username_claim 필드로 기본적으로
예상되는 email claim을 재정의할 수 있습니다.
아래 예제는 username_claim 필드를 preferred_username 값으로 구성하는 방법을
보여줍니다. 이렇게 하면 Teleport가 email claim 대신 preferred_username claim을
쿼리하도록 구성됩니다.:
kind: oidc
metadata:
# ...
spec:
# ...
username_claim: preferred_username
username_claim을 구성하는 데 사용하는 claim 값이 사용자를 고유하게 식별할 수 있는
값인지 확인하세요.
콜백 주소 변경
로컬 머신 대신 원격 머신으로 콜백해야 하는 경우 콜백 주소를 변경할 수 있습니다.
# --bind-addr sets the host and port tsh will listen on, and --callback changes
# what link is displayed to the user
$ tsh login --proxy=proxy.example.com --auth=github --bind-addr=localhost:1234 --callback https://remote.machine:1234
이것이 동작하려면 콜백에 사용될 원격 머신의 호스트 이름 또는 CIDR을
auth 커넥터의 client_redirect_settings를 통해 허용해야 합니다.
kind: oidc
metadata:
name: example-connector
spec:
client_redirect_settings:
# a list of hostnames allowed for HTTPS client redirect URLs
# can be a regex pattern
allowed_https_hostnames:
- remote.machine
- '*.app.github.dev'
- '^\d+-[a-zA-Z0-9]+\.foo.internal$'
# a list of CIDRs allowed for HTTP or HTTPS client redirect URLs
insecure_allowed_cidr_ranges:
- '192.168.1.0/24'
- '2001:db8::/96'
커넥터 테스트#
파일을 tctl sso test에 파이프하여 커넥터 리소스를 테스트합니다:
$ cat oidc.yaml | tctl sso test
GitLab에서 애플리케이션을 인증한 후 웹 브라우저에 Login Successful 메시지가 표시되어야 합니다. 그렇지 않으면 명령의 출력을 참고하여 진단합니다.
커넥터 만들기#
tctl 도구를 사용하여 커넥터를 만듭니다:
$ tctl create -f oidc.yaml
이제 웹 UI에 새 버튼 "Login with GitLab"이 있습니다. CLI는 이전과 동일합니다:
$ tsh --proxy=teleport.example.com login
이 명령은 SSO 로그인 URL을 출력합니다(그리고 브라우저에서 자동으로 열려고 합니다).
Teleport는 여러 OIDC/SAML 커넥터를 사용할 수 있습니다. 이 경우 커넥터 이름은 tsh login --auth=connector_name으로 전달할 수 있습니다.
Teleport는 OIDC Connect에 대해 전송자 주도 플로우만 지원합니다. 즉, 아이덴티티 프로바이더에서 로그인을 시작할 수 없으며 Teleport 웹 UI 또는 CLI에서 로그인을 시작해야 합니다.
3/3단계. 인증 기본 설정 구성#
이 가이드에서 구성한 인증 커넥터를 Teleport 클러스터의 기본 인증 방식으로 설정할 수 있도록 클러스터 인증 기본 설정을 편집하십시오.
Teleport Web UI를 엽니다. 왼쪽 사이드바에서 Zero Trust Access > Auth Connectors로 이동합니다. 기본값으로 설정하려는 커넥터를 찾아 점 세 개 메뉴에서 Set as default를 선택하십시오.
Teleport 리소스를 구성 파일로 관리하는 경우, 동적 리소스를 사용하여 기본 인증
커넥터를 선택할 수 있습니다. 이 경우 tctl을 사용하여 cluster_auth_preference
값을 편집하십시오:
$ tctl edit cluster_auth_preference
spec.type 값을 oidc로 설정하십시오:
kind: cluster_auth_preference
metadata:
...
name: cluster-auth-preference
spec:
...
type: oidc
...
version: v2
저장 후 편집기를 종료하면 tctl이 리소스를 업데이트합니다:
cluster auth preference has been updated
클러스터 인증 기본 설정을 편집하는 추가 방법
클러스터 인증 기본 설정은 Teleport Terraform 프로바이더 리소스로 제공됩니다. 구성 옵션 목록은 Cluster Auth Preferences Resource Reference에서 확인하십시오.
Teleport를 자체 호스팅하는 경우, Teleport Auth Service 구성 파일을 편집하여 다음을 포함할 수 있습니다:
# Snippet from /etc/teleport.yaml
auth_service:
authentication:
type: oidc
아이덴티티 프로바이더를 구성하기 전에 다시 로그인해야 하는 경우,
--auth=local
다음 단계#
이제 Teleport를 자격 증명 공급자(identity provider)에 연결했으므로, Teleport가 IdP 데이터를 Teleport 역할에 포함하는 방식을 사용자 정의할 수 있습니다.
**역할 템플릿(role templates)**을 사용하면 IdP의 사용자 데이터를 Teleport
역할에 직접 포함할 수 있습니다. 역할 필드 값에 external 템플릿 변수를 사용하면,
Teleport가 해당 값을 IdP에서 전달받습니다. 다음 예시에서는 사용자가 원격 시스템의
특정 프린시펄(principal)을 가정하도록 허용하는 데 사용할 수 있는 모든 역할 옵션이
IdP에서 옵니다:
kind: role
version: v7
metadata:
name: sso-users
spec:
allow:
logins: ['{{external.logins}}']
aws_role_arns: ['{{external.aws_role_arns}}']
azure_identities: ['{{external.azure_identities}}']
db_names: ['{{external.db_names}}']
db_roles: ['{{external.db_roles}}']
db_users: ['{{external.db_users}}']
desktop_groups: ['{{external.desktop_groups}}']
gcp_service_accounts: ['{{external.gcp_service_accounts}}']
host_groups: ['{{external.host_groups}}']
host_sudoers: ['{{external.host_sudoers}}']
kubernetes_groups: ['{{external.kubernetes_groups}}']
kubernetes_users: ['{{external.kubernetes_users}}']
windows_desktop_logins: ['{{external.windows_desktop_logins}}']
external 템플릿 변수 사용에 대한 자세한 내용은 역할
템플릿을 참조하세요.
위에 나열된 필드에 대한 설명은 역할 레퍼런스를 참조하세요.
IdP 사용자 데이터를 Teleport 역할에 포함하기 전에 변환해야 하는 경우, **로그인 규칙(Login Rules)**을 사용하여 이를 수행할 수 있습니다. 로그인 규칙을 사용하면 IdP가 Teleport가 예상하는 형식과 다른 형식으로 사용자 데이터를 제공하더라도 외부 트레잇(external traits)을 Teleport 역할에 포함할 수 있습니다. 로그인 규칙에 대해 자세히 알아보세요.
문제 해결#
이 섹션의 내용은 원문 문서를 참조하세요. (oidc-login-troubleshooting.mdx)