InfoGrab DocsInfoGrab Docs

워크로드 아이덴티티와 Azure Federated Credentials 구성

요약

Teleport 워크로드 아이덴티티는 JWT 형식으로 유연한 단기 유효 신원을 발급합니다. 이는 머신이 장기 유효 자격 증명을 사용하지 않고도 Azure 서비스에 안전하게 인증해야 하는 경우에 유용합니다. 이 가이드에서는 Teleport 워크로드 아이덴티티와 Azure를 구성하여 워크로드가 Azure Blob Storage에 인증하고 컨테이너에 콘텐츠를 업로드할 수 있도록 설정합니다.

Teleport 워크로드 아이덴티티는 JWT 형식으로 유연한 단기 유효 신원을 발급합니다. Azure Federated Credentials를 사용하면 이러한 JWT를 사용하여 Azure 서비스에 인증할 수 있습니다.

이는 머신이 장기 유효 자격 증명을 사용하지 않고도 Azure 서비스에 안전하게 인증해야 하는 경우에 유용합니다. 이는 머신이 위임된 조인 방식 중 하나를 사용하여 공유 시크릿을 사용하지 않고도 Teleport에 인증할 수 있기 때문입니다.

이 가이드에서는 Teleport 워크로드 아이덴티티와 Azure를 구성하여 워크로드가 Azure Blob Storage에 인증하고 컨테이너에 콘텐츠를 업로드할 수 있도록 설정합니다.

작동 방식#

이 구현은 다음 몇 가지 측면에서 Teleport 애플리케이션 서비스를 사용하여 Azure API를 보호하는 방식과 다릅니다:

  • Azure에 대한 요청이 Teleport 프록시 서비스를 통해 프록시되지 않으므로 지연 시간은 줄어들지만, 이러한 요청이 Teleport의 감사 로그에 기록되지 않으므로 가시성은 낮아집니다.
  • 워크로드 아이덴티티는 명령줄 도구뿐만 아니라 SDK를 포함한 모든 Azure 클라이언트와 작동합니다.
  • Teleport 애플리케이션 서비스를 사용하여 Azure에 접근하는 방식은 Machine & Workload Identity와 함께 작동하지 않으므로, 머신이 Azure에 인증해야 하는 경우에는 사용할 수 없습니다.

사전 요구사항#

  • 실행 중인 Teleport 클러스터. Teleport를 시작하려면 무료 체험판에 가입하거나 데모 환경을 구성하세요.

  • tctl and tsh clients.

    Installing `tctl` and `tsh` clients
    1. Teleport 클러스터의 버전을 확인합니다. tctl and tsh clients는 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')"
      
    2. 사용 중인 플랫폼에 대한 지침에 따라 tctl and tsh clients를 설치합니다:

Mac

     `tctl` and `tsh` clients가 포함된, 서명된 Teleport macOS .pkg 설치 프로그램을 다운로드합니다:
 
     ```code
     $ curl -O https://cdn.teleport.dev/teleport-${TELEPORT_VERSION?}.pkg
     ```

     Finder에서 `pkg` 파일을 더블 클릭하여 설치를 시작합니다.
 
     
Warning
       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 명령을 실행할 수도 있습니다.

  • tbot이 Teleport 워크로드 아이덴티티에 접근해야 하는 워크로드가 실행될 호스트에 이미 설치 및 구성되어 있어야 합니다. 자세한 내용은 배포 가이드를 참조하세요.
  • 워크로드에 접근 권한을 부여하고자 하는 Azure 리소스 그룹 및 구독.

SPIFFE ID 구조 결정#

Teleport 워크로드 아이덴티티 내에서 모든 아이덴티티는 SPIFFE ID를 사용하여 표현됩니다. 이는 해당 아이덴티티가 나타내는 엔터티를 고유하게 식별하는 URI입니다. 스킴은 항상 spiffe://이며, 호스트는 Teleport 클러스터의 이름이 됩니다. 이 URI의 경로 구조는 사용자가 자유롭게 결정할 수 있습니다.

이 가이드에서는 spiffe://example.teleport.sh/svc/example-service SPIFFE ID에 Azure 접근 권한을 부여하겠습니다.

