Skip to content

Commit 7437cdc

Browse files
authored
Merge commit from fork
* Adjust header handling * wire in headerhandling in localproxy
1 parent 0d66d9b commit 7437cdc

4 files changed

Lines changed: 36 additions & 8 deletions

File tree

pkg/proxy/authheaders/authheaders.go

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,19 +30,26 @@ import (
3030
userinfo "k8s.io/apiserver/pkg/authentication/user"
3131
)
3232

33-
// SetAuthHeaders stamps the given authenticated user's identity onto the request
34-
// headers, after deleting any inbound copies of the identity headers.
35-
//
36-
// This mirrors k8s.io/client-go/transport.SetAuthProxyHeaders and the upstream
37-
// requestheader authenticator's ClearAuthenticationHeaders.
38-
func SetAuthHeaders(header http.Header, user userinfo.Info, userHeader, groupHeader, extraHeaderPrefix string) {
33+
// ClearAuthHeaders deletes any inbound copies of the request-header identity
34+
// headers.
35+
func ClearAuthHeaders(header http.Header, userHeader, groupHeader, extraHeaderPrefix string) {
3936
header.Del(userHeader)
4037
header.Del(groupHeader)
38+
lowerPrefix := strings.ToLower(extraHeaderPrefix)
4139
for key := range header {
42-
if strings.HasPrefix(strings.ToLower(key), strings.ToLower(extraHeaderPrefix)) {
40+
if strings.HasPrefix(strings.ToLower(key), lowerPrefix) {
4341
header.Del(key)
4442
}
4543
}
44+
}
45+
46+
// SetAuthHeaders stamps the given authenticated user's identity onto the request
47+
// headers, after deleting any inbound copies of the identity headers.
48+
//
49+
// This mirrors k8s.io/client-go/transport.SetAuthProxyHeaders and the upstream
50+
// requestheader authenticator's ClearAuthenticationHeaders.
51+
func SetAuthHeaders(header http.Header, user userinfo.Info, userHeader, groupHeader, extraHeaderPrefix string) {
52+
ClearAuthHeaders(header, userHeader, groupHeader, extraHeaderPrefix)
4653

4754
header.Set(userHeader, user.GetName())
4855

pkg/proxy/proxy.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ func WithProxyAuthHeaders(delegate http.Handler, userHeader, groupHeader string,
6060
return func(w http.ResponseWriter, r *http.Request) {
6161
if u, ok := request.UserFrom(r.Context()); ok {
6262
authheaders.SetAuthHeaders(r.Header, u, userHeader, groupHeader, extraHeaderPrefix)
63+
} else {
64+
authheaders.ClearAuthHeaders(r.Header, userHeader, groupHeader, extraHeaderPrefix)
6365
}
6466

6567
delegate.ServeHTTP(w, r)

pkg/proxy/proxy_test.go

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,13 +222,30 @@ func TestWithProxyAuthHeaders_CustomHeaderNames(t *testing.T) {
222222
func TestWithProxyAuthHeaders_NoAuthenticatedUser(t *testing.T) {
223223
t.Parallel()
224224
var served bool
225-
sink := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { served = true })
225+
var forwarded http.Header
226+
sink := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
227+
served = true
228+
forwarded = r.Header.Clone()
229+
})
226230
handler := WithProxyAuthHeaders(sink, defaultUserHeader, defaultGroupHeader, defaultExtraPrefix)
227231

228232
req := httptest.NewRequest(http.MethodGet, "https://front-proxy/api/v1/secrets", http.NoBody)
233+
// No user in context (unauthenticated pass-through). Client forges identity.
234+
req.Header.Set(defaultUserHeader, "kcp-admin")
235+
req.Header.Add(defaultGroupHeader, "system:masters")
236+
req.Header.Set(warrantExtraHeader, `{"user":"attacker","groups":["system:masters"]}`)
229237
handler.ServeHTTP(httptest.NewRecorder(), req)
230238

231239
if !served {
232240
t.Fatal("expected request to be passed through to delegate")
233241
}
242+
if v := forwarded.Values(defaultUserHeader); len(v) != 0 {
243+
t.Errorf("forged user header leaked to shard: %v", v)
244+
}
245+
if v := forwarded.Values(defaultGroupHeader); len(v) != 0 {
246+
t.Errorf("forged group header leaked to shard: %v", v)
247+
}
248+
if v := forwarded.Values(warrantExtraHeader); len(v) != 0 {
249+
t.Errorf("forged warrant extra header leaked to shard: %v", v)
250+
}
234251
}

pkg/server/localproxy.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,8 @@ func withProxyAuthHeaders(delegate http.Handler, userHeader, groupHeader string,
325325
return func(w http.ResponseWriter, r *http.Request) {
326326
if u, ok := request.UserFrom(r.Context()); ok {
327327
authheaders.SetAuthHeaders(r.Header, u, userHeader, groupHeader, extraHeaderPrefix)
328+
} else {
329+
authheaders.ClearAuthHeaders(r.Header, userHeader, groupHeader, extraHeaderPrefix)
328330
}
329331

330332
delegate.ServeHTTP(w, r)

0 commit comments

Comments
 (0)