Atlas 권한 부여 및 인증에 대한 지침
인증은 사용자의 신원을 확인하는 프로세스 입니다. Atlas 액세스 결정하기 위해 모든 사용자에게 자신을 인증하도록 요구합니다.
인증과 권한 부여는 밀접하게 연결되어 있지만, 인증은 권한 부여와 구별됩니다.
인증은 사용자의 신원을 확인합니다.
Atlas는 기존 ID 시스템과 원활하게 통합되는 강력한 인증 메커니즘을 제공하여 강력한 ID 연합을 통해 UI, 데이터베이스 및 API에 안전하게 액세스할 수 있도록 합니다. MongoDB Atlas 클러스터에 대한 액세스를 관리하려면 인증을 구성할 수 있습니다.
권한 부여는 리소스 및 작업에 대한 확인된 사용자의 액세스를 결정합니다.
Atlas는 Atlas에 대한 액세스를 관리하기 위해 역할 기반 액세스 제어(RBAC)를 제공합니다. 사용자에게는 데이터베이스 리소스 및 작업에 대한 사용자의 액세스를 결정하는 역할이 하나 이상 할당되어야 합니다. 역할이 할당되지 않은 사용자는 시스템에 액세스할 수 없습니다.
Atlas 인증 기능
MongoDB Atlas 강력한 보안을 보장하기 위해 다양한 인증 방법을 지원합니다.
사용자 Atlas 인증의 권장사항은 OIDC(OpenID Connect) 또는 SAML 2.0을 통한 연합 인증을 사용하여 Atlas와 자격 증명 공급자를 원활하게 통합하고, 다중요소인증(MFA)으로 보안을 강화하여 현대적인 인증 및 보안 태세를 보장하는 것입니다.
워크로드 인증을 위해 Atlas는 OAuth2.0을 지원합니다. 권한 부여 서비스와의 원활한 호환성 및 페더레이션된 자격 증명 공급자에 통합할 수 있습니다.
Atlas 에서는 모든 사용자가 인증을 받아야 Atlas UI, Atlas 데이터베이스 및 Atlas 관리 API 액세스 . 각 Atlas 리소스 에 대한 다음 인증 방법은 인증 안전하고 적응할 수 있도록 보장합니다. Atlas 다음과 같은 인증 메커니즘을 제공합니다.
Atlas 인증에 대한 권장 사항
Atlas UI 인증
Atlas UI 액세스 에는 페더레이션 인증 권장합니다. 페더레이션 인증 구성하려면 Atlas 자격 증명 생성하거나 Google 또는 Github 로 로그인 해야 합니다.
Atlas 자격 증명 의 경우, 생체 인식과 같은 피싱 방지 MFA와 함께 강력한 비밀번호를 사용하는 것이 좋습니다. 계정 잠금을 방지하려면 세컨더리 MFA 요소를 설정하다 하는 것이 좋습니다. Atlas 자격 증명 에 대한 MFA 액세스 보장하려면 조직 설정에서 MFA 시행을 켜세요. 도메인에 대한 페더레이션을 설정하다 한 후에는 페더레이션 인증 중단된 긴급 Break-Glass 시나리오에서만 Atlas 자격 증명 사용하여 인증해야 합니다.
연합 인증
페더레이션 인증을 통해 중앙 자격 증명 공급자를 사용하여 여러 시스템 및 애플리케이션에서 Atlas UI에 대한 모든 인증을 관리할 수 있습니다. UI 액세스를 위해 Atlas는 SAML 2.0을 사용하여 직원 ID 페더레이션을 Atlas 지원합니다. Okta, Microsoft Entra ID 또는 Ping Identity와 같은 SAML 호환 자격 증명 공급자를 사용하여 비밀번호 복잡성, 자격 증명 순환, MFA와 같은 보안 정책을 자격 증명 공급자 내에서 시행할 수 있습니다.
사용자 및 애플리케이션 서버를 포함하는 IP 범위의 연결만 허용하도록 Atlas UI 에서 IP 액세스 목록 구성해야 합니다.
자세한 내용은 연합 인증 구성을 참조하세요.
다단계 인증
Atlas 컨트롤 플레인에 액세스 할 수 있는 모든 인간 사용자의 경우 보안 강화를 위해 MFA 를 요구하는 것이 좋습니다. MFA 가 활성화되면 Atlas 두 가지 형태의 식별이 필요합니다.
사용자의 자격 증명
다음 권장 요인 중 하나입니다.
보안 키
생체 인식
OTP 인증자
푸시 알림
SMS( 프라이머리 요소로 권장되지 않음)
이메일(기본 요소로 권장되지 않음)
자세한 내용은 다중 인증 옵션 관리하기 항목을 참조하세요.
Atlas 데이터베이스 인증
Atlas 다양한 데이터베이스 인증 메커니즘을 지원합니다.
MongoDB Shell 및 Compass 와 같은 도구를 통해 Atlas 데이터베이스 에 대한 워크포스(휴먼 사용자) 액세스 구성하려면 OIDC와함께 Workforce Identity Federation을 사용합니다.
MongoDB 드라이버를 사용하여 Atlas 데이터베이스에 대한 워크로드(애플리케이션) 액세스를 구성하려면 워크로드 아이덴티티 페더레이션, AWS-IAM 인증 또는 X.509 인증서 인증을 사용하세요. SCRAM 인증은 개발 또는 테스트 환경에서만 사용하는 것이 좋습니다.
Atlas는 다음도 지원합니다:
JIT(Just-In-Time) 데이터베이스액세스 가진 임시 데이터베이스 사용자 생성
Workforce Identity Federation
Workforce Identity Federation을 사용하면 ID 제공자 통해 Atlas 데이터베이스 에 대한 모든 인증 관리 할 수 있습니다. 데이터베이스 액세스 의 경우, Okta, Microsoft Entra ID 또는 Ping Identity와 같은 OIDC호환 ID 제공자를 사용하여 ID 제공자 내에서 비밀번호 복잡성, 자격 증명 순환, MFA와 같은 보안 정책을 시행하다 좋습니다.
자세한 내용은 OIDC로 Workforce Identity Federation 설정을 참조하세요.
Workload Identity Federation 및 Amazon Web Services IAM 역할 인증
워크로드 ID 페더레이션은 Azure 및 Google Cloud와 같은 클라우드 환경에서 실행되는 애플리케이션이 별도의 데이터베이스 사용자 자격 증명을 관리할 필요 없이 Atlas에 인증할 수 있도록 합니다. Workload Identity Federation을 통해 Azure 관리 ID, Google 서비스 계정 또는 OAuth 2.0호환 서비스를 사용하여 Atlas 데이터베이스 사용자를 관리할 수 있습니다. 이러한 인증 메커니즘은 Atlas 데이터베이스에 암호 없는 접근을 허용하여 관리가 간편해지고 보안이 강화됩니다.
프로덕션 환경에서 실행되는 모든 워크로드 애플리케이션에 Workload Identity Federation을 사용하는 것이 좋습니다. 반드시 필요한 비상 상황 외에는 사용자의 연결을 허용하지 않아야 합니다.
Amazon Web Services IAM 역할을 통해 인증할 수도 있습니다.
자세한 내용은 다음을 참조하세요.
X.509 클라이언트 인증서 및 SCRAM
보안 및 모든 Atlas 제어 및 데이터 평면에 대한 액세스를 쉽게 하려면 자격 증명 공급자를 통해 Workforce 또는 Workload Identity Federation을 사용하는 것이 좋습니다.
페더레이션용 자격 증명 공급자가 없는 경우 Atlas 클러스터는 사용자 인증을 위한 X.509 클라이언트 인증서도 지원합니다. X.509 인증서는 상호 TLS의 보안을 제공하여 스테이징 및 프로덕션 환경에 적합하며, X.509와 함께 사용할 자체 인증 기관을 가져올 수도 있습니다. X.509의 단점은 애플리케이션 측에서 인증서와 그 보안을 관리해야 한다는 점입니다. 반면 Workload Identity Federation을 사용하면 암호 없는 액세스가 가능하고 애플리케이션 보안이 더 간편해집니다.
Atlas 클러스터는 사용자 인증을 위해 SCRAM 비밀번호 인증을 지원하지만, 개발 및 테스트 환경에서만 SCRAM을 사용하는 것을 권장합니다.
X.509 또는 SCRAM 인증을 사용하는 경우, HashiCorp Vault 와 같은 타사 비밀 관리자를 사용하여 복잡한 데이터베이스 자격 증명을 생성하고 저장하는 것이 좋습니다. 또는 AWS Secrets 관리자를 사용할 수 있습니다.
자세한 내용을 알아보려면 다음 매뉴얼 페이지를 참조하세요.
적시 액세스
Atlas는 미리 정의된 시간이 지나면 자동으로 만료되는 임시 데이터베이스 사용자 생성을 지원합니다. 사용자는 다음 기간 동안 생성할 수 있습니다:
6시간
1일
1주
자세한 내용은 데이터베이스 사용자 구성을 참조하세요.
비밀 관리
복잡한 데이터베이스 자격 증명 생성하고 저장 하려면 HashiCorp Vault 또는 Amazon Web Services Secrets 관리자 와 같은 타사 시크릿 관리자를 사용하는 것이 좋습니다. 시크릿 관리자는 Atlas 데이터베이스에 대해 구성된 역할을 기반으로 데이터베이스 자격 증명 동적으로 생성할 수 있습니다.
자세한 내용은 MongoDB Atlas 데이터베이스 비밀을 HashiCorp Vault에서 관리하는 방법에 대한 블로그를 참조하세요.
Atlas 관리 API 인증
Atlas는 Atlas Administration API에 인증할 수 있는 두 가지 방법을 제공합니다.
API 키
서비스 계정
서비스 계정은 업계 표준 OAuth 를2.0 사용하여 Atlas Administration API 통해 Atlas 에 안전하게 인증합니다. 서비스 계정은 단기 액세스 토큰과 필수 자격 증명 로테이션을 통해 추가 보안을 제공하므로 가능하면 API 키 대신 서비스 계정을 사용하는 것이 좋습니다.
Atlas UI 또는 Atlas 관리 API 통해서만 서비스 계정에 대한 프로그래밍 방식의 액세스 관리 할 수 있습니다. Atlas CLI 또는 Terraform을 통해 서비스 계정에 대한 프로그래밍 방식의 액세스 관리 할 수 없습니다.
자세한 내용은 서비스 계정 개요를 참조하세요.
API 키
서비스 계정을 사용하지 않는 경우 API 키 기반 인증 사용하여 프로그래밍 방식 액세스 안전하게 관리 수 있습니다. API 키 기반 인증 HTTP 다이제스트 인증 사용하여 요청을 보호합니다. API 공개 키는 사용자 이름 역할을 하고 해당 비공개 키는 비밀번호 역할을 합니다. 이러한 키를 Amazon Web Services Secrets 관리자 또는 HashiCorp Vault와 같은 타사 비밀 관리 시스템에 저장 해야 합니다. 이러한 키를 Vault에 안전하게 저장 방법을 학습 HashiCorp Vault에서 MongoDB Atlas 데이터베이스 비밀 관리 블로그 참조하세요.
보안을 더욱 강화하고 무단 액세스의 위험을 최소화하려면:
정기적으로 API 키를 교체하는 권장사항을 따르세요. 예를 들어 HashiCorp Vault를 사용하여 이러한 키를 회전하는 방법을 학습하려면 Hashicorp 문서를 참조하세요.
API 키에 IP 액세스 목록을 사용합니다. 자세한 내용은 Atlas 관리 API에 대한 IP 액세스 목록 요구를 참조하세요.
자세한 내용은 Atlas 관리 API 인증을 참조하세요.
배포
인증과 관련된 배포에 대한 권장 사항을 알아보려면 Atlas 조직, 프로젝트 및 클러스터에 대한 지침을 참조하세요.
Atlas 권한 부여에 대한 권장 사항
모든 리소스에 대한 액세스 효과적으로 관리 하려면 Atlas의 강력한 역할 기반 액세스 제어(RBAC)를 구현 해야 합니다. Atlas 에는 Atlas 컨트롤 플레인을 관리하는 데 일반적으로 필요한 다양한 수준의 액세스 제공하는 내장 역할이 포함되어 있습니다. 데이터 영역에서 Atlas cluster에 연결하려면 데이터베이스 세분화된 사용자 지정 역할을 사용하여 역할 이 기능을 수행하는 데 필요한 데이터 액세스 에 대한 액세스 기반으로 세분화된 범위를 제공하는 것이 좋습니다. 이 접근 방식을 사용하면 최소 권한 원칙을 따를 수 있습니다.
또한, Atlas를 연합 자격 증명 공급자와 통합하면 자격 증명 공급자 그룹을 Atlas 역할에 매핑하여 프로비저닝을 사용할 수 있습니다. 이 기능은 액세스 관리를 간소화하고 플랫폼 전반에 걸쳐 안전하고 체계적인 역할 할당을 지원합니다. 오케스트레이션 계층의 프로비저닝 프로세스를 기반으로 프로그래밍 방식으로 액세스 권한을 부여할 수 있습니다.
일반적으로 보안 및 결정론적 결과에 대해 테스트된 스크립트가 있는 프로그래밍 방식 서비스 계정으로만 상위 환경에 대한 액세스 항상 제한하는 것이 가장 좋습니다. 개발 및 테스트 중에는 하위 환경에서만 사람의 액세스 허용해야 합니다.
Atlas UI 및 Atlas 관리 API(제어 평면) 권한 부여
사용자, 서비스 계정, API 키를 사전 정의된 역할에 할당하여 Atlas 조직, 프로젝트 또는 둘 다 내에서 수행할 수 있는 작업을 지정할 수 있습니다. Identity Federation을 사용하면 그룹-역할 매핑을 통해 ID 제공자 그룹을 Atlas 역할에 연결하여 액세스 관리 .
Azure Entra ID, Okta 또는 Ping Identity와 같은 SAML을 지원하는 최신 연합 자격 증명 공급자(IdP)를 사용하는 것이 좋습니다. 이렇게 하면 권한 부여 프로세스가 더 안전해지고, Atlas 역할에 IdP 그룹을 프로그래밍 방식으로 할당하는 데 필요한 유연성을 지원합니다. 회사의 도메인을 제한하여 권한이 없는 사용자가 Atlas에 로그인하지 못하도록 해야 합니다. 이를 위해 페더레이션 인증을 위한 도메인 매핑 관리 절차를 따르십시오. 여기에서 자격 증명 공급자 그룹을 Atlas 역할에 매핑하는 것을 권장합니다. 자세한 내용은 역할 매핑 프로세스를 참조하십시오.
단일 청구 조직과 각 BU 또는 부서에 연결된 조직으로 구성된 표준 Atlas 계층 구조를 따랐다면, 조직 사용자를 운영 또는 플랫폼 팀 관리자에게로 제한해야 합니다. 대조적으로, 애플리케이션을 구축하는 개발팀이나 제품팀에 프로젝트 역할을 할당해야 합니다. 상위 환경에서는 프로그래밍 방식의 접근만 허용되어야 합니다. 가장 일반적으로 사용되는 역할에 대한 다음 권장 사항은 일반적인 지침으로 제공될 수 있습니다.
Organization Owner
역할은 조직 전체 설정을 변경하고 구성을 삭제할 수 있는 기능이 있으므로 엄격하게 제한해야 하며 사람에게 할당해서는 안 됩니다. 이 역할은 조직을 처음 설정하고 구성할 때만 사용하는 서비스 계정에 할당해야 합니다. 초기 생성 후 구성 변경을 최소화하십시오. 계정 잠금을 방지하기 위해 다음 항목을 생성할 수 있습니다.JIT(Just-in-Time) 액세스 권한이 있는SAML 조직 소유자 그룹 .
조직 소유자 역할 있는 API 키입니다. Break-Glass 긴급 시나리오에 대비한 강력한 액세스 관리 통해 안전한 장소에 보관하세요.
Organization Member
역할은 조직의 설정 및 구성을 볼 수 있는 운영 및 플랫폼 팀의 관리자에게 할당되어야 합니다.Organization Project Creator
역할 개발 및 제품 팀을 위한 새 애플리케이션을 대신하여 프로젝트를 만드는 데 사용되는 프로그래매틱 서비스 계정이어야 합니다.Organization Billing Admin
역할 Billing API 에서 프로그래밍 방식으로 청구서를 가져와서 재무 운영 도구에 제공하는 데 사용되는 프로그래밍 방식 서비스 계정이어야 합니다. 이 동일한 서비스 계정은 사용 보고 담당하는 모든 연결된 조직에 액세스 할 수 있어야 합니다.Project Owner
역할 운영 및 프로비저닝 팀 에서 시행하는 거버넌스 에 사용해야 합니다. 이 역할 클러스터를 만들고 삭제 기능 있는 프로그래매틱 서비스 계정에 할당하세요. 샌드박스 환경의 경우 사용자에게Project Owner
액세스 부여하여 오케스트레이션 배포서버 파이프라인 거치지 않고도 코드 및 사용 사례 테스트를 위한 클러스터를 빠르게 프로비저닝할 활성화 할 수 있습니다.하위 환경에서는 개발 팀이 개발 및 테스트 중에 클러스터의 쿼리 및 성능 지표에 액세스할 수 있도록
Project Data Access Admin
역할을 부여합니다. 이 액세스를 통해 데이터 탐색기에서 데이터 문제를 디버깅할 수 있습니다. 프로덕션 환경에서 이 역할을 허용하지 마십시오. 클러스터에서 데이터베이스, 컬렉션, 인덱스를 생성 및 제거하는 것을 포함하여 데이터를 보고 편집하는 기능이 있어 신속한 실험과 개발에 유용합니다. 개발 환경에서 개발 팀에게 이 수준의 액세스 권한을 부여하는 것이 불편한 경우Project Data Access Read Only
역할을 사용하여 클러스터의 데이터 및 성능 통계에 대한 읽기 전용 액세스 권한을 부여할 수 있습니다.프로덕션 환경에서 클러스터의 데이터에 읽기 전용 액세스를 부여하려면
Project Observability Viewer
역할을 사용합니다.
자세한 내용은 Atlas 사용자 역할을 참조하세요.
데이터베이스 권한 부여
직원 및 워크로드 사용자에게는 특정 프로젝트나 개별 클러스터에 맞춘 권한을 가진 세분화된 데이터베이스 역할(사전 정의 또는 사용자 지정)을 할당할 수 있습니다. 스테이징 및 프로덕션 환경에서는 Identity Federation을 사용하는 것이 좋습니다. 이를 통해 자격 증명 공급자(IdP)를 Atlas에 연동하여 데이터 액세스를 위한 인증 및 권한 부여 과정을 보다 현대적이고 효율적으로 관리할 수 있습니다.
IdP에서 Group Membership을 구성하면 그룹을 데이터베이스 사용자에 매핑하여 IdP 내에서 액세스 제어를 간소화할 수 있습니다. 그러나 워크로드 ID의 경우 groups
대신 users
클레임을 사용하여 역할을 직접 할당하는 것이 좋습니다. 개발 및 테스트 환경에서는 사전 정의된 readWriteAny
역할 기본값 으로 사용하여 개발 및 테스트 프로세스 간소화할 수 있습니다. 애플리케이션 상위 환경으로 이동할 때는 최소 권한 원칙에 따라 애플리케이션 서버 갖는 액세스 제한하는 사용자 지정 역할 빌드 해야 합니다.
자세한 내용은 다음을 참조하세요.
자동화 예제: Atlas 인증 및 권한 부여
GitHub에서 모든 영역에 걸쳐 스테이징/프로덕션 권장 사항을 적용하는 Terraform 예시를 확인하세요.
다음 예시에서는 자동화 위해 Atlas 도구를 사용하여 인증 및 사용자 지정 역할을 구성합니다.
지정된 클러스터에 대한 사용자 인증을 생성하려면 IAM 자격 증명을 사용해 다음 명령을 실행하세요.
atlas dbusers create \ --projectId "6698000acf48197e089e4085" \ --username "MyRoleARN" \ --awsIAMType "ROLE" \ --role "clusterMonitor" \ --scope "myCluster"
다음 명령을 실행하여 SCRAM 인증 사용하여 임시 사용자를 생성합니다.
atlas dbusers create \ --projectId 6698000acf48197e089e4085 \ --username "tempUser" \ --password "securePassword" \ --role "readWrite" \ --scope "myCluster" \ --deleteAfter "2025-02-01T12:00:00Z"
다음 명령을 실행하여 OIDC를 사용하여 Workforce Identity Federation을 구성합니다.
atlas federatedAuthentication federationSettings identityProvider create oidc Azure \ --audience "https://management.azure.com/" \ --authorizationType "USER" \ --desc "oidc-for-azure" \ --federationSettingsId "5d1113b25a115342acc2d1aa" \ --groupsClaim "groups" \ --idpType "WORKFORCE" \ --issuerUri "https://sts.windows.net/" \ --userClaim "sub"
다음 예시는 인증 및 권한 부여를 구성하는 방법을 보여줍니다. Terraform으로 리소스를 생성하려면:
결제 조직을 생성하고 해당 결제 조직에 대한 API 키를 생성합니다. 터미널에서 다음 명령을 실행하여 API 키를 환경 변수로 저장하세요.
export MONGODB_ATLAS_PUBLIC_KEY="<insert your public key here>" export MONGODB_ATLAS_PRIVATE_KEY="<insert your private key here>"
공용 파일
각 예시 에 대해 다음 파일을 만들어야 합니다. 각 예시 에 대한 파일을 자체 디렉토리 에 배치합니다. 값을 사용하려면 ID와 이름을 변경합니다. 그런 다음 명령을 실행 Terraform을 초기화하고, Terraform 계획을 확인한 다음 변경 사항을 적용 .
azure.tf
locals { tags = { CreatedBy = "Terraform" Owner = var.owner Module = "tf-example-oidc-azure" Name = var.project_name } } resource "azurerm_resource_group" "this" { name = var.project_name location = var.location tags = local.tags } resource "azurerm_virtual_network" "this" { name = var.project_name address_space = ["10.0.0.0/16"] location = azurerm_resource_group.this.location resource_group_name = azurerm_resource_group.this.name tags = local.tags } resource "azurerm_subnet" "internal" { name = "internal" resource_group_name = azurerm_resource_group.this.name virtual_network_name = azurerm_virtual_network.this.name address_prefixes = ["10.0.2.0/24"] } resource "azurerm_public_ip" "vm-public-ip" { name = "public-ip-${var.project_name}" location = var.location resource_group_name = azurerm_resource_group.this.name allocation_method = "Dynamic" domain_name_label = var.project_name tags = local.tags } resource "azurerm_network_interface" "this" { name = "ip-${var.project_name}" location = var.location resource_group_name = azurerm_resource_group.this.name tags = local.tags ip_configuration { subnet_id = azurerm_subnet.internal.id name = "public" private_ip_address_allocation = "Dynamic" public_ip_address_id = azurerm_public_ip.vm-public-ip.id } } resource "azurerm_user_assigned_identity" "this" { location = var.location name = var.project_name resource_group_name = azurerm_resource_group.this.name tags = local.tags } resource "azurerm_linux_virtual_machine" "this" { name = var.project_name resource_group_name = azurerm_resource_group.this.name location = var.location size = "Standard_F2" admin_username = var.vm_admin_username custom_data = data.cloudinit_config.this.rendered network_interface_ids = [azurerm_network_interface.this.id] tags = local.tags admin_ssh_key { username = var.vm_admin_username public_key = var.ssh_public_key } source_image_reference { publisher = "Canonical" offer = "0001-com-ubuntu-server-jammy" sku = "22_04-lts" version = "latest" } os_disk { storage_account_type = "Standard_LRS" caching = "ReadWrite" disk_size_gb = 30 } identity { type = "UserAssigned" identity_ids = [azurerm_user_assigned_identity.this.id] } }
variables.tf
variable "user" { description = "MongoDB Atlas User" type = list(string) default = ["dbuser1", "dbuser2"] } variable "database_name" { description = "The Database in the cluster" type = list(string) } variable "org_id" { description = "MongoDB Organization ID" type = string } variable "project_id" { description = "MongoDB Atlas Project ID" type = string } variable "connection_strings" { description = "List of MongoDB connection strings to the cluster" type = list(string) } variable "token_audience" { description = "The token audience used by the OIDC identity provider" type = string default = "https://management.azure.com/" # Example audience } variable "trusted_domains" { description = "List of associated domains to trust" type = list(string) default = ["myOrg.com", "another-trusted-domain.org"] # Example domains }
terraform.tfvars
org_id = "32b6e34b3d91647abb20e7b8" project_id = "67212db237c5766221eb6ad9" user = ["testUser"] database_name = ["myTestDb"] connection_strings = ["mongodb+srv://cluster0.mongodb.net"] token_audience = "https://management.azure.com/" trusted_domains = ["myOrg.com", "example-domain.org"]
인증 예시
다음을 사용하여 사용자 이름 및 비밀번호 인증 통해 Atlas user 생성합니다.
main.tf
locals { test_user_password = random_password.password.result } Generates 12 characters long random password without special characters resource "random_password" "password" { length = 12 special = false } resource "mongodbatlas_database_user" "user1" { username = var.user[0] password = local.test_user_password project_id = var.project_id auth_database_name = "admin" scopes = var.clusters[0] roles { role_name = "readWriteAny" database_name = var.database_name[0] } } output "user1" { value = mongodbatlas_database_user.user1.username } output "userpwd" { value = mongodbatlas_database_user.user1.password sensitive = true }
다음 예제를 사용하여 Atlas에 OIDC 자격 증명 공급자를 설정하고, Azure 와 함께 사용한 후 OIDC 페더레이션 인증 사용자를 생성하세요. Azure Active Directory에서 발급한 OIDC 토큰을 사용하여 액세스를 허용합니다.
main.tf
# Connection string to use in this configuration locals { mongodb_uri = var.connection_strings[0] } # Fetch MongoDB Atlas Federated Settings data "mongodbatlas_federated_settings" "this" { org_id = var.org_id } # Configure an identity provider for federated authentication resource "mongodbatlas_federated_settings_identity_provider" "oidc" { federation_settings_id = data.mongodbatlas_federated_settings.this.id associated_domains = var.trusted_domains audience = var.token_audience authorization_type = "USER" description = "OIDC Identity Provider for Azure AD" # Replace with actual Azure Tenant ID issuer_uri = "https://sts.windows.net/${data.azurerm_client_config.current.tenant_id}/" idp_type = "WORKFORCE" name = "OIDC-for-azure" protocol = "OIDC" user_claim = "sub" # Claim to extract the user's principal identity } resource "mongodbatlas_federated_settings_org_config" "this" { federation_settings_id = data.mongodbatlas_federated_settings.this.id org_id = var.org_id domain_restriction_enabled = false domain_allow_list = [] data_access_identity_provider_ids = [mongodbatlas_federated_settings_identity_provider.oidc.idp_id] } # Create an OIDC-authenticated Database User resource "mongodbatlas_database_user" "oidc" { project_id = var.project_id username = "${mongodbatlas_federated_settings_identity_provider.oidc.idp_id}/${data.azurerm_client_config.current.client_id}" oidc_auth_type = "USER" auth_database_name = "$external" # Required when using OIDC for USER authentication roles { role_name = "atlasAdmin" database_name = "admin" } } # Azure-specific data source needed for Tenant ID and Client ID data "azurerm_client_config" "current" {}
outputs.tf
output "vm_fqdn" { value = azurerm_public_ip.vm-public-ip.fqdn description = "Fully Qualified Domain Name (FQDN) of the Virtual Machine (VM)" } output "ssh_connection_string" { value = "ssh ${var.vm_admin_username}@${azurerm_public_ip.vm-public-ip.fqdn}" description = "Useful for connecting to the instance" } output "user_test_conn_string" { value = "mongodb+srv://${var.user[0]}:<password>@${replace(local.mongodb_uri, "mongodb+srv://", "")}/?retryWrites=true" description = "Connection string for testing regular database user access" sensitive = true } output "user_oidc_conn_string" { value = "mongodb+srv://${mongodbatlas_database_user.oidc.username}:<OIDCToken>@${replace(local.mongodb_uri, "mongodb+srv://", "")}/?authMechanism=MONGODB-OIDC&retryWrites=true" description = "Connection string for OIDC-authenticated user" sensitive = true }
권한 부여 예제
다음을 사용하여 사용자에게 클러스터 에 대한 관리자 권한 및 클러스터 의 프로젝트에 대한 프로젝트 멤버 권한을 부여합니다.
main.tf
resource "mongodbatlas_database_user" "admin_user" { project_id = "6698000acf48197e089e4085" username = "adminUser" password = "securePassword" # Use a secure password auth_database_name = "admin" roles { role_name = "atlasAdmin" # Admin role for the cluster database_name = "admin" } roles { role_name = "readWriteAnyDatabase" # Project member rights database_name = "admin" } }
다음 명령을 실행하여 ID 제공자의 특정 그룹 에서 데이터베이스 사용자를 생성합니다. ID 제공자 Okta를 통해 사용자 인증 및 권한 부여 관리 할 수 있습니다. 이 명령은 또한 ID 제공자 그룹 의 사용자에게 Atlas cluster 에 대한 dbAdmin
및 readWrite
권한을 부여합니다.
atlas dbusers create \ --projectId "6698000acf48197e089e4085" \ --username "okta/my-idp-group" \ --role "readWrite,dbAdmin" \ --oidcType "IDP_GROUP"
다음 명령을 실행하여 페더레이션 설정에서 OIDC호환 ID 제공자를 생성합니다.
atlas federatedAuthentication federationSettings identityProvider create oidc IDPName \ --audience "api://12345678-1234-1234-1234-123456789abc" \ --authorizationType "GROUP" \ --clientId "abcdef12-3456-7890-abcd-ef1234567890" \ --desc "MyOIDCProvider test" \ --federationSettingsId "5d1113b25a115342acc2d1aa" \ --groupsClaim "groups" \ --idpType "WORKLOAD" \ --issuerUri "https://sts.windows.net/12345678-1234-1234-1234-123456789abc/" \ --userClaim "sub" \ --associatedDomain "example.com"
다음 예시는 인증 및 권한 부여를 구성하는 방법을 보여줍니다. Terraform으로 리소스를 생성하려면:
결제 조직을 생성하고 해당 결제 조직에 대한 API 키를 생성합니다. 터미널에서 다음 명령을 실행하여 API 키를 환경 변수로 저장하세요.
export MONGODB_ATLAS_PUBLIC_KEY="<insert your public key here>" export MONGODB_ATLAS_PRIVATE_KEY="<insert your private key here>"
공용 파일
각 예시 에 대해 다음 파일을 만들어야 합니다. 각 예시 에 대한 파일을 자체 디렉토리 에 배치합니다. 값을 사용하려면 ID와 이름을 변경합니다. 그런 다음 명령을 실행 Terraform을 초기화하고, Terraform 계획을 확인한 다음 변경 사항을 적용 .
azure.tf
locals { tags = { CreatedBy = "Terraform" Owner = var.owner Module = "tf-example-oidc-azure" Name = var.project_name } } resource "azurerm_resource_group" "this" { name = var.project_name location = var.location tags = local.tags } resource "azurerm_virtual_network" "this" { name = var.project_name address_space = ["10.0.0.0/16"] location = azurerm_resource_group.this.location resource_group_name = azurerm_resource_group.this.name tags = local.tags } resource "azurerm_subnet" "internal" { name = "internal" resource_group_name = azurerm_resource_group.this.name virtual_network_name = azurerm_virtual_network.this.name address_prefixes = ["10.0.2.0/24"] } resource "azurerm_public_ip" "vm-public-ip" { name = "public-ip-${var.project_name}" location = var.location resource_group_name = azurerm_resource_group.this.name allocation_method = "Dynamic" domain_name_label = var.project_name tags = local.tags } resource "azurerm_network_interface" "this" { name = "ip-${var.project_name}" location = var.location resource_group_name = azurerm_resource_group.this.name tags = local.tags ip_configuration { subnet_id = azurerm_subnet.internal.id name = "public" private_ip_address_allocation = "Dynamic" public_ip_address_id = azurerm_public_ip.vm-public-ip.id } } resource "azurerm_user_assigned_identity" "this" { location = var.location name = var.project_name resource_group_name = azurerm_resource_group.this.name tags = local.tags } resource "azurerm_linux_virtual_machine" "this" { name = var.project_name resource_group_name = azurerm_resource_group.this.name location = var.location size = "Standard_F2" admin_username = var.vm_admin_username custom_data = data.cloudinit_config.this.rendered network_interface_ids = [azurerm_network_interface.this.id] tags = local.tags admin_ssh_key { username = var.vm_admin_username public_key = var.ssh_public_key } source_image_reference { publisher = "Canonical" offer = "0001-com-ubuntu-server-jammy" sku = "22_04-lts" version = "latest" } os_disk { storage_account_type = "Standard_LRS" caching = "ReadWrite" disk_size_gb = 30 } identity { type = "UserAssigned" identity_ids = [azurerm_user_assigned_identity.this.id] } }
variables.tf
# Azure Variables variable "token_audience" { type = string default = "https://management.azure.com/" description = "Used as resource when getting the access token. See more in the [Azure documentation](https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/how-to-use-vm-token#get-a-token-using-http)" } # MongoDB Atlas variables variable "org_id" { type = string description = "MongoDB Atlas Organization ID" } variable "project_id" { type = string description = "MongoDB Atlas Project ID" } variable "project_name" { type = string description = "MongoDB Atlas Project Name" } variable "connection_strings" { type = list(string) description = "MongoDB Atlas Cluster Standard Connection Strings" }
terraform.tfvars
org_id = "32b6e34b3d91647abb20e7b8" project_id = "67212db237c5766221eb6ad9" project_name = "My Project" connection_strings = token_audience = "https://management.azure.com/"
outputs.tf
output "vm_fqdn" { value = azurerm_public_ip.vm-public-ip.fqdn description = "Fully Qualified Domain Name (FQDN) of the Virtual Machine (VM)" } output "ssh_connection_string" { value = "ssh ${var.vm_admin_username}@${azurerm_public_ip.vm-public-ip.fqdn}" description = "Useful for connecting to the instance" } output "user_test_conn_string" { value = "mongodb+srv://${local.test_user_username}:${local.test_user_password}@${replace(mongodbatlas_advanced_cluster.this.connection_strings[0].standard_srv, "mongodb+srv://", "")}/?retryWrites=true" sensitive = true description = "Useful for connecting to the database from Compass or other tool to validate data" } output "user_oidc_conn_string" { value = local.mongodb_oidc_uri sensitive = true description = "Useful to see the format of the OIDC connection string" }
ID 제공자에 대한 페더레이션 설정 구성
Atlas에서 OIDC 자격 증명 공급자를 설정하여 Azure와 함께 사용하려면 다음을 사용하세요. Azure Active Directory에서 발급한 OIDC 토큰을 사용하여 액세스할 수 있습니다.
# Connection string to use in this configuration locals { mongodb_uri = var.connection_strings[0] } # Atlas organization details to use in the configuration data "mongodbatlas_federated_settings" "this" { org_id = var.org_id name = var.project_name project_id = var.project_id } # Configure an identity provider for federated authentication resource "mongodbatlas_federated_settings_identity_provider" "oidc" { federation_settings_id = data.mongodbatlas_federated_settings.this.id audience = var.token_audience authorization_type = "USER" description = "oidc-for-azure" # e.g. "https://sts.windows.net/91405384-d71e-47f5-92dd-759e272cdc1c/" issuer_uri = "https://sts.windows.net/${azurerm_user_assigned_identity.this.tenant_id}/" idp_type = "WORKLOAD" name = "OIDC-for-azure" protocol = "OIDC" # groups_claim = null user_claim = "sub" } resource "mongodbatlas_federated_settings_org_config" "this" { federation_settings_id = data.mongodbatlas_federated_settings.this.id org_id = var.org_id domain_restriction_enabled = false domain_allow_list = [] data_access_identity_provider_ids = [mongodbatlas_federated_settings_identity_provider.oidc.idp_id] }
다음을 사용하여 OIDC 페더레이션 인증 사용자를 생성합니다.
resource "mongodbatlas_database_user" "oidc" { project_id = var.project_id username = "${mongodbatlas_federated_settings_identity_provider.oidc.idp_id}/${azurerm_user_assigned_identity.this.principal_id}" oidc_auth_type = "USER" auth_database_name = "$external" # required when using OIDC USER authentication roles { role_name = "atlasAdmin" database_name = "admin" } }
사용자 지정 역할 구성
다음을 사용하여 이름이 myDb
인 데이터베이스 의 모든 컬렉션 에 대해 업데이트, 추가 및 삭제 작업을 허용하는 my_custom_role
(이)라는 사용자 지정 역할 만듭니다.
resource "mongodbatlas_custom_db_role" "create_role" { project_id = var.project_id role_name = "my_custom_role" actions { action = "UPDATE" resources { database_name = "myDb" } } actions { action = "INSERT" resources { database_name = "myDb" } } actions { action = "REMOVE" resources { database_name = "myDb" } } }
특정 그룹에 Atlas 역할 할당된 Atlas 프로젝트의 예시는 예제를 참조하세요.