Docs 菜单
Docs 主页
/ /
Atlas 架构中心
/

Atlas 授权和身份验证指导

在此页面上

  • Atlas 身份验证的功能
  • Atlas 身份验证建议
  • Atlas UI 身份验证
  • Atlas 数据库身份验证
  • Atlas Administration API 身份验证
  • 部署
  • Atlas 授权的建议
  • Atlas UI 和 Atlas Administration API(控制平面)授权
  • 数据库授权
  • 自动化示例:Atlas 身份验证和授权

身份验证是验证用户身份的进程。Atlas要求所有用户验证自身身份,以确定其访问权限。

虽然身份验证和授权密切相关,但二者扔有区别:

  • 身份验证验证用户身份。

    Atlas 提供强大的身份验证机制,可与现有身份系统无缝集成,通过强大的身份联合验证功能,提供对用户界面、数据库和 API 的安全访问。您可以通过配置身份验证来管理对 MongoDB Atlas 集群的访问。

  • 授权确定经过验证的用户对资源和操作的访问权限。

    Atlas 提供基于角色的访问控制 (RBAC) 来管理对 Atlas 的访问。您必须向用户授予一个或多个角色,这些角色决定了该用户对数据库资源和操作的访问权限。在分配的角色之外,该用户无权访问系统。

MongoDB Atlas支持多种身份身份验证方法,确保稳健的安全性。

  • 用户身份验证的最佳实践是利用 Atlas 与身份提供程序的无缝集成,通过 OpenID Connect (OIDC) 或 SAML 2.0 进行联合身份验证,并通过多因素身份验证 (MFA) 增强安全性,确保现代化的身份验证和安全态势。

  • 对于工作负载身份验证,Atlas 支持 OAuth 2.0,允许与授权服务无缝兼容,并集成到联合身份提供程序 中。

Atlas要求所有用户进行身份验证才能访问权限Atlas用户界面、 Atlas数据库和Atlas Administration API。针对每个Atlas资源的以下身份验证方法可确保身份验证的安全性和适应性。Atlas提供以下身份验证机制:

我们建议对Atlas用户界面访问权限联合身份验证。要配置联合身份验证,您必须创建Atlas凭证或使用 Google 或Github登录。

对于Atlas凭证,我们建议您使用强密码并结合防网络钓鱼的MFA(例如生物识别技术)。我们强烈建议您设立从节点(secondary node from replica set)MFA因素,以避免帐户锁定。要确保Atlas凭证的MFA访问权限,请在“组织设置”中启用MFA强制。为域设立联合后,应仅在联合身份验证中断时的紧急打破玻璃场景中使用Atlas凭证进行身份验证。

联合身份验证允许您通过一个中央身份提供程序来跨多个系统和应用程序管理 Atlas 用户界面的所有身份验证。对于用户界面访问,Atlas 支持使用 SAML 2.0 进行员工身份联合验证。您可以使用任何 SAML 兼容的身份提供程序,例如 Okta、Microsoft Entra ID 或 Ping Identity,在您的身份提供程序中实施密码复杂性、凭据轮换和 MFA 等安全策略。

您必须在Atlas 用户界面中配置IP访问列表,仅允许来自包含您的用户和应用程序服务器的IP范围的连接。

要了解更多信息,请参阅 配置联合身份验证

对于有权访问权限Atlas控制平面的任何人类用户,我们建议您需要MFA以增强安全性。启用MFA后, Atlas需要两种形式的身份证明:

  • 用户的凭证

  • 以下推荐因素之一:

    • 安全密钥

    • 生物识别技术

    • OTP 身份验证器

    • 推送通知

    • 短信(不建议作为主节点 (primary node in the replica set)因素)

    • 电子邮件(不建议作为主要因素)

要了解更多信息,请参阅管理多因素身份验证选项

Atlas支持各种数据库身份验证机制。

要通过MongoDB Shell和Compass等工具配置员工(人类用户)对Atlas数据库的访问权限,请将 Workforce Identity FederationOIDC 结合使用。

要配置使用 MongoDB 驱动程序访问 Atlas 数据库的工作负载(应用程序),请使用 Workforce Identity Federation、AWS-IAM 身份验证或 X.509 证书身份验证。我们建议仅在开发或测试环境中使用 SCRAM 密码身份验证。

Atlas 还支持:

Workforce Identity Federation 允许您通过身份提供商管理Atlas数据库的所有身份验证。对于数据库访问权限,我们建议使用与 OIDC 兼容的身份提供者,例如 Okta、 Microsoft Entra ID 或 Ping Identity,以在身份提供商中实施安全策略,例如密码复杂性、档案轮换和 MFA

要了解更多信息,请参阅使用 OIDC 设置 Workforce Identity Federation。

工作负载身份联合验证使在 Azure 和 Google Cloud 等云环境中运行的应用程序能够通过 Atlas 进行身份验证,而无需管理单独的数据库用户凭证。借助 Workload Identity Federation,您可以使用 Azure Managed Identities、Google Service Accounts 或任何符合 OAuth 2.0 标准的服务来管理 Atlas 数据库用户。这些身份验证机制通过允许无密码访问 Atlas 数据库,简化了管理并增强了安全性。

