mirror of
https://github.com/kata-containers/kata-containers.git
synced 2025-09-18 23:39:30 +00:00
policy: improve pod namespace validation
- Remove default_namespace from settings - Ensure container namespaces in a pod match each other in case no namespace is specified in the YAML Signed-off-by: Saul Paredes <saulparedes@microsoft.com>
This commit is contained in:
@@ -305,7 +305,6 @@
|
|||||||
"oci_version": "1.1.0"
|
"oci_version": "1.1.0"
|
||||||
},
|
},
|
||||||
"cluster_config": {
|
"cluster_config": {
|
||||||
"default_namespace": "default",
|
|
||||||
"pause_container_image": "mcr.microsoft.com/oss/kubernetes/pause:3.6"
|
"pause_container_image": "mcr.microsoft.com/oss/kubernetes/pause:3.6"
|
||||||
},
|
},
|
||||||
"request_defaults": {
|
"request_defaults": {
|
||||||
|
@@ -68,7 +68,7 @@ CreateContainerRequest:= {"ops": ops, "allowed": true} {
|
|||||||
# check sandbox name
|
# check sandbox name
|
||||||
sandbox_name = i_oci.Annotations[S_NAME_KEY]
|
sandbox_name = i_oci.Annotations[S_NAME_KEY]
|
||||||
add_sandbox_name_to_state := state_allows("sandbox_name", sandbox_name)
|
add_sandbox_name_to_state := state_allows("sandbox_name", sandbox_name)
|
||||||
ops := concat_op_if_not_null(ops_builder, add_sandbox_name_to_state)
|
ops_builder1 := concat_op_if_not_null(ops_builder, add_sandbox_name_to_state)
|
||||||
|
|
||||||
# Check if any element from the policy_data.containers array allows the input request.
|
# Check if any element from the policy_data.containers array allows the input request.
|
||||||
some p_container in policy_data.containers
|
some p_container in policy_data.containers
|
||||||
@@ -81,6 +81,13 @@ CreateContainerRequest:= {"ops": ops, "allowed": true} {
|
|||||||
|
|
||||||
p_oci := p_container.OCI
|
p_oci := p_container.OCI
|
||||||
|
|
||||||
|
# check namespace
|
||||||
|
p_namespace := p_oci.Annotations[S_NAMESPACE_KEY]
|
||||||
|
i_namespace := i_oci.Annotations[S_NAMESPACE_KEY]
|
||||||
|
print ("CreateContainerRequest: p_namespace =", p_namespace, "i_namespace =", i_namespace)
|
||||||
|
add_namespace_to_state := allow_namespace(p_namespace, i_namespace)
|
||||||
|
ops := concat_op_if_not_null(ops_builder1, add_namespace_to_state)
|
||||||
|
|
||||||
print("CreateContainerRequest: p Version =", p_oci.Version, "i Version =", i_oci.Version)
|
print("CreateContainerRequest: p Version =", p_oci.Version, "i Version =", i_oci.Version)
|
||||||
p_oci.Version == i_oci.Version
|
p_oci.Version == i_oci.Version
|
||||||
|
|
||||||
@@ -131,6 +138,18 @@ allow_create_container_input {
|
|||||||
print("allow_create_container_input: true")
|
print("allow_create_container_input: true")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
allow_namespace(p_namespace, i_namespace) = add_namespace {
|
||||||
|
p_namespace == i_namespace
|
||||||
|
add_namespace := null
|
||||||
|
print("allow_namespace 1: input namespace matches policy data")
|
||||||
|
}
|
||||||
|
|
||||||
|
allow_namespace(p_namespace, i_namespace) = add_namespace {
|
||||||
|
p_namespace == ""
|
||||||
|
print("allow_namespace 2: no namespace found on policy data")
|
||||||
|
add_namespace := state_allows("namespace", i_namespace)
|
||||||
|
}
|
||||||
|
|
||||||
# value hasn't been seen before, save it to state
|
# value hasn't been seen before, save it to state
|
||||||
state_allows(key, value) = action {
|
state_allows(key, value) = action {
|
||||||
state := get_state()
|
state := get_state()
|
||||||
@@ -241,12 +260,9 @@ allow_by_anno(p_oci, i_oci, p_storages, i_storages) {
|
|||||||
allow_by_sandbox_name(p_oci, i_oci, p_storages, i_storages, s_name) {
|
allow_by_sandbox_name(p_oci, i_oci, p_storages, i_storages, s_name) {
|
||||||
print("allow_by_sandbox_name: start")
|
print("allow_by_sandbox_name: start")
|
||||||
|
|
||||||
p_namespace := p_oci.Annotations[S_NAMESPACE_KEY]
|
|
||||||
i_namespace := i_oci.Annotations[S_NAMESPACE_KEY]
|
i_namespace := i_oci.Annotations[S_NAMESPACE_KEY]
|
||||||
print("allow_by_sandbox_name: p_namespace =", p_namespace, "i_namespace =", i_namespace)
|
|
||||||
p_namespace == i_namespace
|
|
||||||
|
|
||||||
allow_by_container_types(p_oci, i_oci, s_name, p_namespace)
|
allow_by_container_types(p_oci, i_oci, s_name, i_namespace)
|
||||||
allow_by_bundle_or_sandbox_id(p_oci, i_oci, p_storages, i_storages)
|
allow_by_bundle_or_sandbox_id(p_oci, i_oci, p_storages, i_storages)
|
||||||
allow_process(p_oci, i_oci, s_name)
|
allow_process(p_oci, i_oci, s_name)
|
||||||
|
|
||||||
|
@@ -388,8 +388,6 @@ pub struct CommonData {
|
|||||||
/// Configuration from "kubectl config".
|
/// Configuration from "kubectl config".
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||||
pub struct ClusterConfig {
|
pub struct ClusterConfig {
|
||||||
default_namespace: String,
|
|
||||||
|
|
||||||
/// Pause container image reference.
|
/// Pause container image reference.
|
||||||
pub pause_container_image: String,
|
pub pause_container_image: String,
|
||||||
}
|
}
|
||||||
@@ -532,15 +530,7 @@ impl AgentPolicy {
|
|||||||
let mut root = c_settings.Root.clone();
|
let mut root = c_settings.Root.clone();
|
||||||
root.Readonly = yaml_container.read_only_root_filesystem();
|
root.Readonly = yaml_container.read_only_root_filesystem();
|
||||||
|
|
||||||
let namespace = match resource.get_namespace() {
|
let namespace = resource.get_namespace().unwrap_or_default();
|
||||||
Some(ns) if !ns.is_empty() => ns,
|
|
||||||
_ => self
|
|
||||||
.config
|
|
||||||
.settings
|
|
||||||
.cluster_config
|
|
||||||
.default_namespace
|
|
||||||
.clone(),
|
|
||||||
};
|
|
||||||
|
|
||||||
let use_host_network = resource.use_host_network();
|
let use_host_network = resource.use_host_network();
|
||||||
let annotations = get_container_annotations(
|
let annotations = get_container_annotations(
|
||||||
|
@@ -15,7 +15,6 @@ setup() {
|
|||||||
pod_yaml="${pod_config_dir}/pod-cpu-defaults.yaml"
|
pod_yaml="${pod_config_dir}/pod-cpu-defaults.yaml"
|
||||||
|
|
||||||
policy_settings_dir="$(create_tmp_policy_settings_dir "${pod_config_dir}")"
|
policy_settings_dir="$(create_tmp_policy_settings_dir "${pod_config_dir}")"
|
||||||
set_namespace_to_policy_settings "${policy_settings_dir}" "${namespace_name}"
|
|
||||||
auto_generate_policy "${policy_settings_dir}" "${pod_yaml}"
|
auto_generate_policy "${policy_settings_dir}" "${pod_yaml}"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -155,9 +155,6 @@ create_common_genpolicy_settings() {
|
|||||||
|
|
||||||
cp "${default_genpolicy_settings_dir}/genpolicy-settings.json" "${genpolicy_settings_dir}"
|
cp "${default_genpolicy_settings_dir}/genpolicy-settings.json" "${genpolicy_settings_dir}"
|
||||||
cp "${default_genpolicy_settings_dir}/rules.rego" "${genpolicy_settings_dir}"
|
cp "${default_genpolicy_settings_dir}/rules.rego" "${genpolicy_settings_dir}"
|
||||||
|
|
||||||
# Set the default namespace of Kata CI tests in the genpolicy settings.
|
|
||||||
set_namespace_to_policy_settings "${genpolicy_settings_dir}" "${TEST_CLUSTER_NAMESPACE}"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# If auto-generated policy testing is enabled, make a copy of the common genpolicy settings
|
# If auto-generated policy testing is enabled, make a copy of the common genpolicy settings
|
||||||
@@ -273,21 +270,6 @@ add_copy_from_guest_to_policy_settings() {
|
|||||||
add_exec_to_policy_settings "${policy_settings_dir}" "${exec_command[@]}"
|
add_exec_to_policy_settings "${policy_settings_dir}" "${exec_command[@]}"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Change genpolicy settings to use a pod namespace different than "default".
|
|
||||||
set_namespace_to_policy_settings() {
|
|
||||||
local -r settings_dir="$1"
|
|
||||||
local -r namespace="$2"
|
|
||||||
|
|
||||||
auto_generate_policy_enabled || return 0
|
|
||||||
|
|
||||||
info "${settings_dir}/genpolicy-settings.json: namespace: ${namespace}"
|
|
||||||
jq --arg namespace "${namespace}" \
|
|
||||||
'.cluster_config.default_namespace |= $namespace' \
|
|
||||||
"${settings_dir}/genpolicy-settings.json" > \
|
|
||||||
"${settings_dir}/new-genpolicy-settings.json"
|
|
||||||
mv "${settings_dir}/new-genpolicy-settings.json" "${settings_dir}/genpolicy-settings.json"
|
|
||||||
}
|
|
||||||
|
|
||||||
hard_coded_policy_tests_enabled() {
|
hard_coded_policy_tests_enabled() {
|
||||||
# CI is testing hard-coded policies just on a the platforms listed here. Outside of CI,
|
# CI is testing hard-coded policies just on a the platforms listed here. Outside of CI,
|
||||||
# users can enable testing of the same policies (plus the auto-generated policies) by
|
# users can enable testing of the same policies (plus the auto-generated policies) by
|
||||||
|
Reference in New Issue
Block a user