전용 링크 서비스를 사용하여 내부 APIM에 안전하게 액세스

Azure 전용 링크 서비스란?


Azure Private Link service은 Azure Private Link에서 지원하는 자체 서비스입니다.Azure 표준 부하 균형기 뒤에서 실행되는 서비스는 서비스 사용자가 자신의 VNET에서 접근할 수 있도록 전용 링크 접근을 사용할 수 있습니다.고객은 VNet 내에 개인 노드를 만들어서 이 서비스에 비추도록 할 수 있습니다.

외부 비등가 VNET에서 전용 링크 서비스를 사용하여 내부 API 관리 서비스에 안전하게 액세스


오늘의 강좌에서 우리는 이 서비스의 흥미로운 용례를 연구할 것이다. 즉, 외부 원본을 어떻게 연결하여 외부 비대등 VNET의 API 관리 서비스 (내부 VNET 모델) 를 사용하는지.다음 그림은 다음과 같습니다.

주의: 저희는 사유 노드의 원본이나 입구점을 완전히 다른 구역, 임대인 또는 구독 네트워크에 놓을 것입니다.
우리가 시작하기 전에 왜 이렇게 해야 하는지 생각해 봅시다.
APIM(내부 VNET 모드): API가 내부 VNET 모드에서 배치를 관리할 때 액세스를 제어하는 VNET 내의 서비스 노드만 볼 수 있습니다.공격 면적을 줄이기 위해 APIM을 모든 노드(예를 들어 게이트웨이, APIM 포털과 관리 노드)로 설정하면 내부 VNET에서 보호되고 공공 인터넷의 잠재적인 위협으로부터 직접 접근할 수 없다.APIM 서비스를 호스팅하는 VNET에 연결된 피어 VNET에서만 이 서비스에 액세스할 수 있습니다.
이것은 좋은 안전 실천이다. 그러나 만약에 한 소비자가 우리의 API를 사용해야 하는데 IP 주소 공간이 겹칠 수 있는 다른 VNET에 위치하고 우리의 APIM 서비스를 탑재하는 VNET를 엿보거나 연결할 수 없다면 어떻게 해야 합니까?또는 만약에 우리가 소비자가 완전히 독립된 구역(세입자와 구독)에 VNET를 가지고 있다면 어떻게 해야 합니까?우리는 어떻게 API 관리 서비스를 사용할 수 있게 하고 모든 내용의 내부성과 안전성을 유지합니까?
다행히도, 이 문제 진술에는 해결 방안이 하나 있는데, 그것이 바로 Azure 전용 링크 서비스이다.Azure Private Link Service를 통해 우리는 표준 부하 균형기를 만들 수 있습니다. 이 부하 균형기는 가상 머신이나 가상 머신 규모 집합에 연결되고 이 가상 머신이나 가상 머신 규모 집합은 중계를 충당하며 IP/포트를 사용하여 내부 APIM으로 전송됩니다. Private Link Service 전치 부하 균형기를 사용하고 외부 네트워크에 개인 노드를 만들어서 진입점을 내부 APIM에 연결할 수 있습니다.

