Google 기반의 OpenTelemetry Collector 구성에서 보안 비밀 관리

수신자나 내보내기 도구와 같은 일부 구성요소를 구성하려면 비밀번호와 같은 보안 비밀을 제공해야 할 수 있습니다. 이러한 보안 비밀을 Collector 구성 파일에 일반 텍스트로 포함할 수 있습니다. 그러나 이러한 보안 비밀은 Collector에서 작성한 시스템 로그에 포함되어 Cloud Logging으로 전송되므로 Collector가 실행되는 노드 또는 가상 머신(VM) 외부에 보안 비밀이 노출됩니다.

Google에서 빌드한 Collector 버전 0.126.0부터 Secret Manager와 통합된 OpenTelemetry 제공자를 사용하여 구성 파일에서 일반 텍스트 보안 비밀을 삭제할 수 있습니다.

제공자는 수신자 및 프로세서 구성요소와 유사한 OpenTelemetry 구성 구성요소입니다. 각 제공자에는 유형이 있으며 각 유형의 제공자는 구성의 특정 식별자를 값에 매핑합니다.

googlesecretmanager 제공자는 Secret Manager 식별자를 Secret Manager에 저장한 비밀번호, 토큰, API 키와 같은 보안 비밀에 매핑합니다. googlesecretmanager 제공자를 사용하면 다음과 같은 이점이 있습니다.

  • 보안 강화: 구성 파일에 비밀번호와 같은 민감한 정보가 포함되지 않습니다. 실제 보안 비밀은 민감한 정보를 안전하게 저장, 액세스, 관리하기 위해 특별히 설계된 서비스인 Secret Manager에 저장됩니다.
  • 노출 위험 감소: Secret Manager는 Google에서 빌드한 OpenTelemetry Collector의 초기화 중에 보안 비밀을 가져오므로 일반 텍스트 보안 비밀이 실수로 로그에 기록되는 것을 방지합니다.

시작하기 전에

googlesecretmanager 제공자를 사용하려면 다음 단계에 설명된 대로 Secret Manager API를 사용 설정하고 API에 대한 액세스를 허용해야 합니다.

  1. After installing the Google Cloud CLI, initialize it by running the following command:

    gcloud init

    If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  2. Google Cloud CLI의 기본 프로젝트를 설정합니다.

    gcloud config set project PROJECT_ID
    

    이전 명령어를 실행하기 전에 PROJECT_ID 변수를 Google Cloud 프로젝트의 식별자로 바꿉니다.

  3. Enable the Secret Manager API:

    gcloud services enable secretmanager.googleapis.com
  4. Secret Manager에 필요한 범위인 https://www.googleapis.com/auth/cloud-platform을 포함하도록 인스턴스의 OAuth 액세스 범위를 업데이트합니다.
    gcloud compute instances set-service-account "INSTANCE_ID" \
      --service-account "SERVICE_ACCT_EMAIL" \
      --scopes "https://www.googleapis.com/auth/cloud-platform"
    

    위 명령어를 실행하기 전에 다음 변수를 교체합니다.

    • INSTANCE_ID: VM의 식별자입니다.
    • SERVICE_ACCT_EMAIL: VM과 연결된 서비스 계정의 주소입니다.

    자세한 내용은 Secret Manager API 액세스를 참조하세요.

  5. Google에서 빌드한 OpenTelemetry Collector 구성을 관리하는 사용자에게 보안 비밀을 만들고 관리하는 데 필요한 권한을 부여합니다. Identity and Access Management 역할 roles/secretManager.secretAdmin에는 다음과 같은 필수 권한이 포함되어 있습니다.
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="user:USER_EMAIL" \
      --role=roles/secretManager.secretAdmin
    

    위 명령어를 실행하기 전에 다음 변수를 교체합니다.

    • PROJECT_ID: Google Cloud 프로젝트의 식별자입니다.
    • USER_EMAIL: 역할이 부여된 사용자의 주소입니다.
  6. VM과 연결된 서비스 계정에 보안 비밀에 액세스하는 데 필요한 권한을 부여합니다. Identity and Access Management 역할 roles/secretManager.secretAccessor에는 다음과 같은 필수 권한이 포함되어 있습니다.
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:SERVICE_ACCT_EMAIL" \
      --role=roles/secretManager.secretAccessor
    

    위 명령어를 실행하기 전에 다음 변수를 교체합니다.

    • PROJECT_ID: Google Cloud 프로젝트의 식별자입니다.
    • SERVICE_ACCT_EMAIL: VM과 연결된 서비스 계정의 주소입니다.
  7. 일반 텍스트 보안 비밀을 관리형 보안 비밀로 대체

    Secret Manager 및 googlesecretmanager 제공자를 사용하여 구성 파일에서 일반 텍스트 보안 비밀 사용을 제거하려면 다음 단계를 따르세요.

    1. 구성 파일의 각 일반 텍스트 보안 비밀에 대해 Secret Manager에서 보안 비밀을 만듭니다.
    2. 구성 파일의 각 일반 텍스트 보안 비밀을 Secret Manager의 해당 보안 비밀에 대한 참조로 바꿉니다.

    예를 들어 http 내보내기 도구를 사용하는 경우 구성 파일에 다음과 같은 항목이 포함될 수 있습니다.

    exporters:
      logging:
        loglevel: debug
      http:
        endpoint: "https://example.com/api/metrics"
        headers:
          X-API-Key: plaintext-secret
    

    이 예에서는 plaintext-secret 문자열을 Secret Manager에 배치한 다음 일반 텍스트 보안 비밀을 관리형 보안 비밀 참조로 대체합니다.

    일반 텍스트 보안 비밀의 Secret Manager 보안 비밀 만들기

    일반 텍스트 보안 비밀 plaintext-secret이 포함된 Secret Manager 보안 비밀을 만들려면 다음 명령어를 실행합니다.
    echo -n "plaintext-secret" | gcloud secrets create SECRET_NAME \
        --replication-policy="automatic" \
        --data-file=-
    

    위 명령어를 실행하기 전에 다음 변수를 교체합니다.

    • plaintext-secret: 일반 텍스트 보안 비밀로 바꿉니다.
    • SECRET_NAME: 보안 비밀의 의미 있는 이름으로 바꿉니다.

    새 보안 비밀의 정규화된 리소스 이름은 VERSION1인 다음과 같은 형식입니다.

    projects/PROJECT_ID/secrets/SECRET_NAME/versions/VERSION

    Secret Manager에서 보안 비밀을 저장, 버전 관리, 액세스하는 방법에 관한 자세한 내용은 보안 비밀 만들기를 참고하세요.

    일반 텍스트 보안 비밀 교체

    구성 파일을 업데이트하려면 다음 예와 같이 각 일반 텍스트 보안 비밀을 googlesecretmanager 제공자 참조 및 관리형 보안 비밀의 리소스 이름으로 바꿉니다.

    exporters:
      logging:
        loglevel: debug
      http:
        endpoint: "https://example.com/api/metrics"
        headers:
          X-API-Key: ${googlesecretmanager:projects/PROJECT_ID/secrets/SECRET_NAME/versions/VERSION}
    

    자세히 알아보기

    googlesecretmanager 제공자 사용에 관한 자세한 내용은 opentelemetry-collector-contrib 저장소를 참고하세요.