Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Modify assignable scope of existing custom role cs-website-reader #23

Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions cs-deployment-subscription.bicep
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,7 @@ module iomAzureSubscription 'modules/iom/azureSubscription.bicep' = if (deployIO
falconClientId: falconClientId
falconClientSecret: falconClientSecret
falconCloudRegion: falconCloudRegion
defaultSubscriptionId: defaultSubscriptionId
useExistingAppRegistration: useExistingAppRegistration
grantAppRegistrationAdminConsent: grantAppRegistrationAdminConsent
azureClientId: useExistingAppRegistration ? '' : azureClientId
Expand Down
9 changes: 9 additions & 0 deletions modules/iom/azureRoleDefinitionAssignableScope.bicep
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
targetScope = 'subscription'

param customRoleName string

resource existingCustomRoleDefinition 'Microsoft.Authorization/roleDefinitions@2022-04-01' existing = {
name: guid(customRoleName, subscription().id)
}

output assignableScopes array = existingCustomRoleDefinition.properties.assignableScopes
18 changes: 18 additions & 0 deletions modules/iom/azureSubscription.bicep
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@ param falconClientId string
@secure()
param falconClientSecret string

@description('Subscription Id of the default Azure Subscription.')
param defaultSubscriptionId string = subscription().id

@description('Falcon cloud region.')
@allowed([
'US-1'
Expand Down Expand Up @@ -118,12 +121,27 @@ module azureAppRegistrationUpdate 'azureAppRegistration.bicep' = if (!useExistin
]
}

/* Define required permissions at Azure Subscription scope */
module azureSubscriptionExistingRoleDefinition 'azureSubscriptionExistingRoleDefinition.bicep' = if (assignAzureSubscriptionPermissions && (subscription().subscriptionId != defaultSubscriptionId)) {
name: '${deploymentNamePrefix}-azureSubscriptionExistingRoleDefinition-${deploymentNameSuffix}'
scope: subscription(defaultSubscriptionId)
params: {
subscriptionId: subscription().id
}
}

/* Define required permissions at Azure Subscription scope */
module azureSubscriptionRoleDefinition 'azureSubscriptionRoleDefinition.bicep' = if (assignAzureSubscriptionPermissions && (subscription().subscriptionId == defaultSubscriptionId)) {
name: '${deploymentNamePrefix}-azureSubscriptionRoleDefinition-${deploymentNameSuffix}'
}

/* Assign required permissions on Azure Subscription */
module azureSubscriptionRoleAssignment 'azureSubscriptionRoleAssignment.bicep' = if (assignAzureSubscriptionPermissions) {
name: '${deploymentNamePrefix}-azureSubscriptionRoleAssignment-${deploymentNameSuffix}'
params: {
azurePrincipalType: azurePrincipalType
azurePrincipalId: useExistingAppRegistration ? azurePrincipalId : azureAppRegistration.outputs.servicePrincipalId
customRoleDefinitionId: subscription().subscriptionId == defaultSubscriptionId ? azureSubscriptionRoleDefinition.outputs.customRoleDefinitionId : azureSubscriptionExistingRoleDefinition.outputs.customRoleDefinitionId
}
}

Expand Down
45 changes: 45 additions & 0 deletions modules/iom/azureSubscriptionExistingRoleDefinition.bicep
ndergal1 marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
targetScope = 'subscription'

/*
This Bicep template adds the subscription as an assignable scope on the required permissions to enable CrowdStrike
Indicator of Misconfiguration (IOM)
Copyright (c) 2024 CrowdStrike, Inc.
*/

@description('Subscription Id of the targeted Azure Subscription.')
param subscriptionId string

param customRole object = {
roleName: 'cs-website-reader'
roleDescription: 'CrowdStrike custom role to allow read access to App Service and Function.'
roleActions: [
'Microsoft.Web/sites/Read'
'Microsoft.Web/sites/config/Read'
'Microsoft.Web/sites/config/list/Action'
]
}

module assignableScope 'azureRoleDefinitionAssignableScope.bicep' = {
name: guid('getAssignableScope',customRole.roleName, subscription().id)
params: {
customRoleName: customRole.roleName
}
}

resource modifyExistingCustomRoleDefinition 'Microsoft.Authorization/roleDefinitions@2022-04-01' = {
name: guid(customRole.roleName, subscription().id)
properties: {
assignableScopes: union(assignableScope.outputs.assignableScopes,[subscriptionId])
description: customRole.roleDescription
permissions: [
{
actions: customRole.roleActions
notActions: []
}
]
roleName: customRole.roleName
type: 'CustomRole'
}
}

output customRoleDefinitionId string = modifyExistingCustomRoleDefinition.id
32 changes: 4 additions & 28 deletions modules/iom/azureSubscriptionRoleAssignment.bicep
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,7 @@ param azurePrincipalId string
@description('Type of the Principal. Defaults to ServicePrincipal.')
param azurePrincipalType string = 'ServicePrincipal'

param customRole object = {
roleName: 'cs-website-reader'
roleDescription: 'CrowdStrike custom role to allow read access to App Service and Function.'
roleActions: [
'Microsoft.Web/sites/Read'
'Microsoft.Web/sites/config/Read'
'Microsoft.Web/sites/config/list/Action'
]
}
param customRoleDefinitionId string

var roleDefinitionIds = [
'acdd72a7-3385-48ef-bd42-f606fba81ae7' // Reader
Expand All @@ -29,22 +21,6 @@ var roleDefinitionIds = [
'7f6c6a51-bcf8-42ba-9220-52d62157d7db' // Azure Kubernetes Service RBAC Reader
]

resource customRoleDefinition 'Microsoft.Authorization/roleDefinitions@2022-04-01' = {
name: guid(customRole.roleName, subscription().id)
properties: {
assignableScopes: [subscription().id]
description: customRole.roleDescription
permissions: [
{
actions: customRole.roleActions
notActions: []
}
]
roleName: customRole.roleName
type: 'CustomRole'
}
}

resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = [
for roleDefinitionId in roleDefinitionIds: {
name: guid(azurePrincipalId, roleDefinitionId, subscription().id)
Expand All @@ -59,12 +35,12 @@ resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = [
resource customRoleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
name: guid(
azurePrincipalId,
customRoleDefinition.id,
customRoleDefinitionId,
subscription().id
)
properties: {
roleDefinitionId: customRoleDefinition.id
roleDefinitionId: customRoleDefinitionId
principalId: azurePrincipalId
principalType: azurePrincipalType
}
}
}
35 changes: 35 additions & 0 deletions modules/iom/azureSubscriptionRoleDefinition.bicep
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
targetScope = 'subscription'

/*
This Bicep template defines the required permissions at Azure Subscription scope to enable CrowdStrike
Indicator of Misconfiguration (IOM)
Copyright (c) 2024 CrowdStrike, Inc.
*/

param customRole object = {
roleName: 'cs-website-reader'
ndergal1 marked this conversation as resolved.
Show resolved Hide resolved
roleDescription: 'CrowdStrike custom role to allow read access to App Service and Function.'
roleActions: [
'Microsoft.Web/sites/Read'
'Microsoft.Web/sites/config/Read'
'Microsoft.Web/sites/config/list/Action'
]
}

resource customRoleDefinition 'Microsoft.Authorization/roleDefinitions@2022-04-01' = {
name: guid(customRole.roleName, subscription().id,'test')
properties: {
assignableScopes: [subscription().id]
description: customRole.roleDescription
permissions: [
{
actions: customRole.roleActions
notActions: []
}
]
roleName: customRole.roleName
type: 'CustomRole'
}
}

output customRoleDefinitionId string = customRoleDefinition.id