func validateServiceAccount(client *kclient.Client, ns string, serviceAccount string, hostNetwork bool) error { if !hostNetwork { return nil } // get cluster sccs sccList, err := client.SecurityContextConstraints().List(kapi.ListOptions{}) if err != nil { if !errors.IsUnauthorized(err) { return fmt.Errorf("could not retrieve list of security constraints to verify service account %q: %v", serviceAccount, err) } return nil } // get set of sccs applicable to the service account userInfo := serviceaccount.UserInfo(ns, serviceAccount, "") for _, scc := range sccList.Items { if admission.ConstraintAppliesTo(&scc, userInfo) { switch { case hostNetwork && scc.AllowHostNetwork: return nil } } } return fmt.Errorf("service account %q is not allowed to access the host network on nodes, needs access via a security context constraint", serviceAccount) }
func validateServiceAccount(kClient *kclient.Client, ns string, sa string) error { // get cluster sccs sccList, err := kClient.SecurityContextConstraints().List(labels.Everything(), fields.Everything()) if err != nil { return fmt.Errorf("unable to validate service account %v", err) } // get set of sccs applicable to the service account userInfo := serviceaccount.UserInfo(ns, sa, "") for _, scc := range sccList.Items { if admission.ConstraintAppliesTo(&scc, userInfo) { if scc.AllowHostPorts { return nil } } } return fmt.Errorf("unable to validate service account, host ports are forbidden") }
func validateServiceAccount(client *kclient.Client, ns string, serviceAccount string, hostNetwork, hostPorts bool) error { if !hostNetwork && !hostPorts { return nil } // get cluster sccs sccList, err := client.SecurityContextConstraints().List(kapi.ListOptions{}) if err != nil { if !errors.IsUnauthorized(err) { return fmt.Errorf("could not retrieve list of security constraints to verify service account %q: %v", serviceAccount, err) } return nil } // get set of sccs applicable to the service account userInfo := serviceaccount.UserInfo(ns, serviceAccount, "") for _, scc := range sccList.Items { if admission.ConstraintAppliesTo(&scc, userInfo) { switch { case hostPorts && scc.AllowHostPorts: return nil case hostNetwork && scc.AllowHostNetwork: return nil } } } if hostNetwork { errMsg := "service account %q is not allowed to access the host network on nodes, grant access with oadm policy add-scc-to-user %s -z %s" return fmt.Errorf(errMsg, serviceAccount, bootstrappolicy.SecurityContextConstraintsHostNetwork, serviceAccount) } if hostPorts { errMsg := "service account %q is not allowed to access host ports on nodes, grant access with oadm policy add-scc-to-user %s -z %s" return fmt.Errorf(errMsg, serviceAccount, bootstrappolicy.SecurityContextConstraintsHostNetwork, serviceAccount) } return nil }