リモート通信プロトコル「SSH」

前回までは、コンソールから一般ユーザーでログインして作業することを前提に、必要に応じてsuコマンドやsudoコマンドを使って操作権限を拡張する方法を紹介してきた。

しかし実際には、Linuxサーバや*BSD(BSD系統のOS群)サーバに物理的にアクセスしてコンソールから操作するというのはまれである。ほとんどの場合、データセンターやサーバ・ルームに設置されたサーバに、遠隔操作でログインして作業することになる。そしてその場合、SSHというプロトコルを利用するのが一般的だ。

SSHを実装したソフトウェアはいくつか存在するが、もっとも高いシェアを確保しているのが「OpenSSH」だと言われている。サーバ管理者でOpenSSHを使わないというのは、ほぼありえないと言ってよいだろう。OpenSSHはOpenBSDプロジェクトの下で開発が進められており、*BSDのほかMac OS X、LinuxなどありとあらゆるOSに移植されて使われている。

OpenSSHは最初から使用できる状態に設定されていることが多いので気軽に使いがちだが、デフォルトでは利便性が優先されており、セキュリティ面が弱い設定になっているケースが多い。今回は、このセキュリティを強化してくれるログイン認証方式を紹介しよう。

認証方式アレコレ

SSHでは、クライアントがサーバにリモート・ログインする際の認証方式として、以下のように複数の方法が用意されている。

  • パスワード認証:サーバに用意されているアカウント・データをそのままSSHのログイン・ユーザーとして使用する方式。デフォルトで有効になっていることが多い。
  • チャレンジ・レスポンス認証:アカウント・データとしてはパスワード認証と同じものを使うことが多いが、そのままやりとりするのではなく、まずクライアントからの認証要求を受けたサーバ側が「チャレンジ」と呼ばれるランダムな数値列を返信し、受けたクライアント側でパスワードとチャレンジを合成した「レスポンス」をサーバに返信するという特徴がある。
  • 公開鍵認証:あらかじめ生成しておいたペアの公開鍵/秘密鍵を使った認証方式。公開鍵をサーバに、秘密鍵をクライアントに保存しておき、このペアの鍵が存在しているホスト間のみアクセスを許可するというやり方だ。パスワード認証と同じく、この方法もデフォルトで有効になっていることが多い。利用するには、公開鍵/秘密鍵を生成し、それぞれデプロイしておく必要がある。
  • ホスト・ベース認証:サーバとクライアントの接続をホスト・レベルで実施するため、サーバに登録されているクライアントからアクセスがあった場合、ユーザー・レベルでの認証は行われずにアクセスが許可される。

これらのうち、ホスト・ベース認証は、物理的に信頼できる状況にある2ホスト間で設定して利用することが多い。そのため、インターネット経由で利用するようなケースではあまり使われない印象だ。

基本は公開鍵認証!

まずはどの認証方式を使うのか選ぶ必要があるわけだが、基本的には公開鍵認証を使うものだと思っておいてほしい。公開鍵認証以外の認証方式については機能を無効にして、利用できないようにしてしまおう。もちろん、rootでのログインなどもってのほかである。詳細な設定方法については今後の連載で説明するとして、「SSHを利用したログインには、公開鍵認証だけを使う」と覚えておこう。

先述のとおり、公開鍵認証ではクライアントで公開鍵と秘密鍵を生成して、秘密鍵はクライアントで保存し、公開鍵をサーバに登録する。この公開鍵/秘密鍵の運用方法については、いくつかやり方があるのだが、基本的には「1台の物理PCにつき、1つの公開鍵/秘密鍵を生成して利用する」と考えてほしい。こうしておくと、次のような利点がある。

  • クライアントとして利用していたノートPCを紛失した場合、そのノートPCの秘密鍵と対応する公開鍵をサーバ側から削除するだけで不正アクセスを防止できる
  • サーバに覚えのない不正アクセスがあった場合、どのPCの鍵が盗まれたのかが容易に特定できる

公開鍵認証は、サーバを管理するにあたり、複数のデスクトップPCやノートPCを利用する場合に特に有効だ。大量のホストの相互接続を設定するとなると管理方法を考える必要があるが、基本はこれだと覚えておいてほしい。

今回のおさらい

今回はおさらいは、次のようになる。

  • リモート・ログインにはSSHを使う
  • 認証方式には、公開鍵認証を使う
  • 公開鍵認証以外の認証方式は、無効にする
  • rootでリモート・ログインしない
  • 1台のPCにつき、1つの公開鍵/秘密鍵を利用する

公開鍵/秘密鍵による公開鍵認証は、リモート・ログインの基本中の基本だ。鍵の管理を徹底化して、問題発生時にも責任の所在を明確にする。用意周到な運用が、我が身を守るのである。