# GCP - VPC & Networking

{{#include ../../../../banners/hacktricks-training.md}}

## **GCPコンピュートネットワーキングの概要**

**VPC**は、VPCへの着信トラフィックを許可する**ファイアウォール**ルールを含みます。VPCはまた、**仮想マシン**が**接続**される**サブネットワーク**を含みます。\
AWSと比較すると、**ファイアウォール**は**AWS**の**セキュリティグループとNACL**に最も近いものですが、この場合、これらは各インスタンスではなく**VPC内で定義**されています。

## **GCPのVPC、サブネットワークおよびファイアウォール**

コンピュートインスタンスは、**VPC**の一部である**サブネットワーク**に接続されています（[Virtual Private Clouds](https://cloud.google.com/vpc/docs/vpc)）。GCPにはセキュリティグループはなく、[**VPCファイアウォール**](https://cloud.google.com/vpc/docs/firewalls)があり、これらのルールはこのネットワークレベルで定義され、各VMインスタンスに適用されます。

### サブネットワーク

**VPC**は**複数のサブネットワーク**を持つことができます。各**サブネットワークは1つのリージョン**にあります。

### ファイアウォール

デフォルトでは、すべてのネットワークには2つの[**暗黙のファイアウォールルール**](https://cloud.google.com/vpc/docs/firewalls#default_firewall_rules)があります：**アウトバウンドを許可**し、**インバウンドを拒否**します。

GCPプロジェクトが作成されると、**`default`**というVPCも作成され、以下のファイアウォールルールが設定されます：

- **default-allow-internal:** `default`ネットワーク上の他のインスタンスからのすべてのトラフィックを許可
- **default-allow-ssh:** どこからでも22を許可
- **default-allow-rdp:** どこからでも3389を許可
- **default-allow-icmp:** どこからでもpingを許可

> [!WARNING]
> ご覧のとおり、**ファイアウォールルール**は**内部IPアドレス**に対して**より許可的**になる傾向があります。デフォルトのVPCは、コンピュートインスタンス間のすべてのトラフィックを許可します。

デフォルトのVPCまたは新しいVPCのために、さらに**ファイアウォールルール**を作成できます。[**ファイアウォールルール**](https://cloud.google.com/vpc/docs/firewalls)は、以下の**方法**でインスタンスに適用できます：

- [**ネットワークタグ**](https://cloud.google.com/vpc/docs/add-remove-network-tags)
- [**サービスアカウント**](https://cloud.google.com/vpc/docs/firewalls#serviceaccounts)
- **VPC内のすべてのインスタンス**

残念ながら、インターネット上のオープンポートを持つすべてのコンピュートインスタンスを出力する簡単な`gcloud`コマンドはありません。ファイアウォールルール、ネットワークタグ、サービスアカウント、およびインスタンスの間の関連をつなぐ必要があります。

このプロセスは、[このpythonスクリプト](https://gitlab.com/gitlab-com/gl-security/gl-redteam/gcp_firewall_enum)を使用して自動化され、以下をエクスポートします：

- インスタンス、パブリックIP、許可されたTCP、許可されたUDPを示すCSVファイル
- パブリックインターネットから許可されたポートでターゲットとするすべてのインスタンスへのnmapスキャン（0.0.0.0/0）
- パブリックインターネットからすべてのTCPポートを許可するインスタンスのTCP範囲全体をターゲットとするmasscan（0.0.0.0/0）

### 階層的ファイアウォールポリシー <a href="#hierarchical-firewall-policies" id="hierarchical-firewall-policies"></a>

_階層的ファイアウォールポリシー_を使用すると、**組織全体で一貫したファイアウォールポリシーを作成および適用**できます。**階層的ファイアウォールポリシーを組織全体または個々の**フォルダーに割り当てることができます。これらのポリシーには、接続を明示的に拒否または許可するルールが含まれています。

ファイアウォールポリシーは、別々のステップとして作成および適用します。ファイアウォールポリシーは、[**リソース階層**](https://cloud.google.com/resource-manager/docs/cloud-platform-resource-hierarchy)の**組織またはフォルダーノード**で作成および適用できます。ファイアウォールポリシールールは、**接続をブロック、接続を許可、またはファイアウォールルールの評価を下位フォルダーまたはVPCネットワークで定義されたVPCファイアウォールルールに委任**できます。

デフォルトでは、すべての階層的ファイアウォールポリシールールは、ポリシーが関連付けられている組織またはフォルダーのすべてのプロジェクト内のすべてのVMに適用されます。ただし、[ターゲットネットワークまたはターゲットサービスアカウント](https://cloud.google.com/vpc/docs/firewall-policies#targets)を指定することで、特定のルールを受け取るVMを**制限**できます。

ここで、[**階層的ファイアウォールポリシーを作成する方法**](https://cloud.google.com/vpc/docs/using-firewall-policies#gcloud)を読むことができます。

### ファイアウォールルールの評価

<figure><img src="../../../../images/image (2) (1) (1).png" alt=""><figcaption></figcaption></figure>

1. Org: 組織に割り当てられたファイアウォールポリシー
2. フォルダー: フォルダーに割り当てられたファイアウォールポリシー
3. VPC: VPCに割り当てられたファイアウォールルール
4. グローバル: VPCに割り当てることができる別のタイプのファイアウォールルール
5. リージョナル: VMのNICおよびVMのリージョンに関連付けられたVPCネットワークのファイアウォールルール。

## VPCネットワークピアリング

2つの仮想プライベートクラウド（VPC）ネットワークを接続し、**各ネットワーク内のリソースが互いに通信できる**ようにします。\
ピアリングされたVPCネットワークは、同じプロジェクト内、同じ組織の異なるプロジェクト、または**異なる組織の異なるプロジェクト**に存在できます。

必要な権限は次のとおりです：

- `compute.networks.addPeering`
- `compute.networks.updatePeering`
- `compute.networks.removePeering`
- `compute.networks.listPeeringRoutes`

[**ドキュメントでの詳細**](https://cloud.google.com/vpc/docs/vpc-peering)。

## 参考文献

- [https://about.gitlab.com/blog/2020/02/12/plundering-gcp-escalating-privileges-in-google-cloud-platform/](https://about.gitlab.com/blog/2020/02/12/plundering-gcp-escalating-privileges-in-google-cloud-platform/)
- [https://cloud.google.com/vpc/docs/firewall-policies-overview#rule-evaluation](https://cloud.google.com/vpc/docs/firewall-policies-overview#rule-evaluation)

{{#include ../../../../banners/hacktricks-training.md}}