우리 뭐가 필요해?


  • Azure 가상 네트워크: 저희의 전용 링크 서비스와 APIM에 사용할 새로운 VNET 또는 기존의 VNET가 필요합니다.

  • APIM(내부 VNET 모드): 이 자습서의 경우 internal APIM을 만듭니다.

  • VM 또는 VMMS: 이 강좌에서 윈도우즈 VM을 만들고 이를 내부 APIM 트랜시버로 구성합니다.(VMS(가상 시스템 스케일링 세트)도 사용할 수 있습니다.

  • 표준 로드 밸런서: 전용 링크 서비스에서 사용할 표준 로드 밸런서를 사용하여 VM/VM 앞에 배치합니다.

  • 우리는 전용 링크 서비스를 만들 것이다.

  • 개인 노드: 그리고 외부 VNET에 개인 노드를 만들고 비대등 네트워크에서 내부 APIM으로의 연결을 테스트할 것입니다.
  • 모든 것을 준비하기 위해서, 나는 AZ 파워셸을 사용할 것이다.먼저 다음 명령을 실행하여 Azure에 로그인합니다.
    Login-AzAccount
    
    다음 명령을 실행하여 resource group, virtual networkAPIM (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 서비스를 만들고 있기 때문에, 위의 파워셸 코드는 10-20분이 걸릴 수 있습니다.
    APIM을 만든 후에는 VM 트랜시버를 구성하는 데 사용할 APIM 전용 IP를 기록합니다.

    다음으로pls 서브넷에 Virtual machine을 만들 것입니다. 이 서브넷은 전송기로 사용할 것입니다.
    ##./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 전송이 설정되어 있습니다.
    // code/VM-forwarder.ps1#L13-L13
    
    $NIC = New-AzNetworkInterface -Name $nicName -ResourceGroupName $resourceGroupName -Location $region -SubnetId $plsSubnetId -EnableIPForwarding
    
    가상 머신을 만든 후에는 일부 트래픽이 전달되고 APIM으로 전달될 수 있도록 가상 머신에서 명령을 실행해야 합니다.먼저 VM 레지스트리에서 IP 라우터를 활성화하고 https(TCP 포트 443)의 인바운드 트래픽을 허용하는 방화벽 규칙을 만들고, 마지막으로 netsh을 사용하여 APIM 전용 IP 주소로 전송을 활성화합니다.
    새로 만든 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을 백엔드 풀에 추가할 수 있는데 이풀을plsVMforwarderPool이라고 부른다.


    몇 분 후에 우리는 우리의 건강 탐지기도 작동하는 것을 보게 될 것이다. 이것은 정기적으로 송신기 VM의 443 포트를 검사할 것이다.

    다음은 우리가 만든 부하 균형기를 사용하여 우리의 전용 링크 서비스를 만들고 원격 비대등 VNET에 전용 단점을 만들 것입니다.또한 외부 비등가 VNET에서 실행되는 테스트 VM에서 전용 엔드포인트를 사용하여 APIM에 액세스할 수 있는지도 테스트합니다.
    Azure 포털에서 Private Link으로 이동하고 + Add에서 Private Link Services을 선택합니다.

    기본 블레이드에 다음을 추가합니다.
    성함
    가치관
    자원 그룹
    개인 농장
    성함
    APIM-PLS
    지역.
    영국 남부

    아웃바운드 설정 블레이드에 다음을 추가합니다.
    성함
    가치관
    로드 이퀄라이저
    PrivateLinkServiceLB
    프런트엔드 IP
    plsFrontEnd(10.0.1.5)
    소스 NAT VNET
    메인 네트
    소스 NAT 서브넷
    plsSubnet(10.0.1.0/24)
    TCP 프록시 V2 설정
    아니오.
    전용 IP 주소
    다이내믹

    액세스 보안 블레이드에서 구독이 제한된 두 개의 구독 목록을 사용할 것입니다.다양한 액세스 유형에 대한 자세한 내용은 Role-based access control only, Restricted by subscription, Anyone with your alias입니다. 이 LINK을 참조하십시오.

    필요한 경우 태그를 추가한 다음 임시 링크 서비스를 만듭니다.
    현재 저희 개인 링크 서비스가 만들어졌습니다. 제가 따로 만든 구독으로 이동할 것입니다.그곳에서, 나는 미국 동부 지역에 위치한 외부 비대등 VNET에 개인 노드를 만들고 연결할 것이다.다른 영역에 새 VNET를 생성하여 모니터링하지 않도록 함으로써 동일한 목적을 달성할 수 있습니다.
    Azure 포털에서 Private Link으로 이동하고 + Add에서 Private endpoints을 선택합니다.

    기본 블레이드에서 구독 및 외부 VNET가 있는 지역을 선택합니다(예: 미국 동부 지역).
    성함
    가치관
    자원 그룹
    아핌
    성함
    APIM-PE
    지역.
    미국 동부

    리소스 블레이드에서 resource ID의 PLS 서비스에 연결하거나 다음을 선택할 수 있습니다.
    성함
    가치관
    가입
    [관리되는 PLS 구독]
    자원 유형
    마이크로소프트.네트워크/개인 통신 서비스
    리소스
    APIM-PLS

    블레이드 구성에서 외부 가상 네트워크를 선택합니다(예: 미국 동부에 위치한 내 VNET 이름은 External).
    성함
    가치관
    가상 네트워크
    [외부 VNET 이름]
    서브넷
    [외부 VNET 서브넷]

    필요하면 표시를 추가하고 개인 노드를 만듭니다.
    이제 EAST에서 비ApeVNM까지의 비안전 입구를 성공적으로 만들었습니다.내 EAST US 외부 VNET에서 VM이 실행되고 있으며 방금 만든 전용 엔드포인트를 통해 연결을 테스트할 수 있습니다.내 예에서 APIM-PE에 분배된 개인 노드 IP는 192.168.0.6이다.

    외부 VNET에서 실행되는 테스트 VM의 IP는 192.168.0.4입니다.

    나의 APIM과의 연결을 테스트하기 위해서 나는 나의 APIM 단점이 필요하다. 이 테스트에 대해 나는 로컬 호스트 파일을 사용하여 나의 테스트 기기에 나의 단점을 설정하지만, 나의 APIM 단점은 APIM-PE (우리가 만든 전용 단점) 를 가리킨다.

    연결이 올바른지 확인합니다.

    나는 네가 이 게시물을 좋아하고 새로운 것을 배웠으면 한다.너도 나의 Github 페이지에서 이 블로그에서 사용한 코드 예시를 찾을 수 있다.❤️

    작자


    예를 들어 공유하고 나와 함께 가자.🐙 GitHub | 🐧 | 👾
    .ltag__user__id__620034.작업 따르기 버튼
    배경색: #0cb58!중요
    색상: #000000!중요
    테두리 색상: #0cb58!중요
    }

    마르셀.따르다


    Cloud Solutions & DevOps Architect.

    좋은 웹페이지 즐겨찾기