2017年3月にGoogle Cloud Platform (GCP) の価格改定があり、無料枠 (Always Free Products)も強化されました。その中でも、Google Compute Engine (GCE) の無料化が個人的には一番ビックリしました。無料の対象はUSリージョンのf1-microインスタンス1個だけですが、ずっと無料でインスタンスを提供する、というのは他のクラウド事業者と比べても大盤振る舞いと言えるのではないでしょうか。

無料のはずのGCEでなぜか課金されているのに気づいた

そんなわけで筆者はus-westリージョンにf1-microインスタンスを立ててみました。SSHログインしてシェル上でコマンド操作をする程度であればネットワークレイテンシはそれほど気になりません。また、HDDも30GB使えますので、ちょっとした確認・実験用環境としては十分実用的です。

この環境が無料で使えるのは助かるなぁ、と思っていたのですが、数日後にGCPのWebコンソールを確認してみると下記のように料金が発生していることに気づきました。

billing.png

実はGCEのインターネット外向き通信の料金は次のようになっています。

送信先 単価 無料枠
中国 $0.23/GB なし
オーストラリア $0.19/GB なし
それ以外 $0.12/GB 1GB

USから中国・オーストラリア以外への外向き通信には1GBの無料枠があるのですが、中国・オーストラリア宛の外向き通信は1バイト目から料金が発生することになります。上の画像は中国への外向き通信が0.02円(約1MB)発生したことを示しています。

課金の原因はなんとSSH総当たり攻撃

しかし、今回のインスタンスはWebサーバやその他のサービスを動かしているわけではありません。このマシンで唯一listenしているポートはSSHの22番ポートで、それ以外のポートはGCEのファイアウォール機能でパケットフィルタリングされています。

つまり、課金の原因となった通信は攻撃者によるSSHログイン試行以外に考えられません。実際、ログを確認してみると世界中からのSSHログイン失敗のログが残されていました。

課金を防ぐには

自分のせいじゃないのに課金されるなんてひどい!とも思いましたが、GCP全体としても攻撃者によるネットワークトラフィックにお金を払っているわけですから、GCPの課金体系は十分理解できます。

とはいえ、自分に何のメリットもない攻撃のせいで課金されるのは悔しいですよね。そこで我々にできることはネットワークトラフィックを減らすことです。攻撃者からの通信に対して何のパケットも返さなければ完全に0円です(補足:GCEのインターネット内向き通信は無料です)。

これをほぼ完璧に実現する方法がポートノッキングです。攻撃者がポートノッキングのルールを知らない限り1パケットも返事をせず、それでいてルールを知っていれば普通にSSH通信できるので、今回の条件に非常に合っています。詳細な設定方法などは次の記事で紹介しています。

実際、筆者はこの設定をしてから「Network Internet Egress」(外向き通信)で全く課金されていません。セキュリティ以外の目的でポートノッキングが使えるよ、というのは少し面白い発見のような気がします。

これ以外の方法でも、攻撃者に1パケットも返さない方法であれば目的は達成できるはずです。

そもそも頑張って0.00円にする必要性があるのか

今回、課金を防ぐためにネットワークトラフィックを減らしてみたわけですが、実際のところそこまで頑張る意味はほとんどないと思います。攻撃が原因のネットワークトラフィックは1日に1MB程度のようですから、1ヶ月続いたとしても0.6円程度です。攻撃が激化したとしても金額面ではたかが知れています。

また、筆者は先月分で0.05円ほど課金されている認識でしたが、いまのところ請求は来ていません。1円未満の端数はGoogleさんが負担してくれるのかもしれませんね。だとしたら、特に対策をしなくても結局タダなのかもしれません。

まとめ

  • 2017年3月からGCEのf1-microインスタンス1個が原則無料になりました(USリージョンのみ)
  • ただし、中国・オーストラリア宛のインターネット下り通信だけは無料枠がありません
    • 1パケットも返さないように設定できれば完全無料が達成できます
    • 特に対策しなくても1円も請求が来ないかもしれません