INTEGRITY Dokumentace

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.

Standardní ověřovací tok pro požadavek na aplikaci Access

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.

Rozšířený ověřovací postup využívá Worker, který předá doplňkové hlavičky požadavku do originu

Přínosy

Tento přístup vám umožňuje:

Než začnete

1. Vytvořte Worker

  1. Vytvořte nový projekt Workers:

    npm create cloudflare@latest -- device-posture-worker

    Př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).
  2. Přejděte do adresáře projektu:

    $ cd device-posture-worker
  3. 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.js
    import { 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.

Příklad identity uživatele
{
  "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 deploy

Worker 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.

Příklad hlaviček požadavku
{
	"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.