プライベートリンクサービスで安全な内部のapimにアクセスしてください


Azureプライベートリンクサービスは何ですか?


Azure Private Link service Azureプライベートリンクによって供給されるあなた自身のサービスへの参照です.Azure Standard Load Balancerの背後で実行されているサービスは、プライベートリンクへのアクセスを可能にすることができます.そのため、お客様のサービスに対する消費者は自分のVNETから個人的にアクセスすることができます.お客様は、VNET内のプライベートエンドポイントを作成し、このサービスにマップすることができます.

外部の非peed vnetからのプライベートリンクサービスで安全な内部API管理サービスにアクセスする


今日のチュートリアルでは、このサービスの興味深いユースケースを見ています.外部ソースを接続して外部の非ピアネットからのAPI管理サービス(内部VNETモード)を消費する方法について説明します.次の図に示すように、

注:私たちのプライベートエンドポイントを置くソースまたはエントリポイントは完全に異なる地域、テナントまたはサブスクリプションにあるネットワークにすることができます.
我々が始める前に、ちょうど我々がなぜこれをしたいかについて考えましょう?
APIM(内部VNETモード):API管理が内部のVNETモードで展開するとき、あなたはあなたがコントロールするアクセスのVNETの中でサービス終点を見ることができるだけです.攻撃表面積を減らすために、すべてのITエンドポイント(例えばゲートウェイ、APIMポータルと管理終点)でAPIMを構成することは内部のVNETの範囲内で保護されて、公共のインターネットからどんな潜在的脅威からでも直接アクセスすることができません.サービスは、我々のAPNETサービスをホストしている我々のVnetに接続性を持っているpeered vnetsからのみアクセスすることができます.
これは良いセキュリティの練習ですが、私たちが私たちのAPIを使用する必要がある消費者を持っている要件を持っている場合は、どのような場合は、おそらくIPアドレス空間に重複する別のVNetに位置し、ピアまたは私たちのAPNETサービスをホストする当社のVNETに接続することはできませんか?または、我々は完全に別の地域、テナントとサブスクリプションでVNETを持っている消費者がいる場合はどうですか?どのように我々はAPI管理サービスを消費できるようにすることができますし、すべての内部と安全を同時に維持しますか?
幸いにも、この問題声明の解決策があります、そして、それはAzureプライベートリンクサービスです.Azureプライベートリンクサービスでは、我々の内部のAPIMにIP/ポート推進を使用しているリレーとして機能する仮想マシンまたは仮想マシンスケールセットに接続される標準的なロードバランサを作成することができます.

