sovereignApplications/confidential/hrAppWorkload/scripts/initializeDatabase.ps1 (109 lines of code) (raw):

# Copyright (c) Microsoft Corporation. # Licensed under the MIT License. <# .SYNOPSIS This PowerShell script initializes database which is called by hrAppWorkload.ps1. .DESCRIPTION - Executes the individual modules - hr app sample workload Prerequisites: Connect-AzAccount -Subscription %SUBSCRIPTION_ID% Add-SqlAzureAuthenticationContext -Interactive #> Param( [Parameter(Mandatory=$True,Position=0)] [String] $parResourceGroupName, [Parameter(Mandatory=$True,Position=1)] [String] $parAttestationProviderName, [Parameter(Mandatory=$True,Position=2)] [String] $parSqlServerName, [Parameter(Mandatory=$True,Position=3)] [String] $parSqlDatabaseName, [Parameter(Mandatory=$True,Position=4)] [String] $parSqlAdminUser, [Parameter(Mandatory=$True,Position=5)] [String] $parSqlAdminPassword, [Parameter(Mandatory=$True,Position=6)] [String] $parVmServicePrincipalName, [Parameter(Mandatory=$True,Position=7)] [String] $parColumnMasterKeyUrl ) $erroractionPreference = "Stop" Write-Information ">>> Waiting 3 minutes for Azure DNS propagation to take place." -InformationAction Continue Start-Sleep -Seconds 180 try { # Load required PS modules Import-Module Az.Attestation Import-Module SqlServer # Configure attestation provider policy Write-Information ">>> Setting Attestation Provider policy." -InformationAction Continue $varPolicyFile = "../../../../common/attestationpolicy.txt" $varTeeType = "SgxEnclave" $varPolicyFormat = "Text" $varPolicy=Get-Content -path $varPolicyFile -Raw Set-AzAttestationPolicy -Name $parAttestationProviderName ` -ResourceGroupName $parResourceGroupName ` -Tee $varTeeType ` -Policy $varPolicy ` -PolicyFormat $varPolicyFormat # SQL server details $varSqlServerFQDN="${parSqlServerName}.database.windows.net" $varDbConnectionString="Server=tcp:$varSqlServerFQDN,1433;Initial Catalog=$parSqlDatabaseName;Persist Security Info=False;Column Encryption Setting = Enabled;User ID=$parSqlAdminUser;Password=$parSqlAdminPassword;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;" # Assign database read access to the VM service principal identity # New AAD users can only be added by the AAD admin, so we get a token for that user first Write-Information ">>> Adding database user for CVM service principal." -InformationAction Continue $varAccessToken=(Get-AzAccessToken -ResourceUrl https://database.windows.net/).Token $varParams = @{ 'Database' = $parSqlDatabaseName 'ServerInstance' = $varSqlServerFQDN 'AccessToken' = $varAccessToken 'Query' = "CREATE USER [$parVmServicePrincipalName] FROM EXTERNAL PROVIDER; ALTER ROLE db_owner ADD MEMBER [$parVmServicePrincipalName];" } Invoke-Sqlcmd @varParams # Create schema Write-Information ">>> Creating database schema." -InformationAction Continue $varParams = @{ 'ConnectionString' = $varDbConnectionString 'Query' = "CREATE SCHEMA [HR];" } Invoke-Sqlcmd @varParams # Create table Write-Information ">>> Creating database table." -InformationAction Continue $varParams = @{ 'ConnectionString' = $varDbConnectionString 'InputFile' = "../../contosoHR/data/schema.sql" } Invoke-Sqlcmd @varParams # Upload data Write-Information ">>> Uploading database contents." -InformationAction Continue $varParams = @{ 'ConnectionString' = $varDbConnectionString 'InputFile' = "../../contosoHR/data/data.sql" } Invoke-Sqlcmd @varParams # Generate CMK settings using key from key vault $keyVaultAccessToken = (Get-AzAccessToken -ResourceUrl https://vault.azure.net).Token $varCmkSettings = New-SqlAzureKeyVaultColumnMasterKeySettings -KeyURL $parColumnMasterKeyUrl -AllowEnclaveComputations -KeyVaultAccessToken $keyVaultAccessToken # Provision CMK and CEK to SQL Server Write-Information ">>> Provisioning Always Encrypted keys." -InformationAction Continue $Database = Get-SqlDatabase -ConnectionString $varDbConnectionString New-SqlColumnMasterKey -Name "CMK1" -InputObject $Database -ColumnMasterKeySettings $varCmkSettings New-SqlColumnEncryptionKey -Name "CEK1" -InputObject $Database -ColumnMasterKey "CMK1" -KeyVaultAccessToken $keyVaultAccessToken # Encrypt the selected columns Write-Information ">>> Encrypting SSN and Salary columns." -InformationAction Continue $CES = @() $CES += New-SqlColumnEncryptionSettings -ColumnName "HR.Employees.SSN" -EncryptionType "Randomized" -EncryptionKey "CEK1" $CES += New-SqlColumnEncryptionSettings -ColumnName "HR.Employees.Salary" -EncryptionType "Randomized" -EncryptionKey "CEK1" Set-SqlColumnEncryption -InputObject $Database -ColumnEncryptionSettings $CES -UseOnlineApproach -LogFileDirectory . -KeyVaultAccessToken $keyVaultAccessToken Write-Information ">>> Database initialization complete." -InformationAction Continue } catch { $errorMessage = "" $exception = $_.Exception.ToString() if ($null -ne $exception) { $errorMessage = $exception } else { $errorMessage = $error[0].ToString() } throw $errorMessage }