拓冰建站拓冰建站
首页 / 资讯中心 / 正文

使用 Terraform AWS Provider 创建启用了细粒度访问控制(FGAC)的 Elasticsearch 域:完整示例与源码级解析

使用 Terraform AWS Provider 创建启用了细粒度访问控制FGAC的 Elasticsearch 域完整示例与源码级解析【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws本文以examples/elasticsearch-domain示例为蓝本详细介绍如何用 Terraform AWS Provider 创建一个启用细粒度访问控制Fine-Grained Access ControlFGAC的 Amazon ElasticsearchOpenSearch域覆盖 FGAC 的前置安全要求、完整可运行的main.tf配置拆解、资源文档与底层 Schema 验证以及terraform plan / apply / destroy的标准操作流程。读完本文你将能够独立复制并落地一套满足“加密 HTTPS 细粒度鉴权”要求的 Elasticsearch 域配置并理解每个参数在 AWS Provider 源码中的真实行为。示例概述一个开箱即用的安全增强型 Elasticsearch 域examples/elasticsearch-domain是仓库terraform-provider-aws中针对 Amazon Elasticsearch Service 的官方示例它创建的是一个启用了细粒度访问控制的域Domain。这个示例的独特价值在于它不像普通示例只创建最小可用的集群而是刻意把 AWS 要求的三项安全前置条件全部配置到位因此它是一份可以直接对照生产环境安全基线如等保、金融合规中的传输加密与静态加密要求使用的模板。该示例目录仅包含两个文件main.tf — 核心资源定义声明 provider、读取当前区域/账号信息并创建aws_elasticsearch_domainvariables.tf — 定义aws_region与domain两个输入变量及默认值。从源码结构看internal/service/elasticsearch/目录包含domain.go、domain_policy.go、domain_saml_options.go、vpc_endpoint.go等文件该服务模块还支持域策略、SAML、VPC 端点等扩展能力而本文示例聚焦于 FGAC 这一条主线。Fine-Grained Access Control 的启用前提细粒度访问控制FGAC是 Amazon ES 提供的一套基于角色的安全机制用于控制 Kibana 访问、索引级权限、字段级权限与文档级权限。但 FGAC 并非可以随意开启它有三条硬性前置要求examples/elasticsearch-domain/README.md中明确列出Elasticsearch 版本 6.7 或更高示例使用7.1必须同时开启静态数据加密encrypt at rest与节点间加密node-to-node encryption必须强制所有流量通过 HTTPS 访问域Require HTTPS for all traffic to the domain。注意细粒度访问控制只能在新建域上启用一旦启用便无法关闭Once enabled, it cannot be disabled。这意味着你的配置决策具有一次性如果需要修改只能销毁重建域。同时由于advanced_security_options.enabled在源码中被标记为ForceNew: true见下文源码解析Terraform 层面也会将其视为强制新建资源的变更。完整配置拆解main.tfexamples/elasticsearch-domain/main.tf的完整内容如下保留了原始结构与可运行性terraform { required_version 0.12 } provider aws { region var.aws_region } data aws_region current {} data aws_caller_identity current {} resource aws_elasticsearch_domain test { domain_name var.domain elasticsearch_version 7.1 cluster_config { instance_type r5.large.elasticsearch } advanced_security_options { enabled true internal_user_database_enabled true master_user_options { master_user_name test_master_user master_user_password Barbarbarbar1! } } encrypt_at_rest { enabled true } domain_endpoint_options { enforce_https true tls_security_policy Policy-Min-TLS-1-2-2019-07 } node_to_node_encryption { enabled true } ebs_options { ebs_enabled true volume_size 10 } access_policies POLICY { Version: 2012-10-17, Statement: [ { Effect: Allow, Principal: { AWS: * }, Action: es:*, Resource: arn:aws:es:${data.aws_region.current.region}:${data.aws_caller_identity.current.account_id}:domain/${var.domain}/* } ] } POLICY }下面按区块逐项解析其作用与参数含义。Terraform 与 Provider 声明terraform { required_version 0.12 } provider aws { region var.aws_region }required_version 0.12声明配置需要 Terraform 0.12 及以上版本0.12 引入了 HCL2 语法。在实际生产环境建议进一步提高到当前稳定版本。provider 的region取自var.aws_region默认值为us-west-2见下文 variables.tf。关于 provider 的完整配置方式认证、profile、shared credentials 等可参考官方文档 AWS Provider 配置说明示例 README 中亦推荐参考该文档。读取当前区域与账号身份data aws_region current {} data aws_caller_identity current {}这两个 data source 分别读取当前 provider 生效的区域名与当前 AWS 账号 ID目的是在后面的访问策略access_policies中动态拼接资源 ARNarn:aws:es:${data.aws_region.current.region}:${data.aws_caller_identity.current.account_id}:domain/${var.domain}/*这样生成的 ARN 形如arn:aws:es:us-west-2:123456789012:domain/elasticsearch-domain-test/*无需硬编码区域和账号配置可跨环境复用。域资源核心属性domain_name var.domain elasticsearch_version 7.1 cluster_config { instance_type r5.large.elasticsearch }domain_name域名称来自变量var.domain默认elasticsearch-domain-test。AWS 对域名长度与字符有约束且创建后不可修改。elasticsearch_versionElasticsearch 引擎版本示例为7.1满足 FGAC 的“6.7 及以上”门槛。官方资源文档说明该参数默认为1.5见 website/docs/r/elasticsearch_domain.html.markdown因此在启用 FGAC 时必须显式指定高于 6.7 的版本。cluster_config.instance_type数据节点实例规格示例选用r5.large.elasticsearch内存优化型。注意部分功能如静态加密对实例类型有额外要求AWS 文档称之为“certain instance types”。细粒度访问控制块advanced_security_optionsadvanced_security_options { enabled true internal_user_database_enabled true master_user_options { master_user_name test_master_user master_user_password Barbarbarbar1! } }这是整个示例的灵魂区块对应 FGAC。在 internal/service/elasticsearch/domain.go 的 Schema 中该区块定义如下enabled必填Required布尔值且被标记为ForceNew: true——任何将false改为true或反向的变更都会触发域重建与“FGAC 只能在新建域启用”的 AWS 约束一一对应internal_user_database_enabled可选默认false。启用后允许使用域内置用户数据库进行身份认证而非仅依赖 IAM/外部 IdPmaster_user_options最多 1 个MaxItems: 1用于定义主用户包含三个可选子参数master_user_arn指定 IAM 角色的 ARN 作为主用户带verify.ValidARN校验master_user_name内置用户数据库中的主用户名master_user_password主用户密码Schema 中标记为Sensitive: trueTerraform 状态与输出中会做脱敏处理。示例选择了“内置用户数据库 用户名密码”的组合方式internal_user_database_enabled true。需要提醒示例中的密码Barbarbarbar1!仅为演示值实际使用请替换为符合 AWS 密码策略的强密码并建议通过变量、sops、Vault 或terraform.tfvars等外部方式注入避免明文入库。静态加密encrypt_at_restencrypt_at_rest { enabled true }enabled必填默认false。启用静态加密是 FGAC 的硬性前置之一。可选参数kms_key_id指定 KMS 主密钥 ARN不指定时默认使用 AWS 托管密钥aws/es。官方资源文档特别提示KMS 会接受 Key ID 但返回 Key ARN为避免 Terraform 误报漂移配置中应使用 ARN 形式。版本约束新域启用静态加密要求elasticsearch_version5.1 及以上对存量未加密域就地开启要求版本 6.7 及以上否则 Terraform 会重建域并可能造成数据丢失。域端点选项domain_endpoint_optionsdomain_endpoint_options { enforce_https true tls_security_policy Policy-Min-TLS-1-2-2019-07 }enforce_https是否强制所有请求走 HTTPS默认true这是 FGAC 的第三条硬性前置tls_security_policy应用到 HTTPS 端点的 TLS 安全策略。官方资源文档列出三个合法值Policy-Min-TLS-1-0-2019-07、Policy-Min-TLS-1-2-2019-07与Policy-Min-TLS-1-2-PFS-2023-10。示例选用Policy-Min-TLS-1-2-2019-07最低 TLS 1.2符合当前主流安全基线。文档同时注明Terraform 仅在显式提供该值时执行漂移检测。该区块还支持custom_endpoint、custom_endpoint_enabled、custom_endpoint_certificate_arn三个自定义端点相关参数详见 website/docs/r/elasticsearch_domain.html.markdown 的domain_endpoint_options小节。节点间加密node_to_node_encryptionnode_to_node_encryption { enabled true }enabled必填默认false。启用节点间加密同样是 FGAC 的硬性前置。版本约束新域启用节点间加密要求elasticsearch_version6.0 及以上存量域就地开启要求 6.7 及以上否则重建域并可能丢数据。与静态加密一样官方资源文档强调“enabling in place … only if version 6.7”而示例版本 7.1 恰好同时满足静态加密、节点间加密与 FGAC 三者的最低版本要求。存储与访问策略ebs_options { ebs_enabled true volume_size 10 }ebs_options用于为数据节点挂载 EBS 存储ebs_enabled true时需指定volume_sizeGiB示例为 10。官方资源文档说明是否必须配置 EBS 取决于所选实例规格见 AWS 实例类型定价页部分实例类型默认使用实例存储。access_policies POLICY { Version: 2012-10-17, Statement: [ { Effect: Allow, Principal: { AWS: * }, Action: es:*, Resource: arn:aws:es:${data.aws_region.current.region}:${data.aws_caller_identity.current.account_id}:domain/${var.domain}/* } ] } POLICYaccess_policies是 JSON 格式的基于资源的访问策略resource-based policy这里放行所有主体AWS: *执行所有 ES 操作属于典型的“开放 API 面、靠 FGAC 做细粒度鉴权”的组合思路——FGAC 启用后即使策略放行具体索引/字段/文档级权限仍由 FGAC 的用户与角色决定这正是该示例的安全模型要点。若需要独立的域级策略管理仓库还提供了aws_elasticsearch_domain_policy资源源码见 internal/service/elasticsearch/domain_policy.go文档见 website/docs/r/elasticsearch_domain_policy.html.markdown。输入变量variables.tfexamples/elasticsearch-domain/variables.tf 定义了示例仅有的两个变量variable aws_region { default us-west-2 } variable domain { description The name of the Elasticsearch Domain default elasticsearch-domain-test }变量默认值说明aws_regionus-west-2部署域所在的 AWS 区域domainelasticsearch-domain-testElasticsearch 域名称使用时可通过命令行-var或terraform.tfvars覆盖默认值例如terraform apply -vardomainmy-prod-es -varaws_regionap-southeast-1从源码看 FGAC 的底层行为Schema 定义中的“不可逆”信号在 internal/service/elasticsearch/domain.go 中advanced_security_options的关键约束整个块MaxItems: 1语义上只能出现一份配置enabled为RequiredForceNew即开启/关闭 FGAC 属于资源级破坏性变更master_user_password标记Sensitive: true状态文件与 plan 输出均会脱敏。这些约束与 AWS 侧“FGAC 只能在新建域启用、不可关闭”的规则完全一致属于 Provider 在配置层面对云厂商约束的显式建模。请求构造与状态回读在create流程中配置块会被转换为 SDK 输入结构input.AdvancedSecurityOptions expandAdvancedSecurityOptions(...)见 domain.go在read流程中回读时会补充internal_user_database_enabled与master_user_options等计算字段见 domain.go确保状态与远端一致在update流程中仅当advanced_security_options发生变化时才重新下发该块if d.HasChange(advanced_security_options)见 domain.go避免无关更新触发安全配置重写。这表明 Provider 对 FGAC 的处理是“创建时下发、变更时精准更新”的精细化实现。加密选项的就地更新限制官方资源文档针对encrypt_at_rest与node_to_node_encryption均给出了版本相关的就地更新约束仅版本 ≥ 6.7 的存量未加密域允许就地开启其余情况 Terraform 会重建域有数据丢失风险关闭加密同样触发重建。示例选用 7.1 正是为了在满足 FGAC 的同时为未来可能的运维调整保留最大的灵活性。运行示例三步标准流程示例 README 给出的操作流程围绕标准的 Terraform 生命周期展开。首先在示例目录下初始化可选但推荐terraform init规划阶段plan——生成执行计划展示将要创建的资源与属性terraform plan应用阶段apply——执行计划并创建域。Elasticsearch 域创建通常需要十几分钟到几十分钟期间apply会持续等待域进入Active状态terraform apply清理阶段destroy——移除整个栈示例创建的域、依赖的 EBS、加密配置等随之销毁terraform destroy提示aws_elasticsearch_domain的创建/更新是慢操作Provider 内部使用长轮询等待域状态收敛如遇超时可结合timeouts参数调整具体取值可参考 website/docs/r/elasticsearch_domain.html.markdown 中的Timeouts小节。落地到生产的几点建议版本选择FGAC 要求 ≥ 6.7若希望保留后续就地开启加密的余地优先选择 ≥ 6.7 的版本示例的 7.1 是稳妥选择。同时注意静态加密新域要求 ≥ 5.1、节点间加密新域要求 ≥ 6.0。凭据管理master_user_password在 Schema 中已标记为敏感字段但仍应通过变量、外部密钥管理如 Vault、sops注入避免硬编码在main.tf中入库。访问模型access_policies放行es:*后真正的细粒度控制交给 FGAC 的内部用户、角色与权限映射索引级、字段级、文档级这种“粗放策略 细粒度鉴权”的组合是 FGAC 场景的标准模式。不可逆变更规划由于 FGAC 一旦启用不可关闭且enabled为ForceNew请在启用前完成网络、备份快照与版本策略的设计避免事后重建造成数据迁移成本。进一步扩展该示例未涉及的 FGAC 配套能力如基于 SAML 的联合认证可查看 internal/service/elasticsearch/domain_saml_options.go 与 website/docs/r/elasticsearch_domain_saml_options.html.markdownVPC 内网部署可参考 internal/service/elasticsearch/vpc_endpoint.go。参考资料示例本体examples/elasticsearch-domain/README.md、examples/elasticsearch-domain/main.tf、examples/elasticsearch-domain/variables.tf资源 Schema 与 CRUD 实现internal/service/elasticsearch/domain.go官方资源文档参数完整说明、合法值、时间约束website/docs/r/elasticsearch_domain.html.markdown相关资源aws_elasticsearch_domain_policydomain_policy.go、aws_elasticsearch_domain_saml_optionsdomain_saml_options.go【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门