본문 바로가기
WIKI 기술 지식 베이스

관리형 인증

원문 보기 위키 갱신

관리형 인증 (Managed Authentication)으로 연결하기

이 가이드는 Database Monitoring을 구성했다고 가정해요.

출처: 문서

본문

Datadog Database Monitoring (DBM)을 사용하면 데이터베이스 호스트에서 실행되는 실행 계획과 쿼리 샘플을 볼 수 있어요. 이 가이드는 IAM 같은 클라우드 관리형 인증 기능을 사용해 에이전트를 데이터베이스에 연결하는 방법을 보여줘요. 이렇게 하면 더 안전한 인증 방식이 제공되고, 에이전트 호스트 전반에서 데이터베이스 자격 증명을 관리해야 하는 부담이 줄어들어요.

시작하기 전에

지원되는 데이터베이스: Postgres, MySQL, SQL Server

지원되는 인증 유형과 Agent 버전:

인증 유형 Agent 버전 Postgres MySQL SQL Server
IAM
7.46 yes
7.67 yes
Microsoft Entra ID Managed Identity
7.48 yes yes

IAM 인증 구성하기

AWS는 RDS와 Aurora 데이터베이스에 대한 IAM 인증을 지원해요. Datadog Agent 버전 7.57부터 RDS와 Aurora 데이터베이스에 대한 크로스-계정(cross-account) IAM 인증이 지원돼요. IAM을 사용해 연결하도록 에이전트를 구성하려면 데이터베이스와 Datadog Agent의 설정을 완료하는 단계를 따르세요.

데이터베이스에 IAM 인증 활성화하기

  1. RDS 또는 Aurora 인스턴스에서 IAM 인증을 켜세요.
  2. DB 인증을 위한 IAM 정책을 만들어요. IAM 정책 문서에서 <YOUR_IAM_AUTH_DB_USER>를 로컬 데이터베이스 사용자로 교체하세요:

RDS

{
   "Version": "2012-10-17",
   "Statement": [
       {
           "Effect": "Allow",
           "Action": [
               "rds-db:connect"
           ],
           "Resource": [
               "arn:aws:rds-db:REGION:ACCOUNT:dbuser:db-<RESOURCE_ID>/<YOUR_IAM_AUTH_DB_USER>"
           ]
       }
   ]
}

예를 들어 datadog 사용자를 사용하려면 다음 리소스 ARN을 사용하세요:

{
   "Version": "2012-10-17",
   "Statement": [
       {
           "Effect": "Allow",
           "Action": [
               "rds-db:connect"
           ],
           "Resource": [
               "arn:aws:rds-db:REGION:ACCOUNT:dbuser:db-<RESOURCE_ID>/datadog"
           ]
       }
   ]
}

Aurora

{
   "Version": "2012-10-17",
   "Statement": [
       {
           "Effect": "Allow",
           "Action": [
               "rds-db:connect"
           ],
           "Resource": [
               "arn:aws:rds-db:REGION:ACCOUNT:dbuser:cluster-<RESOURCE_ID>/<YOUR_IAM_AUTH_DB_USER>"
           ]
       }
   ]
}

예를 들어 datadog 사용자를 사용하려면 다음 리소스 ARN을 사용하세요:

{
   "Version": "2012-10-17",
   "Statement": [
       {
           "Effect": "Allow",
           "Action": [
               "rds-db:connect"
           ],
           "Resource": [
               "arn:aws:rds-db:REGION:ACCOUNT:dbuser:cluster-<RESOURCE_ID>/datadog"
           ]
       }
   ]
}

AWS는 리소스 지정에 와일드카드도 지원해요. 예를 들어 datadog 사용자가 계정의 모든 인스턴스에 걸쳐 인증할 수 있게 하려면 다음을 추가하세요:

  "Resource": [
    "arn:aws:rds-db:*:ACCOUNT:dbuser:cluster-*/datadog",
    "arn:aws:rds-db:*:ACCOUNT:dbuser:db-*/datadog"
  ],

