Docker에서 Consul auto-config 사용

Docker에서 Consul auto-config 사용 (Auto-Config on Docker)

Docker에서 Consul auto-config에 대한 개요를 설명하는 문서예요. auto-config는 Consul 서버에서 클라이언트 에이전트로 보안 속성(ACL 토큰, TLS 인증서, gossip 암호화 키)을 자동으로 배포하는 확장 가능한 방법이에요.

출처: 문서

본문

이 주제는 Docker에서 Consul auto-config에 대한 개요를 제공합니다.

소개 (Introduction)

Consul auto_config는 ACL(액세스 제어 목록) 토큰, TLS 인증서, gossip 암호화 키를 포함한 보안 속성을 Consul 서버에서 클라이언트 에이전트로 자동 배포하는 확장성이 매우 높은 방법입니다.

이 방법을 활성화하는 워크플로는 두 단계로 구성됩니다:

  1. JSON 웹 토큰(JWT)을 생성합니다.
  2. Consul 클라이언트에서 토큰을 사용해 Consul 클러스터에 조인합니다.

Consul 클라이언트는 그런 다음 JWTs를 사용해 보안 설정 변경 사항을 Consul 서버에서 안전하게 검색합니다.

워크플로 (Workflow)

Consul의 auto_config는 HashiCorp Vault 같은 프로덕션급 시크릿 관리 플랫폼 및 기타 타사 플랫폼과의 통합을 지원합니다. 다음 예시들은 Vault 및 타사 도구 secint에 대한 프로세스를 보여줍니다.

Consul 서버 구성 (Consul server configuration)

먼저 Consul 서버 에이전트의 구성에 auto_config 스탠자를 추가합니다.

Vault 구성 (consul_server.json):

{
  ##... 
    "auto_config": {
        "authorization": {
            "enabled": true,
            "static": {
                "oidc_discovery_url": "http://vault-server:8200/v1/identity/oidc",
                "bound_issuer": "http://vault-server:8200/v1/identity/oidc",
                "bound_audiences": ["consul-cluster-dc1"],
                "claim_mappings": {
                    "/consul/hostname": "node_name"
                },
                "claim_assertions": [
                    "value.node_name == \"${node}\""
                ]
            }
        }
    },
  ##...
}

Consul 서버 노드의 auto_config 구성은 다음 옵션으로 구성됩니다:

  • authorization - 하위 키 enabled를 true로 설정하면 이 에이전트에서 인증 서비스를 활성화합니다. 이를 통해 서버 에이전트가 클라이언트의 auto_config RPC 요청을 처리할 수 있습니다.
  • static - 이 객체는 모든 정적 인증자 구성 설정을 포함합니다.
  • oidc_discovery_url - JSON 웹 토큰(JWT)을 검증하는 데 사용되는 URL입니다. 이 예시에서는 Vault의 OIDC URL 엔드포인트 http://vault-server:8200/v1/identity/oidc를 사용합니다.
  • bound_issuer - JSON 웹 토큰(JWT)의 iss 값을 일치시키기 위한 값입니다. JWT의 발급자 iss 클레임은 JWT를 발급한 리소스를 참조하기 위한 것입니다. 이 예시에서 Vault 서버는 생성된 JWT의 발급자로 OIDC URL 엔드포인트 http://vault-server:8200/v1/identity/oidc를 할당합니다.
  • bound_audiences - JSON 웹 토큰(JWT)의 aud 필드를 일치시키기 위한 값입니다. JWT의 대상 aud 클레임은 토큰을 수락해야 하는 인증 서버를 참조하기 위한 것입니다. 이 예시에서 Vault는 생성된 JWT 토큰에 consul-cluster-dc1의 aud 값을 할당합니다.
  • claim_assertions - 들어오는 RPC 요청을 승인하는 데 필요한 매핑된 클레임에 대한 어서션(assertion) 목록입니다. 이 예시에서 "value.node_name == \"${node}\""는 node_name 변수의 값을 auto_config 인증 서버에 요청하는 Consul 클라이언트의 호스트 이름으로 설정합니다.
  • claim_mappings - 메타데이터 필드(값)에 복사될 클레임(키)의 매핑입니다. 이 예시에서 "/consul/hostname": "node_name"은 node_name 변수의 값을 /consul/hostname의 메타데이터 값과 대조합니다.

secint (타사) 구성 (consul_server.json):

