InfoGrab Docs

AWS KMS에 Teleport 개인 키 저장

요약

이 가이드는 AWS Key Management Service(KMS)를 사용하여 클러스터에서 발급하는 모든 인증서에 서명하는 데 사용되는 CA 개인 키 자료를 저장하고 처리하도록 Teleport 클러스터를 설정하는 방법을 보여줍니다.

이 가이드는 AWS Key Management Service(KMS)를 사용하여 클러스터에서 발급하는 모든 인증서에 서명하는 데 사용되는 CA 개인 키 자료를 저장하고 처리하도록 Teleport 클러스터를 설정하는 방법을 보여줍니다.

작동 방식#

Teleport는 첫 번째 Auth Service 인스턴스의 초기 시작 시 내부 인증 기관(CA)에 대한 개인 키 자료를 생성합니다. 이 CA는 Teleport 클러스터의 클라이언트와 호스트에 발급되는 모든 인증서에 서명하는 데 사용됩니다. AWS KMS를 사용하도록 구성된 경우 이 CA에 대한 모든 개인 키 자료는 AWS KMS 내에서 생성, 저장 및 서명에 사용됩니다. 실제 개인 키 대신 Teleport는 KMS 키의 ID만 저장합니다. 즉, 개인 키 자료는 절대 AWS KMS를 벗어나지 않습니다.

새 Teleport 클러스터를 시작하는 경우 구성 후 추가 개입 없이 초기 시작 시 모두 처리됩니다. 이미 소프트웨어 개인 키를 생성한 기존 Teleport 클러스터의 경우 CA 로테이션을 수행해야 합니다. 자세한 내용은 기존 클러스터 마이그레이션을 참조하세요.

사전 요구사항#

이 페이지에 문서화된 기능은 Teleport 15.0.0 이상에서 사용 가능합니다.

  • Teleport Enterprise (자체 호스팅).
  • AWS 계정.

1단계/3. AWS IAM 권한 구성#

Teleport Auth Service는 AWS 계정에서 KMS 키를 생성, 서명, 나열 및 삭제하는 권한이 필요합니다.

계정에서 다음 AWS IAM 정책을 생성하는 것으로 시작합니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ListKeys",
            "Effect": "Allow",
            "Action": [
                "kms:ListKeys"
            ],
            "Resource": "*"
        },
        {
            "Sid": "CreateSigningKeys",
            "Effect": "Allow",
            "Action": [
                "kms:CreateKey",
                "kms:TagResource"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:RequestTag/TeleportCluster": "teleport.example.com" description="Your Teleport cluster name"/>",
                    "aws:ResourceTag/TeleportCluster": "teleport.example.com" description="Your Teleport cluster name"/>"
                }
            }
        },
        {
            "Sid": "CreateEncryptionKeys",
            "Effect": "Allow",
            "Action": [
                "kms:CreateKey",
                "kms:TagResource"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:RequestTag/TeleportClusterEncryption": "teleport.example.com" description="Your Teleport cluster name"/>",
                    "aws:ResourceTag/TeleportClusterEncryption": "teleport.example.com" description="Your Teleport cluster name"/>"
                }
            }
        },
        {
            "Sid": "UseSigningKeys",
            "Effect": "Allow",
            "Action": [
                "kms:GetPublicKey",
                "kms:ScheduleKeyDeletion",
                "kms:DescribeKey",
                "kms:ListResourceTags",
                "kms:Sign"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/TeleportCluster": "teleport.example.com" description="Your Teleport cluster name"/>"
                }
            }
        },
        {
            "Sid": "UseEncryptionKeys",
            "Effect": "Allow",
            "Action": [
                "kms:GetPublicKey",
                "kms:ScheduleKeyDeletion",
                "kms:DescribeKey",
                "kms:ListResourceTags",
                "kms:Decrypt"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/TeleportClusterEncryption": "teleport.example.com" description="Your Teleport cluster name"/>"
                }
            }
        }
    ]
}

AWS 콘솔에서 또는 AWS CLI를 통해 정책을 생성할 수 있습니다.