데이터베이스 인스턴스에 루트 사용자로 로그인하고 IAM 인증 역할(role)을 만드세요:

Postgres

CREATE USER <YOUR_IAM_ROLE> WITH LOGIN;
GRANT rds_iam TO <YOUR_IAM_ROLE>;

예를 들어 datadog 사용자의 경우 다음을 실행하세요:

CREATE USER datadog WITH LOGIN;
GRANT rds_iam TO datadog;

MySQL

CREATE USER <YOUR_IAM_ROLE> IDENTIFIED WITH AWSAuthenticationPlugin AS 'RDS';
ALTER USER <YOUR_IAM_ROLE>@'%' REQUIRE SSL;

예를 들어 datadog 사용자의 경우 다음을 실행하세요:

CREATE USER 'datadog' IDENTIFIED WITH AWSAuthenticationPlugin AS 'RDS';
ALTER USER 'datadog'@'%' REQUIRE SSL;

참고: 이 사용자는 비밀번호 없이 만들어진 새 사용자여야 해요. 그렇지 않으면 IAM 인증이 실패해요.

RDS (Postgres, MySQL) 또는 Aurora (Postgres, MySQL) 인스턴스에 대한 Agent 설정 단계를 완료하세요.

RDS 인스턴스와 같은 AWS 계정의 Agent 호스트에 IAM 인증 활성화하기

EC2

  1. IAM 역할을 만들고 DB 인증을 위해 만든 IAM 정책을 역할에 연결하세요.
# Create an IAM role for EC2 instance
# Replace `<YOUR_IAM_AUTH_DB_ROLE>` with the name of the IAM role
aws iam create-role --role-name <YOUR_IAM_AUTH_DB_ROLE> --assume-role-policy-document '{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "ec2.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}'

# Attach the IAM policy to the IAM role
# Replace `<YOUR_IAM_AUTH_DB_POLICY_ARN>` with the ARN of the IAM policy from step 2
aws iam attach-role-policy --role-name <YOUR_IAM_AUTH_DB_ROLE> --policy-arn <YOUR_IAM_AUTH_DB_POLICY_ARN>

IAM 역할을 에이전트가 실행되는 EC2 인스턴스에 연결하세요. 자세한 내용은 Amazon EC2용 IAM 역할을 참고하세요.

ECS Fargate

  1. IAM 역할을 만들고 DB 인증을 위해 만든 IAM 정책을 역할에 연결하세요.
# Create an IAM role for ECS task
# Replace `<YOUR_IAM_AUTH_DB_ROLE>` with the name of the IAM role
aws iam create-role --role-name <YOUR_IAM_AUTH_DB_ROLE> --assume-role-policy-document '{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "ecs-tasks.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}'

# Attach the IAM policy to the IAM role
# Replace `<YOUR_IAM_AUTH_DB_POLICY_ARN>` with the ARN of the IAM policy from step 2
aws iam attach-role-policy --role-name <YOUR_IAM_AUTH_DB_ROLE> --policy-arn <YOUR_IAM_AUTH_DB_POLICY_ARN>

ECS 작업 정의에서 IAM 역할을 에이전트 컨테이너가 정의된 작업 역할(task role)에 연결하세요. 자세한 내용은 Amazon ECS용 IAM 역할을 참고하세요.

EKS

  1. IAM 역할을 만들고 DB 인증을 위해 만든 IAM 정책을 역할에 연결하세요.
# Create an IAM OIDC provider for your cluster
# Replace `<YOUR_ESK_REGION>` and `<YOUR_ESK_CLUSTER>` with the region and name of your ESK cluster
$ eksctl utils associate-iam-oidc-provider \
  --region=<YOUR_ESK_REGION> \
  --cluster=<YOUR_ESK_CLUSTER> \
  --approve