이미 Teleport 워크로드 아이덴티티를 배포한 경우 이미 SPIFFE ID 구조가 마련되어 있을 것입니다. 아직 배포하지 않았다면 SPIFFE ID의 구조를 결정해야 합니다.

Teleport 워크로드 아이덴티티를 Azure Federated Credentials와만 사용하는 경우, SPIFFE ID를 해당 ID가 맡을 수 있는 Azure 사용자 관리 아이덴티티를 명시적으로 지정하도록 구성할 수 있습니다. 그러나 SPIFFE ID를 사용할 워크로드나 사람의 이름을 지정하는 것이 더 합리적인 경우가 많습니다. 자세한 내용은 모범 사례 가이드를 참조하세요.

1/4단계. Azure 구성#

Azure가 워크로드 아이덴티티 JWT SVID를 인증으로 수락하도록 구성하려면, 해당 워크로드를 Azure 내에서 나타낼 아이덴티티를 생성하고, 해당 아이덴티티가 Teleport 클러스터에서 발급한 JWT SVID를 페더레이션 자격 증명으로 수락하도록 구성한 다음, 역할 할당을 사용하여 Azure 내에서 필요한 권한을 해당 아이덴티티에 부여해야 합니다.

사용자 관리 아이덴티티 생성#

먼저 Azure 내에서 워크로드를 나타낼 사용자 관리 아이덴티티를 생성합니다.

  1. Azure 포털의 "Managed Identities" 섹션으로 이동합니다.
  2. "Create"를 선택하여 "Create User Assigned Managed Identity" 양식을 엽니다.
  3. 리소스 그룹과 구독을 선택합니다.
  4. 아이덴티티가 나타낼 워크로드를 설명하는 고유한 이름을 입력합니다. 이 예시에서는 "example-service"를 사용하겠습니다.
  5. "Review + create"를 선택합니다.

이제 생성된 사용자 관리 아이덴티티에 대한 몇 가지 주요 정보를 기록하여 이후 단계에서 사용해야 합니다.

생성된 사용자 관리 아이덴티티의 "Properties" 섹션으로 이동하여 "Client Id"와 "Tenant Id"를 기록해 둡니다. 두 값 모두 UUID 형식입니다.

페더레이션 자격 증명 생성#

다음으로, 사용자 관리 아이덴티티에 대한 페더레이션 자격 증명을 구성해야 합니다. 이렇게 하면 Azure가 Teleport 클러스터에서 발급한 JWT SVID를 해당 사용자 관리 아이덴티티의 인증 형식으로 수락하도록 구성됩니다.

  1. Azure 포털에서 사용자 관리 아이덴티티로 이동하여 "Settings" 섹션에서 "Federated credentials" 페이지를 선택합니다.
  2. "Add Credential"을 선택하여 "Add Federated Credential" 양식을 엽니다.
  3. "Federated credential scenario"에서 "Other"를 선택합니다.
  4. "Issuer URL"에 Teleport 프록시 서비스의 주소 뒤에 /workload-identity를 붙여 입력합니다. 예를 들어 https://example.teleport.sh/workload-identity와 같습니다.
  5. "Subject identifier" 필드에 워크로드에 대해 결정한 SPIFFE ID를 입력합니다. 예를 들어 spiffe://example.teleport.sh/svc/example-service와 같습니다. 이는 이 사용자 관리 아이덴티티에 대해 Teleport 워크로드 아이덴티티가 발급한 어떤 JWT SVID가 수락될지를 제어합니다.
  6. 페더레이션 자격 증명에 대한 고유하고 식별 가능한 이름을 입력합니다. 예를 들어 example-teleport-sh-svc-example-service와 같습니다.
  7. "Add"를 클릭합니다.

스토리지 계정 및 컨테이너 생성#

이 가이드에서는 워크로드가 인증할 스토리지 계정과 컨테이너를 생성합니다. 이미 워크로드에 접근 권한을 부여하고자 하는 리소스가 있다면 이 단계는 건너뛸 수 있습니다.

