公開鍵暗号化方式によるSSH接続

2011/12/12

公開暗号方式

公開鍵暗号化方式はクライアントがサーバーにアクセス要求し、サーバーは公開鍵で暗号化した乱数をクライアントに送信し、クライアントは事前に渡された秘密鍵をパスフレーズで復号化した上で乱数を復号化しハッシュ値をサーバに返し、サーバーは乱数のハッシュ値を比較して同じであれば認証します。

FTP接続とSSH接続の違い

FTPは旧来のパスワード認証方式ですが、SFTPはファイル転送に公開鍵暗号化方式(Public Key Encryption)を採用したもので、クライアントがサーバーに対してユーザー名を送信することでアクセス要求し、サーバーは乱数を生成し公開鍵(pubric key)で暗号化した上でクライアントに送信し、クライアントは事前に渡されていた秘密鍵(private key)をパスフレーズで復号化した上で、サーバーから送られてきた乱数を復号化して、ハッシュ値をサーバに返し、サーバーは送られてきた乱数のハッシュ値を比較して同じであれば認証します。

秘密鍵(private key)の拡張子pem(Privacy Enhanced Mail)は暗号化鍵や証明書をを入れておく箱(コンテナ)でありAWSサーバーへの接続時のキーペアで使用されている。上のAWS上のMySQLを管理するアプリの設定ではパスフレーズは使っていない。

公開鍵暗号化方式によるSSH接続は、管理者が公開鍵(public key)と秘密鍵(private key)を作成し公開鍵をサーバーのOpenSSHに登録します。

ログインを許可したユーザーに秘密鍵をパスフレーズで暗号化した上で渡し、秘密鍵を持ったユーザーはサーバーにアクセス要求します。

サーバーは乱数を生成しハッシュ値を計算し、公開鍵で暗号化した上でアクセス要求したユーザーに送信し、ユーザーはまずパスフレーズで秘密鍵を復号化し、サーバーから送られてきた乱数を秘密鍵で復号化し、ハッシュ値を計算しサーバーに送信します。

サーバーはユーザーから送られてきたハッシュ値がサーバーで計算したハッシュ値と同じなら認証します。

pemがコンテナである一方で、WinSCPのようなWindowsアプリ限定の秘密鍵の拡張子ppk(PuTTY Private Key files)はファイルです。

パスワード認証と暗号化認証の安全性の違い

代表的なパスワード認証であるFTP通信の場合、短い文字で構成されるパスワードがネットワーク上で無防備に送受信され、流出しやすいリスクがあります。

またHTMLフォームからパスワード認証を行うHTTP通信の場合、入力値がサーバー上で処理される過程でのリスクはサーバーのセキュリティ管理具合に依存します。

短い文字列で構成されるパスワードは、処理速度の速いCPUを積んだPCを持ってすれば、ユーザーIDとの組み合わせで総当り攻撃によりハッキングされるリスクがあります。

セキュリティリスクは以下の3箇所に存在し、パスワード認証の場合、いずれの箇所でも「漏れる」リスクがありますが、暗号化認証の場合は鍵が盗まれない限り流出しません。

  1. クライアントPC上でのセキュリティリスク
  2. 通信時のセキュリティリスク
  3. サーバー上でのセキュリティリスク

パスワード認証でアクセスコントロールされていることと、暗号化されることは全く別物であり、FTPの場合はユーザーIDとパスワードでアクセスコントロールされていますが、暗号化はされていません。

自宅の鍵を知らないうちに勝手に複製されて自宅に侵入されるのがパスワード認証のリスクであり、暗号化認証であれば少なくとも自宅の鍵を盗まれない限り侵入されないというセキュリティ上の違いがあります。

公開鍵暗号化方式(Public Key Encryption)によるSSH接続

 

OpenSSH (Open Secure Shell) は、SSHプロトコルを利用するためのソフトウェアで、Linuxサーバーや多くのUnixシステムに組み込まれているので、第三者に対してインターネット上のサーバーへのアクセスを許可する場合はこのOpenSSHで行うのが安全です。

  1. 管理者が公開鍵(public key)と秘密鍵(private key)を作成。
  2. 公開鍵をサーバーのOpenSSHに登録。
  3. ログインを許可したユーザーに秘密鍵をパスフレーズで暗号化した上で渡す。
  4. 秘密鍵を持ったユーザーはサーバーにアクセス要求(ユーザーIDを送信)。
  5. サーバーは乱数を生成しハッシュ値を計算し、公開鍵で暗号化した上でアクセス要求したユーザーに送信。
  6. ユーザーはまずパスフレーズで秘密鍵を復号化し、サーバーから送られてきた乱数を秘密鍵で復号化し、ハッシュ値を計算しサーバーに送信。
  7. サーバーはユーザーから送られてきたハッシュ値がサーバーで計算したハッシュ値と同じなら認証。

フリーウェアであるPuTTYgenでSSHで使う公開鍵と秘密鍵を生成し、公開鍵はサーバーのLinux OSのOpenSSHに登録し、WinSCPでSSH接続するときに、秘密鍵を使ってログインするという流れです。

ただし秘密鍵自体はファイルで渡されますので、ファイル自体を盗まれることでパスワード認証と同じようにハッキングされてしまわないように、秘密鍵自体もパスフレーズで暗号化して渡します。

秘密鍵をパスフレーズとセットで盗まれてしまえば、当然ながらハッキングされてしまいますが、知らないところでパスワードが漏れるリスクのあるパスワード認証に比べて、自分の手元の鍵を盗まれない限り安全なSSHとでは格段にセキュリティのレベルが違います。

公開鍵暗号化方式を採用したノートPCのセキュリティ管理

ノートPCのBIOSにユーザーIDとパスワードをかけるのが通常のパスワード認証によるアクセス制御ですが、FTPと同じようにIDとパスワードが漏れれば、簡単に他人がログインできてしまいます。

暗号化ソフト(公開鍵)でPC自体へのアクセスを制御し、ユーザーに復号化用のSDカード(秘密鍵)を持たせることでアクセスを制御することができます。

ファイル転送に公開鍵暗号方式を採用したSFTP

FTPもSFTP(SSH File Transfer Protocol)もファイル転送プロトコルであり、例えるならFTPがチェーンロックでSFTPは南京錠です。昔、高校生の頃は自転車にチェーンロックをかけても、あっさり盗まれましたからw。

上述のとおりFTPは一般的なパスワード認証方式であり、サーバーに設定したユーザーIDとパスワードでクライアントから接続するので、パスワードが流出すれば簡単にハッキングされます。

SFTPはデータ所有者側で作成した公開鍵と秘密鍵のうち、公開鍵をサーバーに登録し、アクセスを許可したクライアントにパスフレーズで暗号化された秘密鍵を事前に渡しておきます。家(サーバーのデータ)を南京錠(公開鍵)で鍵をかけて家族に鍵(暗号化された秘密鍵)を渡すイメージです。

  1. クライアントがサーバーに対してユーザー名を送信することでアクセス要求する。
  2. サーバーは乱数を生成し公開鍵で暗号化した上でクライアントに送信する。
  3. クライアントは事前に渡されていた秘密鍵をパスフレーズで復号化した上で、サーバーから送られてきた乱数を復号化して、ハッシュ値をサーバに返す。
  4. サーバーは送られてきた乱数のハッシュ値を比較して同じであれば認証する。

ちなみにFTPとSFTPの間にFTPS(FTP over TLS/SSL)というのがありまして、SSHのような公開鍵暗号方式ではないけれど暗号化してデータを転送できるものがあります。