Linux
セキュリティ
GoogleCloudPlatform
gce

これから始めるGCP(GCE) 安全に無料枠を使い倒せ

はじめに

本記事は、これからGCP(GCE)を始める人を対象とした記事になります。

個人開発や学習等でGCP(GCE)を利用するにあたり、GCP(GCE)の構築手順(VMインスタンス作成〜SSH接続)と、最低限実施しておくとよいセキュリテイ対策についてまとめました。きちんと仕様を理解し、セキュリテイ対策を行った上で、安全に無料枠を利用しましょう。

※本記事の内容は、あくまで考え方の一例であり、必ずしも全ての考え方がシステムに適合したり、ここに書いている内容で満たされている訳ではありません。

Googleのサービス

Googleが提供するサービスは、G SuiteやGoogle Cloud Platformに大別されます。
G SuiteはMicrosoft Office 365ようなうグループウェアになり、本記事では、Google Cloud Platformが提供するGoogle Compute Engineについて記載しています。

Google Cloud Platform

Google Cloud Platform(以下、GCP)は、Googleが提供するパブリッククラウドサービスの総称になります。
Amazon Web Services(以下、AWS)を提供するAmazonや、Microsoft Azure(以下、Azure)を提供するMicrosoftと同じクラウドサービスになります。

これらクラウドサービスは利用するのに基本的に無料枠が用意されており、有料にアップグレードすることでサービスを利用し続けることができるのが特徴です。

Google Cloud Platform の無料枠

Google Cloud Platform の無料枠は、12 か月 $300 の無料クレジットとAlways Free(※)があります。

(※)トライアル期間中および期間終了後でも、無料枠内なら課金することなくサービスを使用し続けることができます。なお、無料枠内の利用は本記事執筆時点の内容です。

端的に言うと無料枠内であれば、サービスの変更がされない限り、GCPの仮想マシンインスタンス1台を無料で利用し続けることができます。

Google Compute Engine

GCPには様々なサービスがありますが、AWSのEC2に相当するのがGoogle Compute Engine(以下、GCE)になります。

GCPの無料トライアルに登録

まず、はじめにGCPの無料トライアルに登録します。
GCPを利用するための前提条件は以下になります。

  • Googleアカウント
  • クレジットカード

準備ができたら、まずはGoogle Cloud Platformにアクセスします。

スクリーンショット 2018-09-25 01.41.32.png

Googleアカウントでログインします。

スクリーンショット 2018-09-25 01.42.03.png

GCPの無料トライアルを利用するための情報を入力します。
まず、はじめに、国を選択して同意します。

登録画面に記載がありますが、無料トライアル期間が終了しても、自動的に請求されることはありません。

スクリーンショット 2018-09-25 01.49.40.png

次に、名前と住所を入力します。

アカウントの種類は、個人の場合「個人」を選択します。

スクリーンショット 2018-09-25 01.51.46.png

登録完了後、GCPのコンソール画面が表示されます。

スクリーンショット 2018-09-25 01.57.20.png

プロジェクトの作成

GCPはプロジェクト単位でシステムを管理します。
また、GCPのサービスを利用する際は、はじめにプロジェクトを作成して課金アカウントとの紐付けを行います。

GCPのコンソールから、画面中央のボックスをクリックして、プロジェクトの選択画面を表示します。プロジェクトの選択画面表示後、[新しいプロジェクト]をクリックします。

スクリーンショット 2018-09-25 02.06.14.png

(※)例として、既に既存のプロジェクトがあり、新規でGCPのプロジェクトを作成する場合の手順になります。

プロジェクト名に任意の名前を入力し、[作成]ボタンをクリックします。

スクリーンショット 2018-09-25 02.06.29.png

プロジェクト作成後にプロジェクト名と、プロジェクトIDの変更はできません。ご注意ください。

仮想マシンインスタンスの作成

GCPコンソールのナビゲーションメニューをクリックします。コンピューティングから、[Compute Engine]-[VM インスタンス]を選択します。

スクリーンショット 2018-09-25 08.53.17.png

[作成]ボタンをクリックして、VM インスタンスの作成画面を表示します。

スクリーンショット 2018-09-25 08.53.35.png