먼저 스토리지 계정을 생성합니다:

  1. Azure 포털의 "Storage accounts" 섹션으로 이동하여 "Create" 버튼을 선택해 "Create a storage account" 양식을 엽니다.
  2. 리소스 그룹과 구독을 선택합니다.
  3. 스토리지 계정에 대한 고유하고 식별 가능한 이름을 입력합니다. 나중에 필요하므로 이를 기록해 둡니다. 이 예시에서는 examplestorageaccount를 사용하겠습니다.
  4. 리전을 선택하고 "Primary Service" 필드에서 "Azure Blob Storage"를 선택합니다.
  5. "Create"를 클릭합니다.

이제 스토리지 컨테이너를 생성할 수 있습니다:

  1. Azure 포털의 "Storage accounts" 섹션으로 이동하여 생성한 스토리지 계정을 선택합니다.
  2. "Data storage" 섹션 아래의 "Containers" 섹션으로 이동합니다.
  3. "Add container"를 선택하여 "New container" 양식을 엽니다.
  4. 컨테이너에 대한 고유하고 식별 가능한 이름을 입력합니다. 나중에 필요하므로 이를 기록해 둡니다. 이 예시에서는 examplecontainer를 사용하겠습니다.

역할 할당 생성#

마지막으로, 워크로드가 Azure 내에서 필요한 작업을 수행할 수 있도록 사용자 관리 아이덴티티에 필요한 권한을 부여해야 합니다.

Azure에서 역할 할당을 생성할 때는 다음과 같은 여러 수준으로 범위를 지정할 수 있습니다:

  • 구독 (구독 내 모든 리소스에 대한 접근 권한 부여)
  • 리소스 그룹 (리소스 그룹 내 모든 리소스에 대한 접근 권한 부여)
  • 리소스 (특정 리소스에 대한 접근 권한 부여)

이 가이드에서는 생성한 스토리지 계정 범위로 사용자 관리 아이덴티티에 Storage Blob Data Owner 역할을 부여하겠습니다.

  1. Azure 포털의 "Storage accounts" 섹션으로 이동하여 생성한 스토리지 계정을 선택합니다.
  2. 사이드바에서 "Access control (IAM)"으로 이동한 다음 "Add"와 "Add role assignment"를 선택합니다.
  3. "Role"에서 "Storage Blob Data Owner"를 선택합니다.
  4. "Members"에서 "Assign access to"에 "Managed identity"를 선택한 다음 "Select members"를 누릅니다.
  5. "Managed identity"에서 "User-assigned managed identity"를 선택한 다음 이전에 생성한 사용자 관리 아이덴티티를 검색하여 선택합니다.
  6. "Review + assign"을 클릭하고 변경 사항을 저장합니다.

2/4단계. Teleport RBAC 구성#

이제 선택한 SPIFFE ID를 포함하는 JWT를 발급할 수 있도록 Teleport를 구성해야 합니다.

먼저 아이덴티티와 해당 특성을 정의하는 워크로드 아이덴티티 리소스를 생성합니다. workload-identity.yaml이라는 새 파일을 생성합니다:

kind: workload_identity
version: v1
metadata:
  name: example-workload-identity
  labels:
    example: getting-started
spec:
  spiffe:
    id: /svc/example-service

다음을 교체합니다:

  • example-workload-identity를 워크로드 아이덴티티를 설명하는 이름으로 교체합니다.
  • /svc/example-service를 선택한 SPIFFE ID의 경로 부분으로 교체합니다.

tctl을 사용하여 이를 클러스터에 적용합니다:

$ tctl create -f workload-identity.yaml

다음으로, 이 워크로드 아이덴티티에 대한 접근 권한을 부여하는 역할을 생성합니다. 다음 내용으로 role.yaml을 생성합니다:

kind: role
version: v6
metadata:
  name: example-workload-identity-issuer
spec:
  allow:
    workload_identity_labels:
      example: ["getting-started"]
    rules:
    - resources:
      - workload_identity
      verbs:
      - list
      - read

다음을 교체합니다:

  • example-workload-identity-issuer를 역할을 설명하는 이름으로 교체합니다.
  • 워크로드 아이덴티티의 라벨을 수정한 경우 라벨 선택자를 교체합니다.

