GAEのファイアウォール設定&検証まとめ

  • このエントリーをはてなブックマークに追加

前回はGAE/ファイアウォール ルールをクラウドコンソールから非常に簡易に設定できることを確認しました。
しかし、実際の運用では検証環境で動作確認をしてから、本番環境にも適用したいですよね!
というわけで今回は gcloud コマンドを使用してコマンドラインからの操作を行います。
gcloud コマンドであればスクリプト化することで検証環境で動作確認したファイルをコピー、設定周りを少し編集するだけで簡単に流用することができ、バッチ化も容易に行えます。
また、今回の検証では下図のように GCE インスタンス2台(AとB)を作成し、GAE アプリケーションのインスタンスの挙動や Stackdriver Logging から結果を確認していきます!!

検証1: default を許可、A の IP アドレスを拒否

検証2: default を拒否、A の IP アドレスを許可

事前準備

  • Cloud SDK のインストール
  • gcloud beta コマンドの有効化
  • GCEインスタンス作成(2台)
  • GAEアプリケーション作成

Cloud SDK のインストール

今回はgcloudコマンドを使用するので、事前にCloud SDKのインストールが必須となります。
インストール詳細はこちらの記事が参考になります。

gcloud beta コマンドの有効化

GAEのファイアウォールルールは2017年9月時点でベータ版のため、インストール直後のgcloud コマンドでは設定することができません。
ベータ版の機能を使う場合、gcloud beta コマンドを有効にしておく必要があります。

# beta 機能の有効化
$ gcloud components install beta
# Cloud SDK のアップデート
$ gcloud components update

コマンド解説
下記6つのコマンドがファイアウォール ルール用のコマンドとして提供されています。

※Google 公式リファレンス

  • gcloud beta app firewall-rules create
  • gcloud beta app firewall-rules describe
  • gcloud beta app firewall-rules list
  • gcloud beta app firewall-rules test-ip
  • gcloud beta app firewall-rules update
  • gcloud beta app firewall-rules delete
サブコマンド名 概要
create 優先度、アクション、IP 範囲、概要を指定してルールを作成します。
describe 優先度を指定して設定されたルールの詳細を表示します。
list ルール設定の一覧を表示します。
test-ip IP アドレスのテストを行います。
update 優先度を指定して、既存のルールのアクション、IP 範囲、概要などを更新します。
default に関してはアクションの更新のみです。
delete 優先度を指定して、既存のルールを削除します。(default 除く)

GCEインスタンス作成

gcloud compute instances create コマンドからインスタンスを作成しました。
curl コマンドを叩くためだけに使用するのでマシンタイプは最小の f1-micro にしました。
IP アドレスはインスタンス作成時にコマンドラインに出力されます。

今回作成したインスタンスの情報はこちらです。

インスタンス名 IP アドレス
instance-a 35.187.194.104
instance-b 35.189.136.246

作成時に使用したスクリプト (gistのページを開きます)

GAEアプリケーション作成

今回はGAE/goでルートにアクセスした場合に hello と返し、Stackdriver Logging にアクセス元の IP アドレスを出力するアプリを作成しました。GAE/go 初心者の方にはこちらの記事がおすすめです!
現在はファイアウォール ルールの設定は行っていないため、全てのアクセスが許可となっています。

先ほど作成した GCE インスタンス2台からアクセスしてログを確認してみます。

アクセスされていることが確認できました。

アプリケーションのソース (gistのページを開きます)

GAEのファイアウォールを実際に検証!

準備が終わったので検証を行います!検証内容は以下のとおりです。

検証1: default を許可、instance-a の IP アドレスを拒否

結果予想

  • instance-a からアクセス
    ログ: IP アドレスの記録なし
    GAEインスタンス: 立ち上がらない
  • instance-b からアクセス
    ログ: IP アドレスの記録あり
    GAEインスタンス: 立ち上がる

検証2: default を拒否、instance-a の IP アドレスを許可

結果予想

  • instance-a からアクセス
    ログ: IP アドレスの記録あり
    GAEインスタンス: 立ち上がる
  • instance-b からアクセス
    ログ: IP アドレスの記録なし
    GAEインスタンス: 立ち上がらない

検証1

firewall-rule を設定します。下記スクリプトを作成し、実行します。
default-allow_instance-a-deny.sh (gistのページを開きます)

#!/bin/sh

# Project set for Cloud SDK
PROJECT_ID=YOUR_PROJECT_ID
gcloud config set project $PROJECT_ID

# default update
gcloud beta app firewall-rules update default \
--action=allow

# instance-a deny
gcloud beta app firewall-rules create 1 \
--action=deny \
--source-range='35.187.194.104' \
--description='default -> allow, instance-a -> deny'

実行結果

$ sh default-allow_instance-a-deny.sh
Updated property [core/project].
Updated [2147483647].
Created [1].

