add openhack files
This commit is contained in:
35
support/sqlsecretrotation/iac/bicep/deploy.sh
Normal file
35
support/sqlsecretrotation/iac/bicep/deploy.sh
Normal file
@ -0,0 +1,35 @@
|
||||
#!/bin/bash
|
||||
|
||||
declare LOCATION=$1
|
||||
declare RESOURCES_PREFIX=$2
|
||||
declare RESOURCES_SUFFIX=$3
|
||||
declare KEY_VAULT_RESOURCE_GROUP_NAME=$4
|
||||
declare KEY_VAULT_NAME=$5
|
||||
|
||||
declare -r USAGE_HELP="Usage: ./deploy.sh <LOCATION> <RESOURCES_PREFIX> <RESOURCES_SUFFIX> <KEY_VAULT_RESOURCE_GROUP_NAME> <KEY_VAULT_NAME>"
|
||||
|
||||
if [ $# -ne 5 ]; then
|
||||
echo "${USAGE_HELP}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check for programs
|
||||
if ! [ -x "$(command -v az)" ]; then
|
||||
echo "az is not installed!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -f "devvars.sh" ]; then
|
||||
. devvars.sh
|
||||
fi
|
||||
|
||||
RESOURCE_GROUP_NAME="${RESOURCES_PREFIX}${RESOURCES_SUFFIX}rg"
|
||||
|
||||
if [ $(az group exists --name "${RESOURCE_GROUP_NAME}") = false ]; then
|
||||
az group create --name "${RESOURCE_GROUP_NAME}" --location "${LOCATION}"
|
||||
fi
|
||||
|
||||
az deployment group create \
|
||||
--resource-group "${RESOURCE_GROUP_NAME}" \
|
||||
--template-file main.bicep \
|
||||
--parameters keyVaultRgName="${KEY_VAULT_RESOURCE_GROUP_NAME}" keyVaultName="${KEY_VAULT_NAME}" resourcesPrefix="${RESOURCES_PREFIX}" resourcesSuffix="${RESOURCES_SUFFIX}"
|
60
support/sqlsecretrotation/iac/bicep/keyVault.bicep
Normal file
60
support/sqlsecretrotation/iac/bicep/keyVault.bicep
Normal file
@ -0,0 +1,60 @@
|
||||
param keyVaultName string
|
||||
param functionAppId string
|
||||
param functionAppPrincipalId string
|
||||
param functionAppTenantId string
|
||||
param eventSubscriptionName string
|
||||
param secretName string
|
||||
|
||||
// https://docs.microsoft.com/en-us/azure/templates/microsoft.keyvault/vaults?tabs=bicep
|
||||
resource keyVault 'Microsoft.KeyVault/vaults@2021-06-01-preview' existing = {
|
||||
name: keyVaultName
|
||||
}
|
||||
|
||||
// https://docs.microsoft.com/en-us/azure/templates/microsoft.keyvault/vaults/accesspolicies?tabs=bicep
|
||||
resource keyVaultAccessPolicy 'Microsoft.KeyVault/vaults/accessPolicies@2021-06-01-preview' = {
|
||||
name: 'add'
|
||||
parent: keyVault
|
||||
properties: {
|
||||
accessPolicies: [
|
||||
{
|
||||
tenantId: functionAppTenantId
|
||||
objectId: functionAppPrincipalId
|
||||
permissions: {
|
||||
secrets: [
|
||||
'get'
|
||||
'list'
|
||||
'set'
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
// https://docs.microsoft.com/en-us/azure/templates/microsoft.eventgrid/eventsubscriptions?tabs=bicep
|
||||
resource keyVaultEventSubscription 'Microsoft.EventGrid/eventSubscriptions@2021-06-01-preview' = {
|
||||
name: eventSubscriptionName
|
||||
scope: keyVault
|
||||
properties: {
|
||||
destination: {
|
||||
endpointType: 'AzureFunction'
|
||||
properties: {
|
||||
maxEventsPerBatch: 1
|
||||
preferredBatchSizeInKilobytes: 64
|
||||
resourceId: '${functionAppId}/functions/AKVSQLRotation'
|
||||
}
|
||||
}
|
||||
filter: {
|
||||
subjectBeginsWith: secretName
|
||||
subjectEndsWith: secretName
|
||||
includedEventTypes: [
|
||||
'Microsoft.KeyVault.SecretNearExpiry'
|
||||
]
|
||||
}
|
||||
eventDeliverySchema: 'EventGridSchema'
|
||||
retryPolicy: {
|
||||
eventTimeToLiveInMinutes: 60
|
||||
maxDeliveryAttempts: 30
|
||||
}
|
||||
}
|
||||
}
|
115
support/sqlsecretrotation/iac/bicep/main.bicep
Normal file
115
support/sqlsecretrotation/iac/bicep/main.bicep
Normal file
@ -0,0 +1,115 @@
|
||||
param keyVaultRgName string = resourceGroup().name
|
||||
param keyVaultName string
|
||||
param resourcesPrefix string
|
||||
param resourcesSuffix string = 'sqlsecrot'
|
||||
param secretName string = 'SQL-PASSWORD'
|
||||
param repoUrl string = 'https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp.git'
|
||||
|
||||
// https://docs.microsoft.com/en-us/azure/templates/microsoft.storage/storageaccounts?tabs=bicep
|
||||
resource storageAccount 'Microsoft.Storage/storageAccounts@2021-06-01' = {
|
||||
name: '${resourcesPrefix}${resourcesSuffix}st'
|
||||
location: resourceGroup().location
|
||||
sku: {
|
||||
name: 'Standard_LRS'
|
||||
}
|
||||
kind: 'StorageV2'
|
||||
properties: {
|
||||
supportsHttpsTrafficOnly: true
|
||||
accessTier: 'Hot'
|
||||
}
|
||||
}
|
||||
|
||||
// https://docs.microsoft.com/en-us/azure/templates/microsoft.web/serverfarms?tabs=bicep
|
||||
resource appServicePlan 'Microsoft.Web/serverfarms@2021-02-01' = {
|
||||
name: '${resourcesPrefix}${resourcesSuffix}plan'
|
||||
location: resourceGroup().location
|
||||
sku: {
|
||||
name: 'Y1'
|
||||
tier: 'Dynamic'
|
||||
}
|
||||
}
|
||||
|
||||
// https://docs.microsoft.com/en-us/azure/templates/microsoft.web/sites?tabs=bicep
|
||||
resource functionApp 'Microsoft.Web/sites@2021-02-01' = {
|
||||
name: '${resourcesPrefix}${resourcesSuffix}func'
|
||||
location: resourceGroup().location
|
||||
kind: 'functionapp'
|
||||
identity: {
|
||||
type: 'SystemAssigned'
|
||||
}
|
||||
properties: {
|
||||
enabled: true
|
||||
serverFarmId: appServicePlan.id
|
||||
httpsOnly: true
|
||||
siteConfig: {
|
||||
appSettings: [
|
||||
{
|
||||
name: 'AzureWebJobsStorage'
|
||||
value: 'DefaultEndpointsProtocol=https;AccountName=${storageAccount.name};EndpointSuffix=${environment().suffixes.storage};AccountKey=${storageAccount.listKeys().keys[0].value}'
|
||||
}
|
||||
{
|
||||
name: 'WEBSITE_CONTENTAZUREFILECONNECTIONSTRING'
|
||||
value: 'DefaultEndpointsProtocol=https;AccountName=${storageAccount.name};EndpointSuffix=${environment().suffixes.storage};AccountKey=${storageAccount.listKeys().keys[0].value}'
|
||||
}
|
||||
{
|
||||
name: 'WEBSITE_CONTENTSHARE'
|
||||
value: toLower('${resourcesPrefix}${resourcesSuffix}func')
|
||||
}
|
||||
{
|
||||
name: 'FUNCTIONS_EXTENSION_VERSION'
|
||||
value: '~3'
|
||||
}
|
||||
{
|
||||
name: 'FUNCTIONS_WORKER_RUNTIME'
|
||||
value: 'dotnet'
|
||||
}
|
||||
{
|
||||
name: 'APPINSIGHTS_INSTRUMENTATIONKEY'
|
||||
value: applicationInsights.properties.InstrumentationKey
|
||||
}
|
||||
{
|
||||
name: 'APPLICATIONINSIGHTS_CONNECTION_STRING'
|
||||
value: applicationInsights.properties.ConnectionString
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// https://docs.microsoft.com/en-us/azure/templates/microsoft.web/sites/sourcecontrols?tabs=bicep
|
||||
resource functionAppSourceControl 'Microsoft.Web/sites/sourcecontrols@2021-02-01' = {
|
||||
name: 'web'
|
||||
parent: functionApp
|
||||
properties: {
|
||||
repoUrl: repoUrl
|
||||
branch: 'main'
|
||||
isManualIntegration: true
|
||||
}
|
||||
}
|
||||
|
||||
// https://docs.microsoft.com/en-us/azure/templates/microsoft.insights/components?tabs=bicep
|
||||
resource applicationInsights 'microsoft.insights/components@2020-02-02' = {
|
||||
name: '${resourcesPrefix}${resourcesSuffix}appi'
|
||||
location: resourceGroup().location
|
||||
kind: 'web'
|
||||
properties: {
|
||||
Application_Type: 'web'
|
||||
}
|
||||
}
|
||||
|
||||
module keyVault './keyVault.bicep' = {
|
||||
name: 'keyVaultDeployment'
|
||||
params: {
|
||||
keyVaultName: keyVaultName
|
||||
functionAppId: functionApp.id
|
||||
functionAppTenantId: functionApp.identity.tenantId
|
||||
functionAppPrincipalId: functionApp.identity.principalId
|
||||
eventSubscriptionName: '${keyVaultName}-${secretName}-${functionApp.name}'
|
||||
secretName: secretName
|
||||
}
|
||||
scope: resourceGroup(keyVaultRgName)
|
||||
dependsOn: [
|
||||
functionApp
|
||||
functionAppSourceControl
|
||||
]
|
||||
}
|
Reference in New Issue
Block a user