연습 - 서비스 엔드포인트를 사용하여 Azure Storage에 대한 액세스 제한

완료됨

솔루션 설계자는 중요한 엔지니어링 다이어그램 파일을 Azure Storage로 이동하려고 합니다. 이 파일은 회사 네트워크 내부의 컴퓨터에서만 액세스할 수 있어야 합니다. 스토리지 계정에 대한 연결을 보호하기 위해 Azure Storage에 대한 가상 네트워크 서비스 엔드포인트를 만들려고 합니다.

이 단원에서는 서비스 엔드포인트를 만들고, 네트워크 규칙을 사용하여 Azure Storage에 대한 액세스를 제한합니다. Azure Storage에 대한 가상 네트워크 서비스 엔드포인트를 Databases 서브넷에 만듭니다. 그런 다음, DataServer VM에서 Azure Storage에 액세스할 수 있는지 확인합니다. 마지막으로, 다른 서브넷에 있는 AppServer VM에서 스토리지에 액세스할 수 없는지 확인합니다.

Diagram of exercise scenario service endpoint and rules.

네트워크 보안 그룹에 규칙 추가

여기서는 Azure Storage와의 통신이 서비스 엔드포인트를 통과하는지 확인합니다. Storage 서비스에 대한 액세스를 허용하지만 다른 모든 인터넷 트래픽을 거부하는 아웃바운드 규칙을 추가합니다.

  1. Storage에 대한 액세스를 허용하는 아웃바운드 규칙을 만들려면 Cloud Shell에서 다음 명령을 실행합니다.

    az network nsg rule create \
        --resource-group $rg \
        --nsg-name ERP-SERVERS-NSG \
        --name Allow_Storage \
        --priority 190 \
        --direction Outbound \
        --source-address-prefixes "VirtualNetwork" \
        --source-port-ranges '*' \
        --destination-address-prefixes "Storage" \
        --destination-port-ranges '*' \
        --access Allow \
        --protocol '*' \
        --description "Allow access to Azure Storage"
    
  2. 모든 인터넷 액세스를 거부하는 아웃바운드 규칙을 만들려면 Cloud Shell에서 다음 명령을 실행합니다.

    az network nsg rule create \
        --resource-group $rg \
        --nsg-name ERP-SERVERS-NSG \
        --name Deny_Internet \
        --priority 200 \
        --direction Outbound \
        --source-address-prefixes "VirtualNetwork" \
        --source-port-ranges '*' \
        --destination-address-prefixes "Internet" \
        --destination-port-ranges '*' \
        --access Deny \
        --protocol '*' \
        --description "Deny access to Internet."
    

이제 ERP-SERVERS-NSG에는 다음 규칙이 있습니다.

규칙 이름 방향 우선 순위 용도
AllowSSHRule 인바운드 100 인바운드 SSH 허용
httpRule 인바운드 150 80에서 DataServer에서 AppServer로의 트래픽 거부
Allow_Storage 아웃바운드 190 Azure Storage에 대한 액세스 허용
Deny_Internet 아웃바운드 200 VNet에서 인터넷으로의 액세스 거부

이 시점에서 AppServerDataServer는 모두 Azure Storage 서비스에 액세스할 수 있습니다.

스토리지 계정 및 파일 공유 구성

이 단계에서는 새 스토리지 계정을 만든 다음, Azure 파일 공유를 이 계정에 추가합니다. 이 파일 공유는 엔지니어링 다이어그램을 저장하는 위치입니다.

  1. 엔지니어링 문서에 대한 스토리지 계정을 만들려면 Cloud Shell에서 다음 명령을 실행합니다.

    STORAGEACCT=$(az storage account create \
                    --resource-group $rg \
                    --name engineeringdocs$RANDOM \
                    --sku Standard_LRS \
                    --query "name" | tr -d '"')
    
  2. 스토리지 계정의 기본 키를 변수에 저장하려면 Cloud Shell에서 다음 명령을 실행합니다.

    STORAGEKEY=$(az storage account keys list \
                    --resource-group $rg \
                    --account-name $STORAGEACCT \
                    --query "[0].value" | tr -d '"')
    
  3. erp-data-share라는 Azure 파일 공유를 만들려면 Cloud Shell에서 다음 명령을 실행합니다.

    az storage share create \
        --account-name $STORAGEACCT \
        --account-key $STORAGEKEY \
        --name "erp-data-share"
    

서비스 엔드포인트 사용

