Azure Front DoorでWEBアクセスの送信元IP制限

 

Azure Front DoorのバックエンドプールにApplication Gatewayを使用した場合の送信元IPアクセス制限を試してみました。

Front Door経由のWEBアクセスはすべてAzureFrontDoor.BackendでプールされるIPになります。

その為Application GatewayやWeb Apps等のバックエンド側ではアクセス元IPがわからない為NSGでのアクセス制御が出来ません。Front Doorでのアクセス制御が必要になります。

今回実施した内容は以下の2つになります。

      • NSGでFront DoorからのApplication GatewayへのアクセスをFront Doorのみに制限する
      • Front DoorのWeb Application Firewallポリシーのカスタム規則でIP制限を行う

Azure Front Doorのアクセス制限はNSGの設定で出来ない為、Web Application Firewallポリシーのカスタム規則で実施しています。

WAFの構築についてはこちらで試しております。併せて見て頂ければと。

Azure Web アプリケーションファイアウォールを作ってみた

1.Application GatewayサブネットのNSGでFront Doorからのアクセスのみに制限する

最初にApplication GatewayへのアクセスをFront Doorからのみ制限します。

Application Gatewayのサブネットに適用しているNetwork Security Groupの受信規則でService TagがAzureFrontDoor.Backendの許可設定を追加します。

      • ソース:Service Tag
      • ソースサービスタグ:AzureFrontDoor.Backend
      • ソースポート範囲;*(Any)
      • 宛先:VirtualNetwork
      • 宛先ポート範囲:80、443
      • プロトコル:TCP
      • アクション:許可

次にFrontDoorからのアクセス許可より優先順位が下に、InterNetからのアクセス拒否ポリシーを設定します。

  • ソース:Service Tag
  • ソースサービスタグ:InterNet
  • ソースポート範囲;*(Any)
  • 宛先:VirtualNetwork
  • 宛先ポート範囲:80、443
  • プロトコル:TCP
  • アクション:拒否

この2つのルールにより、Application GatewayではInternetから来るWEBアクセスが拒否されFront Door経由のアクセスのみが許可されます。

Application Gatewayのドメインへのアクセスを実施すると、このサイトにアクセスできませんというメッセージが表示されます。

2.Web Application Firewallポリシーのカスタム規則でIP制限を行う

Front Door側でアクセス元IPを制限する場合、NSGではできず、WAFのカスタム規則を利用します。

今回は、特定のIPからのアクセスのみを許可します。

    • Web Application Firewallのポリシーを防止にする
    • 特定のIPを含まない場合はトラフィックを拒否する設定をする

※防止にすると必要なアクセスがブロックされる場合もありますので注意して下さい。

Web アプリケーション ファイアウォールのポリシーのメニューで設定の中にあるポリシー設定を選択すると下記画面が表示されます。

モードで防止を選択し保存します。

次に設定にあるカスタム規則を選択します。

カスタムルースの追加を選択すると条件設定の画面が表示されますので、以下の通り設定します。

      • 一致の種類:IPアドレス
      • 一致変数 RemoteAddr
      • 操作:次の値を含まない
      • IPアドレスまたは範囲:許可するIP
      • 結果 トラフィックを拒否する

最後にカスタム規則の保存を行えば、作業が完了です。

これで特定のIPからのみアクセスが許可され、それ以外のアクセスはブロックされます。

ARMテンプレート使ってNSGをデプロイ

 

Azure Network Security Group(NSG)のデプロイをARMテンプレート使ってやってみました。

今回は一番初期に使うパターンとして多そうな、RDP(ポート番号3389)を特定のIPからのみ受信許可する設定を試してみました。

1 .NSGの設定項目を確認する

まず、Azure PortalでNSGのセキュリティ規則設定で必要な項目を確認してみました。必須項目は以下の内容となっている事が確認できます。

      • ソース
      • ソースIPアドレス
      • ソースポート範囲
      • 宛先
      • 宛先ポート範囲
      • プロトコル
      • アクション
      • 優先度
      • 名前

 

.NSGのARMテンプレートサンプル(特定のIPからのみRDPを受信許可する)

