Private Link와 DNS의 대규모 통합

이 문서에서는 허브 및 스포크 네트워크 아키텍처의 Azure 사설 DNS 영역을 사용 하 여 PaaS 서비스용 Azure 개인 링크를 통합 하는 방법을 설명 합니다.

소개

많은 고객이 허브 및 스포크 네트워크 아키텍처를 사용 하 여 Azure에서 네트워크 인프라를 구축 합니다. 여기서는 다음과 같습니다.

  • 네트워킹 공유 서비스 (예: 네트워크 가상 어플라이언스, Express 경로/VPN 게이트웨이 또는 DNS 서버)는 허브 VNet (가상 네트워크)에 배포 됩니다.
  • 스포크 Vnet는 VNet 피어 링을 통해 이러한 공유 서비스를 사용 합니다.

허브 및 스포크 네트워크 아키텍처에서 응용 프로그램 소유자는 일반적으로 허브 vnet에 연결 된 VNet (스포크)을 포함 하는 Azure 구독과 함께 제공 됩니다. 이 아키텍처에서는 가상 컴퓨터를 배포 하 고 Express 경로 또는 VPN을 통해 다른 Vnet 또는 온-프레미스 네트워크에 개인 연결을 설정할 수 있습니다.

인터넷 아웃 바운드 연결은 Azure 방화벽과 같은 NVA (중앙 네트워크 가상 어플라이언스)를 통해 제공 됩니다.

많은 응용 프로그램 팀은 Azure IaaS 및 PaaS 리소스의 조합을 사용 하 여 솔루션을 빌드합니다. 일부 Azure PaaS 서비스 (예: SQL Managed Instance)는 고객 Vnet 배포할 수 있습니다. 따라서 트래픽은 Azure 네트워크 내에서 비공개 상태로 유지 되 고 온-프레미스에서 완전히 라우팅할 수 있습니다.

그러나 일부 Azure PaaS 서비스 (예: Azure Storage 또는 Azure Cosmos DB)는 고객의 Vnet 배포할 수 없으며 공용 끝점을 통해 액세스할 수 있습니다. 일부 경우에는 회사 트래픽이 공용 끝점을 통해 배포 또는 회사 리소스 (예: SQL 데이터베이스)에 대 한 액세스를 허용 하지 않을 수 있기 때문에이로 인해 고객의 보안 정책이 충돌할 수 있습니다.

Azure 개인 링크 를 사용 하면 개인 끝점을 통해 azure 서비스 목록 에 액세스할 수 있지만 해당 개인 끝점 레코드가 해당 개인 DNS 영역에 등록 되어야 합니다.

이 문서에서는 응용 프로그램 팀이 개인 끝점을 통해서만 액세스할 수 있는 구독에 Azure PaaS 서비스를 배포 하는 방법을 설명 합니다.

이 문서에서는 응용 프로그램 팀이 Azure 사설 DNS를 통해 자동으로 개인 DNS 영역과 통합 되도록 하는 방법에 대해서도 설명 합니다. DNS에서 레코드를 수동으로 만들거나 삭제할 필요가 없습니다.

사설 DNS 영역은 일반적으로 허브 VNet을 배포 하는 동일한 Azure 구독에 중앙에서 호스팅됩니다. 이 중앙 호스팅 방법은 크로스-프레미스 dns 이름 확인 및 Active Directory와 같은 중앙 dns 확인에 대 한 기타 요구 사항에 따라 결정 됩니다. 대부분의 경우에는 네트워킹/id 관리자만 이러한 영역에서 DNS 레코드를 관리할 수 있는 권한이 있습니다.

응용 프로그램 팀에는 자체 구독에서 Azure 리소스를 만들 수 있는 권한이 있습니다. 개인 DNS 영역에서 DNS 레코드를 관리 하는 것을 포함 하는 중앙 네트워킹 연결 구독에는 사용 권한이 없습니다. 이 액세스 제한은 개인 끝점을 사용 하 여 Azure PaaS 서비스를 배포할 때 필요한 DNS 레코드를 만들 수 없음을 의미 합니다.

다음 다이어그램에서는 중앙 DNS를 확인 하 고 개인 링크 리소스에 대 한 이름 확인을 Azure 사설 DNS를 통해 수행 하는 엔터프라이즈 환경에 대 한 일반적인 개략적인 아키텍처를 보여 줍니다.

이미지-1

위의 다이어그램에서이를 강조 하는 것이 중요 합니다.

  • 온-프레미스 DNS 서버에는 허브 VNet에서 호스트 되는 DNS 전달자 (및)를 가리키는 각 개인 끝점 공용 dns 영역 전달자 에 대해 구성 된 조건부 전달 자가 있습니다 10.100.2.4 10.100.2.5 .
  • 모든 Azure Vnet에는 10.100.2.4 10.100.2.5 기본 및 보조 dns 서버로 구성 된 DNS 전달자 (및)가 있습니다.