我们建议所有在生产环境中运行的应用程序都使用 Workload Identity Federation。除非在最极端的破坏性紧急情况下,否则不应允许人类用户连接。

您还可以通过Amazon Web Services IAM 角色进行身份验证。

要了解更多信息,请查看以下内容:

出于安全性和便捷性考虑,我们建议您通过身份提供程序使用 Workforce 或 Workload Identity Federation 来访问 Atlas 控制和数据平面的所有功能。

如果您没有用于联合验证的 Atlas 身份提供程序,Atlas 集群还支持 X.509 客户端证书进行用户身份验证。X.509 证书提供双向 TLS 的安全性,使其适用于预发布和生产环境,您可以将自己的证书颁发机构用于 X.509。X.509 的缺点是您必须在应用程序端管理证书及其安全性,而 Workload Identity Federation 允许无密码访问,应用程序的安全性也更容易保证。

Atlas 集群还支持 SCRAM 密码身份验证用于用户身份验证,但我们建议仅在开发和测试环境中使用 SCRAM。

如果您利用 X 509 或 SCRAM 身份验证,我们建议您使用第三方机密管理器如 HashiCorp VaultAWS Secrets Manager 来生成和存储复杂的数据库凭证。

要了解更多信息,请参阅以下手册页:

Atlas 还支持创建临时数据库用户,这些用户会在预定义时间后自动过期。可以为以下时间段创建用户:

  • 6 小时

  • 1 天

  • 1 周

要了解更多信息,请参阅 配置数据库用户。

我们建议使用HashiCorp VaultAmazon Web Services Secrets 经理等第三方密钥管理器来生成和存储复杂的数据库凭证。密钥管理器可以根据为Atlas数据库配置的角色动态生成数据库凭证。

要了解更多信息,请参阅博客在 HashiCorp Vault 中管理 MongoDB Atlas 数据库密钥。

Atlas 提供了两种方式来进行 Atlas Administration API 的身份验证:

服务帐户使用行业标准 OAuth2.0 通过 Atlas Administration API 安全地与 Atlas 进行身份验证。我们建议您尽可能使用服务帐户而不是 API 密钥,因为服务帐户通过使用短期访问令牌和必要的凭证轮换来提高安全性。

服务帐户作为预览功能提供,您只能使用Atlas用户界面或Atlas Administration API管理服务帐户的访问权限。您无法通过Atlas CLI或 Terraform管理服务帐户的编程访问权限。

要了解更多信息,请参阅服务帐户概述

如果您不使用服务帐户,则可以使用基于API密钥的身份验证来安全地管理编程访问权限。基于API密钥的身份验证使用HTTP摘要式身份身份验证来保护请求。API公钥作为用户名,对应的私钥作为密码。您应将这些密钥存储在第三方密钥管理系统中,例如Amazon Web Services Secrets 经理或 HashiCorp Vault。要学习;了解如何将这些密钥安全地存储在 Vault 中,请参阅博客“在 HashiCorp Vault 中管理MongoDB Atlas数据库密钥”。

为了进一步增强安全性并将未经授权访问的风险降至最低:

要了解更多信息,请参阅 Atlas Administration API 身份验证。

要了解与身份验证相关的部署建议,请参阅 Atlas 组织、项目和集群指导。

您必须实现Atlas 强大的基于角色的访问控制 (RBAC),才能有效管理对所有资源的访问权限。Atlas包含内置角色,这些角色提供管理Atlas控制平面通常所需的不同访问权限级别。为了连接到数据平面中的Atlas集群,我们建议使用数据库细粒度自定义角色,根据角色访问权限其功能所需的数据访问来提供细粒度的范围界定。这种方法使您能够遵循最小权限原则原则。

此外,将 Atlas 与联合身份提供程序集成,您可以通过将身份提供程序群组映射到 Atlas 角色来使用即时预配。这样可以简化访问管理,确保整个平台的角色分配安全有序。您可以根据编排层的预配过程以编程方式授予访问权限。

一般来说,最佳实践是始终将对上层环境的访问权限限制为仅具有经过安全性和确定性结果测试的脚本的编程服务帐户。在开发和测试期间,只应在较低环境中允许人类访问权限。

您可以将用户、服务帐户和API密钥分配给预定义的角色,指定他们可以在Atlas组织、项目或两者中执行的操作。使用 Identity Federation,通过群组-角色映射将身份提供商群组链接到Atlas角色,从而管理访问权限。

我们建议您使用现代联合身份提供程序 (IdP),该程序为 SSO 提供 SAML,如 Azure Entra ID、Okta 或 Ping Identity ,因为这会使授权过程更加安全,并支持以编程方式将身份提供程序群组分配给 Atlas 角色所需的灵活性。您应限制贵公司的域,防止用户在未获得授权的情况下登录 Atlas,具体步骤请遵循管理联合身份验证的域映射。在此,我们建议您将身份提供程序群组映射到 Atlas 角色,如角色映射过程所示。

