節約プログラマー雑記

SSH公開鍵接続の手順

システム構築で仕事をしていると、サーバー間でのやり取りをする場面によく出くわすと思います。

インターネットサービスならWebAPI等の口があると思いますが、単純なサーバー同士のやり取りだとファイルの受け渡しが主で、そこまでの作りこみをする場面はほとんど無いです。

そんなとき、よくサーバー間でSSH(SFTP)で環境を構築することで、簡単なサーバー間のやり取りをするように回避してきた方法について書いていきたと思います。

1. クライアント(接続元側)の準備

クライアント側の作業としては、「秘密鍵と公開鍵の作成」です。

Windowsならpowershell、LinuxならBashなどでssh-keygenとコマンドをたたくことで、ホームディレクトリ配下の「.ssh」フォルダに「id_rsa」(秘密鍵)「id_rsa.pub」(公開鍵)の2ファイルが作成されます。実際にコマンドを叩くとこんな感じ。

ssh-keygen.png

鍵の作成が完了したら、接続先に「id_rsa.pub」(公開鍵)を渡せばクライアント側は準備完了です。

2. サーバー(接続先側)の準備

次は、SSHを受ける側の設定です。受ける側の設定としては、「.sshフォルダの作成」、「authorized_keysへの公開鍵登録」、「権限設定」の3つになります。raspberry pi Piユーザーを対象として、順番にやっていきたいと思います。

ということで、まずはmkdir .sshでディレクトリを作成。ディレクトリの作成が完了したら、.ssh配下に移動しcat id_rsa.pub >> authorized_keysでauthorized_keysを作成し、もらった公開鍵の内容を登録します。

最後に.sshディレクトリとauthorized_keysファイルをそれぞれchomd 700 .sshchmod 600 authorized_keysで権限変更したら準備完了です。(sshdの設定として、それぞれが正しい権限になっていないと、公開鍵認証が採用されないようになっているので、必要な作業になります。)

実際に設定してみたサーバーがコチラ。

ssh-rsa.png

piユーザーの.sshフォルダ配下にauthorized_keysが600の権限(-rw-------)で存在していることがわかるかと思います。

またファイルの中身は、先ほど別サーバーのtestユーザー(test@localdomain)が作成した公開鍵がひとつ登録されている状態となっており、これで準備完了になります。

3. 実行結果

準備ができたので、クライアント側から実際に接続してみます。

LinuxやWindowsのPowershellの場合、ssh -i {秘密鍵} {接続先ユーザー}@{接続先サーバー}のコマンドを叩くと、パスワード認証なしで繋ぐことができるようになります。

実際にコマンドを叩くと、下の画像ようにtestユーザーから先ほど設定したpiユーザーにssh接続できました。

ssh-connect.png

以上が公開鍵認証方式によるSSHの接続方法です。

SSHの設定ができれば、SFTPもSSHによるファイル受け渡し方法のため、同じように接続して処理をすることができるようになります。AWSやGCPなどのIaaSに接続するときは公開鍵方式の接続だったり、公開鍵方式を利用すれば、シェルスクリプトのバッチ処理等でもリモート処理ができるようになりますので、参考になればと思います。