今回のARMテンプレートで実施する内容は以下の通りになります。

      • NSGの作成
      • セキュリティ規則の作成

NSGのセキュリティ規則については、ソースIP以外をARMテンプレート内のresourcesで指定しています。

RDPをすべてのプロトコルで受信許可し、優先度100とする内容としています。

パラメータとして以下の値を指定するようにしています。

      • NSG名
      • ロケーション(デフォルト値を東日本としています)
      • NSGのセキュリティ規則名(デフォルト値をRDP-Permitとしています)
      • ソースIPアドレス(RDPを許可するIP)
{

    “$schema”: “https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#”,
    “contentVersion”: “1.0.0.0”,
    “parameters”: {
        “NSGName”: {
            “type”: “String”,
            “metadata”: {}
        },
        “location”: {
            “type”: “String”,
            “defaultValue”: “japaneast”,
            “metadata”:{} 
        },
        “NSGRuleName”: {
            “type”: “String”,
            “defaultValue”: “RDP-Permit”,
            “metadata”:{} 
        },
        “PermitIP”: {
           “type”: “String”,
           “metadata”:{} 
        }
    },
    “variables”: {},
    “resources”: [
        {
            “type”: “Microsoft.Network/networkSecurityGroups”,
            “apiVersion”: “2019-11-01”,
            “name”: “[parameters(‘NSGName’)]”,
            “location”: “[parameters(‘location’)]”,
            “properties”: {
                “securityRules”: [
                    {
                        “name”: “[parameters(‘NSGRuleName’)]”,
                        “properties”: {
                            “protocol”: “*”,
                            “sourcePortRange”: “*”,
                            “destinationPortRange”: “3389”,
                            “sourceAddressPrefix”: “[parameters(‘PermitIP’)]”,
                            “destinationAddressPrefix”: “VirtualNetwork”,
                            “access”: “Allow”,
                            “priority”: 100,
                            “direction”: “Inbound”,
                            “sourcePortRanges”: [],
                            “destinationPortRanges”: [],
                            “sourceAddressPrefixes”: [],
                            “destinationAddressPrefixes”: []
                        }
                    }
                ]
            }
        },
        {
            “type”: “Microsoft.Network/networkSecurityGroups/securityRules”,
            “apiVersion”: “2019-11-01”,
            “name”: “[concat(parameters(‘NSGName’), ‘/’, parameters(‘NSGRuleName’))]”,
            “dependsOn”: [
                “[resourceId(‘Microsoft.Network/networkSecurityGroups’, parameters(‘NSGName’))]”
            ],
            “properties”: {
                “protocol”: “*”,
                “sourcePortRange”: “*”,
                “destinationPortRange”: “3389”,
                “sourceAddressPrefix”: “[parameters(‘PermitIP’)]”,
                “destinationAddressPrefix”: “VirtualNetwork”,
                “access”: “Allow”,
                “priority”: 100,
                “direction”: “Inbound”,
                “sourcePortRanges”: [],
                “destinationPortRanges”: [],
                “sourceAddressPrefixes”: [],
                “destinationAddressPrefixes”: []
            }
        }
    ]
}

 

※デフォルトルールは、テンプレートには必要無いようです。

.NSGのARMテンプレートをPower Shell使ってデプロイする

1.で作成したNSGのARMテンプレートをPower Shell使ってデプロイします。
今回のサンプルではリソースグループ名、ロケーション名、セキュリティ規則名はデプロイ用Power Shellに直接記載しています。

Power Shellでデプロイ時にNSGの名前、RDPを許可するIPは指定するようにしています。

#NSG Template Deploy

param (
  [String] [Parameter(Mandatory=$true)]  $NSGName ,
  [String] [Parameter(Mandatory=$true)]  $Address
    )

$resourceGroupName = “リソースグループ名”
$location = “ロケーション名”
$NSGRuleName =“セキュリティ規則名”
$TemplateFilePath = “テンプレートのパス”

