PowerShell: Azure SQL Veritabanı için sanal hizmet uç noktası ve sanal ağ kuralı oluşturma

Şunlar için geçerlidir:Azure SQL Veritabanı

Sanal ağ kuralları, Azure SQL Veritabanı veritabanlarınız, elastik havuzlarınız veya Azure Synapse veritabanlarınız için mantıksal SQL sunucusunun sanal ağlardaki belirli alt ağlardan gönderilen iletişimleri kabul edip etmediğini denetleen bir güvenlik duvarı güvenlik özelliğidir.

Önemli

Bu makale, Azure Synapse (eski adı SQL DW) dahil olmak üzere Azure SQL Veritabanı için geçerlidir. Kolaylık olması için, bu makaledeki Azure SQL Veritabanı terimi Azure SQL Veritabanı veya Azure Synapse'e ait veritabanları için geçerlidir. Bu makale Azure SQL Yönetilen Örneği için geçerli değildir çünkü kendisiyle ilişkilendirilmiş bir hizmet uç noktası yoktur.

Bu makalede, aşağıdaki eylemleri gerçekleştiren bir PowerShell betiği gösterilmektedir:

  1. Alt ağınızda bir Microsoft Azure Sanal Hizmet uç noktası oluşturur.
  2. Sanal ağ kuralı oluşturmak için uç noktayı sunucunuzun güvenlik duvarına ekler.

Daha fazla arka plan için bkz . Azure SQL Veritabanı için Sanal Hizmet uç noktaları.

Bahşiş

Tek yapmanız gereken Azure SQL Veritabanı için Sanal Hizmet uç nokta türü adını alt ağınıza eklemek veya değerlendirmekse, daha doğrudan PowerShell betiğimize atlayabilirsiniz.

Not

Bu makalede, Azure ile etkileşim için önerilen PowerShell modülü olan Azure Az PowerShell modülü kullanılır. Az PowerShell modülünü kullanmaya başlamak için Azure PowerShell’i yükleyin. Az PowerShell modülüne nasıl geçeceğinizi öğrenmek için bkz. Azure PowerShell’i AzureRM’den Az’ye geçirme.

Önemli

PowerShell Azure Resource Manager modülü Azure SQL Veritabanı tarafından hala desteklenmektedir, ancak gelecekteki tüm geliştirmeler Cmdlet'lere yöneliktirAz.Sql. Eski modül için bkz . AzureRM.Sql. Az modülündeki ve AzureRm modüllerindeki komutların bağımsız değişkenleri önemli ölçüde aynıdır.

Ana cmdlet'ler

Bu makalede, alt ağ uç noktasını sunucunuzun erişim denetimi listesine (ACL) ekleyen New-AzSqlServerVirtualNetworkRule cmdlet'i vurgulanmış ve bu sayede bir kural oluşturulmlanmıştır.

Aşağıdaki listede, New-AzSqlServerVirtualNetworkRule çağrısına hazırlanmak için çalıştırmanız gereken diğer ana cmdlet'lerin sırası gösterilmektedir. Bu makalede, bu çağrılar 3 "Sanal ağ kuralı" betiğinde gerçekleşir:

  1. New-AzVirtualNetworkSubnetConfig: Bir alt ağ nesnesi oluşturur.
  2. New-AzVirtualNetwork: Sanal ağınızı oluşturarak alt ağı verir.
  3. Set-AzVirtualNetworkSubnetConfig: Alt ağınıza bir Sanal Hizmet uç noktası atar.
  4. Set-AzVirtualNetwork: Sanal ağınızda yapılan güncelleştirmeleri kalıcı hale getirmektedir.
  5. New-AzSqlServerVirtualNetworkRule: Alt ağınız bir uç nokta olduktan sonra, alt ağınızı sanal ağ kuralı olarak sunucunuzun ACL'sine ekler.
    • Bu cmdlet, Azure RM PowerShell Modülü sürüm 5.1.1'den başlayarak -IgnoreMissingVNetServiceEndpoint parametresini sunar.

PowerShell çalıştırma önkoşulları

  • Azure portalı gibi Azure'da zaten oturum açabilirsiniz.
  • PowerShell betiklerini zaten çalıştırabilirsiniz.

Not

