SSHって何?完全解説!

sshについて筆者が数年間使って、わかったことをまとめてみました。

sshって何?

SSH(Secure Shellの略)は、インターネットを介して離れたコンピュータに安全に接続し、コマンドを入力して操作したり、ファイルを双方向にやりとりしたりできる仕組みです。

要は 黒い画面を外から安全に使えるようにするもの!です。

通信内容はすべて暗号化されるため、第三者に盗み見られたり改ざんされたりする心配がありません。

sshって難しい?

そもそも馴染みのない概念なので、慣れるまでは難しいと思います。何回かやってると原理は分からずともなんとなくやるべきことがわかるようになってくると思います。

原理はその後で大丈夫です。とりあえず正しい使い方を学習しましょう!

telnetとsshの違い

一言で表すと暗号化するかしないかの違いです。telnetの新しい規格をsshという認識で大丈夫です。

Telnetは認証も暗号化も行わず、すべてのやり取りを平文(そのままの文字列)で送信するだけの古い接続方式です。鍵交換や共通鍵を使わないため、パスワードもコマンドもネットワーク上で丸見えになり、盗聴や改ざんのリスクが非常に高いです。安全にリモート操作したい場合は、SSHの利用が必須とされています。

SSHのセキュリティ

sshでは複数の技術を使ってセキュリティを高めることで盗聴されないような仕組みになっています。

公開鍵認証方式とパスワード認証方式

公開鍵認証方式

SSHの公開鍵認証は、まずクライアント側で「秘密鍵」と「公開鍵」のペアを作り、公開鍵だけをサーバーに登録しておく仕組みです。

公開鍵認証では、まずサーバーが毎回ランダムなデータ(チャレンジ)を送り、クライアントはそれに秘密鍵で署名した応答を返します。サーバーはあらかじめ登録された公開鍵で署名を検証し、一致すれば本人認証が完了します。

察しの良い方は「公開鍵から秘密鍵を再現できないのか?」と疑問を抱くかもしれません。かんたんに説明すると、こんなイメージです。

  • 公開鍵=鍵穴の形
    鍵穴の外側だけをみせているようなもの。どんな鍵(秘密鍵)が合うかはわからない。
  • 秘密鍵=鍵の形
    その鍵穴を開けられる唯一の鍵。内側だけが知っている情報。
  • どうして推測できないの?
    鍵穴の形(公開鍵)から、鍵の形(秘密鍵)を逆算するには、天文学的にむずかしい数学計算(例:超大きな数の因数分解)が必要で、実質難しいのです。(量子コンピューターが出てきたら脅かされるかもって噂も…)

つまり、公開鍵だけを見ても「どんな鍵で開くか」はわからない仕組みになっているので、安全に使えます。

とはいえ、鍵はピッキングできるじゃんと思った方、その通りです。「理論上は」これもピッキング可能です。ただイメージで言うと鍵・鍵穴の長さが数百メートルあり、ピッキングが事実上不可能というわけです。

公開鍵認証の

パスワード認証方式

SSHのパスワード認証は、接続時に暗号化されたトンネル内でユーザー名とパスワードを照合して本人確認を行う方式です。

ただし、パスワードが漏れると総当たり攻撃や辞書攻撃で簡単に突破されてしまう恐れがあるため、上で説明した公開鍵認証の利用が強く推奨されています。

SSHの接続の流れ

1.TCP接続の確立(回線をつなぐ)
まず、クライアント(あなたのパソコン)とサーバー(遠隔のパソコン)で「ここから話を始めますよ」という約束(TCPコネクション)を作ります。

2.鍵交換(セッション鍵の生成)
第三者に見られないよう、このあと使う「共通の暗号鍵」を交換。

3.サーバーの身元確認
サーバーが本物かどうか、送られてきた公開鍵などでチェックします。

4.ユーザー認証
パスワード方式公開鍵方式(事前に鍵ペアを用意)で「本当にあなたか」を認証します。

5.暗号化された通信を開始
上で決めた共通鍵を使い、以降の全データ(コマンドやファイル)が暗号化されて安全に送受信されます。

使い方!

今回はクライアントもサーバーもどちらもLinuxを利用するイメージで記事を書きます。物理的なサーバーを用意できない場合は、PC上に仮想マシンを立ち上げてそれをサーバーにしても問題ありません。

サーバーにてsshが利用でき、22番ポートが開いている状態を想定して接続をする練習をしてみましょう!

ちなみに筆者はWindowsからsshする時に設定やらなんやらするのが面倒なので、WSL(Windowsの中で使えるミニLinuxみたいなやつ)を利用しています。

ステップ0:環境を整える

それぞれのPCにOpenSSHをインストールします。(windows・macの方は特殊な手順あるので調べてください)

apt install ssh

SSHが接続できるように入り口を開けてあげます。

ufw allow 22

ステップ 1:鍵ペアを用意する

まずはクライアント側(作業PC)で公開鍵秘密鍵のペアを生成します。下のコマンドを入力すると公開鍵秘密鍵2つが/home/<username>/.sshの中に生成されます。

# 鍵ペアを新規作成(RSA 4096bit)
ssh-keygen -t rsa -b 4096

プロンプトが出たら保存先はデフォルト(Enter)、パスフレーズは任意で入力します。ここでのパスフレーズとは鍵を使うためのパスワードみたいな感じです。
秘密鍵を利用するので基本的にはパスフレーズはいらないですが、共用パソコンなどを利用する場合などには設定する方が無難かもしれません。

※生成された秘密鍵 (id_rsa) は絶対に他人へ渡さないでください。

ステップ 2:公開鍵をサーバーへ登録する

ssh-copy-id コマンドを使うと、公開鍵をサーバーの ~/.ssh/authorized_keys に自動追記できます。初回のみサーバーの root パスワードが必要です。

# 公開鍵を転送 ssh-copy-id root@<サーバーアドレス>

ssh-copy-id が使えない環境では、以下のように手動コピーでもOKです。~/.ssh/の中に保存します。

cat ~/.ssh/id_rsa.pub | ssh root@<サーバーアドレス> "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

お疲れ様でした。ここまで終わればあとは接続テストのみです。

ステップ 3:パスワード無しで接続テスト

ssh <serveraddress>

初回接続時にはサーバーのホスト鍵指紋を確認するメッセージが出ます。表示内容を確認して yes と入力してください。次回以降は自動で認証が通り、パスワード入力は不要になります。

トラブルシューティング (つながらないときは)

  • Permission denied (publickey):公開鍵が登録されていない/authorized_keys の権限が緩い
    chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys
  • サーバーのポートが空いていない:案外うっかり空いていない時があります。
    サーバーでポートが開かれているかです。ufw allow 22 でポートの使用許可を出しましょう。

まとめ

少し駆け足でしたが、SSHについてパパッとまとめてみました。サーバーとSSHは切っても切り離せない関係なのでぜひ使えるようになってみてください。

とりあえず慣れて怖がらず使えることが第一目標です。何回か練習してみましょう!!