내장 인증 기관으로 TLS 암호화 활성화

내장 인증 기관으로 TLS 암호화 활성화 (Enable TLS encryption with built-in certificate authority)

Consul 에이전트 통신을 보호하기 위해 TLS 암호화를 활성화하는 방법을 설명해요. Consul은 TLS를 사용해 서버와 클라이언트의 진위를 검증할 수 있어요.

출처: 문서

본문

이 페이지는 Consul 에이전트 통신을 보호하기 위해 TLS 암호화를 활성화하는 방법을 설명합니다. Consul은 서버와 클라이언트의 진위를 검증하기 위해 TLS를 사용하는 것을 지원합니다. TLS를 활성화하려면 Consul은 모든 서버가 단일 인증 기관(CA)이 서명한 인증서를 가져야 합니다. 클라이언트도 동일한 CA로 인증된 인증서를 가져야 합니다.

이 페이지는 새 Consul 데이터센터에 대해 TLS 암호화를 활성화하는 지침을 제공합니다. 기존 Consul 데이터센터에 TLS 암호화를 추가한다면 기존 데이터센터에 대한 TLS 암호화 활성화(Enable TLS encryption for existing datacenters)를 참조하세요.

워크플로 (Workflow)

다음 단계는 새 Consul 데이터센터에 대해 TLS 암호화를 활성화하는 일반적인 워크플로를 설명합니다.

  • 내장 CA 초기화
  • 서버 인증서 만들기
  • 서버 인증서 배포
  • 클라이언트 인증서 배포
  • Consul 시작

내장 CA 초기화 (Initialize the built-in CA)

Consul에 TLS를 구성하려면 인증서를 생성해야 합니다. 무단 데이터센터 액세스를 방지하려면 Consul은 모든 인증서가 동일한 CA로 서명되어야 합니다. 이 CA로 서명된 모든 인증서가 Consul과 통신할 수 있으므로 프라이빗 CA를 사용하세요.

Vault PKI 시크릿 백엔드와 같이 자체 CA를 관리하는 많은 도구가 있습니다. 이 페이지의 단계에서 사용되는 Consul의 내장 TLS 도우미로 CA를 만듭니다. 데이터센터에 대해 하나의 CA를 만들어야 합니다. CA를 만드는 데 사용한 것과 동일한 노드 또는 워크스테이션에서 모든 인증서를 생성해야 합니다. 이 노드 또는 워크스테이션은 안정적이어야 하며, 가급적 Consul 에이전트나 클라우드 서버가 아닌 것이 좋습니다.

CA와 인증서를 만드세요.

$ consul tls ca create
==> Saved consul-agent-ca.pem
==> Saved consul-agent-ca-key.pem

이 명령은 두 개의 파일을 생성합니다.

  • CA 인증서인 consul-agent-ca.pem은 Consul 인증서를 검증하는 데 필요한 공용 키를 포함하므로 Consul 에이전트를 실행하는 모든 노드에 배포해야 합니다.
  • CA 키인 consul-agent-ca-key.pem은 Consul 노드에 대한 인증서를 서명하는 데 사용되며 비밀로 유지해야 합니다. 이 키를 소유하면 누구든지 Consul을 신뢰할 수 있는 서버로 실행하거나 데이터센터에 대한 새 유효한 인증서를 생성하고 ACL 토큰을 포함한 모든 Consul 데이터에 액세스할 수 있습니다.

서버 인증서 만들기 (Create the server certificates)

데이터센터와 도메인에 대한 서버 인증서를 만드세요. 다음 예시는 기본값 dc1과 consul을 사용합니다.

CA를 만든 동일한 노드에서 각 서버에 대한 개별 인증서가 생길 때까지 이 프로세스를 반복하세요. consul tls cert create 명령은 인증서와 키 번호를 자동으로 증가시키므로 반복해서 사용할 수 있습니다. 인증서를 서버에 배포하세요.

다음 예시는 dc1이라는 단일 Consul 데이터센터에 대한 서버 인증서를 만듭니다.

$ consul tls cert create -server -dc dc1
==> WARNING: Server Certificates grants authority to become a
    server and access all state in the cluster including root keys
    and all ACL tokens. Do not distribute them to production hosts
    that are not server nodes. Store them as securely as CA keys.
