- 公開鍵方式ってなんだか苦手…
- 秘密鍵と公開鍵、何が違うの?
- 鍵のセットアップがわからん!
このような方に向けて書きました。
Webのお仕事をしていると、当然のように触れるSSH接続。
なんとなく苦手意識を持っている方は多いのではないでしょうか?
本記事ではSSH接続がどんなものかと、実務でよく使うコマンドを解説します。
読了後にはSSH接続の仕組みはざっくり説明できるレベルになっているはずです。
ぜひ、この機会に基礎をマスターしていきましょう!
まずはSSH接続の概要を理解しよう!
SSH(Secure Shell)は、コンピュータ同士がやりとりをする方法の一つです。
このやりとりの方法は、「プロトコル」と呼ばれます。
SSH接続はサーバとの通信で使われる
結論、SSH接続はサーバーとの通信でよく使われます。
たとえば新しくサーバーをレンタルしても、接続できなければ何の操作もできません。
SSH接続を使うことで、手元のPCとサーバーの間でデータのやりとりができるようになります。
- サーバーのコマンド実行
- ファイル転送
- リモートデスクトップ
- SSHエージェントフォワーディング
しかも、これらの通信はセキュリティで保護されます。
以前はTelnetやRloginといったものが使われていましたが、近年ではセキュリティが強化されたSSHを使うことが多くなりました。
2種類の接続方法
SSH接続には、2種類の接続方法があります。
- パスワード認証方式
- 公開鍵認証方式
パスワード認証方式は、ユーザー名とパスワードでログインする方法です。
パスワードを知っていればどの端末からでもアクセスできる手軽さがある一方、パスワードが漏れてしまった場合には簡単に不正ログインされてしまいます。
一方の公開鍵認証方式は、2種類の鍵(公開鍵と秘密鍵のペア)を使って「パスワードなし」でログインできる方法になります。
この方法は、鍵がないとログインできないのでセキュリティが高いと言われています。
ただし設定がやや面倒なのと、秘密鍵自体を盗まれた時に不正ログインリスクが上がってしまうというデメリットもあります。

