From 017771ddf76eb0645b7790ce7ca2bec21adf2da7 Mon Sep 17 00:00:00 2001 From: Tana M Berry Date: Tue, 26 Sep 2023 11:14:27 -0500 Subject: [PATCH] website/blogs: Blog about m2m (#6974) * m2m blog * fix image ext * tweak * updated dependency * formatting * removed old tag * Optimised images with calibre/image-actions * fixed errors marc and samir found * typo * tweak * image rename fighting me --------- Co-authored-by: Tana Berry Co-authored-by: authentik-automation[bot] <135050075+authentik-automation[bot]@users.noreply.github.com> --- .../Image1.png | Bin 0 -> 44894 bytes .../item.md | 134 ++++++++++++++++++ 2 files changed, 134 insertions(+) create mode 100644 website/blog/2023-09-26-machine-to-machine-communication-in-authentik/Image1.png create mode 100644 website/blog/2023-09-26-machine-to-machine-communication-in-authentik/item.md diff --git a/website/blog/2023-09-26-machine-to-machine-communication-in-authentik/Image1.png b/website/blog/2023-09-26-machine-to-machine-communication-in-authentik/Image1.png new file mode 100644 index 0000000000000000000000000000000000000000..4112876a731e5f439008250ef6fbd8c40df068e8 GIT binary patch literal 44894 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 “Machine to machine systems are the key to reliable data processing with near to zero errors” ([source](https://dataconomy.com/2023/07/14/what-is-machine-to-machine-m2m/)) + +Where there is communication in software systems, there is both authentication and authorization. The basic definition of the terms is that _authentication_ is about assessing and verifying WHO (the person, device, thing) is involved, while **_authorization_** is about what access rights that person or device has. So we choose to use the phrase “machine-to-machine communication” in order to capture both of those important aspects. + +> Or we could use fun terms like **AuthN** (authentication) and **AuthZ** (authorization). + +So in some ways you can think of M2M as being like an internal API, with data (tokens and keys and certs and all thing access-related) being passed back and forth, but specifically for authentication and authorization processes. + +!["Screenshot of authentik UI"](./Image1.png) + + + +## M2M communication in authentik + +As part of our providing a unified platform for authentication, authentik supports OAuth2-based M2M communication. By “unified platform” we mean that authentik provides workplace authentication for team members, B2C login by web site visitors, global communities and non-profit teams, educational societies, and [coming soon] mobile authentication. So that all authentications needs are met by authentik, as a unified platform. + +### Use cases for M2M in authentik + +Macine-to-machine communication speeds processing and adds a layer of security to inter-application and complex, multi-machine systems. With authentik’s M2M functionality, you can take advantage of these aspects, and optimize your workflow for authentication and authorization between servers, applications, and any provider or source in your ecosystem. + +**Common workflow** + +The workflow for all three of the use cases that we discuss below share several core common steps: + +1. Obtain a token from the environment you are working in (i.e. a build/CI tool such as GitLab or GitHub, or Kubernetes for applications running on Kubernetes). +2. Pass the token, via [client_credentials](https://goauthentik.io/docs/providers/oauth2/client_credentials), to authentik. +3. In the response, authentik returns a JWT (JSON Web Token). +4. The token is then used to authenticate requests to other services elsewhere. (These other services need to check the token for its validity, which can be done with the [proxy provider](https://goauthentik.io/docs/providers/proxy/) in authentik for example). + +**Three authentik use cases** + +Lets take a look at three specific use cases for implementing M2M with authentik. + +**1. Building Docker images and passing them to a [Docker registry](https://docs.docker.com/registry/)** + +After building and testing your application, you might want to package your application as a Docker image and push it to a registry so that others can use it for deployment. + +For this use case, you can use M2M with authentik to push the package to your registry without needing to login yourself, or needing a password, or even a pre-defined service account, to the registry. Instead, you can create a policy with authentik to allow a specific repository in your CI platform to push to the Docker registry. When logging into the registry, you can use the token you already have access to from the platform you’re running on, and the rest happens behind the scenes! + +For a real-life example, with code samples, take a look at my blog “[Setup a docker registry for passwordless Docker builds with GitHub/GitLab using authentik](https://beryju.io/blog/2022-06-github-gitlab-passwordless-docker/)”, which provides step-by-step instructions with code blocks. + +**2. Collect Prometheus metrics from multiple clusters** + +If you use Prometheus to monitor multiple Kubernetes clusters, you might want to collect all Prometheus metrics and put them in one place, using something like [Thanos](https://thanos.io/) or [Mimir](https://grafana.com/oss/mimir/) in order to better analyze the data. Using M2M functionality in authentik, you can simplify authentication, so that the source (the cluster sending the metrics, in this case) can authenticate itself with the receiving target cluster. + +In this use case, you will create an expression policy, in which you define service accounts to allow communication between that specific cluster and authentik. + +- You create an OAuth Source for each cluster (since each cluster usually has its own unique JWT Signing key). On the **Create a new source** panel, select **OpenID OAuth Source** as the type, and then click **Next**. Then you will need to populate the following fields: + - **Consumer key**, **Consumer secret**, **Authorization URL**, **Access token URL**, and **Profile URL, and OIDC JWKS** (to obtain the key for the cluster, run the command `kubectl get --raw /openid/v1/jwks`). +- You can create a proxy provider to authenticate the incoming requests, where the proxy provider functions like a traditional reverse-proxy, sending traffic to Thanos or Mimir in the cluster but also requiring authentication for any requests. When defining your proxy provider, use the following syntax: + + ```python + + # Replace these values with the namespace and service-account name for your prometheus instance + allowed_namespace = "prometheus-namespace" + allowed_service_account = "prometheus-sa" + + jwt = request.context.get("oauth_jwt", None) + if not jwt: + return False + allowed_sa = [ + f"system:serviceaccount:{allowed_namespace}:{allowed_service_account}", + ] + return jwt["sub"] in allowed_sa + ``` + + Then the rest is same as in the first use case; obtain a JWT from the K8s cluster, send the token to authentik, get back a diff token, then send that token to Thanos, Mimir, or where ever you want to store the metrics. Prometheus then uses that token to authenticate incoming requests from the other clusters. Actually, you can configure Promethesus to do the token exchange work, by using their `remote_write` feature. For an example of how this can be set up, refer to this YAML file, where I configured `remote_write`. + +**3. GitOps with M2M and Loki** + +This third use case is a twist on the first two use cases, but even more simple. + +We can utilize GitOps to configure [Loki alerting rules](https://grafana.com/docs/loki/latest/alert/), by using GitHub actions and a proxy provider to make Loki publicly accessible. This setup combines the use of a CI platform (as in the first use case) and using a proxy provider to authenticate requests (as in the second use case). In this third case, the authentication is for the requests from GitHub Actions to Loki. + +- Create an OAuth Source for GitHub, selecting **OpenID OAuth Source** as the type. Then, instead of populating the **OIDC JWKS** field, you use the **OIDC JWKS URL** field and set that to https://token.actions.githubusercontent.com/.well-known/jwks. +- As with the second use case, create proxy provider, which acts like a traditional reverse-proxy, sending traffic to Loki, but also authenticating any requests. +- Create an expression policy, using the following syntax: + +```python +# Replace the two values below +github_user = "my-user" +github_repo = "my-repo" + +jwt = request.context.get("oauth_jwt", None) +if not jwt: + return False +if jwt["iss"] != "https://token.actions.githubusercontent.com": + return False +if jwt["repository"] != f"{github_user}/{github_repo}": + return False +return True + +``` + +- Finally, call a snippet in a GitHub composite action (this can be done manually or programmatically) to exchange the tokens between the GitHub action and Loki. The proxy provider then verifies the tokens and forwards the requests to Loki. + +### What’s next + +Look for our upcoming tutorial about configuring machine-to-machine communication using authentik. As part of the tutorial, we will provide a GitHub composite action that bundles the multiple steps involved in token creation and exchange into a single, reusable action, instead of needing multiple `run` commands. + +We’d like to hear from you about how you use M2M, or how you plan to in the future. And as always, if you are interested in collaborating with us on our M2M functionality, or contributing to our documentation, visit us in our [GitHub repository](https://github.com/goauthentik/authentik) or reach out to us at [hello@goauthentik.io](mailto:hello@goauthentik.io).