InfoGrab Docs

워크로드 아이덴티티와 AWS OIDC Federation 구성

요약

Teleport 워크로드 아이덴티티는 JWT 형식으로 유연한 단기 유효 신원을 발급합니다. 이는 머신이 장기 자격 증명 없이 AWS 서비스에 안전하게 인증해야 하는 경우에 유용합니다. 이 가이드에서는 Teleport 워크로드 아이덴티티와 AWS를 구성하여 워크로드가 AWS S3 API에 인증하고 버킷에 콘텐츠를 업로드할 수 있도록 합니다.

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

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

이 가이드에서는 Teleport 워크로드 아이덴티티와 AWS를 구성하여 워크로드가 AWS S3 API에 인증하고 버킷에 콘텐츠를 업로드할 수 있도록 합니다.

작동 방식#

이 구현은 Teleport Application Service를 사용하여 AWS API를 보호하는 것과 몇 가지 차이점이 있습니다:

  • AWS에 대한 요청이 Teleport Proxy Service를 통해 프록시되지 않아 지연 시간이 줄어들지만, 이러한 요청이 Teleport의 감사 로그에 기록되지 않아 가시성도 낮아집니다.
  • 워크로드 아이덴티티는 명령줄 도구뿐만 아니라 SDK를 포함한 모든 AWS 클라이언트와 함께 작동합니다.
  • Teleport Application Service를 사용하여 AWS에 접근하는 것은 Machine ID와 함께 작동하지 않으므로 머신이 AWS에 인증해야 할 때는 사용할 수 없습니다.

OIDC Federation vs Roles Anywhere#

AWS 플랫폼은 워크로드 신원 페더레이션을 위한 두 가지 방법을 제공합니다: OIDC Federation과 Roles Anywhere. Teleport 워크로드 아이덴티티는 두 가지 방법을 모두 지원합니다.

두 방법 간에는 몇 가지 차이점이 있습니다:

  • OIDC Federation은 JWT SVID를 AWS 자격 증명으로 교환하는 반면, Roles Anywhere는 X509 SVID를 AWS 자격 증명으로 교환합니다. X509 SVID 사용이 일반적으로 더 안전한 것으로 간주됩니다.
  • OIDC Federation은 워크로드 옆에 AWS 자격 증명 헬퍼를 별도로 설치할 필요가 없는 반면, Roles Anywhere는 필요합니다.
  • OIDC Federation은 Teleport Proxy Service가 AWS에서 접근 가능해야 하는 반면, Roles Anywhere는 그렇지 않습니다.

이 가이드는 OIDC federation 구성을 다룹니다. Roles Anywhere에 대해서는 워크로드 아이덴티티와 AWS Roles Anywhere 구성을 참조하세요.

사전 요구 사항#

  • A running Teleport cluster. If you want to get started with Teleport, sign up for a free trial or set up a demo environment.

  • The tctl and tsh clients.

    Installing `tctl` and `tsh` clients
    1. Determine the version of your Teleport cluster. The tctl and tsh clients must be at most one major version behind your Teleport cluster version. Send a GET request to the Proxy Service at /v1/webapi/find and use a JSON query tool to obtain your cluster version. Replace with the web address of your Teleport Proxy Service:

      $ TELEPORT_DOMAIN=
      $ TELEPORT_VERSION="$(curl -s https://$TELEPORT_DOMAIN/v1/webapi/find | jq -r '.server_version')"
      
    2. Follow the instructions for your platform to install tctl and tsh clients:

To check that you can connect to your Teleport cluster, sign in with tsh login, then verify that you can run tctl commands using your current credentials.

For example, run the following command, assigning to the domain name of the Teleport Proxy Service in your cluster and to your Teleport username:

$ tsh login --proxy= --user=
$ tctl status
# Cluster  (=teleport.url=)
# Version  (=teleport.version=)
# CA pin   (=presets.ca_pin=)

