
CA Optics — анализатор пробелов в условном доступе Azure AD
Проект архивирован из-за изменения приоритетов разработки и перенаправления моих усилий в сообществе на другие области (PoC, другие инструменты и демо/презентации), проект переведён в режим только для чтения.
Azure AD Conditional Access Gap Analyzer — это решение для выявления пробелов, которые могут существовать в сложных конфигурациях политик условного доступа Azure Active Directory.
Если вы новичок в условном доступе, рекомендуем ознакомиться со следующей статьёй Microsoft: https://docs.microsoft.com/en-us/azure/active-directory/conditional-access/overview
Однострочная команда для запуска этого инструмента: (если вы планируете прочитать только эту часть и уже завершили установку)
node ./ca/main.js --mapping --skipObjectId=259fcf40-ff7c-4625-9b78-cd11793f161f --clearPolicyCache --clearTokenCache --clearMappingCache
После выполнения предварительных требований и прочтения этого README ознакомьтесь со следующим:
политики reportOnly не считаются завершающими:
Читайте: scope
запускайте каждое сканирование с --clearPolicyCache
запускайте каждое сканирование с --clearMappingCache, если вы вносите изменения в группы/пользователей, связанных с политиками
в область действия попадают только политики, нацеленные на пользователей и приложения (это наиболее распространённая область, но означает, например, что политика регистрации безопасности не оценивается)
Читайте: scope
Начните с тестовой среды, чтобы получить опыт и составить представление о механике работы инструмента
если у вас есть известные группы или пользователи, исключённые из политик, определите объекты для исключения из сканирования с помощью --skipObjectIds, если вы не хотите подтвердить исключения
Если вы запускаете сканирование в нескольких средах, убедитесь, что перед запуском новых сканирований удалены логины и кэши
Читайте:параметры
az account clear и выполните новый вход в среду, которую планируете сканировать, с помощью az loginЧитайте другие важные примечания
Release notes: 0.7.1
- Updated depedencies and report text outputs
Release notes: 0.7
- Uses beta endpoint now by default, --expand option now expands the results to report regardless of the use of --allTerminations
Release notes: 0.6.9
- using --expand=9c06d103-f5b0-4404-bb25-aec4636912cd,47087cd3-64e9-470b-980a-5662f498e016 and expand 10 group members to for separate inspection.
Release notes: 0.6.8
- When you update policy with any guest conditions in GUI that policy will be only available from the beta endpoint after the update (during preview).
- This update brings normalization for policies that are transfered to beta endpoint due to this behavior.
- The policy will be evaluated like the previous guest conditions, as long as the following conditions are included "internalGuest,b2bCollaborationGuest,b2bCollaborationMember" and no tenants are excluded from the policy. In order to evaluate transferred policies,
- use '--allowPreviewPolicies' when running CaOptics to account for this behavior
Release notes: 0.6.6-7 beta
- Allow use of different login endpoints for login and graph with params: --altLogin --altGraph
- Allow use of custom filtering for policies (this only recommended, when the policies do not adhere to expected schema)
Release notes: 0.6.5 beta
- Added counter to reporting when high number of permutations is also added to report (default is to add only unterminated)
- Minor code fixes changing <var> to <let>
- Report filename now includes day, month, year and tenantId e.g. report_day_4_month_9_year_2022-tenant_48f55450-183a-45d6-a9ce-68f3cbc68947.csv
Release notes: 0.6.4 beta
- Get more groups per single call (less batching)
- Fix race condition detected when generally using for await loops
- Enclose values with "" between delimitters (CSV)
Release notes: 0.6.3 beta
- Optimizations to way the mapped objects are handled.
- Mapped objects are cached. You can recreate the object mapping by using parama 'clearMappingCache'
- Lookup keys will start from 'user/group/role' conditions always first
- Added possibility to populate usermap with random UUID's to test for performance impact (this just debug option, and not really something that would be in non-beta versions)
Release notes: 0.6.2 beta
- Separated cache params into separate functions -> (clearTokenCache and ClearPolicyCache)
- Added possibility of running pre-optimized algorithm on permutations with param --aggressive (High memory consumption, only here for A/B testing)
- merge completed.
Release notes: 0.6.1 beta
- Basic version of CSV reporting added
- Streamlined permutation generation to ensure essential permutations are generated, and some permutations are are terminated earlier on the lookups
Release notes: 0.6 beta (first non "silent" release)
- App displayNames added to MD report. Object type added to the user type
Release notes: 0.5.2,0.5.1,0.5 beta (see previous branches for release notes)

