From 251f98d12096f1657ca40795e12067a9d7fed6e9 Mon Sep 17 00:00:00 2001 From: gregslack78 <85254974+gregslack78@users.noreply.github.com> Date: Thu, 18 Apr 2024 17:33:52 -0400 Subject: [PATCH] Adding fixes (#570) --- Docs/Images/createGHBranch.jpg | Bin 0 -> 148443 bytes Docs/Images/releases.jpg | Bin 0 -> 65587 bytes Docs/Images/samplePRNotes.jpg | Bin 0 -> 33973 bytes Docs/policy-exemptions.md | 399 ++++-- Docs/settings-global-setting-file.md | 2 + Schemas/global-settings-schema.json | 3 + Scripts/Deploy/Build-DeploymentPlans.ps1 | 7 +- Scripts/Deploy/Deploy-PolicyPlan.ps1 | 2 +- Scripts/Deploy/Deploy-RolesPlan.ps1 | 2 +- .../Build-AssignmentDefinitionAtLeaf.ps1 | 4 +- Scripts/Helpers/Build-AssignmentPlan.ps1 | 2 +- Scripts/Helpers/Build-ExemptionsPlan.ps1 | 1154 +++++++++-------- ...Build-ScopeTableForDeploymentRootScope.ps1 | 14 +- ...ulatedPolicyAssignmentsAndReferenceIds.ps1 | 2 - Scripts/Helpers/Get-GlobalSettings.ps1 | 24 + .../Set-AzRoleAssignmentRestMethod.ps1 | 5 + .../Helpers/Set-AzCloudTenantSubscription.ps1 | 16 +- Scripts/Helpers/Write-AssignmentDetails.ps1 | 2 +- 18 files changed, 956 insertions(+), 682 deletions(-) create mode 100644 Docs/Images/createGHBranch.jpg create mode 100644 Docs/Images/releases.jpg create mode 100644 Docs/Images/samplePRNotes.jpg diff --git a/Docs/Images/createGHBranch.jpg b/Docs/Images/createGHBranch.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d1555468ce4d28bfcee8fd2d2d43ebf7fa36656e GIT binary patch literal 148443 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

#I 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%0A_%0ay~fDhFN*Z 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 hJ306+kA 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 bf9xaqj_bxn{-15O(EIOu^=B7Bf6e|MR0q`_ literal 0 HcmV?d00001 diff --git a/Docs/Images/samplePRNotes.jpg b/Docs/Images/samplePRNotes.jpg new file mode 100644 index 0000000000000000000000000000000000000000..65a06f488eacb1a38b230cb225899276715e4482 GIT binary patch literal 33973 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

asYRE|^94c$G!IwIr}@1ZmTWb(%}56Wv2~^| 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 H?cV [!TIP] +> The changes implementing [Option **A** below](#option-a-policy-definition-ids-or-names) makes JSON files easier to read than CSV files. We recommend using **Policy definition Ids or Names** for new exemptions and **JSON** files instead of CSV files. Of course, CSV files are still supported. You may even mix and match the two formats in the same folder. ## Exemption Folder Structure Exemptions can be defined as JSON or CSV files (we recommend that you use CSV files). The names of the definition files don't matter. If multiple files exists in a folder, the lists from all the files are added together. -The pacEnvironment (see global-settings.jsonc) is represented with a folder structure under the folder policyExemptions, such as epac-dev, tenant, ... A missing folder indicates that the pacEnvironment's Exemptions are not managed by this solution. To extract existing exemptions, the operations script Get-AzExemptions.ps1 can be used to generate JSON and CSV files. The output may be used to start the Exemption definitions. This same output is also created when [Extract existing Policy Resources from an Environment](start-extracting-policy-resources.md). +The pacEnvironment (see global-settings.jsonc) is represented with a folder structure under the folder policyExemptions, such as epac-dev, tenant, ... A missing folder indicates that the pacEnvironment's Exemptions are not managed by this solution. To extract existing exemptions, the operations script Get-AzExemptions.ps1 can be used to generate JSON and CSV files. The output may be used to start the Exemption definitions. This same output is also created when [Extract existing Policy Resources from an Environment](epac-extracting-policy-resources.md). A typical folder structure might look like this: @@ -32,29 +35,24 @@ To utilize the schema add a ```$schema``` tag to the JSON file. ## Defining Exemptions > [!TIP] -> In v10.0.0, exemptions can be defined by specifying the Policy definition Ids or Names instead of Policy Assignment Ids. This significantly reduces the complexity of defining exemptions for Policy Sets with overlapping Policy definitions. **We recommend using Policy definition Ids or Names for new exemptions.** +> In v10.0.0, exemptions can be defined by specifying the Policy definition Ids or Names instead of Policy Assignment Ids. This significantly reduces the complexity of defining exemptions for Policy Sets with overlapping Policy definitions. Each exemption must define the following properties: -- `name` - unique name, we recommend a GUID. +- `name` - unique name, we recommend a short human readable name. - `displayName` - descriptive name displayed on portal. - `exemptionCategory` - `Waiver` or `Mitigated`. -- Policy or Policies to be exempted -- `scope` - Management Group, subscription, Resource Group or resource. -- `metadata` - valid JSON (see JSON format below) +- Item to exempt; one of the following: + - `policyDefinitionId`, or `policyDefinitionName` - exempts the Policy definition in all applicable Policy Assignments. + - `policySetDefinitionId`, or `policySetDefinitionName` - exempts all Policies in the Policy Set, or a subset if `policyDefinitionsReferenceIds` are specified. + - `policyAssignmentId`to be exempted. For Assignments of a Policy Set, you may add `policyDefinitionReferenceIds` to exempt specific Policies within the Policy Set. +- `scope` or `scopes` - Management Group, subscription, Resource Group or resource. - Optional - `expiresOn` - empty or expiry date. - `assignmentScopeValidation` - `Default` or `DoNotValidate` - `resourceSelectors` - valid JSON (see JSON format below) + - `metadata` - valid JSON (see JSON format below) -### Specifying Policy or Policies to be Exempted - -The following properties can be used to specify the Policy or Policies to be exempted: - -- Option **A**: Policy definition Ids or Names (**recommended**) -- Option **B**: Policy Assignment Id and for Policy Sets a list of Policy definition Ids or Names, or policyDefinitionReferenceIds (**legacy - no longer recommended**) -- Option **C**: Policy Set definition Ids or Names and a list of Policy definition Ids or Names, or policyDefinitionReferenceIds (**included for completeness, do not use**) - -## Metadata +### Metadata You can use `metadata` for additional information. @@ -62,125 +60,304 @@ EPAC injects `deployedBy` into the `metadata` section. This is a string that ide **Not recommended:** Adding `deployedBy` to the `metadata` section in the Policy definition file will override the value for this Exemption only from `global-settings.jsonc` or default value. -### CSV Format +## Specifying Policy or Policies to be Exempted -The columns must have the headers as described above. The order of the columns is not important. +The following properties can be used to specify the Policy or Policies to be exempted. -#### Regular Columns +> [!CAUTION] +> `assignmentScopeValidation` value `DoNotValidate` only works reliably for Option **B**. It may work for Option **A** and **C** in some cases, but it is not recommended. EPAC cannot gracefully handle this and display a specific error message. Instead, it will display a generic error message with the following text `"Exemption entry $($entryNumber): No assignments found for scope $($currentScope), skipping entry."`. -- `name` - unique name, we recommend a GUID. -- `displayName` - descriptive name displayed on portal. -- `exemptionCategory` - `Waiver` or `Mitigated`. -- `scope` - Management Group, subscription, Resource Group or resource. -- `metadata` - valid JSON (see JSON format below) -- Optional - - `expiresOn` - empty or expiry date. - - `assignmentScopeValidation` - `Default` or `DoNotValidate` - - `resourceSelectors` - valid JSON (see JSON format below) +### Option **A**: Policy definition Ids or Names -#### Option A: Policy definition Ids or Names +> [!TIP] +> We recommend using this option for new exemptions, except when exempting multiple Policies in a Policy Set. -- Column `assignmentReferenceId` must be formatted: - - For Built-in Policy definition: `/providers/Microsoft.Authorization/policyDefinitions/00000000-0000-0000-0000-000000000000` - - For Custom Policy definition: `policyDefinitions/{{policyDefinitionName}}` -- Column `policyDefinitionReferenceIds` must be empty +It creates one exemption per Assignment containing the Policy definition (direct or indirect through a Policy Sets). `policyDefinitionReferenceIds` must be empty (omitted). This is the simplest and most readable way to define exemptions. Specify one of the following: -#### Option B: Policy Assignment Id +- `policyDefinitionId` for built-in Policy definitions in the form `"/providers/Microsoft.Authorization/policyDefinitions/00000000-0000-0000-0000-000000000000"`. +- `policyDefinitionName` for custom Policy definitions. In CSV files specify the cell in `assignmentReferenceId` as `"policyDefinitions/{{policyDefinitionName}}"`. -- Column `assignmentReferenceId` must be a Policy Assignment Id: - - `/providers/Microsoft.Management/managementGroups/{{managementGroupId}}/providers/Microsoft.Authorization/policyAssignments/{{policyAssignmentName}}` -- Column `policyDefinitionReferenceIds` must be a comma separated list containing any of the following: - - Empty for Policy Assignment of a single Policy, or to exempt the scope from every Policy in the assigned Policy Set - - policyDefinitionReferenceId from the assigned Policy Set definition - - For Built-in Policy definition: `/providers/Microsoft.Authorization/policyDefinitions/00000000-0000-0000-0000-000000000000` - - For Custom Policy definition: `policyDefinitions/{{policyDefinitionName}}` +### Option **B**: Policy Assignment Id -#### Option C: Policy Set definition Ids or Names +It creates one exemption for the specified Policy Assignment. This is the traditional way of defining an Exemption. It is still useful for exempting multiple Policies in an assigned Policy Set with one exemption. Specify the following: -- Column `assignmentReferenceId` must be a Policy Set definition Id or Name: - - For Built-in Policy Set definition: `/providers/Microsoft.Authorization/policySetDefinitions/00000000-0000-0000-0000-000000000000` - - For Custom Policy Set definition: `policySetDefinitions/{{policySetDefinitionName}}` -- Column `policyDefinitionReferenceIds` must be a comma separated list containing any of the following: - - Empty for Policy Assignment of a single Policy, or to exempt the scope from every Policy in the assigned Policy Set - - policyDefinitionReferenceId from the assigned Policy Set definition - - For Built-in Policy definition: `/providers/Microsoft.Authorization/policyDefinitions/00000000-0000-0000-0000-000000000000` - - For Custom Policy definition: `policyDefinitions/{{policyDefinitionName}}` +- `policyAssignmentId` for the Policy Assignment in the form `/providers/Microsoft.Management/managementGroups/{{managementGroupId}}/providers/Microsoft.Authorization/policyAssignments/{{policyAssignmentName}}`. +- Optionally, for Policy Set Assignments only, `policyDefinitionReferenceIds` containing an array of [strings as detailed below](#specifying-policydefinitionreferenceids). + +In CSV files, the column `policyAssignmentId` is still supported for backward compatibility for **Option B** only. + +> [!TIP] +> We recommend using the column `assignmentReferenceId` for every options, including option **B**. + +### Option **C**: Policy Set definition Ids or Names + +It creates one exemption per Assignment assigning the Policy Set definition. It is useful for exempting multiple Policies in a Policy Set with one exemption. Specify the following: + +- `policySetDefinitionId` for built-in Policy Set definitions in the form `"/providers/Microsoft.Authorization/policySetDefinitions/00000000-0000-0000-0000-000000000000"`. +- `policySetDefinitionName` for custom Policy Set definitions. In CSV files specify the cell in `assignmentReferenceId` as `"policySetDefinitions/{{policySetDefinitionName}}"`. +- Optionally, for Policy Set Assignments only, `policyDefinitionReferenceIds` containing an array of [strings as detailed below](#specifying-policydefinitionreferenceids). + +In CSV files use the column `assignmentReferenceId`, and optionally `policyDefinitionReferenceIds`. + +### Specifying `policyDefinitionReferenceIds` + +`policyDefinitionReferenceIds` is used to exempt specific Policies within a Policy Set. It is only used explicitly with `policyAssignmentId` and `policySetDefinitionId` or `policySetDefinitionName`. For `policyDefinitionId` and `policyDefinitionName`, it is calculated by EPAC and should be empty. + +`policyDefinitionReferenceIds` is an array of strings. Each string can be one of the following: + +- `policyDefinitionReferenceId` as specified in the Policy Set definition. +- `policyDefinitionId` for built-in Policy definitions in the form `"/providers/Microsoft.Authorization/policyDefinitions/00000000-0000-0000-0000-000000000000"`. +- `policyDefinitionName` for custom Policy definitions in the form `"policyDefinitions/{{policyDefinitionName}}"`. + +In CSV files, `policyDefinitionReferenceIds` is a list of ampersand `&` separated strings. In JSON files, it is an array of strings. + +## Defining the Scope with `scope` or `scopes` -### JSON Format +The `scope` property is used to define a single scope. The `scopes` property is used to define multiple scopes. `scopes` was introduced in v10.1.0. -The fields are the same as the CSV format: +> [!TIP] +> Using a `scopes` array creates nicely concatenated values for `displayName` and `description` for single scope. We recommend to **always** use `scopes`. You can suppress the concatenation by adding a colon `:` at the beginning of each string before the scope. + +### `scope` defines a single scope + +It is unchanged from previous versions. + +### `scopes` Defines multiple Scopes in a single Entry + + A list of Management Groups, subscriptions, Resource Groups or resource Ids. In CSV files it is a list separated by an ampersand `&`. In JSON files it is an array of strings. + + The last part of the scope is used as a postfix in the exemption `displayName` and `description` to make it easier to identify the scope. This behavior can be overridden by: + + - Adding a human readable name followed by a colon `:` before the scope: `humanReadableName:/subscriptions/11111111-2222-3333-4444-555555555555`. + - Adding just a colon `:` before the scope to suppress the concatenation: `:/subscriptions/11111111-2222-3333-4444-555555555555`. + +In CSV files, the `scope` column is still supported for backward compatibility. We recommend using the `scopes` column for all new exemptions. `scopes` is a list of ampersand `&` separated strings. + +In JSON files, `scope` is a string and `scopes` is an array of strings. + + ## Combining Policy Definitions at multiple Scopes + + When using **Option A** or **Option C** and/or `scopes`, EPAC needs to generate concatenated values for `name`, `displayName`, and `description` to ensure uniqueness and readability. + + - `name` is generated by concatenating the `name` with a dash `-` and the Assignment `name` (the last part of the `policyAssignmentId`). + - `displayName` and `description` are generated by concatenating the `displayName` and `description` with a a space dash space (` - `), the last part of the scope, or the human readable name before the colon `:` (if using `scopes`). + +It is best to explain the details with examples. They are based on JSON files, but the same principles apply to CSV files. + + ### Example with `policyDefinition` and `scopes` + +#### Definition file: + +```json + { + "exemptions": [ + { + "name": "short-name", + "displayName": "Descriptive name displayed on portal", + "description": "More details", + "exemptionCategory": "Waiver", + "scopes": [ + "/subscriptions/11111111-2222-3333-4444-555555555555", + "/subscriptions/11111111-2222-3333-4444-555555555556/resourceGroups/resourceGroupName1", + ], + "policyDefinitionId": "/providers/microsoft.authorization/policyDefinitions/00000000-0000-0000-0000-000000000000", + } + ] + } + ``` + +#### Generated fields for each assignment with the Policy specified: + +- `name` is the same for all the scopes: "short-name-assignmentName" +- `displayName`: "Descriptive name displayed on portal - 11111111-2222-3333-4444-555555555555 - assignmentName" +- `displayName`: "Descriptive name displayed on portal - resourceGroupName1 - assignmentName" +- `description`: "More details - 11111111-2222-3333-4444-555555555555 - assignmentName" +- `description`: "More details - resourceGroupName1 - assignmentName" + + + ### Example with `policyDefinition`, `scopes` and a human readable name + +#### Definition file: + +```json + { + "exemptions": [ + { + "name": "short-name", + "displayName": "Descriptive name displayed on portal", + "description": "More details", + "exemptionCategory": "Waiver", + "scopes": [ + "humanReadableName:/subscriptions/11111111-2222-3333-4444-555555555555", + "/subscriptions/11111111-2222-3333-4444-555555555556/resourceGroups/resourceGroupName1", + ], + "policyDefinitionId": "/providers/microsoft.authorization/policyDefinitions/00000000-0000-0000-0000-000000000000", + } + ] + } + ``` + +#### Generated fields for each assignment with the Policy specified: + +- `name` is the same for all the scopes: "short-name-assignmentName" +- `displayName`: "Descriptive name displayed on portal - humanReadableName - assignmentName - humanReadableName" +- `displayName`: "Descriptive name displayed on portal - resourceGroupName1 - assignmentName " +- `description`: "More details - humanReadableName - assignmentName" +- `description`: "More details - resourceGroupName1 - assignmentName" + + ### Example with `policyDefinition` and a single `scope` + +#### Definition file: + +```json + { + "exemptions": [ + { + "name": "short-name", + "displayName": "Descriptive name displayed on portal", + "description": "More details", + "exemptionCategory": "Waiver", + "scope": "/subscriptions/11111111-2222-3333-4444-555555555555/resourceGroups/resourceGroupName1", + "policyDefinitionId": "/providers/microsoft.authorization/policyDefinitions/00000000-0000-0000-0000-000000000000", + } + ] + } + ``` + +#### Generated fields for the assignment with the Policy specified: + +- `name`: "short-name-assignmentName" +- `displayName`: "Descriptive name displayed on portal - assignmentName" +- `description`: "More details - assignmentName" + + ### Example with `policyAssignmentId` and `scopes` + +#### Definition file: + +```json + { + "exemptions": [ + { + "name": "short-name", + "displayName": "Descriptive name displayed on portal", + "description": "More details", + "exemptionCategory": "Waiver", + "scope": [ + "/subscriptions/11111111-2222-3333-4444-555555555555", + "/subscriptions/11111111-2222-3333-4444-555555555556/resourceGroups/resourceGroupName1", + ], + "policyAssignmentId": "/providers/Microsoft.Management/managementGroups/{{managementGroupId}}/providers/Microsoft.Authorization/policyAssignments/{{policyAssignmentName}}", + } + ] + } + ``` + +#### Generated fields for this assignment: + +- `name`: "short-name" +- `displayName`: "Descriptive name displayed on portal - 11111111-2222-3333-4444-555555555555 +- `displayName`: "Descriptive name displayed on portal - resourceGroupName1" +- `description`: "More details - 11111111-2222-3333-4444-555555555555" +- `description`: "More details - resourceGroupName1" + + ### Example with `policyAssignmentId`, `scopes` and a human readable name + +#### Definition file: + +```json + { + "exemptions": [ + { + "name": "short-name", + "displayName": "Descriptive name displayed on portal", + "description": "More details", + "exemptionCategory": "Waiver", + "scope": [ + "humanReadableName:/subscriptions/11111111-2222-3333-4444-555555555555", + "/subscriptions/11111111-2222-3333-4444-555555555556/resourceGroups/resourceGroupName1", + ], + "policyAssignmentId": "/providers/Microsoft.Management/managementGroups/{{managementGroupId}}/providers/Microsoft.Authorization/policyAssignments/{{policyAssignmentName}}", + } + ] + } + ``` + +#### Generated fields for this assignment: + +- `name`: "short-name" +- `displayName`: "Descriptive name displayed on portal - humanReadableName" +- `displayName`: "Descriptive name displayed on portal - resourceGroupName1" +- `description`: "More details - humanReadableName" +- `description`: "More details - resourceGroupName1" + + ### Example with `policyAssignmentId` and a single `scope` + +#### Definition file: + +```json + { + "exemptions": [ + { + "name": "short-name", + "displayName": "Descriptive name displayed on portal", + "description": "More details", + "exemptionCategory": "Waiver", + "scope": "/subscriptions/11111111-2222-3333-4444-555555555555/resourceGroups/resourceGroupName1", + "policyAssignmentId": "/providers/Microsoft.Management/managementGroups/{{managementGroupId}}/providers/Microsoft.Authorization/policyAssignments/{{policyAssignmentName}}", + } + ] + } + ``` + +#### Generated fields for this assignment: + +- `name`: "short-name" +- `displayName`: "Descriptive name displayed on portal" +- `description`: "More details" + +## CSV Format + +The columns must have the headers as described below. The order of the columns is not important. + +### Regular Columns - `name` - unique name, we recommend a GUID. - `displayName` - descriptive name displayed on portal. - `exemptionCategory` - `Waiver` or `Mitigated`. -- `scope` - Management Group, subscription, Resource Group or resource. -- `metadata` - valid JSON (see JSON format below) +- `scope` - individual Management Group, subscription, Resource Group or resource. +- `scopes` - list of ampersand `&` separated Management Groups, subscriptions, Resource Groups or resource Ids. Ampersand is used instead of commas since it is not a valid character in a scope name and therefore doesn't conflict. - Optional - `expiresOn` - empty or expiry date. + - `policyDefinitionReferenceIds` - list of ampersand `&` separated [strings as defined above](#specifying-policydefinitionreferenceids). - `assignmentScopeValidation` - `Default` or `DoNotValidate` - `resourceSelectors` - valid JSON (see JSON format below) + - `metadata` - valid JSON (see JSON format below) -#### Option A: Policy definition Ids or Names +> [!CAUTION] +> Breaking change: v10.1.0 replaced the usual comma in `policyDefinitionReferenceIds` with an ampersand `&` to avoid conflicts with the scope Ids. You must replace in-cell commas with ampersands. -- For built-in Policy definitions: `policyDefinitionId` -- For custom Policy definitions: `policyDefinitionName` -- Omit `policyDefinitionReferenceIds`. +### Option **A** columns: Policy definition Ids or Names -#### Option B: Policy Assignment Id +- Column `assignmentReferenceId` must be formatted: + - For Built-in Policy definition: `/providers/Microsoft.Authorization/policyDefinitions/00000000-0000-0000-0000-000000000000` + - For Custom Policy definition: `policyDefinitions/{{policyDefinitionName}}` +- Column `policyDefinitionReferenceIds` must be empty -- `policyAssignmentId` - Policy Assignment Id -- Omit `"policyDefinitionReferenceIds": [ ... ]` for Policy Assignment of a single Policy, or to exempt the scope from every Policy in the assigned Policy Set -- For Policy Set Assignments only: `"policyDefinitionReferenceIds": [ ... ]` containing an array following: - - policyDefinitionReferenceId from the assigned Policy Set definition - - For Built-in Policy definition: `"/providers/Microsoft.Authorization/policyDefinitions/00000000-0000-0000-0000-000000000000"` - - For Custom Policy definition: `"policySetDefinitions/{{policySetDefinitionName}}"` +### Option **B** columns: Policy Assignment Id -#### Option C: Policy Set definition Ids or Names +- Column `assignmentReferenceId` must be a Policy Assignment Id: + - `/providers/Microsoft.Management/managementGroups/{{managementGroupId}}/providers/Microsoft.Authorization/policyAssignments/{{policyAssignmentName}}` +- Column `policyDefinitionReferenceIds` must be an ampersand separated list containing any of the following: + - Empty for Policy Assignment of a single Policy, or to exempt the scope from every Policy in the assigned Policy Set + - One of the [options as detailed above](#specifying-policydefinitionreferenceids) -- For built-in Policy Set definitions: `policySetDefinitionId` -- For custom Policy Set definitions: `policySetDefinitionName` -- Omit `"policyDefinitionReferenceIds": [ ... ]` to exempt the scope from every Policy in the assigned Policy Set -- To select the Policies within the Policy set to exempt `"policyDefinitionReferenceIds": [ ... ]` containing an array following: - - policyDefinitionReferenceId from the assigned Policy Set definition - - For Built-in Policy definition: `"/providers/Microsoft.Authorization/policyDefinitions/00000000-0000-0000-0000-000000000000"` - - For Custom Policy definition: `"policySetDefinitions/{{policySetDefinitionName}}"` +Legacy column `policyAssignmentId` is still supported for backward compatibility for **Option B** only. -#### Example +### Option **C** columns: Policy Set definition Ids or Names -```json -{ - "exemptions": [ - { - "name": "00000000-0000-0000-0000-000000000000", - "displayName": "Descriptive name displayed on portal", - "description": "More details", - "exemptionCategory": "Waiver", - "scope": "/subscriptions/11111111-2222-3333-4444-555555555555", - "policyDefinitionId": "/providers/microsoft.authorization/policyDefinitions/00000000-0000-0000-0000-000000000000", - }, - { - "name": "00000000-0000-0000-0000-000000000001", - "displayName": "Descriptive name displayed on portal", - "description": "More details", - "exemptionCategory": "Mitigated", - "scope": "/subscriptions/11111111-2222-3333-4444-555555555555", - "policyDefinitionName": "policyDefinitionName", - "expiresOn": "2022-12-31T23:59:59Z", - "assignmentScopeValidation": "DoNotValidate", - }, - { - "name": "00000000-0000-0000-0000-000000000002", - "displayName": "Descriptive name displayed on portal", - "description": "More details", - "exemptionCategory": "Mitigated", - "scope": "/subscriptions/11111111-2222-3333-4444-555555555555", - "policyAssignmentId": "/providers/microsoft.authorization/policyAssignments/{{assignmentName}}}}", - "policyDefinitionReferenceIds": [ - "/providers/microsoft.authorization/policyDefinitions/00000000-0000-0000-0000-000000000000", - "policyDefinitions/{{policyDefinitionName}}", - "{{policyReferenceId}}" - ] - } - ] -} -``` +- Column `assignmentReferenceId` must be a Policy Set definition Id or Name + - Built-in Policy Set definition: `/providers/Microsoft.Authorization/policySetDefinitions/00000000-0000-0000-0000-000000000000` + - Custom Policy Set definition: `policySetDefinitions/{{policySetDefinitionName}}` +- Column `policyDefinitionReferenceIds` must be an ampersand separated list containing any of the following: + - Empty to exempt all Policies in the Policy Set + - One of the [options as detailed above](#specifying-policydefinitionreferenceids) diff --git a/Docs/settings-global-setting-file.md b/Docs/settings-global-setting-file.md index d01f6029..946d26e2 100644 --- a/Docs/settings-global-setting-file.md +++ b/Docs/settings-global-setting-file.md @@ -96,6 +96,8 @@ EPAC has a concept of an environment identified by a string (unique per reposito - `managedTenant`: Used when the `pacEnvironment` is in a lighthouse managed tenant, [see this example](#example-for-lighthouse-manged-tenant) It must contain: - `managingTenantId` - The tenantId of the managing tenant. - `managingTenantRootScope` - An array of all subscriptions that will need `additionalRoleAssignments` deployed to them. +- `defaultContext`: In rare cases (typicaslly only when deploying to a lighthouse managed tenant) the default context (Get-azContext) of a user/SPN running a plan will +be set to a suscription where that user/SPN does not have sufficient priveleges. Some checks have been built in so that in some cases when this happens EPAC is able to fix the context issue. When it is not, a `defaultContext` subscription name must be provided. This can be any subscription within the `deploymentRootScope`. ### DeployIfNotExists and Modify Policy Assignments need `managedIdentityLocation` diff --git a/Schemas/global-settings-schema.json b/Schemas/global-settings-schema.json index 73386bcb..7a774660 100644 --- a/Schemas/global-settings-schema.json +++ b/Schemas/global-settings-schema.json @@ -48,6 +48,9 @@ "deploymentRootScope": { "type": "string" }, + "defaultContext": { + "type": "string" + }, "globalNotScopes": { "type": "array", "items": [ diff --git a/Scripts/Deploy/Build-DeploymentPlans.ps1 b/Scripts/Deploy/Build-DeploymentPlans.ps1 index e123799f..f9ad6516 100644 --- a/Scripts/Deploy/Build-DeploymentPlans.ps1 +++ b/Scripts/Deploy/Build-DeploymentPlans.ps1 @@ -76,7 +76,7 @@ Clear-Variable -Name epacInfoStream -Scope global -Force -ErrorAction SilentlyCo $InformationPreference = "Continue" $pacEnvironment = Select-PacEnvironment $PacEnvironmentSelector -DefinitionsRootFolder $DefinitionsRootFolder -OutputFolder $OutputFolder -Interactive $Interactive -$null = Set-AzCloudTenantSubscription -Cloud $pacEnvironment.cloud -TenantId $pacEnvironment.tenantId -Interactive $pacEnvironment.interactive +$null = Set-AzCloudTenantSubscription -Cloud $pacEnvironment.cloud -TenantId $pacEnvironment.tenantId -Interactive $pacEnvironment.interactive -DeploymentDefaultContext $pacEnvironment.defaultContext # Telemetry if ($pacEnvironment.telemetryEnabled) { @@ -177,7 +177,10 @@ elseif (!(Test-Path $policyExemptionsFolderForPacEnvironment -PathType Container $exemptionsAreNotManagedMessage = "Policy Exemptions folder '$policyExemptionsFolderForPacEnvironment' for PaC environment $($pacEnvironment.pacSelector) not found. Exemptions not managed by this EPAC instance." $exemptionsAreManaged = $false } -if ($BuildExemptionsOnly) { +$localBuildExemptionsOnly = $BuildExemptionsOnly +# $localBuildExemptionsOnly = $true +# $VerbosePreference = "Continue" +if ($localBuildExemptionsOnly) { $null = $warningMessages.Add("Building only the Exemptions plan. Policy, Policy Set, and Assignment plans will not be built.") if ($exemptionsAreManaged) { $buildSelections.buildPolicyExemptions = $true diff --git a/Scripts/Deploy/Deploy-PolicyPlan.ps1 b/Scripts/Deploy/Deploy-PolicyPlan.ps1 index 424cdeb1..88e20b38 100644 --- a/Scripts/Deploy/Deploy-PolicyPlan.ps1 +++ b/Scripts/Deploy/Deploy-PolicyPlan.ps1 @@ -64,7 +64,7 @@ Clear-Variable -Name epacInfoStream -Scope global -Force -ErrorAction SilentlyCo $InformationPreference = "Continue" $pacEnvironment = Select-PacEnvironment $PacEnvironmentSelector -DefinitionsRootFolder $DefinitionsRootFolder -InputFolder $InputFolder -Interactive $Interactive -$null = Set-AzCloudTenantSubscription -Cloud $pacEnvironment.cloud -TenantId $pacEnvironment.tenantId -Interactive $pacEnvironment.interactive +$null = Set-AzCloudTenantSubscription -Cloud $pacEnvironment.cloud -TenantId $pacEnvironment.tenantId -Interactive $pacEnvironment.interactive -DeploymentDefaultContext $pacEnvironment.defaultContext $throttleLimit = $VirtualCores * 2 # Telemetry diff --git a/Scripts/Deploy/Deploy-RolesPlan.ps1 b/Scripts/Deploy/Deploy-RolesPlan.ps1 index 0509cc9a..a9e78e5a 100644 --- a/Scripts/Deploy/Deploy-RolesPlan.ps1 +++ b/Scripts/Deploy/Deploy-RolesPlan.ps1 @@ -56,7 +56,7 @@ Clear-Variable -Name epacInfoStream -Scope global -Force -ErrorAction SilentlyCo $InformationPreference = "Continue" $pacEnvironment = Select-PacEnvironment $PacEnvironmentSelector -DefinitionsRootFolder $DefinitionsRootFolder -InputFolder $InputFolder -Interactive $Interactive -$null = Set-AzCloudTenantSubscription -Cloud $pacEnvironment.cloud -TenantId $pacEnvironment.tenantId -Interactive $pacEnvironment.interactive +$null = Set-AzCloudTenantSubscription -Cloud $pacEnvironment.cloud -TenantId $pacEnvironment.tenantId -Interactive $pacEnvironment.interactive -DeploymentDefaultContext $pacEnvironment.defaultContext # Telemetry if ($pacEnvironment.telemetryEnabled) { diff --git a/Scripts/Helpers/Build-AssignmentDefinitionAtLeaf.ps1 b/Scripts/Helpers/Build-AssignmentDefinitionAtLeaf.ps1 index 8a3d3441..225d0f59 100644 --- a/Scripts/Helpers/Build-AssignmentDefinitionAtLeaf.ps1 +++ b/Scripts/Helpers/Build-AssignmentDefinitionAtLeaf.ps1 @@ -611,7 +611,7 @@ function Build-AssignmentDefinitionAtLeaf { $requiredRoleAssignment = $null if ($additionalRoleAssignment.crossTenant -eq $true) { $requiredRoleAssignment = @{ - scope = $scopeEntry.scope + scope = $additionalRoleAssignment.scope roleDefinitionId = $roleDefinitionId roleDisplayName = $roleDisplayName description = "Policy Assignment '$id': additional cross tenant Role Assignment deployed by: '$($PacEnvironment.deployedBy)'" @@ -620,7 +620,7 @@ function Build-AssignmentDefinitionAtLeaf { } else { $requiredRoleAssignment = @{ - scope = $scopeEntry.scope + scope = $additionalRoleAssignment.scope roleDefinitionId = $roleDefinitionId roleDisplayName = $roleDisplayName description = "Policy Assignment '$id': additional Role Assignment deployed by: '$($PacEnvironment.deployedBy)'" diff --git a/Scripts/Helpers/Build-AssignmentPlan.ps1 b/Scripts/Helpers/Build-AssignmentPlan.ps1 index 39768da3..acbc00e2 100644 --- a/Scripts/Helpers/Build-AssignmentPlan.ps1 +++ b/Scripts/Helpers/Build-AssignmentPlan.ps1 @@ -281,7 +281,7 @@ function Build-AssignmentPlan { -ReplacedAssignment $false ` -DeployedRoleAssignmentsByPrincipalId $deployedRoleAssignmentsByPrincipalId if ($identityStatus.requiresRoleChanges) { - $null = $RoleAssignments.removed.AddRange($identityStatus.added) + $null = $RoleAssignments.removed.AddRange($identityStatus.removed) $RoleAssignments.numberOfChanges += ($identityStatus.numberOfChanges) } if ($identityStatus.isUserAssigned) { diff --git a/Scripts/Helpers/Build-ExemptionsPlan.ps1 b/Scripts/Helpers/Build-ExemptionsPlan.ps1 index 2829d6e9..b2ce5e6e 100644 --- a/Scripts/Helpers/Build-ExemptionsPlan.ps1 +++ b/Scripts/Helpers/Build-ExemptionsPlan.ps1 @@ -27,7 +27,6 @@ function Build-ExemptionsPlan { $deployedManagedExemptions = $DeployedExemptions.managed $deleteCandidates = Get-ClonedObject $deployedManagedExemptions -AsHashTable -AsShallowClone $replacedAssignments = $Assignments.replace - $xlsUsesPolicyMethod = "unknown" $numberOfFilesWithErrors = 0 $desiredState = $PacEnvironment.desiredState $desiredStateStrategy = $desiredState.strategy @@ -53,13 +52,18 @@ function Build-ExemptionsPlan { $byPolicySetIdCalculatedAssignments = $calculatedResult.byPolicySetIdCalculatedAssignments $byPolicyIdCalculatedAssignments = $calculatedResult.byPolicyIdCalculatedAssignments #endregion pre-calculate assignments - + + #region process each file foreach ($file in $exemptionFiles) { #region read each file $extension = $file.Extension $fullName = $file.FullName + # $fileName = $file.Name + Write-Information "" + Write-Information "---------------------------------------------------------------------------------------------------" Write-Information "Processing file '$($fullName)'" + Write-Information "---------------------------------------------------------------------------------------------------" $errorInfo = New-ErrorInfo -FileName $fullName $exemptionsArray = @() $isCsvFile = $false @@ -78,7 +82,6 @@ function Build-ExemptionsPlan { $exemptionsArray += $jsonExemptions } } - } elseif ($extension -eq ".csv") { $isCsvFile = $true @@ -90,6 +93,7 @@ function Build-ExemptionsPlan { } #endregion read each file + #region process each row $entryNumber = $isCsvFile ? 1 : -1 foreach ($row in $exemptionsArray) { $errorInfo.hasLocalErrors = $false @@ -100,15 +104,19 @@ function Build-ExemptionsPlan { $displayName = $row.displayName $exemptionCategory = $row.exemptionCategory $scope = $row.scope + $scopes = $row.scopes + $expiresOnRaw = $row.expiresOn $policyAssignmentId = $row.policyAssignmentId - $policyDefinitionId = $null - $policySetDefinitionId = $null + $policyDefinitionName = $row.policyDefinitionName + $policyDefinitionId = $row.policyDefinitionId + $policySetDefinitionName = $row.policySetDefinitionName + $policySetDefinitionId = $row.policySetDefinitionId $assignmentReferenceId = $row.assignmentReferenceId $description = $row.description $assignmentScopeValidation = $row.assignmentScopeValidation $resourceSelectors = $row.resourceSelectors $policyDefinitionReferenceIds = $row.policyDefinitionReferenceIds - $metadata = $row.metadata + $metadata = @{} if ($isCsvFile) { if ([string]::IsNullOrWhitespace($name) ` -and [string]::IsNullOrWhitespace($displayName) ` @@ -122,38 +130,55 @@ function Build-ExemptionsPlan { -and [string]::IsNullOrWhitespace($policyDefinitionReferenceIds) ` -and [string]::IsNullOrWhitespace($metadata)) { #ignore empty lines from CSV - Write-Warning "Ignoring empty row $entryNumber" + # Write-Warning "Ignoring empty row $entryNumber" continue } } #endregion read row values andd skip empty rows on CSV files - #region check if scope defined - if ([string]::IsNullOrWhitespace($scope)) { - Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "required Exemption scope missing" -EntryNumber $entryNumber - continue - } - $trimmedScope = $scope - if ($scope.StartsWith("/subscriptions/")) { - if ($scope.Contains("/providers/")) { - # an actual resource, keep just the "/subscriptions/.../resourceGroups/..." part - $splits = $scope -split "/" - $trimmedScope = $splits[0..4] -join "/" - } - } - $exemptionScopeDetails = $ScopeTable.$trimmedScope - #endregion check if scope defined - - - #region Convert complex fields from CSV if ($isCsvFile) { - # Convert referenceIds into array (if cell empty, set to empty array) + #region CSV files can define the assignment with assignmentReferenceId or the leagcy policyAssignmentId + if ([string]::IsNullOrWhitespace($assignmentReferenceId) -xor [string]::IsNullOrWhitespace($policyAssignmentId)) { + if (-not [string]::IsNullOrWhitespace($assignmentReferenceId)) { + if ($assignmentReferenceId.StartsWith("policyDefinitions/")) { + $splits = $assignmentReferenceId -split "/" + $policyDefinitionName = $splits[1] + } + elseif ($assignmentReferenceId.Contains("/providers/Microsoft.Authorization/policyDefinitions/")) { + $policyDefinitionId = $assignmentReferenceId + } + elseif ($assignmentReferenceId.StartsWith("policySetDefinitions/")) { + $splits = $assignmentReferenceId -split "/" + $policySetDefinitionName = $splits[1] + } + elseif ($assignmentReferenceId.Contains("/providers/Microsoft.Authorization/policySetDefinitions/")) { + $policySetDefinitionId = $assignmentReferenceId + } + elseif ($assignmentReferenceId.Contains("/providers/Microsoft.Authorization/policyAssignments/")) { + $policyAssignmentId = $assignmentReferenceId + } + else { + Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "assignmentReferenceId '$assignmentReferenceId' of unknown type" -EntryNumber $entryNumber + } + } + else { + if (-not $AllAssignments.ContainsKey($policyAssignmentId)) { + Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "assignmentReferenceId '$policyAssignmentId' not found in current root scope $($PacEnvironment.deploymentRootScope)" -EntryNumber $entryNumber + } + } + } + else { + Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "exactly one of the columns policyAssignmentId or assignmentReferenceId must have a non-empty cell" -EntryNumber $entryNumber + } + #endregion CSV files can define the assignment with assignmentReferenceId or the leagcy policyAssignmentId + + #region Convert referenceIds into array (if cell empty, set to empty array) $final = @() $step1 = $policyDefinitionReferenceIds if (-not [string]::IsNullOrWhiteSpace($step1)) { $step2 = $step1.Trim() - $step3 = $step2 -split "," + $step3 = $step2 -split ":" foreach ($item in $step3) { $step4 = $item.Trim() if ($step4.Length -gt 0) { @@ -162,8 +187,20 @@ function Build-ExemptionsPlan { } } $policyDefinitionReferenceIds = $final + #endregion Convert referenceIds into array (if cell empty, set to empty array) + + #region table must contain scope or scopes column + if (([string]::IsNullOrWhitespace($scope) -xor [string]::IsNullOrWhitespace($scopes))) { + if ([string]::IsNullOrWhitespace($scope)) { + $scopes = $scopes -split "&" + } + } + else { + Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "exactly one of the columns scope or scopes is required" -EntryNumber $entryNumber + } + #endregion table must contain scope or scopes column - # Convert resourceSelectors into array (if cell empty, set to Snull) + #region Convert resourceSelectors into array (if cell empty, set to Snull) $resourceSelectors = $null $step1 = $row.resourceSelectors if (-not [string]::IsNullOrWhiteSpace($step1)) { @@ -180,112 +217,35 @@ function Build-ExemptionsPlan { } } } + #endregion Convert resourceSelectors into array (if cell empty, set to Snull) - # Convert metadata JSON to object - $metadata = $null + #region convert metadata JSON to object $step1 = $row.metadata if (-not [string]::IsNullOrWhiteSpace($step1)) { $step2 = $step1.Trim() - if ($step2.StartsWith("{")) { - try { - $step3 = ConvertFrom-Json $step2 -AsHashTable -Depth 100 - } - catch { - Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "invalid metadata format, must be empty or legal JSON: '$step2'" -EntryNumber $entryNumber - } - if ($step3 -ne @{}) { - $metadata = $step3 - } - } - } - } - #endregion Convert complex fields from CSV - - if ($isCsvFile) { - - #region CSV files can define the assignment with assignmentReferenceId or the leagcy policyAssignmentId - if ([string]::IsNullOrWhitespace($assignmentReferenceId) -xor [string]::IsNullOrWhitespace($policyAssignmentId)) { - if (-not [string]::IsNullOrWhitespace($assignmentReferenceId)) { - $xlsUsesPolicyMethod = "assignmentReferenceId" - if ($assignmentReferenceId.StartsWith("policyDefinitions/")) { - $splits = $assignmentReferenceId -split "/" - $name = $splits[1] - $policyDefinitionId = Confirm-PolicyDefinitionUsedExists ` - -Name $name ` - -PolicyDefinitionsScopes $PacEnvironment.policyDefinitionsScopes ` - -AllDefinitions $AllDefinitions.policydefinitions ` - -SuppressErrorMessage - if ($null -eq $policyDefinitionId) { - Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "assignmentReferenceId '$assignmentReferenceId' not found in current EPAC environment '$($PacEnvironment.pacSelector)'" -EntryNumber $entryNumber - } - } - elseif ($assignmentReferenceId.StartsWith("policySetDefinitions/")) { - $splits = $assignmentReferenceId -split "/" - $name = $splits[1] - $policySetDefinitionId = Confirm-PolicySetDefinitionUsedExists ` - -Name $name ` - -PolicyDefinitionsScopes $PacEnvironment.policyDefinitionsScopes ` - -AllPolicySetDefinitions $AllDefinitions.policysetdefinitions - if ($null -eq $policySetDefinitionId) { - Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "assignmentReferenceId '$assignmentReferenceId' not found in current EPAC environment '$($PacEnvironment.pacSelector)'" -EntryNumber $entryNumber - } - } - elseif ($assignmentReferenceId.Contains("/providers/Microsoft.Authorization/policyDefinitions/")) { - $policyDefinitionId = Confirm-PolicyDefinitionUsedExists ` - -Id $assignmentReferenceId ` - -PolicyDefinitionsScopes $PacEnvironment.policyDefinitionsScopes ` - -AllDefinitions $AllDefinitions.policydefinitions ` - -SuppressErrorMessage - if ($null -eq $policyDefinitionId) { - Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "assignmentReferenceId '$assignmentReferenceId' not found in current EPAC environment '$($PacEnvironment.pacSelector)'" -EntryNumber $entryNumber - } - } - elseif ($assignmentReferenceId.Contains("/providers/Microsoft.Authorization/policySetDefinitions/")) { - $policySetDefinitionId = Confirm-PolicySetDefinitionUsedExists ` - -Id $assignmentReferenceId ` - -PolicyDefinitionsScopes $PacEnvironment.policyDefinitionsScopes ` - -AllPolicySetDefinitions $AllDefinitions.policysetdefinitions - if ($null -eq $policySetDefinitionId) { - Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "assignmentReferenceId '$assignmentReferenceId' not found in current EPAC environment '$($PacEnvironment.pacSelector)'" -EntryNumber $entryNumber - } - } - elseif ($assignmentReferenceId.Contains("/providers/Microsoft.Authorization/policyAssignments/")) { - $policyAssignmentId = $assignmentReferenceId - if ($AllAssignments.ContainsKey($policyAssignmentId)) { - $policyAssignmentId = $assignmentReferenceId + if ($step2.StartsWith("{") -and $step2.EndsWith("}")) { + $maybeEmpty = ($step2 -replace "[\s{}]", "") + if ($maybeEmpty.Length -gt 0) { + try { + $step3 = ConvertFrom-Json $step2 -AsHashTable -Depth 100 + if ($step3 -ne @{}) { + $metadata = $step3 + } } - else { - Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "assignmentReferenceId '$assignmentReferenceId' not found in current root scope $($PacEnvironment.deploymentRootScope)" -EntryNumber $entryNumber + catch { + Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "invalid metadata format, must be empty or legal JSON: '$step2'" -EntryNumber $entryNumber } } - else { - Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "assignmentReferenceId '$assignmentReferenceId' of unknown type" -EntryNumber $entryNumber - } } else { - $xlsUsesPolicyMethod = "policyAssignmentId" - if (-not $AllAssignments.ContainsKey($policyAssignmentId)) { - Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "assignmentReferenceId '$policyAssignmentId' not found in current root scope $($PacEnvironment.deploymentRootScope)" -EntryNumber $entryNumber - } + Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "invalid metadata format, must be empty or legal JSON: '$step2'" -EntryNumber $entryNumber } } - elseif ([string]::IsNullOrWhitespace($assignmentReferenceId) -and [string]::IsNullOrWhitespace($policyAssignmentId)) { - if ($xlsUsesPolicyMethod -eq "unknown") { - Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "exactly one of the columns policyAssignmentId or assignmentReferenceId is required" -EntryNumber $entryNumber - } - else { - Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "cell in $xlsUsesPolicyMethod column is empty" -EntryNumber $entryNumber - } - } - else { - throw "$($fullName): exactly one of the columns policyAssignmentId or assignmentReferenceId is allowed" - } - #endregion policyAssignmentId - + #endregion convert metadata JSON to object } else { - #region JSON files require exactly one field from set @(policyAssignmentId,policyDefinitionName,policyDefinitionId,policySetDefinitionName,policySetDefinitionId) + #region JSON files require exactly one field from set @(policyAssignmentId,policyDefinitionName,policyDefinitionId) $numberOfDefinedfields = 0 $allowedFields = @("policyAssignmentId", "policyDefinitionName", "policyDefinitionId", "policySetDefinitionName", "policySetDefinitionId") foreach ($field in $allowedFields) { @@ -296,66 +256,131 @@ function Build-ExemptionsPlan { if ($numberOfDefinedfields -ne 1) { Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "exactly one of the fields policyAssignmentId, policyDefinitionName, policyDefinitionId, policySetDefinitionName, policySetDefinitionId is required" -EntryNumber $entryNumber } - else { - if ($null -ne $row.policyAssignmentId) { - $policyAssignmentId = $row.policyAssignmentId - if (-not $AllAssignments.ContainsKey($policyAssignmentId)) { - Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "policyAssignmentId '$assignmentReferenceId' not found in current root scope $($PacEnvironment.deploymentRootScope)" -EntryNumber $entryNumber - } + if (-not ([string]::IsNullOrWhitespace($scope) -xor [string]::IsNullOrWhitespace($scopes))) { + Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "exactly one of the fields scope or scopes is required" -EntryNumber $entryNumber + } + elseif ([string]::IsNullOrWhitespace($scope)) { + if ($scopes -isnot [array]) { + Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "scopes must be an array of strings" -EntryNumber $entryNumber } - elseif ($null -ne $row.policyDefinitionName) { - $policyDefinitionId = Confirm-PolicyDefinitionUsedExists ` - -Name $row.policyDefinitionName ` - -PolicyDefinitionsScopes $PacEnvironment.policyDefinitionsScopes ` - -AllDefinitions $AllDefinitions.policydefinitions - if ($null -eq $policyDefinitionId) { - Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "policyDefinitionName '$($row.policyDefinitionName)' not found in current EPAC environment '$($PacEnvironment.pacSelector)'" -EntryNumber $entryNumber + else { + foreach ($currentScope in $scopes) { + if ($currentScope -isnot [string]) { + Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "scopes must be an array of strings" -EntryNumber $entryNumber + break + } } } - elseif ($null -ne $row.policyDefinitionId) { - $policyDefinitionId = Confirm-PolicyDefinitionUsedExists ` - -Id $row.policyDefinitionId ` - -PolicyDefinitionsScopes $PacEnvironment.policyDefinitionsScopes ` - -AllDefinitions $AllDefinitions.policydefinitions - if ($null -eq $policyDefinitionId) { - Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "policyDefinitionId '$($row.policyDefinitionId)' not found in current EPAC environment '$($PacEnvironment.pacSelector)'" -EntryNumber $entryNumber - } + } + else { + if ($scope -isnot [string]) { + Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "scope must be a string" -EntryNumber $entryNumber } - elseif ($null -ne $row.policySetDefinitionName) { - $policySetDefinitionId = Confirm-PolicySetDefinitionUsedExists ` - -Name $row.policySetDefinitionName ` - -PolicyDefinitionsScopes $PacEnvironment.policyDefinitionsScopes ` - -AllPolicySetDefinitions $AllDefinitions.policysetdefinitions - if ($null -eq $policySetDefinitionId) { - Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "policySetDefinitionName '$($row.policySetDefinitionName)' not found in current EPAC environment '$($PacEnvironment.pacSelector)'" -EntryNumber $entryNumber - } + } + + if ($null -ne $row.metadata) { + if ($row.metadata -isnot [hashtable]) { + Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "metadata must be a hashtable" -EntryNumber $entryNumber } - elseif ($null -ne $row.policySetDefinitionId) { - $policySetDefinitionId = Confirm-PolicySetDefinitionUsedExists ` - -Id $row.policySetDefinitionId ` - -PolicyDefinitionsScopes $PacEnvironment.policyDefinitionsScopes ` - -AllPolicySetDefinitions $AllDefinitions.policysetdefinitions - if ($null -eq $policySetDefinitionId) { - $policySetDefinitionId = $row.policySetDefinitionId - } - else { - Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "policySetDefinitionId '$($row.policySetDefinitionId)' not found in current EPAC environment '$($PacEnvironment.pacSelector)'" -EntryNumber $entryNumber - } + else { + $metadata = $row.metadata } } #endregion JSON files require exactly one field from set @(policyAssignmentId,policyDefinitionName,policyDefinitionId,policySetDefinitionName,policySetDefinitionId) } - #region check required fields + #region only allow Exemptions for managed Assignment + $epacMetadataDefinitionSpecification = @{} + if ($null -ne $policyAssignmentId) { + $epacMetadataDefinitionSpecification.policyAssignmentId = $policyAssignmentId + if (-not $AllAssignments.ContainsKey($policyAssignmentId)) { + Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "policyAssignmentId '$assignmentReferenceId' not found in current root scope $($PacEnvironment.deploymentRootScope)" -EntryNumber $entryNumber + } + } + elseif ($null -ne $policyDefinitionName) { + $epacMetadataDefinitionSpecification.policyDefinitionName = $policyDefinitionName + $policyDefinitionId = Confirm-PolicyDefinitionUsedExists ` + -Name $policyDefinitionName ` + -PolicyDefinitionsScopes $PacEnvironment.policyDefinitionsScopes ` + -AllDefinitions $AllDefinitions.policydefinitions + if ($null -eq $policyDefinitionId) { + Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "policyDefinitionName '$($row.policyDefinitionName)' not found in current EPAC environment '$($PacEnvironment.pacSelector)'" -EntryNumber $entryNumber + } + } + elseif ($null -ne $policyDefinitionId) { + $epacMetadataDefinitionSpecification.policyDefinitionId = $policyDefinitionId + $policyDefinitionId = Confirm-PolicyDefinitionUsedExists ` + -Id $policyDefinitionId ` + -PolicyDefinitionsScopes $PacEnvironment.policyDefinitionsScopes ` + -AllDefinitions $AllDefinitions.policydefinitions + if ($null -eq $policyDefinitionId) { + Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "policyDefinitionId '$($row.policyDefinitionId)' not found in current EPAC environment '$($PacEnvironment.pacSelector)'" -EntryNumber $entryNumber + } + } + elseif ($null -ne $policySetDefinitionName) { + $epacMetadataDefinitionSpecification.policySetDefinitionName = $policySetDefinitionName + $policySetDefinitionId = Confirm-PolicySetDefinitionUsedExists ` + -Name $policySetDefinitionName ` + -PolicySetDefinitionsScopes $PacEnvironment.policySetDefinitionsScopes ` + -AllDefinitions $AllDefinitions.policysetdefinitions + if ($null -eq $policySetDefinitionId) { + Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "policySetDefinitionName '$($row.policySetDefinitionName)' not found in current EPAC environment '$($PacEnvironment.pacSelector)'" -EntryNumber $entryNumber + } + } + elseif ($null -ne $policySetDefinitionId) { + $epacMetadataDefinitionSpecification.policySetDefinitionId = $policySetDefinitionId + $policySetDefinitionId = Confirm-PolicySetDefinitionUsedExists ` + -Id $policySetDefinitionId ` + -PolicySetDefinitionsScopes $PacEnvironment.policySetDefinitionsScopes ` + -AllDefinitions $AllDefinitions.policysetdefinitions + if ($null -eq $policySetDefinitionId) { + Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "policySetDefinitionId '$($row.policySetDefinitionId)' not found in current EPAC environment '$($PacEnvironment.pacSelector)'" -EntryNumber $entryNumber + } + } + #endregion only allow Exemptions for managed Assignment + + #region retrieve pre-calculated assignments for this row + $calculatedPolicyAssignments = $null + if ($null -ne $policyDefinitionId) { + $calculatedPolicyAssignments = $byPolicyIdCalculatedAssignments.$policyDefinitionId + if ($null -eq $calculatedPolicyAssignments -or $calculatedPolicyAssignments.Count -eq 0) { + Write-Warning "Row $($entryNumber): No assignments found for policyDefinitionId '$policyDefinitionId', skipping row" + } + } + elseif ($null -ne $policySetDefinitionId) { + $calculatedPolicyAssignments = $byPolicySetIdCalculatedAssignments.$policySetDefinitionId + if ($null -eq $calculatedPolicyAssignments -or $calculatedPolicyAssignments.Count -eq 0) { + Write-Warning "Row $($entryNumber): No assignments found for policySetDefinitionId '$policySetDefinitionId', skipping row" + } + } + elseif ($null -ne $policyAssignmentId) { + $calculatedPolicyAssignments = $byAssignmentIdCalculatedAssignments.$policyAssignmentId + if ($null -eq $calculatedPolicyAssignments -or $calculatedPolicyAssignments.Count -eq 0) { + Write-Warning "Row $($entryNumber): No assignment found for policyAssignmentId '$policyAssignmentId', skipping row" + } + } + #endregion retrieve pre-calculated assignments for this row + + #region check required fields and allowed values if ([string]::IsNullOrWhitespace($name)) { Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "required name missing" -EntryNumber $entryNumber } - if (-not (Confirm-ValidPolicyResourceName -Name $name)) { - Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "name '$name' contains invalid charachters <>*%&:?.+/ or ends with a space." -EntryNumber $entryNumber + else { + if (-not (Confirm-ValidPolicyResourceName -Name $name)) { + Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "name '$($name.Substring(0, 32))...' contains invalid charachters <>*%&:?.+/ or ends with a space." -EntryNumber $entryNumber + } + elseif ($name.Length -gt 64) { + Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "name too long (max 64 characters)" -EntryNumber $entryNumber + } } if ([string]::IsNullOrWhitespace($displayName)) { Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "required displayName missing" -EntryNumber $entryNumber } + else { + if ($displayName.Length -gt 128) { + Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "displayName '$($displayName.Substring(0, 32))...' too long (max 128 characters)" -EntryNumber $entryNumber + } + } if ([string]::IsNullOrWhitespace($exemptionCategory)) { Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "required exemptionCategory missing" -EntryNumber $entryNumber } @@ -365,11 +390,10 @@ function Build-ExemptionsPlan { } } if (-not [string]::IsNullOrWhitespace($description)) { - if ($description.Length -gt 1024) { - Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "description too long (max 1024 characters)" -EntryNumber $entryNumber + if ($description.Length -gt 512) { + Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "description '$($description.Substring(0, 32))...' too long (max 512 characters)" -EntryNumber $entryNumber } } - #Should add a check that name does not contain & or potentially any special characters. if ([string]::IsNullOrWhitespace($assignmentScopeValidation)) { $assignmentScopeValidation = "Default" } @@ -378,26 +402,59 @@ function Build-ExemptionsPlan { Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "invalid assignmentScopeValidation '$assignmentScopeValidation' (must be 'Default' or 'DoNotValidate')" -EntryNumber $entryNumber } } - #endregion check required fields + #endregion check required fields and allowed values - #region validate scope - if ($null -eq $exemptionScopeDetails) { - Write-Warning "Exemption entry $($entryNumber): Exemption '$($displayName)'($($name)) scope $($scope) is not in current scope tree for root $($PacEnvironment.deploymentRootScope), skipping row." - continue + #region pre-process scope or scopes array + $scopesList = [System.Collections.ArrayList]::new() + if ([string]::IsNullOrWhitespace($scope)) { + # scopes array + $requiresPostfix = $scopes.Length -gt 1 + foreach ($currentScope in $scopes) { + $currentScope = $currentScope.Trim() + $scopeParts = $currentScope -split ":" + $scopePostfix = "" + $numberOfScopeParts = $scopeParts.Length + switch ($numberOfScopeParts) { + 1 { + # no ':' separator, use the last part of the scope as the postfix (default) + $currentScope = $scopeParts[0] + $scopePostfix = ($currentScope -split "/")[-1] + } + 2 { + # has a ':' separator, either indicating no postfix if starts with ':', or a postfix contained before the ':' + $currentScope = $scopeParts[1] + if ($requiresPostfix -and $scopeParts[0] -eq "") { + Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "invalid scope format - missing postfix: '$currentScope'" -EntryNumber $entryNumber + } + $scopePostfix = $scopeParts[0] + } + default { + # more than one ':' separator + Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "invalid scope format - too many ':' separators: '$currentScope'" -EntryNumber $entryNumber + } + } + $scopeInformation = @{ + scope = $currentScope + scopePostfix = $scopePostfix + } + $null = $scopesList.Add($scopeInformation) + } } - if ($assignmentScopeValidation -eq "Default") { - if ($exemptionScopeDetails.isInGlobalNotScope) { - Write-Warning "Exemption entry $($entryNumber): Exemption '$($displayName)'($($name)) scope $($scope) is in a global not scope, skipping row." - continue + else { + # single scope + $currentScope = $scope.Trim() + $scopeInformation = @{ + scope = $currentScope + scopePostfix = "" } + $null = $scopesList.Add($scopeInformation) } - #endregion validate scope - - $warning = $false - + #endregion pre-process scope or scopes array + #region calculate expiresOn + $expired = $false $expiresOn = $null - $expiresOnRaw = $row.expiresOn + $daysUntilExpired = 0 if (-not [string]::IsNullOrWhitespace($expiresOnRaw)) { if ($expiresOnRaw -is [datetime]) { $expiresOn = $expiresOnRaw @@ -413,20 +470,16 @@ function Build-ExemptionsPlan { else { Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "invalid expiresOn format, must be empty or a valid date/time: '$expiresOnRaw'" -EntryNumber $entryNumber } - if ($expiresOn) { + if ($null -ne $expiresOn) { $expired = $expiresOn -lt $now $daysUntilExpired = (New-TimeSpan -Start $now -End $expiresOn).Days if ($expired) { - $daysExpired = - $daysUntilExpired - if ($daysExpired -eq 0) { - Write-Warning "Exemption entry $($entryNumber): Exemption '$name' in definitions expired today, skipping row." - $warning = $true + if ($daysUntilExpired -eq 0) { + Write-Warning "Exemption entry $($entryNumber): Exemption '$name' in definitions expired today." } else { - Write-Warning "Exemption entry $($entryNumber): Exemption '$name' in definitions expired $daysExpired days ago, skipping row." - $warning = $true + Write-Warning "Exemption entry $($entryNumber): Exemption '$name' in definitions expired $(-$daysUntilExpired) days ago." } - $warning = $true } elseif ($daysUntilExpired -le 15) { Write-Warning "Exemption entry $($entryNumber): Exemption '$name' in definitions expires in $daysUntilExpired days." @@ -439,426 +492,409 @@ function Build-ExemptionsPlan { continue } - #region check if resource still exists; $scope indicating a resource container (resourceGroups, subscriptions, managementGroups) or an actual resource - $isIndividualResource = $true - if ($scope.StartsWith("/providers/Microsoft.Management/management")) { - $isIndividualResource = $false - } - elseif ($scope.Contains("/providers/")) { - $isIndividualResource = $true - } - else { - # subscription, resourceGroup - $isIndividualResource = $false - } - - if ($isIndividualResource) { - $thisResourceIdExists = $false - if ($resourceIdsExist.ContainsKey($scope)) { - $thisResourceIdExists = $resourceIdsExist.$scope - } - else { - $resource = Get-AzResource -ResourceId $scope -ErrorAction SilentlyContinue - $thisResourceIdExists = $null -ne $resource - $resourceIdsExist[$scope] = $thisResourceIdExists - } - if (-not $thisResourceIdExists) { - Write-Warning "Row $($entryNumber): Resource '$scope' does not exist, skipping row." - $warning = $true + #region process each scope + foreach ($scopeInformation in $scopesList) { + $currentScope = $scopeInformation.scope + $scopePostfix = $scopeInformation.scopePostfix + $trimmedScope = $currentScope.Trim() + $validateScope = $assignmentScopeValidation -eq "Default" + $scopeIsValid = $true + if ($currentScope.StartsWith("/subscriptions/")) { + if ($currentScope.Contains("/providers/")) { + # an actual resource, keep just the "/subscriptions/.../resourceGroups/..." part + $splits = $currentScope -split "/" + $trimmedScope = $splits[0..4] -join "/" + if ($validateScope) { + if ($resourceIdsExist.ContainsKey($currentScope)) { + $thisResourceIdExists = $resourceIdsExist.$currentScope + } + else { + $resource = Get-AzResource -ResourceId $currentScope -ErrorAction SilentlyContinue + $thisResourceIdExists = $null -ne $resource + $resourceIdsExist[$currentScope] = $thisResourceIdExists + } + if (-not $thisResourceIdExists) { + Write-Warning "Row $($entryNumber): Resource '$currentScope' does not exist, skipping entry." + $scopeIsValid = $false + } + } + } } - } - #endregion check if resource still exists; $scope indicating a resource container (resourceGroups, subscriptions, managementGroups) - - #region retrieve pre-calculated assignments for this row - $calculatedPolicyAssignments = $null - if ($null -ne $policyDefinitionId) { - $calculatedPolicyAssignments = $byPolicyIdCalculatedAssignments.$policyDefinitionId - if ($null -eq $calculatedPolicyAssignments -or $calculatedPolicyAssignments.Count -eq 0) { - Write-Warning "Row $($entryNumber): No assignments found for policyDefinitionId '$policyDefinitionId', skipping row" - $warning = $true + if ($ScopeTable.ContainsKey($trimmedScope)) { + $exemptionScopeDetails = $ScopeTable.$trimmedScope } - } - elseif ($null -ne $policySetDefinitionId) { - $calculatedPolicyAssignments = $byPolicySetIdCalculatedAssignments.$policySetDefinitionId - if ($null -eq $calculatedPolicyAssignments -or $calculatedPolicyAssignments.Count -eq 0) { - Write-Warning "Row $($entryNumber): No assignments found for policySetDefinitionId '$policySetDefinitionId', skipping row" - $warning = $true - } - } - elseif ($null -ne $policyAssignmentId) { - $calculatedPolicyAssignments = $byAssignmentIdCalculatedAssignments.$policyAssignmentId - if ($null -eq $calculatedPolicyAssignments -or $calculatedPolicyAssignments.Count -eq 0) { - Write-Warning "Row $($entryNumber): No assignment found for policyAssignmentId '$policyAssignmentId', skipping row" - $warning = $true + else { + Write-Warning "Exemption entry $($entryNumber): Exemption scope $($currentScope) not found in current scope tree for root $($PacEnvironment.deploymentRootScope), skipping entry." + $scopeIsValid = $false } - } - else { - throw "Code bug: policyDefinitionId, policySetDefinitionId, or policyAssignmentId must be defined" - } - #endregion retrieve pre-calculated assignments for this row - - if ($warning) { - foreach ($deployedManagedExemption in $deployedManagedExemptions.Values) { - $deployedId = $deployedManagedExemption.id - $deployedName = $deployedManagedExemption.name - if ($deployedName -eq $name -or $deployedName -like "$($name)___*") { - # do not delete the deployed exemption - $null = $deleteCandidates.Remove($deployedId) - break - } + + #region filter assignments in the current scope tree or are not in excluded scopes + $filteredPolicyAssignments = [System.Collections.ArrayList]::new() + $uniqueAssignmentNames = @{} + if ($null -ne $policyAssignmentId -and !$validateScope) { + $calculatedPolicyAssignment = $calculatedPolicyAssignments[0] + $clonedCalculatedPolicyAssignment = Get-ClonedObject $calculatedPolicyAssignment -AsShallowClone + $null = $filteredPolicyAssignments.Add($clonedCalculatedPolicyAssignment) } - continue - } - - #region filter out assignments that are not in the current scope tree or are in excluded scopes - $filteredPolicyAssignments = [System.Collections.ArrayList]::new() - foreach ($calculatedPolicyAssignment in $calculatedPolicyAssignments) { - $policyAssignmentScope = $calculatedPolicyAssignment.scope - if ($ScopeTable.ContainsKey($policyAssignmentScope)) { - $assignmentScopeDetails = $ScopeTable.$policyAssignmentScope - if (-not $assignmentScopeDetails.isExcluded) { - $exemptionScopeDetails = $ScopeTable.$trimmedScope - $parentTable = $exemptionScopeDetails.parentTable - #region validate that the Assignment scope is at or above the Exemption scope - $isAssignmentScopeValid = ($assignmentScopeValidation -ne "Default") -or ($trimmedScope -eq $policyAssignmentScope) -or $parentTable.ContainsKey($policyAssignmentScope) - if (-not $isAssignmentScopeValid) { - Write-Verbose "Exemption entry $($entryNumber): Exemption scope = '$scope' is NOT in a child scope for assignment $($calculatedPolicyAssignment.displayName)($($calculatedPolicyAssignment.id)), skipping assignment." - continue - } - #endregion validate that the Assignment scope is at or above the Exemption scope - - #region validate scope against the assignment's notScopes - if ($assignmentScopeValidation -eq "Default") { - foreach ($notScope in $calculatedPolicyAssignment.notScopes) { - if ($trimmedScope -eq $notScope -or $parentTable.ContainsKey($notScope)) { - Write-Warning "Exemption entry $($entryNumber): Exemption scope = '$scope' is in a not scope for assignment $($calculatedPolicyAssignment.displayName)($($calculatedPolicyAssignment.id)), skipping assignment." - $warning = $true - break + else { + foreach ($calculatedPolicyAssignment in $calculatedPolicyAssignments) { + $policyAssignmentScope = $calculatedPolicyAssignment.scope + $assignmentScopeDetails = $ScopeTable.$policyAssignmentScope + if ($null -eq $assignmentScopeDetails) { + Write-Verbose "Assignment scope = '$($policyAssignmentScope)' not found in current scope tree for root $($PacEnvironment.deploymentRootScope), skipping assignment." + } + elseif ($assignmentScopeDetails.isExcluded) { + Write-Verbose "Assignment scope = '$($policyAssignmentScope)' is in a globally excluded scope" + } + elseif ($scopeIsValid) { + $parentTable = $exemptionScopeDetails.parentTable + $includeAssignment = $trimmedScope -eq $policyAssignmentScope -or $parentTable.ContainsKey($policyAssignmentScope) + if ($includeAssignment) { + foreach ($notScope in $calculatedPolicyAssignment.notScopes) { + if ($trimmedScope -eq $notScope -or $parentTable.ContainsKey($notScope)) { + $includeAssignment = $false + break + } } + if ($includeAssignment) { + $calculatedName = $calculatedPolicyAssignment.name + $listOfAssignmentsWithSameName = $null + if ($uniqueAssignmentNames.ContainsKey($calculatedName)) { + $listOfAssignmentsWithSameName = $uniqueAssignmentNames.$calculatedName + } + else { + $listOfAssignmentsWithSameName = [System.Collections.ArrayList]::new() + $null = $uniqueAssignmentNames.Add($calculatedPolicyAssignment.name, $listOfAssignmentsWithSameName) + } + $clonedCalculatedPolicyAssignment = Get-ClonedObject $calculatedPolicyAssignment -AsShallowClone + $null = $listOfAssignmentsWithSameName.Add($clonedCalculatedPolicyAssignment) + $null = $filteredPolicyAssignments.Add($clonedCalculatedPolicyAssignment) + } + else { + Write-Verbose "Exemption scope = '$($currentScope)' is in the notScopes list for Assignment '$($calculatedPolicyAssignment.id)'." + } + } + else { + Write-Verbose "Assignment scope = '$($policyAssignmentScope)' is not in the current scope tree for root $($PacEnvironment.deploymentRootScope), skipping assignment." } } - #endregion validate scope against the assignment's notScopes - - if (-not $warning) { - $null = $filteredPolicyAssignments.Add($calculatedPolicyAssignment) + else { + Write-Verbose "Exemption scope = '$($currentScope)' is not in the current scope tree for root $($PacEnvironment.deploymentRootScope), skipping assignment." + } + } + foreach ($uniqueAssignmentName in $uniqueAssignmentNames.Keys) { + $listOfAssignmentsWithSameName = $uniqueAssignmentNames.$uniqueAssignmentName + if ($listOfAssignmentsWithSameName.Count -gt 1) { + Write-Warning "Exemption entry $($entryNumber): Multiple assignments with the same name '$uniqueAssignmentName' found; using ordinals to disambiguate." + $ordinal = 0 + foreach ($calculatedPolicyAssignment in $listOfAssignmentsWithSameName) { + $ordinalString = $ordinal.ToString("[00]") + $calculatedPolicyAssignment.ordinalString = $ordinalString + $ordinal++ + } } } - else { - Write-Verbose "Assignment scope = '$($policyAssignmentScope)' is in a globally excluded scope" - } } - else { - Write-Verbose "Assignment scope = '$($policyAssignmentScope)' not found in current scope tree for root $($PacEnvironment.deploymentRootScope)" - } - } - #endregion filter out assignments that are not in the current scope tree or are in excluded scopes - - $isMultipleAssignments = $filteredPolicyAssignments.Count -gt 1 - $ordinal = 1 - foreach ($calculatedPolicyAssignment in $filteredPolicyAssignments) { - $policyAssignmentId = $calculatedPolicyAssignment.id - $policyAssignmentName = $calculatedPolicyAssignment.name - $policyAssignmentReferenceIds = $calculatedPolicyAssignment.policyDefinitionReferenceIds - $policyAssignmentPerPolicyReferenceIdTable = $calculatedPolicyAssignment.perPolicyReferenceIdTable - $policyAssignmentByPolicyReferenceIds = $calculatedPolicyAssignment.policyDefinitionReferenceIds - $allowReferenceIdsInRow = $calculatedPolicyAssignment.allowReferenceIdsInRow - $isPolicyAssignment = $calculatedPolicyAssignment.isPolicyAssignment - - #region multiple assignments require unique names and displayNames - $tryName = $null - $tryId = $null - $tryDisplayName = $null - if ($isMultipleAssignments) { - $ordinalString = '{0:d2}' -f $ordinal - $possibleName = "$($name)-$($policyAssignmentName)" - $possibleDisplayName = "$($displayName) - $($policyAssignmentName)" - if ($possibleName.Length -gt 64) { - Write-Warning "Exemption entry $($entryNumber): Concatenated Exemption name for multiple assignments too long ($($possibleName.Length) - max 60 characters, truncating." - $possibleName = $possibleName.Substring(0, 60) - } - if ($possibleDisplayName.Length -gt 125) { - Write-Warning "Exemption entry $($entryNumber): Concatenated Exemption displayName for multiple assignments too long ($($possibleDisplayName.Length) - max 125 characters, truncating." - $possibleDisplayName = $possibleDisplayName.Substring(0, 125) - } - $tryName = $possibleName - $tryId = "$scope/providers/Microsoft.Authorization/policyExemptions/$tryName" - $tryDisplayName = $possibleDisplayName - if ($uniqueIds.ContainsKey($tryId)) { - # append ordinal string to name and displayName; last resort fallback - $tryName = "$($possibleName)-$($ordinalString)" - $tryId = "$scope/providers/Microsoft.Authorization/policyExemptions/$tryName" - $tryDisplayName = "$($possibleDisplayName);$($ordinalString)" - if ($uniqueIds.ContainsKey($tryId)) { - $tryName = $null - $tryId = $null - $tryDisplayName = $null - } - else { - $ordinal++ + if ($filteredPolicyAssignments.Count -eq 0) { + Write-Warning "Exemption entry $($entryNumber): No assignments found for scope $($currentScope), skipping entry." + } + #endregion filter assignments in the current scope tree or are not in excluded scopes + + $isPolicyDefinitionSpecified = $null -ne $policyDefinitionId + #region process each assignment (or multiple assignments) + foreach ($calculatedPolicyAssignment in $filteredPolicyAssignments) { + $policyAssignmentId = $calculatedPolicyAssignment.id + $policyAssignmentName = $calculatedPolicyAssignment.name + $policyAssignmentReferenceIds = $calculatedPolicyAssignment.policyDefinitionReferenceIds + $policyAssignmentPerPolicyReferenceIdTable = $calculatedPolicyAssignment.perPolicyReferenceIdTable + $policyAssignmentByPolicyReferenceIds = $calculatedPolicyAssignment.policyDefinitionReferenceIds + $allowReferenceIdsInRow = $calculatedPolicyAssignment.allowReferenceIdsInRow + $isPolicyAssignment = $calculatedPolicyAssignment.isPolicyAssignment + + #region multiple assignments require unique names and displayNames + $exemptionName = $name + $exemptionDisplayName = $displayName + $descriptionExists = -not [string]::IsNullOrWhitespace($description) + $exemptionDescription = $null + if ($descriptionExists) { + $exemptionDescription = $description + } + $ordinalString = $calculatedPolicyAssignment.ordinalString + if ($isPolicyDefinitionSpecified -or $scopePostfix -ne "") { + if ($scopePostfix -ne "") { + $exemptionDisplayName = "$($exemptionDisplayName) - $($scopePostfix)" + if ($descriptionExists) { + $exemptionDescription = "$($exemptionDescription) - $($scopePostfix)" + } } - } - else { - $null = $null - } - if ($null -eq $tryName) { - # ultimate fall back, use the original name and displayName and an ordinal - do { - $tryName = "$($name)-$($ordinalString)" - if ($tryName.Length -gt 64) { - Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "Exemption name for multiple assignments too long ($($tryName.Length) - max 60 characters), please shorten the Exemption name." -EntryNumber $entryNumber - break + if ($isPolicyDefinitionSpecified) { + $exemptionName = "$($exemptionName)-$($policyAssignmentName)" + $exemptionDisplayName = "$($exemptionDisplayName) - $($policyAssignmentName)" + if ($descriptionExists) { + $exemptionDescription = "$($exemptionDescription) - $($policyAssignmentName)" } - if ($ordinal -gt 99) { - Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "Exemption has too many assignments ($($ordinal), swich back to specifying the assignment" -EntryNumber $entryNumber - break + if ($null -ne $ordinalString) { + $exemptionName = "$($exemptionName)$($ordinalString)" + $exemptionDisplayName = "$($exemptionDisplayName)$($ordinalString)" + if ($descriptionExists) { + $exemptionDescription = "$($exemptionDescription)$($ordinalString)" + } } - $tryId = "$scope/providers/Microsoft.Authorization/policyExemptions/$tryName" - $tryDisplayName = "$($displayName);$($ordinalString)" - $ordinal++ - } while ($uniqueIds.ContainsKey($tryId)) - if ($errorInfo.hasLocalErrors) { - continue + } + if ($exemptionName.Length -gt 64) { + Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "Concatenated Exemption name for multiple Assignments is too long ($($exemptionName.Length) - max 64 characters): '$exemptionName'." -EntryNumber $entryNumber + } + if ($exemptionDisplayName.Length -gt 128) { + Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "Concatenated Exemption displayName for multiple Assignments or scopes is too long ($($exemptionDisplayName.Length) - max 128 characters): '$exemptionDisplayName'." -EntryNumber $entryNumber + } + if ($exemptionDescription.Length -gt 512) { + Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "Concatenated Exemption description for multiple Assignments or scopes is too long ($($exemptionDescription.Length) - max 512 characters): '$exemptionDescription'." -EntryNumber $entryNumber } } - if ($displayNameAugmented.Length -gt 128) { - Write-Warning "Exemption entry $($entryNumber): Exemption displayName (for multiple assignments) too long ($($displayNameAugmented.Length) - max 128 characters), truncating." - $displayNameAugmented = $displayNameAugmented.Substring(0, 128) + $exemptionId = "$currentScope/providers/Microsoft.Authorization/policyExemptions/$exemptionName" + if ($uniqueIds.ContainsKey($exemptionId)) { + Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "Duplicate Exemption id '$exemptionId' for name '$name'." -EntryNumber $entryNumber } - } - else { - $tryName = $name - $tryId = "$scope/providers/Microsoft.Authorization/policyExemptions/$tryName" - $tryDisplayName = $displayName - if ($uniqueIds.ContainsKey($tryId)) { - Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "Duplicate Exemption id '$tryId'." -EntryNumber $entryNumber - continue - } - } - $null = $uniqueIds.Add($tryId, $true) - $nameAugmented = $tryName - $displayNameAugmented = $tryDisplayName - $id = $tryId - #endregion multiple assignments require unique names and displayNames - - #region validate or create referenceIds - $policyDefinitionReferenceIdsAugmented = [System.Collections.ArrayList]::new() - if ($allowReferenceIdsInRow) { - if ($null -ne $policyDefinitionReferenceIds -and $policyDefinitionReferenceIds.Count -gt 0) { - foreach ($referenceId in $policyDefinitionReferenceIds) { - if ($policyAssignmentReferenceIds -contains $referenceId) { - $null = $policyDefinitionReferenceIdsAugmented.Add($referenceId) - } - elseif ($referenceId.StartsWith("policyDefinitions/")) { - $referenceIdTrimmed = $referenceId.Substring(18) - $policyDefinitionId = Confirm-PolicyDefinitionUsedExists ` - -Name $referenceIdTrimmed ` - -PolicyDefinitionsScopes $PacEnvironment.policyDefinitionsScopes ` - -AllDefinitions $AllDefinitions - if ($null -eq $policyDefinitionId) { - Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "policyDefinitionReference '$referenceId' not resolved for policyAssignment '$policyAssignmentName'" -EntryNumber $entryNumber + else { + $null = $uniqueIds.Add($exemptionId, $true) + } + #endregion multiple assignments require unique names and displayNames + + #region validate or create referenceIds + $policyDefinitionReferenceIdsAugmented = [System.Collections.ArrayList]::new() + if ($allowReferenceIdsInRow) { + if ($null -ne $policyDefinitionReferenceIds -and $policyDefinitionReferenceIds.Count -gt 0) { + $epacMetadataDefinitionSpecification.policyDefinitionReferenceIds = ConvertTo-Json $policyDefinitionReferenceIds + foreach ($referenceId in $policyDefinitionReferenceIds) { + if ($policyAssignmentReferenceIds -contains $referenceId) { + $null = $policyDefinitionReferenceIdsAugmented.Add($referenceId) } - else { - if ($policyAssignmentPerPolicyReferenceIdTable.ContainsKey($policyDefinitionId)) { - $referenceIds = $policyAssignmentPerPolicyReferenceIdTable.$policyDefinitionId + elseif ($referenceId.StartsWith("policyDefinitions/")) { + $referenceIdTrimmed = $referenceId.Substring(18) + $policyDefinitionId = Confirm-PolicyDefinitionUsedExists ` + -Name $referenceIdTrimmed ` + -PolicyDefinitionsScopes $PacEnvironment.policyDefinitionsScopes ` + -AllDefinitions $AllDefinitions + if ($null -eq $policyDefinitionId) { + Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "policyDefinitionReference '$referenceId' not resolved for policyAssignment '$policyAssignmentName'" -EntryNumber $entryNumber + } + else { + if ($policyAssignmentPerPolicyReferenceIdTable.ContainsKey($policyDefinitionId)) { + $referenceIds = $policyAssignmentPerPolicyReferenceIdTable.$policyDefinitionId + $null = $policyDefinitionReferenceIdsAugmented.AddRange($referenceIds) + } + else { + Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "policyDefinitionReference '$referenceId' not resolved for policyAssignment '$policyAssignmentName'" -EntryNumber $entryNumber + } + } + } + elseif ($referenceId -contains "/providers/Microsoft.Authorization/policyDefinitions/") { + if ($policyAssignmentPerPolicyReferenceIdTable.ContainsKey($referenceId)) { + $referenceIds = $policyAssignmentPerPolicyReferenceIdTable.$referenceId $null = $policyDefinitionReferenceIdsAugmented.AddRange($referenceIds) } else { Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "policyDefinitionReference '$referenceId' not resolved for policyAssignment '$policyAssignmentName'" -EntryNumber $entryNumber } } - } - elseif ($referenceId -contains "/providers/Microsoft.Authorization/policyDefinitions/") { - if ($policyAssignmentPerPolicyReferenceIdTable.ContainsKey($referenceId)) { - $referenceIds = $policyAssignmentPerPolicyReferenceIdTable.$referenceId - $null = $policyDefinitionReferenceIdsAugmented.AddRange($referenceIds) - } else { - Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "policyDefinitionReference '$referenceId' not resolved for policyAssignment '$policyAssignmentName'" -EntryNumber $entryNumber + Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "policyDefinitionReferenceId '$referenceId' not found in policyAssignment '$policyAssignmentName'." -EntryNumber $entryNumber } } - else { - Add-ErrorMessage -ErrorInfo $errorInfo -ErrorString "policyDefinitionReference '$referenceId' not resolved for policyAssignment '$policyAssignmentName'" -EntryNumber $entryNumber - } } } - } - elseif (-not $isPolicyAssignment) { - $null = $policyDefinitionReferenceIdsAugmented.AddRange($policyAssignmentByPolicyReferenceIds) - } - #endregion validate or create referenceIds + elseif (-not $isPolicyAssignment) { + $null = $policyDefinitionReferenceIdsAugmented.AddRange($policyAssignmentByPolicyReferenceIds) + } + #endregion validate or create referenceIds - if ($metadata) { - $metadata.pacOwnerId = $PacEnvironment.pacOwnerId - } - else { - $metadata = @{ - pacOwnerId = $PacEnvironment.pacOwnerId + #region metadata + $epacMetadata = @{ + pacSelector = $PacEnvironment.pacSelector + originalName = $name + originalDisplayName = $displayName + originalDescription = $description + policyAssignmentName = $policyAssignmentName + scopePostfix = $scopePostfix + ordinalString = $ordinalString + } + $epacMetadata += $epacMetadataDefinitionSpecification + $clonedMetadata = $null + $clonedMetadata = Get-ClonedObject $metadata -AsShallowClone + $clonedMetadata.pacOwnerId = $PacEnvironment.pacOwnerId + $clonedMetadata.epacMetadata = $epacMetadata + if (!$clonedMetadata.ContainsKey("deployedBy")) { + $clonedMetadata.deployedBy = $PacEnvironment.deployedBy + } + #endregion metadata + + # bail if we encountered errors + if ($errorInfo.hasLocalErrors) { + continue + } + + $exemption = [ordered]@{ + id = $exemptionId + name = $exemptionName + displayName = $exemptionDisplayName + description = $exemptionDescription + exemptionCategory = $exemptionCategory + expiresOn = $expiresOn + scope = $currentScope + policyAssignmentId = $policyAssignmentId + assignmentScopeValidation = $assignmentScopeValidation + policyDefinitionReferenceIds = $policyDefinitionReferenceIdsAugmented + resourceSelectors = $resourceSelectors + metadata = $clonedMetadata + expired = $expired + scopeIsValid = $scopeIsValid } - } - if (!$metadata.ContainsKey("deployedBy")) { - $metadata.deployedBy = $PacEnvironment.deployedBy - } - # bail if we encountered errors - if ($errorInfo.hasLocalErrors) { - continue - } - #region check if the exemption already exists in Azure - $deployedManagedExemption = $null - if ($deployedManagedExemptions.ContainsKey($id)) { - $deployedManagedExemption = $deployedManagedExemptions.$id - } - else { - # try to find a matching deployed exemption - foreach ($possibleId in $deployedManagedExemptions.Keys) { - $deployedManagedExemption = $deployedManagedExemptions.$possibleId - $deployedName = $deployedManagedExemption.name - $deployedDisplayName = $deployedManagedExemption.displayName - $deployedPolicyAssignmentId = $deployedManagedExemption.policyAssignmentId - if ($deployedName.StartsWith($name) -and $deployedDisplayName.StartsWith($displayName) ` - -and $deployedPolicyAssignmentId -eq $policyAssignmentId) { - $oldFormat = $deployedName -match "^$($name)___\d{3}$" - if (-not $oldFormat) { - $null = $uniqueIds.Remove($nameAugmented) - $null = $uniqueIds.Add($deployedName, $true) - $id = $possibleId - $nameAugmented = $deployedName - $displayNameAugmented = $deployedManagedExemption.displayName - break + if ($deployedManagedExemptions.ContainsKey($exemptionId)) { + $deployedManagedExemption = $deployedManagedExemptions.$exemptionId + $deleteCandidates.Remove($exemptionId) + if ($deployedManagedExemption.policyAssignmentId -ne $policyAssignmentId) { + # Replaced Assignment + if ($expired -or !$scopeIsValid) { + Write-Verbose "Skip replace (assignmentId changed & expired or invalid scope): '$($exemptionDisplayName)' at scope '$($currentScope)'" + $Exemptions.numberUnchanged += 1 } else { - $deployedManagedExemption = $null + Write-Information "Replace (assignmentId changed) '$($exemptionDisplayName)' at scope '$($currentScope)'" + Write-Information " assignmentId '$($deployedManagedExemption.policyAssignmentId)' to '$($policyAssignmentId)'" + Write-Verbose " $exemptionId" + $null = $Exemptions.replace.Add($exemptionId, $exemption) + $Exemptions.numberOfChanges++ } } - else { - $deployedManagedExemption = $null - } - } - } - #endregion check if the exemption already exists in Azure - - #region create exemption object - $policyDefinitionReferenceIdsAugmentedArray = $policyDefinitionReferenceIdsAugmented.ToArray() - $exemption = [ordered]@{ - id = $id - name = $nameAugmented - displayName = $displayNameAugmented - description = $description - exemptionCategory = $exemptionCategory - expiresOn = $expiresOn - scope = $scope - policyAssignmentId = $policyAssignmentId - assignmentScopeValidation = $assignmentScopeValidation - policyDefinitionReferenceIds = $policyDefinitionReferenceIdsAugmentedArray - resourceSelectors = $resourceSelectors - metadata = $metadata - } - #endregion create exemption object - - #region calculate desired state mandated changes - if ($null -ne $deployedManagedExemption) { - $deleteCandidates.Remove($id) - if ($deployedManagedExemption.policyAssignmentId -ne $policyAssignmentId) { - # Replaced Assignment - if ($isMultipleAssignments) { - Write-Information "Replace(ordinal) '$($nameAugmented)', '$($scope)' from '$($deployedManagedExemption.policyAssignmentId)' to '$($policyAssignmentId)" + elseif ($replacedAssignments.ContainsKey($policyAssignmentId)) { + # Replaced Assignment + if ($expired -or !$scopeIsValid) { + Write-Verbose "Skip replace (replaced assignment & expired or invalid scope): '$($exemptionDisplayName)' at scope '$($currentScope)'" + $Exemptions.numberUnchanged += 1 + } + else { + Write-Information "Replace (replaced assignment) '$($exemptionDisplayName)' ($($exemptionName)) at scope '$($currentScope)'" + Write-Information " assignmentId '$($policyAssignmentId)'" + Write-Verbose " $exemptionId" + $null = $Exemptions.replace.Add($exemptionId, $exemption) + $Exemptions.numberOfChanges++ + } } else { - Write-Information "Replace(assignmentId) '$($nameAugmented)', '$($scope)' from '$($deployedManagedExemption.policyAssignmentId)' to '$($policyAssignmentId)'" + # Maybe update existing Exemption + $displayNameMatches = $deployedManagedExemption.displayName -eq $exemptionDisplayName + $descriptionMatches = ($deployedManagedExemption.description -eq $exemptionDescription) ` + -or ([string]::IsNullOrWhiteSpace($deployedManagedExemption.description) -and [string]::IsNullOrWhiteSpace($exemptionDescription)) + $exemptionCategoryMatches = $deployedManagedExemption.exemptionCategory -eq $exemptionCategory + $expiresOnMatches = $deployedManagedExemption.expiresOn -eq $expiresOn + $clearExpiration = !$expiresOnMatches -and $null -eq $expiresOn + $deployedPolicyDefinitionReferenceIdsArray = $deployedManagedExemption.policyDefinitionReferenceIds + if ($null -ne $deployedPolicyDefinitionReferenceIdsArray -and $deployedPolicyDefinitionReferenceIdsArray -isnot [array]) { + $deployedPolicyDefinitionReferenceIdsArray = @($deployedPolicyDefinitionReferenceIdsArray) + } + $policyDefinitionReferenceIdsMatches = Confirm-ObjectValueEqualityDeep $deployedPolicyDefinitionReferenceIdsArray $policyDefinitionReferenceIdsAugmented + $metadataMatches, $changePacOwnerId = Confirm-MetadataMatches ` + -ExistingMetadataObj $deployedManagedExemption.metadata ` + -DefinedMetadataObj $clonedMetadata + $assignmentScopeValidationMatches = ($deployedManagedExemption.assignmentScopeValidation -eq $assignmentScopeValidation) ` + -or ($null -eq $deployedManagedExemption.assignmentScopeValidation -and ($assignmentScopeValidation -eq "Default")) + $resourceSelectorsMatches = Confirm-ObjectValueEqualityDeep $deployedManagedExemption.resourceSelectors $resourceSelectors + # Update Exemption in Azure if necessary + if ($displayNameMatches -and $descriptionMatches -and $exemptionCategoryMatches -and $expiresOnMatches ` + -and $policyDefinitionReferenceIdsMatches -and $metadataMatches -and !$changePacOwnerId -and !$clearExpiration ` + -and $assignmentScopeValidationMatches -and $resourceSelectorsMatches) { + $Exemptions.numberUnchanged += 1 + } + elseif ($expired -or !$scopeIsValid) { + # Skip expired or invalid scope Exemptions + Write-Verbose "Skip update (expired or invalid scope): '$($exemptionDisplayName)' at scope '$($currentScope)'" + $Exemptions.numberUnchanged += 1 + } + else { + # One or more properties have changed + $changesStrings = @() + if (!$displayNameMatches) { + $changesStrings += "displayName" + } + if (!$descriptionMatches) { + $changesStrings += "description" + } + if (!$policyDefinitionReferenceIdsMatches) { + $changesStrings += "policyDefinitionReferenceIds" + } + if ($changePacOwnerId) { + $changesStrings += "owner" + } + if (!$metadataMatches) { + $changesStrings += "metadata" + } + if (!$exemptionCategoryMatches) { + $changesStrings += "exemptionCategory" + } + if ($clearExpiration) { + $changesStrings += "clearExpiration" + } + elseif (!$expiresOnMatches) { + $changesStrings += "expiresOn" + } + if (!$assignmentScopeValidationMatches) { + $changesStrings += "assignmentScopeValidation" + } + if (!$resourceSelectorsMatches) { + $changesStrings += "resourceSelectors" + } + $changesString = $changesStrings -join "," + $Exemptions.numberOfChanges++ + Write-Information "Update ($changesString): '$($exemptionDisplayName)' at scope '$($currentScope)'" + Write-Verbose " $exemptionId" + $null = $Exemptions.update.Add($exemptionId, $exemption) + } } - $null = $Exemptions.replace.Add($id, $exemption) - $Exemptions.numberOfChanges++ - } - elseif ($replacedAssignments.ContainsKey($policyAssignmentId)) { - # Replaced Assignment - Write-Information "Replace(replaced assignment) '$($nameAugmented)', '$($scope)', assignmentId '$($deployedManagedExemption.policyAssignmentId)'" - $null = $Exemptions.replace.Add($id, $exemption) - $Exemptions.numberOfChanges++ } else { - # Maybe update existing Exemption - $displayNameMatches = $deployedManagedExemption.displayName -eq $displayNameAugmented - $descriptionMatches = ($deployedManagedExemption.description -eq $description) ` - -or ([string]::IsNullOrWhiteSpace($deployedManagedExemption.description) -and [string]::IsNullOrWhiteSpace($description)) - $exemptionCategoryMatches = $deployedManagedExemption.exemptionCategory -eq $exemptionCategory - $expiresOnMatches = $deployedManagedExemption.expiresOn -eq $expiresOn - $clearExpiration = !$expiresOnMatches -and $null -eq $expiresOn - $deployedPolicyDefinitionReferenceIdsArray = $deployedManagedExemption.policyDefinitionReferenceIds - if ($null -ne $deployedPolicyDefinitionReferenceIdsArray -and $deployedPolicyDefinitionReferenceIdsArray -isnot [array]) { - $deployedPolicyDefinitionReferenceIdsArray = @($deployedPolicyDefinitionReferenceIdsArray) - } - $policyDefinitionReferenceIdsMatches = Confirm-ObjectValueEqualityDeep $deployedPolicyDefinitionReferenceIdsArray $policyDefinitionReferenceIdsAugmentedArray - $metadataMatches, $changePacOwnerId = Confirm-MetadataMatches ` - -ExistingMetadataObj $deployedManagedExemption.metadata ` - -DefinedMetadataObj $metadata - $assignmentScopeValidationMatches = ($deployedManagedExemption.assignmentScopeValidation -eq $assignmentScopeValidation) ` - -or ($null -eq $deployedManagedExemption.assignmentScopeValidation -and ($assignmentScopeValidation -eq "Default")) - $resourceSelectorsMatches = Confirm-ObjectValueEqualityDeep $deployedManagedExemption.resourceSelectors $resourceSelectors - # Update Exemption in Azure if necessary - if ($displayNameMatches -and $descriptionMatches -and $exemptionCategoryMatches -and $expiresOnMatches ` - -and $policyDefinitionReferenceIdsMatches -and $metadataMatches -and !$changePacOwnerId -and !$clearExpiration ` - -and $assignmentScopeValidationMatches -and $resourceSelectorsMatches) { - $Exemptions.numberUnchanged += 1 + if ($expired -or !$scopeIsValid) { + # Skip expired or invalid scope Exemptions + if ($VerbosePreference -eq "Continue") { + if ($expired -and !$scopeIsValid) { + Write-Information "Skip new exemption (expired, invalid scope): '$($exemptionDisplayName)' at scope '$($currentScope)'" + Write-Information " $exemptionId" + } + elseif ($expired) { + Write-Information "Skip new exemption (expired): '$($exemptionDisplayName)' at scope '$($currentScope)'" + Write-Information " $exemptionId" + } + else { + Write-Information "Skip new exemption (invalid scope): '$($exemptionDisplayName)' at scope '$($currentScope)'" + Write-Information " $exemptionId" + } + } } else { - # One or more properties have changed - $changesStrings = @() - if (!$displayNameMatches) { - $changesStrings += "displayName" - } - if (!$descriptionMatches) { - $changesStrings += "description" - } - if (!$policyDefinitionReferenceIdsMatches) { - $changesStrings += "policyDefinitionReferenceIds" - } - if ($changePacOwnerId) { - $changesStrings += "owner" - } - if (!$metadataMatches) { - $changesStrings += "metadata" - } - if (!$exemptionCategoryMatches) { - $changesStrings += "exemptionCategory" - } - if ($clearExpiration) { - $changesStrings += "clearExpiration" - } - elseif (!$expiresOnMatches) { - $changesStrings += "expiresOn" - } - if (!$assignmentScopeValidationMatches) { - $changesStrings += "assignmentScopeValidation" - } - if (!$resourceSelectorsMatches) { - $changesStrings += "resourceSelectors" - } - $changesString = $changesStrings -join "," + # Create Exemption + Write-Information "New '$($exemptionDisplayName)' at scope '$($currentScope)'" + Write-Verbose " $exemptionId" + $null = $Exemptions.new.Add($exemptionId, $exemption) $Exemptions.numberOfChanges++ - $null = $Exemptions.update.Add($id, $exemption) - Write-Information "Update($changesString) '$($displayNameAugmented)'($($nameAugmented)), '$($scope)'" } } } - else { - # Create Exemption - Write-Information "New '$($displayNameAugmented)'($($nameAugmented)), '$($scope)'" - $null = $Exemptions.new.Add($id, $exemption) - $Exemptions.numberOfChanges++ - } + #endregion process each assignment (or multiple assignments) - #endregion calculate desired state mandated changes } - } - + #endregion process each scope + } + #endregion process each row + if ($errorInfo.hasErrors) { Write-ErrorsFromErrorInfo -ErrorInfo $errorInfo $numberOfFilesWithErrors++ continue } } - + #endregion process each file + if ($numberOfFilesWithErrors -gt 0) { Write-Information "" throw "There were errors in $numberOfFilesWithErrors file(s)." @@ -866,8 +902,8 @@ function Build-ExemptionsPlan { } #region delete removed, orphaned and expired exemptions - foreach ($id in $deleteCandidates.Keys) { - $exemption = $deleteCandidates.$id + foreach ($exemptionId in $deleteCandidates.Keys) { + $exemption = $deleteCandidates.$exemptionId $pacOwner = $exemption.pacOwner $status = $exemption.status @@ -898,12 +934,14 @@ function Build-ExemptionsPlan { } if ($shallDelete) { # check fo special Exemption cases - Write-Information "Delete '$($exemption.displayName)'($($exemption.name)), '$($exemption.scope)', $reason" - $null = $Exemptions.delete[$id] = $exemption + Write-Information "Delete '$($exemption.displayName)' at scope '$($exemption.scope)', $reason" + Write-Verbose " $exemptionId" + $null = $Exemptions.delete[$exemptionId] = $exemption $Exemptions.numberOfChanges++ } else { - Write-Verbose "Keep $($reason): '$($exemption.displayName)'($($exemption.name)), '$($exemption.scope)' $reason" + Write-Verbose "Keep: '$($exemption.displayName)'($($exemption.name)), '$($exemption.scope)' $reason" + Write-Verbose " $exemptionId" } } #endregion delete removed, orphaned and expired exemptions diff --git a/Scripts/Helpers/Build-ScopeTableForDeploymentRootScope.ps1 b/Scripts/Helpers/Build-ScopeTableForDeploymentRootScope.ps1 index 1534d1d7..cc003cae 100644 --- a/Scripts/Helpers/Build-ScopeTableForDeploymentRootScope.ps1 +++ b/Scripts/Helpers/Build-ScopeTableForDeploymentRootScope.ps1 @@ -93,7 +93,12 @@ function Build-ScopeTableForDeploymentRootScope { #region process subscriptions and/or management groups $scopeDetails = $null if ($null -ne $deploymentRootScopeSubscriptionId) { - $subscription = Get-AzSubscription -SubscriptionId $deploymentRootScopeSubscriptionId -TenantId $tenantId + try { + $subscription = Get-AzSubscription -SubscriptionId $deploymentRootScopeSubscriptionId -TenantId $tenantId + } + catch { + Write-Error "You do not have sufficient permissions over the default context. Please set the 'defaultContext' parameter for this pacSelector in the globalSettings file. This is usually only an issue when a Lighthouse tenant is being deployed to." + } $subscriptionId = $subscription.Id $scopeDetails = Build-ScopeTableForSubscription ` -SubscriptionId $subscriptionId ` @@ -103,7 +108,12 @@ function Build-ScopeTableForDeploymentRootScope { -ScopeTable $scopeTable } else { - $managementGroup = Get-AzManagementGroup -GroupName $deploymentRootScopeManagementGroupName -Expand -Recurse + try { + $managementGroup = Get-AzManagementGroup -GroupName $deploymentRootScopeManagementGroupName -Expand -Recurse + } + catch { + Write-Error "You do not have sufficient permissions over the default context. Please set the 'defaultContext' parameter for this pacSelector in the globalSettings file" + } $scopeDetails = Build-ScopeTableForManagementGroup ` -ManagementGroup $managementGroup ` -ResourceGroupsBySubscriptionId $resourceGroupsBySubscriptionId ` diff --git a/Scripts/Helpers/Get-CalculatedPolicyAssignmentsAndReferenceIds.ps1 b/Scripts/Helpers/Get-CalculatedPolicyAssignmentsAndReferenceIds.ps1 index c85ba1a2..0e22e4b0 100644 --- a/Scripts/Helpers/Get-CalculatedPolicyAssignmentsAndReferenceIds.ps1 +++ b/Scripts/Helpers/Get-CalculatedPolicyAssignmentsAndReferenceIds.ps1 @@ -26,7 +26,6 @@ function Get-CalculatedPolicyAssignmentsAndReferenceIds { #region calculate assignment for this policyAssignment and assignments for the Policy definition id $calculatedPolicyAssignment = @{ - ordinal = $index id = $assignmentId scope = $assignment.scope name = $assignment.name @@ -106,7 +105,6 @@ function Get-CalculatedPolicyAssignmentsAndReferenceIds { #region calculated assignment for this policyAssignment AND for this policySetId $calculatedPolicyAssignment = @{ - ordinal = $index id = $assignmentId scope = $assignment.scope name = $assignment.name diff --git a/Scripts/Helpers/Get-GlobalSettings.ps1 b/Scripts/Helpers/Get-GlobalSettings.ps1 index e6da120f..7e4f78b6 100644 --- a/Scripts/Helpers/Get-GlobalSettings.ps1 +++ b/Scripts/Helpers/Get-GlobalSettings.ps1 @@ -142,6 +142,17 @@ function Get-GlobalSettings { } $policyDefinitionsScopes = @( $deploymentRootScope, "") + $defaultContext = $pacEnvironment.defaultContext + if ($null -ne $defaultContext) { + if ($pacEnvironment.defaultContext -isnot [string]) { + Write-Host -ForegroundColor Red "Error in global-settings.jsonc: pacEnvironment $pacSelector has an invalid defaultContext field." + $hasErrors = $true + } + } + else { + $defaultContext = "" + } + $deployedBy = "epac/$pacOwnerId/$pacSelector" if ($null -ne $pacEnvironment.deployedBy) { $deployedBy = $pacEnvironment.deployedBy @@ -201,6 +212,7 @@ function Get-GlobalSettings { $desiredState = @{ strategy = "undefined" keepDfcSecurityAssignments = $false + cleanupObsoleteExemptions = $false excludedScopes = $excludedScopesList globalExcludedScopesResourceGroups = $globalExcludedScopesResourceGroupsList globalExcludedScopesSubscriptions = $globalExcludedScopesSubscriptionsList @@ -248,6 +260,16 @@ function Get-GlobalSettings { $hasErrors = $true } } + $cleanupObsoleteExemptions = $desired.cleanupObsoleteExemptions + if ($null -ne $cleanupObsoleteExemptions) { + if ($cleanupObsoleteExemptions -is [bool]) { + $desiredState.cleanupObsoleteExemptions = $cleanupObsoleteExemptions + } + else { + Write-Host -ForegroundColor Red "Error in global-settings.jsonc: pacEnvironment $pacSelector field desiredState.cleanupObsoleteExemptions ($cleanupObsoleteExemptions) must be a boolean value." + $hasErrors = $true + } + } $excludedScopes = $desired.excludedScopes if ($null -ne $excludedScopes) { if ($excludedScopes -isnot [array]) { @@ -326,6 +348,7 @@ function Get-GlobalSettings { managingTenantId = $managingTenantId managingTenantRootScope = $managingTenantRootScope deploymentRootScope = $deploymentRootScope + defaultContext = $defaultContext policyDefinitionsScopes = $policyDefinitionsScopes desiredState = $desiredState managedIdentityLocation = $managedIdentityLocation @@ -343,6 +366,7 @@ function Get-GlobalSettings { Write-Error "Global settings contains errors." -ErrorAction Stop } + $prompt = $pacEnvironmentSelectors -join ", " Write-Information "PAC Environments: $($prompt)" Write-Information "PAC Owner Id: $pacOwnerId" Write-Information "Definitions root folder: $DefinitionsRootFolder" diff --git a/Scripts/Helpers/RestMethods/Set-AzRoleAssignmentRestMethod.ps1 b/Scripts/Helpers/RestMethods/Set-AzRoleAssignmentRestMethod.ps1 index dbd7238f..d6de5b36 100644 --- a/Scripts/Helpers/RestMethods/Set-AzRoleAssignmentRestMethod.ps1 +++ b/Scripts/Helpers/RestMethods/Set-AzRoleAssignmentRestMethod.ps1 @@ -20,6 +20,11 @@ function Set-AzRoleAssignmentRestMethod { $body = @{ properties = $RoleAssignment.properties } + if ($body.properties.crossTenant -eq $true) { + $body.properties["delegatedManagedIdentityResourceId"] = $roleassignment.assignmentId + } + + Write-Information "Assignment '$($RoleAssignment.assignmentDisplayName)', principalId $($properties.principalId), role '$($RoleAssignment.roleDisplayName)' at $($scope)" # Invoke the REST API diff --git a/Scripts/Helpers/Set-AzCloudTenantSubscription.ps1 b/Scripts/Helpers/Set-AzCloudTenantSubscription.ps1 index b5ce034a..2dd438f2 100644 --- a/Scripts/Helpers/Set-AzCloudTenantSubscription.ps1 +++ b/Scripts/Helpers/Set-AzCloudTenantSubscription.ps1 @@ -4,7 +4,8 @@ function Set-AzCloudTenantSubscription { param ( [Parameter(Mandatory = $true)] [string] $Cloud, [Parameter(Mandatory = $true)] [string] $TenantId, - [Parameter(Mandatory = $true)] [bool] $Interactive + [Parameter(Mandatory = $true)] [bool] $Interactive, + [Parameter(Mandatory = $false)] [string] $DeploymentDefaultContext ) if ($null -eq (Get-Module Az.ResourceGraph -ListAvailable)) { @@ -12,11 +13,24 @@ function Set-AzCloudTenantSubscription { Install-Module Az.ResourceGraph -Force -Repository PSGallery } + if ([string]::IsNullOrWhitespace($DeploymentDefaultContext)) { + Get-AzSubscription | Where-Object HomeTenantId -eq (Get-AzContext).Tenant | Select-Object -First 1 | Set-AzContext + } + else { + Set-AzContext -Subscription $DeploymentDefaultContext + } + $account = Get-AzContext if ($null -eq $account -or $account.Environment.Name -ne $Cloud -or $account.Tenant.TenantId -ne $TenantId) { # Wrong tenant - login to tenant if ($Interactive) { $null = Connect-AzAccount -Environment $Cloud -Tenant $TenantId + if ([string]::IsNullOrWhitespace($DeploymentDefaultContext)) { + Get-AzSubscription | Where-Object HomeTenantId -eq (Get-AzContext).Tenant | Select-Object -First 1 | set-AzContext + } + else { + Set-AzContext -Subscription $DeploymentDefaultContext + } $account = Get-AzContext } else { diff --git a/Scripts/Helpers/Write-AssignmentDetails.ps1 b/Scripts/Helpers/Write-AssignmentDetails.ps1 index dffc7f91..e689e022 100644 --- a/Scripts/Helpers/Write-AssignmentDetails.ps1 +++ b/Scripts/Helpers/Write-AssignmentDetails.ps1 @@ -18,7 +18,7 @@ function Write-AssignmentDetails { foreach ($role in $IdentityStatus.added) { $roleScope = $role.scope $roleShortScope = $roleScope -replace "/providers/Microsoft.Management", "" - if (!$role.crossTenant) { + if (!$role.properties.crossTenant) { Write-Information " add role $($role.roleDisplayName) at $($roleShortScope)" } else {