If you can connect to the cluster and run the tctl status command, you can use your current credentials to run subsequent tctl commands from your workstation. If you host your own Teleport cluster, you can also run tctl commands on the computer that hosts the Teleport Auth Service for full permissions.

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

SPIFFE ID 구조 결정#

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

이 가이드의 목적을 위해 spiffe://example.teleport.sh/svc/example-service SPIFFE ID에 AWS 접근 권한을 부여합니다.

Teleport 워크로드 아이덴티티를 이미 배포했다면 SPIFFE ID 구조가 이미 갖춰져 있을 것입니다. 그렇지 않다면 SPIFFE ID 구조를 결정해야 합니다.

AWS OIDC Federation과 함께만 Teleport 워크로드 아이덴티티를 사용하는 경우, SPIFFE ID가 맡을 수 있는 AWS 역할을 명시적으로 지정하도록 구조화할 수 있습니다. 그러나 SPIFFE ID를 사용할 워크로드나 사람의 이름을 지정하는 것이 더 합리적인 경우가 많습니다. 추가적인 조언은 모범 사례 가이드를 참조하세요.

1/4단계. AWS 구성#

처음으로 AWS OIDC Federation을 구성하려면 몇 가지 단계가 필요합니다. Teleport 클러스터에 대해 이전에 AWS OIDC Federation을 구성한 경우 일부 단계는 필요하지 않을 수 있습니다.

OpenID Connect 자격 증명 공급자 생성#

먼저 AWS에서 OIDC 자격 증명 공급자를 생성해야 합니다. 이를 통해 AWS와 Teleport 클러스터의 워크로드 아이덴티티 발급자 간의 신뢰 관계가 정의됩니다. 이 OIDC 자격 증명 공급자를 재사용하여 Teleport 워크로드 아이덴티티를 사용하는 다양한 워크로드에 AWS 서비스에 대한 접근 권한을 부여할 수 있습니다.

공급자를 구성할 때 발급자 URI를 지정해야 합니다. 이는 Teleport Proxy Service의 공개 주소에 경로 /workload-identity를 추가한 것입니다. OIDC federation이 작동하려면 AWS에서 Teleport Proxy Service에 접근할 수 있어야 합니다.

OIDC 자격 증명 공급자를 구성하기 전에 Teleport Proxy Service에서 사용하는 TLS 인증서의 지문을 확인해야 합니다. curl을 사용하여 확인할 수 있습니다:

$ curl https://example.teleport.sh/webapi/thumbprint
"example589ee4bf31a11b78c72b8d13f0example"%

AWS 계정을 관리하도록 이미 구성된 Terraform 구성 파일에 다음을 삽입합니다:

resource "aws_iam_openid_connect_provider" "example_teleport_sh_workload_identity" {
  // "example.teleport.sh"를 Teleport Proxy Service에 접근하는 데 사용되는
  // 호스트 이름으로 교체하세요.
  url = "https://example.teleport.sh/workload-identity"

  client_id_list = [
    "sts.amazonaws.com",
  ]

  thumbprint_list = [
    // curl을 사용하여 확인한 지문으로 교체하세요.
    "example589ee4bf31a11b78c72b8d13f0example"
  ]
}
  1. IAM으로 이동합니다
  2. 사이드바에서 "Identity Providers"를 선택합니다
  3. "Add provider"를 선택합니다
  4. "Provider type"으로 "OpenID Connect"를 선택합니다.
  5. Teleport Proxy Service의 공개 호스트명에 "/workload-identity"를 추가하여 "Provider URL"로 지정합니다. 예: https://example.teleport.sh/workload-identity
  6. Audience로 sts.amazonaws.com을 지정합니다
  7. "Add Provider"를 클릭합니다.

S3 버킷 생성#

이 가이드의 목적을 위해 워크로드에 AWS S3 버킷 접근 권한을 부여합니다. RBAC 구성에 들어가기 전에 버킷을 생성해야 합니다.

