간단한 불리언(boolean) 규칙 예시
SDK를 사용하여 새로운 규칙 CUSTOM-RULE-1을 생성했습니다(즉, snyk-iac-rules template --rule CUSTOM-RULE-1). 그리고 Terraform 리소스가 포함된 매우 간단한 픽스처 파일이 있다고 가정합니다:
Copy resource "aws_redshift_cluster" "denied" {
cluster_identifier = " tf-redshift-cluster "
node_type = " dc1.large "
tags = {
}
} 이제 생성된 Rego를 수정하여 소유자 태그가 지정된 리소스를 강제합니다:
aws_redshift_cluster의 모든 리소스를 열거하는 [name] 변수를 생성합니다. 이 변수는 i, j, name 등 원하는 이름으로 지정할 수 있습니다.
왈러스 연산자(:=)를 사용하여 값을 할당하여 resource := input.resource.aws_redshift_cluster[name]과 같이 리소스 변수에 저장합니다.
각 리소스에 소유자 태그가 존재하는지 확인합니다. 이를 위해 resource.tags.owner 경로가 정의되어 있는지 확인합니다. 정의되어 있지 않으면 정의되지 않은 것으로 평가됩니다. 따라서 NOT 키워드를 앞에 사용하여 TRUE로 평가되도록 합니다. 예를 들어 not resource.tags.owner
수정된 Rego는 다음과 같습니다:
Copy package rules
deny[msg] {
resource := input.resource.aws_redshift_cluster[name]
not resource.tags.owner
msg := {
"publicId": "CUSTOM-RULE-1",
"title": "태그에서 소유자 누락",
"severity": "medium",
"msg": sprintf("input.resource.aws_redshift_cluster[%s].tags", [name]),
"issue": "",
"impact": "",
"remediation": "",
"references": [],
}
} 이 규칙에 대한 테스트는 이 가이드의 시작 부분에 있는 픽스처가 유효하지 않음을 Rego 규칙이 식별할 수 있는지 확인합니다:
논리 AND(logical AND) 예시
위의 예시를 확장하여 두 가지 조건을 모두 충족하는 모든 경우를 허용하도록 규칙을 업데이트해 보십시오:
리소스에 "owner" 태그가 있습니다. AND
리소스에 "description" 태그가 있습니다.
이 새로운 조건을 테스트하려면 template 명령을 사용하여 새 규칙 CUSTOM-RULE-2를 생성하고 다음 픽스처 파일을 작성합니다:
여러 표현식을 함께 연결하면 논리 AND를 표현합니다.
또는 여러 줄에 걸쳐 표현식을 분할하여 ; (AND) 연산자를 생략할 수 있습니다.
이 규칙에 대한 테스트는 CUSTOM-RULE-1과 동일하게 보이지만, 테스트 이름과 testing.evaluate_test_cases 함수에 전달된 처음 두 인수가 다를 것입니다:
논리 OR (logical OR) 예시
OR 기능과 NOT 연산자를 결합하여 위 규칙을 다시 작성할 수도 있습니다.
새 규칙 CUSTOM-RULE-3에서 예시를 업데이트하여 다음 중 하나라도 실패하는 모든 경우를 거부합니다. 즉, 다음 중 하나가 누락된 모든 aws_redshift_cluster 리소스를 거부합니다:
이를 위해 각 경우에 대해 하나씩 두 개의 새 픽스처 파일을 사용합니다:
Rego에서 논리 OR을 표현하려면 동일한 이름으로 여러 규칙 또는 함수를 정의하십시오. 이는 논리 ORarrow-up-right 에 대한 OPA 문서에도 설명되어 있습니다.
먼저 각 태그에 대한 NOT을 구현하는 함수를 추가합니다. 그런 다음 리소스를 사용하여 이 함수를 호출합니다:
이렇게 하면 거부되는 모든 규칙이 성공적으로 반환됩니다.
이 규칙에 대한 테스트는 이제 논리 OR이 예상대로 작동함을 보여주기 위해 여러 테스트 케이스를 포함할 것입니다:
이를 더욱 확장하여 세 번째 조건을 추가합니다. 다음 중 하나라도 누락된 모든 리소스를 거부합니다:
소유자의 이메일이 "@corp-domain.com" 도메인에 속하지 않음
이 규칙에 대한 테스트는 이전 예시의 테스트와 매우 유사하게 보일 것이며 자체 픽스처 파일도 필요할 것입니다.
이제 더 많은 복잡성을 추가하고 다음을 확인한다고 가정해 봅시다:
태그 유형이 "user"인 경우 "email" 태그도 존재합니다.
그렇지 않은 경우 다른 유형이 "service"라고 가정하면 serviceDescription이 있습니다.
이 두 가지는 상호 배타적입니다. 첫 번째 조건이 적용되면 두 번째 조건은 적용되지 않고 그 반대도 마찬가지입니다.
이를 위해 checkTags 헬퍼 함수를 사용하도록 코드를 리팩토링할 수 있습니다. 이는 태그가 있는지 여부를 확인하고, OR과 함께 위의 두 가지 조건도 확인할 수 있습니다.
이를 XOR로 변환하려면 else 규칙을 사용할 수 있습니다:
직접 시도해 보려면 이 OPA Playgroundarrow-up-right 에서 동일한 예시를 사용하십시오.
이 규칙에 대한 테스트는 이전 예시의 테스트와 매우 유사하게 보일 것이며 자체 픽스처 파일도 필요할 것입니다.
리소스를 리소스 배열에 추가하여 많은 리소스를 반복할 수도 있습니다.
이를 활용하는 한 가지 방법은 거부 목록 규칙을 구현하는 것입니다.
예를 들어, Kubernetes ConfigMap을 정의하는 경우 암호, 비밀 키, 액세스 토큰과 같은 민감한 정보를 저장하는 데 사용할 수 없도록 해야 합니다.
다음과 같이 거부 목록에 민감한 토큰 그룹을 정의하여 이를 수행하고 "민감한 정보"로 정의된 내용을 시간이 지남에 따라 확장할 수 있습니다:
"pass", "secret", "key", "token" 부분 문자열을 포함하는 모든 키는 민감한 것으로 간주될 수 있으므로 ConfigMap에 포함되어서는 안 됩니다.