# Create a service account
# Replace `<YOUR_IAM_AUTH_DB_POLICY_ARN>` with the ARN of the IAM policy from step 2
# Replace `<YOUR_IAM_AUTH_SERVICE_ACCOUNT>` and `<YOUR_IAM_AUTH_SERVICE_ACCOUNT_NAMESPACE>` with the name and namespace of the service account
$ eksctl create iamserviceaccount \
  --cluster <YOUR_ESK_CLUSTER> \
  --name <YOUR_IAM_AUTH_SERVICE_ACCOUNT> \
  --namespace <YOUR_IAM_AUTH_SERVICE_ACCOUNT_NAMESPACE> \
  --attach-policy-arn <YOUR_IAM_AUTH_DB_POLICY_ARN> \
  --override-existing-serviceaccounts \
  --approve

IAM 역할을 에이전트가 실행되는 Kubernetes 서비스 계정에 매핑하세요. 자세한 내용은 Amazon EKS 서비스 계정용 IAM 역할을 참고하세요.

Postgres 또는 MySQL 인스턴스 구성에 RDS 인스턴스의 region을 지정하는 aws 블록을 추가하고, managed_authentication.enabled를 true로 설정하세요:

instances:
  - host: example-endpoint.us-east-2.rds.amazonaws.com
    port: 5432
    username: datadog
    dbm: true
    aws:
      instance_endpoint: example-endpoint.us-east-2.rds.amazonaws.com
      region: us-east-2
      managed_authentication:
        enabled: true

RDS 인스턴스와 다른 AWS 계정의 Agent 호스트에 IAM 인증 활성화하기

참고: 크로스-계정 IAM 인증은 Agent 버전 7.57부터 지원됩니다.

EC2

  1. RDS 인스턴스가 위치한 계정에 IAM 역할을 만들고, 아래 예시를 사용해 DB 인증을 위해 만든 IAM 정책을 역할에 연결하세요.
    • <YOUR_IAM_AUTH_DB_ROLE>을 IAM 역할 이름으로 교체
    • <YOUR_AWS_ACCOUNT_FOR_AGENT>를 에이전트가 실행되는 AWS 계정 ID로 교체
    • <YOUR_AGENT_EC2_ROLE>을 에이전트가 실행되는 EC2 인스턴스의 IAM 역할로 교체
    • <YOUR_IAM_AUTH_DB_POLICY_ARN>을 DB 인증을 위해 만든 IAM 정책의 ARN으로 교체
aws iam create-role --role-name <YOUR_IAM_AUTH_DB_ROLE> --assume-role-policy-document '{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<YOUR_AWS_ACCOUNT_FOR_AGENT>:role/<YOUR_AGENT_EC2_ROLE>"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}'

aws iam attach-role-policy --role-name <YOUR_IAM_AUTH_DB_ROLE> --policy-arn <YOUR_IAM_AUTH_DB_POLICY_ARN>

에이전트가 실행되는 EC2 인스턴스의 IAM 역할 권한 정책을 수정해 이전 단계에서 만든 IAM 역할을 가정할(assume) 수 있도록 하세요.

  • <YOUR_AGENT_EC2_ROLE>을 에이전트가 실행되는 EC2 인스턴스의 IAM 역할로 교체
  • <YOUR_IAM_AUTH_DB_ROLE>을 DB 인증을 위해 만든 IAM 역할 이름으로 교체
  • <YOUR_AWS_ACCOUNT_FOR_DB>를 RDS 인스턴스가 위치한 AWS 계정 ID로 교체
aws iam update-assume-role-policy --role-name <YOUR_AGENT_EC2_ROLE> --policy-document '{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<YOUR_AWS_ACCOUNT_FOR_DB>:role/<YOUR_IAM_AUTH_DB_ROLE>"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}'