AWS 내의 다른 서비스에 접근 권한을 부여하려면 이 단계를 건너뛸 수 있습니다.

// S3 버킷 생성
resource "aws_s3_bucket" "example" {
  // "example"을 의미 있고 고유한 이름으로 교체하세요.
  bucket = "workload-id-demo"
}
  1. S3으로 이동합니다
  2. "Create bucket"을 선택합니다
  3. 버킷에 대한 의미 있고 고유한 이름을 입력합니다. 예: workload-id-demo
  4. 다른 설정은 기본값으로 둡니다
  5. "Create bucket"을 클릭합니다.

RBAC 구성#

IAM 정책 생성#

먼저 S3 버킷에 접근 권한을 부여하는 IAM 정책을 생성합니다. 나중에 워크로드가 맡을 역할에 이 정책을 연결합니다.

이 가이드의 예제는 예제 버킷에 대한 전체 접근 권한을 부여하는 IAM 정책을 생성합니다. 프로덕션 환경에서는 최소 필요 권한만 부여하도록 수정해야 합니다.

Terraform 구성 파일에 다음을 삽입합니다:

resource "aws_iam_policy" "example" {
  // 정책이 접근 권한을 부여하는 내용을 설명하는 고유하고 의미 있는 이름을 선택합니다.
  name        = "workload-id-s3-full-access"
  path        = "/"

  // 이 예제 정책은 AWS S3에 대한 전체 접근 권한을 부여합니다. 프로덕션에서는
  // 더 제한적인 정책을 부여할 수 있습니다.
  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [{
      Action = "s3:*"
      Effect = "Allow"
      Resource = [
        aws_s3_bucket.workload_id_demo.arn,
        "${aws_s3_bucket.workload_id_demo.arn}/*"
      ]
    }]
  })
}
  1. IAM으로 이동합니다
  2. 사이드바에서 "Policies"를 선택합니다
  3. "Create policy"를 클릭합니다
  4. "S3" 서비스를 선택합니다
  5. "Actions allowed"에서 "All S3 actions"를 선택합니다
  6. "Resources"에서 "Specific"을 선택합니다
  7. "bucket"에 이전에 생성한 버킷 이름을 입력합니다.
  8. "object"에 이전에 생성한 버킷 이름을 입력하고 "All objects"를 선택합니다
  9. "Next"를 클릭합니다
  10. 이 정책에 대한 고유하고 의미 있는 이름을 입력합니다. 이 예제에서는 workload-id-s3-full-access가 됩니다
  11. "Create policy"를 클릭합니다

IAM 역할 생성#

이제 IAM 역할을 생성합니다. 이 역할은 Teleport 워크로드 아이덴티티가 발급한 JWT SVID를 사용하여 AWS에 인증한 후 워크로드가 맡게 됩니다.

IAM 역할을 생성할 때 어떤 워크로드 신원이 역할을 맡을 수 있는지 제어하는 신뢰 정책을 정의합니다. 이 정책에는 Teleport 워크로드 아이덴티티가 발급한 JWT SVID 내의 클레임에 대해 평가되는 조건이 포함됩니다. 우리의 경우 평가하려는 유일한 클레임은 워크로드의 SPIFFE ID를 포함하는 sub 클레임입니다.

마지막으로 이전에 생성한 IAM 정책을 이 역할에 연결하여 정책에 명시된 권한을 부여합니다.

Terraform 구성 파일에 다음을 삽입합니다:

// 워크로드 신원이 맡을 역할을 생성합니다.
resource "aws_iam_role" "example" {
  // 역할과 이를 맡을 워크로드를 설명하는 고유하고 의미 있는 이름을 선택합니다.
  name = "workload-id-demo"
  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [{
      Effect = "Allow"
      Principal = {
        Federated = aws_iam_openid_connect_provider.example.arn
      }
      Action = "sts:AssumeRoleWithWebIdentity"
      Condition = {
        StringEquals = {
          "${aws_iam_openid_connect_provider.example.url}:aud" = "sts.amazonaws.com"
          "${aws_iam_openid_connect_provider.example.url}:sub" = "spiffe://example.teleport.sh/svc/example-service"
        }
      }
    }]
  })
}

