ファイアウォール ルールの使用

このページでは、ファイアウォール ルールの処理のためのコマンドについて説明し、それらの使用例を紹介します。

始める前に

暗黙のルールやデフォルト ネットワークのシステム生成ルールなど、ファイアウォール ルールの詳細については、ファイアウォール ルールの概要をご覧ください。

ファイアウォール ルールを構成する前に、ファイアウォール ルールのコンポーネントを確認して、Google Cloud で使用されるファイアウォールのコンポーネントについて理解してください。

ファイアウォール ルールの作成

ファイアウォール ルールはネットワーク レベルで定義され、ルールが作成されたネットワークにのみ適用されます。ただし、それぞれの名前はプロジェクトごとに一意である必要があります。

Console

  1. Google Cloud Console の [ファイアウォール ルール] ページに移動します。
    [ファイアウォール ルール] ページに移動
  2. [ファイアウォール ルールを作成] をクリックします。
  3. ファイアウォール ルールの [名前] を入力します。
    この名前はプロジェクトで一意にする必要があります。
  4. (省略可)ファイアウォール ルール ロギングを有効にできます。
    • [ログ] > [オン] をクリックします。
    • [オンにする] をクリックします。
  5. ファイアウォール ルールを実装する [ネットワーク] を指定します。
  6. ルールの [優先度] を指定します。
    数字が小さいほど、優先順位が高くなります。
  7. [トラフィックの方向] には、上りと下りのいずれかを選択します。
  8. [一致したときのアクション] には、許可と拒否のいずれかを選択します。
  9. ルールの [ターゲット] を指定します。
    • ルールをネットワーク内のすべてのインスタンスに適用する場合は All instances in the network を選択します。
    • ネットワーク(ターゲット)のタグを使用して一部のインスタンスにルールを適用する場合は Specified target tags を選択し、ルールの適用対象にするタグを [ターゲットタグ] フィールドに入力します。
    • 関連するサービス アカウントを使用して一部のインスタンスにルールを適用する場合は Specified service account を選択し、[サービス アカウントのスコープ] でサービス アカウントがある場所を現在のプロジェクトまたは別のプロジェクトと指定します。続いて、[ターゲット サービス アカウント] フィールドでサービス アカウント名を選択するか入力します。
  10. 上り(内向き)ルールの場合、[ソースフィルタ] を指定します:
    • IP アドレスの範囲を使用して受信トラフィックのソースを定義するには、IP ranges を選択し、[ソース IP の範囲] フィールドに CIDR ブロックを入力します。ソースを任意のネットワークにするには、0.0.0.0/0 を使用します。
    • ネットワーク タグを使用してソースを制限するには、Source tags を選択し、ネットワーク タグを [ソースタグ] フィールドに入力します。ソースタグ数の上限については、VPC の割り当てと上限をご覧ください。ソースタグによるフィルタリングを使用できるのは、サービス アカウントによってターゲットが指定されていない場合に限られます。詳しくは、サービス アカウントによるフィルタリングとネットワーク タグによるフィルタリングをご覧ください。
    • サービス アカウントによってソースを制限するには、Service account を選択し、[サービス アカウントのスコープ] でサービス アカウントがある場所を現在のプロジェクトまたは別のプロジェクトと指定します。続いて、[ソースのサービス アカウント] フィールドでサービス アカウント名を選択するか入力します。 ソースのサービス アカウントによるフィルタリングを使用できるのは、ネットワーク タグによってターゲットが指定されていない場合に限られます。詳しくは、サービス アカウントによるフィルタリングとネットワーク タグによるフィルタリングをご覧ください。
    • 必要に応じて、[2 番目のソースフィルタ] を指定します。2 番目のソースフィルタでは、メインのソースフィルタと同じフィルタ条件を使用することはできません。
  11. 下り(外向き)ルールの場合、[送信先フィルタ] を指定します:
    • IP アドレスの範囲を使用して発信トラフィックの送信先を定義するには、IP ranges を選択し、[送信先 IP 範囲] フィールドに CIDR ブロックを入力します。0.0.0.0/0 を使用すると、任意の場所になります。
  12. ルールを適用する [プロトコルとポート] を定義します。

    • すべてのプロトコルとポートにルールを適用する場合は、アクションに応じて Allow allDeny all のいずれかを選択します。

    • 特定のプロトコルとポートを定義します。

      • TCP のプロトコルとポートを指定する場合は [tcp] を選択します。all と入力するか、20-22, 80, 8080 などのポートのカンマ区切りリストを入力します。
      • UDP のプロトコルとポートを指定するには [udp] を選択します。all と入力するか、67-69, 123 などのポートのカンマ区切りリストを入力します。
      • icmpsctp などのプロトコルを含めるには [その他のプロトコル] を選択します。
  13. (省略可)ファイアウォール ルールを作成しても、その適用状態を無効に設定すれば、ルールは適用されません。[ルールを無効にする] をクリックし、[無効] を選択します。

  14. [作成] をクリックします。