응용 프로그램 팀에서 구독에 필요한 Azure PaaS 리소스를 자유롭게 만들 수 있도록 하기 위해 다음 두 가지 조건을 충족 해야 합니다.

  • 중앙 네트워킹 및/또는 중앙 플랫폼 팀은 응용 프로그램 팀이 개인 끝점을 통해서만 Azure PaaS 서비스를 배포 하 고 액세스할 수 있도록 해야 합니다.
  • 중앙 네트워킹 및/또는 중앙 플랫폼 팀은 개인 끝점이 생성 될 때마다 생성 된 서비스와 일치 하는 중앙 집중식 개인 DNS 영역에 해당 레코드가 자동으로 생성 되도록 해야 합니다.
    • DNS 레코드는 개인 끝점의 수명 주기를 따르고 개인 끝점을 삭제 하면 자동으로 DNS 레코드를 제거 해야 합니다.

다음 섹션에서는 응용 프로그램 팀이 Azure Policy를 사용 하 여 이러한 조건을 사용 하도록 설정 하는 방법을 설명 합니다. 응용 프로그램 팀이 아래 예제에서 배포 해야 하는 Azure 서비스로 Azure Storage를 사용 하지만 개인 링크를 지 원하는 대부분의 azure 서비스에 동일한 원칙이 적용 될 수 있습니다.

플랫폼 팀에 필요한 구성

프라이빗 DNS 영역 만들기

설명서당 지원 되는 개인 링크 서비스에 대 한 중앙 연결 구독에서 개인 DNS 영역을 만듭니다.

이 경우, 예를 들어 blob이 있는 저장소 계정을 사용 하는 것 처럼 privatelink.blob.core.windows.net 연결 구독에서 개인 DNS 영역을 만드는 것으로 변환 합니다.

이미지-2

정책 정의

