- 公開鍵方式ってなんだか苦手…
- 秘密鍵と公開鍵、何が違うの?
- 鍵のセットアップがわからん!
このような方に向けて書きました。
Webのお仕事をしていると、当然のように触れるSSH接続。
なんとなく苦手意識を持っている方は多いのではないでしょうか?
本記事ではSSH接続の概要と、実務でよく使うコマンドを解説します。
読了後にはSSH接続の仕組みはざっくり説明できるレベルになっているはずです。
ぜひ、この機会に基礎をマスターしていきましょう。
まずはSSH接続の概要を理解しよう!
SSH(Secure Shell)は、コンピュータ同士がやりとりをする方法の一つです。
このやりとりの方法は、プロトコルと呼ばれることもあります。
SSH接続はサーバとの通信で使われる
結論、SSH接続はサーバーとの通信で使われます。
たとえば新しくサーバーをレンタルすることを想像してみてください。せっかくレンタルしたサーバーも、接続できなければ役に立ちませんよね。
SSH接続を使うと、手元のPCとサーバーの間でデータのやりとりができるようになります。
- サーバーのコマンド実行
- ファイル転送
- リモートデスクトップ
- SSHエージェントフォワーディング
しかも、これらの通信はセキュリティで保護されます。
以前はTelnetやRloginといったものが使われていましたが、近年ではセキュリティが強化されたSSHを使うことが圧倒的に多くなりました。
2種類の接続方法
SSH接続には、2種類の接続方法があります。
- パスワード認証方式
- 公開鍵認証方式
パスワード認証方式は、ユーザー名とパスワードでログインする方法です。
パスワードを知っていればどの端末からでもアクセスできる手軽さがある一方、パスワードが漏れてしまった場合には簡単に不正ログインされてしまいます。
一方の公開鍵認証方式は、2種類の鍵(公開鍵と秘密鍵のペア)を使って「パスワードなし」でログインできる方法になります。
この方法は、鍵がないとログインできないのでセキュリティが高いと言われています。
ただし設定がやや面倒なのと、秘密鍵自体を盗まれた時に不正ログインリスクが上がってしまうというデメリットもあります。
SSH接続では、このどちらかの方法を使ってログインします。
公開鍵認証方式について簡単に説明
公開鍵方式で理解しておくべきは、次の二点です。
- 秘密鍵は自分だけが持っておく
- 公開鍵はサーバーに置いておく
実務的には、まずこれだけ覚えておけば大丈夫です。
より詳しく知りたい方は、サイモン・シンの『暗号解読』を読んでみることをおすすめします。
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):
鍵を使う用途に合わせて、名前を決めます。たとえばubuntuにログインするためのキーペアを作るなら、次のように入力すると分かりやすいです。
% 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):/Users/user/.ssh/ubuntu
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):/Users/user/.ssh/ubuntu
Enter passphrase (empty for no passphrase):
パスフレーズを設定すると、公開鍵認証でもログイン時にパスフレーズの入力も求められます。
つまり、秘密鍵を盗んだ第三者が不正アクセスしづらくなります。
セキュリティ的には設定するに越したことはないですが、ログインのたびに毎回パスフレーズを聞かれるのが面倒ならパスフレーズなしで設定を進めることもできます。
パスフレーズの設定をしない場合は、何も入力せずに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):/Users/user/.ssh/ubuntu
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
もう一度パスフレーズを聞かれるので、同じものを入力してEnterを押します。
※ パスフレーズなしにした場合は、ここでも何も入力せずにEnter
最後に、指定のディレクトリに鍵が作成されたか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 ubuntu
-rw-rw-r--@ 1 user staff 102 10 6 14:14 ubuntu.pub
ubuntu
が秘密鍵、ubuntu.pub
が公開鍵です。
無事に作成されたことが確認できました。
2. 公開鍵をサーバーに置く
続いて公開鍵をサーバーに登録します。
次のコマンドを実行してください。
ssh-copy-id -i ~/.ssh/ubuntu.pub ユーザー名@サーバーアドレス
これにより、サーバーの~/.ssh/authorized_keys
ファイルに公開鍵が保存されます。
すでに他の公開鍵が登録されていたとしても、上書きではなく追記になるのでご安心ください。
もしssh-copy-id
コマンドが使えないなら、次の手順で公開鍵を登録できます。
# 1.公開鍵の内容をクリップボードにコピー
cat ~/.ssh/ubuntu.pub | pbcopy
# 2.サーバーにログイン
ssh ユーザー名@サーバーアドレス
# 3.公開鍵を追記
echo `コピーした公開鍵` >> ~/.ssh/authorized_keys
いずれかの方法でサーバーに公開鍵の登録ができたら、SSH接続でログインしましょう。
次のコマンドを実行します。
ssh ユーザー名@サーバーアドレス
パスフレーズを設定した場合にはパスフレーズの入力を求められます。
知っておくと便利な設定方法
SSH接続をさらに便利にする設定をご紹介します。
- configファイルの作成
- SSHエージェント
- SSHエージェントフォワーディング
これらを知っているとSSH接続の操作がかなり楽になります。
試してみることを強くおすすめします!
configファイルでもっと簡単にSSH接続する
~/.ssh/config
ファイルを設定すると、SSH接続のコマンドが簡単になります。
ローカルで以下のコマンドを実行してください。
touch ~/.ssh/config
chmod 600 ~/.ssh/config
vi ~/.ssh/config
これでconfig
ファイルの生成の生成、パーミッションの設定をした上でファイルを開きます。
次の内容を記載しましょう。
Host example
HostName example.com # サーバーのIPアドレスやドメイン名
User username # ログインするユーザー名
IdentityFile ~/.ssh/ubuntu # 使用する秘密鍵のパス
esc
→:wp
→Enterキーを押して上書き保存してください。
この設定が終わると、次のコマンドでログインできるようになります。
ssh example
これまでssh ユーザー名@IPアドレス
のコマンドが必要だったところ、Hostの後に指定したショートカット名でSSH接続ができるようになります。
毎回のSSH接続が楽になるのでおすすめです。
SSHエージェント
ログインのたびにパスフレーズを入力するのを面倒に感じたことはありませんか?
そんな時はSSHエージェントを使ってみましょう。
SSHエージェントは秘密鍵を一度ロードするだけで、次回以降のパスフレーズ入力を省略できる機能です。
まずSSHエージェントを起動します。
eval "$(ssh-agent -s)"
起動したSSHエージェントに秘密鍵を登録しましょう。
ssh-add ~/.ssh/ubuntu
これで毎回パスフレーズを入力することなく、ログインできるようになります。
ちなみにSSHエージェントが有効なのはセッションが続く間だけです。
そのためPCを再起動したりターミナルを閉じたりすると最初からやり直さないといけませんので、その点ご注意ください。
SSHフォワーディング
SSHフォワーディングは、接続したサーバーからさらに別のサーバーにSSH接続するとき、ローカルのSSHエージェントを使って認証ができる機能です。
あらかじめ、ローカルの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接続といっても二種類の認証方法があるのでした。
- パスワード方式
- 公開鍵方式
一般的にはセキュリティの高い公開鍵方式が採用されます。
公開鍵方式ではパスワードなしでログインできるようになりますが、セキュリティ強化のためにパスフレーズが設定されることもあります。
公開鍵方式は初期設定が少し面倒なので、本記事の内容を参考に手順を覚えていっていただけたら幸いです!
SSH接続と密接な関係があるのが、ユーザーという概念です。
ユーザについて知るともっとSSH接続への理解が進むと思いますので、以下の記事も合わせてご覧になってみてください。
» 参考:Ubuntuのユーザー管理とセキュリティ対策【root権限も解説】
コメント