本日も乙

ただの自己満足な備忘録。

GCPにおける踏み台サーバの構築メモ

GCPでNATインスタンスを構築する で書いたように、外部ネットワークへの通信をNATインスタンス経由にする場合、GCEインスタンスにグローバルIPアドレスは付与できないため、踏み台サーバ経由でログインすることになります。

blog.jicoman.info

本記事は踏み台サーバの構築メモと踏み台サーバ経由でGCEインスタンスにログインする方法を紹介します。

踏み台サーバの要件

  • オフィスからのみログインさせる(IPアドレス制限する)
  • デフォルトのポート番号(22)から変更する。今回は 48833 にした

Firewallルールの作成

カスタムポートでSSHログインできるようにFirewallルールを作成します。
初期設定で22番ポートでログインする必要があるため、22番ポートも合わせて許可するようにします。
以下のIPアドレスは例示専用です。

$ gcloud compute firewall-rules create "allow-ssh-bastion" \
    --allow tcp:48833,tcp:22 --target-tags bastion \
    --description "オフィスからSSH接続を許可(踏み台サーバ専用)" \
    --priority=1000 \
    --source-ranges "203.0.113.20/32","203.0.113.21/32" \
    --network=sample

サーバ作成

名前は今回は bastion としました。 OSは何でもいいのですが、今回はCentOS 7にしました。マシンタイプはf1-microと一番小さいものにしました。
gcloud compute ssh コマンドでログインするにあたり、 Compute EngineのAPIアクセスを「読み取り / 書き込み」を許可します。

タグ付け

先程作成したFirewallルールが適用されるよう bastion タグをつけます。

$ gcloud compute instances add-tags bastion --tags bastion

設定

パッケージアップデートします。

% yum makecache
% yum update kubectl \
google-cloud-sdk \
google-cloud-sdk-app-engine-grpc \
google-cloud-sdk-pubsub-emulator \
google-cloud-sdk-app-engine-go \
google-cloud-sdk-datastore-emulator \
google-cloud-sdk-app-engine-python \
google-cloud-sdk-cbt \
google-cloud-sdk-bigtable-emulator \
google-cloud-sdk-datalab \
google-cloud-sdk-app-engine-java

SSHポート番号変更

% diff -u /etc/ssh/sshd_config.orig /etc/ssh/sshd_config
--- /etc/ssh/sshd_config.orig   2018-07-16 22:27:12.725667712 +0000
+++ /etc/ssh/sshd_config        2018-08-02 09:55:54.291169281 +0000
@@ -14,7 +14,7 @@
 # SELinux about this change.
 # semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
 #
-#Port 22
+Port 48833
 #AddressFamily any
 #ListenAddress 0.0.0.0
 #ListenAddress ::
% service sshd restart

踏み台サーバへのログイン

gcloudコマンドでログインする場合、以下のようにログインします。
初回ログインの際に秘密鍵を作成するのですが、パスフレーズを設定した方がセキュアです。

Linux / Mac:

-- 以降にSSHコマンドと同じオプションを指定できます。

$ gcloud compute ssh bastion -- -p 48833
ARNING: The public SSH key file for gcloud does not exist.
WARNING: The private SSH key file for gcloud does not exist.
WARNING: You do not have an SSH key for gcloud.
WARNING: SSH keygen will be executed to generate a key.
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): <パスフレーズを入力>
Enter same passphrase again: <パスフレーズを入力>
Your identification has been saved in /Users/sample_user/.ssh/google_compute_engine.
Your public key has been saved in /Users/sample_user/.ssh/google_compute_engine.pub.
The key fingerprint is:
SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxx sample_user@localhost
The key's randomart image is:
+---[RSA 2048]----+
|                 |
|      .  . .     |
|     . o  + o    |
|      ooo+ +     |
|      +=E+o..    |
|    . +*=*=*     |
|     ooo++O+o .  |
|      .oo=o..+.o |
|       o..+. .+..|
+----[SHA256]-----+
Updating project ssh metadata...⠹Updated [https://www.googleapis.com/compute/v1/projects/sample].
Updating project ssh metadata...done.

Windows:

google-cloud-sdk内部のputty.exeが使われます。-pの代わりに-Pオプションを指定します。

$ gcloud compute ssh bastion -- -P 48833

踏み台経由でLinuxサーバにログインする場合

踏み台サーバにログイン後例えば sample-linux001 というサーバにログインしたい場合は以下のコマンドを実行します。

$ gcloud compute ssh sample-linux001 --internal-ip --zone asia-northeast1-a

踏み台サーバに秘密鍵を作成するよう求められるのでそこでも作成します。
~/.ssh/config やProxyCommandを使って一発で入れる方法を模索中です。。。

踏み台サーバと同じゾーン(asia-northeast1-a)のVMインスタンスの場合は --zone オプションは省略できます。 VMインスタンスの一覧は gcloud compute instances list で確認できます。

踏み台経由でWindowsサーバにログオンする場合

SSHポートフォワーディングで入ります。例としてsample-windows001 というWindowsサーバにログインしたい場合は以下のようにします。これを実行した後、 localhost:13390 でWindowsサーバにRDP接続できるようになります。13390はリッスンするローカルポートなので適当なポート番号です。他のポート番号でもいいのですが、ウェルノウンポート以外にしてください。

Linux / Mac

$ gcloud compute ssh bastion -- -p 48833 \
    -L 13390:sample-windows001:3389

Windows

> gcloud compute ssh bastion -- -P 48833 \
    -L 13390:sample-windows001:3389

最後に

GCPで踏み台サーバの構築と踏み台サーバ経由でVPCネットワーク内部のGCEインスタンスにログインする方法を紹介しました。
gcloud compute ssh コマンドを使った方法だと二回実行する必要があるのと踏み台サーバに秘密鍵が残ってしまうのであまり好手ではありません。 ~/.ssh/config などで一発で入れる方法があれば教えてください。