// 이전에 생성한 정책을 역할에 연결합니다.
resource "aws_iam_role_policy_attachment" "example" {
    role       = aws_iam_role.example.name
    policy_arn = aws_iam_policy.example.arn
}
  1. IAM으로 이동합니다
  2. 사이드바에서 "Roles"를 선택합니다
  3. "Create role"을 클릭합니다
  4. "Trusted entity type"으로 "Web identity"를 선택합니다
  5. 자격 증명 공급자를 선택합니다
  6. sts.amazonaws.com audience를 선택합니다
  7. "Add condition"을 클릭합니다
  8. 키로 example.teleport.sh:sub를 선택합니다
  9. 조건으로 "StringEquals"를 선택합니다
  10. 값으로 워크로드의 SPIFFE ID를 입력합니다. 이 예제에서는 spiffe://example.teleport.sh/svc/example-service이 됩니다
  11. "Next"를 클릭합니다
  12. 이전에 생성한 IAM 정책을 선택하고 "Next"를 클릭합니다
  13. 이 역할에 대한 고유하고 의미 있는 이름을 입력합니다. 이 예제에서는 workload-id-demo가 됩니다
  14. "Create role"을 클릭합니다

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

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

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

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

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

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

services:
  - type: workload-identity-jwt
    destination:
      type: directory
      path: /opt/workload-identity
    selector:
      name: example-workload-identity
    audiences: ["sts.amazonaws.com"]

교체할 내용:

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

새 구성을 적용하려면 tbot 서비스를 재시작합니다. JWT를 포함하는 /opt/workload-identity/jwt_svid 파일이 생성되어야 합니다.

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

마지막으로 AWS CLI와 SDK가 인증에 JWT SVID를 사용하도록 구성해야 합니다.

이는 ~/.aws/config 위치의 구성 파일을 사용하거나 환경 변수를 사용하여 수행할 수 있습니다.

진행하려면 이전에 생성한 역할의 ARN을 알아야 합니다.

~/.aws/config 파일에 다음을 추가합니다:

# "workload-id-demo"를 사용 사례를 식별하는 인식 가능한 이름으로 교체할 수 있습니다.
[profile workload-id-demo]
# 이전에 생성한 역할의 ARN으로 교체합니다.
role_arn=arn:aws:iam::123456789012:role/workload-id-demo
# `tbot`이 JWT를 쓰도록 구성한 디렉터리와 파일 이름으로 교체합니다.
web_identity_token_file=/opt/workload-identity/jwt_svid

다음 환경 변수를 구성합니다:

  • AWS_ROLE_ARN: 이전에 생성한 역할의 ARN, 예: arn:aws:iam::123456789012:role/workload-id-demo
  • AWS_WEB_IDENTITY_TOKEN_FILE: tbot이 쓰고 있는 JWT 파일 경로, 예: /opt/workload-identity/jwt_svid

이제 AWS S3 API에 인증을 테스트할 수 있습니다. 버킷에 업로드할 파일을 생성합니다:

$ echo "Hello, World!" > hello.txt

이제 AWS CLI를 사용하여 이 파일을 버킷에 업로드합니다:

$ aws s3 cp hello.txt s3://workload-id-demo

모든 것이 올바르게 구성되었다면 버킷에 이 파일이 업로드된 것을 확인할 수 있습니다:

$ aws s3 ls s3://workload-id-demo

CloudTrail의 감사 로그를 검사하면 요청이 워크로드 아이덴티티를 사용하여 인증되었으며 요청한 워크로드의 SPIFFE ID가 지정된 것을 확인할 수 있습니다.

다음 단계#