ECS Fargate

  1. RDS 인스턴스가 위치한 계정에 IAM 역할을 만들고, 아래 예시를 사용해 DB 인증을 위해 만든 IAM 정책을 역할에 연결하세요.
    • <YOUR_IAM_AUTH_DB_ROLE>을 DB 인증을 위해 만든 IAM 역할 이름으로 교체
    • <YOUR_AWS_ACCOUNT_FOR_AGENT>를 에이전트가 실행되는 AWS 계정 ID로 교체
    • <YOUR_AGENT_ECS_ROLE>을 에이전트가 실행되는 ECS 작업의 IAM 역할로 교체
    • <YOUR_IAM_AUTH_DB_POLICY_ARN>을 DB 인증을 위해 만든 IAM 정책의 ARN으로 교체
aws iam create-role --role-name <YOUR_IAM_AUTH_DB_ROLE> --assume-role-policy-document '{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<YOUR_AWS_ACCOUNT_FOR_AGENT>:role/<YOUR_AGENT_ECS_ROLE>"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}'

aws iam attach-role-policy --role-name <YOUR_IAM_AUTH_DB_ROLE> --policy-arn <YOUR_IAM_AUTH_DB_POLICY_ARN>

에이전트가 실행되는 ECS 작업의 IAM 역할 권한 정책을 수정해 에이전트가 이전 단계에서 만든 IAM 역할을 가정할 수 있도록 하세요.

  • <YOUR_AGENT_ECS_ROLE>을 에이전트가 실행되는 ECS 작업의 IAM 역할로 교체
  • <YOUR_IAM_AUTH_DB_ROLE>을 IAM 역할 이름으로 교체
  • <YOUR_AWS_ACCOUNT_FOR_DB>를 RDS 인스턴스가 위치한 AWS 계정 ID로 교체
aws iam update-assume-role-policy --role-name <YOUR_AGENT_ECS_ROLE> --policy-document '{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<YOUR_AWS_ACCOUNT_FOR_DB>:role/<YOUR_IAM_AUTH_DB_ROLE>"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}'

EKS

  1. RDS 인스턴스가 위치한 계정에 IAM 역할을 만들고, 아래 예시를 사용해 DB 인증을 위해 만든 IAM 정책을 역할에 연결하세요.
    • <YOUR_IAM_AUTH_DB_ROLE>을 IAM 역할 이름으로 교체
    • <YOUR_AWS_ACCOUNT_FOR_AGENT>를 에이전트가 실행되는 AWS 계정 ID로 교체
    • <YOUR_AGENT_EKS_ROLE>을 에이전트가 실행되는 EKS 파드에서 사용할 IAM 역할로 교체
    • <YOUR_IAM_AUTH_DB_POLICY_ARN>을 DB 인증을 위해 만든 IAM 정책의 ARN으로 교체
aws iam create-role --role-name <YOUR_IAM_AUTH_DB_ROLE> --assume-role-policy-document '{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<YOUR_AWS_ACCOUNT_FOR_AGENT>:role/<YOUR_AGENT_EKS_ROLE>"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}'

aws iam attach-role-policy --role-name <YOUR_IAM_AUTH_DB_ROLE> --policy-arn <YOUR_IAM_AUTH_DB_POLICY_ARN>

에이전트가 실행되는 EKS 서비스 계정의 IAM 역할을 수정해 이전 단계에서 만든 IAM 역할을 가정할 수 있도록 하세요.

  • <YOUR_AGENT_EKS_ROLE>을 에이전트가 사용하는 EKS 서비스 계정 IAM 역할로 교체
  • <YOUR_IAM_AUTH_DB_ROLE>을 IAM 역할 이름으로 교체
  • <YOUR_AWS_ACCOUNT_FOR_DB>를 RDS 인스턴스가 위치한 AWS 계정 ID로 교체
aws iam update-assume-role-policy --role-name <YOUR_AGENT_EKS_ROLE> --policy-document '{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<YOUR_AWS_ACCOUNT_FOR_DB>:role/<YOUR_IAM_AUTH_DB_ROLE>"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}'