tctl을 사용하여 이 역할을 Teleport 클러스터에 적용합니다:

$ tctl create -f role.yaml
Tip

Web UI를 사용하여 역할을 생성하고 편집할 수도 있습니다. Access -> Roles로 이동하여 Create New Role을 클릭하거나 편집할 기존 역할을 선택하십시오.

이제 이 역할을 봇에 할당해야 합니다:

$ tctl bots update my-bot --add-roles example-workload-identity-issuer

3/4단계. 워크로드 아이덴티티 JWT 발급#

이제 tbot을 구성하여 워크로드를 위한 단기 유효 JWT SVID를 발급하고 갱신하도록 합니다. tbot은 JWT를 디스크의 파일로 작성하며, 이후 Azure 클라이언트와 SDK가 이를 읽도록 구성할 수 있습니다.

이미 배포된 tbot 서비스에서 tbot 구성 파일에 다음을 추가하여 SPIFFE SVID를 발급하도록 구성합니다:

services:
  - type: workload-identity-jwt
    destination:
      type: directory
      path: /opt/workload-identity
    selector:
      name: example-workload-identity
    audiences: ["api://AzureADTokenExchange"]

다음을 교체합니다:

  • /opt/workload-identity를 JWT를 작성할 디렉터리로 교체합니다.
  • example-workload-identity를 생성한 워크로드 아이덴티티의 이름으로 교체합니다.

새 구성을 적용하려면 tbot 서비스를 다시 시작합니다. /opt/workload-identity/jwt_svid에 JWT가 포함된 파일이 생성된 것을 확인할 수 있습니다.

4/4단계. Azure CLI 및 SDK 구성#

이제 발급된 JWT SVID를 사용하여 Azure에 인증할 수 있습니다. 이를 구성하는 방식은 Azure CLI와 Azure SDK 간에 다릅니다.

Azure CLI 구성#

JWT SVID를 사용하여 Azure CLI로 인증하려면, JWT와 생성한 사용자 관리 아이덴티티의 클라이언트 및 테넌트 ID를 지정하여 로그인을 수행합니다. 이 과정에서 JWT SVID를 Azure 액세스 토큰으로 교환하는 초기 교환이 수행되며, 이 액세스 토큰은 만료될 때까지 CLI에 의해 캐시됩니다.

첫 번째 단계에서 기록해 둔 클라이언트 및 테넌트 ID를 입력하여 다음을 실행합니다:

$ az login \ 
  --federated-token $(cat /opt/workload-identity/jwt_svid) \
  --service-principal \
  -u <user-managed-identity-client-id> \
  -t <user-managed-identity-tenant-id>

이 작업이 성공했음을 나타내는 메시지가 표시되어야 합니다.

이제 Azure Blob Storage 컨테이너에 파일을 업로드하여 이 작업이 성공했는지 테스트할 수 있습니다:

$ echo "testing 1,2,3..." > test.txt
# Upload a test file. Replace the name of the account and container with those
# you selected earlier.
$ az storage blob upload \
  --auth login \
  --account-name examplestorageaccount \
  --container-name examplecontainer \
  --name test.txt \
  --file ./test.txt
# Check that the file has been uploaded. Replace the name of the account and
# container with those you selected earlier.
$ az storage blob list \
  --auth login \
  --output table \
  --account-name examplestorageaccount \
  --container-name examplecontainer

Azure SDK 구성#

Azure SDK는 발급된 JWT SVID를 사용한 인증을 위해 페더레이션 자격 증명을 사용하도록 구성할 수 있는 일련의 환경 변수를 지원합니다:

  • AZURE_CLIENT_ID: 사용자 관리 아이덴티티의 클라이언트 ID입니다.
  • AZURE_TENANT_ID: 사용자 관리 아이덴티티의 테넌트 ID입니다.
  • AZURE_FEDERATED_TOKEN_FILE: JWT SVID 파일의 경로입니다. 예를 들어 /opt/workload-identity/jwt_svid와 같습니다.

또한 SDK가 페더레이션 자격 증명을 사용하도록 명시적으로 구성할 수도 있으며, 이는 언어마다 다릅니다.

다음 단계#