{
  ##...
    "auto_config": {
        "authorization": {
            "enabled": true,
            "static": {
                "jwt_validation_pub_keys": [], # To be filled with the contents of secint-pub-key.pem later
                "bound_issuer": "secint",
                "bound_audiences": ["consul-cluster-dc1"],
                "claim_mappings": {
                    "sub": "node_name"
                },
                "claim_assertions": [
                    "value.node_name == \"${node}\""
                ]
            }
        }
    },
  ##...
}
  • authorization - 하위 키 enabled를 true로 설정하면 이 에이전트에서 인증 서비스를 활성화합니다.
  • static - 이 객체는 모든 정적 인증자 구성 설정을 포함합니다.
  • jwt_validation_pub_keys - JSON 웹 토큰(JWT)을 검증하는 데 사용되는 PEM 인코딩 공개 키 목록입니다. 이 예시에서는 secint로 생성한 공개 키의 내용을 포함합니다.
  • bound_issuer - JWT의 iss 값을 일치시키기 위한 값입니다. 이 예시에서 secint는 생성된 JWT의 발급자로 사용자 정의 값 secint를 할당합니다.
  • bound_audiences - JWT의 aud 필드를 일치시키기 위한 값입니다. 이 예시에서 Vault는 생성된 JWT 토큰에 consul-cluster-dc1의 aud 값을 할당합니다.
  • claim_assertions - 들어오는 RPC 요청을 승인하는 데 필요한 매핑된 클레임에 대한 어서션 목록입니다. 이 예시에서 "value.node_name == \"${node}\""는 node_name 변수의 값을 auto_config 인증 서버에 요청하는 Consul 클라이언트의 호스트 이름으로 설정합니다.
  • claim_mappings - 메타데이터 필드(값)에 복사될 클레임(키)의 매핑입니다. 이 예시에서 "sub": "node_name"은 node_name 변수의 값을 sub 속성의 메타데이터 값과 대조합니다.

지정할 수 있는 옵션에 대한 자세한 내용은 Consul agent auto_config 파라미터 참조 문서를 참조하세요.

Consul 클라이언트 구성 (Consul client configuration)

auto_config가 활성화된 Consul 클라이언트 에이전트에서 클라이언트 에이전트는 구성된 server_addresses와 통신할 때 intro_token_file의 JSON 웹 토큰(JWT) 값을 사용해 보안 구성 설정을 요청합니다. Consul은 그런 다음 이러한 설정을 클라이언트 에이전트의 기존 구성에 병합합니다.

consul_client.json:

{
    ##...
    "auto_config":{
        "enabled": true,
        "intro_token_file": "/consul/config/tokens/jwt",
        "server_addresses":[
            "consul-server1",
            "consul-server2",
            "consul-server3"
        ]
    },
    ##...
}

Consul 클라이언트 노드의 auto_config 구성은 다음 옵션으로 구성됩니다:

  • enabled - 이 키를 true로 설정하면 에이전트에서 auto_config 클라이언트 서비스를 활성화합니다. 이 옵션을 활성화하면 Consul 서비스 메시 CA를 사용해 클라이언트 에이전트에 인증서를 발급해야 하므로 Consul service mesh도 켭니다.
  • intro_token_file - Consul 서버에 대한 초기 auto_config RPC에 사용할 JSON 웹 토큰(JWT)이 포함된 파일을 지정합니다.
  • server_addresses - 초기 RPC에 사용할 로컬 데이터센터의 서버 주소를 지정합니다. 이러한 주소는 Cloud Auto-Joining을 지원하며 선택적으로 아웃바운드 연결 시 사용할 포트를 포함할 수 있습니다. 포트가 제공되지 않으면 server RPC port가 사용됩니다.

JWT 생성 (Generate JWTs)

Vault: Vault는 내장 Identity Secrets Engine을 사용해 Consul 클라이언트 auto_config 요청을 검증하는 데 필요한 JSON 웹 토큰(JWT)을 생성합니다.

이름이 붙은 키는 역할이 JSON 웹 토큰(JWT)에 서명하는 데 사용됩니다. 이 예시의 allowed_client_ids 값은 JWT가 생성될 때 aud 값이 됩니다. JWT의 대상 aud 클레임 consul-cluster-dc1은 토큰을 수락해야 하는 인증 서버를 참조합니다.

이름이 붙은 키를 만듭니다:

$ vault write identity/oidc/key/oidc-key-1 allowed_client_ids="consul-cluster-dc1"

Success! Data written to: identity/oidc/key/oidc-key-1

JSON 웹 토큰(JWT)은 역할에 대해 생성되고 이름이 붙은 키에 대해 서명됩니다.

역할을 만듭니다:

$ vault write identity/oidc/role/oidc-role-1 ttl=12h key="oidc-key-1" client_id="consul-cluster-dc1" template='{"consul": {"hostname": "consul-client" } }'

Success! Data written to: identity/oidc/role/oidc-role-1

템플릿 template='{"consul": {"hostname": "consul-client" } }'은 Consul 인증 서버가 요청을 검증할 추가 JWT 메타데이터를 만듭니다.