gcloud

ファイアウォール ルールを作成する gcloud コマンドは次のとおりです。

    gcloud compute firewall-rules create NAME \
        [--network NETWORK; default="default"] \
        [--priority PRIORITY;default=1000] \
        [--direction (ingress|egress|in|out); default="ingress"] \
        [--action (deny | allow )] \
        [--target-tags TAG,TAG,...] \
        [--target-service-accounts=IAM Service Account,IAM Service Account,...] \
        [--source-ranges CIDR-RANGE,CIDR-RANGE...] \
        [--source-tags TAG,TAG,...] \
        [--source-service-accounts=IAM Service Account,IAM Service Account,...] \
        [--destination-ranges CIDR-RANGE,CIDR-RANGE...] \
        [--rules (PROTOCOL[:PORT[-PORT]],[PROTOCOL[:PORT[-PORT]],...]] | all ) \
        [--disabled | --no-disabled]
        [--enable-logging | --no-enable-logging]
    

パラメータは以下のように使用します。各パラメータの詳細については、SDK リファレンス ドキュメントをご覧ください。

  • --network: ルールを作成するネットワークです。省略した場合、ルールは default ネットワークに作成されます。デフォルト ネットワークがない場合や、特定のネットワークにルールを作成する場合は、このフィールドを使用する必要があります。
  • --priority: ルールの優先度を示す数値です。数字が小さいほど、優先順位が高くなります。
  • --direction: トラフィックの方向です。ingressegress のいずれかを指定します。
  • --action: 一致したときのアクションです。allowdeny のいずれかを指定します。--rules フラグとともに使用する必要があります。
  • ターゲットは、次の 3 つの方法のいずれかで指定します。
    • ルールをネットワーク内のすべてのターゲットに適用する場合は、--target-tags--target-service-accounts を省略します。
    • --target-tags: ネットワーク タグを使用してターゲットを定義する場合は、このフラグを使用します。
    • --target-service-accounts: 関連するサービス アカウントを使用してターゲットを定義する場合は、このフラグを使用します。
  • 上り(内向き)ルールの場合は、ソースを指定します。
    • 上り(内向き)のソースを任意の場所(0.0.0.0/0)にする場合は、--source-rangessource-tags--source-service-accounts を省略します。
    • --source-ranges: ソース IP アドレスの範囲を CIDR 形式で指定する場合は、このフラグを使用します。
    • --source-tags: ネットワーク タグを使用してソース インスタンスを指定する場合は、このフラグを使用します。ソースタグによるフィルタリングを使用できるのは、サービス アカウントによってターゲットが指定されていない場合に限られます。詳しくは、サービス アカウントによるフィルタリングとネットワーク タグによるフィルタリングをご覧ください。
    • --source-ranges--source-tags は、一緒に使用できます。両方が指定されている場合、有効なソースセットは、ソース範囲の IP アドレスと、ネットワーク タグによって特定されるインスタンスのユニオンです(タグ付けされたインスタンスがソース範囲の IP を持たない場合であっても対象に含まれます)。
    • --source-service-accounts: 使用するサービス アカウントでインスタンスを指定する場合は、このフラグを使用します。ソースのサービス アカウントによるフィルタリングを使用できるのは、ネットワーク タグによってターゲットが指定されていない場合に限られます。詳しくは、サービス アカウントによるフィルタリングとネットワーク タグによるフィルタリングをご覧ください。
  • 下り(外向き)ルールの場合は、送信先を指定します。
    • 下り(外向き)の送信先を任意の場所(0.0.0.0/0)にする場合は、--destination-ranges を省略します。
    • --destination-ranges: 送信先 IP アドレスの範囲を CIDR 形式で指定する場合は、このフラグを使用します。
  • --rules: ルールの適用対象にするプロトコルとポートのリストです。すべてのプロトコルとポートにルールを適用する場合は、all を使用します。--action フラグが必要です。
  • デフォルトでは、ファイアウォール ルールが作成されると自動的に適用されますが、この動作は変更できます。
    • --disabled--no-disabled の両方が省略されている場合は、ファイアウォール ルールが作成され、適用されます。
    • --disabled: ファイアウォール ルールを作成して、適用しない場合は、このフラグを追加します。ファイアウォール ルールを更新して有効にするまで、ファイアウォール ルールは無効状態のままになります。
    • --no-disabled: ファイアウォール ルールを確実に適用するには、このフラグを追加します。
  • ファイアウォール ルール ロギングは、ルールの作成時、更新時に適用できます。ファイアウォール ルール ロギングを使用すると、ファイアウォール ルールの効果を監査、検証、分析できます。詳しくは、ファイアウォール ルール ロギングをご覧ください。