==> Using consul-agent-ca.pem and consul-agent-ca-key.pem
==> Saved dc1-server-consul-0.pem
==> Saved dc1-server-consul-0-key.pem

페더레이션된 Consul 환경에는 서버 인증서에 페더레이션 환경 내의 모든 Consul 데이터센터의 이름이 포함되어야 합니다.

-additional-dnsname 플래그를 사용해 Subject Alternative Name에 추가 DNS 이름을 제공할 수 있습니다. localhost는 항상 포함됩니다. 이 플래그는 여러 번 사용할 수 있습니다.

다음 예시는 두 개의 Consul 데이터센터를 포함하는 페더레이션 환경에 대한 서버 인증서를 만듭니다.

$ consul tls cert create -server -dc dc1 -additional-dnsname="*.dc2.consul"
==> WARNING: Server Certificates grants authority to become a
    server and access all state in the cluster including root keys
    and all ACL tokens. Do not distribute them to production hosts
    that are not server nodes. Store them as securely as CA keys.
==> Using consul-agent-ca.pem and consul-agent-ca-key.pem
==> Saved dc1-server-consul-0.pem
==> Saved dc1-server-consul-0-key.pem

TLS 인증서 생성 옵션에 대해 자세히 알아보려면 consul tls cert CLI 문서를 참조하세요.

Consul 서버를 인증하려면 일반 이름(Common Name)과 Subject Alternative Name에 server.dc1.consul을 포함하는 인증서를 서버에 제공해야 합니다. verify_server_hostname을 활성화하면 그러한 인증서를 제공하는 에이전트만 서버로 부팅할 수 있습니다. verify_server_hostname = true가 없으면 공격자가 Consul 클라이언트 에이전트를 손상시키고 에이전트를 서버로 다시 시작해 데이터센터의 모든 데이터에 액세스할 수 있습니다. 이러한 서버 인증서는 특별하며 서버에만 프로비저닝해야 합니다.

참고 CA 키와 같은 서버 키는 비밀로 유지해야 합니다. 서버 키는 사실상 모든 Consul 데이터에 대한 액세스를 허용합니다.

서버 인증서 배포 (Distribute the server certificates)

서버 인증서를 생성한 후 Consul 서버에 배포하고 디스크 상 위치를 에이전트 구성 파일에 넣어야 합니다.

다음 파일을 Consul 서버에 복사해야 합니다.

  • consul-agent-ca.pem : CA 공용 인증서.
  • dc1-server-consul-0.pem : dc1 데이터센터용 Consul 서버 노드 공용 인증서.
  • dc1-server-consul-0-key.pem : dc1 데이터센터용 Consul 서버 노드 프라이빗 키.

모든 서버가 이 세 개의 파일을 가질 때까지 이 프로세스를 반복하세요.

클라이언트 인증서 배포 (Distribute client certificate)

클라이언트 인증서를 배포하는 두 가지 방법이 있습니다.

  • 자동 암호화(auto-encryption) 방법. 운영자의 클라이언트 인증서 생성 및 배포 단계를 간소화하므로 자동 암호화 방법을 권장합니다. 이 방법은 Connect CA를 사용해 클라이언트 인증서를 생성하며, 이는 모든 Consul 클라이언트에 자동으로 배포됩니다.
  • 운영자(operator) 방법. 타사 CA를 사용해야 하거나 인증서 관리에 대해 더 세분화된 제어가 필요할 때 이 방법을 사용하세요.

서버 구성 (Configure the servers)

자동 암호화로 클라이언트 인증서를 배포하려면 auto_encrypt 기능을 활성화하세요. 다음 예시 구성은 인증서 파일을 설정하고 auto-encrypt를 활성화합니다.

Consul은 구성 디렉터리의 모든 파일을 로드하므로 다음 구성을 새 파일로 추가할 수 있습니다. 기존 구성 파일에 추가할 수도 있습니다. consul validate를 사용해 구문이 유효한지 확인하세요.

서버 에이전트 자동 암호화 TLS 구성

