← Cloudflare One / cloudflare-one / tutorials
Odesílání atributů SSO do originů chráněných Access pomocí Workers
Tento návod vás provede rozšířením možností jednotného přihlašování (SSO) služby Cloudflare Access s naší bezserverovou výpočetní platformou, Cloudflare Workers. Konkrétně tento návod ukáže, jak upravit požadavky odesílané na váš zabezpečený origin tak, aby obsahovaly další informace z ověřovací události Cloudflare Access.
Doba dokončení: 45 minut
Ověřovací tok
Cloudflare Access je autentizační proxy, která před připojením uživatele k vaší aplikaci ověřuje jeho identitu. Jak ukazuje diagram níže, Access vkládá JWT do požadavku, který lze poté ověřeno origin serverem.
Tuto funkci můžete rozšířit pomocí Cloudflare Workeru, který do požadavku vloží další hlavičky HTTP. V tomto příkladu přidáme atributy stavu zařízení firewall_activated a disk_encrypted, ale můžete zahrnout libovolné atributy, které Cloudflare Access shromáždí z ověřovací události.
Přínosy
Tento přístup vám umožňuje:
- Zvyšte zabezpečení: Díky zapojení dalších informací z autentizační události můžete zavést robustnější bezpečnostní opatření. Můžete například využít data o stavu zařízení a vynucovat přístup na základě souladu zařízení s požadavky.
- Zlepšení uživatelského zážitku: Uživatelské prostředí můžete přizpůsobit tak, že obsah nebo funkce upravíte podle atributů uživatele. Můžete například zobrazovat různý obsah podle role nebo polohy uživatele.
- Zjednodušení vývoje: Pomocí Cloudflare Workers můžete snadno rozšířit konfiguraci Cloudflare Access, aniž byste museli upravovat kód aplikace na origin serveru.
Než začnete
- Přidejte self-hosted aplikace ke Cloudflare Access.
- Povolte Šifrování disku a Firewall kontroly stavu zařízení.
- Nainstalujte Wrangler na místním počítači.
1. Vytvořte Worker
-
Vytvořte nový projekt Workers:
npm create cloudflare@latest -- device-posture-workerPři nastavení vyberte následující možnosti:
- Pro S čím byste chtěli začít?, vyberte
Hello World example. - Pro Jakou šablonu chcete použít?, vyberte
Worker only. - Pro Jaký jazyk chcete použít?, vyberte
JavaScript. - Pro Chcete používat git pro správu verzí?, vyberte
Yes. - Pro Chcete nasadit svou aplikaci?, vyberte
No(před nasazením provedeme ještě několik změn).
- Pro S čím byste chtěli začít?, vyberte
-
Přejděte do adresáře projektu:
$ cd device-posture-worker -
Zkopírujte a vložte následující kód do
src/index.js. Nezapomeňte nahradit<your-team-name>s vaší Zero Trust název týmu.index.jsimport { parse } from "cookie"; export default { async fetch(request, env, ctx) { // The name of the cookie const COOKIE_NAME = "CF_Authorization"; const CF_GET_IDENTITY = "https://<your-team-name>.cloudflareaccess.com/cdn-cgi/access/get-identity"; const cookie = parse(request.headers.get("Cookie") || ""); if (cookie[COOKIE_NAME] != null) { try { let id = await (await fetch(CF_GET_IDENTITY, request)).json(); let diskEncryptionStatus = false; let firewallStatus = false; for (const checkId in id.devicePosture) { const check = id.devicePosture[checkId]; if (check.type === "disk_encryption") { console.log(check.type); diskEncryptionStatus = check.success; } if (check.type === "firewall") { console.log(check.type); firewallStatus = check.success; break; } } //clone request (immutable otherwise) and insert posture values in new header set let newRequest = await new Request(request); newRequest.headers.set( "Cf-Access-Firewall-Activated", firewallStatus, ); newRequest.headers.set("Cf-Access-Disk-Encrypted", firewallStatus); //sent modified request to origin return await fetch(newRequest); } catch (e) { console.log(e); return await fetch(request); } } return await fetch(request); }, };
2. Zobrazte identitu uživatele
Skript v index.js používá get-identity endpoint k načtení kompletní identity uživatele z autentizační události Cloudflare Access. Chcete-li zobrazit seznam dostupných datových polí, přihlaste se do své aplikace Access a připojte /cdn-cgi/access/get-identity k adrese URL. Například pokud www.example.com je za Access, přejděte na https://www.example.com/cdn-cgi/access/get-identity.
Níže je příklad identity uživatele, která obsahuje disk_encryption a firewall kontroly stavu zařízení. Worker vloží výsledky kontroly stavu zařízení do hlaviček požadavku Cf-Access-Firewall-Activated a Cf-Access-Disk-Encrypted.
{
"id": "P51Tuu01fWHMBjIBvrCK1lK-eUDWs2aQMv03WDqT5oY",
"name": "John Doe",
"email": "[email protected]",
"amr": [
"pwd"
],
"oidc_fields": {
"principalName": "XXXXXX_cloudflare.com#EXT#@XXXXXXcloudflare.onmicrosoft.com"
},
"groups": [
{
"id": "fdaedb59-e9be-4ab7-8001-3e069da54185",
"name": "XXXXX"
}
],
"idp": {
"id": "b9f4d68e-dac1-48b0-b728-ae05a5f0d4b2",
"type": "azureAD"
},
"geo": {
"country": "FR"
},
"user_uuid": "ce40d564-c72f-475f-a9b8-f395f19ad986",
"account_id": "121287a0c6e6260ec930655e6b39a3a8",
"iat": 1724056537,
"devicePosture": {
"f6f9391e-6776-4878-9c60-0cc807dc7dc8": {
"id": "f6f9391e-6776-4878-9c60-0cc807dc7dc8",
"schedule": "5m",
"timestamp": "2024-08-19T08:31:59.274Z",
"description": "",
"type": "disk_encryption",
"check": {
"drives": {
"C": {
"encrypted": true
}
}
},
"success": false,
"rule_name": "Disk Encryption - Windows",
"input": {
"requireAll": true,
"checkDisks": []
},
"a0a8e83d-be75-4aa6-bfa0-5791da6e9186": {
"id": "a0a8e83d-be75-4aa6-bfa0-5791da6e9186",
"schedule": "5m",
"timestamp": "2024-08-19T08:31:59.274Z",
"description": "",
"type": "firewall",
"check": {
"firewall": false
},
"success": false,
"rule_name": "Local Firewall Check - Windows",
"input": {
"enabled": true
}
}
...
}3. Nasměrujte Worker do své aplikace
V Konfigurační soubor Wrangler, nastavit trasu která mapuje Worker na doménu vaší aplikace Access:
{
"route": {
"pattern": "app.example.com/*",
"zone_name": "example.com"
}
}[route]
pattern = "app.example.com/*"
zone_name = "example.com"4. Nasaďte Worker
npx wrangler deployWorker nyní vloží Cf-Access-Firewall-Activated a Cf-Access-Disk-Encrypted hlavičky do požadavků, které projdou zásadami Access pro vaši aplikaci.
{
"headers": {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
"Accept-Encoding": "gzip",
"Accept-Language": "en-US,en;q=0.9,fr-FR;q=0.8,fr;q=0.7,en-GB;q=0.6",
"Cf-Access-Authenticated-User-Email": "[email protected]",
"Cf-Access-Disk-Encrypted": "false",
"Cf-Access-Firewall-Activated": "false",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36"
}
}Můžete ověřit, že tyto hlavičky přijímá origin server.