Terraform Cloud 기준으로,
Terraform Cloud Free Tier는 Sentinel을 사용하지 못한다.
Sentinel
‘보초’라는 뜻으로 HashiCorp Enterprise 제품에 통합된 Policy-as-Code 프레임워크다.
Terraform Cloud에서 별도의 설정없이 Plan을 실행할 때 절차는 다음과 같다.
•
Plan → Cost estimation → Apply
Sentinel을 적용하면 Plan과 Apply 사이에 단계가 하나 더 생성되며, Sentinel을 활성화하고 간단한 Rule을 적용하여 테스트 해봤다.
1. Github에 Sentinel 구성
Sentinel 테스트를 위한 Policy는 AWS에 배포하는 Resource의 Region을 강제하는 정책이다.
Repository를 하나 생성해서 아래와 같이 2개의 파일을 작성하자 (동일한 경로에 생성)
•
sentinel.hcl
policy "demo" {
# enforcement_level = "advisory"
enforcement_level = "soft-mandatory"
# enforcement_level = "hard-mandatory"
}
JSON
복사
각 enforcement_level은 다음과 같다.
◦
advisory : 단순히 어떤 정책을 만족하지 않았는지에 대한 정보 및 경고만 반환합니다.
◦
soft-mandatory : 정책 위반시 사용자가 통과시켜야만 배포가 가능합니다.
(이를 통해 명시적 배폴로 정책 위반에 대한 부인을 방지할 수 있습니다.)
◦
hard-mandatory : 정책 준수가 강제됩니다. 정책을 제거하지 않는이상 모든 정책을 만족해야만 배포할 수 있습니다. 요구사항이 예외없이 만족해야하는 상황에서 사용해야 합니다.
•
demo.sentinel
import "tfconfig"
import "tfplan"
import "strings"
# Initialize array of regions found in AWS providers
region_values = []
# Allowed Regions
allowed_regions = "ap-northeast-1"
# Iterate through all AWS providers in root module
if ((length(tfconfig.providers) else 0) > 0) {
providers = tfconfig.providers
if "aws" in keys(providers) {
aws = tfconfig.providers.aws
aliases = aws["alias"]
for aliases as alias, data {
print ( "alias is: ", alias )
region = data["config"]["region"]
if region matches "\\$\\{var\\.(.*)\\}" {
# AWS provider was configured with variable
print ( "region is a variable" )
region_variable = strings.trim_suffix(strings.trim_prefix(region, "${var."), "}")
print ( "region variable is: ", region_variable )
print ( "Value of region is: ", tfplan.variables[region_variable] )
region_value = tfplan.variables[region_variable]
region_values += [region_value]
} else {
print ( "region is a hard-coded value" )
print ( "Value of region is: ", region )
region_value = region
region_values += [region_value]
}
}
}
}
# Print all regions found in AWS providers
print ( "region_values is: ", region_values )
aws_region_valid = rule {
all region_values as rv {
rv in allowed_regions
}
}
main = rule {
(aws_region_valid) else true
}
JSON
복사
2. Terraform Cloud 설정
1.
Terraform Cloud의 Settings에서 Policy sets를 생성한다.
Connect a new policy set 클릭
3.
Scope of Policies : Sentinel 정보를 적용할 범위를 지정한다.
•
모든 Workspaces에 적용하려면 all
•
원하는 Workspaces만 적용 하려면 selected
4.
생성된 Policy Set 확인 가능 (selected로 생성해서 0 Workspaces가 적용된 것으로 표시)
3. Sentinel 적용 확인
demo.sentinel 파일의 조건에 따라서 Policy Check 결과를 확인해보자
1.
allowed_regions = "ap-northeast-1" 일 때 서울에 리소스를 배포
2.
allowed_regions = "ap-northeast-2" 일 때
4. 마무리
간단히 Sentinel이 어떻게 작동하는지에 대해서 실습해봤다.
Sentinel을 사용할 때의 최종 목표는 Infra의 보안 요구사항을 사전에 정의한 후 Sentinel + Terraform 조합으로 IaC를 관리하는 것이다.
•
Terraform으로 Resource를 배포할 때 Sentinel에 의해 보안 요구사항이 사전 점검된다.
•
보안 Policy에 대해서도 Code로 관리하여 가시성을 높힐 수 있다.
참고자료