verify_incoming = true
verify_outgoing = true
verify_server_hostname = true
ca_file = "consul-agent-ca.pem"
cert_file = "dc1-server-consul-0.pem"
key_file = "dc1-server-consul-0-key.pem"
auto_encrypt {
  allow_tls = true
}
{
  "verify_incoming": true,
  "verify_outgoing": true,
  "verify_server_hostname": true,
  "ca_file": "consul-agent-ca.pem",
  "cert_file": "dc1-server-consul-0.pem",
  "key_file": "dc1-server-consul-0-key.pem",
  "auto_encrypt": {
    "allow_tls": true
  }
}

verify 설정 외에도 allow_tls를 활성화해야 합니다. verify 설정은 서버와 클라이언트 간의 모든 통신이 검증되도록 보장합니다. auto_encrypt가 활성화되면 verify_outgoing이 기본적으로 활성화됩니다.

Consul 서버에 대한 에이전트 TLS 구성과 복사된 인증서 파일을 포함해 다음 옵션으로 서버를 구성하세요.

클라이언트 에이전트 수동 TLS 구성

verify_incoming = true
verify_outgoing = true
verify_server_hostname = true
ca_file = "consul-agent-ca.pem"
cert_file = "dc1-server-consul-0.pem"
key_file = "dc1-server-consul-0-key.pem"
{
  "verify_incoming": true,
  "verify_outgoing": true,
  "verify_server_hostname": true,
  "ca_file": "consul-agent-ca.pem",
  "cert_file": "dc1-server-consul-0.pem",
  "key_file": "dc1-server-consul-0-key.pem"
}

Consul은 verify_outgoing과 verify_server_hostname으로 서버의 진위를 검증하기 위해 TLS를 사용합니다. verify_incoming을 사용할 때 TLS를 사용해 클라이언트 인증서를 선택적으로 검증할 수도 있습니다.

클라이언트 구성 (Configure the clients)

자동 암호화를 사용하면 Consul 서버가 클라이언트에 인증서를 자동으로 배포하도록 구성할 수 있습니다. 이 기능을 사용하려면 클라이언트가 서버에서 인증서를 자동으로 가져오도록 구성하세요.

이 방법은 인증서를 메모리에 저장하지만 지속되지 않습니다.

클라이언트를 다음 옵션으로 구성하세요.

클라이언트 에이전트 자동 암호화 TLS 구성

verify_incoming = false
verify_outgoing = true
verify_server_hostname = true
ca_file = "consul-agent-ca.pem"
auto_encrypt = {
  tls = true
}
{
  "verify_incoming": false,
  "verify_outgoing": true,
  "verify_server_hostname": true,
  "ca_file": "consul-agent-ca.pem",
  "auto_encrypt": {
    "tls": true
  }
}

클라이언트 통신을 암호화하려면 각 클라이언트에 CA 인증서, 클라이언트 인증서 및 해당 프라이빗 키를 배포하세요.

먼저 클라이언트 인증서를 생성하세요. CA와 서버 인증서를 만든 노드에서 클라이언트 인증서를 생성합니다.

$ consul tls cert create -client
==> Using consul-agent-ca.pem and consul-agent-ca-key.pem
==> Saved dc1-client-consul-0.pem
==> Saved dc1-client-consul-0-key.pem

클라이언트 인증서도 CA로 서명해야 합니다. 그러나 CA에는 특수한 Subject Alternative Name이 없으므로 verify_server_hostname이 활성화된 경우 서버를 시작할 수 없습니다.

이제 클라이언트 인증서를 만들었으니 새로 생성된 클라이언트 인증서로 클라이언트 에이전트를 구성하세요.

verify_incoming = true
verify_outgoing = true
verify_server_hostname = true
ca_file = "consul-agent-ca.pem"
cert_file = "dc1-client-consul-0.pem"
key_file = "dc1-client-consul-0-key.pem"
{
  "verify_incoming": true,
  "verify_outgoing": true,
  "verify_server_hostname": true,
  "ca_file": "consul-agent-ca.pem",
  "cert_file": "dc1-client-consul-0.pem",
  "key_file": "dc1-client-consul-0-key.pem"
}

Consul 시작 (Start Consul)

이제 서버와 클라이언트를 구성했으니 Consul을 시작할 수 있습니다.

$ systemctl start consul

더 알아보기 (Learn more)