Dela via


PowerShell: Skapa en virtuell tjänstslutpunkt och en VNet-regel för Azure SQL Database

gäller för:Azure SQL Database

Regler för virtuellt nätverk är en brandväggssäkerhetsfunktion som styr om den logiska SQL-servern för din Azure SQL Database databaser, elastiska pooler eller databaser i Azure Synapse acceptera kommunikation som skickas från vissa undernät i virtuella nätverk.

Viktig

Den här artikeln gäller för Azure SQL Database, inklusive Azure Synapse (tidigare SQL DW). För enkelhetens skull gäller termen Azure SQL Database i den här artikeln för databaser som tillhör antingen Azure SQL Database eller Azure Synapse. Den här artikeln inte gäller för Azure SQL Managed Instance eftersom den inte har någon associerad tjänstslutpunkt.

Den här artikeln visar ett PowerShell-skript som utför följande åtgärder:

  1. Skapar en Microsoft Azure Virtual Service-slutpunkt i undernätet.
  2. Lägger till slutpunkten i din servers brandvägg för att skapa en virtuell nätverksregel .

Mer bakgrund finns i Virtual Service-slutpunkter för Azure SQL Database.

Tips

Om allt du behöver är att utvärdera eller lägga till den virtuella tjänstslutpunkten typnamn för Azure SQL Database i ditt undernät, kan du gå vidare till vårt mer direkta PowerShell-skript.

Anteckning

Den här artikeln använder Azure Az PowerShell-modulen, som är den rekommenderade PowerShell-modulen för interaktion med Azure. Information om hur du kommer igång med Az PowerShell-modulen finns i Installera Azure PowerShell. Information om hur du migrerar till Az PowerShell-modulen finns i Migrera Azure PowerShell från AzureRM till Az.

Viktig

PowerShell-modulen Azure Resource Manager (AzureRM) blev föråldrad den 29 februari 2024. All framtida utveckling bör använda Az.Sql-modulen. Användare rekommenderas att migrera från AzureRM till Az PowerShell-modulen för att säkerställa fortsatt support och uppdateringar. AzureRM-modulen underhålls inte längre eller stöds inte längre. Argumenten för kommandona i Az PowerShell-modulen och i AzureRM-modulerna är i stort sätt identiska. Mer information om deras kompatibilitet finns i Introduktion till den nya Az PowerShell-modulen.

Större cmdletar

I den här artikeln betonas New-AzSqlServerVirtualNetworkRule cmdlet som lägger till undernätsslutpunkten i åtkomstkontrollistan (ACL) på servern, vilket skapar en regel.

I följande lista visas sekvensen med andra huvudsakliga cmdlets som du måste köra för att förbereda ditt anrop till New-AzSqlServerVirtualNetworkRule. I den här artikeln sker dessa anrop i skript 3 "Regel för virtuellt nätverk":

  1. New-AzVirtualNetworkSubnetConfig: Skapar ett undernätsobjekt.
  2. New-AzVirtualNetwork: Skapar ditt virtuella nätverk, vilket ger det undernätet.
  3. Set-AzVirtualNetworkSubnetConfig: Tilldelar en virtuell tjänstslutpunkt till undernätet.
  4. Set-AzVirtualNetwork: Bevarar uppdateringar som gjorts i det virtuella nätverket.
  5. New-AzSqlServerVirtualNetworkRule: När ditt undernät är en slutpunkt lägger du till undernätet som en regel för virtuellt nätverk i serverns ACL.
    • Den här cmdleten Erbjuder parametern -IgnoreMissingVNetServiceEndpoint.

Förutsättningar för att köra PowerShell

  • Du kan redan logga in på Azure, till exempel via Azure-portalen.
  • Du kan redan köra PowerShell-skript.

Anteckning

Kontrollera att tjänstslutpunkterna är aktiverade för det virtuella nätverk/undernät som du vill lägga till på servern, annars misslyckas skapande av brandväggsregeln för virtuella nätverk.

Ett skript indelat i fyra segment

Vårt PowerShell-demonstrationsskript är indelat i en sekvens med mindre skript. Divisionen underlättar inlärningen och ger flexibilitet. Skripten måste köras i sin angivna sekvens. Om du inte har tid att köra skripten nu visas våra faktiska testutdata efter skript 4.

Skript 1: Variabler

Det första PowerShell-skriptet tilldelar värden till variabler. De efterföljande skripten beror på dessa variabler.

Viktig

Innan du kör det här skriptet kan du redigera värdena om du vill. Om du till exempel redan har en resursgrupp kanske du vill redigera resursgruppens namn som det tilldelade värdet.

Ditt prenumerationsnamn ska redigeras i skriptet.

PowerShell-skript 1-källkod

######### 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".'

Skript 2: Förutsättningar

Det här skriptet förbereder för nästa skript, där slutpunktsåtgärden utförs. Det här skriptet skapar följande objekt i listan, men bara om de inte redan finns. Du kan hoppa över skript 2 om du är säker på att dessa objekt redan finns:

  • Azure-resursgrupp
  • Logisk SQL-server

PowerShell-skript 2-källkod

######### 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".'

Skript 3: Skapa en slutpunkt och en regel

Det här skriptet skapar ett virtuellt nätverk med ett undernät. Sedan tilldelar skriptet Microsoft.Sql slutpunktstyp till undernätet. Slutligen lägger skriptet till ditt undernät i åtkomstkontrollistan (ACL) och skapar därmed en regel.

PowerShell-skript 3-källkod

######### 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".'

Skript 4: Rensa

Det här sista skriptet tar bort de resurser som tidigare skript skapade för demonstrationen. Skriptet ber dock om bekräftelse innan det tar bort följande:

  • Azure SQL-logisk server
  • Azure-resursgrupp

Du kan köra skript 4 när som helst när skript 1 har slutförts.

PowerShell-skript 4-källkod

######### 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".'

Kontrollera att ditt undernät är en slutpunkt

Du kan ha ett undernät som redan har tilldelats Microsoft.Sql typnamn, vilket innebär att det redan är en virtuell tjänstslutpunkt. Du kan använda Azure-portalen för att skapa en regel för virtuellt nätverk från slutpunkten.

Eller så kan du vara osäker på om ditt undernät har Microsoft.Sql typnamn. Du kan köra följande PowerShell-skript för att utföra dessa åtgärder:

  1. Kontrollera om ditt undernät har typenamnet Microsoft.Sql.
  2. Du kan välja att tilldela typnamnet om det saknas.
    • Skriptet ber dig att bekräftainnan det använder det saknade typnamnet.

Faser i skriptet

Här är faserna i PowerShell-skriptet:

  1. Logga in på ditt Azure-konto, som bara behövs en gång per PowerShell-session. Tilldela variabler.
  2. Sök efter ditt virtuella nätverk och leta sedan efter ditt undernät.
  3. Är ditt undernät taggat som Microsoft.Sql slutpunktsservertyp?
  4. Lägg till en virtuell tjänstslutpunkt med typnamnet Microsoft.Sqli undernätet.

Viktig

Innan du kör det här skriptet måste du redigera de värden som tilldelats till $-variablerna, längst upp i skriptet.

Direct PowerShell-källkod

Det här PowerShell-skriptet uppdaterar ingenting, såvida du inte svarar ja om du uppmanas att bekräfta det. Skriptet kan lägga till typnamnet Microsoft.Sql i undernätet. Men skriptet försöker bara lägga till om undernätet saknar typnamnet.

### 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.
}