以下の項目を編集します。

  • 名前
    仮想マシンインスタンスに付与する名前を入力します。ここでは「webserber」と入力しています。

  • リージョン    
    リージョンは、リソースが存在する物理的な拠点です。各リージョンには、1 つまたは複数のゾーンがあります。たとえば、リージョン us-central1 は米国中部を指し、ゾーン us-central1-a、us-central1-b、us-central1-c、us-central1-f が含まれています。

無料枠内で利用するためには、バージニア州北部を除く米国リージョンを選ぶ必要があります。

本記事執筆時点では、以下の米国:flag_us:リージョンが有ります。本記事では、東京:flag_jp:から一番近いus-west1を選択しています。

リージョン名 リージョンの説明 東京からの距離
us-central1 アイオワ 9,846 km
us-west1 オレゴン 8,027 km
us-west1 サウスカロライナ 11,185 km

※距離はGoogle検索より

  • ゾーン
    ゾーンはリージョン内の領域になります。選定する際のポイントは、ゾーン毎にプラットフォームの違いがあります。詳細は公式ドキュメントのリージョンとゾーンを参照。本記事では、us-west1-aを選択しています。

  • マシンタイプ
    マシンタイプは仮想 CPU(vCPU)数、メモリ、ディスク容量等、仮想マシンインスタンスで利用可能なハードウェアリソースの組み合わせです。詳細は公式ドキュメントのマシンタイプを参照。

無料枠内で利用するためには、f1-micro1台までとなります。

  • ブートディスク
    ストレージもいくつかオプションがあり、SSDなどを選択することができますが、無料枠内で使用する場合は標準永続ディスクを選択します。詳細は公式ドキュメントのストレージ オプションを参照。

標準永続ディスク ストレージは30 GB まで無料枠内なので、デフォルトの10 GBから30 GBに変更します。

  • イメージ
    公式イメージとして、Linux(RHEL系、Debian系)からWindows Server等様々なイメージが存在します。詳細は公式ドキュメントのイメージを参照。本記事では、デフォルトのdebian-9を選択しています。

無料枠内で利用する場合はプレミアム イメージ以外のイメージを選択しましょう。

スクリーンショット 2018-09-25 09.29.50.png

Webサーバを公開する場合はファイアウォールの設定が必要ですが、後からでも変更できるので本手順では設定しません。インスタンスの設定に問題がなければ[作成]ボタンをクリックします。

スクリーンショット 2018-09-25 09.29.59.png

SSH接続確認

仮想マシンインスタンス(以下、インスタンス)作成後、SSH接続を行いログインできることを確認します。
また、インスタンスの接続方法は、Google Cloud Platform Console または gcloud コマンドライン ツールを使用して接続することができます。

本記事では、Linuxのインスタンスに対して、MacのターミナルからSSH接続する手順になります。ちなみに、gcloud コマンドライン ツールの特徴は、SDKをインストールする必要がありますが、IPアドレス指定を必要としないでインスタンス名で接続することができます。Google Cloud Platform Consoleの場合はSDKを必要としないので、ブラウザから接続ができます。

# gcloud compute ssh インスタンス名

gcloud コマンドライン ツールはインスタンス名で接続ができるので、IPアドレスを固定していない環境だと運用が楽です。

SSH 認証鍵の設定

SSH 認証鍵を作成し、GCPのコンソールで公開 SSH 認証鍵のメタデータを編集することによって、Linux インスタンスへSSHログインできるように設定します。詳細は公式ドキュメントのメタデータでの SSH 認証鍵の管理を参照。

SSH 認証鍵の作成

  • 以下のコマンドを実行し、新しいSSH 認証鍵を作成する
    $ ssh-keygen -t rsa -f ~/.ssh/my-ssh-key -C ユーザー名

※本記事では例としてSSH 認証鍵をmy-ssh-keyとしている

  • 以下のコマンドを実行し、秘密鍵の権限を読み取り専用にする
    $ chmod 400 ~/.ssh/my-ssh-key

公開鍵の登録

  • 以下のコマンドを実行し、SSH 認証鍵の公開鍵を出力する
    $ cat ~/.ssh/my-ssh-key.pub