何が必要ですか?


  • Azure仮想ネットワーク:我々は、我々の個人的なリンクサービスとAPIMのために2つのサブネットで新しいか既存のVNETを必要とします.

  • apim ( internal vnet mode ):このチュートリアルでは、internal APIM .

  • VMまたはVMMS :このチュートリアルでは、単一のWindows VMを作成し、内部のAPIMへのフォワーダとして設定します.(仮想マシンスケールセット( VMSS )を使うこともできます.

  • 標準ロードバランサ:プライベートリンクサービスで使用されるVM/VMSSの前に標準負荷バランサを使用します.

  • プライベートリンクサービス:私たちはプライベートリンクサービスを作成し、我々のロードバランサでそれをリンクします.

  • プライベートエンドポイント:私たちは、外部Vnetのプライベートエンドポイントを作成し、非ピアネットワークからの内部のAPIMに接続をテストします.
  • すべてを準備するために、私はaz PowerShellを使用しています.まず、実行してazureにログインします.
    Login-AzAccount
    
    次に、私たちはresource group , virtual network and APIM (internal VNET mode) 走ること
    ##./code/APIM-pre-reqs.ps1
    # Variables.
    $randomInt = Get-Random -Maximum 9999
    $resourceGroupName = "PrivateAPIM"
    $vnetName = "MainNet"
    $apimSubnetName = "apimSubnet"
    $plsSubnetName = "plsSubnet"
    $apimName = "apim$randomInt"
    $region = "uksouth"
    
    # Create a resource resourceGroupName
    New-AzResourceGroup -Name "$resourceGroupName" -Location "$region"
    
    # Create NSG and pls (private link service) subnet.
    $plsRule1 = New-AzNetworkSecurityRuleConfig `
        -Name "pls-in" `
        -Description "PLS inbound" `
        -Access "Allow" `
        -Protocol "Tcp" `
        -Direction "Inbound" `
        -Priority 100 `
        -SourceAddressPrefix "VirtualNetwork" `
        -SourcePortRange "*" `
        -DestinationAddressPrefix "VirtualNetwork" `
        -DestinationPortRange 443
    
    $plsNsg = New-AzNetworkSecurityGroup `
        -ResourceGroupName "$resourceGroupName" `
        -Location "$region" `
        -Name "NSG-PLS" `
        -SecurityRules $plsRule1
    
    $plsSubnet = New-AzVirtualNetworkSubnetConfig `
        -Name "$plsSubnetName" `
        -NetworkSecurityGroup $plsNsg `
        -AddressPrefix 10.0.1.0/24
    
    # Create NSG and APIM subnet subnet.
    $apimRule1 = New-AzNetworkSecurityRuleConfig `
        -Name "apim-in" `
        -Description "APIM inbound" `
        -Access "Allow" `
        -Protocol "Tcp" `
        -Direction "Inbound" `
        -Priority 100 `
        -SourceAddressPrefix "ApiManagement" `
        -SourcePortRange "*" `
        -DestinationAddressPrefix "VirtualNetwork" `
        -DestinationPortRange 3443
    
    $apimNsg = New-AzNetworkSecurityGroup `
        -ResourceGroupName "$resourceGroupName" `
        -Location "$region" `
        -Name "NSG-APIM" `
        -SecurityRules $apimRule1
    
    $apimSubnet = New-AzVirtualNetworkSubnetConfig `
        -Name "$apimSubnetName" `
        -NetworkSecurityGroup $apimNsg `
        -AddressPrefix 10.0.2.0/24
    
    # Create VNET
    Write-Output "Creating Virtual Network... Please Wait..."
    $vnet = New-AzVirtualNetwork `
        -Name "$vnetName" `
        -ResourceGroupName "$resourceGroupName" `
        -Location "$region" `
        -AddressPrefix "10.0.0.0/16" `
        -Subnet $plsSubnet,$apimSubnet
    
    #Get APIM subnet ID
    $plsSubnetData = $vnet.Subnets[0]
    $apimSubnetData = $vnet.Subnets[1]
    
    # Create an API Management service instance. (Developer SKU for this demo... SKUs: Basic, Consumption, Developer, Premium, Standard)
    Write-Output "Creating APIM service... Please Wait..."
    $apimVirtualNetwork = New-AzApiManagementVirtualNetwork -SubnetResourceId $apimSubnetData.Id
    $apimService = New-AzApiManagement `
        -ResourceGroupName "$resourceGroupName" `
        -Location "$region" `
        -Name "$apimName" `
        -Organization "pwd9000" `
        -AdminEmail "[email protected]" `
        -VirtualNetwork $apimVirtualNetwork `
        -VpnType "Internal" -Sku "Developer"
    
    注:このチュートリアルの新しいAPIMサービスを作成しているので、上記のPowerShellコードは10 - 20分の間に何かを取ることができます.
    私たちのapimが作成された後、APIMプライベートIPのノートを作ります.

    次に、私たちはVirtual machine PLSサブネットでは、フォワーダとして使用されます.
    ##./code/VM-forwarder.ps1
    $vmLocalAdmin = "pwd9000admin"
    $vmLocalAdminPassword = Read-Host -assecurestring "Please enter your password"
    $region = "uksouth"
    $resourceGroupName = "PrivateAPIM"
    $computerName = "VmPls01"
    $vmName = "VmPls01"
    $vmSize = "Standard_DS2_V2"
    $networkName = "MainNet"
    $nicName = "VmPls01-nic"
    $vNet = Get-AzVirtualNetwork -Name $NetworkName
    $plsSubnetId = ($vnet.Subnets | Where-Object {$_.name -eq "plsSubnet"}).id
    
    $NIC = New-AzNetworkInterface -Name $nicName -ResourceGroupName $resourceGroupName -Location $region -SubnetId $plsSubnetId -EnableIPForwarding
    $Credential = New-Object System.Management.Automation.PSCredential ($vmLocalAdmin, $vmLocalAdminPassword);
    $VirtualMachine = New-AzVMConfig -VMName $vmName -VMSize $vmSize
    $VirtualMachine = Set-AzVMOperatingSystem -VM $VirtualMachine -Windows -ComputerName $computerName -Credential $Credential -ProvisionVMAgent -EnableAutoUpdate
    $VirtualMachine = Add-AzVMNetworkInterface -VM $VirtualMachine -Id $NIC.Id
    $VirtualMachine = Set-AzVMSourceImage -VM $VirtualMachine -PublisherName 'MicrosoftWindowsServer' -Offer 'WindowsServer' -Skus '2019-Datacenter' -Version latest
    $VirtualMachine = Set-AzVMOSDisk -VM $VirtualMachine -StorageAccountType "Standard_LRS" -CreateOption FromImage -Windows | Set-AzVMBootDiagnostic -Disable
    
    New-AzVM -ResourceGroupName $resourceGroupName -Location $region -VM $VirtualMachine -Verbose
    
    注意: IPフォワーディングはVMのネットワークインターフェースで有効になっています.
    // code/VM-forwarder.ps1#L13-L13
    
    $NIC = New-AzNetworkInterface -Name $nicName -ResourceGroupName $resourceGroupName -Location $region -SubnetId $plsSubnetId -EnableIPForwarding
    
    VMが作成された後、いくつかのコマンドをVM上で実行する必要があります.最初に我々はVMレジストリでIPルータを有効にし、HTTPS(TCPポート443)のトラフィックを許容するためにファイアウォールルールを作成し、最後にnetsh .
    新しく作成されたVMに以下のPowerShellコマンドを実行します.
    ##./code/VM-forwarder-config.ps1
    #vars (APIM private IP after APIM created under $apimPrivateIP)
    $port = '443'
    $localaddress = (Get-NetIPConfiguration | Where-Object {$_.ipv4defaultgateway -ne $null}).IPv4Address.ipaddress
    $apimPrivateIP = '10.0.2.5'
    
    #Enable Port Forwarding on VM.
    #Enable IP forwarding on Azure for the VM's #network interface as well.
    Set-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters -Name IpEnableRouter -Value 1
    
    #Allow HTTPS(443) traffic inbound
    New-NetFirewallRule -DisplayName "HTTPS-443-Inbound" -Direction Inbound -Action Allow -Protocol TCP -LocalPort $port
    
    #Enable port 443 listener and forward
    netsh interface portproxy add v4tov4 listenport=$port listenaddress=$localaddress connectport=$port connectaddress=$apimPrivateIP
    
  • 確認IP Enable Router が有効になっている:
  • TCPポート443のためのインバウンドファイアウォール規則を確認します.
  • ポート443に新しいリスナーがあるか確認してください( netstat - an )

  • すべての設定が正しいと確認した後、VMを再起動し、標準の負荷バランサを設定するには次の手順に進みます.
    ##./code/Standard-Load-Balancer.ps1
    # Variables.
    $resourceGroupName = "PrivateAPIM"
    $vnetName = "MainNet"
    $plsSubnet = ($vnet.Subnets | Where-Object {$_.name -eq "plsSubnet"}).id
    $region = "uksouth"
    
    #Vnet object
    $vnet = Get-AzVirtualNetwork -Name $vnetName -ResourceGroupName $resourceGroupName
    
    #load balancer frontend configuration
    $feip = New-AzLoadBalancerFrontendIpConfig -Name 'plsFrontEnd' -PrivateIpAddress '10.0.1.5' -SubnetId $plsSubnet
    
    #backend address pool configuration
    $bepool = New-AzLoadBalancerBackendAddressPoolConfig -Name 'plsVMforwarderPool'
    
    #health probe
    $healthprobe = New-AzLoadBalancerProbeConfig -Name 'Check443' -Protocol 'Tcp' -Port '443' -IntervalInSeconds '360' -ProbeCount '5'
    
    # load balancer rule
    $rule = New-AzLoadBalancerRuleConfig -Name 'plsHTTPS' -Protocol 'Tcp' -FrontendPort '443' -BackendPort '443' -IdleTimeoutInMinutes '15' -FrontendIpConfiguration $feip -BackendAddressPool $bepool -EnableTcpReset
    
    ## Create the load balancer resource
    $loadbalancer = @{
        ResourceGroupName = $resourceGroupName
        Name = 'PrivateLinkServiceLB'
        Location = $region
        Sku = 'Standard'
        FrontendIpConfiguration = $feip
        BackendAddressPool = $bePool
        LoadBalancingRule = $rule
        Probe = $healthprobe
    }
    New-AzLoadBalancer @loadbalancer
    
    ロードバランサが作成された後に、私たちはVMをPLSVmForderderPoolと呼ばれているバックエンドプールに加えることができます.


    数分後に、我々の健康調査が定期的に我々の推進器VMでポート443をチェックするように働いているのを見ます.

    次に、私たちが作成したロードバランサを使用してプライベートリンクサービスを作成します.また、外部の非ピアネットで実行しているテストVMからプライベートエンドポイントを使用してAPIMに到達できることをテストします.
    Azure入口でPrivate Link と選択+ AddPrivate Link Services .

    基本ブレードの下で次のように追加します.
    名称

    リソースグループ
    私立
    名称
    京大理
    地域
    英国南部

    アウトバウンド設定ブレードの下で次のように追加します.
    名称

    ロードバランサ
    プライベートサービス
    フロントエンドIP
    plsfrontend ( 10.0.1.5 )
    ソースナット
    メインネット
    ソースNATサブネット
    plssubnet ( 10.0.1.0/24 )
    プロキシの有効化
    なし
    プライベートIPアドレス
    ダイナミック

    アクセスセキュリティブレードの下では、2つのサブスクリプションのリストを使用してサブスクリプションで制限されます.アクセスの種類の詳細についてはRole-based access control only , Restricted by subscription , Anyone with your alias , 参照LINK .

    必要に応じて任意のタグを追加し、プライベートリンクサービスを作成します.
    プライベートリンクサービスが作成されたので、別のサブスクリプションに移動します.そこで私はイーストエンド地域に存在する外部の非peed vnetにプライベートエンドポイントを作成してリンクします.別の領域に新しいvnetを作成することで、同じことを行うことができます.
    Azure入口でPrivate Link と選択+ AddPrivate endpoints .

    基本的なブレードの下で、サブスクリプションを選択し、外部のVNETが存在する領域を選択します(私の場合はイーストUSにあります).
    名称

    リソースグループ
    アピール
    名称
    京大理
    地域
    東米国

    リソースブレードの下で、PLSサービスに接続できますresource ID または次のいずれかを選択します.
    名称

    購読
    [サブスクリプションホスティング]
    リソース型
    マイクロソフト.ネットワーク/プライベートサービス
    リソース
    京大理

    設定ブレードの下で、外部の仮想ネットワークを選択します(私の場合は東アメリカでホストされ、私のvnetはExternal ):
    名称

    仮想ネットワーク
    [外部VNet名]
    サブネット
    [外部vnetサブネット]

    必要に応じて任意のタグを追加し、プライベートエンドポイントを作成します.
    そして、それは我々が今すぐに正常に東米国でホストされていない非公開外部Vnetから私たちのプライベートAPIMサービスにアクセスするために安全なエントリポイントを作成しました.私は私たちが作成したプライベートエンドポイントを介して私たちの接続性をテストすることができます私たち東米国外VネットでVMを実行している.私の場合、APIM - PEに割り当てられているプライベートエンドポイントIPは以下の通りです.192.168.0.6 .

    私の外部VNETでテストしているテストVMは以下のIPアドレスです.192.168.0.4 .

    私のapimに接続性をテストするために、私は私のapim終点を必要とします、そして、このテストのために、私はちょうどローカルホストファイルを使用している私のテストマシンの上で私の終点を設定します、しかし、私のapim終点をapim - PE(我々がつくった個人的な終点)にポイントしてください.

    我々の接続性が働いているかどうか見ましょう:

    あなたがこのポストを楽しんで、新しい何かを学んだことを願っています.また、このブログ記事で使用されているコードサンプルを見つけることができますGithub ページ.❤️

    著者


    閉じるこの動画はお気に入りから削除されています🐙 GitHub | 🐧 | 👾
    ・・・アクションボタン
    背景色:1 .重要
    色:千円!重要
    ボーダーカラー:くぼんだ0 cbb 58!重要


    マルセル.エルフォロー


    Cloud Solutions & DevOps Architect.