mirror of https://github.com/dapr/docs.git
Merge pull request #2063 from sthussey/feat/1882-kafka-oauth2
Document Kafka pub/sub OIDC authentication
This commit is contained in:
commit
b10f0f08fd
|
@ -27,11 +27,11 @@ spec:
|
||||||
value: "group1"
|
value: "group1"
|
||||||
- name: clientID # Optional. Used as client tracing ID by Kafka brokers.
|
- name: clientID # Optional. Used as client tracing ID by Kafka brokers.
|
||||||
value: "my-dapr-app-id"
|
value: "my-dapr-app-id"
|
||||||
- name: authRequired # Required.
|
- name: authType # Required.
|
||||||
value: "true"
|
value: "password"
|
||||||
- name: saslUsername # Required if authRequired is `true`.
|
- name: saslUsername # Required if authType is `password`.
|
||||||
value: "adminuser"
|
value: "adminuser"
|
||||||
- name: saslPassword # Required if authRequired is `true`.
|
- name: saslPassword # Required if authType is `password`.
|
||||||
secretKeyRef:
|
secretKeyRef:
|
||||||
name: kafka-secrets
|
name: kafka-secrets
|
||||||
key: saslPasswordSecret
|
key: saslPasswordSecret
|
||||||
|
@ -50,22 +50,159 @@ spec:
|
||||||
| brokers | Y | A comma-separated list of Kafka brokers. | `"localhost:9092,dapr-kafka.myapp.svc.cluster.local:9093"`
|
| brokers | Y | A comma-separated list of Kafka brokers. | `"localhost:9092,dapr-kafka.myapp.svc.cluster.local:9093"`
|
||||||
| consumerGroup | N | A kafka consumer group to listen on. Each record published to a topic is delivered to one consumer within each consumer group subscribed to the topic. | `"group1"`
|
| consumerGroup | N | A kafka consumer group to listen on. Each record published to a topic is delivered to one consumer within each consumer group subscribed to the topic. | `"group1"`
|
||||||
| clientID | N | A user-provided string sent with every request to the Kafka brokers for logging, debugging, and auditing purposes. Defaults to `"sarama"`. | `"my-dapr-app"`
|
| clientID | N | A user-provided string sent with every request to the Kafka brokers for logging, debugging, and auditing purposes. Defaults to `"sarama"`. | `"my-dapr-app"`
|
||||||
| authRequired | Y | Enable [SASL](https://en.wikipedia.org/wiki/Simple_Authentication_and_Security_Layer) authentication with the Kafka brokers. | `"true"`, `"false"`
|
| authRequired | N | *Deprecated* Enable [SASL](https://en.wikipedia.org/wiki/Simple_Authentication_and_Security_Layer) authentication with the Kafka brokers. | `"true"`, `"false"`
|
||||||
| saslUsername | N | The SASL username used for authentication. Only required if `authRequired` is set to `"true"`. | `"adminuser"`
|
| authType | Y | Configure or disable authentication. Supported values: `none`, `password`, `mtls`, or `oidc` | `"password"`, `"none"`
|
||||||
| saslPassword | N | The SASL password used for authentication. Can be `secretKeyRef` to use a [secret reference]({{< ref component-secrets.md >}}). Only required if `authRequired` is set to `"true"`. | `""`, `"KeFg23!"`
|
| saslUsername | N | The SASL username used for authentication. Only required if `authType` is set to `"password"`. | `"adminuser"`
|
||||||
|
| saslPassword | N | The SASL password used for authentication. Can be `secretKeyRef` to use a [secret reference]({{< ref component-secrets.md >}}). Only required if `authType is set to `"password"`. | `""`, `"KeFg23!"`
|
||||||
| initialOffset | N | The initial offset to use if no offset was previously committed. Should be "newest" or "oldest". Defaults to "newest". | `"oldest"`
|
| initialOffset | N | The initial offset to use if no offset was previously committed. Should be "newest" or "oldest". Defaults to "newest". | `"oldest"`
|
||||||
| maxMessageBytes | N | The maximum size in bytes allowed for a single Kafka message. Defaults to 1024. | `2048`
|
| maxMessageBytes | N | The maximum size in bytes allowed for a single Kafka message. Defaults to 1024. | `2048`
|
||||||
| consumeRetryInterval | N | The interval between retries when attempting to consume topics. Treats numbers without suffix as milliseconds. Defaults to 100ms. | `200ms`
|
| consumeRetryInterval | N | The interval between retries when attempting to consume topics. Treats numbers without suffix as milliseconds. Defaults to 100ms. | `200ms`
|
||||||
| version | N | Kafka cluster version. Defaults to 2.0.0.0 | `0.10.2.0`
|
| version | N | Kafka cluster version. Defaults to 2.0.0.0 | `0.10.2.0`
|
||||||
| caCert | N | Certificate authority certificate, required for using TLS. Can be `secretKeyRef` to use a secret reference | `"-----BEGIN CERTIFICATE-----\n<base64-encoded DER>\n-----END CERTIFICATE-----"`
|
| caCert | N | Certificate authority certificate, required for using TLS. Can be `secretKeyRef` to use a secret reference | `"-----BEGIN CERTIFICATE-----\n<base64-encoded DER>\n-----END CERTIFICATE-----"`
|
||||||
| clientCert | N | Client certificate, required for using TLS. Can be `secretKeyRef` to use a secret reference | `"-----BEGIN CERTIFICATE-----\n<base64-encoded DER>\n-----END CERTIFICATE-----"`
|
| clientCert | N | Client certificate, required for `authType` `mtls`. Can be `secretKeyRef` to use a secret reference | `"-----BEGIN CERTIFICATE-----\n<base64-encoded DER>\n-----END CERTIFICATE-----"`
|
||||||
| clientKey | N | Client key, required for using TLS. Can be `secretKeyRef` to use a secret reference | `"-----BEGIN RSA PRIVATE KEY-----\n<base64-encoded PKCS8>\n-----END RSA PRIVATE KEY-----"`
|
| clientKey | N | Client key, required for `authType` `mtls` Can be `secretKeyRef` to use a secret reference | `"-----BEGIN RSA PRIVATE KEY-----\n<base64-encoded PKCS8>\n-----END RSA PRIVATE KEY-----"`
|
||||||
| skipVerify | N | Skip TLS verification, this is not recommended for use in production. Defaults to `"false"` | `"true"`, `"false"` |
|
| skipVerify | N | Skip TLS verification, this is not recommended for use in production. Defaults to `"false"` | `"true"`, `"false"` |
|
||||||
|
| disableTls | N | Disable TLS for transport security. This is not recommended for use in production. Defaults to `"false"` | `"true"`, `"false"` |
|
||||||
|
| oidcTokenEndpoint | N | Full URL to an OAuth2 identity provider access token endpoint. Required when `authType` is set to `oidc` | "https://identity.example.com/v1/token" |
|
||||||
|
| oidcClientID | N | The OAuth2 client ID that has been provisioned in the identity provider. Required when `authType is set to `oidc` | `dapr-kafka` |
|
||||||
|
| oidcClientSecret | N | The OAuth2 client secret that has been provisioned in the identity provider: Required when `authType` is set to `oidc` | `"KeFg23!"` |
|
||||||
|
| oidcScopes | N | Comma-delimited list of OAuth2/OIDC scopes to request with the access token. Recommended when `authType` is set to `oidc`. Defaults to `"openid"` | '"openid,kafka-prod"` |
|
||||||
|
|
||||||
### Communication using TLS
|
|
||||||
To configure communication using TLS, ensure the Kafka broker is configured to support certificates.
|
The `secretKeyRef` above is referencing a [kubernetes secrets store]({{< ref kubernetes-secret-store.md >}}) to access the tls information. Visit [here]({{< ref setup-secret-store.md >}}) to learn more about how to configure a secret store component.
|
||||||
Pre-requisite includes `certficate authority certificate`, `ca issued client certificate`, `client private key`.
|
|
||||||
Below is an example of a Kafka pubsub component configured to use TLS:
|
### Authentication
|
||||||
|
|
||||||
|
Kafka supports a variety of authentication schemes and Dapr supports several: SASL password, mTLS, OIDC/OAuth2. With the added authentication methods, the `authRequired` field has
|
||||||
|
been deprecated from the v1.6 release and instead the `authType` field should be used. If `authRequired` is set to `true`, Dapr will attempt to configure `authType` correctly
|
||||||
|
based on the value of `saslPassword`. There are four valid values for `authType`: `none`, `password`, `mtls`, and `oidc`. Note this is authentication only; authorization is still configured within Kafka.
|
||||||
|
|
||||||
|
#### None
|
||||||
|
|
||||||
|
Setting `authType` to `none` will disable any authentication. This is *NOT* recommended in production.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: dapr.io/v1alpha1
|
||||||
|
kind: Component
|
||||||
|
metadata:
|
||||||
|
name: kafka-pubsub-noauth
|
||||||
|
namespace: default
|
||||||
|
spec:
|
||||||
|
type: pubsub.kafka
|
||||||
|
version: v1
|
||||||
|
metadata:
|
||||||
|
- name: brokers # Required. Kafka broker connection setting
|
||||||
|
value: "dapr-kafka.myapp.svc.cluster.local:9092"
|
||||||
|
- name: consumerGroup # Optional. Used for input bindings.
|
||||||
|
value: "group1"
|
||||||
|
- name: clientID # Optional. Used as client tracing ID by Kafka brokers.
|
||||||
|
value: "my-dapr-app-id"
|
||||||
|
- name: authType # Required.
|
||||||
|
value: "none"
|
||||||
|
- name: maxMessageBytes # Optional.
|
||||||
|
value: 1024
|
||||||
|
- name: consumeRetryInterval # Optional.
|
||||||
|
value: 200ms
|
||||||
|
- name: version # Optional.
|
||||||
|
value: 0.10.2.0
|
||||||
|
- name: disableTls
|
||||||
|
value: "true"
|
||||||
|
```
|
||||||
|
|
||||||
|
#### SASL Password
|
||||||
|
|
||||||
|
Setting `authType` to `password` enables [SASL](https://en.wikipedia.org/wiki/Simple_Authentication_and_Security_Layer) authentication using the **PLAIN** mechanism. This requires setting
|
||||||
|
the `saslUsername` and `saslPassword` fields.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: dapr.io/v1alpha1
|
||||||
|
kind: Component
|
||||||
|
metadata:
|
||||||
|
name: kafka-pubsub-sasl
|
||||||
|
namespace: default
|
||||||
|
spec:
|
||||||
|
type: pubsub.kafka
|
||||||
|
version: v1
|
||||||
|
metadata:
|
||||||
|
- name: brokers # Required. Kafka broker connection setting
|
||||||
|
value: "dapr-kafka.myapp.svc.cluster.local:9092"
|
||||||
|
- name: consumerGroup # Optional. Used for input bindings.
|
||||||
|
value: "group1"
|
||||||
|
- name: clientID # Optional. Used as client tracing ID by Kafka brokers.
|
||||||
|
value: "my-dapr-app-id"
|
||||||
|
- name: authType # Required.
|
||||||
|
value: "password"
|
||||||
|
- name: saslUsername # Required if authType is `password`.
|
||||||
|
value: "adminuser"
|
||||||
|
- name: saslPassword # Required if authType is `password`.
|
||||||
|
secretKeyRef:
|
||||||
|
name: kafka-secrets
|
||||||
|
key: saslPasswordSecret
|
||||||
|
- name: maxMessageBytes # Optional.
|
||||||
|
value: 1024
|
||||||
|
- name: consumeRetryInterval # Optional.
|
||||||
|
value: 200ms
|
||||||
|
- name: version # Optional.
|
||||||
|
value: 0.10.2.0
|
||||||
|
- name: caCert
|
||||||
|
secretKeyRef:
|
||||||
|
name: kafka-tls
|
||||||
|
key: caCert
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Mutual TLS
|
||||||
|
|
||||||
|
Setting `authType` to `mtls` uses a x509 client certificate (the `clientCert` field) and key (the `clientKey` field) to authenticate. Note that mTLS as an
|
||||||
|
authentication mechanism is distinct from using TLS to secure the transport layer via encryption. mTLS requires TLS transport (meaning `disableTls` must be `false`), but securing
|
||||||
|
the transport layer does not require using mTLS. See [Communication using TLS](#communication-using-tls) for configuring underlying TLS transport.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: dapr.io/v1alpha1
|
||||||
|
kind: Component
|
||||||
|
metadata:
|
||||||
|
name: kafka-pubsub-mtls
|
||||||
|
namespace: default
|
||||||
|
spec:
|
||||||
|
type: pubsub.kafka
|
||||||
|
version: v1
|
||||||
|
metadata:
|
||||||
|
- name: brokers # Required. Kafka broker connection setting
|
||||||
|
value: "dapr-kafka.myapp.svc.cluster.local:9092"
|
||||||
|
- name: consumerGroup # Optional. Used for input bindings.
|
||||||
|
value: "group1"
|
||||||
|
- name: clientID # Optional. Used as client tracing ID by Kafka brokers.
|
||||||
|
value: "my-dapr-app-id"
|
||||||
|
- name: authType # Required.
|
||||||
|
value: "mtls"
|
||||||
|
- name: caCert
|
||||||
|
secretKeyRef:
|
||||||
|
name: kafka-tls
|
||||||
|
key: caCert
|
||||||
|
- name: clientCert
|
||||||
|
secretKeyRef:
|
||||||
|
name: kafka-tls
|
||||||
|
key: clientCert
|
||||||
|
- name: clientKey
|
||||||
|
secretKeyRef:
|
||||||
|
name: kafka-tls
|
||||||
|
key: clientKey
|
||||||
|
- name: maxMessageBytes # Optional.
|
||||||
|
value: 1024
|
||||||
|
- name: consumeRetryInterval # Optional.
|
||||||
|
value: 200ms
|
||||||
|
- name: version # Optional.
|
||||||
|
value: 0.10.2.0
|
||||||
|
```
|
||||||
|
|
||||||
|
#### OAuth2 or OpenID Connect
|
||||||
|
|
||||||
|
Setting `authType` to `oidc` enables SASL authentication via the **OAUTHBEARER** mechanism. This supports specifying a bearer
|
||||||
|
token from an external OAuth2 or [OIDC](https://en.wikipedia.org/wiki/OpenID) identity provider. Currenly only the **client_credentials** grant is supported. Configure `oidcTokenEndpoint` to
|
||||||
|
the full URL for the identity provider access token endpoint. Set `oidcClientID` and `oidcClientSecret` to the client credentials provisioned in the identity provider. If `caCert`
|
||||||
|
is specified in the component configuration, the certificate is appended to the system CA trust for verifying the identity provider certificate. Similarly, if `skipVerify`
|
||||||
|
is specified in the component configuration, verification will also be skipped when accessing the identity provider. By default, the only scope requested for the token is `openid`; it is **highly** recommended
|
||||||
|
that additional scopes be specified via `oidcScopes` in a comma-separated list and validated by the Kafka broker. If additional scopes are not used to narrow the validity of the access token,
|
||||||
|
a compromised Kafka broker could replay the token to access other services as the Dapr clientID.
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
apiVersion: dapr.io/v1alpha1
|
apiVersion: dapr.io/v1alpha1
|
||||||
|
@ -83,9 +220,57 @@ spec:
|
||||||
value: "group1"
|
value: "group1"
|
||||||
- name: clientID # Optional. Used as client tracing ID by Kafka brokers.
|
- name: clientID # Optional. Used as client tracing ID by Kafka brokers.
|
||||||
value: "my-dapr-app-id"
|
value: "my-dapr-app-id"
|
||||||
- name: authRequired # Required.
|
- name: authType # Required.
|
||||||
value: "true"
|
value: "oidc"
|
||||||
- name: saslUsername # Required if authRequired is `true`.
|
- name: oidcTokenEndpoint # Required if authType is `oidc`.
|
||||||
|
value: "https://identity.example.com/v1/token"
|
||||||
|
- name: oidcClientID # Required if authType is `oidc`.
|
||||||
|
value: "dapr-myapp"
|
||||||
|
- name: oidcClientSecret # Required if authType is `oidc`.
|
||||||
|
secretKeyRef:
|
||||||
|
name: kafka-secrets
|
||||||
|
key: oidcClientSecret
|
||||||
|
- name: oidcScopes # Recommended if authType is `oidc`.
|
||||||
|
value: "openid,kafka-dev"
|
||||||
|
- name: caCert # Also applied to verifying OIDC provider certificate
|
||||||
|
secretKeyRef:
|
||||||
|
name: kafka-tls
|
||||||
|
key: caCert
|
||||||
|
- name: maxMessageBytes # Optional.
|
||||||
|
value: 1024
|
||||||
|
- name: consumeRetryInterval # Optional.
|
||||||
|
value: 200ms
|
||||||
|
- name: version # Optional.
|
||||||
|
value: 0.10.2.0
|
||||||
|
```
|
||||||
|
|
||||||
|
### Communication using TLS
|
||||||
|
|
||||||
|
By default TLS is enabled to secure the transport layer to Kafka. To disable TLS, set `disableTls` to `true`. When TLS is enabled, you can
|
||||||
|
control server certificate verification using `skipVerify` to disable verificaiton (*NOT* recommended in production environments) and `caCert` to
|
||||||
|
specify a trusted TLS certificate authority (CA). If no `caCert` is specified, the system CA trust will be used. To also configure mTLS authentication,
|
||||||
|
see the section under _Authentication_.
|
||||||
|
Below is an example of a Kafka pubsub component configured to use transport layer TLS:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: dapr.io/v1alpha1
|
||||||
|
kind: Component
|
||||||
|
metadata:
|
||||||
|
name: kafka-pubsub
|
||||||
|
namespace: default
|
||||||
|
spec:
|
||||||
|
type: pubsub.kafka
|
||||||
|
version: v1
|
||||||
|
metadata:
|
||||||
|
- name: brokers # Required. Kafka broker connection setting
|
||||||
|
value: "dapr-kafka.myapp.svc.cluster.local:9092"
|
||||||
|
- name: consumerGroup # Optional. Used for input bindings.
|
||||||
|
value: "group1"
|
||||||
|
- name: clientID # Optional. Used as client tracing ID by Kafka brokers.
|
||||||
|
value: "my-dapr-app-id"
|
||||||
|
- name: authType # Required.
|
||||||
|
value: "password"
|
||||||
|
- name: saslUsername # Required if authType is `password`.
|
||||||
value: "adminuser"
|
value: "adminuser"
|
||||||
- name: consumeRetryInterval # Optional.
|
- name: consumeRetryInterval # Optional.
|
||||||
value: 200ms
|
value: 200ms
|
||||||
|
@ -101,21 +286,10 @@ spec:
|
||||||
secretKeyRef:
|
secretKeyRef:
|
||||||
name: kafka-tls
|
name: kafka-tls
|
||||||
key: caCert
|
key: caCert
|
||||||
- name: clientCert # Client certificate.
|
|
||||||
secretKeyRef:
|
|
||||||
name: kafka-tls
|
|
||||||
key: clientCert
|
|
||||||
- name: clientKey # Client key.
|
|
||||||
secretKeyRef:
|
|
||||||
name: kafka-tls
|
|
||||||
key: clientKey
|
|
||||||
auth:
|
auth:
|
||||||
secretStore: <SECRET_STORE_NAME>
|
secretStore: <SECRET_STORE_NAME>
|
||||||
```
|
```
|
||||||
|
|
||||||
The `secretKeyRef` above is referencing a [kubernetes secrets store]({{< ref kubernetes-secret-store.md >}}) to access the tls information. Visit [here]({{< ref setup-secret-store.md >}}) to learn more about how to configure a secret store component.
|
|
||||||
|
|
||||||
|
|
||||||
## Per-call metadata fields
|
## Per-call metadata fields
|
||||||
|
|
||||||
### Partition Key
|
### Partition Key
|
||||||
|
|
Loading…
Reference in New Issue