인포레터에서 최신 DevOps 트렌드를 격주로 만나보세요!
Active Directory Federation Services를 통한 SSO
이 가이드는 Active Directory Federation Services (ADFS)를 구성하여 특정 사용자 그룹에 로그인 자격 증명을 발급하는 단일 로그인(SSO) 공급자로 설정하는 방법을 설명합니다. 역할 기반 액세스 제어(RBAC)와 함께 사용하면 Teleport 관리자가 다음과 같은 정책을 정의할 수 있습니다:
- "DBA" 그룹의 구성원만 PostgreSQL을 실행하는 머신에 SSH로 접속할 수 있습니다.
- 개발자는 운영 서버에 SSH로 접속해서는 안 됩니다.
필수 조건
- 관리자 액세스 권한이 있는 ADFS 설치 및 두 개 이상의 그룹에 할당된 사용자.
saml
리소스를 유지 관리할 수 있는 액세스를 가진 Teleport 역할. 기본editor
역할에서 제공됩니다.
-
실행 중인 Teleport 클러스터. Teleport를 시작하려면 가입하여 무료 평가판을 이용해 보십시오.
-
tctl
관리자 도구 및tsh
클라이언트 도구.tctl
및tsh
다운로드에 대한 지침은 설치 를 방문하십시오.
- 연결이 가능한지 확인하기 위해
tsh login
으로 로그인한 다음, 현재 자격 증명을 사용하여tctl
명령어를 실행할 수 있는지 확인하십시오. 예를 들어:클러스터에 연결할 수 있고tsh login --proxy=teleport.example.com --user=email@example.comtctl status클러스터 teleport.example.com
버전 17.0.0-dev
CA 핀 sha256:abdc1245efgh5678abdc1245efgh5678abdc1245efgh5678abdc1245efgh5678
tctl status
명령어를 실행할 수 있다면, 현재 자격 증명을 사용하여 워크스테이션에서 후속tctl
명령어를 실행할 수 있습니다.
자신의 Teleport 클러스터를 호스팅하는 경우, Teleport Auth Service를 호스팅하는 컴퓨터에서 전체 권한으로tctl
명령어를 실행할 수도 있습니다.
1/3단계. ADFS 구성
사용자에 대한 클레임을 내보내도록 ADFS를 구성해야 합니다(ADFS 용어로 클레임 제공자 신뢰) 그리고 ADFS가 Teleport를 신뢰하도록 구성해야 합니다(ADFS 용어로 의존하는 파티 신뢰).
클레임 제공자 신뢰 구성을 위해 AD FS 관리 창을 엽니다.
Claims Provider Trusts에서 Active Directory를 마우스 오른쪽 버튼으로 클릭하고 Edit Claim Rules를 선택합니다.
다음 두 개의 수신 클레임을 지정해야 합니다: Name ID
와 Group
.
-
Name ID
는 LDAP 속성E-Mail-Addresses
를Name ID
로 매핑해야 합니다. -
그룹 구성원 클레임은 사용자를 역할에 매핑하는 데 사용해야 합니다(예: 일반 사용자와 관리자를 구분하기 위해).
-
동적 역할을 사용하는 경우(아래 참조) LDAP 속성
SAM-Account-Name
을Windows account name
으로 매핑하는 것이 유용할 수 있습니다: -
E-Mail-Addresses
를UPN
으로 매핑하는 또 다른 항목을 생성합니다:
또한 의존하는 파티 신뢰를 생성해야 합니다. 아래 정보를 사용하여 마법사를 안내합니다.
- 의존하는 파티 신뢰 생성:
- 의존하는 파티에 대한 데이터를 수동으로 입력합니다.
- 표시 이름을
Teleport
와 비슷하게 설정합니다. - 토큰 암호화 인증서는 건너뜁니다.
- *"SAML 2.0 웹 SSO 프로토콜 지원 활성화"*를 선택하고 URL을
https://teleport.example.com/v1/webapi/saml/acs
로 설정하고, 도메인 이름을 Teleport 프록시 URL로 교체합니다. - 의존하는 파티 신뢰 식별자를
https://teleport.example.com/v1/webapi/saml/acs
로 설정합니다. - 액세스 제어 정책에 대해 *"모두 허용"*을 선택합니다.
의존하는 파티 신뢰가 생성되면, 그에 대한 클레임 발행 정책을 업데이트합니다.
전과 마찬가지로 최소한 Name ID
와 Group
클레임이 의존하는 파티(텔레포트)로 전송되도록 합니다.
동적 역할을 사용하는 경우 LDAP 속성 SAM-Account-Name
을 *"Windows account name"*으로 매핑하고
E-Mail-Addresses
를 *"UPN"*으로 매핑하는 것이 유용할 수 있습니다.
마지막으로 Active Directory에서 생성한 사용자가 이메일 주소와 연결되어 있는지 확인합니다. 이를 확인하려면 Server Manager를 열고 *"Tools -> Active Directory Users and Computers"*를 선택한 후 사용자를 선택하고 마우스 오른쪽 버튼을 클릭하여 속성을 엽니다. 이메일 주소 필드가 작성되어 있는지 확인합니다.
2/3단계. Teleport 역할 만들기
관리자용 역할 하나와 일반 사용자용 역할 하나를 만들어 봅시다. tctl create {파일 이름}
CLI 명령어 또는 웹 UI를 통해 만들 수 있습니다.
# admin-role.yaml
kind: "role"
version: "v3"
metadata:
name: "admin"
spec:
options:
max_session_ttl: "8h0m0s"
allow:
logins: [root]
node_labels:
"*": "*"
rules:
- resources: ["*"]
verbs: ["*"]
# user-role.yaml
kind: "role"
version: "v3"
metadata:
name: "dev"
spec:
options:
# 일반 사용자는 게스트로만 로그인할 수 있으며, 그들의 인증서 TTL은 1시간입니다:
max_session_ttl: "1h"
allow:
# ubuntu 또는 'windowsaccountname' 클레임으로 로그인만 허용합니다
logins:
[
'{{external["http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname"]}}',
ubuntu,
]
node_labels:
"access": "relaxed"
이 역할은 다음을 선언합니다:
- 개발자는
access: relaxed
로 레이블이 지정된 노드에만 로그인할 수 있습니다. - 개발자는
ubuntu
사용자로 로그인할 수 있습니다. - 개발자는 이전 세션을 볼 수 없거나 재생할 수 없으며 Teleport 클러스터를 재구성할 수 없습니다.
로그인
{{external["http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname"]}}
http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname
속성을 확인하고 해당 필드를 각 사용자의 허용된 로그인으로 사용하도록 구성합니다. 속성 이름에 문자인자 이외의 문자가 포함되므로 속성 이름 주위에 이중 따옴표("
)와 대괄호([]
)를 사용해야 합니다.
3/3단계. SAML 커넥터 만들기
tctl
을 사용하여 SAML 커넥터 리소스를 만듭니다:
tctl sso configure saml --acs https://teleport.example.com/v1/webapi/saml/acs \ --preset adfs \ --entity-descriptor https://adfs.example.com/FederationMetadata/2007-06/FederationMetadata.xml \ --attributes-to-roles http://schemas.xmlsoap.org/claims/Group,teleadmins,editor \ --attributes-to-roles http://schemas.xmlsoap.org/claims/Group,Users,access \ > adfs.yaml
acs
필드는 이전에 ADFS에서 설정한 값과 일치해야 하며, entity_descriptor_url
은 ADFS의 "ADFS -> Service -> Endpoints -> Metadata" 아래에서 얻을 수 있습니다.
attributes_to_roles
는 방금 생성한 Teleport 역할에 속성을 매핑하는 데 사용됩니다. 이 경우 "Group" 속성의 전체 이름인 http://schemas.xmlsoap.org/claims/Group
값이 *"teleadmins"*인 경우 "editor" 역할에 매핑됩니다. 값이 *"users"*인 그룹은 "users" 역할에 매핑됩니다.
적용하기 전에 이 커넥터를 테스트할 수 있습니다(cat adfs.yaml | tctl sso test
), 하지만 다음 단계를 완료하기 전까지 인증 프로세스는 완료되지 않습니다.
커넥터를 적용합니다:
tctl create -f adfs.yaml
서명 키 내보내기
마지막 단계에서는 서명 키를 내보내야 합니다:
tctl saml export adfs > saml.cer
saml.cer
파일을 ADFS 서버로 복사하고, "Relying Party Trust"를 열어 이 파일을 서명 검증 인증서 중 하나로 추가합니다:
이제 웹 UI에 "MS Active Directory로 로그인"이라는 새로운 버튼이 표시됩니다. CLI는 이전과 동일합니다:
tsh --proxy=proxy.example.com login
이 명령은 SSO 로그인 URL을 출력하고 자동으로 브라우저에서 열려고 시도합니다.
팁
Teleport는 여러 SAML 커넥터를 사용할 수 있습니다. 이 경우 커넥터 이름을 tsh login --auth=connector_name
으로 전달할 수 있습니다.
기본 SAML 인증 활성화
Teleport를 로컬 사용자 데이터베이스 대신 기본으로 SAML 인증을 사용하도록 구성합니다.
sctl
을 사용하여 cluster_auth_preference
값을 편집합니다:
tctl edit cluster_auth_preference
spec.type
의 값을 saml
로 설정합니다:
kind: cluster_auth_preference
metadata:
...
name: cluster-auth-preference
spec:
...
type: saml
...
version: v2
편집기를 저장하고 나가면, tctl
이 리소스를 업데이트합니다:
클러스터 인증 기본값이 업데이트되었습니다
Tip
SAML 공급자를 구성하기 전에 다시 로그인해야 하는 경우, 플래그 --auth=local
문제 해결
SSO 구성 문제 해결은 어려울 수 있습니다. 일반적으로 Teleport 관리자는 다음을 수행할 수 있어야 합니다:
- SSO 공급자가 Teleport에 내보내고 전달하는 SAML/OIDC 클레임 및 값이 무엇인지 확인할 수 있어야 합니다.
- Teleport가 수신한 클레임을 커넥터에 정의된 역할 매핑으로 어떻게 매핑하는지 확인할 수 있어야 합니다.
- 자체 호스팅된 Teleport Enterprise 클러스터의 경우, Teleport 프록시 서비스와 SSO 공급자 모두에 대해 HTTP/TLS 인증서가 올바르게 구성되어 있는지 확인해야 합니다.
작동하지 않는 경우, 다음을 권장합니다:
- 커넥터 정의에서 호스트 이름, 토큰 및 TCP 포트를 다시 확인하십시오.
웹 UI 사용하기
"접근 거부" 또는 다른 로그인 오류가 발생하면 가장 먼저 확인할 곳은 감사 로그입니다. 관리 영역 아래에서 Teleport 웹 UI의 활동 탭 내에서 접근할 수 있습니다.
역할 clusteradmin
이 설정되지 않아 사용자 접근이 거부된 예시:
{
"code": "T1001W",
"error": "role clusteradmin is not found",
"event": "user.login",
"message": "Failed to calculate user attributes.\n\trole clusteradmin is not found",
"method": "oidc",
"success": false,
"time": "2024-11-07T15:41:25.584Z",
"uid": "71e46f17-d611-48bb-bf5e-effd90016c13"
}
Teleport에서 예상되는 노드가 표시되지 않음
Teleport의 Auth 서비스가 Teleport 노드를 목록화하라는 요청을 받을 때(예: 웹 UI에서 노드를 표시하거나 tsh ls
를 통해), 현재 사용자가 볼 수 있는 노드만 반환합니다.
사용자의 Teleport 클러스터의 각 노드에 대해 Auth 서비스는 다음과 같은 검사를 순서대로 적용하며, 하나의 검사가 실패할 경우 해당 노드를 사용자에게 숨깁니다:
- 사용자의 역할 중 어느 것도 노드의 레이블과 일치하는
deny
규칙을 포함하지 않습니다. - 사용자의 역할 중 최소 하나가 노드의 레이블과 일치하는
allow
규칙을 포함합니다.
예상치 못하게 노드가 보이지 않는 경우, 사용자의 역할에 적절한 allow
및 deny
규칙이 포함되어 있는지 확인하십시오. 이는 Teleport Access Controls Reference에서 문서화되어 있습니다.
SSO를 구성할 때, ID 공급자가 각 사용자의 특성을 올바르게 인구시키고 있는지 확인하십시오. 사용자가 Teleport에서 노드를 보기 위해서는 역할의 allow.logins
에 있는 템플릿 변수의 결과가 사용자의 traits.logins
중 하나와 일치해야 합니다.
이 예에서 사용자는 env: dev
레이블이 있는 노드에 대해 ubuntu
, debian
및 SSO 특성의 사용자 이름 logins
를 가집니다. SSO 특성 사용자 이름이 bob
인 경우 사용자 이름에는 ubuntu
, debian
및 bob
이 포함됩니다.
kind: role
metadata:
name: example-role
spec:
allow:
logins: ["{{external.logins}}", ubuntu, debian]
node_labels:
"env": "dev"
version: v5
OIDC와 함께 단일 로그인 실패
**"JWT 검증 실패: oidc: JWT 서명 검증 불가능: 일치하는 키 없음"**라는 오류 메시지를 접하면, 이는 일반적으로 JWT 토큰 서명에 사용된 알고리즘과 JSON 웹 키 세트(JWKS)가 지원하는 알고리즘 간의 불일치를 나타냅니다. 특히, 토큰이 하나의 알고리즘(예: HS256)으로 서명되었으며, JWKS는 다른 알고리즘(예: RS256)에 대한 키만 나열될 수 있습니다. 이 문제는 기능이 매우 낮은 ID 공급자를 사용할 때 주로 발생합니다.
다음과 같은 사항을 확인하십시오:
- JWT 헤더가 올바른 서명 알고리즘을 지정하고 있는지 확인하십시오. 이는 JWKS 엔드포인트 응답의 키 섹션에 나열된 알고리즘 중 하나와 일치해야 합니다.
- JWKS 엔드포인트가 모든 관련 공개 키를 반환하는지 확인하십시오. 때때로 키 회전에 따라 유효한 키가 누락될 수 있습니다.
문제를 해결하려면 JWT 알고리즘 헤더를 JWKS에서 지원하는 알고리즘과 일치시킵니다. 필요시 키를 회전시킵니다. JWKS가 활성 공개 키만 게시하는지 확인하십시오. 올바른 구성이 이루어지면 서명이 성공적으로 검증되어야 합니다.
다음 단계
이 가이드에서 설명한 Teleport 역할에서 external
특성은 사용자가 Teleport에 인증하는 데 사용한 단일 사인온 제공자의 값으로 대체됩니다. Teleport 역할에서 특성이 작동하는 방식에 대한 전체 세부 사항은 Teleport 액세스 제어 참조를 참조하십시오.