ファイアウォールルールが設定されました。
list コマンドを実行し、正しく設定されているか確認します。

$ gcloud beta app firewall-rules list
PRIORITY    ACTION  SOURCE_RANGE    DESCRIPTION
1           DENY    35.187.194.104  default -> allow, instance-a -> deny
2147483647  ALLOW   *               The default action.

instance-a の IP アドレス(35.187.194.104) が拒否(deny) 、default が許可(allow) となっていることが確認できました。

今回はインスタンスの立ち上がりの挙動も確認したいので、curl コマンドを実行する前に下記コマンドで立ち上がっているインスタンスを削除しておきます。

インスタンスの削除
※ID, SERVICE, VERSION はgcloud app instances list コマンドから確認出来ます。

$ gcloud app instances delete INSTANCE_ID \
--service=INSTANCE_SERVICE --version=INSTANCE_VERSION

正しく削除できていれば、gcloud app instances list コマンドを実行すると “Listed 0 items.” と返ってきます!

それでは実際にアクセスしてみます!

instance-a, instance-b にそれぞれ SSH接続し、
”curl -i https://YOUR_PROJECT_ID.appspot.com/”を実行します。
※-i オプションを付与することでヘッダ情報が出力され、HTTPステータスコードを確認できます。

結果

  • instance-a
    ステータスコード: 403 Forbidden (アクセス禁止)
    インスタンス: 立ち上がらない
    ログ: 記録なし
  • instance-b
    ステータスコード: 200 OK (リクエスト成功)
    インスタンス: 立ち上がる
    ログ: 記録あり

予想どおりの結果となりました!

検証2

下記スクリプトを実行し、ファイアウォールルールを更新します。

default-deny_instance-a-allow.sh (gistのページを開きます)

#!/bin/sh

# Project set for Cloud SDK
PROJECT_ID=YOUR_PROJECT_ID
gcloud config set project $PROJECT_ID

# default update
gcloud beta app firewall-rules update default \
--action=deny

# instance-a allow
gcloud beta app firewall-rules update 1 \
--action=allow \
--source-range='35.187.194.104' \
--description='default -> deny, instance-a -> allow'

実行結果

$ sh default-deny_instance-a-allow.sh
Updated property [core/project].
Updated [2147483647].
Updated [1].

確認

$ gcloud beta app firewall-rules list
PRIORITY    ACTION  SOURCE_RANGE    DESCRIPTION
1           ALLOW   35.187.194.104  default -> deny, instance-a -> allow
2147483647  DENY    *               The default action.

instance-a の IP アドレス(35.187.194.104) が許可(allow) 、default が拒否(deny) となっていることが確認できました。

それではインスタンスを削除してアクセスしてみます!

結果

  • instance-a
    ステータスコード: 200 OK (リクエスト成功)
    インスタンス: 立ち上がる
    ログ: 記録あり
  • instance-b
    ステータスコード: 403 Forbidden (アクセス禁止)
    インスタンス: 立ち上がらない
    ログ: 記録なし

こちらも予想どおりの結果となりました!

まとめ

コマンドラインから gcloud コマンドでファイアウォール ルールを設定することができました!
gcloud コマンドで設定する利点としては、開発環境で設定、検証やチューニングなどを行った状態のものをスクリプトファイルにまとめることで、本番環境の設定を行う際にはスクリプトファイルをコピーし、プロジェクトIDなど本番向けに修正するだけで設定ができてしまいます。
また、クラウドコンソール画面ではクリックミスなどの可能性が考えられますが、スクリプトで実行してしまえばそのような心配もありません!

GAE の料金はインスタンスの起動時間で課金されるため、拒否した IP アドレスからのアクセスでインスタンスが立ち上がらないのは、かなりありがたいですね!
ぜひお試しください!!

ちなみに、default が拒否設定の場合、適切な設定がされていないと GAE アプリケーションで Cron や Taskqueue からアクセスを行いたい場合に弾かれてしまいます。
その場合は、0.1.0.1 (Cron), 0.1.0.2 (Taskqueue) を許可設定にする必要があります。
次回は Cron, Taskqueue からのアクセス時の設定&検証を行います!!

※ 弊社ではクラウドエース(Cloud Ace)というGCPの導入・運用支援サービスを提供しておりますので、ご興味のある方はこちらまでお問い合わせください。
GAEに限らず、あらゆるGCPサービスのサポートが可能です。

  • このエントリーをはてなブックマークに追加

Google のクラウドサービスについてもっと詳しく知りたい、直接話が聞いてみたいという方のために、クラウドエースでは無料相談会を実施しております。お申し込みは下記ボタンより承っておりますので、この機会にぜひ弊社をご利用いただければと思います。

無料相談会のお申込みはこちら