Corredor

ウェブ、プログラミングの勉強メモ。

永久無料枠で Google Compute Engine (GCE) インスタンスを立ち上げる : その2

前回、Google Cloud Platform (GCP) に登録し、その中の Google Compute Engine (GCE) というサービスを使い、完全無料で使える仮想マシン (VM) を立ち上げて SSH 接続までこぎつけた。

今回は、立ち上げた VM をより安全に利用するための設定を紹介する。

課金を通知する予算アラートを設定しておく

前回説明したとおり、GCP には無料枠と1年間の無料クレジットがあるし、有料アカウントに手動で移行するまでは課金されない。しかし、万が一のことを考えて、1円でも課金対象が発生したらメール通知が飛ぶよう、アラートを設定しておこう。

左上のハンバーガーメニューを開き、「お支払い」→「予算とアラート」と進み、「予算を作成」ボタンを押下する。

f:id:neos21:20190603220607p:plain

ココで、「予算額」を「\ 1 (1円)」と設定する。予算アラートは 50%・90%・100% いずれも「1円」に設定しておく。

f:id:neos21:20190603220603p:plain

f:id:neos21:20190603220558p:plain

f:id:neos21:20190603220552p:plain

コレで、万が一不意に課金されても、メール通知が飛ぶので、すぐに気付いて対処できるだろう。

VM に割り当てられる Public IP を固定する

VM に割り当てられるデフォルトのパブリック IP は、VM を終了するごとに変動してしまう。コレを、VM を終了しても同じパブリック IP が割り当てられるように設定する。

GCP の管理コンソールより GCE の管理画面に移動したら、当該 VM の編集画面を開き、「ネットワークインターフェス」セクションに移動する。

ココで「外部 IP」のセレクトボックスから「IP アドレスを作成」を選ぶと、静的 IP アドレスを予約でき、それを割り当てられる。

f:id:neos21:20190603222502p:plain

それまでの変動 Public IP (エフェメラル IP) は破棄されているはずだが、余計な課金対象として残らないように、「外部 IP アドレス」画面に未使用の IP が残っていないか確認しておこう。

SSH 接続するためのポートを22番から他のポート番号に変更する

実は、VM を作成すると、その直後から GCP を狙った不正アクセスが世界中から仕掛けられている。VM 内の /var/log/auth.log ファイルを見ると、その形跡が確認できるだろう。

コレは、22番ポートが開いている Public IP を総当たりで調べてきていることによるもの。そこで、GCP のファイアウォール設定を利用して、22番ポートへのアクセス自体を禁止し、SSH 接続する際のポート番号を他のモノに変更してセキュアにしておこう。

ポートを変更する前に SELinux を無効化する

独自のポート番号を使用するためには、SELinux の設定を無効化しておく必要がある。まずは普通に22番ポートで SSH 接続し、以下の設定を行う。

# ファイアウォールを無効化する
$ sudo systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.

# 以下のファイルを編集し SELinux を無効化する
$ sudo vi /etc/selinux/config
# 'SELINUX=enforcing' の行を 'SELINUX=disabled' と変更する

# 設定を確認する
$ sudo systemctl is-enabled firewalld
disabled

$ sudo getenforce
Enforcing

ココで、getenforce コマンドの結果が Disabled ではないことが確認できる。まだ先程の設定変更が反映されていないのだ。変更を反映するには、GCP 管理コンソールより、対象のインスタンスを再起動する必要がある。

インスタンスを再起動した後、再度 SSH 接続してみよう。getenforce コマンドの結果が Disabled になっているはずだ。

$ sudo getenforce
Disabled

SSH 接続に使用するポート番号を変更する

続いて、SSH 接続に使用するポート番号を22番から他の番号に変更する。一般的な1024番未満のポートでなければどの番号でも構わないが、今回は例として10022番ポートを使うことにした。

# ポート番号を変更する
$ sudo vi /etc/ssh/sshd_config
# '#Port 22' のコメント行をアンコメントし 'Port 10022' と変更する

# sshd を再起動する
$ sudo systemctl restart sshd

# 設定を確認・10022ポートをリッスンしていることが分かる
$ systemctl status sshd.service
● sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2019-05-25 12:22:54 UTC; 1min 2s ago
     Docs: man:sshd(8)
           man:sshd_config(5)
 Main PID: 2883 (sshd)
   CGroup: /system.slice/sshd.service
           └─2883 /usr/sbin/sshd -D

May 25 12:22:54 gce systemd[1]: Starting OpenSSH server daemon...
May 25 12:22:54 gce sshd[2883]: Server listening on 0.0.0.0 port 10022.
May 25 12:22:54 gce sshd[2883]: Server listening on :: port 10022.
May 25 12:22:54 gce systemd[1]: Started OpenSSH server daemon.