정책은 Vault에서 특정 경로와 작업에 대한 접근을 부여하거나 금지하는 선언적 방법입니다. 이 예시에서 정책 파일은 identity/oidc/token/oidc-role-1 경로에서 토큰을 읽는 단일 권한을 부여합니다.

policy.json:

{
    "path": {
      "identity/oidc/token/oidc-role-1": {
        "policy": "read"
      }
    }
}

정책을 만듭니다:

$ vault policy write oidc-policy policy.json

Success! Uploaded policy: oidc-policy

서명된 JSON 웹 토큰(JWT)을 생성합니다:

$ vault read identity/oidc/token/oidc-role-1

Key          Value
---          -----
client_id    consul-cluster-dc1
token        eyJhbG...dIpQ
ttl          12h

token의 값을 클립보드에 복사합니다.

Secint (generic): Consul 클라이언트의 auto_config 요청을 검증하는 데 필요한 JSON 웹 토큰(JWT)은 인증서 키 쌍에서 생성됩니다. 이 예시에서 secint는 JWT용 인증서 키 쌍을 생성합니다.

secint init를 사용해 고유한 인증서 키 쌍을 생성합니다:

$ ./secint init

새로 생성된 secint-pub-key.pem 인증서의 내용을 검사합니다:

-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEFlUd7FoWSPtRl5maa58XDDjiFplN
Bxtai41Hq8rnyfQxirYQoLKHKakuZAGpn3PwYewEbYrB+b1f7/P6DzWBRg==
-----END PUBLIC KEY-----

Consul 구성의 jwt_validation_pub_keys 속성은 한 줄 인증서를 요구하므로 secint-pub-key.pem의 섹션을 구성에 붙여넣을 때 줄 이스케이프 \n을 추가해야 합니다. 다음 예시에서는 구성에 세 개의 줄 이스케이프 \n 인스턴스가 있습니다.

consul_server.json:

{
  ##...
    "auto_config": {
        "authorization": {
            ##...
            "static": {
                "jwt_validation_pub_keys": ["-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEFlUd7FoWSPtRl5maa58XDDjiFplNBxtai41Hq8rnyfQxirYQoLKHKakuZAGpn3PwYewEbYrB+b1f7/P6DzWBRg==\n-----END PUBLIC KEY-----\n"],
                ##...
            }
        }
    },
  ##...
}

jwt_validation_pub_keys 속성은 secint로 생성한 공개 키의 내용을 포함합니다. 이 공개 키는 Consul 클라이언트가 보낸 JSON 웹 토큰(JWT)을 검증해 모든 들어오는 클라이언트 auto_config 요청을 검증합니다.

다음으로 Consul 클라이언트 auto_join 요청에 대한 JSON 웹 토큰(JWT)을 생성합니다.

다음 속성과 함께 secint mint를 사용해 고유한 JWT를 생성합니다:

$ ./secint mint -issuer secint -ttl 12h -node consul-client -priv-key secint-priv-key.pem -audience consul-cluster-dc1

eyJhbG...NVXQ

이 출력에서 토큰 내용을 클립보드에 복사합니다.

JWT로 Consul 클라이언트 에이전트 구성 (Configure Consul client agent with the JWT)

클립보드의 토큰 값을 Consul 클라이언트 컨테이너의 /consul/config/tokens/jwt 파일에 붙여넣고 변경 사항을 저장합니다.

eyJhbG...dIpQ

Consul 클라이언트 에이전트를 다시 시작합니다.

이제 향후 gossip 암호화 키, TLS 인증서 및 기타 보안 설정 변경 사항이 Consul 클라이언트 에이전트에 자동으로 배포됩니다.

다음 단계 (Next steps)

이 튜토리얼에서는 Docker Compose를 사용해 안전한 로컬 컨테이너화된 Consul 데이터센터를 배포하고 구성하는 방법을 배웠습니다. auto_config를 사용해 데이터센터 전체에 보안 속성을 보내는 방법, 그리고 데이터센터 전체에 모든 향후 gossip 암호화 키, TLS 인증서 및 기타 보안 설정 변경 사항을 자동으로 배포함으로써 auto_config가 추가하는 가치를 배웠습니다. 마지막으로 환경을 정리하는 방법을 배웠습니다.

Deployment guide를 완료해 프로덕션에서 Consul 데이터센터를 배포하는 방법을 계속 학습할 수 있습니다. 이 컬렉션에는 Access Control Lists, 암호화, DNS 구성 및 데이터센터 페더레이션으로 데이터센터를 보호하는 방법이 포함됩니다.

또한 다음 튜토리얼을 탐색해 Consul 기술을 확장할 수 있습니다:

Consul 및 Vault의 공식 Docker 이미지에 대한 추가 참조 문서는 다음 웹사이트를 참조하세요:

더 알아보기 (Learn more)