- サーバーに拒絶反応がある…
- そろそろ本気でSSHを理解したい!
Webアプリケーションを作るお仕事をしていると、当たり前のようにSSH接続に触れるようになります。
でもSSHを最近知った方は「SSHでログインはできた!でも、内部的に何が起こってるかよく分からない…」と感じている方は多いのではないでしょうか?
まさに僕はそうでした。
本記事の読了後にはSSH接続を自信を持ってできるようになるため、SSH接続の概要はもちろん実務で使うコマンドを解説つきでご紹介します。
一体、SSHとはなんなのか
SSH(Secure Shell)は、コンピューター間で安全にやり取りをするプロトコルをいいます。プロトコルはデータをやり取りする際のルールと考えてみてください。
SSHが初見の方もできるだけイメージができるよう、深掘りして解説します。
SSHはHTTPの仲間
SSHはネットワークプロトコルの一種です。
ではネットワークプロトコルとは何かというと、コンピューター間でデータを共有するための規則や手順のことをいいます。
例えばお手紙を郵送する場合。
「ペンで紙に文字を書く」「封筒に手紙を入れる」「郵便ポストに投函する」という一連の動作がプロトコルです。どれか一つが欠けても相手にお手紙は届きません。
このネットワークプロトコルにはいくつか種類があります。例えばURLのアドレスバーでよく見かけるHTTP、ファイル転送の時に使われるFTPなどもネットワークプロトコルの仲間です。
ネットワークプロトコルは使われる目的やセキュリティの強さごとに色々な規格があります。簡単に比較してみましょう。
- HTTP:ブラウザがサーバーからWebページを取得する
- HTTPS:HTTPをセキュアにしたもの
- FTP:コンピューター間でファイルを転送する
- SFTP:FTPをセキュアにしたもので、SSH上で動作する
- SMTP:電子メールを送信する
- SSH:リモートログイン・データ転送をセキュアに行う
全部同じグループだと知っておくと、理解が進みやすいと思います。
SSHはどんな場面で使われるか?
結論、サーバーへのログインで使われることが多いです。
サーバーとのやり取りでは機密情報のやり取りがされるので、セキュリティは高いに越したことはありません。以前はTelnetやRloginなどが使われていたようですが、近年ではよりセキュアなSSHが使われています。
もちろんサーバーへのログイン後に行われる「コマンドの実行」や「ファイルの転送」などもSSHプロトコルで保護されるので安全に通信ができます。
SSHには二つの接続方法がある
パスワード認証方式と公開鍵認証方式の二パターンが用意されています。
- パスワード認証方式
ユーザー名とパスワードでログインする方式。(デフォルト) - 公開鍵認証方式
公開鍵と秘密鍵の2つの鍵を使って認証する方式。鍵をうまく使うことで、パスワードの入力が不要になる。
公開鍵認証方式は、誰にも教えない「秘密鍵」とばら撒く用の「公開鍵」の二つを用意してうまいこと本人かどうかを特定する方法になります。
詳しく知りたい方は、サイモン・シン『暗号解読』を読んでみてください。
実際にSSHを使ってサーバーと通信する方法
ここからは実際にSSHでサーバーと通信するまでの方法をお伝えします。
「パスワード認証方式」と「公開鍵認証方式」の二パターンがあるので、それぞれの接続方法をご説明します。
「パスワード認証方式」を使った方法
サーバーに接続するためにはssh
コマンドを使います。
# sshコマンドの書き方
ssh ユーザー名@サーバーアドレス
# IPアドレスでログインする場合の具体例
ssh ubuntu@xxx.xxx.x.x
# ホスト名でログインする場合の具体例
ssh ubuntu@sample.com
ユーザー名やサーバーアドレスがわからない方はシステム管理者に聞いてみましょう。
パスワード方式の場合には、この後にパスワードを聞かれます。
システム管理者から教えてもらったパスワードを答えれば、ログインは完了です。
「公開鍵認証方式」で接続する方法
公開鍵認証方式の設定は少し面倒です。(とはいえ慣れれば簡単です)
まずは次のコマンドを実行して、認証で使う「公開鍵」と「秘密鍵」の二つを作成します。
ssh-keygen -t rsa
このコマンドを実行すると、パスフレーズを設定するかどうかが聞かれます。
ここでパスフレーズを設定しないと、パスワード的なもの入力せずに簡単にログインできます。それなのに、なぜ面倒なパスフレーズを設定できるのかというと、セキュリティ強化のためです。
悪意を持ったユーザーに秘密鍵が渡ってしまうと、サーバーに不正アクセスできてしまいます。そのため、鍵とは別にパスフレーズを設定しておくことで秘密鍵を手に入れた第三者からの不正アクセスを防ぐことができるというわけです。
パスフレーズの設定は任意なので、用途に応じて設定するかどうかを決めてみましょう。
ここまで終わると、ローカルの~/.ssh/
ディレクトリに以下の二つが生成されます。
- 秘密鍵
誰にも渡さず保存しておくid_rsa
というファイル - 公開鍵
サーバー上にコピーするid_rsa.pub
というファイル
続いて次のコマンドを実行して、公開鍵をサーバーに保存します。
# 公開鍵をサーバーに保存する
ssh-copy-id -i ~/.ssh/id_rsa.pub ユーザー名@サーバーアドレス
このコマンドを実行すると、サーバーの~/.ssh/authorized_keys
ファイルに公開鍵が保存されます。もしすでにサーバーに他の公開鍵が保存されていたとしても、ssh-copy-id
コマンドを使うと追記されていきます。上書きにはならないのでご安心ください。
もしssh-copy-id
コマンドが使えない場合には、以下の手順で手動で公開鍵を入力することもできます。
# 1.以下のコマンドで表示された公開鍵の内容をコピー
cat ~/.ssh/id_rsa.pub
# 2.サーバーにログイン
ssh ユーザー名@サーバーアドレス
# 3.公開鍵を追記
echo `コピーした公開鍵` >> ~/.ssh/authorized_keys
これで公開鍵認証方式の設定は完了です。
サーバーへログインする時には次のコマンドを実行するとSSH接続が確立されます。
# SSHでサーバーにログインする
ssh ユーザー名@サーバーアドレス
パスフレーズを設定した場合にはパスフレーズの入力を求められますので、最初に指定したものを入力しましょう。
SSHのトラブルシューティング
SSHに問題が起こった場合、具体的なエラーメッセージが表示されないこともあるので「よくわからない…!」と感じている方もいらっしゃるのではないでしょうか?
ここでは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: connect to host [ホスト名 or IPアドレス] port 22: Connection refused
接続が拒否されてしまう場合にの原因と対策は次の通りです。
- SSHサーバーが稼働していない
> SSHサーバーを動かします。 - SSHサーバーのポートがファイアウォールでブロックされている
> ファイアウォール設定で許可します。 - ユーザー名またはパスワードが間違っている
> 正しいものを入力する。
基本的にはサーバーの管理者に連絡して指示を仰ぎましょう。
サーバーをいじっていて急に拒否され始めたらファイアウォールの設定で自分が締め出されてしまっている可能性もあります。最悪の場合はサーバーをクリーンインストールして初めからやり直す必要があります。
公開鍵が正しく認識されない
接続が拒否される場合と違って、公開鍵が正しく認識されない場合にはサーバーから特段メッセージが返ってくることはありません。
これは具体的なエラー内容を不正なユーザーに与えないことで、セキュリティを頑丈にする狙いからです。
ただし、管理者権限でサーバー側のSSHログ(/var/log/auth.log)に潜ることができれば詳細を確認できます。
Authentication refused: bad ownership or modes for directory /home/username/.ssh
例えば、上記のメッセージがある場合には~/.ssh
ディレクトリか、その中のファイル(例えばauthorized_keys)のパーミッションが間違っていることを表しています。
考えられる主な原因と対策は次の通りです。
- 公開鍵がサーバーに正しくコピーされていない
> 公開鍵がサーバーにコピーされているかを確認する。 - 公開鍵と秘密鍵のペアが不一致
> 公開鍵と秘密鍵のペアが一致しているかを確認する。 - SSHサーバーの設定が公開鍵認証を許可していない
> SSHサーバーで公開鍵認証が許可されているかを確認する。 - 権限設定が不適切
> ~/.sshディレクトリは700, authorized_keysは600になっているかを確認する。
権限設定の方法はこちらをクリック
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
まとめ
SSHはネットワーク上につながったコンピューター間で安全に通信を行うためのプロトコルでした。
Web系のお仕事をする方にとっては避けては通れない技術になりますので、本記事の内容を押さえておくと最低限の知識は身についたと言えるはずです。
少しでも皆さんのSSHの苦手意識が薄まれば嬉しいです!
コメント