아래 예시를 사용해 클러스터용 IAM OIDC 프로바이더와 에이전트용 서비스 계정을 만드세요.

  • <YOUR_EKS_REGION>과 <YOUR_EKS_CLUSTER>를 EKS 클러스터의 리전과 이름으로 교체
  • <YOUR_IAM_AUTH_DB_POLICY_ARN>을 DB 인증을 위해 만든 IAM 정책의 ARN으로 교체
  • <YOUR_IAM_AUTH_SERVICE_ACCOUNT>와 <YOUR_IAM_AUTH_SERVICE_ACCOUNT_NAMESPACE>를 서비스 계정의 이름과 네임스페이스로 교체
  • <YOUR_AGENT_EKS_ROLE>을 에이전트가 실행되는 EKS 파드에서 사용할 IAM 역할로 교체
$ eksctl utils associate-iam-oidc-provider \
  --region <YOUR_EKS_REGION> \
  --cluster <YOUR_EKS_CLUSTER> \
  --approve

$ eksctl create iamserviceaccount \
  --cluster <YOUR_EKS_CLUSTER> \
  --name <YOUR_IAM_AUTH_SERVICE_ACCOUNT> \
  --namespace <YOUR_IAM_AUTH_SERVICE_ACCOUNT_NAMESPACE> \
  --role-name arn:aws:iam::<YOUR_AWS_ACCOUNT_FOR_AGENT>:role/<YOUR_AGENT_EKS_ROLE> \
  --override-existing-serviceaccounts \
  --approve

아래와 같이 aws 블록으로 Postgres 또는 MySQL 인스턴스 구성을 업데이트하세요:

  • RDS 인스턴스의 region 지정
  • managed_authentication.enabled를 true로 설정
  • <YOUR_AWS_ACCOUNT_FOR_DB>를 RDS 인스턴스가 위치한 AWS 계정 ID로, <YOUR_IAM_AUTH_DB_ROLE>을 1단계에서 만든 IAM 역할 이름으로 교체해 역할 ARN 지정
instances:
  - host: example-endpoint.us-east-2.rds.amazonaws.com
    port: 5432
    username: datadog
    dbm: true
    aws:
      instance_endpoint: example-endpoint.us-east-2.rds.amazonaws.com
      region: us-east-2
      managed_authentication:
        enabled: true
        role_arn: arn:aws:iam::<YOUR_AWS_ACCOUNT_FOR_DB>:role/<YOUR_IAM_AUTH_DB_ROLE>

Microsoft Entra ID 관리형 ID 인증 구성하기

Azure는 Microsoft Entra ID(이전의 Azure Active Directory)에 접근할 수 있는 모든 리소스에 대해 관리형 ID 인증을 구성할 수 있게 해줘요. Datadog Agent는 클라우드 데이터베이스에 대한 사용자 할당(user-assigned) 관리형 ID 인증을 지원해요.

PostgreSQL에 연결하기

PostgreSQL Flexible 또는 Single Server 인스턴스에 대한 인증을 구성하려면 다음을 수행하세요:

  1. Azure 포털에서 관리형 ID를 만들고, 에이전트가 배포된 Azure Virtual Machine에 할당하세요.
  2. PostgreSQL 인스턴스에서 Microsoft Entra ID 관리자 사용자를 구성하세요.
  3. Microsoft Entra ID 관리자 사용자로 PostgreSQL 인스턴스에 연결하고 다음 명령을 실행하세요:
select * from pgaadauth_create_principal('<IDENTITY_NAME>', false, false);

Azure에 대한 일반적인 Agent 설정 단계를 진행하세요. 예를 들어:

모든 데이터베이스에 다음 스키마를 만드세요:

CREATE SCHEMA datadog;
GRANT USAGE ON SCHEMA datadog TO "<IDENTITY_NAME>";
GRANT USAGE ON SCHEMA public TO "<IDENTITY_NAME>";
GRANT pg_monitor TO datadog;

에이전트가 실행 계획을 수집할 수 있도록 모든 데이터베이스에 다음 함수를 만드세요.