Пример обнаружения пробелов между политиками
❌ Любая перестановка со значением 0 означает, что для данной конкретной комбинации условий не было завершающих политик.
| Политика | Завершения | поиск |
|---|---|---|
| All | 0 | Applications:88cc92be-d474-4d95-a57d-7b3ef701f510 -> Locations:finland -> users:GuestsOrExternalUsers |
| All | 0 | Applications:88cc92be-d474-4d95-a57d-7b3ef701f510 -> Locations:finland -> users:Jane Doe |
✅ Подробное описание обнаружения читайте в docs/example.md
Перестановки генерируются getPol2.js
Перестановки можно визуализировать с помощью сервиса JSON Crack:
(Визуализация: https://jsoncrack.com/)
Среда выполнения
Если вы предпочитаете не использовать версию «запустил и забыл»```bash nvm use 16 git clone https://github.com/jsa2/caOptics; cd caOptics; npm install;
**Настройка запуска по принципу «выстрелил и забыл» для Azure Cloud Shell (Bash)**```bash
curl -o- https://raw.githubusercontent.com/jsa2/caOptics/main/init.sh | bash;
# Force reload of NVM
export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
# This loads nvm
The input chunk is empty — there is no content to translate. Please provide the Markdown text for chunk 5 of 19.```bash cd caOptics
az login
**Связанное с Azure AD**
- Роль Azure AD Security Reader включена
- Если у вас есть Azure CLI и существующая сессия CLI, этот инструмент будет использовать эту [сессию](https://github.com/jsa2/caoptics/blob/HEAD/tokenHandler/getCode.js).
- Если у вас не установлен Azure CLI, просто используется clientID Azure CLI для получения токенов с помощью потока device_code, инициируемого HTTP-клиентом Node.js
>
**Используются следующие пакеты с открытым исходным кодом**
Чтобы уменьшить объём кода, для работы и оформления используются следующие зависимости (особая благодарность сопровождающим этих замечательных пакетов. Ссылка на лицензию каждого пакета указана в столбце «Лицензия»)
пакет | оформление|работа|лицензия
-|-|-|-
[axios](https://www.npmjs.com/package/axios)||✅ | [MIT](https://github.com/axios/axios/blob/v1.x/LICENSE)
[yargs](https://www.npmjs.com/package/yargs)||✅ | [MIT](https://github.com/yargs/yargs/blob/main/LICENSE)
[jsonwebtoken](https://www.npmjs.com/package/jsonwebtoken) | |✅|[MIT](https://github.com/auth0/node-jsonwebtoken/blob/master/LICENSE)
[chalk](https://www.npmjs.com/package/chalk)| ✅ | |[MIT](https://github.com/chalk/chalk/blob/main/license)
[js-beautify ](https://www.npmjs.com/package/js-beautify) | ✅ | |[MIT](https://github.com/beautify-web/js-beautify/blob/main/LICENSE)
**Какой сетевой доступ нужен для работы?**
1. Для работы необходимы следующие хосты ```sh
graph.microsoft.com
login.microsoftonline.com
Если вы планируете запускать этот инструмент в среде с ограниченным доступом к сети, сначала загрузите зависимости в среде, где разрешён доступ к установке пакетов и github.com. Затем вы можете перенести весь каталог установки в zip-архиве в среду с ограниченным доступом к сети.
Ниже приведён пример трассировки, которую я выполняю при запуске любых сторонних пакетов в своих приложениях Node.js. Он показывает URL-адреса, вызываемые во время выполнения.

Прочтите Лицензию
⚠️ Для параметров запуска не выполняется санитизация ввода, так как всегда предполагается, что ввод этих параметров контролируется, и этот инструмент не работает в неконтролируемой среде (или без присмотра). Хотя я не проверил все пути, я считаю, что добиться выполнения шеллкода тривиально. Этот инструмент не предполагает враждебного ввода, поэтому рекомендуется не вставлять аргументы запуска в командную строку, не проверив их предварительно.
Мы рекомендуем запускать этот инструмент только с правами только на чтение (если у вас установлен AZ CLI, удалите кэш AZ CLI перед продолжением az account clear)
Устаревшая аутентификация (Legacy auth) не оценивается, когда оцениваемая политика включает только условия устаревшей аутентификации — Предыстория: Microsoft находится в процессе отказа от базовой аутентификации для Exchange, поэтому большая часть оценки устаревшей аутентификации скоро (конец 2022 года) станет неактуальной.
Вы по-прежнему можете использовать параметр
--includeLegacyAuth, чтобы включить в набор только политики устаревшей аутентификации. Имейте в виду, что при этом будет предполагаться, что устаревшая аутентификация покрыта для всех приложений (и, следовательно, будет оцениваться также для приложений, не поддерживающих устаревшую аутентификацию), а не только для EXO.
Инструмент хранит локально refresh-токен AZ CLI для сохранения сеанса — токены кэшируются локально в открытом виде (точно так же, как они кэшируются с помощью Azure CLI в BASH, независимо от того, используете ли вы этот инструмент или нет). Хотя кэш токенов может быть зашифрован, в данном случае это не даёт никаких преимуществ для PoC. Шифрование кэша токенов также не сильно поможет, поскольку, возможно, многие другие инструменты/приложения, работающие в системе, хранят непрозрачные refresh-токены в виде открытого текста.
Что касается отчётов и перестановок: я всё ещё работаю над поиском наилучшего баланса между читабельностью и полнотой. Я верю, что все пробелы в рамках охвата обнаружены, но я внёс много изменений в алгоритм таких обнаружений, поэтому всё ещё могут существовать некоторые граничные случаи, которые я не учёл.
Этот инструмент решает проблему поиска пробелов в политиках условного доступа (Conditional Access), даже когда пробел не отображается в журналах входа в систему.
Чем этот инструмент отличается от существующих инструментов?
Дополнительно
¹ Анализатор лучших практик
² Пробел не может быть идентифицирован, если условия, которые его выявляют, никогда не были зафиксированы в журнале входа в систему.
³ Cloud Shell не является строгим требованием, но является хорошей альтернативой для пользователей этого инструмента, у которых может не быть установлен Node.js.
В версии 0.5 охватываются следующие условия:
✅Users / Roles /Groups
✅Cloud apps (только политики, которые определяют все приложения или отдельные приложения, входят в область действия)
✅Device platforms (например, user-agents)
✅Locations
✅Client Apps (например, браузерные / настольные и мобильные приложения) ¹
✅Access Controls (Grant / Block) (только политики, в которых включены элементы управления доступом, входят в область действия ²)
(Всё, что не входит в список, не оценивается. Например, политики на основе риска не считаются покрывающими пробелы, поскольку обнаружение рисков не считается идеальным; их следует использовать скорее в ситуациях, когда вы хотите что-то заблокировать, а не требовать MFA только при наличии связанного риска.)
¹ Учитывая, что Microsoft упраздняет устаревшую аутентификацию (Legacy Auth), устаревшая аутентификация не проверяется. ² Необходимо включить применение политики (политики только для отчёта не оцениваются по умолчанию, но могут быть включены с помощью определённого флага).
Важно понимать, что инструмент отражает мнения его создателей относительно проектирования политик:
Существуют две школы проектирования условного доступа:
На основе включения: применяйте CA только к условиям, которые соответствуют прогнозируемым сценариям использования организации.
На основе исключений: применяйте CA во всех условиях, а затем создавайте узкие исключения для обработки этих исключительных случаев.
⚠ Этот инструмент работает только для второй школы проектирования CA. Основа этого подхода в том, что злоумышленник считает все шаблоны доступа допустимыми, даже те, которые организация может не считать допустимыми для собственного использования. Если ваши сценарии использования не соответствуют подходу, принятому в этом инструменте, мы рекомендуем вместо этого рассмотреть использование существующих инструментов.
Этот подход схож с рекомендацией Microsoft «Применяйте политики условного доступа к каждому приложению» с тем отличием, что, помимо всех приложений, политикой или исключением определённого типа должны быть покрыты также все остальные настроенные условия ¹
Убедитесь, что для каждого приложения применяется хотя бы одна политика условного доступа. С точки зрения безопасности лучше создать политику, которая охватывает все облачные приложения, а затем исключить приложения, на которые вы не хотите распространять политику. Это гарантирует, что вам не придётся обновлять политики условного доступа каждый раз при подключении нового приложения.
¹ Этот инструмент считает пробел покрытым также в тех случаях, когда используется исключение по доверенному местоположению или доверенному устройству, и политика не применяется из-за использования доверенного устройства или местоположения. Стоит отметить, что существуют лучшие практики для администраторов, согласно которым доверенное местоположение или доверенное устройство должно сочетаться с MFA.
Текущий дизайн требует, чтобы все условия сопоставлялись с политикой «Все платформы». Это основано на сценарии, где все клиенты выбраны явно, и, следовательно, в этой конкретной политике не выбраны «неизвестные» клиенты.
Пример такого условия```json "platforms": { "includePlatforms": ["all"], "excludePlatforms": ["macOS"] },
**Reference** https://learn.microsoft.com/en-us/azure/active-directory/conditional-access/concept-conditional-access-conditions#device-platforms
> **Important** <br> *Корпорация Майкрософт рекомендует иметь политику условного доступа для неподдерживаемых платформ устройств. Например, если вы хотите заблокировать доступ к корпоративным ресурсам с Chrome OS или любых других неподдерживаемых клиентов, следует настроить политику с условием «Платформы устройств», которое включает любое устройство и исключает поддерживаемые платформы устройств, а для элемента управления «Предоставление» задать значение «Блокировать доступ».*
---
#### Различия поиска
1. Поиск по роли
> Когда роли используются в качестве условий, поиск исключений/включений определяется только ролью. Это может привести к ситуации, когда политика корректно срабатывает для роли, но пользователь, входящий в эту роль, всё равно может быть исключён из политики в результатах. В результатах оба условия выделяются (не объединяются). Это чисто проектное решение, так как мы хотим показывать срабатывания ролей отдельно, без контекста пользователя или группы.
---
Example:
userID:0cd1b62d-5ff8-497b-9b56-9bb02bc0ab8c is included from All Apps policy
There is admin policy, that covers role of Global administrator, but not the userId.
Both of following conditions would be shown in results:
1. Role GA is excluded individually (1)
2. UserId is not explicitly targeted by group or userId (0)
All (cross-policy) policies matched:1 users:Company Administrator
All (cross-policy) policies matched:0 users:joosua santasalo
---
2. Поиск по группе
> И наоборот, если используются группы, срабатывание политики объединяется, и поэтому исключение пользователя будет показано как завершённое включением группы.
Example:
userID:194383eb-6053-4d1e-bc72-f332be6ca2cb is included from All Apps policy
There is policy which targets the user only by group
Following conditions would be shown in results:
1. User is excluded individually
2. User is targeted via group.
All (cross-policy) policies matched:1 users:Vihtori Santasalo (matched via group)
3. Поиск гостевых пользователей
>Пользователи не сопоставляются как гости в этой версии. Эта функция будет добавлена позже, что позволит перехватывать включения/исключения гостевых userId для корректного сопоставления со свойством ``GuestsOrExternalUsers``.
В настоящее время гостевые пользователи сопоставляются так же, как и обычные пользователи.
>
#### Вложенность групп
>Из-за соображений производительности глубина вложенности при разрешении членства в группах обрабатывается только один раз, если группа является членом другой группы. В противном случае существует риск бесконечного разрешения членства, так как подгруппа может включать любую из корневых групп, что приводит к бесконечному циклу.
Membership:
Group1 -> all members resolved
--> user is member of Group1
--> Group2 is member of Group1 -> all members resolved to Group1
--> Group3 is member of Group1 -> NOT RESOLVED
> Если осмелитесь... вы можете увеличить вложенность прямо в коде... [group.js](https://github.com/jsa2/caoptics/blob/HEAD/ca/mainPlugins/userMappers/group.js)

## Параметры
Param| Description
-|-
``mapping`` | По умолчанию исключения на основе пользователей и групп оцениваются по точному идентификатору объекта. Например, если объект исключён одной политикой, он должен быть найден в другой политике по его точному идентификатору. <br> Использование ``--mapping`` вызывает MS Graph для заполнения связи между объектами так, чтобы, например, пользователь мог быть исключён по userId в одной политике, тогда как оценка обнаруживает, что пользователь включён в другую политику по groupId. <br> напр. ``--mapping``
``clearMappingCache`` | Очищает сопоставления пользователей/групп, полученные при предыдущем запуске <br> напр. ``--clearMappingCache``
``skipObjectId `` | Удаляет ObjectId из перестановок. Это может быть полезно, если вы хотите исключить break-glass учетную запись из результатов <br> напр. ``--skipObjectId=bcd27e9b-8974-42ec-a2a1-ba2498b45674,c7a4a639-00e7-47e0-aa9d-ea502bbbd382``
``skip `` | Удаляет целую категорию перестановок. <br> напр. ``--skip=users``
``includeReportOnly `` | Позволяет смешивать политики reportOnly с включёнными политиками. Удалите существующие политики перед запуском, удалив файл policies.json в корне, или используйте опцию ``clearPolicyCache`` <br> напр. ``--includeReportOnly``
``includeLegacyAuth `` | По умолчанию политики, содержащие только условия устаревшей аутентификации, не оцениваются. Используйте этот флаг, если хотите включить устаревшую аутентификацию в анализ <br> обратите внимание, что включение устаревшей аутентификации приведёт к проверке всех приложений, а не только поддерживаемых рабочих нагрузок (AAD,SPO,EXO) <br> напр. ``--includeLegacyAuth``
``clearPolicyCache `` | Удаляет кэши политик <br> напр. ``--clearPolicyCache``
``clearTokenCache `` | Удаляет кэши токенов <br> напр. ``--clearTokenCache``
``allTerminations`` | Включает также результаты, завершившиеся на политике <br> ``--allTerminations``
``debug`` | Показывает использование памяти и оценку прогресса <br> напр. ``--debug``
``altLogin `` | Позволяет задать альтернативное полное доменное имя конечной точки входа <br> напр. ``--altLogin=login.microsoft.com.alt``
``altGraph `` | Позволяет задать альтернативное полное доменное имя конечной точки Graph <br> напр. ``--altGraph=graph.microsoft.com.alt``
``customPolicyFilter `` | Позволяет использовать пользовательскую фильтрацию политик (рекомендуется только в том случае, если политики не соответствуют ожидаемой схеме) <br> напр. ``--customPolicyFilter`` <br> Вы можете изменить фильтр, выбрав [``customPolicyFilter.js``](https://github.com/jsa2/caoptics/blob/HEAD/ca/mainPlugins/customPolicyFilter.js)
``expand `` | Позволяет задать группу для разворачивания в результатах. По умолчанию группа разворачивается для первых 10 элементов. Количество разворачиваемых элементов можно увеличить, используя совместно опцию ``--expandCount=30``<br> напр. ``--expand=9c06d103-f5b0-4404-bb25-aec4636912cd,47087cd3-64e9-470b-980a-5662f498e016`` <br> Примечание: использование этой опции требует очистки кэша сопоставлений ``--clearMappingCache``
### Передача параметров из launch.json (отладка в VSCode)?
скопируйте текущую JSON-схему и создайте файл с именем launch.json в папке ``.vscode/launch.json`````json
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Launch Program",
"skipFiles": [
"<node_internals>/**"
],
"program": "${workspaceFolder}/ca/main.js",
//"program": "${file}",
"args": [
"--skipObjectId=259fcf40-ff7c-4625-9b78-cd11793f161f",
"--mapping",
"--clearMappingCache",
"--clearPolicyCache",
"--clearTokenCache",
"--customPolicyFilter",
"--allowPreviewPolicies=beta",
// "--altGraph=graph.microsoft.com",
// "--allPlatforms",
// "--includeReportOnly",
//"--inject",
//"--clearPolicyCache",
// "--skipCleaning",
// "--allTerminations",
// "--aggressive",
"--debug",
],
"runtimeArgs": [
"--max-old-space-size=4096"
]
}
]
}
Перед первым запуском инструмента```sh #Navigate to the cloned folder cd caOptics; #Install depedencies npm install
Каждый запуск инициирует вход в систему, если сеанс не сохранён. Если у вас есть сеанс в Azure CLI и вы хотите использовать другой сеанс, то в Azure CLI выполните ``Az Account Clear``
1. Статический запуск (без [mapping](#parameters) )
>``node ./ca/main.js ``
2. Статический запуск (с [mapping](#parameters) )
>``node ./ca/main.js --mapping``
3. Указание ``skipObjectId=yourID`` для исключения группы Break glass
>``node ./ca/main.js --mapping --skipObjectId=259fcf40-ff7c-4625-9b78-cd11793f161f``
Кроме того, если вы экспериментируете с инструментом, рекомендуется добавить параметр ``--clearPolicyCache --clearTokencache``. Это удалит существующие токены сеанса и файл policy.json (кэш)
>удалите policies.json из папки проекта, если вы не хотите удалять сеанс из кэша, а просто хотите, чтобы политики были удалены
**Ожидаемый результат (на основе примера данных)**
Policy | Permutation | Terminations | lookup
-|-|-|-
All (cross-policy)| 33a51ecbcc58466a90b6bea66b239c74| 0| Locations:10a25087-9bf6-479b-a2a1-37e814310c90 -> Platforms:macOS -> clientAppTypes:mobileAppsAndDesktopClients -> users:All
All (cross-policy)| 4194a5e64e054764bd8774d4992887b9| 0| Locations:10a25087-9bf6-479b-a2a1-37e814310c90 -> Platforms:macOS -> clientAppTypes:mobileAppsAndDesktopClients
All (cross-policy)| 24f38821ea8e4331aeae7c078a727236| 1| Locations:10a25087-9bf6-479b-a2a1-37e814310c90 -> Platforms:macOS
## Просмотр отчётов
Все успешные запуски выводят ``crosstable.md`` (таблицу Markdown) и csv ``report.csv``
- Каждый новый запуск инструмента стирает предыдущий отчёт
**Пример отчёта .csv**```
users Applications clientAppTypes Platforms locations terminations
----- ------------ -------------- --------- --------- ----------
GuestsOrExternalUsers All browser macOS finland 0
user-Joosua Santasalo All browser macOS finland 0
user-Joosua Santasalo All mobileAppsAndDesktopClients macOS finland 0
All All browser macOS finland 0
Пример .json дампа```json [ { "policy": "all", "lineage": "Platforms:macOS -> clientAppTypes:browser -> users:All -> Locations:10a25087-9bf6-479b-a2a1-37e814310c90 -> ", "lookup": "Locations:10a25087-9bf6-479b-a2a1-37e814310c90", "terminated": [] }, { "policy": "all", "lineage": "Platforms:macOS -> clientAppTypes:browser -> users:GuestsOrExternalUsers -> Locations:10a25087-9bf6-479b-a2a1-37e814310c90 -> ", "lookup": "Locations:10a25087-9bf6-479b-a2a1-37e814310c90", "terminated": [] } ]
## Устранение неполадок
- Если вы используете AZ CLI для входа в сеанс, начните с ``az account clear``
- При запуске инструмента добавьте ``--clearPolicyCache --clearTokencache`` для очистки кэшей (токенов, политик и расположений)
- удалите существующие policies.json и namedLocations.json из корня проекта вручную (если вы не используете опцию ``--clearPolicyCache --clearTokencache`` )
- Если включения групп, похоже, не работают, убедитесь, что выбрано ``--mapping``, и что у вас нет вложенности глубже двух групп
---
**Тестирование в Azure Cloud Shell**
Если вы тестируете это решение в более крупной среде. Включите ``--debug`` в параметрах и, если возможно, увеличьте размер кучи node `` --max-old-space-size=4096 ``
- Опыт тестирования показал, что количество перестановок может достигать довольно больших значений в крупных средах. Запуск в режиме отладки может помочь указать, где может возникнуть проблема. В таких сценариях использование Cloud Shell может оказаться неприемлемым (хотя алгоритм перестановок теперь значительно снизил использование памяти, я не смог подтвердить, что Cloud Shell будет работать в крупных средах)
> Поскольку текущий алгоритм генерации перестановок значительно сокращён по сравнению с исходным, даже Cloud Shell должен работать, но, например, состояние гонки или другая утечка памяти всё ещё могут таиться где-то и проявляться в более крупных средах, сводя на нет преимущества текущего алгоритма.
``node --max-old-space-size=4096 ./ca/main.js --mapping --skipObjectId=259fcf40-ff7c-4625-9b78-cd11793f161f --clearPolicyCache --debug``
---
- В политиках CA могут быть пустые ссылки, и поэтому при поиске будет отображаться незавершённое условие
>
# Внесение вклада
Откройте pull request или создайте issue в зависимости от масштаба запроса.
| All | 0 | Applications:88cc92be-d474-4d95-a57d-7b3ef701f510 -> Locations:finland -> users:John Doe |
| Инструмент | BPA ¹ | Анализ пробелов | Дополнительные требования |
|---|
Microsoft Azure AD Assessment | ✅ | - только касательно BPA | регистрация нового приложения |
Conditional access gap analyzer workbook | - | ² Только когда пробел можно связать с событием входа | журналы экспортируются в рабочую область Log Analytics |
CA Optics | - | ✅ | ³ Доступ к Azure Cloud Shell и разрешения на чтение политик CA через MS Graph API |