送信元IPアクセス制限をAzure Front Door+Azure Application Gatewayでやってみた

 

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

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

    • Application GatewayサブネットのNetwork Security GroupでFront Doorからのアクセスのみに制限する
    • Front DoorのWeb Application Firewallポリシーのカスタム規則でIP制限を行う

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

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

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

実際の設定画面は下記のようになります。

その次に、上記許可ポリシーより優先順位が下に、Service TagがInternetからポート80,443のアクセス拒否するポリシーを入れます。

これにより、直接Internetから来るアクセスが拒否され、Front Door経由のアクセスのみが許可されます。

直接、Application Gatewayのドメインへのアクセスを実施すると、このサイトにアクセスできませんというメッセージが表示されます。また、Front Door経由のアクセスをすれば正常にサイトアクセスできます。

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

Front Door経由のアクセスはすべてAzureFrontDoor.BackendでプールされるIPになります。したがって、Application Gateway側ではアクセス元IPがわからない為、Network Security Groupでの設定が出来ません。

Front Door側で同様の制限を行う必要がありますが、Front Doorのアクセス制限はNetwork Security Groupの設定での制限ができません。

結果、Front Doorに設定されているWeb Application Firewallポリシーのカスタム規則でIP制限を行う事になりました。

特定のIPからのアクセスのみを許可する場合は、以下の設定になります。

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

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

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

設定で防止を選択し保存します。

次に、設定にあるカスタム規則を選択します。カスタムルースの追加を選択するとカスタムルールの追加が表示されます。

 

カスタムルール名、優先度を適時設定した後に、条件を下記設定とします。

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

これで許可するIPアドレス以外のアクセスをすべて拒否する設定が出来ました。

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

 

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

 

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

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

※間違って、RDPをInterNetにAnyで許可してしまう事を防げないかなぁという事でARMテンプレートを作成してみました。

1 .NSGのテンプレート

今回は、特定IPからのRDPを許可するセキュリティ規則を作成してます。下記サンプルを適当な名前を付けて、JSON形式(拡張子をJSON)にしてファイルを保存します。

サンプルでは以下の値をパラメータとして指定するようにしています。

    • NSG名
    • ロケーション(デフォルト値を東日本としています)
    • NSGのルール名(デフォルト値をRDP-Permitとしています)
    • 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”: []
            }
        }
    ]
}

 

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

.ARMテンプレートをPower Shellでデプロイする

1.で作成した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との関連付けを行ってください。この編のPower Shellは随時公開していきたいと思います。

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

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

 

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

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

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

1.実際の設定画面を確認する

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

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

2.注意点

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

 

Network Security Groupの既存ルールにアクセス制限IPを追加するPower Shell

 

Network Security Group(NSG)で、アクセス元のIPを制限したりするケースもあるかと思います。
既存NSGの特定ルールにアクセス元のIPを追加作業を日々行う必要があったので、簡単にしようという事で、既存ルールへのIP追加をPower Shellで行ってみました。

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

以下のサンプルでは、Source Address Prefixに、IPを追加しています。
今回はPower Shell実行時に、NSG名、NSGルール名、追加するAddressを変数で指定するようにしています。

#NSG Rule Update(SourceAddressPrefix)

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

$resourceGroupName = “RG名”

# 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

以下のように、NSG名等を指定しPowerShell実行します。(今回はPowerShell名を、NSG_Rule_Update_SourceIP.ps1としています。)

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

 

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

 

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

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

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

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

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

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

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

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のサービス側でセキュリティを持ってくれているのでそんなに気にする必要はないと思いますが、仮想マシン側で変更したの忘れていると繋がらないです。