Atlas 授权和身份验证指导
在此页面上
身份验证是验证用户身份的进程。Atlas要求所有用户验证自身身份,以确定其访问权限。
虽然身份验证和授权密切相关,但二者扔有区别:
身份验证验证用户身份。
Atlas提供强大的身份验证机制,可与现有身份系统无缝集成,通过强大的联合身份提供对用户用户界面、数据库和API 的安全访问权限。您可以通过配置身份验证管理对MongoDB Atlas集群的访问权限。
授权确定经过验证的用户对资源和操作的访问权限。
Atlas 提供基于角色的访问控制 (RBAC) 来管理对 Atlas 的访问。您必须向用户授予一个或多个角色,这些角色决定了该用户对数据库资源和操作的访问权限。在分配的角色之外,该用户无权访问系统。
Atlas 身份验证的功能
MongoDB Atlas支持多种身份身份验证方法,确保稳健的安全性。
用户身份验证的最佳实践是利用 Atlas 与身份提供程序的无缝集成,通过 OpenID Connect(OIDC)或 SAML 2.0进行联合身份验证,并通过多因素身份验证(MFA)增强安全性,以确保现代化的身份验证和安全态势。
对于工作负载身份验证, Atlas支持 OAuth2.0 ,从而可与授权服务无缝兼容并集成到联合IdP 中。
Atlas要求所有用户进行身份验证才能访问权限Atlas用户界面、 Atlas数据库和Atlas Administration API。针对每个Atlas资源的以下身份验证方法可确保身份验证的安全性和适应性。Atlas提供以下身份验证机制:
Atlas 身份验证建议
Atlas UI 身份验证
我们建议对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 数据库身份验证
Atlas支持各种数据库身份验证机制。
要通过MongoDB Shell和Compass等工具配置员工(人类用户)对Atlas数据库的访问权限,请将 Workforce Identity Federation 与 OIDC 结合使用。
要配置使用 MongoDB 驱动程序访问 Atlas 数据库的工作负载(应用程序),请使用工作负载身份联合、AWS-IAM 身份验证或 X.509 证书身份验证。我们建议仅在开发或测试环境中使用 SCRAM 密码身份验证。
Atlas 还支持:
Workforce Identity Federation
Workforce Identity Federation 允许您通过身份提供商管理Atlas数据库的所有身份验证。对于数据库访问权限,我们建议使用与 OIDC 兼容的身份提供者,例如 Okta、 Microsoft Entra ID或 Ping Identity,以在身份提供商中实施安全策略,例如密码复杂性、档案轮换和 MFA。
Workload Identity Federation 和Amazon Web Services IAM 角色身份验证
Workload Identity Federation 使在Azure和 Google Cloud 等云环境中运行的应用程序能够通过Atlas进行身份验证,而无需管理单独的数据库用户凭证。借助 Workload Identity Federation,您可以使用Azure托管身份、Google 服务帐户或任何 OAuth2.0 兼容服务来管理Atlas数据库用户。这些身份验证机制允许对Atlas数据库进行无密码访问权限,从而简化管理并增强安全性。
我们建议所有在生产环境中运行的应用程序都使用 Workload Identity Federation。除非在最极端的破玻璃紧急情况下,否则不应允许人类用户连接。
您还可以通过 AWS IAM 角色进行身份验证。
要了解更多信息,请查看以下内容:
X.509 客户端证书和SCRAM
我们建议您通过身份提供程序使用 Workforce 或工作负载 Identity Federation,以确保安全并便捷地访问 Atlas 控制和数据平面的所有方面。
如果您没有用于联合的Atlas 身份提供程序,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或AWS Secrets 经理)来生成和存储复杂的数据库凭证。机密管理器可以根据配置的角色为 Atlas 数据库动态生成数据库凭证。
要了解更多信息,请参阅博客 《Manage MongoDB Atlas Database Secrets in HashiCorp Vault》。
Atlas Administration API 身份验证
Atlas 提供了两种方式来进行 Atlas 管理 API 的身份验证:
服务账户
服务帐户使用行业标准 OAuth2.0 通过Atlas Administration API与Atlas进行安全的身份验证。我们建议您尽可能使用服务帐户而不是API密钥,因为它们通过使用短期访问权限令牌和所需的档案轮换来提高安全性。
服务帐户作为预览功能提供,您只能使用Atlas用户界面或Atlas Administration API管理服务帐户的访问权限。您无法通过Atlas CLI或 Terraform管理服务帐户的编程访问权限。
要了解更多信息,请参阅服务帐户概述。
API 密钥
如果您不使用服务帐户,可以使用基于 API 密钥的身份验证来安全地管理程序访问。基于 API 密钥的身份验证使用 HTTP 摘要式身份验证来保护请求。API 公钥用作用户名,对应的私钥用作密码。您应将这些密钥存储在第三方密钥管理系统中,例如 AWS Secrets Manager 或 HashiCorp Vault。要了解如何在 Vault 中安全地存储这些密钥,请参阅博客:在 HashiCorp Vault 中管理 MongoDB Atlas 数据库机密。
为了进一步增强安全性并将未经授权访问的风险降至最低:
遵循最佳实践,定期轮换API密钥。要了解如何使用HashiCorp Vault 旋转这些密钥,例如,请参阅HashiCorp 文档。
为您的 API 密钥使用 IP 访问列表。要了解更多信息,请参阅需要针对 Atlas Administration API 的 IP 访问列表。
要了解详情,请参阅 Atlas Administration API 身份验证。
部署
要学习我们关于部署的建议,这些建议与身份验证相关,请参阅Atlas 组织、项目和集群指导。
Atlas 授权的建议
您必须实现Atlas 强大的基于角色的访问控制 (RBAC),才能有效管理对所有资源的访问权限。Atlas包含内置角色,这些角色提供管理Atlas控制平面通常所需的不同访问权限级别。为了连接到数据平面中的Atlas集群,我们建议使用数据库细粒度自定义角色,根据角色访问权限其功能所需的数据访问来提供细粒度的范围界定。这种方法使您能够遵循最小权限原则原则。
此外,通过将 Atlas 与联合身份提供程序集成,您可以通过将身份提供程序组映射到 Atlas 角色来使用即时预配。这简化了访问管理,并确保整个平台上的角色分配安全且井然有序。您可以根据您的编排层的预配过程以编程方式授予访问权限。
一般来说,最佳实践是始终将对上层环境的访问权限限制为仅具有经过安全性和确定性结果测试的脚本的编程服务帐户。在开发和测试期间,只应在较低环境中允许人类访问权限。
Atlas UI 和 Atlas Administration API(控制平面)授权
您可以将用户、服务帐户和API密钥分配给预定义的角色,指定他们可以在Atlas组织、项目或两者中执行的操作。使用 Identity Federation,通过群组-角色映射将身份提供商群组链接到Atlas角色,从而管理访问权限。
我们建议您使用现代联合身份提供程序,例如 Azure Entra ID、Okta 或 Ping Identity,它通过 SAML 提供单点登录 (SSO),因为这样可以提高授权过程的安全性,并支持以编程方式为 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
角色为构建应用程序的开发团队授予访问权限,以便他们在开发和测试期间访问集群的查询和性能指标。此访问权限允许他们使用 Data Explorer 调试数据问题。请勿在生产环境中允许此角色。它具备查看和编辑数据的能力,包括在集群上创建和删除数据库、集合和索引,这对于快速实验和开发非常有用。如果您不习惯在开发环境中为开发团队提供此级别的访问权限,可以使用Project Data Access Read Only
角色授予他们对集群数据和性能统计的只读访问权限。要在生产环境中授予对集群数据的只读访问权限,请使用
Project Observability Viewer
角色。
要了解详情,请参阅 Atlas 用户角色。
数据库授权
可以为劳动力和工作负载用户分配预定义或自定义的细粒度数据库角色,并为特定项目或单个集群量身定制权限。在预发布和生产环境中,我们建议使用身份联合来简化访问管理,将您的身份提供程序 (身份提供程序) 连接到 Atlas,以实现更现代化和简化的数据访问身份验证和授权流程。
通过在您的 身份提供程序 中配置 群组成员资格 ,您可以将群组映射到数据库用户,从而简化 身份提供程序 内部的访问控制。不过,对于工作负载身份,我们建议直接使用 users
声明而不是 groups
来分配角色。在开发和测试环境中,您可以默认使用预定义的 readWriteAny
角色来简化开发和测试过程。在将应用程序迁移到更高级别的环境时,您应构建一个自定义角色,以最小权限原则为基础,限制应用程序服务器的访问权限。
要了解更多信息,请查看以下内容:
自动化示例:Atlas 身份验证和授权
请参阅 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>"
常见文件
您必须为每个示例创建以下文件。将每个示例的文件放在各自的目录中。更改 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 用户。
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" } }
运行以下命令,从身份提供程序中的特定群组创建数据库用户。您可以通过身份提供商Okta管理用户身份验证和授权。该命令还会向身份提供商群组中的用户授予对Atlas 集群的 dbAdmin
和 readWrite
特权。
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>"
常见文件
您必须为每个示例创建以下文件。将每个示例的文件放在各自的目录中。更改 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" }
为身份提供者配置联合设置
使用以下步骤在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项目的示例,请参阅示例。