Terraform 使用入门以及在云上攻防中的作用

admin 2022年6月6日20:56:23云安全评论7 views4798字阅读15分59秒阅读模式

文章首发于:

火线Zone社区(https://zone.huoxian.cn/)


0x00 前言


Terraform 是一种资源编排工具,通过它可以很方便的去构建云服务资源,本文将以「在腾讯云上创建一个 COS 存储桶」为例进行演示。


0x01 Terraform 概述


Terraform 官方下载页面:https://www.terraform.io/downloads ,在这里找到自己的系统进行安装即可。

目前 Terraform 基本已经支持了大部分主流的云服务厂商,在 https://registry.terraform.io/browse/providers 中可以看到其所支持的云服务厂商。


Terraform 使用入门以及在云上攻防中的作用


本文中将使用腾讯云作为演示,在平时使用 Terraform 时会频繁的去参考官方文档,其腾讯云的官方文档地址为:https://registry.terraform.io/providers/tencentcloudstack/tencentcloud/latest/docs


0x02 开始编写


首先创建一个文件夹(这里文件夹名称为 cos_bucket_demo),并新建以下文件。


.└── cos_bucket_demo    ├── README.md    ├── main.tf    ├── output.tf    ├── terraform.tfvars    ├── variables.tf    └── version.tf


  • README.md 描述文件

  • main.tf Terraform 主体代码文件

  • output.tf 内容输出代码文件

  • terraform.tfvars 参数文件

  • variables.tf 变量声明文件

  • version.tf 版本信息文件

可以看到在 cos_bucket_demo 文件夹中,有多个 tf 后缀的文件,其实这些 tf 文件里的代码都可以写到一个 tf 文件里,但一般为了规范些,还是建议分多个 tf 文件去写,一个文件夹对应一个 tf 场景。

接下来,我们来看看每个 tf 文件里都有哪些内容。


version.tf


version.tf 一般是放和版本信息有关的代码,例如这里就是声明了 Provider 来源为 tencentcloud 且版本为 1.72.5,Provider 在这里可以理解成「提供云服务的厂商」的意思。


terraform {  required_providers {    tencentcloud = {      source  = "tencentcloudstack/tencentcloud"      version = "1.72.5"    }  }}


如果经常使用某个云的 Provider,建议指定固定的版本,这样在开启插件缓存后,每次初始化 Terraform 时,就不会因为 Provider 有更新了而要重新下载它,同时还会避免因为 Provider 更新导致代码不可用或者出现告警的情况。

开启插件缓存方法可以参考:https://wiki.teamssix.com/CloudNative/Terraform/terraform-enable-plugin-cache.html


variables.tf


variables.tf 里一般会写上变量的声明,例如这里需要声明腾讯云的 secret id 和 secret key 变量。


variable "tencentcloud_secret_id" {  type        = string  description = "Set Tencent Cloud secret id."  sensitive   = true  nullable    = false}
variable "tencentcloud_secret_key" {  type        = string  description = "Set Tencent Cloud secret key."  sensitive   = true  nullable    = false}


其中 variable 后面的是变量名称,type 指定变量类型,description 用来描述变量的用途,sensitive 用来指定变量是不是敏感信息,nullable 用来指定变量是不是可以为空。


terraform.tfvars


terraform.tfvars 文件比较简单,在这里可以写上变量的值,这样在运行 Terraform 的时候,就不用从命令行中去指定变量了。

如果没有该文件,那么在执行 Terraform 代码时,Terraform 就会在命令行中提示输入这些变量。


tencentcloud_secret_id  = "xxx"tencentcloud_secret_key = "xxx"


output.tf


output.tf 文件里一般会指定要输出的内容,这里要输出的是 COS Bucket 的地址。


output "tencent_cloud_cos_bucket_name" {  value       = "https://${tencentcloud_cos_bucket.cos_bucket_demo.cos_bucket_url}"  description = "This is the bucket name of Tencent Cloud COS."}


main.tf


最后 main.tf 一个就是最核心的文件了。


provider "tencentcloud" {  secret_id  = var.tencentcloud_secret_id  secret_key = var.tencentcloud_secret_key  region     = "ap-beijing"}
resource "tencentcloud_cos_bucket" "cos_bucket_demo" {  bucket = "teamssix-${random_string.random_suffix.result}-${data.tencentcloud_user_info.foo.app_id}"}
resource "random_string" "random_suffix" {  length  = 7  special = false  upper   = false}
data "tencentcloud_user_info" "foo" {}


首先在 provider 块中指定了腾讯云的 secret id 和 secret key 以及 region,接着使用 tencentcloud_cos_bucket resource 块用来创建存储桶。

由于腾讯云的 Bucket 名称中包含了使用者的 APP ID,所以这里还使用了 tencentcloud_user_info data 块,用来获取当前用户的 APP ID,同时为了避免 Bucket 名称重复,这里使用了 random_string resource 块用来生成一个随机数。

最后,就可以执行这些代码了。


0x03 执行代码


首先,将终端路径切到 cos_bucket_demo 文件夹下,运行初始化命令。


terraform init


该命令会识别当前文件夹里的 tf 文件中所使用到的 Provider,然后去下载它。

如果提示 Error: Failed to install provider,大多数情况是因为网络的问题,可以在终端里设置代理后再次尝试。

然后运行以下命令,该命令会检查当前代码是否存在问题,如果没问题就会给出接下来将要执行的计划。


terraform plan


最后,确认没问题后,就可以应用这个代码了。


terraform apply


在执行该命令的时候,会提示 Enter a value,这时如果确认无误,就输入 yes 即可,最后就可以在 Outputs 中看到 Bucket 的 URL 了。


Terraform 使用入门以及在云上攻防中的作用


这时,在腾讯云控制台的存储桶列表中,就可以看到我们刚才创建的存储桶了。


Terraform 使用入门以及在云上攻防中的作用


这样,我们就完成了利用 Terraform 创建云服务资源的过程,如果想要销毁这个资源也很容易,直接运行以下命令即可。


terraform destroy


0x04 在云上攻防中的作用


通过上面的内容,可以看到 Terraform 可以调用云厂商的 AK、SK 进行云服务资源的创建与获取,作为安全人员,我们可以利用这个特性进行云上服务的批量信息收集,下面以 COS、CVM、CAM 的信息收集为例。

将 output.tf 改为以下内容


output "tencent_cloud_cos_bucket_list" {  value = data.tencentcloud_cos_buckets.cos_buckets.bucket_list}
output "tencent_cloud_cvm_instances_list" {  value = data.tencentcloud_instances.cvm_instances.instance_list}
output "tencent_cloud_cam_users_list" {  value = data.tencentcloud_cam_users.cam_users.user_list}


将 main.tf 改为以下内容


provider "tencentcloud" {  secret_id  = var.tencentcloud_secret_id  secret_key = var.tencentcloud_secret_key  region     = "ap-beijing"}
data "tencentcloud_cos_buckets" "cos_buckets" {}
data "tencentcloud_instances" "cvm_instances" {}
data "tencentcloud_cam_users" "cam_users" {}


然后应用代码,就可以获取到 COS、CVM、CAM 的相关信息了,如果想获取其他的信息,可以在 Provider 腾讯云官方文档中找到。


Terraform 使用入门以及在云上攻防中的作用


从站在安全人员的角度来说,我们完全可以通过 Terraform 打造一个独属于自己的全云场景覆盖的 AK、SK 利用工具,而且我们不用自己调取、调试任何 SDK,可以说是潜力无限了。


通过 Terraform 进行信息收集的这个想法来自 tanger 师傅。


0x05 最后


Terraform 的内容远远不止上面说的这些,官方文档对它的介绍也足够详细,同时现在也有了由第三方翻译的中文文档:https://lonegunmanb.github.io/introduction-terraform/

另外在 T Wiki 中,还有一些 Terraform 其他资料,比如 Terraform 可视化、代码安全检查的方法等等,也可以作为扩展阅读:https://wiki.teamssix.com/CloudNative/Terraform/

如果你在编写 Terraform 代码的时候,想找一些其他人写的代码进行参考,那么不妨看看 TerraformGoat 这个项目:https://github.com/HuoCorp/TerraformGoat

最后建议自己在编写 Terraform 代码的时候,多看官方文档,多用英文去搜索,多用官方文档的代码,可以在很大程度上提高自己的效率。



【火线Zone云安全社区群】

进群可以与技术大佬互相交流

进群有机会免费领取节假日礼品

进群可以免费观看技术分享直播

识别二维码回复【社区群】进群

Terraform 使用入门以及在云上攻防中的作用


【火线Zone社区周激励】

2022.5.30~ 2022.6.5公告

Terraform 使用入门以及在云上攻防中的作用


【相关精选文章】


Terraform 使用入门以及在云上攻防中的作用


Terraform 使用入门以及在云上攻防中的作用


Terraform 使用入门以及在云上攻防中的作用

火线Zone是[火线安全平台]运营的云安全社区,内容涵盖云计算、云安全、漏洞分析、攻防等热门主题,研究讨论云安全相关技术,助力所有云上用户实现全面的安全防护。欢迎具备分享和探索精神的云上用户加入火线Zone社区,共建一个云安全优质社区!

如需转载火线Zone公众号内的文章请联系火线小助手:hxanquan(微信)


Terraform 使用入门以及在云上攻防中的作用

//  火线Zone //

微信号 : huoxian_zone


Terraform 使用入门以及在云上攻防中的作用

点击阅读原文,加入社区,共建一个有技术氛围的优质社区!

原文始发于微信公众号(火线Zone):Terraform 使用入门以及在云上攻防中的作用

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年6月6日20:56:23
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  Terraform 使用入门以及在云上攻防中的作用 http://cn-sec.com/archives/1092321.html

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: