数か月前にSSH周りで詰んだ。最終的に自分で解決できたからよかったけど、俺が困ってるのを嬉しそうに見てた死んだ魚の目をしたデブのおっさんには腹が立った。まあそもそも俺がSSHの基礎を理解しておくべきだったといえばそうなんだけど、それでも最近思うのはエンジニアって冷たい人が多い気がする。俺の周りだけだろうか?
ということで今回は、SSHも知らないのと目で煽ってくる死んだ魚の目をしたデブのおっさんに対応できるように最低限の知識を身に着ける。
目次:クリックでジャンプ
ゴール
何にしてもアウトプットが大事ということで今回はハンズオン形式で、SSHとは何か、何のために使われるか、WindowsからMacにSSHでログイン(同じネットワーク)、レンタルサーバーのConoHaサーバーにSSH接続、そして最後にFileZillaを使ってSSH(SFTP)接続でファイル転送する方法を解説する。
SSHとは
リモートポリジトリをローカルPCにcloneするとき、HTTPSとSSHで通信のプロトコルを選べるんだけどほとんどの人がHTTPSを使う。なんでかっていうとGitHubがHTTPSを推奨してるし、デフォルトもHTTPSになってる。
じゃあなんでSSHがあるんだって話なんだけど、SSHの方は公開鍵認証ってやつを使えて、それを使うとリモートリポジトリに接続するときに毎回パスワードを入力する必要がなくなる。つまり早く接続できるよって話。でも深堀すると複雑で、どっちの方が安全とか賛否両論ある。
俺は別にインフラエンジニアじゃないんだけど、WEB開発をしてるとSSHという単語は出てくる。例えばサーバーに作ったものをデプロイ(アップロード)してとか、開発環境のサーバーにファイル転送してとか、色々な場面でSSHを使ってサーバーに接続しろって言われる。
それらもHTTPSでやればいいじゃんって思うんだけど、SSHはfirewallにブロックされるとか、そもそもHTTPSは通常ブラウザとサーバー間での通信に使われて、SSHはコンピューター間での通信に使われるとかあるらしい。要するにHTTPSとSSHは使い分けられてる。理由はよくわかんないけど、やろうと思えばブラウザからサーバーにSSH接続もできる。
SSHとは
- Secure Shell
- 通信プロトコルの一つ(http、https、ftp、ssh、telnet)
- 他のコンピューターに接続できる
- 通信が暗号化される
- ターミナルやコマンドプロンプトなどのCLIで使われることがほとんど
CLIで使われることがほとんどだけど、GUIのWinSCPとかFileZillaとかもよく使われる。ちなみにFileZillaはFTP、FTPS、SFTP全て使えるけどFTPは暗号化されてないから基本使わないのが無難。
事前知識
用語
- 「ホスト」= 接続される側のサーバー
- 「クライアント」= 接続する側のマシン
- FTPS = SSL/TLS
- SFTP = SSH
- 「公開鍵」=「id_rsa.pub」という名前のファイル
- 秘密鍵の種類
- 「id_rsa」= ロカールPCで作成した秘密鍵のファイル名。RSA方式の暗号化
- 「id_dsa」= ロカールPCで作成した秘密鍵のファイル名。DSA方式の暗号化
- 「.pem」= 拡張子がpemはAmazon EC2で使う秘密鍵のファイル
- 「.ppk」= PuTTY形式の秘密鍵でPuttyGentというソフトで作成される
何のために使われるのか
- 「安全にファイル転送したい」
- 「バックアップを自動的に取りたい」
- 「大量のデータをダウンロードしたい」
- 「デプロイしたい」
基本的にサーバーに接続して操作するときに使う。
クライアントとサーバー間の通信の条件
クライアントとサーバーで通信をするために、接続されるサーバー(ホストともいう)はSSHD(open ssh daemon)という、SSHの接続を受信するものがインストールされてる必要がある。
認証
もちろんSSHが安全だからと言ってクライアントからすべてのサーバーにログインできるわけではない。例えば下記のコマンドはユーザー名が「johnsmith」でIPアドレスが「192.168.123」のコンピューターにSSH接続するときにクライアントで使うコマンドなんだけど、そのコマンドを叩くとデフォルトではパスワードを聞かれる。
ssh johnsmith@192.168.123
毎回パスワードを入力するのは面倒なので、公開鍵秘密鍵を作成すればその手間は省ける。
SSHの主な認証方式は下記。
- パスワード認証方式
- 公開鍵認証方式
SSHコマンドが使えるOS
- Windows10と11⇒OK
- Mac⇒OK
- Linux⇒OK
SSHはUnix系のコマンドなのでLinuxとMacでは問題なく使える。Windowsは10と11であれば使える。
WindowsからMacにSSHでログイン(同じネットワーク)
クライアント(左のWindows)からホスト(右のMac)にSSH接続をしてみる。SSHコマンドで接続する前にMac側で少し設定がある。
Macで設定ができたら下記のコマンドを見てほしい。
C:\>ssh johnsmith@192.128.129 The authenticity of host '192.128.129 (192.128.129)' can't be established. ECDSA key fingerprint is SHA256:21SdhdSF533QWdxufnjdhg4kahfb89tt5JsjmnbWsJw. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added '192.128.129' (ECDSA) to the list of known hosts. johnS-macbookpro:~ johnsmith$
先ほどMacでコピーしたコマンドが⇒「ssh johnsmith@192.128.129」。
これをWindowsのコマンドプロンプトで実行すると上記のようになる。
※「johnsmith」の部分はMacのユーザー名で、「192.128.129」はMacのIPアドレス。IPアドレスじゃなくてホスト名でも同じなのでOK。
初めての接続だと「信頼性を確立できていない」と警告が表示される。
ここでyesを入力すると「known_hosts」にホスト情報が追加される。後ほど説明。パスワードを聞かれるので入力する。
写真
カレントディレクトリをみるとMacに接続できたことが確認できる。マジで簡単。
でも接続するたびに毎回パスワードを入力するのは面倒ということでSSH鍵(公開鍵と秘密鍵)を設定する。俺は面倒とは思わないけど。
なので一旦「exit」コマンドでMacからログアウトする。
SSH鍵の作成
C:\>ssh-keygen
1のコマンドを入力すると、2で「.ssh/id_rsa」秘密鍵をどこに作成しますかと聞かれる。指定しないで「Enter」押すと以下のディレクトリに保存される。ちなみに「.ssh」の「.」(ドット)は隠しフォルダという意味。3と4ではパスフレーズを作成しますかと聞いてるのでEnterを押してスキップでOK。
上の写真のように下記のファイルが作成される。
- 「id_rsa」= 秘密鍵
- 「id_rsa.pub」= 公開鍵
- 「known_hosts」=サーバー認証に使われるファイル
秘密鍵はただ単に置いとけばいい。公開鍵はサーバーに置かないといけない。なので、Macに下記のコマンドで移動させる。
cat ~/.ssh/id_rsa.pub | ssh johnsmith@192.128.129 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys"
写真
上記のコマンドの「johnsmith@192.128.129」の部分は自分のサーバーの情報に修正してからクライアントで実行。
パスワードを聞かれるので入力。ちなみに、コマンドプロンプトだと「cat」コマンドが使えないのでPowerShellで実行。
そうするとMacのホームディレクトリに「.ssh/authorized_keys」が作成されて、「authrized_keys」ファイルに先ほどWindowsで作成した「id_rsa.pub」に記述がある公開鍵がコピーして記述される。
↑でMacに公開鍵かあることを確認。
再度、ssh接続すると今回はパスワードは聞かれない。
ちなみに「cat」コマンドでもMacに置いた公開鍵を確認できる。これでWindowsにもMacにも同じ公開鍵がある。
SSHでクライアントからホストにファイルを転送する。
C:\>scp ~/test.txt ssh johnsmith@192.128.129:~
Macに接続したら、WindowsからMac上にファイルを作成したり、アプリをインストールしたりもできる。ファイルを転送するには上記のscpコマンドを使えばできる。
Windowsのホームディレクトリのtest.txtファイルをMac(johnsmith@192.128.129)のホームディレクトリ「:~」に移動。
ConoHaサーバーにSSH接続
このブログが利用してるConoHa WINGのレンタルサーバーにSSH接続してみる。
まずは⇒ConoHa WINGにログインする。ここは自分が借りてるレンタルサーバーにログインすればOK。大まか流れは人気なレンタルサーバーであればどれも同じ。
1~4の順番でクリックしてConoHa WING上で公開鍵秘密鍵を作成する。
登録方法は「自動作成」を選択して、ネームタグはそのままでもOK。「conoha_ssh_key」とか好きな名称に変更するのもOK。
プライベートキー(秘密鍵)が作成されたので「ダウンロード」をクリック。
※一度しかダウンロードできないので消してしまった場合はもう一度「SSH Key」を作成し直す必要がある。
これで接続に必要な公開鍵、秘密鍵、ポート番号、ユーザー名、ホスト名が揃ったので下記のコマンドを実行。
これでConoHa WINGにSSH接続ができる。
ssh -i C:\Users\johnsmith\Downloads\key-2022-10-21-10-07.pem -p ポート番号 ユーザー名@ホスト名
「-i」でダウンロードした秘密鍵を指定して、SSHポートがデフォルト22出ない場合は「-p」でポート番号を指定する。
※ホスト名はIPアドレスでもOK。DNSの名前解決に失敗すると「Permission denied」エラーが出る。
※秘密鍵の配置場所(ディレクトリ)は「C:\Users\johnsmith」は以下などにしないと「WARNING: UNPROTECTED PRIVATE KEY FILE!」エラーが出るらしい。
ちなみにTera Termを使用して接続もできる。むしろTera Termを使って接続する人の方が日本では多いかもしれない。
SSHの秘密鍵の管理
~/.ssh ├── config ├── id_rsa ├── id_rsa.pub ├── known_hosts └── pems ├── conoha_ssh_privatekey.pem ├── server-b.pem └── server_c.pem
先ほどはダウンロードされた秘密鍵「C:\Users\johnsmith\Downloads\key-2022-10-21-10-07.pem」を「-i」で指定したけど、秘密鍵をDownloadsフォルダに置いておくわけにはいかない。「.ssh/pems」というフォルダを作成して、そこに保存。そうすることで複数秘密鍵がある場合でも管理できる。
known_hostsとconfig
ECDSA key fingerprint is SHA256:21SdhdSF533QWdxufnjdhg4kahfb89tt5JsjmnbWsJw. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added '192.128.129' (ECDSA) to the list of known hosts. johnS-macbookpro:~ johnsmith$
始めてサーバーに接続すると、「Warning: Permanently added '192.168.1.17' (ECDSA) to the list of known hosts.」で「known_hosts」という名前のテキストファイルに公開鍵かfingerprintが保存される。
ちょっと複雑ではあるんだけど、要するにユーザー認証する前に、サーバー認証する必要がある。そのために使うということだけ覚えておけばOK。そうでない場合はその時に調べれば大丈夫。
FileZillaを使ってSSH(SFTP)接続
FileZillaを起動して「編集」→「設定」
「SFTP」を選択して「鍵ファイルを追加」をクリック。
先ほどConoHa WINGサーバーで作成してダウンロードした秘密鍵カギファイルを選択。
「ファイル」→「サイトマネージャー」
1で「新しいサイト」をクリックして、2でサイト名を入力。3で「SFTP - SSH File Transfer Protocal」を選択して、4~7は先ほどConoHa WINGにログインして確認。8はConoHa WINGにログインするときのパスワード。
「常にこのホストを信用し、この鍵をキャッシュに追加」をチェックして「OK」をクリック。
URL部分が「sftp://」になっていれば接続成功。
GitHuBにSSH接続
「C:\Users\username」直下にある.sshフォルダに移動。そして「ssh-keygen」コマンドを実行。
C:\Users\username> cd .ssh C:\Users\username\.ssh> ssh-keygen
以下みたいに「Enter file in which to save the key (C:\Users\username/.ssh/id_rsa):」キーの保存先を聞かれたら、「id_rsa_github」と入力してgithub用のssh鍵とファイル名で分かるようにする。そうしないと、.sshフォルダ直下にid_rsaという名前のファイルをデフォルトで作成され、すでにある場合そのファイルが上書きされてしまう。
下記でパスフレーズを聞かれる。指定しない場合は入力せずにEnter押せばOK。
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
成功すれば公開鍵と秘密鍵が作成される。
ちなみに「*.pub」となってる拡張子が公開鍵。
catコマンドで「id_rsa_github.pub」の公開鍵を出力してコピー。
コピーしたら、GitHubの以下の所にペースト。
以上。あとは、GitHubでSSHのURLをコピーして、git cloneとか、「origin」という名前に対して[URL]を関連付けさせるときにペーストすればOK。
git clone git@github.com:Username/practicedocker.git git remote add origin git@github.com:Username/practicedocker.git