2023
12.04 Mon.
2023
12.04 Mon.
みなさん、初めまして!
今年の11月中旬に入社した情報システム課の川部 瑠夏(カワベ リュウカ)と申します。
本日はテックブログを新たに開設し「成長記録」としての場を頂いたので、入社してから一ヶ月ほど経過し新たに学んだことや経験したことについてお話しさせて貰おうと思います。僕自身が前職から新天地としてエンジニアへの転職したこともあり、少しでも気になったことや発見したことはこまめに発信できたらと思うので是非お付き合いください。
早速になりますが、今回は僕が入社早々に躓いてしまったSSH接続の設定についてお話しします。
そもそもSSH接続という言葉自体は聞いたことあるなーくらいの認識で、ちょっと独学で勉強したAWSのキーペアなどで使うとかは聞いたことはあるけど詳しくはよくわからないという状態でした。
今回は弊社サービスであるARMAJIRO2の開発サーバーへ自分のPCから疎通確認が取れるまでの流れと、SSH接続・SSHフォワーディングってなに?というのを復習の意を込めてまとめさせていただきます。
ということで、まずはなぜSSH接続をする必要があったのか説明するために弊社の開発サーバーの構成図について軽く触れて行きたいと思います。
こちらの構成図からプライペートサブネットの開発サーバーへ、一旦Bastionサーバ(踏み台サーバーのことをBastionと呼ぶことも知りませんでした。)を経由してSSHフォワーディング機能を使い接続することでセキュリティを担保している形になります。
Bastionサーバに自分のPCの公開鍵を置くことでプライベートサブネットにある開発EC2とRDSにSSHフォワーディングすることができ、その準備として公開鍵の設定や自分のPC側で踏み台へSSH接続するための設定が必要でした。
ではSSHって何。って話をしたいと思います。
SSHとは「Secure Shell」の略で、安全に送受信を行うために通信を暗号化してくれるプロトコル。だそうです。
では、どうやって安全にしてるのか。それに使っているのが公開鍵暗号方式というもので、自分のPCにある秘密鍵とサーバー側の公開鍵を照合してペアの鍵を持っている側からしかわからないよう通信を暗号化し、第三者から覗かれず安全に送受信できる暗号方式とのこと。
元々と知識としてここまではふわっと知っていましたがそもそも鍵の設定とは一体どうやるんだ、と。調べたところSSHキーとなる公開鍵と秘密鍵は自分のPCのコマンドで発行し、目的のサーバーに公開鍵を置かなければいけないそうで。以下のコマンドで設定しました。
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/ユーザー名/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in id_rsa. Your public key has been saved in id_rsa.pub.
こちらで無事コマンドを実行できると、(デフォルト名のままであれば).sshのディレクトリの中にid_rsa(秘密鍵)とid_rsa.pub1(公開鍵)が作成されます。
$ ls
id_rsa id_rsa.pub
当たり前ですが、サーバーなどに置くのは公開鍵です。公開していい鍵、ですからね。余談として僕は一瞬秘密鍵を置きそうになりました。何のための秘密なのでしょう。初めてのことだからといって焦らないようにしたいものです・・・。
じゃあ、これで一安心。踏み台サーバーに公開鍵を設定して貰えばサクッと接続できる、というわけにはいきません。
このままではパブリックにある踏み台サーバーにしか接続できませんし、当然奥にあるプライベートサブネットのサーバー達に公開鍵を保存するのは手間的にもセキュリティ的にもよろしくありません。(そもそも、それをすると踏み台の意味がないですよね。)
ここで登場するのが、SSHポートフォワーディングというものです。
SSHポートフォワーディングとは、その名の通りSSH接続を使って特定のポートに届いたものをフォワーディング(転送)することです。
つまり、SSH接続を使って安全に自分のPCからの通信を踏み台を経由してプライベートな開発サーバーに通信を転送してくれるんですね。簡単に図を作ってみたいと思います。
図の通り、プライベートの開発サーバーはAWSのセキュリティグループで踏み台サーバーのみと通信しているため、一旦踏み台サーバーを経由して奥の開発サーバー通信を転送して貰います。これをすることで、いちいち踏み台サーバーに入って作業せずとも自分のPCと開発サーバーが安全かつ直接繋がってるみたいに操作できるんです。すごい。
そして、それを橋渡ししてくれるコマンドもありがたいことに用意してくれています。
$ssh -L [PCのローカルポート番号]:[接続先サーバのアドレス]:[接続先サーバのポート番号] [踏み台サーバのアドレス]
このコマンドで、踏み台から接続したいサーバーまで一気に安全に通信できると。
ただ、一回一回コマンドを打つのも大変。
そこで使えるのが.ssh/configです。このファイルにホスト名(またはIPアドレス)、ユーザ名、SSH接続時のオプションなど、ここに事前に色々書いておくと自動でそこを参照にしてくれるためコマンドを省略できる優れものです。(もちろん、今回初めて知りました。)
記載例はこんな感じ。
Host #踏み台のホスト
Hostname #IPアドレス
User #ユーザー名
Port #ポート番号
IdentityFile #公開鍵のファイル
Host #接続先のホスト
Hostname #IPアドレス
User #ユーザー名
Port #ポート番号
IdentityFile #公開鍵のファイル
ProxyCommand ssh -W %h:%p #踏み台のホスト名
この設定をしておくことで、以下のコマンドを実行するだけで接続したいサーバーに繋ぐことができます。
$ssh サーバーA
ちなみに、ここでもミスをしていて初回接続時にサーバー名ではなくIPアドレスを記載しており繋げることができず頭を捻らせていました。自分で記載したconfigファイルの設定が意味をなしていなかったので、再度configで設定したホストを書いてあげるとしっかりと開発サーバーへ接続することができました。
今回は、入社早々に躓いたSSH接続と、ポートフォワーディングについて書かせていただきました。
SSH接続:鍵を使って、安全な暗号通信を行ってくれる。
SSHポートフォワーディング:SSH接続を使い、ポートを通して繋げたいところまで通信を転送してくれる。
環境構築の仕方など、まだまだわからないことだらけですが一つエンジニアとして知っていて当然の知識を経験として身につけられたのかなぁと思います。せっかくAWSの勉強もしてるのでよりセキュアだったり安価な構成できないか、なども考えられるよう知見を増やしていきたいですね。(EC2 Instance Connectなるもので踏み台をなくせる、とか)
今後も、このブログを通じて学んだことや使ったサービスなどを発信できたらと思います。