워크로드 아이덴티티와 AWS OIDC Federation 구성

원문 보기
요약

Teleport 워크로드 아이덴티티는 JWT 형식으로 유연한 단기 유효 신원을 발급합니다. 이는 머신이 장기 자격 증명 없이 AWS 서비스에 안전하게 인증해야 하는 경우에 유용합니다. 이 가이드에서는 Teleport 워크로드 아이덴티티와 AWS를 구성하여 워크로드가 AWS S3 API에 인증하고 버킷에 콘텐츠를 업로드할 수 있도록 합니다.

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

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

이 가이드에서는 Teleport 워크로드 아이덴티티와 AWS를 구성하여 워크로드가 AWS S3 API에 인증하고 버킷에 콘텐츠를 업로드할 수 있도록 합니다.

작동 방식#

이 구현은 Teleport Application Service를 사용하여 AWS API를 보호하는 것과 몇 가지 차이점이 있습니다:

  • AWS에 대한 요청이 Teleport Proxy Service를 통해 프록시되지 않아 지연 시간이 줄어들지만, 이러한 요청이 Teleport의 감사 로그에 기록되지 않아 가시성도 낮아집니다.
  • 워크로드 아이덴티티는 명령줄 도구뿐만 아니라 SDK를 포함한 모든 AWS 클라이언트와 함께 작동합니다.
  • Teleport Application Service를 사용하여 AWS에 접근하는 것은 Machine ID와 함께 작동하지 않으므로 머신이 AWS에 인증해야 할 때는 사용할 수 없습니다.

OIDC Federation vs Roles Anywhere#

AWS 플랫폼은 워크로드 신원 페더레이션을 위한 두 가지 방법을 제공합니다: OIDC Federation과 Roles Anywhere. Teleport 워크로드 아이덴티티는 두 가지 방법을 모두 지원합니다.

두 방법 간에는 몇 가지 차이점이 있습니다:

  • OIDC Federation은 JWT SVID를 AWS 자격 증명으로 교환하는 반면, Roles Anywhere는 X509 SVID를 AWS 자격 증명으로 교환합니다. X509 SVID 사용이 일반적으로 더 안전한 것으로 간주됩니다.
  • OIDC Federation은 워크로드 옆에 AWS 자격 증명 헬퍼를 별도로 설치할 필요가 없는 반면, Roles Anywhere는 필요합니다.
  • OIDC Federation은 Teleport Proxy Service가 AWS에서 접근 가능해야 하는 반면, Roles Anywhere는 그렇지 않습니다.

이 가이드는 OIDC federation 구성을 다룹니다. Roles Anywhere에 대해서는 워크로드 아이덴티티와 AWS Roles Anywhere 구성을 참조하세요.

사전 요구 사항#

  • A running Teleport cluster. If you want to get started with Teleport, sign up for a free trial or set up a demo environment.

  • The tctl and tsh clients.

    Installing `tctl` and `tsh` clients
    1. Determine the version of your Teleport cluster. The tctl and tsh clients must be at most one major version behind your Teleport cluster version. Send a GET request to the Proxy Service at /v1/webapi/find and use a JSON query tool to obtain your cluster version. Replace with the web address of your Teleport Proxy Service:

      $ TELEPORT_DOMAIN=
      $ TELEPORT_VERSION="$(curl -s https://$TELEPORT_DOMAIN/v1/webapi/find | jq -r '.server_version')"
      
    2. Follow the instructions for your platform to install tctl and tsh clients:

To check that you can connect to your Teleport cluster, sign in with tsh login, then verify that you can run tctl commands using your current credentials.

For example, run the following command, assigning to the domain name of the Teleport Proxy Service in your cluster and to your Teleport username:

$ tsh login --proxy= --user=
$ tctl status
# Cluster  (=teleport.url=)
# Version  (=teleport.version=)
# CA pin   (=presets.ca_pin=)

