Skip to content

Commit 9512daf

Browse files
authored
Security/check sa for gw secrets (istio#57716)
* Verify identity for gw secrets * bootstrap fix * Debug logs for identity mismatch * releasenotes * lint * lint * use annotation * lint * Fixup tests * gen * Check for unmanaged gateways * make gen * Use IsManaged
1 parent a6e5242 commit 9512daf

34 files changed

+191
-19
lines changed

pilot/pkg/config/kube/gateway/gateway_collection.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
gateway "sigs.k8s.io/gateway-api/apis/v1beta1"
2626
gatewayx "sigs.k8s.io/gateway-api/apisx/v1alpha1"
2727

28+
"istio.io/api/annotation"
2829
istio "istio.io/api/networking/v1alpha3"
2930
"istio.io/istio/pilot/pkg/model"
3031
"istio.io/istio/pkg/config"
@@ -164,6 +165,11 @@ func ListenerSetCollection(
164165
meta[constants.InternalGatewaySemantics] = constants.GatewaySemanticsGateway
165166
meta[model.InternalGatewayServiceAnnotation] = strings.Join(gatewayServices, ",")
166167
meta[constants.InternalParentNamespace] = parentGwObj.Namespace
168+
serviceAccountName := model.GetOrDefault(
169+
obj.GetAnnotations()[annotation.GatewayServiceAccount.Name],
170+
getDefaultName(obj.GetName(), &parentGwObj.Spec, classInfo.disableNameSuffix),
171+
)
172+
meta[constants.InternalServiceAccount] = serviceAccountName
167173

168174
// Each listener generates an Istio Gateway with a single Server. This allows binding to a specific listener.
169175
gatewayConfig := config.Config{
@@ -268,6 +274,17 @@ func GatewayCollection(
268274
return status, nil
269275
}
270276

277+
// See: https://istio.io/latest/docs/tasks/traffic-management/ingress/gateway-api/#manual-deployment
278+
// If we set and address of type hostname, then we have no idea what service accounts the gateway workloads will use.
279+
// Thus, we don't enforce service account name restrictions (still look at namespaces though).
280+
serviceAccountName := ""
281+
if IsManaged(&obj.Spec) {
282+
serviceAccountName = model.GetOrDefault(
283+
obj.GetAnnotations()[annotation.GatewayServiceAccount.Name],
284+
getDefaultName(obj.GetName(), &kgw, classInfo.disableNameSuffix),
285+
)
286+
}
287+
271288
for i, l := range kgw.Listeners {
272289
server, updatedStatus, programmed := buildListener(ctx, configMaps, secrets, grants, namespaces, obj, status.Listeners, kgw, l, i, controllerName, nil)
273290
status.Listeners = updatedStatus
@@ -282,6 +299,8 @@ func GatewayCollection(
282299
meta[constants.InternalGatewaySemantics] = constants.GatewaySemanticsGateway
283300
meta[model.InternalGatewayServiceAnnotation] = strings.Join(gatewayServices, ",")
284301

302+
meta[constants.InternalServiceAccount] = serviceAccountName
303+
285304
// Each listener generates an Istio Gateway with a single Server. This allows binding to a specific listener.
286305
gatewayConfig := config.Config{
287306
Meta: config.Meta{

pilot/pkg/config/kube/gateway/testdata/backend-tls-policy.yaml.golden

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ metadata:
55
internal.istio.io/gateway-semantics: gateway
66
internal.istio.io/gateway-service: istio-ingressgateway.istio-system.svc.domain.suffix
77
internal.istio.io/parents: Gateway/gateway/default.istio-system
8+
internal.istio.io/service-account-name: ""
89
name: gateway~istio-autogenerated-k8s-gateway~default
910
namespace: istio-system
1011
spec:

pilot/pkg/config/kube/gateway/testdata/delegated.yaml.golden

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ metadata:
55
internal.istio.io/gateway-semantics: gateway
66
internal.istio.io/gateway-service: istio-ingressgateway.istio-system.svc.domain.suffix
77
internal.istio.io/parents: Gateway/gateway/apple.istio-system
8+
internal.istio.io/service-account-name: ""
89
name: gateway~istio-autogenerated-k8s-gateway~apple
910
namespace: istio-system
1011
spec:
@@ -23,6 +24,7 @@ metadata:
2324
internal.istio.io/gateway-semantics: gateway
2425
internal.istio.io/gateway-service: istio-ingressgateway.istio-system.svc.domain.suffix
2526
internal.istio.io/parents: Gateway/gateway/banana.istio-system
27+
internal.istio.io/service-account-name: ""
2628
name: gateway~istio-autogenerated-k8s-gateway~banana
2729
namespace: istio-system
2830
spec:

pilot/pkg/config/kube/gateway/testdata/eastwest-labelport.yaml.golden

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ metadata:
55
internal.istio.io/gateway-semantics: gateway
66
internal.istio.io/gateway-service: eastwestgateway-istio.istio-system.svc.domain.suffix
77
internal.istio.io/parents: Gateway/eastwestgateway/cross-network.istio-system
8+
internal.istio.io/service-account-name: eastwestgateway-istio
89
name: eastwestgateway~istio-autogenerated-k8s-gateway~cross-network
910
namespace: istio-system
1011
spec:
@@ -25,6 +26,7 @@ metadata:
2526
internal.istio.io/gateway-semantics: gateway
2627
internal.istio.io/gateway-service: eastwestgateway-istio.istio-system.svc.domain.suffix
2728
internal.istio.io/parents: Gateway/eastwestgateway/istiod-grpc.istio-system
29+
internal.istio.io/service-account-name: eastwestgateway-istio
2830
name: eastwestgateway~istio-autogenerated-k8s-gateway~istiod-grpc
2931
namespace: istio-system
3032
spec:
@@ -44,6 +46,7 @@ metadata:
4446
internal.istio.io/gateway-semantics: gateway
4547
internal.istio.io/gateway-service: eastwestgateway-istio.istio-system.svc.domain.suffix
4648
internal.istio.io/parents: Gateway/eastwestgateway/istiod-webhook.istio-system
49+
internal.istio.io/service-account-name: eastwestgateway-istio
4750
name: eastwestgateway~istio-autogenerated-k8s-gateway~istiod-webhook
4851
namespace: istio-system
4952
spec:

pilot/pkg/config/kube/gateway/testdata/eastwest-tlsoption.yaml.golden

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ metadata:
55
internal.istio.io/gateway-semantics: gateway
66
internal.istio.io/gateway-service: eastwestgateway-istio.istio-system.svc.domain.suffix
77
internal.istio.io/parents: Gateway/eastwestgateway/cross-network.istio-system
8+
internal.istio.io/service-account-name: eastwestgateway-istio
89
name: eastwestgateway~istio-autogenerated-k8s-gateway~cross-network
910
namespace: istio-system
1011
spec:
@@ -25,6 +26,7 @@ metadata:
2526
internal.istio.io/gateway-semantics: gateway
2627
internal.istio.io/gateway-service: eastwestgateway-istio.istio-system.svc.domain.suffix
2728
internal.istio.io/parents: Gateway/eastwestgateway/istiod-grpc.istio-system
29+
internal.istio.io/service-account-name: eastwestgateway-istio
2830
name: eastwestgateway~istio-autogenerated-k8s-gateway~istiod-grpc
2931
namespace: istio-system
3032
spec:
@@ -44,6 +46,7 @@ metadata:
4446
internal.istio.io/gateway-semantics: gateway
4547
internal.istio.io/gateway-service: eastwestgateway-istio.istio-system.svc.domain.suffix
4648
internal.istio.io/parents: Gateway/eastwestgateway/istiod-webhook.istio-system
49+
internal.istio.io/service-account-name: eastwestgateway-istio
4750
name: eastwestgateway~istio-autogenerated-k8s-gateway~istiod-webhook
4851
namespace: istio-system
4952
spec:

pilot/pkg/config/kube/gateway/testdata/eastwest.yaml.golden

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ metadata:
55
internal.istio.io/gateway-semantics: gateway
66
internal.istio.io/gateway-service: eastwestgateway-istio.istio-system.svc.domain.suffix
77
internal.istio.io/parents: Gateway/eastwestgateway/cross-network.istio-system
8+
internal.istio.io/service-account-name: eastwestgateway-istio
89
name: eastwestgateway~istio-autogenerated-k8s-gateway~cross-network
910
namespace: istio-system
1011
spec:
@@ -25,6 +26,7 @@ metadata:
2526
internal.istio.io/gateway-semantics: gateway
2627
internal.istio.io/gateway-service: eastwestgateway-istio.istio-system.svc.domain.suffix
2728
internal.istio.io/parents: Gateway/eastwestgateway/istiod-grpc.istio-system
29+
internal.istio.io/service-account-name: eastwestgateway-istio
2830
name: eastwestgateway~istio-autogenerated-k8s-gateway~istiod-grpc
2931
namespace: istio-system
3032
spec:
@@ -44,6 +46,7 @@ metadata:
4446
internal.istio.io/gateway-semantics: gateway
4547
internal.istio.io/gateway-service: eastwestgateway-istio.istio-system.svc.domain.suffix
4648
internal.istio.io/parents: Gateway/eastwestgateway/istiod-webhook.istio-system
49+
internal.istio.io/service-account-name: eastwestgateway-istio
4750
name: eastwestgateway~istio-autogenerated-k8s-gateway~istiod-webhook
4851
namespace: istio-system
4952
spec:

pilot/pkg/config/kube/gateway/testdata/grpc.yaml.golden

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ metadata:
55
internal.istio.io/gateway-semantics: gateway
66
internal.istio.io/gateway-service: istio-ingressgateway.istio-system.svc.domain.suffix
77
internal.istio.io/parents: Gateway/gateway/default.istio-system
8+
internal.istio.io/service-account-name: ""
89
name: gateway~istio-autogenerated-k8s-gateway~default
910
namespace: istio-system
1011
spec:

pilot/pkg/config/kube/gateway/testdata/http.yaml.golden

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ metadata:
55
internal.istio.io/gateway-semantics: gateway
66
internal.istio.io/gateway-service: istio-ingressgateway.istio-system.svc.domain.suffix
77
internal.istio.io/parents: Gateway/gateway/default.istio-system
8+
internal.istio.io/service-account-name: ""
89
name: gateway~istio-autogenerated-k8s-gateway~default
910
namespace: istio-system
1011
spec:

pilot/pkg/config/kube/gateway/testdata/invalid.yaml.golden

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ metadata:
55
internal.istio.io/gateway-semantics: gateway
66
internal.istio.io/gateway-service: istio-ingressgateway.istio-system.svc.domain.suffix
77
internal.istio.io/parents: Gateway/gateway/default.istio-system
8+
internal.istio.io/service-account-name: ""
89
name: gateway~istio-autogenerated-k8s-gateway~default
910
namespace: istio-system
1011
spec:
@@ -23,6 +24,7 @@ metadata:
2324
internal.istio.io/gateway-semantics: gateway
2425
internal.istio.io/gateway-service: fake-service.com
2526
internal.istio.io/parents: Gateway/invalid-service/default.istio-system
27+
internal.istio.io/service-account-name: ""
2628
name: invalid-service~istio-autogenerated-k8s-gateway~default
2729
namespace: istio-system
2830
spec:
@@ -41,6 +43,7 @@ metadata:
4143
internal.istio.io/gateway-semantics: gateway
4244
internal.istio.io/gateway-service: istio-ingressgateway.istio-system.svc.domain.suffix
4345
internal.istio.io/parents: Gateway/target-port-reference/default.istio-system
46+
internal.istio.io/service-account-name: ""
4447
name: target-port-reference~istio-autogenerated-k8s-gateway~default
4548
namespace: istio-system
4649
spec:

pilot/pkg/config/kube/gateway/testdata/isolation.yaml.golden

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ metadata:
55
internal.istio.io/gateway-semantics: gateway
66
internal.istio.io/gateway-service: isolation-istio.gateway-conformance-infra.svc.domain.suffix
77
internal.istio.io/parents: Gateway/isolation/abc-foo-example-com.gateway-conformance-infra
8+
internal.istio.io/service-account-name: isolation-istio
89
name: isolation~istio-autogenerated-k8s-gateway~abc-foo-example-com
910
namespace: gateway-conformance-infra
1011
spec:
@@ -23,6 +24,7 @@ metadata:
2324
internal.istio.io/gateway-semantics: gateway
2425
internal.istio.io/gateway-service: isolation-istio.gateway-conformance-infra.svc.domain.suffix
2526
internal.istio.io/parents: Gateway/isolation/empty-hostname.gateway-conformance-infra
27+
internal.istio.io/service-account-name: isolation-istio
2628
name: isolation~istio-autogenerated-k8s-gateway~empty-hostname
2729
namespace: gateway-conformance-infra
2830
spec:
@@ -41,6 +43,7 @@ metadata:
4143
internal.istio.io/gateway-semantics: gateway
4244
internal.istio.io/gateway-service: isolation-istio.gateway-conformance-infra.svc.domain.suffix
4345
internal.istio.io/parents: Gateway/isolation/wildcard-example-com.gateway-conformance-infra
46+
internal.istio.io/service-account-name: isolation-istio
4447
name: isolation~istio-autogenerated-k8s-gateway~wildcard-example-com
4548
namespace: gateway-conformance-infra
4649
spec:
@@ -59,6 +62,7 @@ metadata:
5962
internal.istio.io/gateway-semantics: gateway
6063
internal.istio.io/gateway-service: isolation-istio.gateway-conformance-infra.svc.domain.suffix
6164
internal.istio.io/parents: Gateway/isolation/wildcard-foo-example-com.gateway-conformance-infra
65+
internal.istio.io/service-account-name: isolation-istio
6266
name: isolation~istio-autogenerated-k8s-gateway~wildcard-foo-example-com
6367
namespace: gateway-conformance-infra
6468
spec:

0 commit comments

Comments
 (0)