$ aws iam create-policy --policy-name TeleportKMS --policy-document file://policy.json
{
    "Policy": {
        "PolicyName": "TeleportKMS",
        "PolicyId": "XXXXXXXXXXXXXXXXXXXXX",
        "Arn": "arn:aws:iam::123456789012:policy/TeleportKMS",
        "Path": "/",
        "DefaultVersionId": "v1",
        "AttachmentCount": 0,
        "PermissionsBoundaryUsageCount": 0,
        "IsAttachable": true,
        "CreateDate": "2024-01-29T23:05:06+00:00",
        "UpdateDate": "2024-01-29T23:05:06+00:00"
    }
}

Auth Service 인스턴스가 AWS 계정에서 인증하는 IAM 역할에 정책을 연결합니다. AWS 콘솔에서 또는 AWS CLI를 통해 정책을 연결할 수 있습니다.

$ aws iam attach-role-policy --role-name  --policy-arn <policy ARN>

경고

이 IAM 역할에 접근 권한이 있는 누구나 Teleport CA인 것처럼 서명을 생성할 수 있다는 점에 유의하세요. 이것은 고도로 권한이 있는 역할로 간주되어야 하며 가능한 한 제한되어야 합니다.

Instance Metadata Service를 통해 Teleport Auth Service에 AWS 자격 증명을 제공하는 경우, 인스턴스에 접근 권한이 있는 모든 사용자가 해당 자격 증명을 사용할 수 있다는 점에 유의하세요. 다음 iptables 규칙을 사용하여 IMDS 접근을 루트 사용자만으로 제한할 수 있습니다:

$ iptables -A OUTPUT -m owner ! --uid-owner 0 -d 169.254.169.254 -j REJECT

2단계/3. Auth Service가 KMS 키를 사용하도록 구성#

CA 키 매개변수는 클러스터의 Teleport Auth Service 인스턴스의 teleport.yaml 구성 파일에 정적으로 구성됩니다.

auth_service 섹션에 다음 ca_key_params 구성을 포함합니다. 를 AWS 계정 ID로, ""을 AWS 리전 이름으로 지정합니다:

# /etc/teleport.yaml
# ...
auth_service:
  # ...
  ca_key_params:
    aws_kms:
      account: "AWS account"/>"
      region: "AWS region"/>"

새 Teleport 클러스터의 첫 번째 시작 전에 구성하는 경우 초기 CA 키가 AWS KMS에 자동으로 생성되며 추가 단계가 필요하지 않습니다. 소프트웨어 키에서 AWS KMS 키로 기존 Teleport 클러스터를 마이그레이션하려면 기존 클러스터 마이그레이션을 계속 읽으세요.

3단계/3. 모든 것이 작동하는지 확인#

aws_kms 구성으로 Auth Service를 시작한 후 AWS 콘솔에서 키를 확인하여 Teleport가 AWS KMS 키를 생성했는지 확인할 수 있습니다.

tctl status는 모든 인증 기관 키에 대해 storage 방법으로 AWS KMS를 표시해야 합니다.

다음 tctl 명령을 실행하여 각 키의 ARN을 찾을 수도 있습니다.

$ tctl get cert_authorities --with-secrets --format json | jq -r '.[].spec.active_keys.tls[0].key | select(.) | @base64d'
awskms:arn:aws:kms:us-west-2:123456789012:key/dd0f77e2-a1b7-4ecd-ba83-d29476c15fec
awskms:arn:aws:kms:us-west-2:123456789012:key/fe8daacb-2457-4639-aa68-2bdc38a47a89
awskms:arn:aws:kms:us-west-2:123456789012:key/fb48f161-55ba-47da-9d4e-24ed4ef8cce4
awskms:arn:aws:kms:us-west-2:123456789012:key/7c2ae604-8b8c-425e-8d53-c4d3070cdb10
awskms:arn:aws:kms:us-west-2:123456789012:key/d8a4196f-6864-421a-911f-16d69473135c
$ tctl get cert_authorities --with-secrets --format json | jq -r '.[].spec.active_keys.ssh[0].private_key | select(.) | @base64d'
awskms:arn:aws:kms:us-west-2:123456789012:key/dd8b4a02-5602-4d34-8773-a56e669db75f
awskms:arn:aws:kms:us-west-2:123456789012:key/026e3c42-0c37-40d0-b9f4-bd1fa394b9a9
awskms:arn:aws:kms:us-west-2:123456789012:key/ffa93061-0979-4ff1-b0af-d9a5dda6d894
$ tctl get cert_authorities --with-secrets --format json | jq -r '.[].spec.active_keys.jwt[0].private_key | select(.) | @base64d'
awskms:arn:aws:kms:us-west-2:123456789012:key/d4e63a5d-ed81-46c4-ad72-3f57a07eb9d5
awskms:arn:aws:kms:us-west-2:123456789012:key/5c99e6aa-deb1-45c0-865e-08847214b7ab