If you can connect to the cluster and run the tctl status command, you can use your current credentials to run subsequent tctl commands from your workstation. If you host your own Teleport cluster, you can also run tctl commands on the computer that hosts the Teleport Auth Service for full permissions.

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

SPIFFE ID 구조 결정#

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

이 가이드의 목적을 위해 spiffe://example.teleport.sh/svc/example-service SPIFFE ID에 AWS 접근 권한을 부여합니다.

Teleport 워크로드 아이덴티티를 이미 배포했다면 SPIFFE ID 구조가 이미 갖춰져 있을 것입니다. 그렇지 않다면 SPIFFE ID 구조를 결정해야 합니다.

AWS OIDC Federation과 함께만 Teleport 워크로드 아이덴티티를 사용하는 경우, SPIFFE ID가 맡을 수 있는 AWS 역할을 명시적으로 지정하도록 구조화할 수 있습니다. 그러나 SPIFFE ID를 사용할 워크로드나 사람의 이름을 지정하는 것이 더 합리적인 경우가 많습니다. 추가적인 조언은 모범 사례 가이드를 참조하세요.

1/4단계. AWS 구성#

처음으로 AWS OIDC Federation을 구성하려면 몇 가지 단계가 필요합니다. Teleport 클러스터에 대해 이전에 AWS OIDC Federation을 구성한 경우 일부 단계는 필요하지 않을 수 있습니다.

OpenID Connect 자격 증명 공급자 생성#

먼저 AWS에서 OIDC 자격 증명 공급자를 생성해야 합니다. 이를 통해 AWS와 Teleport 클러스터의 워크로드 아이덴티티 발급자 간의 신뢰 관계가 정의됩니다. 이 OIDC 자격 증명 공급자를 재사용하여 Teleport 워크로드 아이덴티티를 사용하는 다양한 워크로드에 AWS 서비스에 대한 접근 권한을 부여할 수 있습니다.

공급자를 구성할 때 발급자 URI를 지정해야 합니다. 이는 Teleport Proxy Service의 공개 주소에 경로 /workload-identity를 추가한 것입니다. OIDC federation이 작동하려면 AWS에서 Teleport Proxy Service에 접근할 수 있어야 합니다.

OIDC 자격 증명 공급자를 구성하기 전에 Teleport Proxy Service에서 사용하는 TLS 인증서의 지문을 확인해야 합니다. curl을 사용하여 확인할 수 있습니다:

$ curl https://example.teleport.sh/webapi/thumbprint
"example589ee4bf31a11b78c72b8d13f0example"%

AWS 계정을 관리하도록 이미 구성된 Terraform 구성 파일에 다음을 삽입합니다:

resource "aws_iam_openid_connect_provider" "example_teleport_sh_workload_identity" {
  // "example.teleport.sh"를 Teleport Proxy Service에 접근하는 데 사용되는
  // 호스트 이름으로 교체하세요.
  url = "https://example.teleport.sh/workload-identity"

  client_id_list = [
    "sts.amazonaws.com",
  ]

  thumbprint_list = [
    // curl을 사용하여 확인한 지문으로 교체하세요.
    "example589ee4bf31a11b78c72b8d13f0example"
  ]
}
  1. IAM으로 이동합니다
  2. 사이드바에서 "Identity Providers"를 선택합니다
  3. "Add provider"를 선택합니다
  4. "Provider type"으로 "OpenID Connect"를 선택합니다.
  5. Teleport Proxy Service의 공개 호스트명에 "/workload-identity"를 추가하여 "Provider URL"로 지정합니다. 예: https://example.teleport.sh/workload-identity
  6. Audience로 sts.amazonaws.com을 지정합니다
  7. "Add Provider"를 클릭합니다.

S3 버킷 생성#

이 가이드의 목적을 위해 워크로드에 AWS S3 버킷 접근 권한을 부여합니다. RBAC 구성에 들어가기 전에 버킷을 생성해야 합니다.

