Infograb logo
Azure Active Directory (AD)와 Teleport 인증

이 가이드는 Microsoft Azure Active Directory를 구성하여 SAML 인증 커넥터를 통해 특정 사용자 그룹에 자격 증명을 발급하는 방법을 다룹니다. 역할 기반 접근 제어(RBAC)와 결합하여, Teleport 관리자가 다음과 같은 정책을 정의할 수 있도록 합니다:

  • "DBA" Azure AD 그룹의 구성원만 PostgreSQL 데이터베이스에 연결할 수 있습니다.
  • 개발자는 운영 서버에 SSH로 접근할 수 없습니다.

다음 단계에서는 Azure AD 그룹과 보안 역할이 일치하는 예제 SAML 인증 커넥터를 구성합니다. 다른 옵션을 구성할 수도 있습니다.

전제 조건

시작하기 전에 다음이 필요합니다:

  • 비갤러리 애플리케이션을 생성할 수 있는 Azure AD 관리 계정 (P2 라이센스).
  • 디렉토리에 하나 이상의 사용자를 등록합니다.
  • Azure AD에서 최소 두 개의 보안 그룹을 생성하고 각 그룹에 하나 이상의 사용자를 할당합니다.
  • saml 리소스를 유지 관리할 수 있는 Teleport 역할. 이는 기본 editor 역할에서 사용할 수 있습니다.
  • 실행 중인 Teleport 클러스터. Teleport를 시작하려면 가입하여 무료 평가판을 이용해 보십시오.

  • tctl 관리자 도구 및 tsh 클라이언트 도구.

    tctltsh 다운로드에 대한 지침은 설치 를 방문하십시오.

  • 연결이 가능한지 확인하기 위해 tsh login 으로 로그인한 다음, 현재 자격 증명을 사용하여 tctl 명령어를 실행할 수 있는지 확인하십시오. 예를 들어:
    tsh login --proxy=teleport.example.com --user=email@example.com
    tctl status

    클러스터 teleport.example.com

    버전 17.0.0-dev

    CA 핀 sha256:abdc1245efgh5678abdc1245efgh5678abdc1245efgh5678abdc1245efgh5678

    클러스터에 연결할 수 있고 tctl status 명령어를 실행할 수 있다면, 현재 자격 증명을 사용하여 워크스테이션에서 후속 tctl 명령어를 실행할 수 있습니다.
    자신의 Teleport 클러스터를 호스팅하는 경우, Teleport Auth Service를 호스팅하는 컴퓨터에서 전체 권한으로 tctl 명령어를 실행할 수도 있습니다.

1/3단계. Azure AD 구성

엔터프라이즈 애플리케이션 생성

  1. Azure AD -> Enterprise Applications 를 선택합니다.

    관리에서 Enterprise Applications 선택
  2. New application 을 선택합니다.

  3. Create your own application 을 선택하고 애플리케이션 이름을 입력합니다 (예: Teleport) 그리고 Integrate any other application you don't find in the gallery (Non-gallery) 를 선택합니다.

  4. Manage 아래의 Properties 를 선택하고 Assignment required?No 로 설정합니다.

    다음 단계로 진행하기 전에 Save 를 클릭합니다.

SAML 구성

  1. Manage 아래의 Single sign-on 을 선택하고 SAML 을 선택합니다.

  2. Basic SAML Configuration 을 편집합니다.

  3. Entity IDReply URL 필드에 Teleport Proxy Service 호스트의 URL을 입력합니다:

    https://mytenant.teleport.sh:443/v1/webapi/saml/acs/ad

    다음 단계로 진행하기 전에 Save 를 클릭합니다.

  4. SAML Certificates 섹션에서 App Federation Metadata URL 링크를 복사하고 Teleport 커넥터 구성에 사용하기 위해 저장합니다:

속성 및 클레임 편집

  1. Required claim 아래에서 Unique User Identifier (Name ID) 를 클릭합니다.

  2. "name identifier format"을 Default 로 변경합니다. 소스 속성이 user.userprincipalname 인지 확인합니다.

  3. 사용자 보안 그룹을 커넥터에서 사용할 수 있도록 그룹 클레임을 추가합니다:

  4. (선택 사항) Azure AD 사용자 이름의 형식을 소문자로 변환하는 클레임을 추가하여 Teleport 역할 내에서 {{external.username}} 속성으로 사용할 수 있게 합니다.

    소스를 "Transformation"으로 설정합니다. 새로운 패널에서:

    • 변환 값을 "Extract()" 로 설정합니다.

    • 속성 이름을 user.userprincipalname 으로 설정합니다.

    • 값을 @ 로 설정합니다.

    • "Add Transformation"을 클릭하고 변환을 ToLowercase() 로 설정합니다.

2/3단계. SAML 커넥터 생성

이제 tctl 을 사용하여 SAML 커넥터 리소스를 생성합니다.

tctl sso configure saml --preset ad \--entity-descriptor https://login.microsoftonline.com/ff882432.../federationmetadata/2007-06/federationmetadata.xml\?appid\=b8d06e01... \--attributes-to-roles http://schemas.microsoft.com/ws/2008/06/identity/claims/groups,41c94563...,dev \--attributes-to-roles http://schemas.microsoft.com/ws/2008/06/identity/claims/groups,8adac502...,access > azure-connector.yaml

위의 예제에서:

  • --entity-descriptor 는 이전 단계에서 저장된 앱 페더레이션 메타데이터 URL을 지정합니다.
  • --attributes-to-roles 는 그룹을 위한 스키마 정의의 이름, AD 그룹의 UUID 및 그룹의 구성원에게 할당되는 Teleport 역할을 지정합니다.

이제 azure-connector.yaml 파일은 다음과 비슷해야 합니다:

kind: saml
metadata:
  name: ad
spec:
  acs: https://mytenant.teleport.sh/v1/webapi/saml/acs/ad
  attributes_to_roles:
    - name: http://schemas.microsoft.com/ws/2008/06/identity/claims/groups
      roles:
        - dev
      value: 41c94563...
    - name: http://schemas.microsoft.com/ws/2008/06/identity/claims/groups
      roles:
        - access
      value: 8adac502...
  audience: https://mytenant.teleport.sh/v1/webapi/saml/acs/ad
  cert: ""
  display: Microsoft
  entity_descriptor: ""
  entity_descriptor_url: https://login.microsoftonline.com/ff882432.../federationmetadata/2007-06/federationmetadata.xml?appid=b8d06e01...
  issuer: ""
  service_provider_issuer: https://mytenant.teleport.sh/v1/webapi/saml/acs/ad
  sso: ""
version: v2

클러스터에 커넥터가 설정되면 tctl 로 테스트할 수 있습니다:

cat azure-connector.yaml | tctl sso test

브라우저가 열리고 Azure AD 자격 증명을 사용하여 Teleport 클러스터에 로그인됩니다. 문제가 발생하면 CLI 출력을 통해 커넥터 구성을 디버깅하는 데 도움이 됩니다.

tctl 도구를 사용하여 커넥터를 생성하려면 다음 명령을 실행합니다:

tctl create -f azure-connector.yaml

3/3단계. 새로운 Teleport 역할 생성

Linux 로그인 허용을 결정하기 위해 Azure AD 커넥터의 외부 사용자 이름 데이터를 사용하는 Teleport 역할 리소스를 생성합니다.

dev.yaml 이라는 파일을 생성하고 다음 내용을 추가합니다:

kind: role
version: v5
metadata:
  name: dev
spec:
  options:
    max_session_ttl: 24h
  allow:
    # ubuntu 또는 'windowsaccountname' 클레임으로만 로그인을 허용합니다
    logins:
      [
        '{{external["http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname"]}}',
        ubuntu,
      ]
    node_labels:
      access: relaxed

dev 역할을 가진 사용자만 access: relaxed Teleport 레이블이 있는 노드에 로그인할 수 있습니다. 그들은 ubuntu 또는 Azure AD 커넥터에서 windowsaccountname 속성을 사용하여 전달된 사용자 이름으로 로그인할 수 있습니다.

