security-policies/bundle/compliance/policy/file/common.rego (28 lines of code) (raw):
package compliance.policy.file.common
import data.compliance.lib.assert
import future.keywords.if
file_ownership_match(user, group, required_user, required_group) if {
user == required_user
group == required_group
} else := false
file_permission_match(filemode, user, group, other) if {
permissions = parse_permission(filemode)
# filemode format {user}{group}{other} e.g. 644
check_permissions(permissions, [user, group, other])
} else := false
file_permission_match_exact(filemode, user, group, other) if {
permissions = parse_permission(filemode)
# filemode format {user}{group}{other} e.g. 644
permissions == [user, group, other]
} else := false
# return a list of file premission [user, group, other]
# cast to numbers
parse_permission(filemode) := [to_number(p) | p := split(filemode, "")[_]]
check_permissions(permissions, max_permissions) if {
assert.all_true([r | some p; r = bits.and(permissions[p], bits.negate(max_permissions[p])) == 0])
} else := false
# check if file is in path
file_in_path(path, file_path) if {
closed_path := concat("", [file_path, "/"]) # make sure last dir name is closed by "/"
contains(closed_path, path)
} else := false