GCPコンソールのナビゲーションメニューをクリックします。コンピューティングから、[Compute Engine]-[VMインスタンス]を選択します。そして、設定するインスタンスを選択し、[編集]ボタンをクリックします。

先ほど作成したSSH 認証鍵の公開鍵をコピーして貼り付けて保存します。

スクリーンショット 2018-10-02 23.34.01.png

SSHのポート番号変更及びファイアーウォール ルール設定

インスタンス作成後、認証ログを確認すると、すぐに外国から不正アクセスを試みようとしている兆候が確認できました。

$ cat /var/log/auth.log | grep sshd
Sep 25 00:30:22 webserver sshd[692]: Server listening on 0.0.0.0 port 22.
Sep 25 00:30:22 webserver sshd[692]: Server listening on :: port 22.
Sep 25 00:36:39 webserver sshd[757]: Connection closed by 54.38.240.250 port 37596 [preauth]
Sep 25 00:48:45 webserver sshd[822]: Invalid user ftp from 195.50.5.30 port 53050
Sep 25 00:48:45 webserver sshd[822]: input_userauth_request: invalid user ftp [preauth]
Sep 25 00:48:45 webserver sshd[822]: Connection closed by 195.50.5.30 port 53050 [preauth]
Sep 25 00:58:43 webserver sshd[896]: Connection closed by 5.39.77.131 port 37428 [preauth]


Sep 25 01:01:01 webserver sshd[911]: Connection closed by 92.238.55.31 port 46940 [preauth]
Sep 25 01:01:47 webserver sshd[919]: Connection closed by 92.238.55.31 port 47690 [preauth]

Sep 25 01:06:25 webserver sshd[977]: Connection closed by 118.25.45.196 port 48778 [preauth]
Sep 25 01:22:19 webserver sshd[1093]: Connection closed by 18.144.67.59 port 50210 [preauth]
Sep 25 01:22:27 webserver sshd[1095]: Unable to negotiate with 18.144.67.59 port 60026: no matching host key type found. Their offer: ecdsa-sha2-nistp384 [preauth]
Sep 25 01:22:39 webserver sshd[1098]: Unable to negotiate with 18.144.67.59 port 47974: no matching host key type found. Their offer: ecdsa-sha2-nistp521 [preauth]
Sep 25 01:22:54 webserver sshd[1100]: Connection closed by 18.144.67.59 port 35310 [preauth]
Sep 25 01:23:03 webserver sshd[1102]: Unable to negotiate with 18.144.67.59 port 45398: no matching host key type found. Their offer: ssh-dss [preauth]

Sep 25 01:26:51 webserver sshd[1127]: Invalid user mc from 195.50.5.30 port 40116
Sep 25 01:26:51 webserver sshd[1127]: input_userauth_request: invalid user mc [preauth]
Sep 25 01:26:51 webserver sshd[1127]: Connection closed by 195.50.5.30 port 40116 [preauth]

Sep 25 02:05:02 webserver sshd[1404]: Invalid user celery from 195.50.5.30 port 55410
Sep 25 02:05:02 webserver sshd[1404]: input_userauth_request: invalid user celery [preauth]
Sep 25 02:05:02 webserver sshd[1404]: Connection closed by 195.50.5.30 port 55410 [preauth]

そのため、SSHのデフォルトポート番号を22以外のポートに変更します。

sshd.confの設定

  • 以下のコマンドを実行し、設定ファイルをバックアップする
    $ sudo cp -p /etc/ssh/sshd_config /etc/ssh/sshd_config.org

  • 以下のコマンドを実行し、ポート番号を変更する
    $ sudo sed -i -e "s/#Port 22/Port 変更したいポート番号/g" /etc/ssh/sshd_config

ファイアーウォール ルールの設定

SSHのポート番号変更に合わせて、ファイアーウォール ルールを設定します。

GCPコンソールのナビゲーションメニューをクリックします。コンピューティングから、[Compute Engine]-[VMインスタンス]を選択します。そして、設定するインスタンスを選択し、[ネットワーク詳細の表示]ボタンをクリックします。

[ファイアーウォール ルール]-[default-allow-ssh]を選択し、変更したポート番号を入力し最後に[保存]ボタンをクリックします。