AWS 내의 다른 서비스에 접근 권한을 부여하려면 이 단계를 건너뛸 수 있습니다.

// S3 버킷 생성
resource "aws_s3_bucket" "example" {
  // "example"을 의미 있고 고유한 이름으로 교체하세요.
  bucket = "workload-id-demo"
}
  1. S3으로 이동합니다
  2. "Create bucket"을 선택합니다
  3. 버킷에 대한 의미 있고 고유한 이름을 입력합니다. 예: workload-id-demo
  4. 다른 설정은 기본값으로 둡니다
  5. "Create bucket"을 클릭합니다.

RBAC 구성#

IAM 정책 생성#

먼저 S3 버킷에 접근 권한을 부여하는 IAM 정책을 생성합니다. 나중에 워크로드가 맡을 역할에 이 정책을 연결합니다.

이 가이드의 예제는 예제 버킷에 대한 전체 접근 권한을 부여하는 IAM 정책을 생성합니다. 프로덕션 환경에서는 최소 필요 권한만 부여하도록 수정해야 합니다.

Terraform 구성 파일에 다음을 삽입합니다:

resource "aws_iam_policy" "example" {
  // 정책이 접근 권한을 부여하는 내용을 설명하는 고유하고 의미 있는 이름을 선택합니다.
  name        = "workload-id-s3-full-access"
  path        = "/"

  // 이 예제 정책은 AWS S3에 대한 전체 접근 권한을 부여합니다. 프로덕션에서는
  // 더 제한적인 정책을 부여할 수 있습니다.
  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [{
      Action = "s3:*"
      Effect = "Allow"
      Resource = [
        aws_s3_bucket.workload_id_demo.arn,
        "${aws_s3_bucket.workload_id_demo.arn}/*"
      ]
    }]
  })
}
  1. IAM으로 이동합니다
  2. 사이드바에서 "Policies"를 선택합니다
  3. "Create policy"를 클릭합니다
  4. "S3" 서비스를 선택합니다
  5. "Actions allowed"에서 "All S3 actions"를 선택합니다
  6. "Resources"에서 "Specific"을 선택합니다
  7. "bucket"에 이전에 생성한 버킷 이름을 입력합니다.
  8. "object"에 이전에 생성한 버킷 이름을 입력하고 "All objects"를 선택합니다
  9. "Next"를 클릭합니다
  10. 이 정책에 대한 고유하고 의미 있는 이름을 입력합니다. 이 예제에서는 workload-id-s3-full-access가 됩니다
  11. "Create policy"를 클릭합니다

IAM 역할 생성#

이제 IAM 역할을 생성합니다. 이 역할은 Teleport 워크로드 아이덴티티가 발급한 JWT SVID를 사용하여 AWS에 인증한 후 워크로드가 맡게 됩니다.

IAM 역할을 생성할 때 어떤 워크로드 신원이 역할을 맡을 수 있는지 제어하는 신뢰 정책을 정의합니다. 이 정책에는 Teleport 워크로드 아이덴티티가 발급한 JWT SVID 내의 클레임에 대해 평가되는 조건이 포함됩니다. 우리의 경우 평가하려는 유일한 클레임은 워크로드의 SPIFFE ID를 포함하는 sub 클레임입니다.

마지막으로 이전에 생성한 IAM 정책을 이 역할에 연결하여 정책에 명시된 권한을 부여합니다.

Terraform 구성 파일에 다음을 삽입합니다:

// 워크로드 신원이 맡을 역할을 생성합니다.
resource "aws_iam_role" "example" {
  // 역할과 이를 맡을 워크로드를 설명하는 고유하고 의미 있는 이름을 선택합니다.
  name = "workload-id-demo"
  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [{
      Effect = "Allow"
      Principal = {
        Federated = aws_iam_openid_connect_provider.example.arn
      }
      Action = "sts:AssumeRoleWithWebIdentity"
      Condition = {
        StringEquals = {
          "${aws_iam_openid_connect_provider.example.url}:aud" = "sts.amazonaws.com"
          "${aws_iam_openid_connect_provider.example.url}:sub" = "spiffe://example.teleport.sh/svc/example-service"
        }
      }
    }]
  })
}

