INTEGRITY Документация

Cloudflare Access

С помощью Cloudflare Access вы можете ограничить круг пользователей, которым разрешен доступ к вашему приложению. Вы сами решаете, кто получает доступ, и каждый запрос проверяется до того, как запустится ваш Worker. Одобренным посетителям доступ предоставляется, а остальным показывается страница входа или доступ блокируется.

Можно защитить:

Прежде чем начать

Чтобы использовать Access с Workers, вам потребуется:

Выберите, что нужно защитить

Я хочу защитить... Раздел Тип назначения API
Предпросмотр развертываний для все Workers Защита всех Workers all_preview_workers
Продакшен- и preview-развёртывания для все Workers Защита всех Workers all_workers
Предпросмотр развертываний для один Worker Защита одного Worker preview_worker
Продакшен- и preview-развёртывания для один Worker Защита одного Worker worker
Конкретный hostname: это может быть workers.dev, Custom Domain или путь Защита определённого имени хоста, Custom Domain или пути Домен локально размещённого приложения

Защита всех Workers

Требуйте вход на каждом Worker в вашем аккаунте, включая Workers, которые вы развернёте в будущем. Вход можно требовать только для preview-развёртываний либо одновременно для продакшен- и preview-развёртываний.

Путь в Dashboard: Workers & Pages страница обзора > Защита всех Workers.

Обзор Workers & Pages с карточкой Protect all Workers и списком приложений Workers.
  1. На панели управления Cloudflare перейдите к разделу Workers & Pages страницу.

    Перейдите в Workers & Pages ↗
  2. Найдите Защита всех Workers карточка.

  3. Если на карточке указано Не включено, выберите Включите Access.

  4. Выберите Только предпросмотры или Весь трафик.

  5. В разделе Политика аутентификации, выберите существующую политику или настройте одну из параметры политики.

  6. Выберите Включите Access.

  7. (Необязательно) Проверьте длительность сессии.

    Диалоговое окно Manage Access for all Workers с параметрами области трафика и настройками политики.
  8. Выберите Применить Access.

Чтобы защитить только предварительные развёртывания для каждого Worker, создайте локально размещённое приложение Access с all_preview_workers назначения:

"destinations": [
  {
    "type": "all_preview_workers"
  }
]

Чтобы защитить продакшен и предварительные развёртывания каждого Worker, используйте all_workers вместо этого:

"destinations": [
  {
    "type": "all_workers"
  }
]

Отправьте эти destinations в POST /accounts/{account_id}/access/apps запрос. Полную схему запроса, включая параметры политики, настройки сессии и дополнительные параметры Access см. API приложений Access.

Защита одного Worker

Требуйте вход на одном Worker. Это автоматически защищает все домены, связанные с этим Worker, включая его маршруты, Custom Domains, workers.dev хост и превью. Можно требовать вход только для превью деплоев либо и для продакшен, и для превью деплоев.

Путь в Dashboard: Workers & Pages > выберите Worker > Доступ.

Вкладка Access для Worker, на которой показан незащищённый Worker и кнопка Protect this Worker behind Access.
  1. На панели управления Cloudflare перейдите к разделу Workers & Pages страницу.

    Перейдите в Workers & Pages ↗
  2. Выберите свой Worker из списка приложений.

  3. Выберите Доступ на вкладке.

  4. Выберите Защита этого Worker через Access.

  5. Выберите Только предпросмотры или Весь трафик.

  6. В разделе Политика аутентификации, выберите существующую политику или настройте одну из параметры политики.

  7. (Необязательно) Проверьте длительность сессии.

    Диалоговое окно Enable Access on one Worker с настройками охвата трафика и политиками.
  8. Выберите Применить Access.

Чтобы защитить только предварительные развёртывания для одного Worker, создайте локально размещённое приложение Access с preview_worker назначения. Укажите worker_id к идентификатору вашего Worker:

curl "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/access/apps" \
  --request POST \
  --header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
  --json '{
    "type": "self_hosted",
    "name": "Access for my-worker",
    "destinations": [
      {
        "type": "preview_worker",
        "worker_id": "c81a2d22c29840ed9d61681a3270dbff"
      }
    ],
    "policies": [
      {
        "decision": "allow",
        "include": [
          {
            "email_domain": {
              "domain": "example.com"
            }
          }
        ]
      }
    ]
  }'

Чтобы защитить продакшен и предварительные развёртывания Worker, используйте worker вместо этого:

"destinations": [
  {
    "type": "worker",
    "worker_id": "c81a2d22c29840ed9d61681a3270dbff"
  }
]

Полную схему запроса, включая параметры политики и настроек сессии см. API приложений Access.

Защита определённого имени хоста, Custom Domain или пути

Используйте Access на основе имени хоста, если авторизация должна требоваться только для определённого URL, ведущего к вашему Worker, например для workers.dev хост, Custom Domain, поддомен или путь. Access на основе хоста защищает только этот конкретный URL, тогда как защита Worker защищает весь Worker независимо от способа обращения к нему. Например, при использовании Access на основе имени хоста вы можете защитить my-worker.example.workers.dev, admin.example.com, либо один путь, например example.com/login чтобы сделать закрытой только часть своего Worker.

И в панели управления, и через API защита имени хоста или пути настраивается созданием приложение с самостоятельным хостингом и используя имя хоста или путь в качестве домена приложения.

Создайте самостоятельно размещенное приложение в Zero Trust > Доступ > Приложения. Чтобы настроить соответствие поддоменам, нескольким путям или подстановочным знакам, см. Пути приложения.

Создайте самостоятельно размещенное приложение с POST /accounts/{account_id}/access/apps запрос, задав в качестве домена приложения имя хоста или путь. Полную схему запроса см. в API приложений Access.

Сделайте Worker публичным, когда все Workers защищены

Если Access на уровне аккаунта защищает все Workers, вы можете сделать конкретный Worker публичным, добавив обход (bypass) на уровне Worker. Обход означает, что Access не требует входа в систему для этого Worker.

Путь в Dashboard: Workers & Pages > выберите Worker > Доступ.

Диалоговое окно управления доступом Worker с политикой обхода Make this Worker public.
  1. На панели управления Cloudflare перейдите к разделу Workers & Pages страницу.

    Перейдите в Workers & Pages ↗
  2. Выберите свой Worker из списка приложений.

  3. Выберите Доступ на вкладке.

  4. Выберите опцию, чтобы сделать Worker публичным или обойти Access на уровне аккаунта.

  5. Подтвердите изменение.

Создайте Access-приложение на уровне Worker с политикой обхода. Используйте worker назначения укажите worker_id к идентификатору вашего Worker и задайте политику decision к bypass с include правило, которое соответствует всем:

"policies": [
  {
    "decision": "bypass",
    "include": [
      {
        "everyone": {}
      }
    ]
  }
]

Параметры политики

Включая Access, выберите, кто сможет входить в систему. Одни и те же варианты политик доступны независимо от того, защищаете вы все Workers или только один Worker.

Параметр политики Результат
Аккаунт Cloudflare Позволяет входить участникам этого аккаунта Cloudflare. Используйте этот вариант, если доступ должен быть ограничен только теми, кто уже состоит в аккаунте.
Домен электронной почты Позволяет входить любому пользователю с подтверждённым адресом электронной почты в указанном домене, например example.com. Используйте этот параметр, если доступ должен быть у сотрудников компании или организации, даже если они не являются участниками аккаунта Cloudflare.

Можно добавить одну или несколько политик. Войти смогут посетители, соответствующие любой из выбранных политик.

Для расширенной настройки политик, например нескольких провайдеров идентификации, правил device posture, service tokens, сложного порядка политик или пользовательских страниц входа и блокировки, отредактируйте приложение Access в Zero Trust после его создания. Полный список параметров см. в Политики доступа.

Получение личности аутентифицированного пользователя через ctx.access