API

ファイアウォール ルールを作成します。

    POST https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls
    {
      "name": "FIREWALL_NAME",
      "network": "projects/PROJECT_ID/global/networks/NETWORK_NAME",
      ... other fields
    }
    

プレースホルダを有効な値に置き換えます。

  • [PROJECT_ID] は、VPC ネットワークが配置されているプロジェクトの ID です。
  • [NETWORK_NAME] は、ファイアウォール ルールが作成される VPC ネットワークの名前です。
  • [FIREWALL_NAME] はファイアウォール ルールの名前です。

  • 上り(内向き)ファイアウォール ルールで、次のフィールドを使用して上り(内向き)のソース(sourceRangessourceTagssourceServiceAccounts)を指定します。範囲 0.0.0.0/0 を使用する場合は、フィールドを指定しないでください。sourceTags フィールドと sourceServiceAccounts フィールドを一緒に使用することはできません。ただし、sourceRangessourceTags または sourceServiceAccounts と一緒に使用できます。その場合、ファイアウォール ルールを適用するには、接続がどちらか一方と一致する必要があります。

    ターゲット フィールドで sourceTags フィールドを使用している場合、targetServiceAccounts フィールドを使用できません。targetTags フィールドを使用するか、あるいはターゲット フィールドを使用しない必要があります。同様に、sourceServiceAccounts フィールドを使用している場合、targetTags フィールドは使用できません。ターゲット フィールドを指定しない場合、ルールはネットワーク内のすべてのターゲットに適用されます。

  • 下り(外向き)ファイアウォール ルールで、destinationRanges フィールドを使用して送信先を指定します。送信先を指定しない場合、Google Cloud は 0.0.0.0/0 を使用します。targetTags または targetServiceAccounts フィールドを使用して、ルールを適用するターゲットを指定します。ターゲット フィールドを指定しない場合、ルールはネットワーク内のすべてのターゲットに適用されます。

各フィールドの詳細と説明については、firewalls.insert メソッドをご覧ください。

ファイアウォール ルールを更新する

条件を一致させるために、指定されたプロトコルやポートなど、ファイアウォール ルールのコンポーネントの一部を変更できます。ファイアウォール ルールの名前、ネットワーク、一致したときのアクショントラフィックの方向は変更できません。

名前、ネットワーク、アクション、方向のコンポーネントを変更する必要がある場合は、ルールを削除して新しいルールを作成する必要があります。

Console

  1. Google Cloud Console の [ファイアウォール ルール] ページに移動します。
    [ファイアウォール ルール] ページに移動
  2. 変更するファイアウォール ルールをクリックします。
  3. [編集] をクリックします。
  4. ニーズに合うように、いずれかの編集可能なコンポーネントを変更します。

    複数のプロトコルを指定する場合は、[指定したプロトコルとポート] フィールドでセミコロン区切りリストとして指定します。

  5. [保存] をクリックします。

gcloud