Teleport 사용자로 클러스터에 로그인하여 오류 없이 새 인증서에 서명할 수 있는지 확인합니다.

기존 클러스터 마이그레이션#

기존 Teleport 클러스터가 있는 경우 첫 번째 시작 시 이미 소프트웨어 CA 키를 생성했을 것입니다. 기존 CA 키는 모든 기존 사용자 및 호스트 인증서에 서명하는 데 사용되었으며 클러스터의 다른 모든 서비스에서 신뢰됩니다.

Teleport Auth Service가 AWS KMS에 새 키를 생성하고 나머지 클러스터에서 신뢰받으려면 모든 Teleport CA를 로테이션해야 합니다.

teleport start는 CA 로테이션이 필요한 경우 시작 시 경고를 출력합니다. Teleport 역할에서 cert_authority 리소스에 대해 update 동사가 허용된 사용자는 CA를 로테이션하도록 상기시키는 클러스터 알림도 볼 수 있습니다.

CA 로테이션은 수동 또는 반자동으로 수행할 수 있습니다. 인증서 로테이션에 관한 관리자 가이드를 참조하세요. tctl status 출력에 나열된 모든 CA를 로테이션해야 합니다.

AWS KMS에 Teleport 개인 키 저장

원문 보기
요약

이 가이드는 AWS Key Management Service(KMS)를 사용하여 클러스터에서 발급하는 모든 인증서에 서명하는 데 사용되는 CA 개인 키 자료를 저장하고 처리하도록 Teleport 클러스터를 설정하는 방법을 보여줍니다.

이 가이드는 AWS Key Management Service(KMS)를 사용하여 클러스터에서 발급하는 모든 인증서에 서명하는 데 사용되는 CA 개인 키 자료를 저장하고 처리하도록 Teleport 클러스터를 설정하는 방법을 보여줍니다.

작동 방식#

Teleport는 첫 번째 Auth Service 인스턴스의 초기 시작 시 내부 인증 기관(CA)에 대한 개인 키 자료를 생성합니다. 이 CA는 Teleport 클러스터의 클라이언트와 호스트에 발급되는 모든 인증서에 서명하는 데 사용됩니다. AWS KMS를 사용하도록 구성된 경우 이 CA에 대한 모든 개인 키 자료는 AWS KMS 내에서 생성, 저장 및 서명에 사용됩니다. 실제 개인 키 대신 Teleport는 KMS 키의 ID만 저장합니다. 즉, 개인 키 자료는 절대 AWS KMS를 벗어나지 않습니다.

새 Teleport 클러스터를 시작하는 경우 구성 후 추가 개입 없이 초기 시작 시 모두 처리됩니다. 이미 소프트웨어 개인 키를 생성한 기존 Teleport 클러스터의 경우 CA 로테이션을 수행해야 합니다. 자세한 내용은 기존 클러스터 마이그레이션을 참조하세요.

사전 요구사항#

이 페이지에 문서화된 기능은 Teleport 15.0.0 이상에서 사용 가능합니다.

  • Teleport Enterprise (자체 호스팅).
  • AWS 계정.

1단계/3. AWS IAM 권한 구성#

Teleport Auth Service는 AWS 계정에서 KMS 키를 생성, 서명, 나열 및 삭제하는 권한이 필요합니다.

