PowerShell : Créer un point de terminaison de service virtuel et une règle de réseau virtuel pour Azure SQL Database

S’APPLIQUE À : Azure SQL Database

Les règles de réseau virtuel constituent une fonctionnalité de sécurité du pare-feu. Elles permettent de déterminer si le serveur SQL logique de vos bases de données Azure SQL Database, de vos pools élastiques ou de vos bases de données Azure Synapse doit accepter les communications provenant de sous-réseaux spécifiques de réseaux virtuels.

Important

Cet article s’applique à Azure SQL Database ainsi qu’à Azure Synapse (anciennement SQL DW). Par souci de simplicité, le terme Azure SQL Database dans cet article s’applique aux bases de données appartenant à Azure SQL Database ou Azure Synapse. Cet article ne s’applique pas à Azure SQL Managed Instance, car aucun point de terminaison de service ne lui est associé.

Cet article présente un script PowerShell qui effectue les actions suivantes :

  1. Crée un point de terminaison de service virtuel Microsoft Azure sur votre sous-réseau.
  2. Ajoute le point de terminaison au pare-feu de votre serveur afin de créer une règle de réseau virtuel.

Pour plus d’informations, consultez Points de terminaison de service virtuel pour Azure SQL Database.

Conseil

Si vous devez uniquement évaluer ou ajouter le point de terminaison de service virtuel nom de type pour Azure SQL Database à votre sous-réseau, vous pouvez passer directement à notre script PowerShell plus direct.

Notes

Cet article utilise le module Azure Az PowerShell, qui est le module PowerShell recommandé pour interagir avec Azure. Pour démarrer avec le module Az PowerShell, consulter Installer Azure PowerShell. Pour savoir comment migrer vers le module Az PowerShell, consultez Migrer Azure PowerShell depuis AzureRM vers Az.

Important

Le module PowerShell Azure Resource Manager est toujours pris en charge par Azure SQL Database, mais tous les développements futurs sont destinés aux cmdlets Az.Sql. Pour obtenir l’ancien module, consultez AzureRM.Sql. Les arguments des commandes dans le module Az sont sensiblement identiques à ceux des modules AzureRm.

Principales applets de commande

Cet article se concentre sur la cmdlet New-AzSqlServerVirtualNetworkRule qui ajoute le point de terminaison de sous-réseau à la liste de contrôle d’accès (ACL, access-control list) de votre serveur, créant ainsi une règle.

La liste suivante montre la séquence des autres principales applets de commande que vous devez exécuter pour préparer votre appel à New-AzSqlServerVirtualNetworkRule. Dans cet article, ces appels se produisent dans le script 3 « Règle de réseau virtuel » :

  1. New-AzVirtualNetworkSubnetConfig : crée un objet sous-réseau.
  2. New-AzVirtualNetwork : crée votre réseau virtuel et lui attribue le sous-réseau.
  3. Set-AzVirtualNetworkSubnetConfig : assigne un point de terminaison de service virtuel à votre sous-réseau.
  4. Set-AzVirtualNetwork : permet de conserver les mises à jour apportées à votre réseau virtuel.
  5. New-AzSqlServerVirtualNetworkRule : lorsque votre sous-réseau devient un point de terminaison, il est ajouté en tant que règle de réseau virtuel à l’ACL de votre serveur.
    • Cette cmdlet propose le paramètre -IgnoreMissingVNetServiceEndpoint, à compter du module AzureRM PowerShell version 5.1.1.

Prérequis pour l’exécution de PowerShell

  • Vous pouvez déjà vous connecter à Azure, par exemple par le biais du Portail Azure.
  • Vous pouvez déjà exécuter des scripts PowerShell.

Notes

Assurez-vous que les points de terminaison de service sont activés pour le réseau virtuel/sous-réseau que vous voulez ajouter à votre serveur, sans quoi la création de la règle de pare-feu de réseau virtuel échoue.

Un script est divisé en quatre parties

Notre script PowerShell de démonstration est divisé en une séquence de scripts plus petits. La division facilite l’apprentissage et offre plus de souplesse. Les scripts doivent être exécutés dans la séquence indiquée. Si vous n’avez pas le temps d’exécuter les scripts maintenant, nos résultats de test réels sont affichés après le script 4.

Script 1 : Variables

Ce premier script PowerShell attribue des valeurs aux variables. Les scripts suivants dépendent de ces variables.

Important

Avant d’exécuter ce script, vous pouvez modifier les valeurs, si vous le souhaitez. Par exemple, si vous disposez déjà d’un groupe de ressources, vous pouvez remplacer le nom de votre groupe de ressources par la valeur attribuée.

Le nom de votre abonnement doit être modifié dans le script.

Code source du script PowerShell 1

