fortigate_-_entra_id_saml_sso
Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| fortigate_-_entra_id_saml_sso [2025/12/12 21:25] – created oso | fortigate_-_entra_id_saml_sso [2025/12/13 00:22] (current) – [SAML Claim Mapping (Azure → FortiGate)] oso | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Prerequisites ====== | ====== Prerequisites ====== | ||
| - | * Required | + | * Required |
| - | * Certificates and basic setup | + | * A valid public FQDN (sub.domain.tld) for the FortiGate SSL VPN certificate |
| + | * A working certificate on the FortiGate (Let’s Encrypt, public CA, etc.) | ||
| ====== Add FortiGate SSL VPN in Entra ID ====== | ====== Add FortiGate SSL VPN in Entra ID ====== | ||
| - | * Enterprise Applications → Add from Gallery → Select FortiGate SSL VPN | + | * Enterprise Applications → Add from Gallery → Select |
| ====== Configure Basic SAML Settings in Entra ID ====== | ====== Configure Basic SAML Settings in Entra ID ====== | ||
| * Identifier (Entity ID) | * Identifier (Entity ID) | ||
| - | * Reply URL | + | * Reply URL (ACS) |
| * Sign-on URL | * Sign-on URL | ||
| * Logout URL | * Logout URL | ||
| - | * Attribute & Claim mappings | + | * Attribute & Claim mappings |
| - | * Download SAML Signing Certificate | + | * Download |
| + | ===== SAML Claim Mapping (Azure → FortiGate) ===== | ||
| + | |||
| + | FortiGate is strict about SAML attribute names. | ||
| + | The attributes defined in Azure **must match exactly** the attributes that FortiGate expects under: | ||
| + | < | ||
| + | set user-name | ||
| + | set group-name | ||
| + | </ | ||
| + | |||
| + | === Required Claims in Entra ID === | ||
| + | |||
| + | Under **Single Sign-On → User Attributes & Claims**: | ||
| + | |||
| + | **Add this claim** (FortiGate requires the literal name) | ||
| + | * Claim name: '' | ||
| + | |||
| + | **Edit the existing “groups” claim** so that it sends **Group Object IDs** (not display names). | ||
| + | * The expected claim name must be '' | ||
| + | |||
| + | {{: | ||
| + | |||
| + | This ensures that the SAML token contains: | ||
| + | < | ||
| + | username = user@domain | ||
| + | group = <Azure AD Group Object ID> | ||
| + | </ | ||
| + | |||
| + | === Why this matters === | ||
| + | |||
| + | FortiGate matches SAML attributes using the `user-name` and `group-name` fields in the IdP configuration: | ||
| + | |||
| + | < | ||
| + | set user-name " | ||
| + | set group-name " | ||
| + | </ | ||
| + | |||
| + | If the Azure claim sends the wrong attribute or the Object ID doesn' | ||
| + | |||
| + | https:// | ||
| ====== Create Test User and Security Group in Entra ID ====== | ====== Create Test User and Security Group in Entra ID ====== | ||
| - | * New user creation | + | * Create test user |
| - | * Assign user to FortiGate SSL VPN app | + | * Assign user to the FortiGate SSL VPN enterprise |
| - | * Create Security Group (e.g., FortiGateAccess) | + | * Create Security Group (e.g., |
| - | * Note Object ID | + | * Copy the **Object ID** (used later in FortiGate group matching) |
| ====== Upload Certificate to FortiGate ====== | ====== Upload Certificate to FortiGate ====== | ||
| - | * Import | + | * Import |
| - | * Rename certificate if needed | + | * Rename |
| ====== Configure FortiGate SAML Settings (CLI) ====== | ====== Configure FortiGate SAML Settings (CLI) ====== | ||
| - | * Define SAML IdP (`config user saml`) | + | * Define |
| - | * Map entity-id, single-sign-on-url, logout-url, IdP URLs, certificate, | + | * Configure |
| + | |||
| + | < | ||
| + | config user saml | ||
| + | edit azure | ||
| + | set cert "< | ||
| + | set entity-id " | ||
| + | set single-sign-on-url | ||
| + | set single-logout-url | ||
| + | |||
| + | set idp-entity-id <Azure AD Identifier> | ||
| + | set idp-single-sign-on-url <Azure Login URL> | ||
| + | set idp-single-logout-url <Azure Logout URL> | ||
| + | set idp-cert <Azure SAML Base64 Certificate Name> | ||
| + | |||
| + | set user-name username | ||
| + | set group-name group | ||
| + | next | ||
| + | end | ||
| + | </ | ||
| ====== Configure FortiGate User Group ====== | ====== Configure FortiGate User Group ====== | ||
| - | * Create | + | * Create |
| - | * Match against Azure Security Group Object ID | + | * Match against |
| + | |||
| + | < | ||
| + | config user group | ||
| + | edit AAD-FortiVPN | ||
| + | set member azure | ||
| + | config match | ||
| + | edit 1 | ||
| + | set server-name azure | ||
| + | set group-name 343744cd---GROUP-ID---67bb7e68 | ||
| + | next | ||
| + | end | ||
| + | next | ||
| + | end | ||
| + | </ | ||
| ====== Configure SSL VPN Portals and Firewall Policy ====== | ====== Configure SSL VPN Portals and Firewall Policy ====== | ||
| - | * Create VPN portal(s) | + | * Create |
| - | * Apply firewall | + | * Assign the portal to the SAML group |
| + | * Add firewall | ||
| ====== Optional: Multiple SSL VPN Realms ====== | ====== Optional: Multiple SSL VPN Realms ====== | ||
| - | * Enable SSL-VPN Realms feature | + | * Enable |
| - | * Create multiple realms (e.g., FullTunnel, SplitTunnel) | + | * Create multiple realms (e.g., |
| - | * Configure | + | * Assign specific |
| ====== FortiClient Setup (Optional) ====== | ====== FortiClient Setup (Optional) ====== | ||
| - | * Configure FortiClient for SSL VPN with SAML SSO | + | * Configure FortiClient for SSL VPN using SAML SSO |
| + | * Ensure FQDN and port match the FortiGate SAML configuration | ||
| ====== Testing and Validation ====== | ====== Testing and Validation ====== | ||
| - | * Test SSO via Azure “Test” | + | * Use Azure → “Test” |
| - | * Direct login to FortiGate VPN portal | + | * Direct login to FortiGate VPN portal |
| - | * Use My Apps tile | + | * Launch from MyApps portal |
| - | * Debugging | + | * Use FortiGate debugging |
| + | |||
| + | < | ||
| + | diagnose debug application sslvpn -1 | ||
| + | diagnose debug application samld -1 | ||
| + | diagnose debug console timestamp enable | ||
| + | diagnose debug enable | ||
| + | </ | ||
| + | |||
| + | To stop debugging: | ||
| + | |||
| + | < | ||
| + | diagnose debug reset | ||
| + | diagnose debug disable | ||
| + | </ | ||
| + | |||
| + | FortiClient connection stages: | ||
| + | * **20%** – TCP connection | ||
| + | * **40%** – SAML authentication | ||
| + | * **80%** – Tunnel negotiation | ||
| + | * **100%** – Connected | ||
| + | |||
| + | For example, if it fails at **40%**, SAML assertion is not validated. | ||
| ====== Troubleshooting Notes ====== | ====== Troubleshooting Notes ====== | ||
| - | * Certificate re-download | + | * Re-download |
| - | * Signature | + | * Signature |
| - | * Common errors (e.g., | + | * Common errors (e.g., |
| + | * Adjust group claim: ensure the Azure AD group appears in the SAML assertion | ||
| + | |||
| + | ====== References ====== | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
fortigate_-_entra_id_saml_sso.1765574716.txt.gz · Last modified: 2025/12/12 21:25 by oso
