SSH(Secure SHell)とは、暗号化を用いたリモートホストの遠隔操作用のプロトコル。
ネットワーク経由で他のコンピュータに接続して操作する場合に使用。
SSHでは通信内容が暗号化されますが、同じ遠隔操作用のプロトコルであるTELNETでは通信内容が暗号化されないためパスワードや情報を盗み見られる可能性があるので、SSHでのリモート接続の方がより安全。
クライアントがSSHでサーバへログインする際、ホスト認証とユーザ認証が行われます。
・ホスト認証
ホスト認証は、SSHクライアントが接続先のリモートホスト(SSHサーバ)が正しいホストかどうかを確認する(なりすましを防ぐ)ために行います。
クライアントからの接続時に、リモートホストは自身の公開鍵をSSHクライアントに送信します。SSHクライアントは受け取った公開鍵と、SSHクライアントの「~/.ssh/known_hosts」ファイルに格納されているSSHサーバの公開鍵を比べることで正しいホストかどうかを確認します。(「~」はそのユーザのホームディレクトリを示します。)
初めて接続する際はSSHクライアントの「~/.ssh/known_hosts」ファイルにSSHサーバの公開鍵が格納されていないため、サーバの公開鍵を登録するかどうか問われます。「yes」と入力すると「~/.ssh/known_hosts」に登録されます。2回目以降は問われません
SSHサーバの公開鍵と秘密鍵はOpenSSHをインストールする際「/etc/ssh」ディレクトリ配下に作成され、「known_hosts」ファイルにはホスト名・IPアドレス、鍵の種類、ホストの公開鍵が格納されます
・ユーザ認証
ユーザ認証は、SSHクライアントで接続してくるユーザが正当なユーザかどうかを確認するために行います。
ユーザ認証にはパスワード方式と公開鍵方式の2種類。
パスワード方式...ローカルでのログインと同様に、接続ユーザのID/パスワードで認証する
公開鍵方式...公開鍵と秘密鍵の組み合わせで認証する。パスワードを使用せず、鍵を持つ者がログインできる
公開鍵方式を使用する場合は、ユーザごとに一対の公開鍵と秘密鍵を作成して、公開鍵の方をSSHサーバの「~/.ssh/authorized_keys」に登録しておきます。サーバはSSH接続を受け付けた際、登録されている公開鍵とユーザの秘密鍵のペアが一致するかどうかを確認します。一致しなければログインさせません。これによりパスワード方式よりもセキュリティ上強固なユーザ認証を実現します。
【SSHの設定】
ここでは、CentOS 7 + OpenSSH(SSHのソフトウェア)で構成したSSHサーバへ、公開鍵方式で接続する例
CentOS 7には標準でOpenSSHがインストールされています。
OpenSSHのデフォルトのユーザ認証はパスワード方式です。
- sshdサービスの起動
接続先のSSHサーバ上で、SSHのサーバプログラムであるsshdサービスを起動しておきます。
systemctl start sshd
- 鍵ペアの作成
SSH接続するユーザごとに「ssh-keygen」コマンドを使用して公開鍵と秘密鍵のペアを作成します。
書式:
ssh-keygen [-t 鍵の種類]
※-tオプションを省略した場合はRSAの鍵ペアが作成されます。
SSHクライアント/SSHサーバのいずれかで作成できますが、ここではSSHクライアント上で作成します。
ssh-keygenコマンド実行時にユーザのホームディレクトリ(ログインディレクトリ)に「.ssh」というディレクトリが作成され、公開鍵と秘密鍵が格納されます。
- 鍵の配置
ユーザの公開鍵「id_rsa.pub」はサーバ上に、ユーザの秘密鍵「id_rsa」はクライアント上に配置します。
ここではクライアント上で作成した公開鍵「id_rsa.pub」をサーバにコピーします。鍵ファイルはUSBメモリに保存して運んだり、scpコマンド(SSHを使用したファイル転送)で安全に転送します。
転送したユーザの公開鍵は、サーバの認証鍵リスト「authorized_keys」ファイルに登録しておきます。
- SSHサーバの設定の変更
SSHサーバの設定ファイル「/etc/ssh/sshd_config」の次の設定項目を変更します。
PasswordAuthentication no ← パスワード認証を無効にする
PermitRootLogin no ← rootユーザ(システム管理者)でのログインを禁止する
変更を反映するために、sshdサービスに設定ファイルを再読み込みさせます。
systemctl reload sshd
- SSH接続
sshコマンドでクライアントからサーバに接続します。ログイン後はリモートホストでの操作が可能。
書式:
ssh [オプション] [SSH接続ユーザ名@]SSHサーバアドレス
※「SSH接続ユーザ名@」を省略した場合は、実行しているユーザ名をSSH接続ユーザ名として接続
- SSH接続の切断
SSHサーバからログアウトするにはexitコマンドかlogoutコマンドで切断。また、Ctrl+D(CtrlキーとDを同時に押す)で制御コードEOF(End Of File: ファイルの終端を示す)を送信することによっても、bashが終了しSSH接続が切断。