######### Script 1 ########################################
##   LOG into to your Azure account.                     ##
##   (Needed only one time per powershell.exe session.)  ##
###########################################################

$yesno = Read-Host 'Do you need to log into Azure (only one time per powershell.exe session)?  [yes/no]'
if ('yes' -eq $yesno) { Connect-AzAccount }

###########################################################
##  Assignments to variables used by the later scripts.  ##
###########################################################

# You can edit these values, if necessary.
$SubscriptionName = 'yourSubscriptionName'
Select-AzSubscription -SubscriptionName $SubscriptionName

$ResourceGroupName = 'RG-YourNameHere'
$Region = 'westcentralus'

$VNetName = 'myVNet'
$SubnetName = 'mySubnet'
$VNetAddressPrefix = '10.1.0.0/16'
$SubnetAddressPrefix = '10.1.1.0/24'
$VNetRuleName = 'myFirstVNetRule-ForAcl'

$SqlDbServerName = 'mysqldbserver-forvnet'
$SqlDbAdminLoginName = 'ServerAdmin'
$SqlDbAdminLoginPassword = 'ChangeYourAdminPassword1'

$ServiceEndpointTypeName_SqlDb = 'Microsoft.Sql'  # Official type name.

Write-Host 'Completed script 1, the "Variables".'

Script 2 : Prérequis

Ce script prépare le script suivant, où se déroule l’action du point de terminaison. Ce script crée pour vous les éléments suivants, mais uniquement s’ils n’existent pas déjà. Vous pouvez ignorer le script 2 si vous êtes sûr que ces éléments existent déjà :

  • Groupe de ressources Azure
  • Serveur SQL logique

Code source du script PowerShell 2

######### Script 2 ########################################
##   Ensure your Resource Group already exists.          ##
###########################################################

Write-Host "Check whether your Resource Group already exists."

$gottenResourceGroup = $null
$gottenResourceGroup = Get-AzResourceGroup -Name $ResourceGroupName -ErrorAction SilentlyContinue

if ($null -eq $gottenResourceGroup) {
    Write-Host "Creating your missing Resource Group - $ResourceGroupName."
    New-AzResourceGroup -Name $ResourceGroupName -Location $Region
} else {
    Write-Host "Good, your Resource Group already exists - $ResourceGroupName."
}

$gottenResourceGroup = $null

###########################################################
## Ensure your server already exists. ##
###########################################################

Write-Host "Check whether your server already exists."

$sqlDbServer = $null
$azSqlParams = @{
    ResourceGroupName = $ResourceGroupName
    ServerName        = $SqlDbServerName
    ErrorAction       = 'SilentlyContinue'
}
$sqlDbServer = Get-AzSqlServer @azSqlParams

if ($null -eq $sqlDbServer) {
    Write-Host "Creating the missing server - $SqlDbServerName."
    Write-Host "Gather the credentials necessary to next create a server."

    $sqlAdministratorCredentials = [pscredential]::new($SqlDbAdminLoginName,(ConvertTo-SecureString -String $SqlDbAdminLoginPassword -AsPlainText -Force))

    if ($null -eq $sqlAdministratorCredentials) {
        Write-Host "ERROR, unable to create SQL administrator credentials.  Now ending."
        return
    }

    Write-Host "Create your server."

    $sqlSrvParams = @{
        ResourceGroupName           = $ResourceGroupName
        ServerName                  = $SqlDbServerName
        Location                    = $Region
        SqlAdministratorCredentials = $sqlAdministratorCredentials
    }
    New-AzSqlServer @sqlSrvParams
} else {
    Write-Host "Good, your server already exists - $SqlDbServerName."
}

$sqlAdministratorCredentials = $null
$sqlDbServer = $null

Write-Host 'Completed script 2, the "Prerequisites".'

Script 3 : Créer un point de terminaison et une règle

Ce script crée un réseau virtuel avec un sous-réseau. Le script attribue ensuite le type de point de terminaison Microsoft.Sql à votre sous-réseau. Enfin, le script ajoute votre sous-réseau à l’ACL, créant ainsi une règle.

Code source du script PowerShell 3

######### Script 3 ########################################
##   Create your virtual network, and give it a subnet.  ##
###########################################################

Write-Host "Define a subnet '$SubnetName', to be given soon to a virtual network."

$subnetParams = @{
    Name            = $SubnetName
    AddressPrefix   = $SubnetAddressPrefix
    ServiceEndpoint = $ServiceEndpointTypeName_SqlDb
}
$subnet = New-AzVirtualNetworkSubnetConfig @subnetParams

Write-Host "Create a virtual network '$VNetName'.`nGive the subnet to the virtual network that we created."

$vnetParams = @{
    Name              = $VNetName
    AddressPrefix     = $VNetAddressPrefix
    Subnet            = $subnet
    ResourceGroupName = $ResourceGroupName
    Location          = $Region
}
$vnet = New-AzVirtualNetwork @vnetParams