로그인

{{external["http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname"]}} 은 Teleport가 http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname 속성을 확인하고 각 사용자의 허용된 로그인으로 해당 필드를 사용하도록 구성합니다. 속성 이름에 문자 외의 문자, 숫자 및 밑줄이 포함되어 있으므로 속성 이름 주위에 큰따옴표(")와 대괄호([])를 사용해야 합니다.

역할을 생성합니다:

tctl create dev.yaml

기본 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 을 사용하십시오.

토큰 암호화 (선택 사항)

Azure AD의 SAML 토큰 암호화는 SSO 리디렉션 중 Teleport에 전송되는 SAML 어설션을 암호화합니다.

토큰 암호화는 Azure Active Directory 프리미엄 기능이며 별도의 라이센스가 필요합니다. Azure AD와 Teleport Proxy Service 간의 트래픽은 이미 HTTPS를 사용하기 때문에 토큰 암호화는 선택 사항입니다. 토큰 암호화를 활성화해야 하는지 여부를 결정하려면 Azure AD 문서를 읽으십시오.

Teleport 토큰 암호화 설정

공개/개인 키와 인증서를 생성하는 것부터 시작하십시오. 공개 인증서는 Azure AD에 설정하고 개인 키는 Teleport에 설정합니다.

openssl req -nodes -new -x509 -keyout server.key -out server.cer

기존 커넥터를 수정하는 경우, 편집기에서 열어보십시오:

tctl edit saml

Teleport가 signing_key_pair 를 생성했음을 알 수 있습니다. 이 키 쌍은 응답 서명을 위해 사용됩니다.

kind: saml
metadata:
  name: ad
spec:
  acs: https://mytenant.teleport.sh/v1/webapi/saml/acs/azure-saml
  attributes_to_roles:
    - name: http://schemas.microsoft.com/ws/2008/06/identity/claims/groups
      roles:
        - editor
        - access
        - auditor
      value: "*"
  audience: https://mytenant.teleport.sh/v1/webapi/saml/acs/azure-saml
  cert: ""
  display: Microsoft
  entity_descriptor:
  entity_descriptor_url: https://login.microsoftonline.com/ff882432.../federationmetadata/2007-06/federationmetadata.xml?appid=b8d06e01...
  issuer: https://sts.windows.net/your-id-here/
  service_provider_issuer: https://mytenant.teleport.sh/v1/webapi/saml/acs/azure-saml
  signing_key_pair:
    cert: |
      -----BEGIN CERTIFICATE-----
      ...
      -----END CERTIFICATE-----
    private_key: |
      -----BEGIN RSA PRIVATE KEY-----
      ...
      -----END RSA PRIVATE KEY-----
  sso: https://login.microsoftonline.com/your-id-here/saml2
version: v2

server.keyserver.cer 의 데이터를 사용하여 assertion_key_pair 를 추가하십시오.

kind: saml
metadata:
  name: azure-saml
spec:
  acs: https://mytenant.teleport.sh/v1/webapi/saml/acs/azure-saml
  attributes_to_roles:
    - name: http://schemas.microsoft.com/ws/2008/06/identity/claims/groups
      roles:
        - editor
        - access
        - auditor
      value: "*"
  audience: https://mytenant.teleport.sh/v1/webapi/saml/acs/azure-saml
  cert: ""
  display: Microsoft
  entity_descriptor:
  entity_descriptor_url: https://login.microsoftonline.com/ff882432.../federationmetadata/2007-06/federationmetadata.xml?appid=b8d06e01...
  issuer: https://sts.windows.net/your-id-here/
  service_provider_issuer: https://mytenant.teleport.sh/v1/webapi/saml/acs/azure-saml
  signing_key_pair:
    cert: |
      -----BEGIN CERTIFICATE-----
      ...
      -----END CERTIFICATE-----
    private_key: |
      -----BEGIN RSA PRIVATE KEY-----
      ...
      -----END RSA PRIVATE KEY-----
  sso: https://login.microsoftonline.com/your-id-here/saml2
version: v2
경고

인증서 및 키의 모든 줄에 대해 동일한 들여쓰기를 확인하십시오. 그렇지 않으면 Teleport가 YAML 파일을 파싱하지 못할 수 있습니다.

편집 후, 파일은 다음과 같이 보일 것입니다:

kind: saml
metadata:
  name: azure-saml
spec:
  acs: https://mytenant.teleport.sh/v1/webapi/saml/acs/azure-saml
  attributes_to_roles:
    - name: http://schemas.microsoft.com/ws/2008/06/identity/claims/groups
      roles:
        - editor
        - access
        - auditor
      value: "*"
  audience: https://mytenant.teleport.sh/v1/webapi/saml/acs/azure-saml
  cert: ""
  display: Microsoft
  entity_descriptor:
  entity_descriptor_url: https://login.microsoftonline.com/ff882432.../federationmetadata/2007-06/federationmetadata.xml?appid=b8d06e01...
  issuer: https://sts.windows.net/your-id-here/
  service_provider_issuer: https://mytenant.teleport.sh/v1/webapi/saml/acs/azure-saml
  assertion_key_pair:
    cert: |
      -----BEGIN CERTIFICATE-----
      New CERT
      -----END CERTIFICATE-----
    private_key: |
      -----BEGIN RSA PRIVATE KEY-----
      New private key
      -----END RSA PRIVATE KEY-----
  signing_key_pair:
    cert: |
      -----BEGIN CERTIFICATE-----
      ...
      -----END CERTIFICATE-----
    private_key: |
      -----BEGIN RSA PRIVATE KEY-----
      ...
      -----END RSA PRIVATE KEY-----
  sso: https://login.microsoftonline.com/your-id-here/saml2
version: v2

편집기에서 파일을 저장하고 닫아 커넥터를 업데이트하십시오.

토큰 암호화 활성화

  • 토큰 암호화로 이동:
토큰 암호화로 이동
  • 인증서 가져오기
  • 활성화하기

이 커넥터를 통한 SSO 로그인에 성공하면 암호화가 작동합니다.

문제 해결

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 규칙을 포함합니다.

예상치 못하게 노드가 보이지 않는 경우, 사용자의 역할에 적절한 allowdeny 규칙이 포함되어 있는지 확인하십시오. 이는 Teleport Access Controls Reference에서 문서화되어 있습니다.

SSO를 구성할 때, ID 공급자가 각 사용자의 특성을 올바르게 인구시키고 있는지 확인하십시오. 사용자가 Teleport에서 노드를 보기 위해서는 역할의 allow.logins 에 있는 템플릿 변수의 결과가 사용자의 traits.logins 중 하나와 일치해야 합니다.

이 예에서 사용자는 env: dev 레이블이 있는 노드에 대해 ubuntu , debian 및 SSO 특성의 사용자 이름 logins 를 가집니다. SSO 특성 사용자 이름이 bob 인 경우 사용자 이름에는 ubuntu , debianbob 이 포함됩니다.

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가 활성 공개 키만 게시하는지 확인하십시오. 올바른 구성이 이루어지면 서명이 성공적으로 검증되어야 합니다.

SAML 콜백 처리 실패

"Failed to process SAML callback" 오류가 발생하면 감사 로그를 확인하십시오.

리소스 이름에 특수 문자가 허용되지 않습니다.
영숫자, 하이픈 및 점으로만 구성된 이름을 사용하십시오:
/web/users/ops_example.com#EXT#@opsexample.onmicrosoft.com/params

위 오류는 Teleport의 명명 규칙과 호환되지 않는 Name ID 형식 때문에 발생합니다.

Name ID 형식을 이메일을 사용하도록 변경하십시오:

추가 읽기

  • Teleport 구성 리소스 참조
  • 이 가이드에서 설명한 Teleport 역할에서는 external 특성이 사용자가 Teleport에 인증하는 데 사용한 단일 로그온 제공자의 값으로 대체됩니다. Teleport 역할에서 특성이 작동하는 방식에 대한 전체 세부 정보는 Teleport 액세스 제어 참조를 참조하십시오.
Teleport 원문 보기