// 이전에 생성한 정책을 역할에 연결합니다.
resource "aws_iam_role_policy_attachment" "example" {
    role       = aws_iam_role.example.name
    policy_arn = aws_iam_policy.example.arn
}
  1. IAM으로 이동합니다
  2. 사이드바에서 "Roles"를 선택합니다
  3. "Create role"을 클릭합니다
  4. "Trusted entity type"으로 "Web identity"를 선택합니다
  5. 자격 증명 공급자를 선택합니다
  6. sts.amazonaws.com audience를 선택합니다
  7. "Add condition"을 클릭합니다
  8. 키로 example.teleport.sh:sub를 선택합니다
  9. 조건으로 "StringEquals"를 선택합니다
  10. 값으로 워크로드의 SPIFFE ID를 입력합니다. 이 예제에서는 spiffe://example.teleport.sh/svc/example-service이 됩니다
  11. "Next"를 클릭합니다
  12. 이전에 생성한 IAM 정책을 선택하고 "Next"를 클릭합니다
  13. 이 역할에 대한 고유하고 의미 있는 이름을 입력합니다. 이 예제에서는 workload-id-demo가 됩니다
  14. "Create role"을 클릭합니다

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

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

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

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

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

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

services:
  - type: workload-identity-jwt
    destination:
      type: directory
      path: /opt/workload-identity
    selector:
      name: example-workload-identity
    audiences: ["sts.amazonaws.com"]

교체할 내용:

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

새 구성을 적용하려면 tbot 서비스를 재시작합니다. JWT를 포함하는 /opt/workload-identity/jwt_svid 파일이 생성되어야 합니다.

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

마지막으로 AWS CLI와 SDK가 인증에 JWT SVID를 사용하도록 구성해야 합니다.

이는 ~/.aws/config 위치의 구성 파일을 사용하거나 환경 변수를 사용하여 수행할 수 있습니다.

진행하려면 이전에 생성한 역할의 ARN을 알아야 합니다.

~/.aws/config 파일에 다음을 추가합니다:

# "workload-id-demo"를 사용 사례를 식별하는 인식 가능한 이름으로 교체할 수 있습니다.
[profile workload-id-demo]
# 이전에 생성한 역할의 ARN으로 교체합니다.
role_arn=arn:aws:iam::123456789012:role/workload-id-demo
# `tbot`이 JWT를 쓰도록 구성한 디렉터리와 파일 이름으로 교체합니다.
web_identity_token_file=/opt/workload-identity/jwt_svid

다음 환경 변수를 구성합니다:

  • AWS_ROLE_ARN: 이전에 생성한 역할의 ARN, 예: arn:aws:iam::123456789012:role/workload-id-demo
  • AWS_WEB_IDENTITY_TOKEN_FILE: tbot이 쓰고 있는 JWT 파일 경로, 예: /opt/workload-identity/jwt_svid

이제 AWS S3 API에 인증을 테스트할 수 있습니다. 버킷에 업로드할 파일을 생성합니다:

$ echo "Hello, World!" > hello.txt

이제 AWS CLI를 사용하여 이 파일을 버킷에 업로드합니다:

$ aws s3 cp hello.txt s3://workload-id-demo

모든 것이 올바르게 구성되었다면 버킷에 이 파일이 업로드된 것을 확인할 수 있습니다:

$ aws s3 ls s3://workload-id-demo

CloudTrail의 감사 로그를 검사하면 요청이 워크로드 아이덴티티를 사용하여 인증되었으며 요청한 워크로드의 SPIFFE ID가 지정된 것을 확인할 수 있습니다.

다음 단계#