###########################################################
##   Create a Virtual Service endpoint on the subnet.    ##
###########################################################

Write-Host "Assign a Virtual Service endpoint 'Microsoft.Sql' to the subnet."

$vnetSubParams = @{
    Name            = $SubnetName
    AddressPrefix   = $SubnetAddressPrefix
    VirtualNetwork  = $vnet
    ServiceEndpoint = $ServiceEndpointTypeName_SqlDb
}
$vnet = Set-AzVirtualNetworkSubnetConfig @vnetSubParams

Write-Host "Persist the updates made to the virtual network > subnet."

$vnet = Set-AzVirtualNetwork -VirtualNetwork $vnet

$vnet.Subnets[0].ServiceEndpoints  # Display the first endpoint.

###########################################################
##   Add the Virtual Service endpoint Id as a rule,      ##
##   into SQL Database ACLs.                             ##
###########################################################

Write-Host "Get the subnet object."

$vnet = Get-AzVirtualNetwork -ResourceGroupName $ResourceGroupName -Name $VNetName

$subnet = Get-AzVirtualNetworkSubnetConfig -Name $SubnetName -VirtualNetwork $vnet

Write-Host "Add the subnet .Id as a rule, into the ACLs for your server."

$ruleParams = @{
    ResourceGroupName      = $ResourceGroupName
    ServerName             = $SqlDbServerName
    VirtualNetworkRuleName = $VNetRuleName
    VirtualNetworkSubnetId = $subnet.Id
}
New-AzSqlServerVirtualNetworkRule @ruleParams 

Write-Host "Verify that the rule is in the SQL Database ACL."

$rule2Params = @{
    ResourceGroupName      = $ResourceGroupName
    ServerName             = $SqlDbServerName
    VirtualNetworkRuleName = $VNetRuleName
}
Get-AzSqlServerVirtualNetworkRule @rule2Params

Write-Host 'Completed script 3, the "Virtual-Network-Rule".'

Script 4 : Nettoyage

Ce dernier script supprime les ressources que les scripts précédents ont créées pour la démonstration. Toutefois, le script vous demande de confirmer la suppression des éléments suivants :

  • Serveur SQL logique
  • Groupe de ressources Azure

Une fois le script 1 terminé, vous pouvez exécuter le script 4 à tout moment.

Code source du script PowerShell 4

######### Script 4 ########################################
##   Clean-up phase A:  Unconditional deletes.           ##
##                                                       ##
##   1. The test rule is deleted from SQL Database ACL.        ##
##   2. The test endpoint is deleted from the subnet.    ##
##   3. The test virtual network is deleted.             ##
###########################################################

Write-Host "Delete the rule from the SQL Database ACL."

$removeParams = @{
    ResourceGroupName      = $ResourceGroupName
    ServerName             = $SqlDbServerName
    VirtualNetworkRuleName = $VNetRuleName
    ErrorAction            = 'SilentlyContinue'
}
Remove-AzSqlServerVirtualNetworkRule @removeParams

Write-Host "Delete the endpoint from the subnet."

$vnet = Get-AzVirtualNetwork -ResourceGroupName $ResourceGroupName -Name $VNetName

Remove-AzVirtualNetworkSubnetConfig -Name $SubnetName -VirtualNetwork $vnet

Write-Host "Delete the virtual network (thus also deletes the subnet)."

$removeParams = @{
    Name              = $VNetName
    ResourceGroupName = $ResourceGroupName
    ErrorAction       = 'SilentlyContinue'
}
Remove-AzVirtualNetwork @removeParams

###########################################################
##   Clean-up phase B:  Conditional deletes.             ##
##                                                       ##
##   These might have already existed, so user might     ##
##   want to keep.                                       ##
##                                                       ##
##   1. Logical SQL server                        ##
##   2. Azure resource group                             ##
###########################################################

$yesno = Read-Host 'CAUTION !: Do you want to DELETE your server AND your resource group?  [yes/no]'
if ('yes' -eq $yesno) {
    Write-Host "Remove the server."

    $removeParams = @{
        ServerName        = $SqlDbServerName
        ResourceGroupName = $ResourceGroupName
        ErrorAction       = 'SilentlyContinue'
    }
    Remove-AzSqlServer @removeParams

    Write-Host "Remove the Azure Resource Group."
    
    Remove-AzResourceGroup -Name $ResourceGroupName -ErrorAction SilentlyContinue
} else {
    Write-Host "Skipped over the DELETE of SQL Database and resource group."
}

Write-Host 'Completed script 4, the "Clean-Up".'

Vérifiez que votre sous-réseau est un point de terminaison