개인 DNS 영역 외에도 사용자 지정 Azure Policy 정의 집합을 만들어 개인 끝점 사용을 적용 하 고 만든 dns 영역에서 dns 레코드 만들기를 자동화 해야 합니다.

  1. PaaS 서비스 정책에 대 한 공용 끝점 거부

    이 정책은 사용자가 공용 끝점을 사용 하 여 Azure PaaS 서비스를 만들 수 없도록 하 고 리소스 생성 시 개인 끝점을 선택 하지 않으면 오류 메시지를 제공 합니다.

    이미지-3

    이미지-4

    이미지-5

    정확한 정책 규칙은 PaaS 서비스 마다 다를 수 있습니다. Azure Storage 계정의 경우 공용 네트워크의 요청이 허용 되는지 여부를 정의 하는 defaultAction 속성을 살펴봅니다. 이 경우 defaultAction 속성이가 아닌 경우에는 Microsoft 저장소/storageaccounts 리소스 유형 만들기를 거부 하는 조건을 Deny 설정 합니다. 이 정책 정의는 아래에 나열 되어 있습니다.

    {
      "mode": "All",
      "policyRule": {
        "if": {
          "allOf": [
            {
              "field": "type",
              "equals": "Microsoft.Storage/storageAccounts"
            },
            {
              "field": "Microsoft.Storage/storageAccounts/networkAcls.defaultAction",
              "notequals": "Deny"
            }
          ]
        },
        "then": {
          "effect": "Deny"
        }
      }
    }
    
  2. 접두사 정책을 사용 하 여 개인 DNS 영역 만들기를 거부 합니다. privatelink

    플랫폼 팀에서 관리 하는 구독에서 호스트 되는 조건부 전달자와 개인 DNS 영역을 사용 하는 중앙 집중식 DNS 아키텍처를 사용 하기 때문에 응용 프로그램 팀 소유자가 자신의 개인 링크 개인 DNS 영역을 만들고 서비스를 구독에 연결 하는 것을 방지 해야 합니다.

    이를 위해 응용 프로그램 팀에서 전용 끝점을 만들 때 Azure Portal를 사용할 때에 대 한 옵션을 Integrate with private DNS zone 로 설정 해야 합니다 No .

    이미지-6

    Yes를 선택 하면 Azure Policy 개인 끝점을 만들 수 없게 됩니다. 이 정책 정의에서는 영역에 접두사가 있는 경우 Microsoft. Network/privateDnsZones 리소스 유형 만들기를 거부 합니다. privatelink 이 정책 정의는 아래에 설명 되어 있습니다.

    {
      "description": "This policy restricts creation of private DNS zones with the `privatelink` prefix",
      "displayName": "Deny-PrivateDNSZone-PrivateLink",
      "mode": "All",
      "parameters": null,
      "policyRule": {
        "if": {
          "allOf": [
            {
              "field": "type",
              "equals": "Microsoft.Network/privateDnsZones"
            },
            {
              "field": "name",
              "like": "privatelink*"
            }
          ]
        },
        "then": {
          "effect": "Deny"
        }
      }
    }
    
  3. 중앙 개인 DNS 영역에 필요한 DNS 레코드를 자동으로 만드는 Deployifnotexists 정책

    이 정책은 전용 끝점 리소스가 서비스별로 생성 된 경우에 트리거됩니다 groupId . 는 groupId 이 개인 끝점이 연결 해야 하는 원격 리소스 (서비스)에서 가져온 그룹의 ID입니다. 그런 다음 개인 끝점 privateDNSZoneGroup 을 개인 DNS 영역에 연결 하는 데 사용 되는 개인 끝점 내에서의 배포를 트리거합니다. 예를 들어 groupId for Azure Storage blob는 blob ( groupId 기타 Azure 서비스에 대 한 자세한 내용은 문서의 subresource 열 아래에 있음)를 참조 하세요. 정책이 groupId 만들어진 개인 끝점에서 정책을 찾으면 개인 끝점 내에를 배포 하 privateDNSZoneGroup 고 매개 변수로 지정 된 개인 DNS 영역 리소스 ID에 연결 됩니다. 이 예제에서 개인 DNS 영역 리소스 ID는 다음과 같습니다.

    /subscriptions/<subscription-id>/resourceGroups/<resourceGroupName>/providers/Microsoft.Network/privateDnsZones/privatelink.blob.core.windows.net

    이 정책 정의는 아래에 나열 되어 있습니다.

    {
      "mode": "Indexed",
      "policyRule": {
        "if": {
          "allOf": [
            {
              "field": "type",
              "equals": "Microsoft.Network/privateEndpoints"
            },
            {
              "count": {
                "field": "Microsoft.Network/privateEndpoints/privateLinkServiceConnections[*].groupIds[*]",
                "where": {
                  "field": "Microsoft.Network/privateEndpoints/privateLinkServiceConnections[*].groupIds[*]",
                  "equals": "blob"
                }
              },
              "greaterOrEquals": 1
            }
          ]
        },
        "then": {
          "effect": "deployIfNotExists",
          "details": {
            "type": "Microsoft.Network/privateEndpoints/privateDnsZoneGroups",
            "roleDefinitionIds": [
              "/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c"
            ],
            "existenceCondition": {
              "allOf": [
                {
                  "field": "Microsoft.Network/privateEndpoints/privateDnsZoneGroups/privateDnsZoneConfigs[*].privateDnsZoneId",
                  "equals": "[parameters('privateDnsZoneId')]"
                }
              ]
            },
            "deployment": {
              "properties": {
                "mode": "incremental",
                "template": {
                  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
                  "contentVersion": "1.0.0.0",
                  "parameters": {
                    "privateDnsZoneId": {
                      "type": "string"
                    },
                    "privateEndpointName": {
                      "type": "string"
                    },
                    "location": {
                      "type": "string"
                    }
                  },
                  "resources": [
                    {
                      "name": "[concat(parameters('privateEndpointName'), '/deployedByPolicy')]",
                      "type": "Microsoft.Network/privateEndpoints/privateDnsZoneGroups",
                      "apiVersion": "2020-03-01",
                      "location": "[parameters('location')]",
                      "properties": {
                        "privateDnsZoneConfigs": [
                          {
                            "name": "storageBlob-privateDnsZone",
                            "properties": {
                              "privateDnsZoneId": "[parameters('privateDnsZoneId')]"
                            }
                          }
                        ]
                      }
                    }
                  ]
                },
                "parameters": {
                  "privateDnsZoneId": {
                    "value": "[parameters('privateDnsZoneId')]"
                  },
                  "privateEndpointName": {
                    "value": "[field('name')]"
                  },
                  "location": {
                    "value": "[field('location')]"
                  }
                }
              }
            }
          }
        }
      },
      "parameters": {
        "privateDnsZoneId": {
          "type": "String",
          "metadata": {
            "displayName": "privateDnsZoneId",
            "strongType": "Microsoft.Network/privateDnsZones"
          }
        }
      }
    }
    

정책 할당

정책 정의가 배포 되 면 관리 그룹 계층 구조의 원하는 범위에서 정책을 할당 합니다. 정책 할당이 응용 프로그램 팀에서 전용 끝점 액세스로 PaaS 서비스를 배포 하는 데 사용할 Azure 구독을 대상으로 하는지 확인 합니다.

중요