ファイアウォール ルールを更新する gcloud コマンドは次のとおりです。

    gcloud compute firewall-rules update NAME \
        [--priority=PRIORITY] \
        [--description=DESCRIPTION] \
        [--target-tags=TAG,...] \
        [--target-service-accounts=IAM Service Account, ...] \
        [ --source-ranges=CIDR_RANGE, ...] \
        [--source-tags=TAG,...] \
        [--source-service-accounts=IAM Service Account, ...] \
        [--destination-ranges=CIDR_RANGE, ...] \
        [--rules=[PROTOCOL[:PORT[-PORT]],…]] \
        [--disabled | --no-disabled]
        [--enable-logging | --no-enable-logging]
    

各フラグの説明は、ファイアウォール ルールの作成での説明と同じです。各フラグの詳細については、SDK リファレンス ドキュメントをご覧ください。

API

PATCH を使用して、フィールド alloweddescriptionsourceRangessourceTags、または targetTags を更新します。それ以外のフィールドには PUT または POST を使用します。

    (PATCH|(POST|PUT)) https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls/FIREWALL_NAME
    {
      "name": "FIREWALL_NAME",
      "network": "projects/PROJECT_ID/global/networks/NETWORK_NAME",
      ... other fields
    }
    

プレースホルダを有効な値に置き換えます。

  • [PROJECT_ID] は、VPC ネットワークが配置されているプロジェクトの ID です。
  • [NETWORK_NAME] は、ファイアウォール ルールが配置されている VPC ネットワークの名前です。
  • [FIREWALL_NAME] は、更新するファイアウォール ルールの名前です。

各フィールドの詳細と説明については、firewalls.patch または firewalls.update メソッドをご覧ください。

VPC ネットワークのファイアウォール ルールを一覧表示する

Console

プロジェクト内のすべてのネットワークのファイアウォール ルールをすべて表示するには:

特定のネットワーク内のファイアウォール ルールを表示するには:

  1. Google Cloud Console で [VPC ネットワーク] ページに移動します。
    [VPC ネットワーク] ページに移動
  2. VPC ネットワークの [名前] をクリックして、詳細ページに移動します。
  3. ネットワークの詳細ページで、[ファイアウォール ルール] タブをクリックします。

gcloud

次のコマンドを実行すると、特定のネットワーク([NETWORK_NAME])に関するファイアウォール ルールの並べ替え済みリストが出力されます。

    gcloud compute firewall-rules list --filter network=NETWORK_NAME \
        --sort-by priority \
        --format="table(
            name,
            network,
            direction,
            priority,
            sourceRanges.list():label=SRC_RANGES,
            destinationRanges.list():label=DEST_RANGES,
            allowed[].map().firewall_rule().list():label=ALLOW,
            denied[].map().firewall_rule().list():label=DENY,
            sourceTags.list():label=SRC_TAGS,
            targetTags.list():label=TARGET_TAGS
            )"
    

API

指定されたネットワークのすべてのファイアウォール ルールを一覧表示します。

    GET https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls/?filter=network="NETWORK_NAME
    

プレースホルダを有効な値に置き換えます。

  • [PROJECT_ID] は、VPC ネットワークが配置されているプロジェクトの ID です。
  • [NETWORK_NAME] は、一覧表示するファイアウォール ルールを含む VPC ネットワークの名前です。

詳細については、firewalls.list メソッドをご覧ください。

VM インスタンスのネットワーク インターフェースのファイアウォール ルールを一覧表示する

Cloud Console には、インターフェースに適用されるすべてのファイアウォール ルールと、実際にインターフェースで使用されているルールの一覧がネットワーク インターフェースごとに表示されます。ファイアウォール ルールは他のルールをマスキングできるため、インターフェースに適用されるすべてのルールが実際にインターフェースで使用されないことがあります。

ファイアウォール ルールを VM インスタンスに関連付けて適用するには、ルールの target パラメータを使用します。適用されているすべてのルールを表示して、特定のルールがインターフェースに適用されているかどうかを確認できます。

VM インスタンスの特定のネットワーク インターフェースに適用されているファイアウォール ルールを表示するには:

  1. Google Cloud Console で、[VM インスタンス] ページに移動して、表示するインスタンスを探します。
    [VM インスタンス] ページに移動
  2. インスタンスの [その他の操作] メニュー()で、[ネットワークの詳細の表示] を選択します。
  3. インスタンスに複数のネットワーク インターフェースがある場合、[ネットワーク インターフェースの詳細] セクションに表示するネットワーク インターフェースを選択します。
  4. [ファイアウォール ルール] タブをクリックすると、ネットワーク インターフェースに適用されているすべてのルールがルール名順に表示されます。

