in pilot/pkg/security/authn/v1beta1/policy_applier.go [398:468]
func ComposePeerAuthentication(rootNamespace string, configs []*config.Config) *v1beta1.PeerAuthentication {
var meshCfg, namespaceCfg, workloadCfg *config.Config
// Initial outputPolicy is set to a PERMISSIVE.
outputPolicy := v1beta1.PeerAuthentication{
Mtls: &v1beta1.PeerAuthentication_MutualTLS{
Mode: v1beta1.PeerAuthentication_MutualTLS_PERMISSIVE,
},
}
for _, cfg := range configs {
spec := cfg.Spec.(*v1beta1.PeerAuthentication)
if spec.Selector == nil || len(spec.Selector.MatchLabels) == 0 {
// Namespace-level or mesh-level policy
if cfg.Namespace == rootNamespace {
if meshCfg == nil || cfg.CreationTimestamp.Before(meshCfg.CreationTimestamp) {
authnLog.Debugf("Switch selected mesh policy to %s.%s (%v)", cfg.Name, cfg.Namespace, cfg.CreationTimestamp)
meshCfg = cfg
}
} else {
if namespaceCfg == nil || cfg.CreationTimestamp.Before(namespaceCfg.CreationTimestamp) {
authnLog.Debugf("Switch selected namespace policy to %s.%s (%v)", cfg.Name, cfg.Namespace, cfg.CreationTimestamp)
namespaceCfg = cfg
}
}
} else if cfg.Namespace != rootNamespace {
// Workload-level policy, aka the one with selector and not in root namespace.
if workloadCfg == nil || cfg.CreationTimestamp.Before(workloadCfg.CreationTimestamp) {
authnLog.Debugf("Switch selected workload policy to %s.%s (%v)", cfg.Name, cfg.Namespace, cfg.CreationTimestamp)
workloadCfg = cfg
}
}
}
// Process in mesh, namespace, workload order to resolve inheritance (UNSET)
if meshCfg != nil && !isMtlsModeUnset(meshCfg.Spec.(*v1beta1.PeerAuthentication).Mtls) {
// If mesh policy is defined, update parent policy to mesh policy.
outputPolicy.Mtls = meshCfg.Spec.(*v1beta1.PeerAuthentication).Mtls
}
if namespaceCfg != nil && !isMtlsModeUnset(namespaceCfg.Spec.(*v1beta1.PeerAuthentication).Mtls) {
// If namespace policy is defined, update output policy to namespace policy. This means namespace
// policy overwrite mesh policy.
outputPolicy.Mtls = namespaceCfg.Spec.(*v1beta1.PeerAuthentication).Mtls
}
var workloadPolicy *v1beta1.PeerAuthentication
if workloadCfg != nil {
workloadPolicy = workloadCfg.Spec.(*v1beta1.PeerAuthentication)
}
if workloadPolicy != nil && !isMtlsModeUnset(workloadPolicy.Mtls) {
// If workload policy is defined, update parent policy to workload policy.
outputPolicy.Mtls = workloadPolicy.Mtls
}
if workloadPolicy != nil && workloadPolicy.PortLevelMtls != nil {
outputPolicy.PortLevelMtls = make(map[uint32]*v1beta1.PeerAuthentication_MutualTLS, len(workloadPolicy.PortLevelMtls))
for port, mtls := range workloadPolicy.PortLevelMtls {
if isMtlsModeUnset(mtls) {
// Inherit from workload level.
outputPolicy.PortLevelMtls[port] = outputPolicy.Mtls
} else {
outputPolicy.PortLevelMtls[port] = mtls
}
}
}
return &outputPolicy
}