また、SSHの場合信頼できるネットワークからのみ、ソースIPの範囲を限定することでセキュリテイがより強化されます。SSHのポート番号変更及びソースIPの範囲を限定後、不正アクセスを試みようとしている兆候は発生しなくなりました。

スクリーンショット 2018-09-25 11.32.45.png

SSH設定後サーバにログインするときは以下のコマンドを実行します。

$ ssh 外部IP -i ~/.ssh/my-ssh-key -p 変更後のポート番号

※ユーザーを指定する場合はユーザーを指定すること
※本記事では例としてSSH 認証鍵をmy-ssh-keyとしている

時刻同期設定

インスタンスの時刻設定はUTCになっているため、日本時間と差が発生しています。
debian-9を例に、日本時間の時刻同期設定手順を以下に記載します。

  • 以下のコマンドを実行し、dbusパッケージをインストールする
    $ sudo apt-get install dbus

  • 以下のコマンドを実行し、タイムゾーンをアジア(東京)に設定する
    $ sudo timedatectl set-timezone Asia/Tokyo

請求アラートの設定

請求発生時のアラートを検知するために、請求アラートを設定します。

GCPコンソールのナビゲーションメニューをクリックします。お支払いの[予算とアラート]を選択し、[予算を作成]ボタンをクリックします。

スクリーンショット 2018-09-25 09.44.26.png

予算名と予算額を入力します。

スクリーンショット 2018-09-25 09.46.46.png

予算アラートを設定し、[保存]ボタンをクリックします。

スクリーンショット 2018-09-25 09.47.52.png

Googleアカウントの2 段階認証設定

公式ドキュメントのセキュリティ キーによる Cloud Platform アカウントの保護に書いてある通りに、Googleアカウントに対して2 段階認証設定を行うことで、セキュティを強化できます。

至極当然ですが、Googleアカウントが漏洩すると、やりたい放題何でもできてしまいます。

おすすめはGoogle 認証システムです。Google 認証システムを設定することで、GCPにログインできるのは、Google 認証システムのアプリをインストールしたスマートフォンの持ち主に限定できることができます。また、OTP(ワンタイムパスワード)の一元管理ができるので楽です。

よって、Googleアカウントが漏洩してもGoogle 認証システムでのログインが成功しない限り、GCPへのログインを防ぐことができます。

Google 認証システムのインストール

Google 認証システムのインストールは、公式ドキュメントのGoogle 認証システムのインストールを参照。

2 段階認証設定(Google 認証システム)

Google アカウント画面から、Google へのログインをクリックします。

スクリーンショット 2018-10-02 23.37.38.png

デフォルトだと2 段階認証プロセスはオフになっているのでクリックします。

スクリーンショット 2018-10-02 23.38.11.png

[開始]ボタンをクリックします。

スクリーンショット 2018-10-02 23.38.26.png

Ggooleアカウントのログインを行い、初回のみ電話による 2 段階のモバイル検証プロセスの設定を行います。設定後、2 つ目の手順で[認証システム アプリ]の[設定]をクリックします。

スクリーンショット 2018-10-02 23.48.18.png

画面の指示に従って登録します。

スクリーンショット 2018-10-02 23.58.55.png

シークレット ウィンドウなどから、Google Cloud Platform Console にアクセスし、メールアドレスとパスワードを入力します。その後、2 段階認証プロセス画面が表示されればオンになったことが確認できます。

スクリーンショット 2018-10-03 00.34.25.png

未使用のIPアドレス

公式ドキュメントのGoogle Compute Engine の料金に書いてある通りに、静的外部IPアドレスを予約して未使用の場合、課金されるので気を付けましょう。

おわりに

慎重にやって2~3時間もあれば、無料トライアルの登録~インスタンス作成まで一気にできると思います。初めての場合、不安が多いと思いますが、セキュリティ対策を最低限行えば無料枠内で安全に遊べるでしょう。

また、GCPの魅力はセキュリテイにも力を入れていることです。公式ドキュメントのGoogle インフラストラクチャのセキュリティ設計の概要など、セキュリティに関するドキュメントも充実しているので読んでみるのも面白いです。

慣れてきたらインスタンスの作成や削除をAPIを使ってやれば、もうクラウドエンジニアです。Infrastructure as CodeやDevOpsは、まだ始まったばかりです。