ネットワーク インターフェースでは、そのインターフェースに適用されているルールのすべてが使用されるわけではありません。一部のルールが、より具体的な範囲を持つルールや優先度の高いルールで上書きされることがあります。使用中のルールを表示して、どの IP 範囲、プロトコル、ポートがインスタンスに対して開いているか閉じているかをすばやく確認できます。

VM インスタンスの特定のネットワーク インターフェースで使用されているファイアウォール ルールを表示するには:

  1. Google Cloud Console で、[VM インスタンス] ページに移動して、表示するインスタンスを探します。
    [VM インスタンス] ページに移動
  2. インスタンスの [その他の操作] メニュー()で、[ネットワークの詳細の表示] を選択します。
  3. インスタンスに複数のネットワーク インターフェースがある場合は、[ネットワーク インターフェースの詳細] セクションに表示するネットワーク インターフェースを選択します。
  4. [ネットワーク分析] セクションの [上り分析] タブまたは [下り分析] タブを選択します。
  5. テーブルに IP アドレス範囲が最も具体的なものから順に表示されるので、特定の IP アドレスとの間のトラフィックが許可されているかどうかを確認します。

ファイアウォール ルールの詳細を表示する

ファイアウォール ルールを調べると、名前、適用されるネットワーク、コンポーネントなどの情報を確認できます(ルールの有効 / 無効も確認できます)。

Console

  1. ファイアウォール ルールを一覧表示します。すべてのルールのリスト、または特定のネットワーク内のルールのみを表示できます。
  2. 表示するルールをクリックします。

gcloud

次のコマンドを実行すると、個別のファイアウォール ルールの情報が取得できます。[FIREWALL_RULE_NAME] をファイアウォール ルールの名前に置き換えます。ファイアウォール ルールの名前はプロジェクトで一意であるため、既存のルールの情報を取得する場合、ネットワークを指定する必要はありません。

    gcloud compute firewall-rules describe [FIREWALL_RULE_NAME]
    

API

指定されたファイアウォール ルールの情報を取得します。

    GET https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls/FIREWALL_NAME
    

プレースホルダを有効な値に置き換えます。

  • [PROJECT_ID] は、ファイアウォール ルールが配置されているプロジェクトの ID です。
  • [FIREWALL_NAME] は、情報を取得するファイアウォール ルールの名前です。

詳細については、firewalls.get メソッドをご覧ください。

ファイアウォール ルールを削除する

Console

  1. ファイアウォール ルールを一覧表示します。すべてのルールのリスト、または特定のネットワーク内のルールのみを表示できます。
  2. 削除するルールをクリックします。
  3. [削除] をクリックします。
  4. もう一度 [削除] をクリックして確定します。

gcloud

次のコマンドは、ファイアウォール ルールを削除します。[FIREWALL_RULE_NAME] を削除するルールの名前に置き換えます。

    gcloud compute firewall-rules delete [FIREWALL_RULE_NAME]
    

API

ファイアウォール ルールを削除します。

    DELETE https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls/FIREWALL_NAME
    

プレースホルダを有効な値に置き換えます。

  • [PROJECT_ID] は、ファイアウォール ルールが配置されているプロジェクトの ID です。
  • [FIREWALL_NAME] は、削除するファイアウォール ルールの名前です。

詳細については、firewalls.delete メソッドをご覧ください。

ファイアウォール ルールのモニタリング

ファイアウォール ルールのロギングを有効にして、どのルールがどのトラフィックを許可またはブロックしているかを確認できます。詳しくは、ファイアウォール ルール ロギングの使用をご覧ください。

構成例

次の図は、ファイアウォール構成の例を示しています。このシナリオには、以下を含めた my-network が含まれています。

  • IP 範囲が 10.240.10.0/24 のサブネット subnet1
  • IP 範囲が 192.168.1.0/24 のサブネット subnet2
  • タグが webserver および内部 IP が 192.168.1.2subnet2 内のインスタンス vm1
  • タグが database および内部 IP が 192.168.1.3subnet2 内のインスタンス vm2
ネットワーク構成例(クリックして拡大)
ネットワーク構成例(クリックして拡大)

例 1: subnet1 からポート 80 への接続を除くすべての上り(内向き)TCP 接続を拒否する

