Google Cloud CLI 기반 Terraform 정책 검사 - jangjaelee/tutorial-terraform-compliance GitHub Wiki
2022.012. 이장재 📧 [email protected] 📂 https://github.com/jangjaelee 📒 http://www.awx.kr
Overview
gcloud beta terraform vet
은 Terraform을 사용하여 인프라 CI/CD 파이프라인 단계에서 보안 및 거버넌스를 위반 하는지 정책 검사를 수행할 수 있는 도구 입니다.
이 도구를 사용하면 terraform plan의 정확한 검증에 필요한 것을 Google Cloud APIs를 사용하여 조직이 규정한 컴플라이언스 혹은 정책을 자동화하여 검사할 수 있어 감사를 통해 도출될 수 있는 인프라 위험을 줄일 수 있습니다.
gcloud beta terraform vet
을 사용하면 다음과 같은 이점이 있습니다.
- 애플리케이션 개발의 모든 단계에서 조직의 정책 시행
- 정책 검사 자동화로 수동 오류 방지
- 모든 정책 관리에 단일 패러다임을 사용하여 학습시간 감소
Requirements
- Google Cloud Project
- 해당 Project에 다음의 IAM 권한 필요
- resourcemanager.projects.getIamPolicy
- resourcemanager.projects.get
- Google Cloud SDK
Support
gcloud beta terraform vet
는 현재 Preivew 단계에 있어 GA가 되 때까지는 정식 지원을 받을 수 없으며, GitHub 저장소에서 이슈 티켓을 오픈해야 합니다.
gcloud terraform-tools 설치
gcloud beta terraform vet는 사용하기 위해서는 gcloud terraform component를 설치해야 합니다.
$ gcloud components install terraform-tools
This command requires the `terraform-tools` component to be installed. Would you like to install the `terraform-tools` component to continue command execution? (Y/n)? y
Your current Google Cloud CLI version is: 410.0.0
Installing components from version: 410.0.0
┌──────────────────────────────────────────────────────────────────────────┐
│ These components will be installed. │
├─────────────────────────────┬─────────────────────┬──────────────────────┤
│ Name │ Version │ Size │
├─────────────────────────────┼─────────────────────┼──────────────────────┤
│ Terraform Tools │ 0.8.0 │ 53.3 MiB │
└─────────────────────────────┴─────────────────────┴──────────────────────┘
For the latest full release notes, please visit:
https://cloud.google.com/sdk/release_notes
Do you want to continue (Y/n)? y
╔════════════════════════════════════════════════════════════╗
╠═ Creating update staging area ═╣
╠════════════════════════════════════════════════════════════╣
╠═ Installing: Terraform Tools ═╣
╠════════════════════════════════════════════════════════════╣
╠═ Installing: Terraform Tools ═╣
╠════════════════════════════════════════════════════════════╣
╠═ Creating backup and activating new installation ═╣
╚════════════════════════════════════════════════════════════╝
Performing post processing steps...done.
Update done!
gcloud beta terraform vet 시작하기
-
GitHub에서 Google Cloud Policy library를 clone 합니다.
$ git clone https://github.com/GoogleCloudPlatform/policy-library.git $ cd policy-library
-
샘플 network_enable_firewall_logs 제약조건을 policies/constraints 디렉토리에 복사합니다.
$ cp -fv samples/network_enable_firewall_logs.yaml policies/constraints 'samples/network_enable_firewall_logs.yaml' -> 'policies/constraints/network_enable_firewall_logs.yaml'
-
network_enable_firewall_logs.yaml 파일의 정책 내용은 다음과 같습니다.
$ cat network_enable_firewall_logs.yaml # Copyright 2019 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # apiVersion: constraints.gatekeeper.sh/v1alpha1 kind: GCPNetworkEnableFirewallLogsConstraintV1 metadata: name: enable-network-firewall-logs annotations: description: Ensure Firewall logs is enabled for every firewall in VPC Network bundles.validator.forsetisecurity.org/healthcare-baseline-v1: security spec: severity: high match: ancestries: - "organizations/**" parameters: {}
-
정책이 예상한 대로 작동하는지 확인하기 위해 Terraform 파일을 작성합니다.
resource "google_compute_firewall" "this" { name = "test-firewall" network = "default" direction = "INGRESS" priority = 1000 source_ranges = ["0.0.0.0/0"] source_tags = ["some-tag"] allow { protocol = "tcp" ports = ["80", "8080", "1000-2000"] } }
-
Terraform을 초기화하고 plan 파일을 생성합니다.
$ terraform init Initializing modules... - gke_cluster in ../terraform-google-gke-cluster Initializing the backend... Successfully configured the backend "gcs"! Terraform will automatically use this backend unless the backend configuration changes. Initializing provider plugins... - Finding hashicorp/google versions matching "4.45.0"... - Using hashicorp/google v4.45.0 from the shared cache directory Terraform has created a lock file .terraform.lock.hcl to record the provider selections it made above. Include this file in your version control repository so that Terraform can guarantee to make the same selections by default when you run "terraform init" in the future. ╷ │ Warning: Incomplete lock file information for providers │ │ Due to your customized provider installation methods, Terraform was forced to calculate lock file checksums locally for the following providers: │ - hashicorp/google │ │ The current .terraform.lock.hcl file only includes checksums for linux_amd64, so Terraform running on another platform will fail to install these providers. │ │ To calculate additional checksums for another platform, run: │ terraform providers lock -platform=linux_amd64 │ (where linux_amd64 is the platform to generate) ╵ Terraform has been successfully initialized! You may now begin working with Terraform. Try running "terraform plan" to see any changes that are required for your infrastructure. All Terraform commands should now work. If you ever set or change modules or backend configuration for Terraform, rerun this command to reinitialize your working directory. If you forget, other commands will detect it and remind you to do so if necessary. $ terraform plan
-
Terraform plan 파일을 내보내고 JSON 형식으로 변환합니다.
$ terraform plan -out=validation.tfplan $ terraform show -json ./validation.tfplan > validation.json
-
다음 명령어를 입력하여 Terraform plan이 정책을 준주하는지 확인합니다.
$ gcloud beta terraform vet validation.json --policy-library=. --format=json
-
Terraform plan 파일이 정책을 위반 했다는 것이 확인되어 아래와 같은 에러 메세지를 출력합니다.
[ { "constraint": "GCPNetworkEnableFirewallLogsConstraintV1.enable-network-firewall-logs", "constraint_config": { "api_version": "constraints.gatekeeper.sh/v1alpha1", "kind": "GCPNetworkEnableFirewallLogsConstraintV1", "metadata": { "annotations": { "bundles.validator.forsetisecurity.org/healthcare-baseline-v1": "security", "description": "Ensure Firewall logs is enabled for every firewall in VPC Network", "validation.gcp.forsetisecurity.org/yamlpath": "policies/constraints/network_enable_firewall_logs.yaml" }, "name": "enable-network-firewall-logs" }, "spec": { "match": { "ancestries": [ "organizations/**" ] }, "parameters": {}, "severity": "high" } }, "message": "Firewall logs are disabled in firewall //compute.googleapis.com/projects/prj-sandbox-devops-9999/global/firewalls/test-firewall.", "metadata": { "ancestry_path": "organizations/1085400699340/folders/599651043362/projects/prj-sandbox-devops-9999", "constraint": { "annotations": { "bundles.validator.forsetisecurity.org/healthcare-baseline-v1": "security", "description": "Ensure Firewall logs is enabled for every firewall in VPC Network", "validation.gcp.forsetisecurity.org/yamlpath": "policies/constraints/network_enable_firewall_logs.yaml" }, "labels": {}, "parameters": {} }, "details": { "resource": "//compute.googleapis.com/projects/prj-sandbox-devops-9999/global/firewalls/test-firewall" } }, "resource": "//compute.googleapis.com/projects/prj-sandbox-devops-9999/global/firewalls/test-firewall", "severity": "high" } ]
-
Terraform plan 파일이 정책을 준수하도록 아래와 같이 log를 enable합니다.
resource "google_compute_firewall" "this" { name = "test-firewall" network = "default" direction = "INGRESS" priority = 1000 source_ranges = ["0.0.0.0/0"] source_tags = ["some-tag"] allow { protocol = "tcp" ports = ["80", "8080", "1000-2000"] } log_config { metadata = "INCLUDE_ALL_METADATA" } }
-
이제 Terraform plan을 재새성후 gcloud beta terraform vet으로 다시 검사하면 위반 사항이 없으므로 아무것도 표시되지 않습니다.
$ gcloud beta terraform vet validation.json --policy-library=. --format=json Validating resources...done. []
사용자 정의 제약 조건 템플릿을 작성하는 방법
gcloud beta terraform vet
에서 사용자 정의 제약 조건 템플릿을 작성하여 사용할 수도 있으며, Open Policy Agent(OPA)의 Policy Language인 Rego를 이용합니다.
사용자 정의 정책을 작성하는 방법은 OPA의 Rego 언어와 Google Cloud의 사용자 정의 정책 라이브러리 작성을 참조하시기 바랍니다.
Official Website
- Website
- GitHub
- Golang Package
Reference
- Google Cloud CLI 기반 Terraform 미리보기 관련 정책 가드레일 발표
- Pre-deployment Policy Checks for Terraform using OPA (Open Policy Agent)
- Policy Language
END