Azure Batch プールの計算ノードへのリモート アクセスを構成する/無効にする

Batch の既定では、ネットワークに接続しているノード ユーザーは Batch プールの計算ノードに外部接続できます。 たとえば、リモート デスクトップ (RDP) を利用し、ポート 3389 で Windows プールの計算ノードに接続できます。 同様に、既定では、Secure Shell (SSH) を利用し、ポート 22 で Linux プールの計算ノードに接続できます。

場合によっては、自分の環境で、これらの既定の外部アクセス設定を制限したり、無効にしたりする必要があります。 Batch API を利用して PoolEndpointConfiguration プロパティを設定することで、これらの設定を変更できます。

プール エンドポイントの構成について

エンドポイントは、フロントエンド ポートの 1 つまたは複数のネットワーク アドレス変換 (NAT) プールから構成されます。 (計算ノードの Batch プールと NAT プールを混同しないでください。)プールの計算ノードの既定の接続設定をオーバーライドするように各 NAT プールを設定します。

各 NAT プール構成には、1 つまたは複数のネットワーク セキュリティ グループ (NSG) ルールが含まれています。 各 NSG ルールによって、エンドポイントへの特定のネットワーク トラフィックが許可されるか、拒否されます。 すべてのトラフィック、サービス タグ ("Internet" など) で識別されるトラフィック、特定の IP アドレスやサブネットから届くトラフィックを許可または拒否するように選択できます。

考慮事項

  • プール エンドポイント構成は、プールのネットワーク構成の一部です。 ネットワーク構成には任意で、Azure 仮想ネットワークにプールを参加させる設定を含めることができます。 仮想ネットワークにプールを設定した場合、仮想ネットワークのアドレス設定を使用する NSG ルールを作成できます。
  • NAT プールを構成するとき、複数の NSG ルールを構成できます。 ルールは優先順位に従ってチェックされます。 いずれかのルールが適用されると、それ以上はルールの一致テストが行われなくなります。

例:すべての RDP トラフィックを拒否する

次の C# コードの抜粋からは、Windows プールの計算ノードに RDP エンドポイントを構成し、すべてのネットワーク トラフィックを拒否する方法を確認できます。 このエンドポイントでは、範囲 60000 - 60099 のポートのフロントエンド プールが使用されます。

using Microsoft.Azure.Batch;
using Microsoft.Azure.Batch.Common;

namespace AzureBatch
{
    public void SetPortsPool()
    {   
        pool.NetworkConfiguration = new NetworkConfiguration
        {
            EndpointConfiguration = new PoolEndpointConfiguratio(new InboundNatPool[]
            {
              new InboundNatPool("RDP", InboundEndpointProtocol.Tcp, 3389, 60000, 60099, new NetworkSecurityGroupRule[]
                {
                    new NetworkSecurityGroupRule(162, NetworkSecurityGroupRuleAccess.Deny, "*"),
                })
            })    
        };
    }
}

例:インターネットからのすべての SSH トラフィックを拒否する

次の Python コードの抜粋からは、Linux プールの計算ノードに SSH エンドポイントを構成し、すべてのインターネット トラフィックを拒否する方法を確認できます。 このエンドポイントでは、範囲 4000 - 4100 のポートのフロントエンド プールが使用されます。

from azure.batch import models as batchmodels

class AzureBatch(object):
    def set_ports_pool(self, **kwargs):
        pool.network_configuration = batchmodels.NetworkConfiguration(
            endpoint_configuration=batchmodels.PoolEndpointConfiguration(
                inbound_nat_pools=[batchmodels.InboundNATPool(
                    name='SSH',
                    protocol='tcp',
                    backend_port=22,
                    frontend_port_range_start=4000,
                    frontend_port_range_end=4100,
                    network_security_group_rules=[
                        batchmodels.NetworkSecurityGroupRule(
                            priority=170,
                            access=batchmodels.NetworkSecurityGroupRuleAccess.deny,
                            source_address_prefix='Internet'
                        )
                    ]
                )
                ]
            )
        )

例:特定の IP アドレスからの RDP トラフィックを許可する

次の C# コードの抜粋からは、Windows プールの計算ノードに RDP エンドポイントを構成し、IP アドレス 198.51.100.7 からのみ RDP アクセスを許可する方法を確認できます。 2 つ目の NSG ルールによって、この IP アドレスに一致しないトラフィックが拒否されます。

using Microsoft.Azure.Batch;
using Microsoft.Azure.Batch.Common;

namespace AzureBatch
{
    public void SetPortsPool()
    {
        pool.NetworkConfiguration = new NetworkConfiguration
        {
            EndpointConfiguration = new PoolEndpointConfiguration(new InboundNatPool[]
            {
                new InboundNatPool("RDP", InboundEndpointProtocol.Tcp, 3389, 7500, 8000, new NetworkSecurityGroupRule[]
                {   
                    new NetworkSecurityGroupRule(179, NetworkSecurityGroupRuleAccess.Allow, "198.51.100.7"),
                    new NetworkSecurityGroupRule(180, NetworkSecurityGroupRuleAccess.Deny, "*")
                })
            })    
        };
    }
}

例:特定のサブネットからの SSH トラフィックを許可する

次の Python コードの抜粋からは、Linux プールの計算ノードに SSH エンドポイントを構成し、サブネット 192.168.1.0/24 からのみアクセスを許可する方法を確認できます。 2 つ目の NSG ルールによって、このサブネットに一致しないトラフィックが拒否されます。

from azure.batch import models as batchmodels

class AzureBatch(object):
    def set_ports_pool(self, **kwargs):
        pool.network_configuration = batchmodels.NetworkConfiguration(
            endpoint_configuration=batchmodels.PoolEndpointConfiguration(
                inbound_nat_pools=[batchmodels.InboundNATPool(
                    name='SSH',
                    protocol='tcp',
                    backend_port=22,
                    frontend_port_range_start=4000,
                    frontend_port_range_end=4100,
                    network_security_group_rules=[
                        batchmodels.NetworkSecurityGroupRule(
                            priority=170,
                            access='allow',
                            source_address_prefix='192.168.1.0/24'
                        ),
                        batchmodels.NetworkSecurityGroupRule(
                            priority=175,
                            access='deny',
                            source_address_prefix='*'
                        )
                    ]
                )
                ]
            )
        )

次のステップ