워크로드 아이덴티티와 Azure Federated Credentials 구성

Teleport v18.9
원문 보기
요약

Teleport 워크로드 아이덴티티는 JWT 형식으로 유연한 단기 유효 신원을 발급합니다. 이는 머신이 장기 유효 자격 증명을 사용하지 않고도 Azure 서비스에 안전하게 인증해야 하는 경우에 유용합니다. 이 가이드에서는 Teleport 워크로드 아이덴티티와 Azure를 구성하여 워크로드가 Azure Blob Storage에 인증하고 컨테이너에 콘텐츠를 업로드할 수 있도록 설정합니다.

Teleport 워크로드 아이덴티티는 JWT 형식으로 유연한 단기 유효 신원을 발급합니다. Azure Federated Credentials를 사용하면 이러한 JWT를 사용하여 Azure 서비스에 인증할 수 있습니다.

이는 머신이 장기 유효 자격 증명을 사용하지 않고도 Azure 서비스에 안전하게 인증해야 하는 경우에 유용합니다. 이는 머신이 위임된 조인 방식 중 하나를 사용하여 공유 시크릿을 사용하지 않고도 Teleport에 인증할 수 있기 때문입니다.

이 가이드에서는 Teleport 워크로드 아이덴티티와 Azure를 구성하여 워크로드가 Azure Blob Storage에 인증하고 컨테이너에 콘텐츠를 업로드할 수 있도록 설정합니다.

작동 방식#

이 구현은 다음 몇 가지 측면에서 Teleport 애플리케이션 서비스를 사용하여 Azure API를 보호하는 방식과 다릅니다:

  • Azure에 대한 요청이 Teleport 프록시 서비스를 통해 프록시되지 않으므로 지연 시간은 줄어들지만, 이러한 요청이 Teleport의 감사 로그에 기록되지 않으므로 가시성은 낮아집니다.
  • 워크로드 아이덴티티는 명령줄 도구뿐만 아니라 SDK를 포함한 모든 Azure 클라이언트와 작동합니다.
  • Teleport 애플리케이션 서비스를 사용하여 Azure에 접근하는 방식은 Machine & Workload Identity와 함께 작동하지 않으므로, 머신이 Azure에 인증해야 하는 경우에는 사용할 수 없습니다.

사전 요구사항#

  • 실행 중인 Teleport 클러스터. Teleport를 시작하려면 무료 체험판에 가입하거나 데모 환경을 구성하세요.

  • tctl and tsh clients.

    Installing `tctl` and `tsh` clients
    1. Teleport 클러스터의 버전을 확인합니다. tctl and tsh clients는 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')"
      
    2. 사용 중인 플랫폼에 대한 지침에 따라 tctl and tsh clients를 설치합니다:

Mac

     `tctl` and `tsh` clients가 포함된, 서명된 Teleport macOS .pkg 설치 프로그램을 다운로드합니다:
 
     ```code
     $ curl -O https://cdn.teleport.dev/teleport-${TELEPORT_VERSION?}.pkg
     ```

     Finder에서 `pkg` 파일을 더블 클릭하여 설치를 시작합니다.
 
     
Warning
       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 명령을 실행할 수도 있습니다.

  • tbot이 Teleport 워크로드 아이덴티티에 접근해야 하는 워크로드가 실행될 호스트에 이미 설치 및 구성되어 있어야 합니다. 자세한 내용은 배포 가이드를 참조하세요.
  • 워크로드에 접근 권한을 부여하고자 하는 Azure 리소스 그룹 및 구독.

SPIFFE ID 구조 결정#

Teleport 워크로드 아이덴티티 내에서 모든 아이덴티티는 SPIFFE ID를 사용하여 표현됩니다. 이는 해당 아이덴티티가 나타내는 엔터티를 고유하게 식별하는 URI입니다. 스킴은 항상 spiffe://이며, 호스트는 Teleport 클러스터의 이름이 됩니다. 이 URI의 경로 구조는 사용자가 자유롭게 결정할 수 있습니다.

이 가이드에서는 spiffe://example.teleport.sh/svc/example-service SPIFFE ID에 Azure 접근 권한을 부여하겠습니다.

