Knative Eventingの送信者ID¶
フラグ名: authentication-oidc
ステージ: アルファ版、デフォルトで無効
追跡イシュー: #6806
概要¶
現在、クラスター内でのイベント配信は認証されておらず、アドレス指定可能なイベントコンシューマーは送信者のIDを判別できません。
Knative Eventing Addressablesは、アドレスの一部としてステータスにOIDC Audienceを公開します(例:.status.address.audience
)。また、このAudienceに対して発行されたOIDCアクセストークンを含むリクエストが必要です。
Knative Eventing Soucesは、ターゲットのAudienceのOIDCアクセストークンをリクエストし、リクエストに追加します。ソースごとに専用のサービスアカウントがリクエストのIDとして使用されます。
前提条件¶
注記
ネットワーク経由で平文のアクセストークンを提供しないように、トランスポート暗号化も有効にする必要があります。 トランスポート暗号化を参照してください。トランスポート暗号化機能フラグを有効にする方法について説明しています。
互換性¶
OIDC認証は現在、以下のコンポーネントでサポートされています。
- ブローカー
- Channel
- InMemoryChannel
- KafkaChannel
- Source
送信者IDの設定¶
authentication-oidc
の可能な値は次のとおりです。
disabled
- 動作に変更なし
enabled
- AddressablesはステータスでAudienceをアナウンスします
- Sourceは、ターゲットのアクセストークンを含むAuthorizationヘッダーをリクエストに追加します
たとえば、送信者IDを有効にするには、config-features
ConfigMapは次のようになります。
apiVersion: v1
kind: ConfigMap
metadata:
name: config-features
namespace: knative-eventing
data:
authentication-oidc: "enabled"
機能が動作していることの確認¶
次のYAMLをdefault-broker-example.yaml
というファイルに保存します。
# default-broker-example.yaml
apiVersion: eventing.knative.dev/v1
kind: Broker
metadata:
name: br
---
apiVersion: eventing.knative.dev/v1
kind: Trigger
metadata:
name: tr
spec:
broker: br
subscriber:
ref:
apiVersion: v1
kind: Service
name: event-display
---
apiVersion: v1
kind: Service
metadata:
name: event-display
spec:
selector:
app: event-display
ports:
- protocol: TCP
port: 80
targetPort: 8080
---
apiVersion: v1
kind: Pod
metadata:
name: event-display
labels:
app: event-display
spec:
containers:
- name: event-display
image: gcr.io/knative-releases/knative.dev/eventing/cmd/event_display
imagePullPolicy: Always
ports:
- containerPort: 8080
default-broker-example.yaml
ファイルをテスト名前空間authentication-oidc-test
に適用します。
kubectl create namespace authentication-oidc-test
kubectl apply -n authentication-oidc-test -f default-broker-example.yaml
BrokerがAudienceをアナウンスしていることを確認します。
kubectl -n authentication-oidc-test get broker br -o yaml
出力例
apiVersion: eventing.knative.dev/v1
kind: Broker
metadata:
name: br
namespace: authentication-oidc-test
spec:
config:
# ...
delivery:
# ...
status:
address:
audience: eventing.knative.dev/broker/authentication-oidc-test/br
name: http
url: http://broker-ingress.knative-eventing.svc.cluster.local/authentication-oidc-test/br
annotations:
# ...
OIDC認証を使用してBrokerにイベントを送信します。
-
OIDCトークン(アクセストークン)を作成します。
kubectl -n authentication-oidc-test create serviceaccount oidc-test-user; kubectl -n authentication-oidc-test create token oidc-test-user --audience eventing.knative.dev/broker/authentication-oidc-test/br
出力例
serviceaccount/oidc-test-user created eyJhbGciOiJSUzI1NiIsImtpZCI6IlZBWmppNEVJZkVSVDZoYTA4dU1xTWJxSHFYQTgtbE00VU1tMmpFZUNuakUifQ.eyJhdWQiOlsiZXZlbnRpbmcua25hdGl2ZS5kZXYvYnJva2VyL2F1dGhlbnRpY2F0aW9uLW9pZGMtdGVzdC9iciJdLCJleHAiOjE3MDU5MzQyMTQsImlhdCI6MTcwNTkzMDYxNCwiaXNzIjoiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJhdXRoZW50aWNhdGlvbi1vaWRjLXRlc3QiLCJzZXJ2aWNlYWNjb3VudCI6eyJuYW1lIjoib2lkYy10ZXN0LXVzZXIiLCJ1aWQiOiJkNGM5MjkzMy1kZThlLTRhNDYtYjkxYS04NjRjNTZkZDU4YzIifX0sIm5iZiI6MTcwNTkzMDYxNCwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50OmF1dGhlbnRpY2F0aW9uLW9pZGMtdGVzdDpvaWRjLXRlc3QtdXNlciJ9.Taqk11LRC7FKMbt_1VvmRjMolJL54CFGbRT85ZgNdG8YT6MXiw_S2rMHxLyC9RyX0hb720szHhiVIPj15jbz597egSBbcuk-f_MCsUFMyK1Nb95blo6UNDFKIQxC5_aleoT-qaGtXlt4OEE6RjA28mFeeSCjcJUCRdLGLuSiQT47lxLqNK5OfKjd4wGMiUsbBzOcXor9ouJc1lr4gFlCzzIMJNLfXU0O_AB8J--yh6wP07Q-2AWwwv7J1CtZCrIqaPBFjWnplLqtBgo33ZNbqomXyYVdO_0HlEN9XtlK_y_2veEvKOkINzpic_ipf5ZhTxEpXWaztZzdkWd-e2mHMg
-
Brokerにcurlリクエストを送信します。
kubectl -n authentication-oidc-test run curl --image=curlimages/curl -i --tty -- sh # Send unauthenticated request (should result in a 401) curl -v http://broker-ingress.knative-eventing.svc.cluster.local/authentication-oidc-test/br -H "Content-Type:application/json" -H "Ce-Id:1" -H "Ce-Source:cloud-event-example" -H "Ce-Type:myCloudEventGreeting" -H "Ce-Specversion:1.0" -d "{\"name\": \"unauthenticated\"}" # Send authenticated request (should request in 202) curl -v http://broker-ingress.knative-eventing.svc.cluster.local/authentication-oidc-test/br -H "Content-Type:application/json" -H "Ce-Id:1" -H "Ce-Source:cloud-event-example" -H "Ce-Type:myCloudEventGreeting" -H "Ce-Specversion:1.0" -H "Authorization: Bearer <YOUR-TOKEN-FROM-STEP-1>" -d "{\"name\": \"authenticated\"}"
出力例
3. 2番目のイベントがevent-displayポッドに到達したことを確認します。$ curl -v http://broker-ingress.knative-eventing.svc.cluster.local/authentication-oidc-test/br -H "Content-Type:application/json" -H "Ce-Id:1" -H "Ce-Source:cloud-event-example" -H "Ce-Type:myCloudEventGreeting" -H "Ce-Specversion:1.0" -d "{\"name\": \"unauthenticated\"}" * Host broker-ingress.knative-eventing.svc.cluster.local:80 was resolved. * IPv6: (none) * IPv4: 10.96.110.167 * Trying 10.96.110.167:80... * Connected to broker-ingress.knative-eventing.svc.cluster.local (10.96.110.167) port 80 > POST /authentication-oidc-test/br HTTP/1.1 > Host: broker-ingress.knative-eventing.svc.cluster.local > User-Agent: curl/8.5.0 > Accept: */* > Content-Type:application/json > Ce-Id:1 > Ce-Source:cloud-event-example > Ce-Type:myCloudEventGreeting > Ce-Specversion:1.0 > Content-Length: 27 > < HTTP/1.1 401 Unauthorized < Allow: POST, OPTIONS < Date: Mon, 22 Jan 2024 13:33:57 GMT < Content-Length: 0 < * Connection #0 to host broker-ingress.knative-eventing.svc.cluster.local left intact ~ $ curl -v http://broker-ingress.knative-eventing.svc.cluster.local/authentication-oidc-test/br -H "Content-Type:application/json" -H "Ce-Id:1" -H "Ce-Source:cloud-event-example" -H "Ce-Type:myCloudEventGreeting" -H "Ce-Specversion:1.0" -H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IlZBWmppNEVJZkVSV DZoYTA4dU1xTWJxSHFYQTgtbE00VU1tMmpFZUNuakUifQ.eyJhdWQiOlsiZXZlbnRpbmcua25hdGl2ZS5kZXYvYnJva2VyL2F1dGhlbnRpY2F0aW9uLW9pZGMtdGVzdC9iciJdLCJleHAiOjE3MDU5MzQwMDgsImlhdCI6MTcwNTkzMDQwOCwiaXNzIjoiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJhdXRoZW50aWNhdGlvbi1vaWRjLXRlc3QiLCJ zZXJ2aWNlYWNjb3VudCI6eyJuYW1lIjoib2lkYy10ZXN0LXVzZXIiLCJ1aWQiOiI3MTlkMWI3ZC1hZjBkLTQzMDAtOGUxNy1lNTk4YmZmN2VmYTIifX0sIm5iZiI6MTcwNTkzMDQwOCwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50OmF1dGhlbnRpY2F0aW9uLW9pZGMtdGVzdDpvaWRjLXRlc3QtdXNlciJ9.UrleSi54mxgThesyrC4kzG7rO3-Fic1B3kPOY8k1l-oslhvw3dbT0n24bvP96m7Ke4ZGoXE3Efo 966LZM_61-bfntFbw8kTRe_w6wGXVGpadrBSZsIChVgFYqsPNX_7r1LSNTy5tFXze9phVz6EpO7XeUct_PXyYLASNw0LNXWyqbcEqBNtgWmDKHaS_1pIscFP6MaoGVj968hpVqli8O6okQUQitIoPwFEGAIbaBlIX6Z5ZqlGwL9eqbIiNEMEgjlduv9dyZVmpDc0hsF6GHk2RnAhLeOniUNdUo4VO3z27TJY5JYK7xIMBD6Z5dUAhud9ofA8VWEl7Mziw4fsdCw" -d "{\"name\": \"authenticated\"}" * Host broker-ingress.knative-eventing.svc.cluster.local:80 was resolved. * IPv6: (none) * IPv4: 10.96.110.167 * Trying 10.96.110.167:80... * Connected to broker-ingress.knative-eventing.svc.cluster.local (10.96.110.167) port 80 > POST /authentication-oidc-test/br HTTP/1.1 > Host: broker-ingress.knative-eventing.svc.cluster.local > User-Agent: curl/8.5.0 > Accept: */* > Content-Type:application/json > Ce-Id:1 > Ce-Source:cloud-event-example > Ce-Type:myCloudEventGreeting > Ce-Specversion:1.0 > Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IlZBWmppNEVJZkVSVDZoYTA4dU1xTWJxSHFYQTgtbE00VU1tMmpFZUNuakUifQ.eyJhdWQiOlsiZXZlbnRpbmcua25hdGl2ZS5kZXYvYnJva2VyL2F1dGhlbnRpY2F0aW9uLW9pZGMtdGVzdC9iciJdLCJleHAiOjE3MDU5MzQwMDgsImlhdCI6MTcwNTkzMDQwOCwiaXNzIjoiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJhdXRoZW50aWNhdGlvbi1vaWRjLXRlc3QiLCJzZXJ2aWNlYWNjb3VudCI6eyJuYW1lIjoib2lkYy10ZXN0LXVzZXIiLCJ1aWQiOiI3MTlkMWI3ZC1hZjBkLTQzMDAtOGUxNy1lNTk4YmZmN2VmYTIifX0sIm5iZiI6MTcwNTkzMDQwOCwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50OmF1dGhlbnRpY2F0aW9uLW9pZGMtdGVzdDpvaWRjLXRlc3QtdXNlciJ9.UrleSi54mxgThesyrC4kzG7rO3-Fic1B3kPOY8k1l-oslhvw3dbT0n24bvP96m7Ke4ZGoXE3Efo966LZM_61-bfntFbw8kTRe_w6wGXVGpadrBSZsIChVgFYqsPNX_7r1LSNTy5tFXze9phVz6EpO7XeUct_PXyYLASNw0LNXWyqbcEqBNtgWmDKHaS_1pIscFP6MaoGVj968hpVqli8O6okQUQitIoPwFEGAIbaBlIX6Z5ZqlGwL9eqbIiNEMEgjlduv9dyZVmpDc0hsF6GHk2RnAhLeOniUNdUo4VO3z27TJY5JYK7xIMBD6Z5dUAhud9ofA8VWEl7Mziw4fsdCw > Content-Length: 25 > < HTTP/1.1 202 Accepted < Allow: POST, OPTIONS < Date: Mon, 22 Jan 2024 13:34:27 GMT < Content-Length: 0 < * Connection #0 to host broker-ingress.knative-eventing.svc.cluster.local left intact ~ $
kubectl -n authentication-oidc-test logs event-display
出力例
☁️ cloudevents.Event Context Attributes, specversion: 1.0 type: myCloudEventGreeting source: cloud-event-example id: 1 datacontenttype: application/json Extensions, knativearrivaltime: 2024-01-22T13:34:26.032199371Z Data, { "name": "authenticated" }
Istioの制限事項¶
JWKS URIがIPで表されている場合、IstioとのEventing統合とauthentication-oidc
機能フラグが有効になっている場合に問題が発生する可能性があります。たとえば、次のような場合です。
$ kubectl get --raw /.well-known/openid-configuration | jq
{
"issuer": "https://kubernetes.default.svc",
"jwks_uri": "https://172.18.0.3:6443/openid/v1/jwks",
...
}
この場合は、traffic.sidecar.istio.io/excludeOutboundIPRanges: <JWKS IP>/32
アノテーションを次のデプロイメントのポッドテンプレートに追加する必要があります。
imc-dispatcher
mt-broker-ingress
mt-broker-filter
例えば
$ kubectl -n knative-eventing patch deploy imc-dispatcher --patch '{"spec":{"template":{"metadata":{"annotations":{"traffic.sidecar.istio.io/excludeOutboundIPRanges":"172.18.0.3/32"}}}}}'
deployment.apps/imc-dispatcher patched