ネットワーク ACL について
アクセス制御リスト (ACL) を使用して、IBM Cloud® Virtual Private Cloud のすべての着信トラフィックと発信トラフィックを制御できます。 ACL は、セキュリティー・グループに似た、組み込みの仮想ファイアウォールです。 セキュリティー・グループとは異なり、ACL のルールは、_インスタンス_との間のトラフィックではなく、_サブネット_との間のトラフィックを制御します。
セキュリティー・グループと ACL の特性の比較については、比較表を参照してください。
この資料では、CLI を使用して VPC にネットワーク ACL を作成する方法を示す例を紹介します。 IBM Cloud コンソールで ACL を設定する方法の詳細については、 コンソールでの ACL の設定を 参照してください。
ACL ルールと ACL ルールの処理
ACL を有効にするには、インバウンド/アウトバウンドのネットワーク・トラフィックの処理方法を決定するルールを作成します。 複数のインバウンド・ルールとアウトバウンド・ルールを作成できます。 ルールの割り当て量について詳しくは、割り当て量を参照してください。
- インバウンド・ルールでは、指定したプロトコルとポートを使用する特定のソース IP 範囲からのトラフィックを許可または拒否できます。
- アウトバウンド・ルールでは、指定したプロトコルとポートを使用する特定の宛先 IP 範囲へのトラフィックを許可または拒否できます。
- ACL ルールには優先順位があり、順番に処理されます。 優先順位が高いルールが最初に評価され、優先順位の低いルールをオーバーライドします。
- インバウンド・ルールは、アウトバウンド・ルールとは分離されています。
- ルールが指定されていない場合は、implicit deny がデフォルトの動作です。
ACL ルールで ICMP、TCP、および UDP プロトコルを使用する方法について詳しくは、インターネット通信プロトコルについてを参照してください。
VPCのデフォルトACLルールの更新
デフォルトACLは、削除できないという例外を除いて、他のACLと同様である。
VPCを作成すると、システムはVPCに2つのルールを持つデフォルトACLを作成します
allow-inbound
という名前のルールで、あらゆるソースからのICMP、TCP、UDPの受信トラフィックを許可するallow-outbound
という名前のルールで、任意の宛先へのICMP、TCP、UDPの送信トラフィックを許可する
コンソール、CLI、またはAPIを使用して、デフォルトACLのルールを変更できる。
デフォルトACLのルールを編集した場合、編集したルールは、ACLにアタッチされている現在および将来のすべてのサブネットに適用される。
サブネットへの ACL の付加
新しいサブネットを作成するときに、付加する ACL を指定できます。 ACL を指定しない場合、VPC のデフォルトのネットワーク ACL がアタッチされます。
すべてのサブネットには、正確に1つのACLが割り当てられています。 サブネットの ACL を別の ACL に置き換えることができます。
ACL の例
以下の例では、コマンド・ライン・インターフェース (CLI) で、2 つの ACL を作成し、2 つのサブネットに関連付けます。 図 1 は、このシナリオの状況を表しています。
{: caption="
図 1 に示すように、インターネットからの要求を処理する 2 つの Web サーバーと、パブリックに公開しない 2 つのバックエンド・サーバーがあります。 この例では、これらのサーバーを 2 つの別個のサブネット (10.10.10.0/24
と 10.10.20.0/24
) に配置し、Web サーバーがバックエンド・サーバーとデータを交換できるようにする必要があります。 また、バックエンド・サーバーからの制限付きのアウトバウンド・トラフィックを許可する必要もあります。
ルールの例
以下のルールの例は、この基本的なシナリオで ACL ルールをセットアップする方法を示しています。
ベスト・プラクティスとして、粗いルールよりも細かいルールの優先順位を高くしてください。 例えば、サブネット 10.10.30.0/24
からのすべてのトラフィックをブロックするルールがあるとします。 このルールに高い優先順位を割り当てた場合、それより優先順位が低い、10.10.30.5
からのトラフィックを許可する細かいルールが適用されなくなります。
ACL-1 のルールの例
インバウンド/アウトバウンド | 許可/拒否 | 送信元 IP | 宛先 IP | プロトコル | ポート | 説明 |
---|---|---|---|---|---|---|
インバウンド | 許可 | 0.0.0.0/0 | 0.0.0.0/0 | TCP | 80 | インターネットからの HTTP トラフィックを許可する |
インバウンド | 許可 | 0.0.0.0/0 | 0.0.0.0/0 | TCP | 443 | インターネットからの HTTPS トラフィックを許可する |
インバウンド | 許可 | 10.10.20.0/24 | 0.0.0.0/0 | すべて | すべて | バックエンド・サーバーが配置されているサブネット 10.10.20.0/24 からのすべてのインバウンド・トラフィックを許可する |
インバウンド | 拒否 | 0.0.0.0/0 | 0.0.0.0/0 | すべて | すべて | その他のすべてのインバウンド・トラフィックを拒否する |
アウトバウンド | 許可 | 0.0.0.0/0 | 0.0.0.0/0 | TCP | 80 | インターネットへの HTTP トラフィックを許可する |
アウトバウンド | 許可 | 0.0.0.0/0 | 0.0.0.0/0 | TCP | 443 | インターネットへの HTTPS トラフィックを許可する |
アウトバウンド | 許可 | 0.0.0.0/0 | 10.10.20.0/24 | すべて | すべて | バックエンド・サーバーが配置されているサブネット 10.10.20.0/24 へのすべてのアウトバウンド・トラフィックを許可する |
アウトバウンド | 拒否 | 0.0.0.0/0 | 0.0.0.0/0 | すべて | すべて | その他のすべてのアウトバウンド・トラフィックを拒否する |
ACL-2 のルールの例
インバウンド/アウトバウンド | 許可/拒否 | 送信元 IP | 宛先 IP | プロトコル | ポート | 説明 |
---|---|---|---|---|---|---|
インバウンド | 許可 | 10.10.10.0/24 |
0.0.0.0/0 | すべて | すべて | Web サーバーが配置されているサブネット 10.10.10.0/24 からのすべてのインバウンド・トラフィックを許可する |
インバウンド | 拒否 | 0.0.0.0/0 | 0.0.0.0/0 | すべて | すべて | その他のすべてのインバウンド・トラフィックを拒否する |
アウトバウンド | 許可 | 0.0.0.0/0 | 0.0.0.0/0 | TCP | 80 | インターネットへの HTTP トラフィックを許可する |
アウトバウンド | 許可 | 0.0.0.0/0 | 0.0.0.0/0 | TCP | 443 | インターネットへの HTTPS トラフィックを許可する |
アウトバウンド | 許可 | 0.0.0.0/0 | 10.10.10.0/24 |
すべて | すべて | Web サーバーが配置されているサブネット 10.10.10.0/24 へのすべてのアウトバウンド・トラフィックを許可する |
アウトバウンド | 拒否 | 0.0.0.0/0 | 0.0.0.0/0 | すべて | すべて | その他のすべてのアウトバウンド・トラフィックを拒否する |
この例は一般的なケースだけを示しています。 シナリオによっては、より細かいトラフィック制御が必要になることがあります。
- ネットワーク管理者が、操作の目的でリモート・ネットワークから 10.10.10.0/24 サブネットにアクセスする必要があるとします。 この場合は、インターネットからこのサブネットへの SSH トラフィックを許可する必要があります。
- 2 つのサブネット間で許可するプロトコル・スコープを絞り込むこともできます。
手順の例
以下の例の手順では、CLI を使用して VPC を作成するという前提条件となる手順を省略していますが、この手順を最初に実行しておく必要があります。 詳しくは、CLI を使用した VPC リソースの作成を参照してください。
ステップ 1. ACL を作成する
次の CLI コマンドを使用して、my_web_subnet_acl
および my_backend_subnet_acl
という 2 つの ACL を作成します。
ibmcloud is network-acl-create my-web-subnet-acl $vpc_id --source-acl-id $old_acl_id
ibmcloud is network-acl-create my-backend-subnet-acl $vpc_id --source-acl-id $old_acl_id
新しく作成された ACL の ID が応答として返されます。 後でコマンドで使用するので、その両方の ACL の ID を保存します。 次のように、webacl
および bkacl
という変数を使用することができます。
webacl="0738-ba9e785a-3e10-418a-811c-56cfe5669676"
bkacl="0738-a4e28308-8ee7-46ab-8108-9f881f22bdbf"
ステップ 2 ACL のデフォルトのルールを取得する
インバウンドおよびアウトバウンドのデフォルトの ACL ルールの前に新しいルールを挿入するために、ルールを追加する前に、それらのデフォルトのルールを取得します。
ibmcloud is network-acl-rules $webacl
ibmcloud is network-acl-rules $bkacl
すべてのプロトコルのすべての IPv4 トラフィックを許可するインバウンドとアウトバウンドのデフォルトのルールが応答として返されます。
Getting rules of network acl ba9e785a-3e10-418a-811c-56cfe5669676 under account Demo Account as user demouser...
inbound
ID Name Action IPv* Protocol Source Destination Created
0738-e2b30627-1a1d-447b-859f-ac9431986b6f allow-all-inbound-rule-2d86bc3f-58e4-436a-8c1a-9b0a710556d6 allow ipv4 all 0.0.0.0/0 0.0.0.0/0 2 months ago
outbound
ID Name Action IPv* Protocol Source Destination Created
0738-173a3492-0544-472e-91c0-7828cbcb62d4 allow-all-outbound-rule-2d86bc3f-58e4-436a-8c1a-9b0a710556d6 allow ipv4 all 0.0.0.0/0 0.0.0.0/0 2 months ago
後でコマンドで値を使用できるように、この両方の ACL ルールの ID を変数に保存します。 例えば、次のように ID を変数 inrule
および outrule
に保存することができます。
inrule="0738-e2b30627-1a1d-447b-859f-ac9431986b6f"
outrule="0738-173a3492-0544-472e-91c0-7828cbcb62d4"
ステップ 3。 説明に従って新規 ACL ルールを追加する
この例では、先にインバウンド・ルールを追加してから、その後、アウトバウンド・ルールを追加します。
デフォルトのインバウンド・ルールの前に新しいインバウンド・ルールを挿入します。
ibmcloud is network-acl-rule-add my_web_acl_rule200 $webacl deny inbound all 0.0.0.0/0 0.0.0.0/0 \
--before-rule-id $in-rule
この手順を行うたびに、ACL ルールの ID を変数に保存して、後でコマンドで使用できるようにします。 例えば、次のように変数 acl200
を使用できます。
acl200="0738-90930627-1a1d-447b-859f-ac9431986b6f"
次は、acl200
にルールを追加します。
ibmcloud is network-acl-rule-add my_web_acl_rule100 $webacl allow inbound all 10.10.20.0/24 0.0.0.0/0 \
--before-rule-id $acl200
ACL のセットアップが完了するまでルールを追加していきます。各 ID を変数として保存します。
acl100="0738-78340627-1a1d-447b-859f-ac9431986b6f"
ibmcloud is network-acl-rule-add my_web_acl_rule20 $webacl allow inbound tcp 0.0.0.0/0 0.0.0.0/0 \
--source-port-min 443 --source-port-max 443 --before-rule-id $acl100
acl20="32450627-1a1d-447b-859f-ac9431986b6f"
ibmcloud is network-acl-rule-add my_web_acl_rule10 $webacl allow inbound tcp 0.0.0.0/0 0.0.0.0/0 \
--source-port-max 80 --source-port-min 80 --before-rule-id $acl20
デフォルトのアウトバウンド・ルールの前に新しいアウトバウンド・ルールを挿入します。
ibmcloud is network-acl-rule-add my_web_acl_rule200e $webacl deny outbound all 0.0.0.0/0 0.0.0.0/0 \
--before-rule-id $outrule
acl200e="11110627-1a1d-447b-859f-ac9431986b6f"
ibmcloud is network-acl-rule-add my_web_acl_rule100e $webacl allow outbound all 0.0.0.0/0 10.10.20.0/24 \
--before-rule-id $acl200e
acl100e="22220627-1a1d-447b-859f-ac9431986b6f"
ibmcloud is network-acl-rule-add my_web_acl_rule20e $webacl allow outbound tcp 0.0.0.0/0 0.0.0.0/0 \
--source-port-max 443 --source-port-min 443 --before-rule-id $acl100e
acl20e="33330627-1a1d-447b-859f-ac9431986b6f"
ibmcloud is network-acl-rule-add my_web_acl_rule10e $webacl allow outbound tcp 0.0.0.0/0 0.0.0.0/0 \
--source-port-max 80 --source-port-min 80 --before-rule-id $acl20e
ステップ 4: 新しく作成した ACL を使用して 2 つのサブネットを作成する
サブネットを 2 つ作成し、新規サブネットのそれぞれに ACL を 1 つ関連付けます。
ibmcloud is subnet-create my-web-subnet $vpc_id $zone --ipv4_cidr_block 10.10.10.0/24 \
--network-acl-id $webacl
ibmcloud is subnet-create my-backend-subnet$vpc_id $zone --ipv4_cidr_block 10.10.20.0/24 \
--network-acl-id $bkacl
コマンド・リストの説明
ACL に対して使用できるすべての VPC CLI コマンドのリストを表示するには、次のように入力します。
ibmcloud is network-acls
ACL とそのメタデータ (ルールを含む) を表示するには、次のように入力します。
ibmcloud is network-acl $webacl
すべての ACL ルールをリストするには、以下のようにします。
ibmcloud is network-acl-rules $webacl
インバウンドの ping
ルールの例
ACL ルールの追加に関して、デフォルトのインバウンド・ルールの前に ping
インバウンド・ルールを追加するサンプル・コマンドを次に示します。
構文:
ibmcloud is network-acl-rule-add ACL ACTION DIRECTION PROTOCOL SOURCE DESTINATION [--name NAME] [--icmp-type ICMP_TYPE] [--icmp-code ICMP_CODE] [--source-port-min PORT_MIN] [--source-port-max PORT_MAX] [--destination-port-min PORT_MIN] [--destination-port-max PORT_MAX] [--before-rule-id RULE_ID] [--output JSON] [-q, --quiet]
例:
ibmcloud is network-acl-rule-add 72b27b5c-f4b0-48bb-b954-5becc7c1dcb3 allow inbound icmp 10.2.2.2 10.2.2.3 --icmp-type 8 --icmp-code 0