이제 스토리지 엔드포인트를 데이터베이스 서브넷에 할당하여 데이터베이스 서버에서만 액세스할 수 있도록 스토리지 계정을 구성해야 합니다. 그런 다음, 보안 규칙을 스토리지 계정에 추가해야 합니다.

  1. Microsoft.Storage 엔드포인트를 서브넷에 할당하려면 Cloud Shell에서 다음 명령을 실행합니다.

    az network vnet subnet update \
        --vnet-name ERP-servers \
        --resource-group $rg \
        --name Databases \
        --service-endpoints Microsoft.Storage
    
  2. 기본 작업을 Deny로 변경하여 모든 액세스를 거부하려면 Cloud Shell에서 다음 명령을 실행합니다. 네트워크 액세스가 거부되면 모든 네트워크에서 스토리지 계정에 액세스할 수 없습니다.

    az storage account update \
        --resource-group $rg \
        --name $STORAGEACCT \
        --default-action Deny
    
  3. 스토리지 계정에 대한 액세스를 제한하려면 Cloud Shell에서 다음 명령을 실행합니다. 기본적으로 스토리지 계정은 모든 트래픽을 허용하도록 열려 있습니다. Databases 서브넷의 트래픽만 스토리지에 액세스할 수 있도록 하려고 합니다.

    az storage account network-rule add \
        --resource-group $rg \
        --account-name $STORAGEACCT \
        --vnet-name ERP-servers \
        --subnet Databases
    

스토리지 리소스에 대한 액세스 테스트

이 단계에서는 두 서버에 모두 연결하고, DataServer만 스토리지 계정의 Azure 파일 공유에 액세스할 수 있는지 확인합니다.

  1. AppServerDataServer의 공용 IP 주소를 변수에 저장하려면 Cloud Shell에서 다음 명령을 실행합니다.

    APPSERVERIP="$(az vm list-ip-addresses \
                        --resource-group $rg \
                        --name AppServer \
                        --query "[].virtualMachine.network.publicIpAddresses[*].ipAddress" \
                        --output tsv)"
    
    DATASERVERIP="$(az vm list-ip-addresses \
                        --resource-group $rg \
                        --name DataServer \
                        --query "[].virtualMachine.network.publicIpAddresses[*].ipAddress" \
                        --output tsv)"
    
  2. AppServer VM에 연결하고, Azure 파일 공유 탑재를 시도하려면 Cloud Shell에서 다음 명령을 실행합니다.

    ssh -t azureuser@$APPSERVERIP \
        "mkdir azureshare; \
        sudo mount -t cifs //$STORAGEACCT.file.core.windows.net/erp-data-share azureshare \
        -o vers=3.0,username=$STORAGEACCT,password=$STORAGEKEY,dir_mode=0777,file_mode=0777,sec=ntlmssp; findmnt \
        -t cifs; exit; bash"
    
  3. VM을 만들 때 사용한 암호를 입력합니다.

  4. 응답에 mount error 메시지가 포함되어 있습니다. 스토리지 계정용 서비스 엔드포인트가 애플리케이션 서브넷에 없으므로, 이 연결이 허용되지 않습니다.

  5. DataServer VM에 연결하고, Azure 파일 공유 탑재를 시도하려면 Cloud Shell에서 다음 명령을 실행합니다.

    ssh -t azureuser@$DATASERVERIP \
        "mkdir azureshare; \
        sudo mount -t cifs //$STORAGEACCT.file.core.windows.net/erp-data-share azureshare \
        -o vers=3.0,username=$STORAGEACCT,password=$STORAGEKEY,dir_mode=0777,file_mode=0777,sec=ntlmssp;findmnt \
        -t cifs; exit; bash"
    
  6. VM을 만들 때 사용한 암호를 입력합니다.

  7. 탑재가 성공하며 응답에 탑재 지점에 대한 세부 정보가 포함됩니다. 스토리지 계정에 대한 서비스 엔드포인트를 Databases 서브넷에 만들었으므로 이 작업이 허용됩니다.

Databases 서브넷에서 스토리지 서비스 엔드포인트를 사용함으로써 이제 DataServer가 스토리지에 액세스할 수 있음을 확인했습니다. 또한 AppServer가 스토리지에 액세스할 수 없다는 것을 확인했습니다. 이는 이 서버가 다른 서브넷에 있고 가상 네트워크 서비스 엔드포인트에 대한 액세스 권한이 없기 때문입니다.