TerraGoat:一款针对Terraform的安全漏洞学习基础设施

2022-04-11 21:09:10 浏览数 (1)

关于TerraGoat

TerraGoat是一款专门针对Terraform的安全漏洞学习基础设施,TerraGoat中所有存在的安全漏洞都是软件开发人员故意留下的,可以更好地帮助广大研究人员深入学习和研究跟Terraform相关的安全漏洞。

TerraGoat是一个专门的学习和培训项目,它演示了很多跟Terraform相关的安全漏洞以及常见的错误配置,而且它能够带领研究人员寻找到一条渗透路径并进入目标云生产环境。

TerraGoat的设计目的是为了让DevSecOps(通过一套包含了人文、流程、技术的框架和方法,把安全能力无缝且柔和地嵌入现有开发流程体系,它有助于在开发过程早期而不是产品发布后识别安全问题,让每个人对信息安全负责,而不仅仅是安全部门。)能够设计并实施可持续的错误配置预防策略。它可以作为代码框架来测试策略,比如Bridgecrew&Checkov。

简而言之,TerraGoat提供了一个针对Terraform的安全基线训练场,可以用于实践云基础设施的安全开发最佳实践。

注意:TerraGoat将会在你的帐号中创建一个包含安全缺陷的AWS资源,请不要将TerraGoat部署到生产环境或任何包含敏感信息的AWS资源中。

工具要求

Terraform 0.12 AWS CLI Azure CLI

工具安装

AWS配置

我们可以通过“TF_VAR_environment”参数在一个AWS帐号中部署多个TerraGoat实例。

首先,创建一个S3 Bucket后端来存储和获取Terraform的状态:

代码语言:javascript复制
export TERRAGOAT_STATE_BUCKET="mydevsecops-bucket"

export TF_VAR_company_name=acme

export TF_VAR_environment=mydevsecops

export TF_VAR_region="us-west-2"

aws s3api create-bucket --bucket $TERRAGOAT_STATE_BUCKET 

    --region $TF_VAR_region --create-bucket-configuration LocationConstraint=$TF_VAR_region

# Enable versioning

aws s3api put-bucket-versioning --bucket $TERRAGOAT_STATE_BUCKET --versioning-configuration Status=Enabled

# Enable encryption

aws s3api put-bucket-encryption --bucket $TERRAGOAT_STATE_BUCKET --server-side-encryption-configuration '{

  "Rules": [

    {

      "ApplyServerSideEncryptionByDefault": {

        "SSEAlgorithm": "aws:kms"

      }

    }

  ]

}'

接下来,使用下列命令来部署TerraGoat(AWS)即可:

代码语言:javascript复制
cd terraform/aws/

terraform init 

-backend-config="bucket=$TERRAGOAT_STATE_BUCKET" 

-backend-config="key=$TF_VAR_company_name-$TF_VAR_environment.tfstate" 

-backend-config="region=$TF_VAR_region"

terraform apply

下列命令可以移除TerraGoat(AWS):

代码语言:javascript复制
terraform destroy

我们还可以通过下列命令来创建多个TerraGoat AWS实例栈:

代码语言:javascript复制
cd terraform/aws/

export TERRAGOAT_ENV=$TF_VAR_environment

export TERRAGOAT_STACKS_NUM=5

for i in $(seq 1 $TERRAGOAT_STACKS_NUM)

do

    export TF_VAR_environment=$TERRAGOAT_ENV$i

    terraform init 

    -backend-config="bucket=$TERRAGOAT_STATE_BUCKET" 

    -backend-config="key=$TF_VAR_company_name-$TF_VAR_environment.tfstate" 

    -backend-config="region=$TF_VAR_region"

    terraform apply -auto-approve

done

删除多个TerraGoat AWS实例栈:

代码语言:javascript复制
cd terraform/aws/

export TF_VAR_environment = $TERRAGOAT_ENV

for i in $(seq 1 $TERRAGOAT_STACKS_NUM)

do

    export TF_VAR_environment=$TERRAGOAT_ENV$i

    terraform init 

    -backend-config="bucket=$TERRAGOAT_STATE_BUCKET" 

    -backend-config="key=$TF_VAR_company_name-$TF_VAR_environment.tfstate" 

    -backend-config="region=$TF_VAR_region"

    terraform destroy -auto-approve

