Google Cloud Batch で外部からのアクセスを遮断する
Google Cloud データエンジニアのはんざわです。
見落としがちですが、Batch を利用する際には、ネットワークセキュリティに関して注意すべきポイントがあります。
本ブログでは、その注意点と回避方法について紹介したいと思います。
Batch におけるネットワークセキュリティの注意点
Batch では、VPC やサブネットなどの設定項目を明示的に指定しなかった場合、以下の2点の問題が発生します。
- 外部 IP が付与される
default
のネットワークが使用される
試しに、以下のジョブ構成で5分間 Sleep する Batch ジョブを作成し、Compute Engine の様子を確認してみましょう。
{
"taskGroups": [
{
"taskSpec": {
"runnables": [
{
"script": {
"text": "sleep 5m"
}
}
]
}
}
],
"allocationPolicy": {
"location": {
"allowedLocations": [
"regions/asia-northeast1"
]
},
"instances": [
{
"policy": {
"machineType": "e2-micro",
"provisioningModel": "STANDARD"
}
}
],
"serviceAccount": {
"email": "sa-batch@<PROJECT_ID>.iam.gserviceaccount.com"
}
},
"logsPolicy": {
"destination": "CLOUD_LOGGING"
}
}
Compute Engine のコンソールから Batch が作成した VM インスタンスを確認できます。
以下のキャプチャからも分かるとおり、外部 IP が付与され、さらに default
のネットワークが使用されていることが確認できます。
default
のネットワークを使用すると、デフォルトのファイアウォールルールが適用されてしまいます。
デフォルトのファイアウォールルールは、必要以上のポートが広く開放されているため、セキュリティ上のリスクがあります。
加えて、外部 IP も付与されているため、不正アクセスのリスクが高まったり、攻撃の対象となる可能性があります。
さらに、Google Cloud のベストプラクティスでも default
の VPC ネットワークの使用は、非推奨となっています。
対応策
対応策として、VPC やサブネットの設定項目を明示的に指定するようにしましょう。
具体的には、以下の設定項目を埋めることで、セキュリティリスクを低減できます。
{
"network": string, # カスタムモードのVPCネットワーク
"subnetwork": string, # 限定公開のGoogleアクセスを有効にしたサブネット
"noExternalIpAddress": boolean # Trueで外部IPアドレスを持たせない
}
やってみる
ここからは実際にネットワークの設定をした Batch のジョブを作成したいと思います。
今回やりたいことは、以下のとおりです。
- カスタムモードの VPC ネットワークを作成する
- 作成した VPC 内に限定公開の Google アクセスを有効にしたサブネットを作成する
- 作成した VPC とサブネットを指定した上で外部 IP を持たせない Batch のジョブを作成する
事前準備
一部のリソースは、前回までの検証で使用したものを再利用します。
- Batch のジョブを実行するサービスアカウント
1. カスタムモードの VPC ネットワークの作成
以下のコマンドで、カスタムモードの VPC ネットワークを作成します。
gcloud compute networks create vpc-batch \
--subnet-mode=custom
参考
2. 限定公開の Google アクセスを有効にしたサブネットの作成
以下のコマンドで、限定公開の Google アクセスを有効にしたサブネットを作成します。
gcloud compute networks subnets create subnet-batch \
--region=asia-northeast1 \
--network=vpc-batch \
--range=10.10.0.0/24 \
--enable-private-ip-google-access
これにより、このサブネット内のリソースは、外部 IP アドレスを使用せずに Cloud Storage などの他の Google Cloud サービスにアクセスできるようになります。
今回の検証では必須ではありませんが、Batch ジョブなどで他の Google Cloud サービスにアクセスする必要がある場合は、このサブネットを使用してください。
参考
3. Batch
最後に Batch のジョブの定義ファイルを準備します。
上記で作成したジョブ構成とほとんど同じですが、異なる部分だけハイライトしています。
前述したとおり、allocationPolicy.network.networkInterfaces
の項目に必要な情報を入力しています。
{
"taskGroups": [
{
"taskSpec": {
"runnables": [
{
"script": {
"text": "sleep 5m"
}
}
]
}
}
],
"allocationPolicy": {
"location": {
"allowedLocations": [
"regions/asia-northeast1"
]
},
"instances": [
{
"policy": {
"machineType": "e2-micro",
"provisioningModel": "STANDARD"
}
}
],
"serviceAccount": {
"email": "sa-batch@<PROJECT_ID>.iam.gserviceaccount.com"
},
+ "network": {
+ "networkInterfaces": [
+ {
+ "network": "projects/<PROJECT_ID>/global/networks/vpc-batch",
+ "subnetwork": "projects/<PROJECT_ID>/regions/asia-northeast1/subnetworks/subnet-batch",
+ "noExternalIpAddress": true
+ }
+ ]
+ }
},
"logsPolicy": {
"destination": "CLOUD_LOGGING"
}
}
動かしてみる
以下のコマンドで、Batch ジョブを実行します。
gcloud beta batch jobs submit \
--location asia-northeast1 \
--config ./job.json
Batch ジョブの実行中に Compute Engine のコンソールを確認すると、外部 IP がなく先ほど作成した VPC が選択されている VM が確認できました。
このような構成にすることで、よりセキュアな Batch ジョブを実行することが可能です。
まとめ
今回のブログでは、Batch で外部からのアクセスを遮断する方法を紹介しました。
意外と見落としがちな設定ですが、ネットワークセキュリティの観点から非常に重要だと思われます。
Batch を使用する際には、十分気を付けてください。