はじめに
本記事は、これから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 の無料枠は、90 日間 $300 の無料クレジットとAlways Free(※)があります。
(※)トライアル期間中および期間終了後でも、無料枠内なら課金することなくサービスを使用し続けることができます。なお、無料枠内の利用は本記事執筆時点の内容です。
端的に言うと無料枠内であれば、サービスの変更がされない限り、GCPの仮想マシンインスタンス1台を無料で利用し続けることができます。
Google Compute Engine
GCPには様々なサービスがありますが、AWSのEC2に相当するのがGoogle Compute Engine(以下、GCE)になります。
GCPの無料トライアルに登録
まず、はじめにGCPの無料トライアルに登録します。
GCPを利用するための前提条件は以下になります。
- Googleアカウント
- クレジットカード
準備ができたら、まずはGoogle Cloud Platformにアクセスします。
Googleアカウントでログインします。
GCPの無料トライアルを利用するための情報を入力します。
まず、はじめに、国を選択して同意します。
登録画面に記載がありますが、無料トライアル期間が終了しても、自動的に請求されることはありません。
次に、名前と住所を入力します。
アカウントの種類は、個人の場合「個人」を選択します。
登録完了後、GCPのコンソール画面が表示されます。
プロジェクトの作成
GCPはプロジェクト単位でシステムを管理します。
また、GCPのサービスを利用する際は、はじめにプロジェクトを作成して課金アカウントとの紐付けを行います。
GCPのコンソールから、画面中央のボックスをクリックして、プロジェクトの選択画面を表示します。プロジェクトの選択画面表示後、[新しいプロジェクト]をクリックします。
(※)例として、既に既存のプロジェクトがあり、新規でGCPのプロジェクトを作成する場合の手順になります。
プロジェクト名に任意の名前を入力し、[作成]ボタンをクリックします。
プロジェクト作成後にプロジェクト名と、プロジェクトIDの変更はできません。ご注意ください。
仮想マシンインスタンスの作成
GCPコンソールのナビゲーションメニューをクリックします。コンピューティングから、[Compute Engine]-[VM インスタンス]を選択します。
[作成]ボタンをクリックして、VM インスタンスの作成画面を表示します。
以下の項目を編集します。
-
名前
仮想マシンインスタンスに付与する名前を入力します。ここでは「webserver」と入力しています。 -
リージョン
リージョンは、リソースが存在する物理的な拠点です。各リージョンには、1 つまたは複数のゾーンがあります。たとえば、リージョン us-central1 は米国中部を指し、ゾーン us-central1-a、us-central1-b、us-central1-c、us-central1-f が含まれています。
無料枠内で利用するためには、バージニア州北部を除く米国リージョンを選ぶ必要があります。
本記事執筆時点では、以下の米国リージョンが有ります。本記事では、東京から一番近いus-west1を選択しています。
リージョン名 | リージョンの説明 | 東京からの距離 |
---|---|---|
us-central1 | アイオワ | 9,846 km |
us-west1 | オレゴン | 8,027 km |
us-east1 | サウスカロライナ | 11,185 km |
※距離はGoogle検索より
-
ゾーン
ゾーンはリージョン内の領域になります。選定する際のポイントは、ゾーン毎にプラットフォームの違いがあります。詳細は公式ドキュメントのリージョンとゾーンを参照。本記事では、us-west1-aを選択しています。 -
マシンタイプ
マシンタイプは仮想 CPU(vCPU)数、メモリ、ディスク容量等、仮想マシンインスタンスで利用可能なハードウェアリソースの組み合わせです。詳細は公式ドキュメントのマシンタイプを参照。
無料枠内で利用するためには、f1-micro1台までとなります。
無料枠内で利用できるマシンタイプが変更になりました。無料枠内で利用するためには、E2-microを指定します。詳細は本記事の末尾に追記しています。
- ブートディスク
ストレージもいくつかオプションがあり、SSDなどを選択することができますが、無料枠内で使用する場合は標準永続ディスクを選択します。詳細は公式ドキュメントのストレージ オプションを参照。
標準永続ディスク ストレージは30 GB まで無料枠内なので、デフォルトの10 GBから30 GBに変更します。
- イメージ
公式イメージとして、Linux(RHEL系、Debian系)からWindows Server等様々なイメージが存在します。詳細は公式ドキュメントのイメージを参照。本記事では、デフォルトのdebian-9を選択しています。
無料枠内で利用する場合はプレミアム イメージ以外のイメージを選択しましょう。
Webサーバを公開する場合はファイアウォールの設定が必要ですが、後からでも変更できるので本手順では設定しません。インスタンスの設定に問題がなければ[作成]ボタンをクリックします。
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 認証鍵の公開鍵をコピーして貼り付けて保存します。
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の範囲を限定後、不正アクセスを試みようとしている兆候は発生しなくなりました。
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コンソールのナビゲーションメニューをクリックします。お支払いの[予算とアラート]を選択し、[予算を作成]ボタンをクリックします。
予算名と予算額を入力します。
予算アラートを設定し、[保存]ボタンをクリックします。
Googleアカウントの2 段階認証設定
公式ドキュメントのセキュリティ キーによる Cloud Platform アカウントの保護に書いてある通りに、Googleアカウントに対して2 段階認証設定を行うことで、セキュティを強化できます。
至極当然ですが、Googleアカウントが漏洩すると、やりたい放題何でもできてしまいます。
おすすめはGoogle 認証システムです。Google 認証システムを設定することで、GCPにログインできるのは、Google 認証システムのアプリをインストールしたスマートフォンの持ち主に限定できることができます。また、OTP(ワンタイムパスワード)の一元管理ができるので楽です。
よって、Googleアカウントが漏洩してもGoogle 認証システムでのログインが成功しない限り、GCPへのログインを防ぐことができます。
Google 認証システムのインストール
Google 認証システムのインストールは、公式ドキュメントのGoogle 認証システムのインストールを参照。
2 段階認証設定(Google 認証システム)
Google アカウント画面から、Google へのログインをクリックします。
デフォルトだと2 段階認証プロセスはオフになっているのでクリックします。
[開始]ボタンをクリックします。
Ggooleアカウントのログインを行い、初回のみ電話による 2 段階のモバイル検証プロセスの設定を行います。設定後、2 つ目の手順で[認証システム アプリ]の[設定]をクリックします。
画面の指示に従って登録します。
シークレット ウィンドウなどから、Google Cloud Platform Console にアクセスし、メールアドレスとパスワードを入力します。その後、2 段階認証プロセス画面が表示されればオンになったことが確認できます。
未使用のIPアドレス
公式ドキュメントのGoogle Compute Engine の料金に書いてある通りに、静的外部IPアドレスを予約して未使用の場合、課金されるので気を付けましょう。
おわりに
慎重にやって2~3時間もあれば、無料トライアルの登録~インスタンス作成まで一気にできると思います。初めての場合、不安が多いと思いますが、セキュリティ対策を最低限行えば無料枠内で安全に遊べるでしょう。
また、GCPの魅力はセキュリテイにも力を入れていることです。公式ドキュメントのGoogle インフラストラクチャのセキュリティ設計の概要など、セキュリティに関するドキュメントも充実しているので読んでみるのも面白いです。
慣れてきたらインスタンスの作成や削除をAPIを使ってやれば、もうクラウドエンジニアです。Infrastructure as CodeやDevOpsは、まだ始まったばかりです。
追記
本記事執筆から1年が経過し、無料トライアルが終了しました。
無料トライアル終了後、無料枠で利用を続ける場合は30日以内に有料アカウントへのアップグレードが必要になります。有料アカウントへのアップグレードを行わない場合は、GCP の無料枠に記載がある通りに、トライアルの期間中に作成したリソースは削除されます。
勘違いしやすいですが、有料アカウントへのアップグレードを行うことを条件に、Always Freeの範囲内で使用し続けることができます。
有料アカウントへのアップグレード方法について記載します。
アカウントのアップグレード
GCPのコンソールにログイン後、画面上部に無料トライアル終了の旨、メッセージが出力されていることを確認し、画面上部右上の「アップグレード」をクリックします。
「アカウントのアップグレード」のポップアップが表示されます。再度、「アップグレード」をクリックします。
画面下に「アカウントのアップグレードが完了しました。」のメッセージが出力されます。
GCPコンソールのナビゲーションメニューから、VMインスタンスを選択後、「課金を有効にする」をクリックします。
以上で、アカウントのアップグレードは完了です。ひき続き無料枠で利用できます。VMインスタンスは停止しているだけなので、VMインスタンスを起動すると無料トライアルが切れる前と同じ状態で利用できます。
Cloud Console
Cloud Consoleというアプリをスマートフォン等デバイスにインストールすると便利です。ダッシュボードではGCPのステータスや課金の状態がすぐに確認できます。
Cloud Consoleのアプリからインスタンスを停止することもできます。
追記2
2021年7月21日にGCPから、「[Action Required] To continue receiving your Free Tier discount, upgrade your F1-Micro VM to an E2-Micro VM by September 1, 2021」のタイトルのメールを受信しました。
メールを確認したところ、2021年8月31日以降もF1-microを使用し続ける場合は料金が発生するため、引き続き無料枠を利用し続けたい場合は、マシンタイプをF1-microから、E2-microに変更してくださいという内容でした。以下に、概要及び対応内容について記載します。
F1-Micro VM to an E2-Micro
無料で使用できるインスタンスのマシンタイプがF1-microから、E2-microに変更されました。
そのため、引き続き無料利用枠の割引を受けるためには、マシンタイプをF1-microから、E2-microにアップグレードする必要があります。
E2-microは第2世代VMファミリーの一部になります。安価な汎用仮想マシンの位置付けとなっており、E2ファミリーは標準的なIntel(インテル)およびAMDのCPUをサポートします。具体的には0.25 vCPU(定期的に2 vCPUにバーストする)と1GBのRAMを提供します。
対応として同じマシンを利用したい場合はマシンタイプをF1-microからE2-microにアップグレードするか、もう不要の場合は既存のF1-microインスタンスを停止する必要があります。以下にマシンタイプを変更するためのアップグレード手順について記載します。
※前提条件としてVMインスタンスは停止した状態で行います。
VMインスタンスから対象のインスタンスの名前をクリックします。
画面上部の[編集]ボタンをクリックします。
マシンの構成からシリーズはE2を選択し、マシンタイプはe2-micro(vCPU x 2、メモリ 1 GB) を選択します。
画面下部の[保存]ボタンをクリックします。
上記、設定変更後、インスタンスを起動します。
これでF1-microから、E2-microへのアップグレード作業は完了です。
追記3
ボリュームが多くなったので別記事にしましたが、無料枠を妨げる要因を分析するためのPython toolを作成し、「Python tool ipcheckでNginxのアクセスログからIPアドレスを抽出し、アクセス元のIPアドレスをヒートマップで可視化する」に記載しています。脅威分析などにも使えるのでインテリジェンスとしてご活用いただければ幸いです。
Python toolはipcheckから取得できます。