この例では、subnet1 からポート 80 への接続を除くすべての上り(内向き)TCP 接続を拒否するファイアウォール ルールのセットを作成します。

  1. webserver でタグ付けされたインスタンスへのすべての上り(内向き)TCP トラフィックを拒否するファイアウォール ルールを作成します。

        gcloud compute firewall-rules create deny-subnet1-webserver-access \
            --network my-network \
            --action deny \
            --direction ingress \
            --rules tcp \
            --source-ranges 0.0.0.0/0 \
            --priority 1000 \
            --target-tags webserver
        
  2. webserver でタグ付けされたインスタンス上の TCP ポート 80 にアクセスする subnet110.240.10.0/24)内のすべての IP を許可するファイアウォール ルールを作成します。

        gcloud compute firewall-rules create vm1-allow-ingress-tcp-port80-from-subnet1 \
            --network my-network \
            --action allow \
            --direction ingress \
            --rules tcp:80 \
            --source-ranges 10.240.10.0/24 \
            --priority 50 \
            --target-tags webserver
        

例 2: vm1 のポート 80 への接続を除くすべての下り(外向き)TCP 接続を拒否する

  1. すべての下り(外向き)TCP トラフィックを拒否するファイアウォール ルールを作成します。

        gcloud compute firewall-rules create deny-all-access \
            --network my-network \
            --action deny \
            --direction egress \
            --rules tcp \
            --destination-ranges 0.0.0.0/0 \
            --priority 1000
        
  2. vm1 ポート 80 への TCP トラフィックを許可するファイアウォール ルールを作成します。

        gcloud compute firewall-rules create vm1-allow-egress-tcp-port80-to-vm1 \
            --network my-network \
            --action allow \
            --direction egress \
            --rules tcp:80 \
            --destination-ranges 192.168.10.2/32 \
            --priority 60
        

例 3: 外部ホストのポート 443 への下り(外向き)TCP 接続を許可する

webserver でタグ付けされたインスタンスが、サンプル外部 IP アドレス 192.0.2.5 のポート 443 へ下り(外向き)TCP トラフィックを送信できるように許可するファイアウォール ルールを作成します。

    gcloud compute firewall-rules create vm1-allow-egress-tcp-port443-to-192-0-2-5 \
        --network my-network \
        --action allow \
        --direction egress \
        --rules tcp:443 \
        --destination-ranges 192.0.2.5/32 \
        --priority 70 \
        --target-tags webserver
    

例 4: vm2 から vm1 への SSH 接続を許可する

タグ databasevm2)が付いたインスタンスからタグ webservervm1)が付いたインスタンスに到達する SSH トラフィックを許可するファイアウォール ルールを作成します。

    gcloud compute firewall-rules create vm1-allow-ingress-tcp-ssh-from-vm2 \
        --network my-network \
        --action allow \
        --direction ingress \
        --rules tcp:22 \
        --source-tags database \
        --priority 80 \
        --target-tags webserver
    

例 5: サービス アカウントを使用し、ウェブサーバーからデータベースへの TCP: 1443 を許可する

サービス アカウントと役割の詳細については、サービス アカウントへの役割の付与をご覧ください。

テンプレート、ウェブサーバー アプリケーション my-sa-web、データベース アプリケーション「my-sa-db」を使用して自動スケーリングされる 2 つのアプリケーションを含む、以下の図のようなシナリオについて考えます。セキュリティ管理者は、ポート 1443 上で my-sa-web から my-sa-db への TCP フローを許可しようと考えています。

ファイアウォール ルールをサービス アカウントで使用する(クリックして拡大)
ファイアウォール ルールをサービス アカウントで使用する(クリックして拡大)

サービス アカウントの作成を含む構成手順は次のとおりです。

  1. プロジェクトの編集者またはオーナーが、my-sa-webmy-sa-db というサービス アカウントを作成します。

        gcloud iam service-accounts create my-sa-web \
            --display-name "webserver service account"
        
        gcloud iam service-accounts create my-sa-db \
            --display-name "database service account"
        
  2. プロジェクト オーナーが IAM ポリシーを設定して、ウェブサーバー デベロッパー web-dev@example.com にサービス アカウント my-sa-webserviceAccountUser の役割を割り当てます。

        gcloud iam service-accounts add-iam-policy-binding \
           my-sa-web@my-project.iam.gserviceaccount.com \
           --member='user:web-dev@example.com' \
           --role='roles/iam.serviceAccountUser'
        
  3. プロジェクト オーナーが IAM ポリシーを設定して、データベース デベロッパー「db-dev@example.com」にサービス アカウント my-sa-dbserviceAccountUser の役割を割り当てます。

        gcloud iam service-accounts add-iam-policy-binding \
           my-sa-db@my-project.iam.gserviceaccount.com \
           --member='user:db-dev@example.com' \
           --role='roles/iam.serviceAccountUser'
        
  4. インスタンス管理者の役割を持つデベロッパー web-dev@example.com が、ウェブサーバー インスタンス テンプレートを作成し、インスタンスをサービス アカウント my-sa-web として実行する権限を与えます。

        gcloud compute instance-templates create [INSTANCE_TEMPLATE_NAME]  \
            --service-account my-sa-web@my-project-123.iam.gserviceaccount.com
        
  5. インスタンス管理者の役割を持つデベロッパー db-dev@example.com が、データベース インスタンス テンプレートを作成し、インスタンスをサービス アカウント my-sa-db として実行する権限を与えます。

        gcloud compute instance-templates create [INSTANCE_TEMPLATE_NAME] \
            --service-account my-sa-db@my-project-123.iam.gserviceaccount.com
        
  6. セキュリティ管理者が、サービス アカウントを使用してファイアウォール ルールを作成し、サービス アカウント my-sa-web からサービス アカウント my-sa-db への TCP:1443 トラフィックを許可します。

        gcloud compute firewall-rules create [NAME] \
            --network network_a \
            --allow TCP:1443 \
            --source-service-accounts my-sa-web@my-project.iam.gserviceaccount.com \
            --target-service-accounts my-sa-db@my-project.iam.gserviceaccount.com
        

トラブルシューティング

ファイアウォール ルールの作成または更新時のエラー メッセージ

以下のエラー メッセージのいずれかが表示される場合があります。

  • Should not specify destination range for ingress direction.

    送信先の範囲が上り(内向き)のファイアウォール ルールの有効なパラメータではありません。ファイアウォール ルールは、egress の方向が特に指定されていない限り、上り(内向き)ルールとみなされます。方向を指定しないルールを作成すると、上り(内向き)ルールとして作成され、このルールは送信先の範囲を許可しません。また、送信元の範囲も下り(外向き)ルールの有効なパラメータではありません。

  • Firewall direction cannot be changed once created.

    既存のファイアウォール ルールの方向は変更できません。正しいパラメータで新しいルールを作成してから、古いルールを削除する必要があります。

  • Firewall traffic control action cannot be changed once created.

    既存のファイアウォール ルールのアクションは変更できません。正しいパラメータで新しいルールを作成してから、古いルールを削除する必要があります。

  • Service accounts must be valid RFC 822 email addresses. ファイアウォール ルールで指定するサービス アカウントは、RFC 822 形式のメールアドレスである必要があります。

        gcloud compute firewall-rules create bad --allow tcp --source-service-accounts invalid-email
        

        Creating firewall...failed.
        ERROR: (gcloud.compute.firewall-rules.create) Could not fetch resource:

    • Invalid value for field 'resource.sourceServiceAccounts[0]': 'invalid-email'. Service accounts must be valid RFC 822 email addresses.
  • ServiceAccounts and Tags are mutually exclusive and can't be combined in the same firewall rule. 同じルール内にサービス アカウントとタグの両方を指定することはできません。

        gcloud compute firewall-rules create bad --allow tcp --source-service-accounts test@google.com --target-tags target
        

        Creating firewall...failed.
         ERROR: (gcloud.compute.firewall-rules.create) Could not fetch resource:

    • ServiceAccounts and Tags are mutually exclusive and can't be combined in the same firewall rule.
  • VM インスタンスに接続できない

    VM インスタンスに接続できない場合、ファイアウォール ルールを確認してください。

    1. 別の VM インスタンスから接続を開始する場合は、そのインスタンスの下りファイアウォール ルールを一覧表示します。

          gcloud compute firewall-rules list --filter network=[NETWORK_NAME] \
              --filter EGRESS \
              --sort-by priority \
              --format="table(
                  name,
                  network,
                  direction,
                  priority,
                  sourceRanges.list():label=SRC_RANGES,
                  destinationRanges.list():label=DEST_RANGES,
                  allowed[].map().firewall_rule().list():label=ALLOW,
                  denied[].map().firewall_rule().list():label=DENY,
                  sourceTags.list():label=SRC_TAGS,
                  sourceServiceAccounts.list():label=SRC_SVC_ACCT,
                  targetTags.list():label=TARGET_TAGS,
                  targetServiceAccounts.list():label=TARGET_SVC_ACCT
                  )"
          
    2. 送信先 IP がすべての下り(外向き)ルールによって拒否されているかどうかを確認します。最も高い優先度(優先度の数字が最も小さいもの)を持つルールは、優先度がより低いルールよりも優先されます。同じ優先度を持つ 2 つのルールの場合、拒否ルールのほうが優先されます。

    3. ネットワークの上り(内向き)ファイアウォール ルールに送信先 VM インスタンスが含まれているかどうか確認します。

          gcloud compute firewall-rules list --filter network=[NETWORK_NAME] \
              --filter INGRESS \
              --sort-by priority \
              --format="table(
                  name,
                  network,
                  direction,
                  priority,
                  sourceRanges.list():label=SRC_RANGES,
                  destinationRanges.list():label=DEST_RANGES,
                  allowed[].map().firewall_rule().list():label=ALLOW,
                  denied[].map().firewall_rule().list():label=DENY,
                  sourceTags.list():label=SRC_TAGS,
                  sourceServiceAccounts.list():label=SRC_SVC_ACCT,
                  targetTags.list():label=TARGET_TAGS,
                  targetServiceAccounts.list():label=TARGET_SVC_ACCT
                  )"
          

      出力例。出力は、ファイアウォール ルールのリストによって異なります。

          NAME                    NETWORK  DIRECTION  PRIORITY  SRC_RANGES    DEST_RANGES  ALLOW                         DENY  SRC_TAGS  SRC_SVC_ACCT      TARGET_TAGS  TARGET_SVC_ACCT
          default-allow-icmp      default  INGRESS    65534     0.0.0.0/0                  icmp
          default-allow-internal  default  INGRESS    65534     10.128.0.0/9               tcp:0-65535,udp:0-65535,icmp
          default-allow-rdp       default  INGRESS    65534     0.0.0.0/0                  tcp:3389
          default-allow-ssh       default  INGRESS    65534     0.0.0.0/0                  tcp:22
          firewall-with-sa        default  INGRESS    1000                                 tcp:10000                                     test1@google.com               target@google.com
          

    ファイアウォール ルールの有効 / 無効を確認する

    ファイアウォール ルールの有効 / 無効を確認するには、ファイアウォール ルールの詳細を表示します。

    Google Cloud Console の [適用] に Enabled と表示されているか、Disabled と表示されているかを確認します。

    gcloud コマンドライン ツールの出力で、disabled フィールドを見つけます。disabled:false である場合、ルールは有効で、適用されています。disabled: true である場合、ルールは無効です。

    VM インスタンスに適用されているルールを確認する

    VPC ネットワークに新しいファイアウォール ルールを追加して、10.1.2.3 にあるデータベース サーバーへの tcp:1433 経由のトラフィックを許可するとします。ルールを作成したら、そのルールが特定のインスタンスに正しく適用されているかどうかを確認できます。詳細については、VM インスタンスのネットワーク インターフェースのファイアウォール ルールを一覧表示するをご覧ください。

    次に示すコンソールの例では、[下り分析] タブにこの VM インスタンスの database-access ルールが一覧表示されており、10.1.2.3 の下り(外向き)トラフィックがポート 1433 で許可されていることがわかります。範囲 10.1.0.0/16 のその他の下り(外向き)トラフィックは、deny-database-subnet ファイアウォール ルールによりブロックされます。

    VM インスタンスで許可されている下り(外向き)トラフィック(クリックして拡大)
    VM インスタンスで許可されている下り(外向き)トラフィック(クリックして拡大)

    ソースタグ付きのファイアウォール ルールがすぐに適用されない

    ソースタグを使用する上り(内向き)ファイアウォール ルールが反映されるまで、時間がかかることがあります。詳しくは、上り(内向き)ファイアウォール ルールのソースタグに関する考慮事項をご覧ください。

    次のステップ