이미 Teleport 워크로드 아이덴티티를 배포한 경우 이미 SPIFFE ID 구조가 마련되어 있을 것입니다. 아직 배포하지 않았다면 SPIFFE ID의 구조를 결정해야 합니다.

Teleport 워크로드 아이덴티티를 Azure Federated Credentials와만 사용하는 경우, SPIFFE ID를 해당 ID가 맡을 수 있는 Azure 사용자 관리 아이덴티티를 명시적으로 지정하도록 구성할 수 있습니다. 그러나 SPIFFE ID를 사용할 워크로드나 사람의 이름을 지정하는 것이 더 합리적인 경우가 많습니다. 자세한 내용은 모범 사례 가이드를 참조하세요.

1/4단계. Azure 구성#

Azure가 워크로드 아이덴티티 JWT SVID를 인증으로 수락하도록 구성하려면, 해당 워크로드를 Azure 내에서 나타낼 아이덴티티를 생성하고, 해당 아이덴티티가 Teleport 클러스터에서 발급한 JWT SVID를 페더레이션 자격 증명으로 수락하도록 구성한 다음, 역할 할당을 사용하여 Azure 내에서 필요한 권한을 해당 아이덴티티에 부여해야 합니다.

사용자 관리 아이덴티티 생성#

먼저 Azure 내에서 워크로드를 나타낼 사용자 관리 아이덴티티를 생성합니다.

  1. Azure 포털의 "Managed Identities" 섹션으로 이동합니다.
  2. "Create"를 선택하여 "Create User Assigned Managed Identity" 양식을 엽니다.
  3. 리소스 그룹과 구독을 선택합니다.
  4. 아이덴티티가 나타낼 워크로드를 설명하는 고유한 이름을 입력합니다. 이 예시에서는 "example-service"를 사용하겠습니다.
  5. "Review + create"를 선택합니다.

이제 생성된 사용자 관리 아이덴티티에 대한 몇 가지 주요 정보를 기록하여 이후 단계에서 사용해야 합니다.

생성된 사용자 관리 아이덴티티의 "Properties" 섹션으로 이동하여 "Client Id"와 "Tenant Id"를 기록해 둡니다. 두 값 모두 UUID 형식입니다.

페더레이션 자격 증명 생성#

다음으로, 사용자 관리 아이덴티티에 대한 페더레이션 자격 증명을 구성해야 합니다. 이렇게 하면 Azure가 Teleport 클러스터에서 발급한 JWT SVID를 해당 사용자 관리 아이덴티티의 인증 형식으로 수락하도록 구성됩니다.

  1. Azure 포털에서 사용자 관리 아이덴티티로 이동하여 "Settings" 섹션에서 "Federated credentials" 페이지를 선택합니다.
  2. "Add Credential"을 선택하여 "Add Federated Credential" 양식을 엽니다.
  3. "Federated credential scenario"에서 "Other"를 선택합니다.
  4. "Issuer URL"에 Teleport 프록시 서비스의 주소 뒤에 /workload-identity를 붙여 입력합니다. 예를 들어 https://example.teleport.sh/workload-identity와 같습니다.
  5. "Subject identifier" 필드에 워크로드에 대해 결정한 SPIFFE ID를 입력합니다. 예를 들어 spiffe://example.teleport.sh/svc/example-service와 같습니다. 이는 이 사용자 관리 아이덴티티에 대해 Teleport 워크로드 아이덴티티가 발급한 어떤 JWT SVID가 수락될지를 제어합니다.
  6. 페더레이션 자격 증명에 대한 고유하고 식별 가능한 이름을 입력합니다. 예를 들어 example-teleport-sh-svc-example-service와 같습니다.
  7. "Add"를 클릭합니다.

스토리지 계정 및 컨테이너 생성#

이 가이드에서는 워크로드가 인증할 스토리지 계정과 컨테이너를 생성합니다. 이미 워크로드에 접근 권한을 부여하고자 하는 리소스가 있다면 이 단계는 건너뛸 수 있습니다.