如果您遵循单个计费组织的标准 Atlas 层次结构,每个业务单元或部门都有链接组织,则您应该将组织用户限制为运营或平台团队管理员。相反,您应该将项目角色分配给负责构建应用程序的开发或产品团队。上层环境仅允许编程访问。以下关于最常用角色的建议可以作为一般指南:

  • Organization Owner 角色应受到严格限制,不得分配给人类,因为它具有更改组织范围设置和删除配置的能力。此角色应分配给一个服务帐户,该帐户仅用于初始设置和配置组织。在初始创建后尽量减少配置更改。为了避免帐户锁定,您可以创建以下项目:

    • 具有 实时访问 权限的 SAML 组织所有者群组。

    • 具有“组织所有者”角色的API密钥。将其保存在具有强大访问权限管理的安全位置,以应对玻璃破碎的紧急情况。

  • Organization Member 角色应适用于操作和平台团队的管理员,他们能够查看组织的设置和配置。

  • Organization Project Creator角色应该是编程服务帐户,用于代表开发和产品团队的新应用程序创建项目。

  • Organization Billing Admin角色应该是一个编程服务帐号,用于以编程方式从 Billing API中提取发票并将其输入您的 FinOps 工具。该服务帐户应有权访问权限其负责报告使用情况的所有关联组织。

  • Project Owner角色应用于由操作和预配团队实施的管理。将此角色分配给编程服务帐户,因为它能力创建和删除集群。对于沙盒环境,您可以考虑授予用户 Project Owner 访问访问权限,启用他们能够快速预配集群以测试代码和使用案例,而无需通过编排部署管道。

  • 在低级环境中,使用 Project Data Access Admin 角色为构建应用程序的开发团队授予访问权限,以便他们在开发和测试期间访问集群的查询和性能指标。此访问权限允许他们使用数据浏览器调试数据问题。请勿在生产环境中允许此角色。该角色具备查看和编辑数据的能力,包括在集群上创建和删除数据库、集合和索引,这对于快速实验和开发非常有用。如果您不愿意在开发环境中为开发团队提供此级别的访问权限,则可以通过 Project Data Access Read Only 角色授予他们对集群数据和性能统计信息的只读访问权限。

    要在生产环境中授予对集群数据的只读访问权限,请使用 Project Observability Viewer 角色。

要了解更多信息,请参阅 Atlas 用户角色。

可为 Workforce 和工作负载用户分配预定义或自定义的细粒度数据库角色,并为特定项目或单个集群量身定制权限。在预发布和生产环境中,我们建议使用 Identity Federation 来简化访问管理,将身份提供程序 (IdP) 连接到 Atlas,以实现更现代化和简化的数据访问身份验证和授权流程。

通过在 IdP 中配置群组成员身份,您可以将群组映射到数据库用户,从而简化 IdP 中的访问权限控制。但是,对于工作负载身份,我们建议直接使用 users 声明而不是 groups 来分配角色。在开发和测试环境中,可以默认使用预定义的 readWriteAny角色,以简化开发和测试进程。将应用程序迁移到更高级别的环境时,应构建自定义角色,根据最小权限原则原则限制应用程序服务器的访问权限。

要了解更多信息,请查看以下内容:

请参阅 Terraform 示例,以在 Github 的一个位置跨所有支柱实施预发布/生产建议。

以下示例使用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>"
  • 安装 Terraform

您必须为每个示例创建以下文件。将每个示例的文件放在各自的目录中。更改 ID 和名称以使用您的值。然后运行命令以初始化 Terraform、查看 Terraform 计划并应用更改。

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]
}
}
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
}
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 用户。

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 令牌来允许访问。

# 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" {}
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
}

使用以下命令向用户授予集群的管理员权限以及集群中项目的项目成员权限。

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"
}
}

运行以下命令,从身份提供程序中的特定群组创建数据库用户。您可以通过身份提供商Okta管理用户身份验证和授权。该命令还会向身份提供商群组中的用户授予对Atlas 集群的 dbAdminreadWrite 特权。

atlas dbusers create \
--projectId "6698000acf48197e089e4085" \
--username "okta/my-idp-group" \
--role "readWrite,dbAdmin" \
--oidcType "IDP_GROUP"

运行以下命令,从联合设置中创建与OIDC兼容的身份提供商。

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>"
  • 安装 Terraform

您必须为每个示例创建以下文件。将每个示例的文件放在各自的目录中。更改 ID 和名称以使用您的值。然后运行命令以初始化 Terraform、查看 Terraform 计划并应用更改。

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]
}
}
# 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"
}
org_id = "32b6e34b3d91647abb20e7b8"
project_id = "67212db237c5766221eb6ad9"
project_name = "My Project"
connection_strings =
token_audience = "https://management.azure.com/"
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"
}

使用以下步骤在 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"
}
}

使用以下命令创建名为 my_custom_role 的自定义角色,该角色允许对名为 myDb 的数据库中的任何集合执行更新、添加和删除操作。

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项目的示例,请参阅示例。

后退

网络安全