GCEにSSHで接続する

GCPで作成したGCEにSSHで接続する方法を記載します。

SSHで接続する対象のGCEは[GCEとは　～GCP無料枠を利用して学習～](https://qiita.com/hollyhock-s/items/92d3ba4b5ff623dca5c4)で作成したものになります。
※ディスクイメージにCentOS 7を使用しているため、別途必要な作業が発生します。

また、SSHはデフォルトでTCP22番ポートが利用されますが、これが攻撃の対象となってしまいますので、利用するポート番号の変更も併せて実施します。

# Cloud Shell
Cloud ShellとはGoogleが提供するGCP専用のWebコンソールの中で利用できるツールのことです。
ブラウザ上のコマンド端末からGCPのプロジェクトやリソースの管理や操作が可能です。

[Cloud Shellの起動](https://cloud.google.com/shell/docs/starting-cloud-shell?hl=ja)

コンソール画面からCloud Shellを開きます。
コンソール画面の右上のアイコンをクリックすると、画面下部にターミナルが表示されます。

![ホーム – trial – Google Cloud Platform - Google Chrome 2019_08_30 23_05_05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439091/aa13e22d-9189-5c73-2a7a-6cbb7ebca669.jpeg)


コンソール画面から「Copmpute Engine」>「VMインスタンス」をクリックします。
接続したいGCEの「SSH」の横にある「▼」をクリックし、「gcloudコマンドを表示」をクリックします。

![Compute Engine - trial - Google Cloud Platform - Google Chrome 2019_08_29 22_24_33_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439091/c07b4814-1bd4-9fab-465a-7a10617caad7.jpeg)


表示されたgloudコマンドを先程のCloud Shellで実行します。
または「gcloudコマンドを表示」をクリックした後の画面より「CLOUD SHELLで実行する」をクリックすると接続できます。


![Compute Engine - trial - Google Cloud Platform - Google Chrome 2019_08_29 22_57_08.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439091/ebbc8ae7-7450-41ae-d3db-b8021f445aa2.jpeg)


なお、後述するSSHのポート設定の変更を実施した場合は、gloudコマンドに以下オプションを追加します。

```
--ssh-flag="-p ポート番号"
```


# ブラウザウィンドウ
ウェブブラウザの拡張機能や追加のソフトウェアをインストールなしで利用できます。

[ブラウザからのSSH](https://cloud.google.com/compute/docs/ssh-in-browser?hl=ja)

コンソール画面から「Copmpute Engine」>「VMインスタンス」をクリックします。
接続したいGCEの「SSH」横にある「▼」をクリックし、「ブラウザウィンドウで開く」をクリックします。

![Compute Engine - trial - Google Cloud Platform - Google Chrome 2019_08_29 22_24_33_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439091/bace92c3-4ec2-cc5b-3288-a945934b90ef.jpeg)

SSHのポート設定を変更した場合は「ブラウザウィンドウでカスタムポートを開く」をクリックし、設定したポートを入力して「開く」をクリックします。

![Compute Engine - trial - Google Cloud Platform - Google Chrome 2019_08_29 22_45_42.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439091/0578b72f-fea0-8f8d-f119-68edc1e0169c.jpeg)


# ローカル環境からSSH

ローカルのPCからターミナルを使用して接続します。
SSH接続の設定を実行するにあたって、以下を条件としています。

　・SSHのポートをデフォルト以外に設定
　・公開鍵/秘密鍵による認証

実際の設定作業は以下の通りになります。

　1.公開鍵をGCEにアップロード
　2.変更予定のSSHポートに対するファイアウォールの通信許可設定追加
　※firewalldとSELINUXを無効化(CentOS利用時)
　3.GCEのSSHポート設定変更



### 1.公開鍵をGCEにアップロード

SSH接続を実現するための秘密鍵/公開鍵を作成します。
下記コマンドを実行して作成される"id_rsa"が秘密鍵、"id_rsa.pub"が公開鍵の鍵ファイルです。

```
$ mkdir ~/.ssh
$ cd ~/.ssh
$ ssh-keygen -t rsa -C "ユーザー名"
$ ls ~/.ssh/
config  id_rsa  id_rsa.pub  known_hosts
```

GCPのコンソール画面から「Copmpute Engine」>「メタデータ」をクリックします。
「SSH認証鍵」をクリックすると現在GCPに登録されている認証鍵の一覧が表示されます。
「+項目を追加」をクリックし、先程作成した公開鍵の内容をテキストボックスにコピーして「保存」をクリックします。

![Compute Engine - trial - Google Cloud Platform - Google Chrome 2019_08_29 23_55_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439091/5be43e66-1efb-98c2-3037-642ee30c3b4f.jpeg)


上述のCloud ShellまたはブラウザウィンドウからGCEに接続し、ユーザーディレクトリ配下に"authorized_keys"の鍵ファイルが作成されていることを確認します。
また、ユーザーディレクトリと各鍵ファイルの権限がそれぞれ700、600であることも確認します。
想定と異なった権限であれば変更します。

```
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/鍵ファイル
```

ローカルのターミナルからSSHで接続します。

```
ssh ユーザー名@インスタンス外部IPアドレス -i 秘密鍵のパス
```


### 2.変更予定のSSHポートに対するファイアウォールの通信許可設定追加

GCPのコンソール画面から「VPCネットワーク」>「ファイアウォールルール」をクリックします、「ファイアウォールルールを作成」をクリックします。


必要事項を入力していき、「ターゲットタグ」を入力します。
ここで設定したターゲットタグをGCEに設定することで、ファイアウォールルールが適用されます。
「プロトコルとポート」で変更するポート番号を入力します。
1～1024のウェルノウンポート以外を入力してください。
また、予測されやすい2222などは避けたほうが良いようです。
「作成」をクリックして新しくファイアウォールルールが作成されたこと確認します。

![VPC ネットワーク - trial - Google Cloud Platform - Google Chrome 2019_08_28 23_32_00.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439091/795e877a-6bdf-e01b-a348-583b01397482.jpeg)


コンソール画面から「Copmpute Engine」>「VMインスタンス」をクリックします。
SSH接続する対象のGCEをクリックし、「編集」をクリックします。
「ネットワークタグ」に先程のファイアウォールルール作成時に指定したタグを追加します。
「保存」をクリックします。

![VPC ネットワーク - trial - Google Cloud Platform - Google Chrome 2019_08_28 23_32_00.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439091/6de47a79-1fc5-a0f4-93be-44c980943818.jpeg)

### ※firewalldとSELINUXを無効化

今回、SSH接続の設定を行うGCEはCentOS7を使用しています。
そのため、firewalldとSELINUXを無効化する必要があります。
この設定を行わないとポート変更後にsshdの起動に失敗します。

```
$ systemctl restart sshd.service

Job for sshd.service failed because the control process exited with error code. See "systemctl status sshd.service"
 and "journalctl -xe" for details.

```


**firewalld無効化**

```
#firewalldの無効化
$ systemctl disable firewalld

#firewalldの状態確認
$ systemcctl status firewalld
● firewalld.service - firewalld - dynami firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled★; vendor preset: enabled)
```

**SELINUX無効化**

```
#SELINUXの状態確認（有効）
$ getenforce
Enforcing

#SELINUXの設定ファイルを編集
$ sudo vi /etc/selinux/config

SELINUX=disabled

#GCEを再起動(コンソール画面の■(停止)、▶(開始)ボタンでも可)
$ shutdown -r now

#SELINUXの状態確認（無効）
$ getenforce
Disabled
```

### 3.GCEのSSHポート設定変更

上述のCloud ShellまたはブラウザウィンドウからGCEに接続します。
viで設定ファイルを編集し、ポート番号を任意の番号に設定します。

```
#SSHの設定ファイルを編集
$ vi /etc/ssh/sshd_config

Port ポート番号

#sshdの再起動
$ systemctl restart sshd.service
$ systemctl status sshd.service
```

ローカルのターミナルからオプションで変更したポート番号を指定し、SSHで接続します。

```
ssh ユーザー名@インスタンス外部IPアドレス -i 秘密鍵のパス --ssh-flag="p=ポート番号"
```


以上で、作業完了です。