CREATE OR REPLACE FUNCTION datadog.explain_statement(
   l_query TEXT,
   OUT explain JSON
)
RETURNS SETOF JSON AS
$$
DECLARE
curs REFCURSOR;
plan JSON;

BEGIN
   SET TRANSACTION READ ONLY;

   OPEN curs FOR EXECUTE pg_catalog.concat('EXPLAIN (FORMAT JSON) ', l_query);
   FETCH curs INTO plan;
   CLOSE curs;
   RETURN QUERY SELECT plan;
END;
$$
LANGUAGE 'plpgsql'
RETURNS NULL ON NULL INPUT
SECURITY DEFINER;

CLIENT_ID가 관리형 ID의 클라이언트 ID인 azure.managed_authentication YAML 블록으로 인스턴스 구성을 구성하세요:

instances:
  - host: example-flex-server.postgres.database.azure.com
    dbm: true
    username: "<IDENTITY_NAME>"
    ssl: "require"
    azure:
      deployment_type: flexible_server
      fully_qualified_domain_name: example-flex-server.postgres.database.azure.com
      managed_authentication:
        enabled: true
        client_id: "<CLIENT_ID>"
        # Optionally set the scope from where to request the identity token
        identity_scope: "https://ossrdbms-aad.database.windows.net/.default"

SQL Server에 연결하기

Azure SQL DB 또는 Azure Managed Instance에 대한 인증을 구성하려면 다음을 수행하세요:

  1. Azure 포털에서 관리형 ID를 만들고, 에이전트가 배포된 Azure Virtual Machine에 할당하세요.
  2. SQL Server 인스턴스에서 Microsoft Entra ID 관리자 사용자를 구성하세요.
  3. Microsoft Entra ID 관리자 사용자로 SQL Server 인스턴스에 연결하고 master 데이터베이스에서 다음 명령을 실행하세요:
CREATE LOGIN <MANAGED_IDENTITY_NAME> FROM EXTERNAL PROVIDER;

Azure에 대한 일반적인 Agent 설정 단계를 진행하세요. 예를 들어 Azure Managed Instance의 경우:

CREATE USER <MANAGED_IDENTITY_NAME> FOR LOGIN <MANAGED_IDENTITY_NAME>;
GRANT CONNECT ANY DATABASE to <MANAGED_IDENTITY_NAME>;
GRANT VIEW SERVER STATE to <MANAGED_IDENTITY_NAME>;
GRANT VIEW ANY DEFINITION to <MANAGED_IDENTITY_NAME>;
GO

Azure SQL DB를 사용한다면 master 데이터베이스에서 다음을 실행하세요:

CREATE LOGIN <MANAGED_IDENTITY_NAME> FROM EXTERNAL PROVIDER;
CREATE USER datadog FOR LOGIN <MANAGED_IDENTITY_NAME>;
ALTER SERVER ROLE ##MS_ServerStateReader## ADD MEMBER <MANAGED_IDENTITY_NAME>;
ALTER SERVER ROLE ##MS_DefinitionReader## ADD MEMBER <MANAGED_IDENTITY_NAME>;

그런 다음 모든 데이터베이스에 사용자를 만드세요:

CREATE USER <MANAGED_IDENTITY_NAME> FOR LOGIN <MANAGED_IDENTITY_NAME>;

managed_identity 구성 블록으로 인스턴스 구성을 업데이트하세요:

참고: 이 기능을 사용하려면 SQL Server용 ODBC Driver 17 이상이 필요해요.

instances:
 - host: "example.cfcc2366ab90.database.windows.net,1433"
   connector: "odbc"
   driver: "{ODBC Driver 18 for SQL Server}"
   dbm: true
   connection_string: "TrustServerCertificate=no;Encrypt=yes;"
   managed_identity:
     client_id: "<CLIENT_ID>"
   azure:
     deployment_type: managed_instance
     fully_qualified_domain_name: example.cfcc2366ab90.database.windows.net

더 알아보기 (Learn more)