このあと、GCP のファイアウォール設定を変更するのだが、設定変更が完了するまでは、このターミナルの接続を切断せずに置いておいた方が良い。万が一設定が間違っていた時に、二度と SSH 接続できなくなる恐れがあるためだ。

(といっても、22番ポートを塞ぐと接続中の SSH 接続も切断されてしまうようなのだが、とりあえず気休めで)

GCP のファイアウォール設定を変更する

GCP の管理コンソールを開き、「10022番ポートへのアクセスを許可」するルールと、「22番ポートへのアクセスを禁止」するルールをそれぞれ作成する。

「ネットワーキング」→「ファイアウォールルール」と開くと、22番ポートでの SSH 接続を許可しているルールがあるはずだ。

f:id:neos21:20190603223314p:plain

まずはコレを流用して、10022番ポートへのアクセス許可用ルールに変更しよう。

  • ルール名 : allow-10022 と変更する (命名はデフォルトルールに沿ったモノ)
  • トラフィックの方角 : 上り
  • 一致したときのアクション : 許可
  • ターゲット : 「指定されたターゲットタグ」を選択する
  • ターゲットタグ : allow10022-server と入力する (命名はデフォルトルールに沿ったモノ・このタグが付いている VM にのみ、このファイアウォールルールが適用される)
  • ソース IP の種類 : 0.0.0.0/0 (全ての IP からのアクセスを許可する)
  • プロトコルとポート : 「指定したプロトコルとポート」を選択し、tcp:10022 と入力する
    • ココで、tcp:22,10022 と入力すると、22番ポートでも10022番ポートでも SSH 接続できる状態になる。一度このような設定で SSH 接続確認しても良いかも

f:id:neos21:20190603223303p:plain

以上のように設定することで、10022番ポートでの SSH 接続を許可するルールができた。

続いて「22番ポートへの接続を許可しないためのルールを作る。新たなルールを作り、以下のように設定する。

  • ルール名 : disallow-22
  • トラフィックの方角 : 上り
  • 一致したときのアクション : 拒否
  • ターゲット : 「指定されたターゲットタグ」を選択する
  • ターゲットタグ : disallow22-server
  • ソース IP の種類 : 0.0.0.0/0
  • プロトコルとポート : 「指定したプロトコルとポート」を選択し、tcp:22 と入力する

f:id:neos21:20190603223252p:plain

2つのファイアウォールルールを作った状態。

f:id:neos21:20190603223246p:plain

そしたら、GCE インスタンスの編集画面に移動する。

編集画面の中に「ネットワークタグ」を指定できる欄があるので、ココに、先程作ったファイアウォールルールの「ターゲットタグ」である、

  • allow10022-server
  • disallow22-server

の2つを入力する。

f:id:neos21:20190603223239p:plain

コレでファイアウォールルール自体の定義と、それを VM に適用するための設定ができた。

変更後のポート番号で SSH 接続する

恐らくこの設定中に、22番ポートで接続中のターミナルの接続は遮断されてしまうと思うが、VM 側の設定がうまく行っていない場合はこのターミナルで引き続き作業したいので、このターミナルウィンドウは触れずに置いておく。

別のターミナルウィンドウを開き、変更後のポート番号を指定して SSH 接続してみる。

# ポート番号を指定して SSH 接続する
$ ssh -i ~/.ssh/my_gce_vm -p 【ポート番号】 【VM 名】@【Public IP】

# 10022番ポートに変更した場合の例
$ ssh -i ~/.ssh/my_gce_vm -p 10022 neosvm@38.154.10.0

コレで接続できれば、allow-10022 というファイアウォールルールが正常に働いていることが分かる。

ついでに、また別ターミナルを開いて、-p 10022 部分を削るか -p 22 と書き直し、22番ポートで SSH 接続してみよう。恐らくどれだけ待っても応答がなく、タイムアウトになると思われる。コレが、disallow-22 というファイアウォールルールが効いている証拠となる。

以上

コレで GCP の登録と、永久無料枠の GCE を使った VM インスタンスの環境構築が出来上がった。後はこの VM で自前の Web サーバを立ててみてもよし、別のインスタンスへの踏み台サーバとしてもよし。無料枠の中でも色々な使い方ができると思うので、お遊び用に作っておくと良いだろう。

プログラマのためのGoogle Cloud Platform入門 サービスの全体像からクラウドネイティブアプリケーション構築まで

プログラマのためのGoogle Cloud Platform入門 サービスの全体像からクラウドネイティブアプリケーション構築まで

Google Compute Engine入門

Google Compute Engine入門