먼저 스토리지 계정을 생성합니다:

  1. Azure 포털의 "Storage accounts" 섹션으로 이동하여 "Create" 버튼을 선택해 "Create a storage account" 양식을 엽니다.
  2. 리소스 그룹과 구독을 선택합니다.
  3. 스토리지 계정에 대한 고유하고 식별 가능한 이름을 입력합니다. 나중에 필요하므로 이를 기록해 둡니다. 이 예시에서는 examplestorageaccount를 사용하겠습니다.
  4. 리전을 선택하고 "Primary Service" 필드에서 "Azure Blob Storage"를 선택합니다.
  5. "Create"를 클릭합니다.

이제 스토리지 컨테이너를 생성할 수 있습니다:

  1. Azure 포털의 "Storage accounts" 섹션으로 이동하여 생성한 스토리지 계정을 선택합니다.
  2. "Data storage" 섹션 아래의 "Containers" 섹션으로 이동합니다.
  3. "Add container"를 선택하여 "New container" 양식을 엽니다.
  4. 컨테이너에 대한 고유하고 식별 가능한 이름을 입력합니다. 나중에 필요하므로 이를 기록해 둡니다. 이 예시에서는 examplecontainer를 사용하겠습니다.

역할 할당 생성#

마지막으로, 워크로드가 Azure 내에서 필요한 작업을 수행할 수 있도록 사용자 관리 아이덴티티에 필요한 권한을 부여해야 합니다.

Azure에서 역할 할당을 생성할 때는 다음과 같은 여러 수준으로 범위를 지정할 수 있습니다:

  • 구독 (구독 내 모든 리소스에 대한 접근 권한 부여)
  • 리소스 그룹 (리소스 그룹 내 모든 리소스에 대한 접근 권한 부여)
  • 리소스 (특정 리소스에 대한 접근 권한 부여)

이 가이드에서는 생성한 스토리지 계정 범위로 사용자 관리 아이덴티티에 Storage Blob Data Owner 역할을 부여하겠습니다.

  1. Azure 포털의 "Storage accounts" 섹션으로 이동하여 생성한 스토리지 계정을 선택합니다.
  2. 사이드바에서 "Access control (IAM)"으로 이동한 다음 "Add"와 "Add role assignment"를 선택합니다.
  3. "Role"에서 "Storage Blob Data Owner"를 선택합니다.
  4. "Members"에서 "Assign access to"에 "Managed identity"를 선택한 다음 "Select members"를 누릅니다.
  5. "Managed identity"에서 "User-assigned managed identity"를 선택한 다음 이전에 생성한 사용자 관리 아이덴티티를 검색하여 선택합니다.
  6. "Review + assign"을 클릭하고 변경 사항을 저장합니다.

2/4단계. Teleport RBAC 구성#

이제 선택한 SPIFFE ID를 포함하는 JWT를 발급할 수 있도록 Teleport를 구성해야 합니다.

먼저 아이덴티티와 해당 특성을 정의하는 워크로드 아이덴티티 리소스를 생성합니다. workload-identity.yaml이라는 새 파일을 생성합니다:

kind: workload_identity
version: v1
metadata:
  name: example-workload-identity
  labels:
    example: getting-started
spec:
  spiffe:
    id: /svc/example-service

다음을 교체합니다:

  • example-workload-identity를 워크로드 아이덴티티를 설명하는 이름으로 교체합니다.
  • /svc/example-service를 선택한 SPIFFE ID의 경로 부분으로 교체합니다.

tctl을 사용하여 이를 클러스터에 적용합니다:

$ tctl create -f workload-identity.yaml

다음으로, 이 워크로드 아이덴티티에 대한 접근 권한을 부여하는 역할을 생성합니다. 다음 내용으로 role.yaml을 생성합니다:

kind: role
version: v6
metadata:
  name: example-workload-identity-issuer
spec:
  allow:
    workload_identity_labels:
      example: ["getting-started"]
    rules:
    - resources:
      - workload_identity
      verbs:
      - list
      - read

다음을 교체합니다:

  • example-workload-identity-issuer를 역할을 설명하는 이름으로 교체합니다.
  • 워크로드 아이덴티티의 라벨을 수정한 경우 라벨 선택자를 교체합니다.