New-AzResourceGroupDeployment -ResourceGroupName $resourceGroupName `
  -TemplateFile $TemplateFilePath `
  -NSGName $NSGName `
  -NSGRuleName $NSGRuleName `
  -PermitIP $Address `
  -location $location

NSGが出来た後に、SubnetやNetwork Interfaceとの関連付けを行ってください。

これをデフォルト適用すれば、間違ってRDPをInterNetにAnyで公開する事を防げないかなぁと思っていたします。

今後は、サービスタグの指定、複数のセキュリティ規則を一括して作成するなど、環境に合わせて作成できるようにしていきたい所です。

NSGフローログの保存期間が使えるようになってました

 

以前は、NSGフローログの保存期間が使えない状態でした。その為、ストレージアカウントの利用料金削減のためには、PowerShell等で手動削除する必要がありました。これが、2019年12月18日に保存期間が使えるように改善されいたようです。

https://azure.microsoft.com/ja-jp/updates/nsg-flow-logs-retention-restored/

結構前に改善されていたようですが、全く気づいてませんでした。。。

1.NSGフローログの設定画面を確認する

ネットワークセキュリティグループ→設定対象のNSGを選択→NSGフローログのメニューを選択し、右に表示されるとNSGを選択すると、フローログの設定画面が表示されます。

リテンション期間が表示されております。以前は、設定関わらずNSG フローログが消えなかった時もあったので、念のため実際に削除されるのか確認をしてみたい所です。

2.NSGフローログ保管先ストレージアカウントに関する注意点

マイクロソフト様のサイトにも記載されておりますが、NSGフローログを保管するストレージアカウントがV2である必要があります。V1を使用している場合はアップデートが必要になります。

NSGの既存ルールにIPを追加するPower Shell

 

AzureではAzure VM等へのアクセス制限をNetwork Security Group(NSG)を使って行います。

NSGでは接続元、接続先、ポート等を指定してルール設定を行いますが、IPアドレスを指定してルールを作成する事もあるかと思います。

このルールの設定変更を簡単にできないか?と言う事でPower Shellでやってみました。

今回はNSGの既存ルールにアクセス元のIPを追をPower Shellで行ってみました。

1 .既存NSGルールにIPを追加するPower Shell

今回は接続元IP(Source Address Prefix)にIPを追加しています。
Power Shell実行時に3つの変数を指定する事で、既存ルールの設定変更を行うようにしています。

      • NSG名
      • NSGルール名
      • 追加するAddress

リソースグループ名はPower Shellの中で設定するようにしていますので、環境に合わせて設定します。

#NSG Rule Update(SourceAddressPrefix)

param (
[string] [Parameter(Mandatory=$true)] $NSGName,
[string] [Parameter(Mandatory=$true)] $NSGRuleName,
[string] [Parameter(Mandatory=$true)] $Address
)

$resourceGroupName = “リソースグループ名”

# Get the NSG resource
$nsg = Get-AzNetworkSecurityGroup -Name $NSGName -ResourceGroupName $resourceGroupName

# New Prefix List
$newPrefix = New-Object ‘System.Collections.Generic.List[string]’

# Existing Prefix Add
($nsg.SecurityRules | where {$_.Name -eq $NSGRuleName}).SourceAddressPrefix | foreach { $newPrefix.Add($_) }

# New Prefix Add
$newPrefix.Add($Address)

# New Prefix Rewrite
($nsg.SecurityRules | where {$_.Name -eq $NSGRuleName}).SourceAddressPrefix = $newPrefix

# Reflect changes
$nsg | Set-AzNetworkSecurityGroup

3つのパラメータを指定しPower Shellを実行します。

      • NSG名
      • NSGルール名
      • 追加するAddress

今回はPower Shell名を、NSG_Rule_Update_SourceIP.ps1としています。

c:\./NSG_Rule_Update_SourceIP.ps1 -NSGName NSG名 -NSGRuleName NSGルール名 -Address 追加するIPアドレス

その他にもNSGをARMテンプレートを使ってデプロイする事を試しています。併せて見て頂ければと。

ARMテンプレートを使って、Network Security Groupのデプロイしてみた(特定のIPからRDPを許可)

 

Azure Bastionを構築して使ってみた

 

Azure Bastionは、Azure Portal(ブラウザ経由やAPP経由)経由で、各仮想マシンにセキュアなSSHやRDP接続を提供してくれるサービスになります。

https://azure.microsoft.com/ja-jp/services/azure-bastion/

日本だと東日本リージョンで利用可能です。

今回はAzure Bastionを新規構築し実際に使ってみました。その際の手順や使ってみた感じを記載します。

1 .前提として必要になるもの

Azure Bastionを設定するにあたって、前提として必要なものがあります。

Azure Bastion専用のサブネット(/27以上で必要になります。)
Azure Bastionサブネット用のネットワークセキュリティグループ
・パブリックIP(Standard)

2.事前準備をする

作成手順は、下記サイトに記載されいます。こちらをもとに作成を進めていきます。

https://docs.microsoft.com/ja-jp/azure/bastion/bastion-create-host-portal

1)NSGを作成する。

Azure BastionのSubnetに割り当てる為の、NSGを作成します。必要になるポリシーは下記の通りになります。

受信側は、Gateway Managerとインターネットからのポート443での許可設定。送信側は、Azure Cloudのポート443の許可設定とV-NETへの3389、22での許可設定、計4つポリシーが必要になります。

注)下記サイトにも記載がありますが、接続する可能マシン側にも、Azure BastionのSubnetからの接続許可が別途必要です。

https://docs.microsoft.com/ja-jp/azure/bastion/bastion-nsg

2)Subnetを作成する。

Azure Bastion用のSubnetを作成します。注意点としてはSubnetの名前が、AzureBastionSubnetである必要があります。

#PowerShell
#Subnetを作成する

$rgName =“リソースグループ名”
$VnetName =“仮想ネットワーク名”
$subnetname1 =“AzureBastionSubnet”
$SubAddress =“XXX.XXX.XXX.XXX/27”
$nsgName =“先ほど作成したNSG名”

$nsg = get-AzNetworkSecurityGroup `
-Name “$nsgName” `
-ResourceGroupName $rgName$virtualNetwork = get-AzVirtualNetwork `
-Name $VnetName `
-ResourceGroupName $rgName

Add-AzVirtualNetworkSubnetConfig `
-Name $subnetname1 `
-AddressPrefix $SubAddress `
-VirtualNetwork $virtualNetwork `
-NetworkSecurityGroup $nsg

$virtualNetwork | Set-AzVirtualNetwork

3)パブリックIPを作成する。

Azure Bastion用のパブリックIPを作成します。SKUはStandardである必要があります。

#PowerShell
#PublicIPを作成する

$pubipname =“作成するパブリックIPの名”
$rgName =“リソースグループ名”
$location =“japaneast”
$AlloctMethod =“static”
$SKU =“Standard”

New-AzPublicIpAddress `
-Name $pubipname `
-ResourceGroupName $rgName `
-Location $location `
-AllocationMethod $AlloctMethod `
-SKU $SKU