Vous disposez peut-être d’un sous-réseau auquel le nom de type Microsoft.Sql a déjà été attribué, ce qui signifie qu’il est déjà un point de terminaison de service virtuel. Vous pouvez utiliser le Portail Azure pour créer une règle de réseau virtuel à partir du point de terminaison.

Ou, vous n’êtes peut-être pas certain que votre sous-réseau comporte un nom de type Microsoft.Sql. Vous pouvez exécuter le script PowerShell suivant pour effectuer ces actions :

  1. Assurez-vous que votre sous-réseau comporte le nom de type Microsoft.Sql.
  2. Attribuez éventuellement le nom de type s’il est absent.
    • Le script vous invite à confirmer que le nom de type est absent.

Phases du script

Voici les phases du script PowerShell :

  1. Connectez-vous à votre compte Azure, nécessaire une seule fois par session PS. Attribuez les variables.
  2. Recherchez votre réseau virtuel, puis votre sous-réseau.
  3. Votre sous-réseau est-il étiqueté comme type de serveur de point de terminaison Microsoft.Sql ?
  4. Ajoutez un point de terminaison de service virtuel avec le nom de type Microsoft.Sql sur votre sous-réseau.

Important

Avant d’exécuter ce script, vous devez modifier les valeurs affectées aux variables $, au début du script.

Code de source PowerShell direct

Ce script PowerShell ne met rien à jour, sauf si vous répondez Oui lorsque PowerShell vous demande confirmation. Le script peut ajouter le nom de type Microsoft.Sql à votre sous-réseau. Mais le script essaie d’ajouter ce nom de type uniquement si votre sous-réseau n’en dispose pas.

### 1. LOG into to your Azure account, needed only once per PS session.  Assign variables.
$yesno = Read-Host 'Do you need to log into Azure (only one time per powershell.exe session)?  [yes/no]'
if ('yes' -eq $yesno) { Connect-AzAccount }

# Assignments to variables used by the later scripts.
# You can EDIT these values, if necessary.

$SubscriptionName = 'yourSubscriptionName'
Select-AzSubscription -SubscriptionName "$SubscriptionName"

$ResourceGroupName = 'yourRGName'
$VNetName = 'yourVNetName'
$SubnetName = 'yourSubnetName'
$SubnetAddressPrefix = 'Obtain this value from the Azure portal.' # Looks roughly like: '10.0.0.0/24'

$ServiceEndpointTypeName_SqlDb = 'Microsoft.Sql'  # Do NOT edit. Is official value.

### 2. Search for your virtual network, and then for your subnet.
# Search for the virtual network.
$vnet = $null
$vnet = Get-AzVirtualNetwork -ResourceGroupName $ResourceGroupName -Name $VNetName

if ($vnet -eq $null) {
    Write-Host "Caution: No virtual network found by the name '$VNetName'."
    return
}

$subnet = $null
for ($nn = 0; $nn -lt $vnet.Subnets.Count; $nn++) {
    $subnet = $vnet.Subnets[$nn]
    if ($subnet.Name -eq $SubnetName) { break }
    $subnet = $null
}

if ($null -eq $subnet) {
    Write-Host "Caution: No subnet found by the name '$SubnetName'"
    Return
}

### 3. Is your subnet tagged as 'Microsoft.Sql' endpoint server type?
$endpointMsSql = $null
for ($nn = 0; $nn -lt $subnet.ServiceEndpoints.Count; $nn++) {
    $endpointMsSql = $subnet.ServiceEndpoints[$nn]
    if ($endpointMsSql.Service -eq $ServiceEndpointTypeName_SqlDb) {
        $endpointMsSql
        break
    }
    $endpointMsSql = $null
}

if ($null -eq $endpointMsSql) {
    Write-Host "Good: Subnet found, and is already tagged as an endpoint of type '$ServiceEndpointTypeName_SqlDb'."
    return
} else {
    Write-Host "Caution: Subnet found, but not yet tagged as an endpoint of type '$ServiceEndpointTypeName_SqlDb'."

    # Ask the user for confirmation.
    $yesno = Read-Host 'Do you want the PS script to apply the endpoint type name to your subnet?  [yes/no]'
    if ('no' -eq $yesno) { return }
}

### 4. Add a Virtual Service endpoint of type name 'Microsoft.Sql', on your subnet.
$setParams = @{
    Name            = $SubnetName
    AddressPrefix   = $SubnetAddressPrefix
    VirtualNetwork  = $vnet
    ServiceEndpoint = $ServiceEndpointTypeName_SqlDb
}
$vnet = Set-AzVirtualNetworkSubnetConfig @setParams

# Persist the subnet update.
$vnet = Set-AzVirtualNetwork -VirtualNetwork $vnet

for ($nn = 0; $nn -lt $vnet.Subnets.Count; $nn++) {
    $vnet.Subnets[0].ServiceEndpoints # Display.
}