done

Azure配置

我们可以通过“TF_VAR_environment”参数在一个Azure订阅帐号中部署多个TerraGoat实例栈。

首先,创建一个Azure存储帐号后端来存储和获取Terraform的状态:

代码语言:javascript复制
export TERRAGOAT_RESOURCE_GROUP="TerraGoatRG"

export TERRAGOAT_STATE_STORAGE_ACCOUNT="mydevsecopssa"

export TERRAGOAT_STATE_CONTAINER="mydevsecops"

export TF_VAR_environment="dev"

export TF_VAR_region="westus"

# Create resource group

az group create --location $TF_VAR_region --name $TERRAGOAT_RESOURCE_GROUP

# Create storage account

az storage account create --name $TERRAGOAT_STATE_STORAGE_ACCOUNT --resource-group $TERRAGOAT_RESOURCE_GROUP --location $TF_VAR_region --sku Standard_LRS --kind StorageV2 --https-only true --encryption-services blob

# Get storage account key

ACCOUNT_KEY=$(az storage account keys list --resource-group $TERRAGOAT_RESOURCE_GROUP --account-name $TERRAGOAT_STATE_STORAGE_ACCOUNT --query [0].value -o tsv)

# Create blob container

az storage container create --name $TERRAGOAT_STATE_CONTAINER --account-name $TERRAGOAT_STATE_STORAGE_ACCOUNT --account-key $ACCOUNT_KEY

部署TerraGoat(Azure):

代码语言:javascript复制
cd terraform/azure/

terraform init -reconfigure -backend-config="resource_group_name=$TERRAGOAT_RESOURCE_GROUP" 

    -backend-config "storage_account_name=$TERRAGOAT_STATE_STORAGE_ACCOUNT" 

    -backend-config="container_name=$TERRAGOAT_STATE_CONTAINER" 

    -backend-config "key=$TF_VAR_environment.terraform.tfstate"

terraform apply

移除TerraGoat(Azure):

代码语言:javascript复制
terraform destroy

GCP配置

我们可以通过“TF_VAR_environment”参数在一个GCP项目中部署多个TerraGoat实例栈。

创建一个GCS后端来获取和存储Terraform状态:

在使用Terraform时,我们需要准备好一个服务帐号和相关的凭证。如果没有的话,则必须手动创建:

1、登录你的GCP项目,点击“IAM”->“Service Accounts”。 2、点击“CREATE SERVICE ACCOUNT”。 3、填写服务名称(比如说“terragoat”),然后点击“CONTINUE”。 4、授权服务帐号“Editor”角色,然后点击“CONTINUE”。 5、点击“DONE”即可。

创建凭证

1、登录你的GCP项目,点击“IAM > Service Accounts”,然后点击对应的服务帐号。

2、点击“ADD KEY > Create new key > JSON”,然后点击“CREATE”。此时将会从创建一个.json文件,然后下载到你的设备上的terraform/gcp目录中。凭证创建完成后,工具将会创建如下所示的BE配置文件:

代码语言:javascript复制
export TF_VAR_environment="dev"

export TF_TERRAGOAT_STATE_BUCKET=remote-state-bucket-terragoat

export TF_VAR_credentials_path=<PATH_TO_CREDNETIALS_FILE> # example: export TF_VAR_credentials_path=terragoat_credentials.json

export TF_VAR_project=<YOUR_PROJECT_NAME_HERE>

# Create storage bucket

gsutil mb gs://${TF_TERRAGOAT_STATE_BUCKET}

部署TerraGoat(GCP):

代码语言:javascript复制
cd terraform/gcp/

terraform init -reconfigure -backend-config="bucket=$TF_TERRAGOAT_STATE_BUCKET" 

    -backend-config "credentials=$TF_VAR_credentials_path" 

    -backend-config "prefix=terragoat/${TF_VAR_environment}"

terraform apply

移除TerraGoat(GCP):

代码语言:javascript复制
terraform destroy

项目地址

https://github.com/bridgecrewio/terragoat

0 人点赞