GCEに外部ネットワークから直接SSH接続する方法を記載します。
通常であれば、鍵がないと言われて接続が拒否されます。
以下にその様子を記載しますが、IPアドレスは*にて隠しています。
#SSH接続
ssh *.*.*.*
#応答
The authenticity of host '*.*.*. (*.*.*.*)' can't be established.
ECDSA key fingerprint is SHA256:8RlBcCe63+hPx1dsHC2AQQZbzksO0cApJbRjOfJwuUo.
Are you sure you want to continue connecting (yes/no/[fingerprint])? y
Please type 'yes', 'no' or the fingerprint: yes
Warning: Permanently added '*.*.*.*' (ECDSA) to the list of known hosts.
:Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
外部からSSHにて接続するために、Linux側にて2つセキュリティを無効にする必要があります。
①firewalldを無効化
#サービスの自動起動を無効
sudo systemctl disable firewalld
#サービスの停止
sudo systemctl stop firewalld
#サービスの停止確認
sudo systemctl disable firewalld
②SELinuxの無効化
※この編集中に誤字があるとサーバが起動しなくなるので注意
#SELinuxの状態確認
getenforce
==>Enforcing(有効状態)
#SELinuxの無効化
sudo vi /etc/selinux/config
SELINUX=disabled
#GCEを再起動
shutdown -r now
#SELINUXの状態確認
getenforce
==> Disabled
さらに、ウェルノウンポート(0-1023)を避けるためサーバ側にてSSH接続ポートを変更します。
今回の場合、33423に変更しています。
#SSHの接続ポート変更
sudo vi /etc/ssh/sshd_config
Port 33423
#設定確認
sudo cat /etc/ssh/sshd_config | grep 33423
==> Port 33423
#サービス再起動
sudo systemctl restart sshd
#SSHの待機ポート確認
sudo systemctl status sshd
==> Server listening on :: port 33423.
次に、外部からサーバに「33423」ポート経由にて接続できるようにVPCのファイアウォールを追加します。
その前に、デフォルトのSSH、のポリシーは無効にしてください。
ポリシー名(default-allow-ssh)
※削除ではなくポリシーの無効化が可能です(ポリシー編集で一番下にある).
ポリシーの作成は前回にて説明したので設定項目のみで割愛させていただきます。
・ポリシー名(ssh33423)
・トラフィックの方向(上り)
・対象(ネットワーク上の全てのインスタンス)
・範囲(指定のIP/全て)
・ポート(TCP/33423)
最後に、接続用の鍵を作成して登録すれば準備完了です。
接続用端末にて以下のコマンドを実行して鍵を作成します。
指定なしだと2048bitですが、セキュリティのため4096bitにしています。
※ユーザ名は適切に変更ください
#鍵の作成
ssh-keygen -t rsa -b 4096 -C "インスタンス内のユーザ名"
==>Generating public/private rsa key pair.
==>Enter file in which to save the key (/home/*****/.ssh/id_rsa):
==>Created directory '/home/***/.ssh'.
Enter passphrase (empty for no passphrase): ※パスなしなのでそのままエンター
Enter same passphrase again: ※パスなしなのでそのままエンター
==>Your identification has been saved in /home/*****/.ssh/id_rsa.
==>Your public key has been saved in /home/*****/.ssh/id_rsa.pub.
==>The key fingerprint is:
==>SHA256:**********************************
==>The key's randomart image is:
+---[RSA 4096]----+
|.*=.+ .oo |
|==.==o E.. |
|*.=+o++.B |
|== +o==O o |
|ooo B.+oS |
|. . + o |
| . |
| |
| |
+----[SHA256]-----+
上記のように表示されていれば、鍵の作成は成功しています。
そのため、以下のように鍵を確認することができます。
ls -a
==> . .. .bash_history .bash_logout .bash_profile .bashrc .config .ssh ssh
ls -l .ssh/
-rw------- 1 ***** 3357 Nov 23 03:33 id_rsa ※プライベート鍵
-rw-r--r-- 1 ***** 726 Nov 23 03:33 id_rsa.pub ※公開鍵
公開鍵の中身を確認してコピーします。
#中身を表示する
cat .ssh/id_rsa.pub
中身をコピーしたら、GCEインスタンスを編集してSSH鍵を登録します。
本来であれば、上記の方法にてGCEの.sshにauthorized_keysが作成されるらしいがされないので全て自分で設定する方法を以下に記載します。
①GCEインスタンスにauthorized_keysを作成する
#ディレクトリ作成
sudo mkdir ~/.ssh
#authorized_keys作成
sudo vi ~/.ssh/authorized_keys
==>ここにid_rsa.pubの中身を貼り付け
#アクセス権変更
sudo chmod 700 ~/.ssh
sudo chmod 600 ~/.ssh/authorized_keys
#権限変更
sudo chown ユーザ名 ~/.ssh
sudo chown ユーザ名:ユーザ名 ~/.ssh
sudo chown ユーザ名 ~/.ssh/authorized_keys
sudo chown ユーザ名:ユーザ名 ~/.ssh/authorized_keys
ファイルをsudomで自作しているので、ログインユーザにroot権限を与えればこの設定は不要かと思います。
②SSHのRSA用接続設定変更
私の環境の場合、PubkeyAuthentication以外は有効になっていた。
#設定ファイル開く
sudo vi /etc/ssh/sshd_config
#設定変更
PubkeyAuthentication yes
PasswordAuthentication no
AuthorizedKeysFile .ssh/authorized_keys
#サービス再起動
sudo systemctl restart sshd
ローカルPCからSSH接続
ssh -i .ssh/id_rsa ユーザ名@外部1IPアドレス -p 33423
これで、SSHにて接続が可能となります。
しかし、なぜSSH鍵が自動反映されないのかはわかりません。
ほかにも同様の記事がありましたが、プロジェクト変えることで直ることもあるそう。
このプロジェクトは、テスト用で色々設定を触っていることも原因かもしれません。
また、原因がわかり次第追記したいと思います。
【参考文献】
https://qiita.com/tab02733/items/f1cbfafd39a06271d7ef
https://jpn.itlibra.com/article?id=21204
https://qiita.com/m1220/items/9dc3856bbcf985577023