3. Azure Bastionのセットアップを行う

Azure Bastionは日本語では要塞となります。Azure Portalからリソースの作成を選択し、要塞(Azure Bastion)と入力し検索します。

そうるすと以下の画面が表示されるのでクリックします。

下記画面が表示されるので、作成をクリックします。

以下の画面が表示されますので、事前に準備したものを選択します。インスタンス名等を入力します。入力したら確認及び作成を選択し、作成します。

以上で作成は終了です。

4. Azure Bastionで接続を行う

接続する、Virtual Machineを選択します。そうると左側のメニューに要塞(Azure Bastion)が表示されているので選択します。

ユーザー名、パスワードを入力し接続するをクリックします。

ブラウザ上で、仮想マシンの画面が表示されます。

5. Azure Bastionを使ってみて

非常に動作としては軽い感じに見えます。SSH接続で少し触った感じだと、シリアルコンソールより反応が良いです。
ブラウザベースでアクセス可能ですし、サイトに記載があるようにJump Box等を利用して外部からの接続を制限している場合等では、一度利用を試してみても良いかもしれません。

なお、注意点としては、SSHは22番ポート、RDPは3389番ポートしかサポートされていません。
Azureのサービス側でセキュリティを持ってくれているのでそんなに気にする必要はないと思いますが、仮想マシン側で変更したの忘れていると繋がらないです。