개인 dns 영역이 개인 DNS 영역에서 개인 끝점 DNS 레코드를 만들고 관리 해야 하는 DeployIfNotExists 정책 할당을 통해 만들어진 관리 id 에 호스트 되는 구독/리소스 그룹에 사설 DNS 영역 참가자 역할 역할을 할당 해야 합니다. 개인 끝점은 응용 프로그램 소유자 Azure 구독에 있고, 개인 DNS 영역은 중앙 연결 구독과 같은 다른 구독에 있는 경우에 해당 합니다.

플랫폼 팀에서이 구성을 완료 하면 응용 프로그램 팀의 Azure 구독이 개인 끝점 액세스를 독점적으로 사용 하 여 Azure PaaS 서비스를 만들 수 있도록 준비 하 고 개인 끝점에 대 한 DNS 레코드가 해당 개인 DNS 영역에서 자동으로 등록 되 고 개인 끝점을 삭제 하면 제거 됩니다.

응용 프로그램 소유자 환경

플랫폼 팀이 이전 섹션에서 설명한 플랫폼 인프라 구성 요소 (개인 DNS 영역 및 정책)를 배포한 후 응용 프로그램 소유자가 azure 구독에 Azure PaaS 서비스를 배포 하려고 하면 응용 프로그램 소유자가 Azure Portal를 통해 또는 PowerShell 또는 CLI와 같은 다른 클라이언트를 통해 작업을 수행 하는 경우 동일 하 게 작동 하는 다음과 같은 환경을 제공 합니다. Azure 정책에 의해 관리 되는 구독입니다.

  1. Azure Portal를 통해 저장소 계정을 만듭니다. 기본 탭에서 이름 및 원하는 설정을 입력 하 고 다음 을 클릭 합니다.

    이미지-7

  2. 네트워킹 섹션에서 개인 끝점 이 선택 되어 있는지 확인 합니다. 개인 끝점이 아닌 다른 옵션 Azure Portal을 선택 하면 공용 끝점을 사용 하는 경우 정책에서이 서비스를 만들 수 없으므로 배포 마법사의 검토 + 만들기 섹션에서 저장소 계정 만들기를 허용 하지 않습니다.

    이미지-8

  3. 이 화면에서 개인 끝점을 만들거나 저장소 계정을 만든 후에이 작업을 수행할 수 있습니다. 이 연습에서는 저장소 계정을 만든 후 개인 끝점을 만듭니다. 검토 + 만들기 를 클릭 하 고 저장소 계정 만들기를 완료 합니다.

  4. 저장소 계정을 만든 후에는 Azure Portal를 통해 개인 끝점을 만듭니다.

    이미지-9

  5. 리소스 섹션에서 이전 단계에서 만든 저장소 계정을 찾고, 대상 하위 리소스에 대해 Blob 을 선택 하 고 다음 을 선택 합니다.

    이미지-10

  6. 구성 섹션에서 VNet 및 서브넷을 선택한 후 개인 DNS 영역과 통합아니요 로 설정 되어 있는지 확인 합니다. 그렇지 않으면 Azure Portal는 접두사를 사용 하 여 개인 DNS 영역 만들기를 허용 하지 않으므로 개인 끝점을 만드는 것 Azure Policy을 방지 합니다 privatelink .

    이미지-11

  7. 검토 + 만들기 를 선택 하 고 만들기 를 선택 하 여 개인 끝점을 배포 합니다.

  8. 몇 분 후에 DeployIfNotExists 정책이 트리거되고 이후 dnsZoneGroup 배포에서 중앙에서 관리 되는 dns 영역에 개인 끝점에 필요한 DNS 레코드를 추가 하 게 됩니다.

  9. 개인 끝점을 만든 후 해당 끝점을 선택 하 고 FQDN 및 개인 IP를 검토 합니다.

    이미지-12

  10. 개인 끝점이 생성 된 리소스 그룹의 활동 로그를 확인 하거나 개인 끝점 자체의 활동 로그를 확인할 수 있습니다. 몇 분 후에 DeployIfNotExist 정책 작업이 실행 되어 개인 끝점에서 DNS 영역 그룹을 구성 하는 것을 알 수 있습니다.

    이미지-13

  11. 중앙 네트워킹 팀이 privatelink.blob.core.windows.net 개인 dns 영역으로 이동 하면 만든 개인 끝점에 대 한 DNS 레코드가 생성 되었는지 확인 하 고 이름 및 IP 주소가 모두 개인 끝점 내의 값과 일치 하는지 확인 합니다.

    이미지-14

이 시점에서 응용 프로그램 팀은 허브 및 스포크 네트워크 환경 및 온-프레미스의 모든 VNet에서 개인 끝점을 통해 저장소 계정을 사용할 수 있습니다. DNS 레코드는 개인 DNS 영역에 자동으로 기록 됩니다.

응용 프로그램 소유자가 개인 끝점을 삭제 하는 경우 개인 DNS 영역에 있는 해당 레코드는 자동으로 제거 됩니다.