IaC-Terraform 규정 준수
많은 도구로서 IaC는 오류를 도입하거나 설정을 놓칠 수 있습니다. 오류가 발생할 때, 이것은 우리의 골치 아픈 문제가 될 수도 있고, 감사 회사가 우리의 infra의 안전성을 심사할 수도 있습니다.
IaC는 우리가 개발 실천을 실시할 수 있도록 한다. 예를 들어 새로운 변경으로 Pull 요청을 생성할 수 있다. 다른 동료들의 수정, 프레임워크를 테스트하기를 원할 때 이 점은 매우 중요하다. 아마도 공공 언어로 프로그래밍된 IaC 도구를 사용하면 우리의 infra 코드를 검증하는 데 도움을 줄 수 있을 것이다. 그러나 이것은 기술팀에 더욱 적합하고 비기술 언어로 전환하는 것은 복잡할 것이다.개정의 범위를 제한합니다.이 때terraform compliance 프레임워크는 우리가 규칙을 정의하는 데 도움을 줄 수 있을 것 같습니다
우리의 infra를 검증하고 기술과 업무 측면에서 정의한 요구에 부합되는지 확인하십시오.
Terraform compliance는 Terraform이 정의한 인프라 시설의 준수성을 검증하는 프레임워크로 부정적인 테스트와 BDD를 바탕으로 우리의 infra를 공동으로 검증합니다.본고는 이 프레임워크를 어떻게 실현하는지 보여주고 IaC를 배치하는 데 사용되는 DevOps 파이프에 추가하며 AWS는 클라우드 공급자로 사용될 것이다.
요구 사항
Terraform compliance는 코드를 배치하기 전에 이를 검증합니다. docker를 사용하거나 pip를 통해 설치할 수 있습니다.본문에서 우리는 pip를 사용할 것이다.
이게 어떻게 된 일입니까?
Terraform compliance는 통에 사용된 암호화, 양호한 자원 표시 등 인프라가 갖춰야 할 기능을 정의하는 정책을 사용합니다. 이 정책들은 Terraform이 생성한 계획에 따라 실행되고, 행위구동개발(BDD) 원칙에 따라 정의되며, 이러한 원칙은 영어로 정의된 정책을 사용합니다.
terraform을 사용하기 위해서는 정책을 정의하고 BDD 원칙을 사용하는 파일을 만들어야 합니다. 이 파일은feature라고 명명되고 평가하고자 하는 장면을 포함합니다.
파일의 구조는 다음과 같습니다.
기능:검증할 내용에 대한 요약
장면/장면 개요: 다음 BDD 명령을 포함하여 수행할 테스트를 정의합니다.
주어짐: 위아래 문장을 정의하는 데 사용됩니다. 우리가 검사하고자 하는 자원이나 데이터의 목록일 수도 있고, 필터로 볼 수도 있습니다.
WHEN: 위에서 정의한 상하문을 필터합니다. 예를 들어 정의된 상하문이 모든 s3 저장통을 평가한다고 표시하면 표시를 통해 필터를 할 수 있습니다.조건이 통과되지 않으면 실패가 아니라 다음 줄로 넘어가면 된다.
다음: 비슷한 기능이 있는데 조건이 통과되지 않으면 장면이 실패합니다.
그리고: 이것은 우리의 장면에 추가 조건을 정의하는 데 사용됩니다. 이것은 선택할 수 있는 문장입니다.
다음은 모든 자원에 표시가 정의되어 있는지 평가하는 예입니다.
Scenario: Ensure all resources have tags
Given I have resource that supports tags defined
Then it must contain tags
And its value must not be null
각 BDD 명령은 체크 인할 수 있는 기능이 더 많습니다Terraform-compliance documentation.특징문서는 지형계획에 대한 집행이다. 이를 실현하기 위해 지형합규는 TF계획을 입력으로 해야 하기 때문에 우리는 우리의 계획을 외부 문서에 보존하고 이를 지형합규명령에 전달해야 한다. 이따가 우리가 볼 것이다.
위의 기본 해석에 근거하여 우리는 간단한 예를 하나 하자.
손대!!!
이 글은 제가 현재 소속사에서 개최하고 있는 인터넷 세미나의 일부분으로 Github 저장소here is the link를 만들었습니다.이 repo는 terraform에서 정의한 AWS 자원을 포함하고 Github 작업을 사용하여 terraform compliance 프레임워크의 매번 전송을 실행합니다.우리가 수행하려는 모든 작업은 지형 적용 전에 이루어지기 때문에 자원을 만드는 데 돈을 쓰지 않습니다.
.
이 프로젝트는 두 부분으로 나뉘는데 첫 번째 부분은 인프라 시설을 배치하는 지형 코드를 포함하고 리포의 루트 디렉터리에 위치하며 두 번째 부분은compliance라는 폴더로 일부 파일을 포함한다.TF 계획에 따라 평가할 규칙을 확장하고 정의합니다.
지형 코드
#### Data Sources
data "aws_caller_identity" "ID_CURRENT_ACCOUNT" {}
### KMS Policy
data "aws_iam_policy_document" "kms_policy" {
statement {
sid = "Enable IAM User Permissions"
effect = "Allow"
principals {
type = "AWS"
identifiers = ["arn:aws:iam::${data.aws_caller_identity.ID_CURRENT_ACCOUNT.account_id}:root"]
}
actions = [
"*"
]
resources = ["*"]
}
}
##########################
## Secret manager
# KMS ky to encrypt at rest secret manager
module "kms_secret_manager" {
source = "./modules/kms"
NAME = "KMS-SecretManager-${var.environment}"
POLICY = data.aws_iam_policy_document.kms_policy.json
}
module "secret_manager" {
source = "./modules/secret_manager"
NAME = "secret_${var.environment}"
RETENTION = 10
KMS_KEY = module.kms_secret_manager.ARN_KMS
}
module "secret_manager_k8" {
source = "./modules/secret_manager"
NAME = "secret_k8_${var.environment}"
RETENTION = 10
KMS_KEY = module.kms_secret_manager.ARN_KMS
}
resource "aws_s3_bucket" "bucket_test" {
bucket = "my-bucket-forcompliance-test"
server_side_encryption_configuration {
rule {
/*
apply_server_side_encryption_by_default {
sse_algorithm = "AES256"
}
*/
apply_server_side_encryption_by_default {
kms_master_key_id = module.kms_secret_manager.ARN_KMS
sse_algorithm = "aws:kms"
}
}
}
tags = {
Name = "bucket_${var.environment}"
Environment = "develop"
Owner = "DanielR"
}
}
resource "aws_s3_bucket" "bucket_test2" {
bucket = "my-bucket-forcompliance-test"
server_side_encryption_configuration {
rule {
apply_server_side_encryption_by_default {
kms_master_key_id = module.kms_secret_manager.ARN_KMS
sse_algorithm = "aws:kms"
}
}
}
tags = {
Name = "bucket_${var.environment}"
Environment = "develop"
Owner = "DanielR"
}
}
resource "aws_secretsmanager_secret" "secret_manager2" {
name = "test"
recovery_window_in_days = 10
lifecycle {
create_before_destroy = true
}
tags = {
Name = "test"
Environment = "develop"
Owner = "DanielR"
}
}
Terraform code는 KMS 키, 키 관리자를 만듭니다. 이 키들은 KMS와 KMS가 있는 SSE의 s3 메모리통에서 암호화됩니다.Compliance 폴더에는 세 개의 파일이 있는데 각각 하나의 장면을 정의하고 S3에 대해 계속 토론합시다.기능 파일.
Feature: This validates if the s3 buckets has Encryption enabled using KMS
Scenario: Ensure that s3 buckets are encrypted by KMS
Given I have aws_s3_bucket resource configured
When it contain server_side_encryption_configuration
Then it must have apply_server_side_encryption_by_default
Then it must have sse_algorithm
And its value must be "aws:kms"
이 파일을 사용하면 TF Compliance framework에서 TF 코드로 만든 S3 저장소 통의 서버 측 암호화가 활성화되었는지 확인하지만 KMS 키를 사용합니다. 다음은 이 파일에 대한 빠른 설명입니다.주어진 문장은 이 예의 상하문,aws s3 bucket이 정의한 모든 자원을 정의합니다
문장이 상하문을 시간으로 바꿀 때 TF compliance는 정의에 서버 측 암호화 설정이 있는 저장통을 검사합니다.
명령 실행
앞서 언급한 바와 같이 Github 동작을 사용하여 TF compliance 명령을 실행하고 있습니다. 그 목적은 규칙이 계획되기 전에 완성되었는지 자동으로 검증하는 것입니다. 파이프는 TF apply 명령을 허용하고 infra는 정의된 규칙을 준수합니다.
이를 위해서는 지형 평면도를 만들어야 한다. 지형 평면도는 같은 디렉터리에 저장된 파일에 저장해야 한다. 그리고 이것은 TF 규정에 맞는 명령의 입력이 될 것이다.
이를 위해 다음과 같은 작업을 수행할 수 있습니다.
Terraform init
terraform plan -out=plan.out
계획.out은 만들 파일의 이름입니다. 다른 이름을 입력할 수 있습니다.일단 계획을 세우면 TF 준수 명령을 계속 집행할 수 있다. 다음은 이 마법을 실현하는 명령이다.
terraform-compliance -f compliance/ -p plan.out
- f 로고를 사용하여 규칙 (.features 파일) 을 저장하는 폴더를 지정합니다.출력
.
코드를 변경하고 기본 알고리즘으로 s3 메모리통을 암호화합시다.
resource "aws_s3_bucket" "bucket_test" {
bucket = "my-bucket-forcompliance-test"
server_side_encryption_configuration {
rule {
apply_server_side_encryption_by_default {
sse_algorithm = "AES256"
}
}
}
}
TF 규정 준수 명령을 다시 실행하려면 다음을 수행합니다..
이것으로 우리는 프레임워크가 어떻게 작동하는지 검증할 수 있고, 여러 가지 규칙을 정의할 수 있으며, 모든 팀을 위해 이 규칙들이 100% 기술적이지 않기 때문에 검사할 수 있다.
Reference
이 문제에 관하여(IaC-Terraform 규정 준수), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/aws-builders/trusting-in-your-iac-terraform-compliance-4cch텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)