tctl을 사용하여 이 역할을 Teleport 클러스터에 적용합니다:

$ tctl create -f role.yaml
Tip

Web UI를 사용하여 역할을 생성하고 편집할 수도 있습니다. Access -> Roles로 이동하여 Create New Role을 클릭하거나 편집할 기존 역할을 선택하십시오.

이제 이 역할을 봇에 할당해야 합니다:

$ tctl bots update my-bot --add-roles example-workload-identity-issuer

3/4단계. 워크로드 아이덴티티 JWT 발급#

이제 tbot을 구성하여 워크로드를 위한 단기 유효 JWT SVID를 발급하고 갱신하도록 합니다. tbot은 JWT를 디스크의 파일로 작성하며, 이후 Azure 클라이언트와 SDK가 이를 읽도록 구성할 수 있습니다.

이미 배포된 tbot 서비스에서 tbot 구성 파일에 다음을 추가하여 SPIFFE SVID를 발급하도록 구성합니다:

services:
  - type: workload-identity-jwt
    destination:
      type: directory
      path: /opt/workload-identity
    selector:
      name: example-workload-identity
    audiences: ["api://AzureADTokenExchange"]

다음을 교체합니다:

  • /opt/workload-identity를 JWT를 작성할 디렉터리로 교체합니다.
  • example-workload-identity를 생성한 워크로드 아이덴티티의 이름으로 교체합니다.

새 구성을 적용하려면 tbot 서비스를 다시 시작합니다. /opt/workload-identity/jwt_svid에 JWT가 포함된 파일이 생성된 것을 확인할 수 있습니다.

4/4단계. Azure CLI 및 SDK 구성#

이제 발급된 JWT SVID를 사용하여 Azure에 인증할 수 있습니다. 이를 구성하는 방식은 Azure CLI와 Azure SDK 간에 다릅니다.

Azure CLI 구성#

JWT SVID를 사용하여 Azure CLI로 인증하려면, JWT와 생성한 사용자 관리 아이덴티티의 클라이언트 및 테넌트 ID를 지정하여 로그인을 수행합니다. 이 과정에서 JWT SVID를 Azure 액세스 토큰으로 교환하는 초기 교환이 수행되며, 이 액세스 토큰은 만료될 때까지 CLI에 의해 캐시됩니다.

첫 번째 단계에서 기록해 둔 클라이언트 및 테넌트 ID를 입력하여 다음을 실행합니다:

$ az login \ 
  --federated-token $(cat /opt/workload-identity/jwt_svid) \
  --service-principal \
  -u <user-managed-identity-client-id> \
  -t <user-managed-identity-tenant-id>

이 작업이 성공했음을 나타내는 메시지가 표시되어야 합니다.

이제 Azure Blob Storage 컨테이너에 파일을 업로드하여 이 작업이 성공했는지 테스트할 수 있습니다:

$ echo "testing 1,2,3..." > test.txt
# Upload a test file. Replace the name of the account and container with those
# you selected earlier.
$ az storage blob upload \
  --auth login \
  --account-name examplestorageaccount \
  --container-name examplecontainer \
  --name test.txt \
  --file ./test.txt
# Check that the file has been uploaded. Replace the name of the account and
# container with those you selected earlier.
$ az storage blob list \
  --auth login \
  --output table \
  --account-name examplestorageaccount \
  --container-name examplecontainer

Azure SDK 구성#

Azure SDK는 발급된 JWT SVID를 사용한 인증을 위해 페더레이션 자격 증명을 사용하도록 구성할 수 있는 일련의 환경 변수를 지원합니다:

  • AZURE_CLIENT_ID: 사용자 관리 아이덴티티의 클라이언트 ID입니다.
  • AZURE_TENANT_ID: 사용자 관리 아이덴티티의 테넌트 ID입니다.
  • AZURE_FEDERATED_TOKEN_FILE: JWT SVID 파일의 경로입니다. 예를 들어 /opt/workload-identity/jwt_svid와 같습니다.

또한 SDK가 페더레이션 자격 증명을 사용하도록 명시적으로 구성할 수도 있으며, 이는 언어마다 다릅니다.

다음 단계#