Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

tks 요청이 정책에 차단되지 않도록 템플릿 생성 시 가드 추가 #427

Merged
merged 1 commit into from
Apr 25, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion internal/policy-template/policy-operator.go
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ func PolicyTemplateToTksPolicyTemplateCR(policyTemplate *model.PolicyTemplate) *
},
Targets: []Target{{
Target: "admission.k8s.gatekeeper.sh",
Rego: stripCarriageReturn(policyTemplate.Rego),
Rego: stripCarriageReturn(AddTksGuardToRego(policyTemplate.Rego)),
Libs: stripCarriageReturns(policyTemplate.Libs),
}},
Version: policyTemplate.Version,
Expand Down
42 changes: 42 additions & 0 deletions internal/policy-template/tksguard-rego.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package policytemplate

import "regexp"

// (?m)은 멀티라인 모드로 각 라인의 시작이 ^레 매칭되도록 처리
// general_violation 등 violation을 포함하지만 violation이 아닌 정책을 매칭하지 않기 위해 멀티라인 모드 필요함
// OPA 포맷팅하면 violation rule은 공백없이 violation[ 으로 시작하므로 개행 문자 전까지 매칭
const violation_regex_pattern = `(?m)^violation\[[^\n\r]+[\n\r]+`

var violation_regex = regexp.MustCompile(violation_regex_pattern)

// violation 정책 헤드 매칭 후 다음에 삽입할 주석 및 가드 정책
const tks_guard_rego_rulename = ` # Do not delete following line, added by TKS
___not_tks_triggered_request___

`

// 가드 정책의 내용
// 해당 정책이 undefined로 빠지면 violation의 뒷 부분이 평가되지 않음
// 처음 블럭은 userInfo가 설정되지 않은 audit 모드에서 정책 평가가 스킵되는 것을 방지하기 위한처리
// 그 다음 블럭은 username이 tks_users 목록에 없고, tks_groups와 groups의 교집합 크기가 0인 경우에 true이며 그 외는 undefined
// 죽 username 및 groups가 정의된 리스트와 매칭되는 것이 하나라도 있으면 정책이 undefined가 됨
const tks_guard_rego_rulelogic = `
# Do not delete or edit following rule, managed by TKS
___not_tks_triggered_request___ {
not input.review.userInfo
} {
tks_users := {"kubernetes-admin","system:serviceaccount:kube-system:argocd-manager"}
tks_groups := {"system:masters"}

not tks_users[input.review.userInfo.username]

count({g |g := input.review.userInfo.groups[_]; tks_groups[g]}) == 0
}
# Do not delete or edit end`

// violation 정책에 가드 정책 추가
func AddTksGuardToRego(rego string) string {
// 매칭되는 violation 정책의 바디 첫부분에 가드 정책 체크를 추가하고 rego 코드 맨 끝에 실제 코드 내용 추가함
return violation_regex.ReplaceAllString(rego, `${0}`+tks_guard_rego_rulename) +
tks_guard_rego_rulelogic
}
Loading