Skip to content

Commit 12e2cdd

Browse files
authored
docs: restructure, clarify, consolidate existing docs (#1726)
This pull request consolidates a large set of changes to Pomerium’s documentation. It refines organization, updates integrations, removes outdated content, and simplifies navigation. ## Key Changes - **New Integration Guides** - Added guides for Apple, Auth0, Azure, Cognito, GitHub, GitLab, Google, OIDC, Okta, OneLogin, Ping, and Keycloak - Included images, examples, and troubleshooting steps - **Documentation Structure Overhaul** - Consolidated categories (e.g., "Pomerium Zero," "Pomerium Core," "Community") into a streamlined sidebar - Removed outdated guidelines (Code of Conduct, Contributing) and deprecated sections - Merged cryptography details into the Security Policy page - **Deployment and Kubernetes Updates** - Introduced new “Deploy” category, consolidating references for Kubernetes, enterprise, and device identity - Added quick start references, cluster management guides, and new examples - Updated Docker image references to `latest` tag for clarity and consistency - **Enterprise Guides and Enhanced Features** - Created detailed docs for Pomerium Enterprise: installation, configuration, metrics, and clusters - Expanded device context, request context, and advanced policy documentation - Improved upgrading guides for both Pomerium Core and Enterprise - **Security & Authentication Improvements** - Integrated cryptography docs into a single security-focused resource - Removed the standalone “Hosted Authenticate Service” section in favor of a unified authentication guide - Clarified JWT usage, identity verification, and zero trust concepts - **Refinements and Cleanup** - Fixed or removed broken links, consolidated multiple references, and standardized paths - Upgraded Docusaurus and other dependencies (e.g., mermaid, redocusaurus, cspell, Prettier) for better performance - Improved sidebars, table formatting, and visual flow in key docs - Updated pre-commit workflows to ensure consistent formatting and spelling checks These updates greatly improve the clarity, consistency, and user-friendliness of the Pomerium documentation.
1 parent c23d0ea commit 12e2cdd

File tree

1,033 files changed

+6273
-22270
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

1,033 files changed

+6273
-22270
lines changed

.github/workflows/pre-commit.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ jobs:
77
pre-commit:
88
runs-on: ubuntu-latest
99
steps:
10-
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9
10+
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v3
1111
with:
1212
fetch-depth: 0
13-
- uses: pre-commit/action@646c83fcd040023954eafda54b4db0192ce70507
13+
- uses: pre-commit/action@2c7b3805fd2a0fd8c1884dcaebf91fc102a13ecd #3.0.1
1414
with:
1515
extra_args: --show-diff-on-failure --from-ref ${{ github.event.pull_request.base.sha }} --to-ref ${{ github.event.pull_request.head.sha }}

.pre-commit-config.yaml

+3-3
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ repos:
44
hooks:
55
- id: prettier
66
additional_dependencies:
7-
- 'prettier@2.7.1'
7+
- 'prettier@3.4.2'
88
files: ^content\/.*$
9-
exclude: content/docs/k8s/reference.md
9+
exclude: content/docs/deploy/k8s/reference.md
1010
- repo: https://github.com/streetsidesoftware/cspell-cli
11-
rev: v6.2.0
11+
rev: v8.17.0
1212
hooks:
1313
- id: cspell

README.md

-2
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@ Pomerium's documentation is built using [Docusaurus 2](https://docusaurus.io/).
66

77
## Contributing
88

9-
See [Contributing](https://pomerium.com/docs/community/contributing) for more information on contributing to this project.
10-
119
The steps below detail the installation of this site locally for development.
1210

1311
### Installation

content/_generate-recovery-token.md content/docs/admonitions/_generate-recovery-token.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
In the event that you lose access to the console via delegated access (the policy defined in Pomerium), there exists a fallback procedure to regain access to the console via a generated recovery token.
22

3-
![Pomerium Enterprise Recovery Sign In](docs/img/recovery-token.png)
3+
![Pomerium Enterprise Recovery Sign In](./img/recovery-token.png)
44

55
To generate a token, run the `pomerium-console generate-recovery token` command with the following flags:
66

Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
If you notice a self-signed certificate warning, see [Handle Self-Signed Certificate Warning](/docs/troubleshooting#handle-self-signed-certificate-warning) to bypass it.
1+
If you notice a self-signed certificate warning, see [Handle Self-Signed Certificate Warning](/docs/internals/troubleshooting) to bypass it.
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
Pomerium Zero provides a hosted configuration UI for managing your Pomerium configurations. You can migrate to Pomerium Zero by importing your existing configuration.
22

3-
See [**Import Core Config to Zero**](/docs/zero/import) for more information.
3+
See [**Import Core Config to Zero**](/docs/deploy/cloud/import) for more information.
File renamed without changes.
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
When you create a [TCP](/docs/capabilities/tcp) or [Websocket](/docs/reference/routes/timeouts#websocket-connections) connection, Pomerium validates the access policy at the time the connection is made.
1+
When you create a [TCP](/docs/capabilities/non-http) or [Websocket](/docs/reference/routes/timeouts#websocket-connections) connection, Pomerium validates the access policy at the time the connection is made.
22

33
Currently, there is no mechanism in place to terminate long-running connections if a policy becomes invalid.
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
Pomerium will use the [**Hosted Authenticate Service**](/docs/capabilities/hosted-authenticate-service) by default in configurations that don't specify an authenticate service URL.
1+
Pomerium will use the [**Hosted Authenticate Service**](/docs/capabilities/authentication) by default in configurations that don't specify an authenticate service URL.
22

3-
See the [**Self-Hosted Authenticate Service**](/docs/capabilities/self-hosted-authenticate-service) page if you prefer to use your own authenticate service.
3+
See the [**Self-Hosted Authenticate Service**](/docs/capabilities/authentication) page if you prefer to use your own authenticate service.
8.13 KB
Loading

content/docs/capabilities/audit-logs.mdx

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
---
2-
title: Audit Logs
2+
title: Auditing & Privilege Access Management
33
description: Learn how to read Pomerium authorization logs.
44
lang: en-US
5-
sidebar_label: Audit logs
5+
sidebar_label: 'Audit logging'
66
keywords: [pomerium, troubleshooting, auth, authorization, logs]
77
sidebar_class_name: enterprise
88
---
@@ -126,6 +126,6 @@ The keys described below usually contain the relevant information when debugging
126126

127127
## Understanding Authorization Logs
128128

129-
The most confusing keys for new users to understand are likely `allow-why-false` and `deny-why-false`. To better understand them, we should first discuss how [Pomerium Policy Language](/docs/capabilities/ppl) (**PPL**) works.
129+
The most confusing keys for new users to understand are likely `allow-why-false` and `deny-why-false`. To better understand them, we should first discuss how [Pomerium Policy Language](/docs/internals/ppl) (**PPL**) works.
130130

131131
PPL allows a request to a route if the claim matches at least one **allow** policy rule, and matches zero **deny** policy rules. With that in mind, `allow-why-false` and `allow-why-true` will describe a situation where the request either does or not not meet the requirements of an **allow** block a policy applied to that route. Conversely, `deny-why-true` and `deny-why-false` will describe why a request did or did not match a **deny** block for a policy assigned to the route.

content/docs/capabilities/authentication.mdx

+256-5
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ While Pomerium itself is not an IdP, it supports conventional IdP solutions and
2222

2323
:::tip
2424

25-
See [identity providers](/docs/identity-providers) for step-by-step guides on how to integrate supported IdPs with Pomerium.
25+
See [identity providers](/docs/integrations/user-identity/identity-providers) for step-by-step guides on how to integrate supported IdPs with Pomerium.
2626

2727
:::
2828

@@ -34,11 +34,11 @@ After Pomerium has verified and authenticated the user, the Authentication servi
3434

3535
### JWT verification and upstream applications
3636

37-
After Pomeriums Authentication service obtains OAuth and ID tokens and OIDC claims from your IdP, it stores that session data in the Databroker service, never leaking it to the client or the upstream application. This provides an extra layer of security, as it prevents the application from using OAuth tokens provided by the IdP.
37+
After Pomerium's Authentication service obtains OAuth and ID tokens and OIDC claims from your IdP, it stores that session data in the Databroker service, never leaking it to the client or the upstream application. This provides an extra layer of security, as it prevents the application from using OAuth tokens provided by the IdP.
3838

3939
Pomerium mints a new Pomerium JWT based on the claims and scopes in the OAuth and ID tokens and signs the JWT with a private key so the upstream application can verify the incoming request came from Pomerium.
4040

41-
Although [JWT verification](/docs/guides/verify-jwt) is optional, Pomerium provides a way for you to [verify a users identity](/docs/capabilities/getting-users-identity) on the application level by forwarding [JWT claim headers](/docs/reference/jwt-claim-headers) with proxied requests to upstream applications.
41+
Although [JWT verification](/docs/capabilities/getting-users-identity.mdx) is optional, Pomerium provides a way for you to [verify a user's identity](/docs/capabilities/getting-users-identity) on the application level by forwarding [JWT claim headers](/docs/reference/jwt-claim-headers) with proxied requests to upstream applications.
4242

4343
Pomerium offers frontend and backend SDKs to simplify JWT verification for application developers:
4444

@@ -50,14 +50,265 @@ Pomerium offers frontend and backend SDKs to simplify JWT verification for appli
5050

5151
Legacy apps that may not directly support SSO are still compatible with Pomerium. As a reverse proxy, Pomerium is designed to sit in front of your applications.
5252

53-
By configuring your applications to route requests to Pomeriums Proxy service, Pomerium can manage the authentication flow and secure your legacy app with minimal to no work on your end.
53+
By configuring your applications to route requests to Pomerium's Proxy service, Pomerium can manage the authentication flow and secure your legacy app with minimal to no work on your end.
5454

5555
## External data sources (Enterprise)
5656

5757
:::enterprise
5858

59-
[Enterprise customers](https://www.pomerium.com/enterprise-sales/) can enforce context-aware access with Pomeriums [external data sources](/docs/capabilities/integrations) feature (directory sync).
59+
[Enterprise customers](https://www.pomerium.com/enterprise-sales/) can enforce context-aware access with Pomerium's [external data sources](/docs/capabilities/integrations) feature (directory sync).
6060

6161
:::
6262

6363
From the Enterprise Console, you can import external data from sources other than your IdP. User identity context such as users, groups, roles, language, time zones, location, and more can be included into your authorization policy so you can make granular access control decisions.
64+
65+
## Hosted Authenticate Service
66+
67+
Pomerium's **Hosted Authenticate Service** provides a hosted alternative to the self-hosted authenticate service.
68+
69+
Introduced in Pomerium v0.22, the hosted authenticate service is available for open-source Pomerium, Pomerium Zero, and Pomerium Enterprise.
70+
71+
## How the hosted authenticate service works
72+
73+
Pomerium's hosted authenticate service includes a **Hosted Authenticate Service URL** and a **Hosted Identity Provider** that handle authentication and authorization using OAuth 2.0 and OIDC protocols.
74+
75+
Pomerium Zero, Core, and Enterprise configurations that do not include the self-hosted authenticate service URL or identity provider settings default to the hosted authenticate service settings. See [Configure the hosted authenticate service](#configure-the-hosted-authenticate-service) section for more information.
76+
77+
## Why use the hosted authenticate service
78+
79+
The hosted authenticate service offers a quicker way for users to deploy and test Pomerium.
80+
81+
### No configuration
82+
83+
The hosted authenticate service doesn't require an authenticate service URL or identity provider settings to use.
84+
85+
### Less time to deploy
86+
87+
Pomerium's hosted authenticate service removes the tedium of configuring your own identity provider (IdP) and authenticate service URL so you can deploy Pomerium in less time.
88+
89+
### Faster proof of concept
90+
91+
If you're testing Pomerium for the first time, run [Pomerium with Docker](/docs/get-started/fundamentals/core/get-started) using our hosted authenticate service – you can run Pomerium Core in **under 5 minutes** with minimal setup.
92+
93+
:::enterprise
94+
95+
Pomerium users who are interested in [Pomerium Enterprise](https://www.pomerium.com/enterprise-sales/) can test out the [Docker Enterprise quickstart](/docs/deploy/enterprise/quickstart) using our hosted authenticate service as well.
96+
97+
:::
98+
99+
## Configure the hosted authenticate service
100+
101+
The hosted authenticate service requires no configuration to use.
102+
103+
Add the following route and policy to your configuration file:
104+
105+
```yaml title="pomerium-config.yaml"
106+
routes:
107+
- from: https://verify.localhost.pomerium.io
108+
to: http://verify:8000
109+
policy:
110+
- allow:
111+
or:
112+
- email:
113+
114+
pass_identity_headers: true
115+
```
116+
117+
This minimal configuration is all you need to connect to an upstream service with Pomerium's hosted services.
118+
119+
If you want, you can still include the hosted URL in your configuration:
120+
121+
```yaml title="pomerium-config.yaml"
122+
authenticate_service_url: https://authenticate.pomerium.app
123+
124+
routes:
125+
- from: https://verify.localhost.pomerium.io
126+
to: http://verify:8000
127+
policy:
128+
- allow:
129+
or:
130+
- email:
131+
132+
pass_identity_headers: true
133+
```
134+
135+
If you use the hosted URL and include your own IdP settings, Pomerium will override your IdP configuration and use the hosted IdP instead:
136+
137+
```yaml title="pomerium-config.yaml"
138+
authenticate_service_url: https://authenticate.pomerium.app
139+
140+
idp_provider: google
141+
idp_client_id: my_client_id
142+
idp_client_secret: my_client_secret
143+
144+
routes:
145+
- from: https://verify.localhost.pomerium.io
146+
to: http://verify:8000
147+
policy:
148+
- allow:
149+
or:
150+
- email:
151+
152+
pass_identity_headers: true
153+
```
154+
155+
## Limitations
156+
157+
**Limited sign-in options**
158+
159+
Currently, you can only authenticate with Google single-sign on or with email and password credentials.
160+
161+
**Session management**
162+
163+
The hosted authenticate service is separate from your Pomerium installation. This means you can't refresh session tokens, so users must re-authenticate after roughly one hour.
164+
165+
**Uptime commitment**
166+
167+
We make no commitments to uptime for our free hosted authenticate service.
168+
169+
## Privacy considerations
170+
171+
Users that take advantage of our hosted authenticate service should review the [Terms of Service agreement](https://www.pomerium.com/pomerium-zero-user-agreement/).
172+
173+
Specifically, you should be aware that by using our hosted services, you agree to Pomerium collecting the following data:
174+
175+
- IP address
176+
- OS version
177+
- Internal domain name
178+
- Session details (email, name, and domain)
179+
180+
We collect this information to better understand how our users interact with and use Pomerium's services.
181+
182+
## Self-Hosted Authenticate Service
183+
184+
Pomerium's **Self-Hosted Authenticate Service** allows you to configure Pomerium with the identity provider of your choice.
185+
186+
The self-hosted authenticate service is available for open-source Pomerium, Pomerium Zero, and Pomerium Enterprise.
187+
188+
:::info
189+
190+
The _authenticate service_ is one of the [four logical services](/docs/internals/architecture#component-level) that make up Pomerium. The authenticate service is unique in that Pomerium can either run this service itself, or instead use the [Hosted Authenticate Service](/docs/capabilities/authentication).
191+
192+
:::
193+
194+
## How the self-hosted authenticate service works
195+
196+
To configure the self-hosted authenticate service, you will need to set up:
197+
198+
- a URL for the authenticate service
199+
- an identity provider (IdP)
200+
201+
### Authenticate service URL
202+
203+
The authenticate service URL is a public-facing URL that should resolve to your Pomerium instance. (If running in split service mode, this URL should resolve to the authenticate service.) Whenever a user is required to log in to access a route, Pomerium will redirect the user to the authenticate service using this URL.
204+
205+
This URL should not contain a path or query parameters. For example, `https://authenticate.corp.example.com`.
206+
207+
This URL must be different from any of the route URLs you use with Pomerium.
208+
209+
See the [Authenticate Service URL](/docs/reference/service-urls#authenticate-service-url) reference page for details on how to configure this setting.
210+
211+
:::info Why does Pomerium use a separate authenticate service URL?
212+
213+
In a typical OIDC authentication flow, all redirect URLs must be pre-registered with the IdP. Pomerium uses a single authenticate service URL so that you need to register only one redirect URL with your IdP. This way, Pomerium can protect multiple upstream services without requiring you to update your IdP client whenever you add a new service.
214+
215+
:::
216+
217+
### Identity provider
218+
219+
Pomerium relies on an IdP to authenticate users. Pomerium can use any IdP that implements the OpenID Connect (OIDC) protocol.
220+
221+
The steps to configure your IdP will vary depending on the specific provider. See [**Identity Providers**](/docs/integrations/user-identity/identity-providers) for a list of guides to configure commonly-used IdPs.
222+
223+
You will generally need to configure your IdP client to allow an OAuth redirect URL based on your chosen authenticate service URL, with the path `/oauth2/callback` appended to it.
224+
225+
For example, if your authenticate service URL is `https://authenticate.corp.example.com`, you should configure your identity provider to allow the redirect URI `https://authenticate.corp.example.com/oauth2/callback`.
226+
227+
:::tip
228+
229+
If you require a different callback path than `/oauth2/callback`, you can use the [Authenticate Callback Path](/docs/reference/authenticate-callback-path) setting to change the callback path.
230+
231+
:::
232+
233+
Once you have set up an IdP client, you will need to configure Pomerium with the IdP name, client ID and client secret, and possibly a URL assigned to your individual IdP client.
234+
235+
See the [Identity Provider Settings](/docs/reference/identity-provider-settings#identity-provider-client-id) reference page for details on how to configure these settings.
236+
237+
## Single sign-out (SSO)
238+
239+
signs a user out of a secured application and clears both the remote application session generated by the identity provider and the local Pomerium session.
240+
241+
## OIDC Front-Channel Logout
242+
243+
Pomerium supports Front-Channel Logout as described in [OpenID Connect Front-Channel Logout 1.0](https://openid.net/specs/openid-connect-frontchannel-1_0.html).
244+
245+
### Identity provider support
246+
247+
See if your identity provider (IdP) supports Front-Channel Logout by checking your IdP's `/.well-known/openid-configuration` endpoint. If your IdP supports it, you may see something similar to the JSON data below:
248+
249+
```json
250+
{
251+
"frontchannel_logout_session_supported": true
252+
}
253+
```
254+
255+
### Configure single sign-out
256+
257+
To correctly implement SSO, you must register a `frontchannel_logout_uri` for your application that includes the path `/.pomerium/sign_out`.
258+
259+
The `frontchannel_logout_uri` must match the external route in your policy. For example, `app.corp.example.com/.pomerium/sign_out`.
260+
261+
If configured correctly, the following actions occur:
262+
263+
1. The proxy service receives the sign-out request and clears the local Pomerium session
264+
2. The proxy service redirects the request to the authenticate service URL's `/.pomerium/sign_out` endpoint
265+
3. The authentication service clears the remote application session
266+
267+
![Single sign-out flow](./img/single-sign-out/sign-out-flow.svg)
268+
269+
:::caution
270+
271+
While it is possible to implement SSO using the **authenticate service URL** and the `/.pomerium/sign_out` endpoint, this method is not recommended.
272+
273+
Signing out with the authenticate service URL won't delete the session cookie on the route itself. To terminate the remote application and Pomerium sessions, you must point sign-out requests to the external route.
274+
275+
:::
276+
277+
<details>
278+
<summary>Well-known Pomerium endpoint</summary>
279+
<div>
280+
281+
See Pomerium's `/.well-known/pomerium` endpoint to view OAuth, OIDC, and JWKS data.
282+
283+
For example:
284+
285+
```json
286+
{
287+
"authentication_callback_endpoint": "https://authenticate.localhost.pomerium.io/oauth2/callback",
288+
"jwks_uri": "https://authenticate.localhost.pomerium.io/.well-known/pomerium/jwks.json",
289+
"frontchannel_logout_uri": "https://authenticate.localhost.pomerium.io/.pomerium/sign_out"
290+
}
291+
```
292+
293+
Note, a CSRF token is required for the single sign out endpoint (despite supporting `GET` and `POST`) and can be retrieved from the `X-CSRF-Token` response header on the well known endpoint above or using the `_pomerium_csrf` session set.
294+
295+
</div>
296+
</details>
297+
298+
### Single sign-out example with Pomerium
299+
300+
The example below demonstrates how to correctly implement SSO using the [JavaScript SDK](/docs/capabilities/getting-users-identity.mdx):
301+
302+
```js
303+
export const signOut = (redirectUrl) => {
304+
let location = window.location.origin + '/.pomerium/sign_out';
305+
if (redirectUrl) {
306+
location += '?pomerium_redirect_uri=' + encodeURIComponent(redirectUrl);
307+
}
308+
window.location.href = location;
309+
};
310+
```
311+
312+
In the example above, the `signOut` function appends the `/.pomerium/sign_out` endpoint to the external route URL, then redirects the user.
313+
314+
From here, the proxy service clears the external route session and redirects the user to the authenticate service URL to clear the Pomerium session.

0 commit comments

Comments
 (0)