Lütfen Sunucunuza eklemek istediğiniz sanal ağ/alt ağ için hizmet uç noktalarının açık olduğundan emin olun, aksi takdirde VNet Güvenlik Duvarı Kuralı oluşturulamaz.

Bir betik dört öbeklere ayrılmıştır

Tanıtım PowerShell betiğimiz daha küçük betiklerden oluşan bir diziye ayrılmıştır. Bölme, öğrenmeyi kolaylaştırır ve esneklik sağlar. Betikler belirtilen sıralarında çalıştırılmalıdır. Betikleri çalıştırmak için şimdi vaktiniz yoksa, gerçek test çıkışımız betik 4'e göre görüntülenir.

Betik 1: Değişkenler

Bu ilk PowerShell betiği değişkenlere değer atar. Sonraki betikler bu değişkenlere bağlıdır.

Önemli

Bu betiği çalıştırmadan önce, isterseniz değerleri düzenleyebilirsiniz. Örneğin, zaten bir kaynak grubunuz varsa, atanan değer olarak kaynak grubu adınızı düzenlemek isteyebilirsiniz.

Abonelik adınız betikte düzenlenmelidir.

PowerShell betiği 1 kaynak kodu

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

Betik 2: Önkoşullar

Bu betik, uç nokta eyleminin bulunduğu sonraki betik için hazırlanır. Bu betik, aşağıdaki listelenen öğeleri sizin için oluşturur, ancak yalnızca henüz yoksa. Bu öğelerin zaten var olduğundan eminseniz 2. betiği atlayabilirsiniz:

  • Azure kaynak grubu
  • Mantıksal SQL sunucusu

PowerShell betiği 2 kaynak kodu

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

Betik 3: Uç nokta ve kural oluşturma

Bu betik, alt ağa sahip bir sanal ağ oluşturur. Ardından betik, alt ağınıza Microsoft.Sql uç nokta türünü atar. Son olarak betik, alt ağınızı erişim denetimi listesine (ACL) ekler ve böylece bir kural oluşturur.

PowerShell betiği 3 kaynak kodu

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

Betik 4: Temizleme

Bu son betik, önceki betiklerin gösterim için oluşturduğu kaynakları siler. Ancak betik, aşağıdakileri silmeden önce onay ister:

  • Mantıksal SQL sunucusu
  • Azure Kaynak Grubu

Betik 1 tamamlandıktan sonra betik 4'i istediğiniz zaman çalıştırabilirsiniz.

PowerShell betiği 4 kaynak kodu

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

Alt ağınızın bir uç nokta olduğunu doğrulayın

Microsoft.Sql tür adı atanmış bir alt ağınız olabilir; bu da zaten bir Sanal Hizmet uç noktası olduğu anlamına gelir. Uç noktadan sanal ağ kuralı oluşturmak için Azure portalını kullanabilirsiniz.

Alternatif olarak, alt ağınızın Microsoft.Sql tür adına sahip olup olmadığından emin olmayabilirsiniz. Bu eylemleri yapmak için aşağıdaki PowerShell betiğini çalıştırabilirsiniz:

  1. Alt ağınızın Microsoft.Sql tür adına sahip olup olmadığını belirleyin.
  2. İsteğe bağlı olarak, yoksa tür adını atayın.
    • Betik, eksik tür adını uygulamadan önce onaylamanızı ister.

Betiğin aşamaları

PowerShell betiğinin aşamaları şunlardır:

  1. PS oturumu başına yalnızca bir kez gereken Azure hesabınızda oturum açın. Değişkenleri atayın.
  2. Sanal ağınızı ve ardından alt ağınızı arayın.
  3. Alt ağınız Microsoft.Sql uç nokta sunucu türü olarak etiketlendi mi?
  4. Alt ağınıza Microsoft.Sql türünde bir Sanal Hizmet uç noktası ekleyin.

Önemli

Bu betiği çalıştırmadan önce betiğin üst kısmındaki $-variables öğesine atanan değerleri düzenlemeniz gerekir.

Doğrudan PowerShell kaynak kodu

Onay istenirse evet yanıtı vermediğiniz sürece bu PowerShell betiği hiçbir şeyi güncelleştirmez. Betik, alt ağınıza Microsoft.Sql tür adını ekleyebilir. Ancak betik yalnızca alt ağınızda tür adı eksikse ekleme işlemini dener.

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