Когда Cloudflare Access аутентифицирует запрос, который напрямую обращается к вашему Worker, Worker может прочитать данные вошедшего в систему пользователя, включая email, группы, состояние устройства и дополнительные поля идентификации : через ctx.access. Дополнительная настройка или разбор JWT не требуются.

Используйте это, чтобы персонализировать ответы, применять детализированные разрешения или вести журнал активности по пользователям.

ctx.access это undefined если Access не аутентифицировал запрос.

export default {
	async fetch(request, env, ctx) {
		if (!ctx.access) {
			return new Response("Access required", { status: 403 });
		}

		const identity = await ctx.access.getIdentity();
		const email = identity?.email ?? "unknown";

		return new Response(`Hello, ${email}`);
	},
};
export default {
	async fetch(request, env, ctx) {
		if (!ctx.access) {
			return new Response("Access required", { status: 403 });
		}

		const identity = await ctx.access.getIdentity();
		const email = identity?.email ?? "unknown";

		return new Response(`Hello, ${email}`);
	},
};

ctx.access ограничения

Локальное тестирование ctx.access

При локальной разработке с wrangler dev или Cloudflare Vite Plugin, вы можете имитировать аутентифицированные удостоверения Cloudflare Access, не выполняя развёртывание и не проходя процесс входа Access.

Добавьте dev блок внутри access конфигурацию в вашем wrangler.jsonc:

{
	"access": {
		"dev": {
			"aud": "my-app",
			"identity": { "email": "[email protected]" }
		}
	}
}
[access.dev]
aud = "my-app"

  [access.dev.identity]
  email = "[email protected]"

Чтобы протестировать от имени другого пользователя, измените поля идентификации и перезапустите. Чтобы протестировать неаутентифицированные запросы, удалите dev блок: ctx.access будет undefined, так же как для запроса, который не проходил через Access в продакшене.

Пример Worker

export default {
	async fetch(request, env, ctx) {
		if (!ctx.access) {
			return new Response("Not authenticated", { status: 403 });
		}

		const identity = await ctx.access.getIdentity();
		const email = identity?.email ?? "unknown";

		return new Response(`Hello, ${email}`);
	},
};
export default {
	async fetch(request, env, ctx) {
		if (!ctx.access) {
			return new Response("Not authenticated", { status: 403 });
		}

		const identity = await ctx.access.getIdentity();
		const email = identity?.email ?? "unknown";

		return new Response(`Hello, ${email}`);
	},
};

При такой конфигурации переход по localhost:8787 вернёт Hello, [email protected].

Поля идентификации

Объект identity принимает любые поля, соответствующие форме production Access identity. Полный список приведён в Application token: удостоверение пользователя.

Отключить Access

Чтобы отключить Access на уровне Worker или на уровне аккаунта, откройте Доступ вкладку или Защита всех Workers карточку и отключите соответствующее правило Access.

Удалить приложение Access, которое защищает Worker, все Workers, либо хост или путь, ведущий к Worker.

Изучите иерархию Access

Worker может быть защищен несколькими правилами Access. Если к одному запросу может применяться несколько правил, в первую очередь действует наиболее специфичное правило:

  1. Access на основе имени хоста или пути: Применяется первым, если запрос соответствует этому имени хоста или пути, например admin.example.com или example.com/login.
  2. Access на уровне Worker: Применяется далее для выбранного Worker по всем его маршрутам, Custom Domains, workers.dev хост и превью.
  3. Доступ к Worker на уровне аккаунта: Применяется последним как запасной вариант для всех Worker или всех предпросмотров Worker в аккаунте.

Например, если у Worker есть и Access на уровне аккаунта, и правило на уровне Worker, то именно правило на уровне Worker управляет этим Worker. Если также существует соответствующее приложение Access, основанное на hostname или path, то именно это правило для hostname или path управляет соответствующим URL.

Если вы удалите более специфичное правило, Worker может остаться защищённым более общим правилом. Например, удаление Access на уровне Worker может открыть Access на уровне аккаунта, действующий под ним.