계정에서 다음 AWS IAM 정책을 생성하는 것으로 시작합니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ListKeys",
            "Effect": "Allow",
            "Action": [
                "kms:ListKeys"
            ],
            "Resource": "*"
        },
        {
            "Sid": "CreateSigningKeys",
            "Effect": "Allow",
            "Action": [
                "kms:CreateKey",
                "kms:TagResource"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:RequestTag/TeleportCluster": "teleport.example.com" description="Your Teleport cluster name"/>",
                    "aws:ResourceTag/TeleportCluster": "teleport.example.com" description="Your Teleport cluster name"/>"
                }
            }
        },
        {
            "Sid": "CreateEncryptionKeys",
            "Effect": "Allow",
            "Action": [
                "kms:CreateKey",
                "kms:TagResource"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:RequestTag/TeleportClusterEncryption": "teleport.example.com" description="Your Teleport cluster name"/>",
                    "aws:ResourceTag/TeleportClusterEncryption": "teleport.example.com" description="Your Teleport cluster name"/>"
                }
            }
        },
        {
            "Sid": "UseSigningKeys",
            "Effect": "Allow",
            "Action": [
                "kms:GetPublicKey",
                "kms:ScheduleKeyDeletion",
                "kms:DescribeKey",
                "kms:ListResourceTags",
                "kms:Sign"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/TeleportCluster": "teleport.example.com" description="Your Teleport cluster name"/>"
                }
            }
        },
        {
            "Sid": "UseEncryptionKeys",
            "Effect": "Allow",
            "Action": [
                "kms:GetPublicKey",
                "kms:ScheduleKeyDeletion",
                "kms:DescribeKey",
                "kms:ListResourceTags",
                "kms:Decrypt"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/TeleportClusterEncryption": "teleport.example.com" description="Your Teleport cluster name"/>"
                }
            }
        }
    ]
}

AWS 콘솔에서 또는 AWS CLI를 통해 정책을 생성할 수 있습니다.

$ aws iam create-policy --policy-name TeleportKMS --policy-document file://policy.json
{
    "Policy": {
        "PolicyName": "TeleportKMS",
        "PolicyId": "XXXXXXXXXXXXXXXXXXXXX",
        "Arn": "arn:aws:iam::123456789012:policy/TeleportKMS",
        "Path": "/",
        "DefaultVersionId": "v1",
        "AttachmentCount": 0,
        "PermissionsBoundaryUsageCount": 0,
        "IsAttachable": true,
        "CreateDate": "2024-01-29T23:05:06+00:00",
        "UpdateDate": "2024-01-29T23:05:06+00:00"
    }
}

Auth Service 인스턴스가 AWS 계정에서 인증하는 IAM 역할에 정책을 연결합니다. AWS 콘솔에서 또는 AWS CLI를 통해 정책을 연결할 수 있습니다.

$ aws iam attach-role-policy --role-name  --policy-arn <policy ARN>

경고

이 IAM 역할에 접근 권한이 있는 누구나 Teleport CA인 것처럼 서명을 생성할 수 있다는 점에 유의하세요. 이것은 고도로 권한이 있는 역할로 간주되어야 하며 가능한 한 제한되어야 합니다.

Instance Metadata Service를 통해 Teleport Auth Service에 AWS 자격 증명을 제공하는 경우, 인스턴스에 접근 권한이 있는 모든 사용자가 해당 자격 증명을 사용할 수 있다는 점에 유의하세요. 다음 iptables 규칙을 사용하여 IMDS 접근을 루트 사용자만으로 제한할 수 있습니다:

$ iptables -A OUTPUT -m owner ! --uid-owner 0 -d 169.254.169.254 -j REJECT

2단계/3. Auth Service가 KMS 키를 사용하도록 구성#

CA 키 매개변수는 클러스터의 Teleport Auth Service 인스턴스의 teleport.yaml 구성 파일에 정적으로 구성됩니다.

auth_service 섹션에 다음 ca_key_params 구성을 포함합니다. 를 AWS 계정 ID로, ""을 AWS 리전 이름으로 지정합니다:

# /etc/teleport.yaml
# ...
auth_service:
  # ...
  ca_key_params:
    aws_kms:
      account: "AWS account"/>"
      region: "AWS region"/>"

새 Teleport 클러스터의 첫 번째 시작 전에 구성하는 경우 초기 CA 키가 AWS KMS에 자동으로 생성되며 추가 단계가 필요하지 않습니다. 소프트웨어 키에서 AWS KMS 키로 기존 Teleport 클러스터를 마이그레이션하려면 기존 클러스터 마이그레이션을 계속 읽으세요.

3단계/3. 모든 것이 작동하는지 확인#

aws_kms 구성으로 Auth Service를 시작한 후 AWS 콘솔에서 키를 확인하여 Teleport가 AWS KMS 키를 생성했는지 확인할 수 있습니다.

tctl status는 모든 인증 기관 키에 대해 storage 방법으로 AWS KMS를 표시해야 합니다.

다음 tctl 명령을 실행하여 각 키의 ARN을 찾을 수도 있습니다.

$ tctl get cert_authorities --with-secrets --format json | jq -r '.[].spec.active_keys.tls[0].key | select(.) | @base64d'
awskms:arn:aws:kms:us-west-2:123456789012:key/dd0f77e2-a1b7-4ecd-ba83-d29476c15fec
awskms:arn:aws:kms:us-west-2:123456789012:key/fe8daacb-2457-4639-aa68-2bdc38a47a89
awskms:arn:aws:kms:us-west-2:123456789012:key/fb48f161-55ba-47da-9d4e-24ed4ef8cce4
awskms:arn:aws:kms:us-west-2:123456789012:key/7c2ae604-8b8c-425e-8d53-c4d3070cdb10
awskms:arn:aws:kms:us-west-2:123456789012:key/d8a4196f-6864-421a-911f-16d69473135c
$ tctl get cert_authorities --with-secrets --format json | jq -r '.[].spec.active_keys.ssh[0].private_key | select(.) | @base64d'
awskms:arn:aws:kms:us-west-2:123456789012:key/dd8b4a02-5602-4d34-8773-a56e669db75f
awskms:arn:aws:kms:us-west-2:123456789012:key/026e3c42-0c37-40d0-b9f4-bd1fa394b9a9
awskms:arn:aws:kms:us-west-2:123456789012:key/ffa93061-0979-4ff1-b0af-d9a5dda6d894
$ tctl get cert_authorities --with-secrets --format json | jq -r '.[].spec.active_keys.jwt[0].private_key | select(.) | @base64d'
awskms:arn:aws:kms:us-west-2:123456789012:key/d4e63a5d-ed81-46c4-ad72-3f57a07eb9d5
awskms:arn:aws:kms:us-west-2:123456789012:key/5c99e6aa-deb1-45c0-865e-08847214b7ab

Teleport 사용자로 클러스터에 로그인하여 오류 없이 새 인증서에 서명할 수 있는지 확인합니다.

기존 클러스터 마이그레이션#

기존 Teleport 클러스터가 있는 경우 첫 번째 시작 시 이미 소프트웨어 CA 키를 생성했을 것입니다. 기존 CA 키는 모든 기존 사용자 및 호스트 인증서에 서명하는 데 사용되었으며 클러스터의 다른 모든 서비스에서 신뢰됩니다.

Teleport Auth Service가 AWS KMS에 새 키를 생성하고 나머지 클러스터에서 신뢰받으려면 모든 Teleport CA를 로테이션해야 합니다.

teleport start는 CA 로테이션이 필요한 경우 시작 시 경고를 출력합니다. Teleport 역할에서 cert_authority 리소스에 대해 update 동사가 허용된 사용자는 CA를 로테이션하도록 상기시키는 클러스터 알림도 볼 수 있습니다.

CA 로테이션은 수동 또는 반자동으로 수행할 수 있습니다. 인증서 로테이션에 관한 관리자 가이드를 참조하세요. tctl status 출력에 나열된 모든 CA를 로테이션해야 합니다.