SSH接続では、このどちらかの方法を使ってログインします。
公開鍵認証方式について簡単に説明
公開鍵方式で理解しておくべきは、次の2点です。
- 秘密鍵は自分だけが持っておく
- 公開鍵はサーバーに置いておく
実務的には、まずこれだけ覚えておけば大丈夫です。
公開してはいけないのは、その名の通り「秘密鍵」の方です。
一方でばら撒いておくのが「公開鍵」となります。
SSH接続でサーバーと通信する方法
ここからは実際にサーバーとSSH接続してみましょう。
まずはパスワード方式と公開鍵方式の基本的な手順を解説します。
パスワード方式を使った接続方法
初めてサーバーにログインする場合は、次のssh
コマンドを実行しましょう。
# IPアドレスでログインする場合の具体例
ssh ユーザー名@IPアドレス
実行後にパスワードを聞かれるので、入力したらログイン完了です。
ちなみに「ユーザー名」と「IPアドレス」は、契約したサーバーのマイページなどに記載があります。
職場のアカウントでこれらが不明なら、システム管理者に問い合わせてください。
公開鍵方式を使った接続方法
公開鍵方式は次の手順で進めます。
- キーペアを作る
- 公開鍵をサーバーに置く
- sshコマンドでログインする
手順を踏んでいけば何となくわかるので、一つずつ進めていきましょう。
1. キーペアを作る
公開鍵方式では「秘密鍵」と「公開鍵」のペア(キーペア)が必要です。
このキーペアを作るために、次のコマンドを実行します。
ssh-keygen -t rsa -b 4096 -C "youremail@example.com"
youremail@example.com
の部分は、あなたのメールアドレスに置き換えましょう。
これを実行すると、生成する鍵のファイル名とパスを聞かれます。
% ssh-keygen -t rsa -b 4096 -C "********@gmail.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/user/.ssh/id_rsa):
ここは、何も入力せずにEnterを押していきましょう。
上記では/Users/user/.ssh/id_rsa
がデフォルトになっているので、このパスに保存されます。
すると上記のように、パスフレーズを設定するかどうか聞かれます。
% ssh-keygen -t rsa -b 4096 -C "********@gmail.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/user/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
パスフレーズを設定すると、公開鍵認証でもログイン時にパスフレーズの入力も求められます。
つまり、秘密鍵を盗んだ第三者が不正アクセスしづらくなります。
セキュリティ的には設定するに越したことはないですが、ログインのたびに毎回パスフレーズを聞かれるのが面倒ならパスフレーズなしで設定を進めることもできます。
今回はごく簡単なケースとして、パスフレーズなしにしましょう。
なので、何も入力せずにEnterを押してください。
すると、もう一度パスフレーズの入力を求められるので、何も入力せずにEnterとしましょう。
% ssh-keygen -t rsa -b 4096 -C "********@gmail.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/user/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
最後に以下のls
コマンドを実行して、鍵が生成されたかを確認しましょう。
% ls -la ~/.ssh
drwxr-xr-x 10 user staff 320 10 10 07:37 .
drwxr-x---+ 21 user staff 672 10 10 19:32 ..
-r--------@ 1 user staff 464 10 6 14:14 id_rsa
-rw-rw-r--@ 1 user staff 102 10 6 14:14 id_rsa.pub
2つの鍵が生成されていることが確認できました。
- id_rsa: 秘密鍵
- id_rsa.pub: 公開鍵
pubとついていないものが秘密鍵なので、これは外部に公開しないように注意しましょう。
2. 公開鍵をサーバーに置く
続いて公開鍵をサーバーに登録します。
次のコマンドを実行してください。
ssh-copy-id -i ~/.ssh/id_rsa.pub ユーザー名@サーバーアドレス
これにより、サーバーの~/.ssh/authorized_keys
ファイルに公開鍵が保存されます。
すでに他の公開鍵が登録されていたとしても、上書きではなく追記になるのでご安心ください。
もしssh-copy-id
コマンドが使えないなら、次の手順で公開鍵を登録できます。
# 1.公開鍵の内容をクリップボードにコピー
cat ~/.ssh/id_rsa.pub | pbcopy
# 2.サーバーにログイン
ssh ユーザー名@サーバーアドレス
# 3.公開鍵を追記
echo "ssh-rsa AAAAB3...(ここに貼り付け)" >> ~/.ssh/authorized_keys
3. sshコマンドでログインする
いずれかの方法でサーバーに公開鍵の登録ができたら、SSH接続でログインしましょう。
次のコマンドを実行します。
ssh ユーザー名@サーバーアドレス
パスフレーズを設定した場合にはパスフレーズの入力を求められます。
知っておくと便利な設定方法
SSH接続をさらに便利にする設定をご紹介します。
- パスフレーズの入力を省略する方法
- SSHエージェントフォワーディング
それぞれ解説します。
パスフレーズの入力を省略する方法
秘密鍵にパスフレーズを設定すると、毎回のSSH接続時にパスフレーズの入力が必要になります。
セキュリティは高くなるものの、サーバーに頻繁に接続するとなると少し面倒。
そこで活用したいのが ssh-agent です。
ssh-agentを使えば、パスフレーズ付きの秘密鍵を一時的に記憶してくれるので、何度も入力せずに済むようになります。
使い方は以下の通り。
# エージェントを起動(1回だけ)
eval "$(ssh-agent -s)"
# 鍵を登録(1回パスフレーズを聞かれる)
ssh-add ~/.ssh/id_rsa
# 以降はこのセッション中、パスフレーズ不要でSSH接続できる
ssh user@host
SSHエージェントはPCのメモリ上に「一時的に」パスフレーズ付きの鍵を保持します。
なので、ターミナルを閉じたり、PCを再起動するなどしてセッションが切れると、再度ssh-addコマンドの実行が必要になります。
SSHフォワーディング
SSHフォワーディングとは、あるサーバー(例:server1)にログインした状態から、自分のPCにある秘密鍵(ローカルのSSHエージェント)を経由して、さらに別のサーバー(例:server2)に接続する方法です。
あらかじめ、ローカルのSSHエージェントに、最終接続先であるserver2の秘密鍵を登録します。
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/server2
続いてserver1に対して-A
オプションをつけてSSH接続します。
ssh -A server1
こうしておくと、server1に秘密鍵を設置しなくとも、ローカルにある秘密鍵を使ってserver2にログインできるようになります。
つまり、server1にいる状態でローカルのSSHエージェントが使えるようになるわけです。
さらに詳しく知りたい方は、GitHubにSSHフォワーディングする方法を解説した以下の記事もご覧ください。
» 参考:ローカルのSSHキーを使ってリモートサーバーからGitHub操作をする方法
SSHのトラブルシューティング
SSHに問題が起こった場合の解決方法をご紹介します。
変な警告メッセージが表示されてログインできない
ログイン時に以下のメッセージが表示されることがあります。
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ED25519 key sent by the remote host is
SHA256: <some key>
Please contact your system administrator.
Add correct host key in /Users/username/.ssh/known_hosts to get rid of this message.
Offending ED25519 key in /Users/username/.ssh/known_hosts:5
Host key for <IPADDRESS> has changed and you have requested strict checking.
Host key verification failed.
このメッセージの原因は大きく3つに分けられます。
- サーバーを再インストールした
- ホストキーを定期的に変更するように設定していた
- “man-in-the-middle” 攻撃を受けて通信を傍受されている
それぞれの対策方法を説明します。
❶または❷の場合
ローカルのホストキーが古いためのエラーで、特に危険はありません。
以下のコマンドを使ってホストキーを削除しましょう。
ssh-keygen -R <IPADDRESS>
これで再度sshコマンドを実行すれば、普通にログインができるはずです。
❸の場合
この場合は、絶対にログインしないでください。
この危険性を理解するために、まずはSSH接続のたびに行われていることを理解する必要があります。
- 初回接続時にサーバーのホストキーをローカルに記録
- 接続のたびにサーバーとローカルのホストキーを照合
- サーバーとローカルのホストキーに不一致があると警告を表示
- 不一致が正常なら、ローカルにある古いホストキーを削除
- 今後は新しいホストキーを正とする
最初に示した警告が表示されるのは❸の段階です。
ホストキーの不一致に心当たりがない場合には、最悪の場合サーバーが攻撃を受けている可能性があります。
早めにサーバーの管理者に報告するようにして下さい。
接続が拒否される
SSH接続が拒否されると、次のようなメッセージが返ってきます。
ssh: connect to host [ホスト名 or IPアドレス] port 22: Connection refused
接続が拒否されてしまう場合にの原因と対策は次の通りです。
- SSHサーバーが稼働していない
> SSHサーバーを動かす - SSHサーバーのポートがファイアウォールでブロックされている
> ファイアウォール設定で許可する - ユーザー名またはパスワードが間違っている
> 正しいものを入力する
基本的にはサーバーの管理者に連絡して指示を仰ぎましょう。
たまにファイアウォールの設定を誤ってしまい、自分が締め出されてしまう場合もあります。
どうしても入れなくなってしまった場合には、OSを再インストールしましょう。
公開鍵が正しく認識されない
サーバーに登録した公開鍵が認識されていない場合もあります。
このような場合にはサーバーからメッセージが返ってくることはありません。
なぜなら、ここで具体的なメッセージが返ってきてしまうと不正アクセスの手助けをすることになってしまうからです。
管理者権限でログインできれば、SSHログを参照して詳細を確認できます。
sudo less /var/log/auth.log
# Authentication refused: bad ownership or modes for directory /home/username/.ssh
たとえば上記の場合、~/.ssh
ディレクトリまたはその中のファイル(例えばauthorized_keys)のパーミッションが間違っていることがわかります。
その他に考えられる主な原因と対策は次の通りです。
- サーバーへの公開鍵のコピーに失敗
- 公開鍵と秘密鍵のペアが不一致
- サーバー設定で公開鍵認証を許可していない
- 権限設定が間違っている
権限設定は、.ssh
ディレクトリは700、authorized_keys
は600に設定することが一般的です。
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
まとめ
SSHはサーバーとの通信になくてはならない技術です。
また、一口にSSH接続といっても二種類の認証方法があるのでした。
- パスワード方式
- 公開鍵方式
一般的にはセキュリティの高い公開鍵方式が採用されます。
公開鍵方式ではパスワードなしでログインできるようになりますが、セキュリティ強化のためにパスフレーズが設定されることもあります。
公開鍵方式は初期設定が少し面倒なので、本記事の内容を参考に手順を覚えていっていただけたら幸いです。
コメント