Skip to content

Commit fca697a

Browse files
committed
Add logic to check for new ephemeral containers on pod update and update secret cache if they exist.
1 parent a38edf3 commit fca697a

File tree

2 files changed

+145
-0
lines changed

2 files changed

+145
-0
lines changed

plugin/pkg/auth/authorizer/node/graph_populator.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,10 @@ func (g *graphPopulator) updatePod(oldObj, obj interface{}) {
9494
return
9595
}
9696
if oldPod, ok := oldObj.(*corev1.Pod); ok && oldPod != nil {
97+
// Ephemeral containers can add new secret or config map references to the pod.
98+
hasNewEphemeralContainers := len(pod.Spec.EphemeralContainers) > len(oldPod.Spec.EphemeralContainers)
9799
if (pod.Spec.NodeName == oldPod.Spec.NodeName) && (pod.UID == oldPod.UID) &&
100+
!hasNewEphemeralContainers &&
98101
resourceclaim.PodStatusEqual(oldPod.Status.ResourceClaimStatuses, pod.Status.ResourceClaimStatuses) {
99102
// Node and uid are unchanged, all object references in the pod spec are immutable respectively unmodified (claim statuses).
100103
klog.V(5).Infof("updatePod %s/%s, node unchanged", pod.Namespace, pod.Name)

plugin/pkg/auth/authorizer/node/node_authorizer_test.go

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -856,6 +856,118 @@ func TestNodeAuthorizerSharedResources(t *testing.T) {
856856
}
857857
}
858858

859+
func TestNodeAuthorizerAddEphemeralContainers(t *testing.T) {
860+
g := NewGraph()
861+
g.destinationEdgeThreshold = 1
862+
identifier := nodeidentifier.NewDefaultNodeIdentifier()
863+
authz := NewAuthorizer(g, identifier, bootstrappolicy.NodeRules())
864+
865+
node1 := &user.DefaultInfo{Name: "system:node:node1", Groups: []string{"system:nodes"}}
866+
pod := &corev1.Pod{
867+
ObjectMeta: metav1.ObjectMeta{Name: "pod1-node1", Namespace: "ns1"},
868+
Spec: corev1.PodSpec{
869+
NodeName: "node1",
870+
Volumes: []corev1.Volume{
871+
{VolumeSource: corev1.VolumeSource{Secret: &corev1.SecretVolumeSource{SecretName: "node1-only"}}},
872+
},
873+
},
874+
}
875+
876+
ecNewSecret := corev1.EphemeralContainer{
877+
TargetContainerName: "targetContainerName",
878+
EphemeralContainerCommon: corev1.EphemeralContainerCommon{
879+
Image: "imageURL",
880+
Name: "eph",
881+
Command: []string{"command"},
882+
EnvFrom: []corev1.EnvFromSource{
883+
{
884+
SecretRef: &corev1.SecretEnvSource{
885+
LocalObjectReference: corev1.LocalObjectReference{
886+
Name: "new-secret",
887+
},
888+
Optional: nil,
889+
},
890+
},
891+
},
892+
SecurityContext: &corev1.SecurityContext{
893+
Privileged: &[]bool{true}[0],
894+
},
895+
},
896+
}
897+
898+
ecNewConfigMap := corev1.EphemeralContainer{
899+
TargetContainerName: "targetContainerName",
900+
EphemeralContainerCommon: corev1.EphemeralContainerCommon{
901+
Image: "imageURL",
902+
Name: "eph",
903+
Command: []string{"command"},
904+
EnvFrom: []corev1.EnvFromSource{
905+
{
906+
ConfigMapRef: &corev1.ConfigMapEnvSource{
907+
LocalObjectReference: corev1.LocalObjectReference{
908+
Name: "new-config-map",
909+
},
910+
Optional: nil,
911+
},
912+
},
913+
},
914+
SecurityContext: &corev1.SecurityContext{
915+
Privileged: &[]bool{true}[0],
916+
},
917+
},
918+
}
919+
p := &graphPopulator{}
920+
p.graph = g
921+
p.addPod(pod)
922+
923+
testcases := []struct {
924+
User user.Info
925+
Secret string
926+
ConfigMap string
927+
Decision authorizer.Decision
928+
EphCont *corev1.EphemeralContainer
929+
}{
930+
{User: node1, Decision: authorizer.DecisionAllow, Secret: "node1-only"},
931+
{User: node1, Decision: authorizer.DecisionNoOpinion, Secret: "new-secret"},
932+
{User: node1, Decision: authorizer.DecisionAllow, Secret: "new-secret", EphCont: &ecNewSecret},
933+
{User: node1, Decision: authorizer.DecisionNoOpinion, ConfigMap: "new-config-map"},
934+
{User: node1, Decision: authorizer.DecisionAllow, ConfigMap: "new-config-map", EphCont: &ecNewConfigMap},
935+
}
936+
937+
for i, tc := range testcases {
938+
var (
939+
decision authorizer.Decision
940+
err error
941+
)
942+
if tc.EphCont != nil {
943+
newPod := &corev1.Pod{}
944+
pod.DeepCopyInto(newPod)
945+
newPod.Spec.EphemeralContainers = append(newPod.Spec.EphemeralContainers, *tc.EphCont)
946+
p.updatePod(pod, newPod)
947+
}
948+
949+
if len(tc.Secret) > 0 {
950+
decision, _, err = authz.Authorize(context.Background(), authorizer.AttributesRecord{User: tc.User, ResourceRequest: true, Verb: "get", Resource: "secrets", Namespace: "ns1", Name: tc.Secret})
951+
if err != nil {
952+
t.Errorf("%d: unexpected error: %v", i, err)
953+
continue
954+
}
955+
} else if len(tc.ConfigMap) > 0 {
956+
decision, _, err = authz.Authorize(context.Background(), authorizer.AttributesRecord{User: tc.User, ResourceRequest: true, Verb: "get", Resource: "configmaps", Namespace: "ns1", Name: tc.ConfigMap})
957+
if err != nil {
958+
t.Errorf("%d: unexpected error: %v", i, err)
959+
continue
960+
}
961+
} else {
962+
t.Fatalf("test case must include a request for a Secret")
963+
}
964+
965+
if decision != tc.Decision {
966+
t.Errorf("%d: expected %v, got %v", i, tc.Decision, decision)
967+
}
968+
}
969+
}
970+
859971
type sampleDataOpts struct {
860972
nodes int
861973
namespaces int
@@ -1226,6 +1338,36 @@ func populate(graph *Graph, nodes []*corev1.Node, pods []*corev1.Pod, pvs []*cor
12261338
}
12271339
}
12281340

1341+
func updateMoo(graph *Graph, oldPod *corev1.Pod) {
1342+
p := &graphPopulator{}
1343+
p.graph = graph
1344+
p.addPod(oldPod)
1345+
newPod := oldPod
1346+
newPod.Spec.EphemeralContainers = append(newPod.Spec.EphemeralContainers, corev1.EphemeralContainer{
1347+
TargetContainerName: "targetContainerName",
1348+
EphemeralContainerCommon: corev1.EphemeralContainerCommon{
1349+
Image: "imageURL",
1350+
Name: "eph",
1351+
Command: []string{"command"},
1352+
EnvFrom: []corev1.EnvFromSource{
1353+
{
1354+
SecretRef: &corev1.SecretEnvSource{
1355+
LocalObjectReference: corev1.LocalObjectReference{
1356+
Name: "new-secret",
1357+
},
1358+
Optional: nil,
1359+
},
1360+
},
1361+
},
1362+
SecurityContext: &corev1.SecurityContext{
1363+
Privileged: &[]bool{true}[0],
1364+
},
1365+
},
1366+
})
1367+
1368+
p.updatePod(oldPod, newPod)
1369+
}
1370+
12291371
func randomSubset(a, b int) []int {
12301372
if b < a {
12311373
b = a

0 commit comments

Comments
 (0)