@@ -438,6 +438,10 @@ type authContext struct {
438
438
kubeServers []types.KubeServer
439
439
// apiResource holds the information about the requested API resource.
440
440
apiResource apiResource
441
+ // isLocalKubernetesCluster is true if the target cluster is served by this teleport service.
442
+ // It is false if the target cluster is served by another teleport service or a different
443
+ // Teleport cluster.
444
+ isLocalKubernetesCluster bool
441
445
}
442
446
443
447
func (c authContext ) String () string {
@@ -775,7 +779,8 @@ func (f *Forwarder) setupContext(
775
779
return nil , trace .NotFound ("Kubernetes cluster %q not found" , kubeCluster )
776
780
}
777
781
}
778
- if f .isLocalKubeCluster (isRemoteCluster , kubeCluster ) {
782
+ isLocalKubernetesCluster := f .isLocalKubeCluster (isRemoteCluster , kubeCluster )
783
+ if isLocalKubernetesCluster {
779
784
kubeResource , apiResource , err = f .parseResourceFromRequest (req , kubeCluster )
780
785
if err != nil {
781
786
return nil , trace .Wrap (err )
@@ -809,10 +814,11 @@ func (f *Forwarder) setupContext(
809
814
remoteAddr : utils.NetAddr {AddrNetwork : "tcp" , Addr : req .RemoteAddr },
810
815
isRemote : isRemoteCluster ,
811
816
},
812
- kubeServers : kubeServers ,
813
- requestVerb : apiResource .getVerb (req ),
814
- apiResource : apiResource ,
815
- kubeResource : kubeResource ,
817
+ kubeServers : kubeServers ,
818
+ requestVerb : apiResource .getVerb (req ),
819
+ apiResource : apiResource ,
820
+ kubeResource : kubeResource ,
821
+ isLocalKubernetesCluster : isLocalKubernetesCluster ,
816
822
}, nil
817
823
}
818
824
@@ -865,9 +871,11 @@ func (f *Forwarder) emitAuditEvent(req *http.Request, sess *clusterSession, stat
865
871
)
866
872
defer span .End ()
867
873
868
- if sess .noAuditEvents {
874
+ // If the session is not local, don't emit the event.
875
+ if ! sess .isLocalKubernetesCluster {
869
876
return
870
877
}
878
+
871
879
r := sess .apiResource
872
880
if r .skipEvent {
873
881
return
@@ -1161,7 +1169,7 @@ func (f *Forwarder) join(ctx *authContext, w http.ResponseWriter, req *http.Requ
1161
1169
return nil , trace .Wrap (err )
1162
1170
}
1163
1171
1164
- if ! f . isLocalKubeCluster ( ctx . teleportCluster . isRemote , ctx . kubeClusterName ) {
1172
+ if ! sess . isLocalKubernetesCluster {
1165
1173
return f .remoteJoin (ctx , w , req , p , sess )
1166
1174
}
1167
1175
@@ -1658,7 +1666,7 @@ func (f *Forwarder) exec(authCtx *authContext, w http.ResponseWriter, req *http.
1658
1666
}
1659
1667
// proxy.Close closes the underlying connection and releases the resources.
1660
1668
defer proxy .Close ()
1661
- if sess .noAuditEvents {
1669
+ if ! sess .isLocalKubernetesCluster {
1662
1670
// We're forwarding this to another kubernetes_service instance, let it handle multiplexing.
1663
1671
return f .remoteExec (authCtx , w , req , p , sess , request , proxy )
1664
1672
}
@@ -1777,7 +1785,7 @@ func (f *Forwarder) portForward(authCtx *authContext, w http.ResponseWriter, req
1777
1785
}
1778
1786
1779
1787
onPortForward := func (addr string , success bool ) {
1780
- if sess .noAuditEvents {
1788
+ if ! sess .isLocalKubernetesCluster {
1781
1789
return
1782
1790
}
1783
1791
portForward := & apievents.PortForward {
@@ -2048,7 +2056,7 @@ func (f *Forwarder) catchAll(authCtx *authContext, w http.ResponseWriter, req *h
2048
2056
return nil , trace .Wrap (err )
2049
2057
}
2050
2058
2051
- isLocalKubeCluster := f . isLocalKubeCluster ( sess .teleportCluster . isRemote , sess . kubeClusterName )
2059
+ isLocalKubeCluster := sess .isLocalKubernetesCluster
2052
2060
isListRequest := authCtx .requestVerb == types .KubeVerbList
2053
2061
// Watch requests can be send to a single resource or to a collection of resources.
2054
2062
// isWatchingCollectionRequest is true when the request is a watch request and
@@ -2145,10 +2153,8 @@ type clusterSession struct {
2145
2153
// nil otherwise.
2146
2154
kubeAPICreds kubeCreds
2147
2155
forwarder * reverseproxy.Forwarder
2148
- // noAuditEvents is true if this teleport service should leave audit event
2149
- // logging to another service.
2150
- noAuditEvents bool
2151
- targetAddr string
2156
+ // targetAddr is the address of the target cluster.
2157
+ targetAddr string
2152
2158
// kubeAddress is the address of this session's active connection (if there is one)
2153
2159
kubeAddress string
2154
2160
// upgradeToHTTP2 indicates whether the transport should be configured to use HTTP2.
@@ -2357,11 +2363,8 @@ func (f *Forwarder) newClusterSessionLocal(ctx context.Context, authCtx authCont
2357
2363
func (f * Forwarder ) newClusterSessionDirect (ctx context.Context , authCtx authContext ) (* clusterSession , error ) {
2358
2364
connCtx , cancel := context .WithCancelCause (ctx )
2359
2365
return & clusterSession {
2360
- parent : f ,
2361
- authContext : authCtx ,
2362
- // This session talks to a kubernetes_service, which should handle
2363
- // audit logging. Avoid duplicate logging.
2364
- noAuditEvents : true ,
2366
+ parent : f ,
2367
+ authContext : authCtx ,
2365
2368
requestContext : ctx ,
2366
2369
connCtx : connCtx ,
2367
2370
connMonitorCancel : cancel ,
@@ -2385,7 +2388,7 @@ func (f *Forwarder) makeSessionForwarder(sess *clusterSession) (*reverseproxy.Fo
2385
2388
reverseproxy .WithLogger (f .log ),
2386
2389
reverseproxy .WithErrorHandler (f .formatForwardResponseError ),
2387
2390
}
2388
- if f . isLocalKubeCluster ( sess .teleportCluster . isRemote , sess . kubeClusterName ) {
2391
+ if sess .isLocalKubernetesCluster {
2389
2392
// If the target cluster is local, i.e. the cluster that is served by this
2390
2393
// teleport service, then we set up the forwarder to allow re-writing
2391
2394
// the response to the client to include user friendly error messages.
0 commit comments