鍵のロールオーバー

Debian セキュリティ勧告 1571 で、Debian セキュリティチームは、Debian およびその派生ディストリビューションの OpenSSL で使用されている乱数生成器の欠陥を修正しました。この欠陥によって、一部の暗号鍵は、 本来あるべき姿よりも遥かに一般的なものとなってしまっているため、攻撃者は、 システムに関するごくわずかな知識を持っていれば、 総当たり攻撃を通じて鍵を推測できてしまう可能性があります。この問題は、 特に OpenSSH、OpenVPN、SSL 証明書の使用に影響します。

このページの文書は、鍵の総交換 (ロールオーバー) の手順を、OpenSSL の欠陥に影響される鍵を持つ各パッケージ別に示したものです。

他のソフトウェアも暗号鍵を用いますが、鍵生成や交換に OpenSSL を使っていないため 欠陥はありません

これ以外のソフトウェアでのキーロールオーバの手順については、ユーザからの情報 https://wiki.debian.org/SSLkeys が参考になります。

OpenSSH

更新版のパッケージが DSA-1576 を通じてリリースされており、鍵の変換が楽になっています。

1. DSA-1576 のセキュリティ更新をインストールする

更新の適用が終わったならば、可能な場合には脆弱なユーザ鍵は自動的に拒絶されます。 但し全部の検出は行えません。ユーザの個人認証にこのような鍵を使っている場合は、鍵は 直後に動作しなくなり、新しい鍵で更新しなければならなくなります (手順 3 参照)。

OpenSSH ホスト鍵は、OpenSSH セキュリティ更新を適用後自動的に再作成さ れます。更新時には、この処理の前にユーザへの確認問い合わせが行われま す。

2. OpenSSH known_hosts ファイルを更新する

ホスト鍵を再生成した場合、SSH を使っているシステムに接続の際、 known_hosts のホスト鍵の更新がすんでいない場合には以下の警告画面が表示されます

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    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 the RSA host key has just been changed.

この場合、実際にホスト鍵が変更されているので、警告メッセージにあるよ うに対象の known_hosts を更新する必要があります。 サーバ鍵の交換には、信用できる通信路を使用することを勧めます。鍵はサ ーバ上の /etc/ssh/ssh_host_rsa_key.pub に置かれます。鍵のフィンガー プリントは以下のコマンドで見ることができます。

ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key.pub

ユーザ別の known_hosts ファイル以外に、システム全体で有効なホストフ ァイル /etc/ssh/ssh_known_hosts が存在しているかもしれません。このファ イルは ssh クライアントと sshd の両方で hosts.equiv 機能を提供するた めに使われています。このファイルも同様に更新する必要があります。

3. すべての OpenSSH ユーザ鍵をチェックする

一番安全な手順は、欠陥のないシステムで作成された鍵だと強く確信できる 場合を除いて全ての OpenSSH 鍵を再作成することです。

鍵が安全かどうかは、この更新に含まれている ssh-vulnkey ツールでチ ェックできます。既定では、ssh-vulnkey はユーザ鍵の標準の格納場所 (~/.ssh/id_rsa, ~/.ssh/id_dsa と ~/.ssh/identity) と、authorized_keys ファイル (~/.ssh/authorized_keys と ~/.ssh/authorized_keys2)、およ びシステムのホスト鍵 (/etc/ssh/ssh_host_dsa_key と /etc/ssh/ssh_host_rsa_key) をチェックします。

自分の全ての鍵が標準の場所 (~/.ssh/id_rsa, ~/.ssh/id_dsa, または ~/.ssh/identity) に格納されている場合、それらをチェックするには以下 のコマンドを使います。

ssh-vulnkey

システムの全ての鍵をチェックするには以下のようにします

sudo ssh-vulnkey -a

非標準の場所での鍵をチェックするには以下のようにします

ssh-vulnkey /path/to/key

もし ssh-vulnkey が Unknown (no blacklist information) と答えた場合、キーが脆弱かどうかの情報がないということです。 疑わしい場合は、新しい鍵を作成して、全部のサーバから古い鍵を削除して ください。

4. 影響を受けるユーザ鍵を再作成する

ユーザの個人認証に使用する OpenSSH 鍵は、手動で再生成する必要があり ます。これは生成後に他のシステムに移動した鍵を含みます。

新しい鍵は ssh-keygen を使って作成します。

   $ ssh-keygen
   Generating public/private rsa key pair.
   Enter file in which to save the key (/home/user/.ssh/id_rsa):
   Enter passphrase (empty for no passphrase):
   Enter same passphrase again:
   Your identification has been saved in /home/user/.ssh/id_rsa.
   Your public key has been saved in /home/user/.ssh/id_rsa.pub.
   The key fingerprint is:
   00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00 user@host
   

5. authorized_keys ファイルを更新する (必要に応じて実行)

ユーザ鍵を再作成した後、対応する公開鍵は必要なリモートシステムの authorized_keys (または authorized_keys2) に配布する必要があります。 当該ファイルから古い鍵を削除することを忘れないようにしてください。

OpenSSL: 一般的な PEM 鍵生成手順の説明

以下の記述は、PEM で符号化された証明書を (再) 生成するユーザのための、 単なるリマインダです。この手順の他にも、 おそらくサイトには鍵の管理方法に関する取り決めがあるので、それにも従うべきでしょう。 さらに、下記の方法で自己署名を用いるよりも、 第三者の証明機関に再度署名してもらう必要があるかもしれません。

cd /etc/ssl/private
openssl genrsa 1024 > mysite.pem
cd /etc/ssl/certs
openssl req -new -key ../private/mysite.pem -x509 -days 9999 -out mysite.pem

bincimap

bincimap パッケージでは、自動的に openssl プログラムを用いて bincimap-ssl サービス用の自己署名証明書を作成し、それを /etc/ssl/certs/imapd.pem に配置します。 再生成するには、以下のコマンドを実行してください。

rm -f /etc/ssl/certs/imapd.pem
dpkg-reconfigure bincimap

boxbackup

boxbackup は Debian 安定版 (stable) には存在しません。テスト版 (testing) である lenny にのみ存在します。

開発元は、ランダムさが不十分な疑似乱数生成器 (PRNG) を用いて作成された鍵の最初の影響分析の結果を公開しました。詳細はこちらで読めます。

お使いの OpenSSL の PRNG のランダムさが不十分な場合は、以下のことをする必要があります。

cryptsetup

cryptsetup 自体は暗号化に OpenSSL を使用していません (これは、LUKS と dm-crypt の両方のデバイスに言えることです)。

もし、cryptsetup が SSL で暗号化された鍵ファイルを使用するようという設定 (これは非デフォルトのセットアップで、 ユーザが明示的に設定しなければ使われることはありません) になっており、 欠陥のあるバージョンの OpenSSL が鍵ファイルの生成に使用されたのであれば、 (食塩が本当にランダムではないように) 鍵ファイルの暗号化は、 期待されるよりも弱い可能性があります。

解決策は、 鍵ファイルを暗号化しなおす (ただし暗号化された鍵が第三者に漏洩していないとある程度確信できる場合) か、欠陥の影響を受けるパーティションを新たな鍵を用いて消去し、再インストールするか、 のどちらかです。

鍵ファイルを暗号化しなおす方法の説明は以下のとおりです。

SSL で暗号化された各鍵ファイルについて、以下のコマンドを実行してください。 ただし、<ssl_encrypted_key_path> は実際の鍵ファイルのパスで置き換えてください。

tmpkey=$(tempfile)
openssl enc -aes-256-cbc -d -salt -in <ssl_encrypted_key_path> -out "$tmpkey"
shred -uz <ssl_encrypted_key_path>
openssl enc -aes-256-cbc -e -salt -in "$tmpkey" -out <ssl_encrypted_key_path>
shred -uz "$tmpkey"

dropbear

/etc/ssh/*host* という鍵がある場合は、Dropbear の鍵を更新する前に、 まず /etc/ssh/*host* を削除するか、または OpenSSH に関する説明に従ってください。

Dropbear の postinst は、dropbear のホスト鍵が見つからない場合、 既存の OpenSSH の鍵を dropbear 形式に変換します。

rm /etc/dropbear/*_host_key
dpkg-reconfigure dropbear

注意: Dropbear 自体が生成した鍵は脆弱ではありません (OpenSSL ではなく libtomcrypt を使用しています)。

ekg

ekg プログラムや ekg2 プログラム (後者は experimental のみに含まれています) のユーザで、SIM暗号化機能を使用した人や、 /key [-g|--generate]コマンド (鍵対の生成に libssl を使用します) を用いて鍵対を生成した人は、 libssl をアップグレードしてプログラムを再起動した後で鍵を生成しなおしてください。

開発元では、開発者たちがウェブサイトに通知を出しています: http://ekg.chmurka.net/index.php

さらに手助けが必要な場合は、ekg-users@lists.ziew.org や ekg2-users@lists.ziew.org で質問してください (英語とポーランド語の両方でやりとりできます)。

ftpd-ssl

rm -f /etc/ftpd-ssl/ftpd.pem /etc/ssl/certs/ftpd.pem
dpkg-reconfigure ftpd-ssl

この手順により、標準のセットアップはカバーされます。ローカルの管理者がこれ以上の SSL インフラストラクチャに関する設定を行っている場合、それらに関する鍵の再作成も同様に必 要です。

gforge

lenny と sid に収録された gforge-web-apache2 パッケージは、他にサイト証明書が存在してい なかった場合にはダミーのサイト証明書を用いてウェブサイトを設定します。 ユーザはそれを追って正式な証明書に交換することが推奨されているわけです。 問題のダミーの証明書は名称が Snake Oil になっており、すでに脆弱だと (SSL のバグと関係 なしに) 明白なものとみなすべきものです。 しかしながら、一部のユーザは深く考えずこの証明書を受け入れてしまうかもしれません。

MIT Kerberos (krb5)

Debian 4.0 (Etch) の MIT Kerberos は OpenSSL を全く使っていないため Debian 4.0 の Kerberos には影響は全くありません。

lenny では、OpenSSL を使う別パッケージ krb5-pkinit があります。 MIT Kerberos 自体は、PKINIT プラグインを使っている場合でも、長期にわたって使用する鍵対 を生成しません。従って長期利用の鍵対に関する欠陥は、MIT Kerberos ソフトウェアとは別に作 成されたものです。PKINIT プラグインは、存在している鍵対を参照するだけで、鍵の管理に は責任を持ちません。

PKINIT が用いる鍵対は、 欠陥のある Debian システムで生成されている場合、欠陥を持つかもしれません。 但し、このような生成は MIT Kerberos の枠組みの外の話です。

しかし、OpenSSL の乱数生成器は、PKINIT 認証が使用されている場合は DH 交換に使用されます。つまり、攻撃者が総当たり攻撃を用いて、PKINIT 認証に対する KDC のレスポンスにアクセスし、 その後でその認証からのサービスチケットを用いて作成されたあらゆるセッションにアクセスできる可能性があります。

何らかの KDC で lenny の PKINIT プラグインを使用している場合は、すぐに KDC の libssl0.9.8 パッケージをアップグレードし、以下のコマンドを実行して Kerberos KDC を再起動してください。

/etc/init.d/krb5-kdc restart

欠陥のある libssl を使用している Kerberos KDC を用いた PKINIT 認証に由来する、 あらゆる Kerberos チケット保証チケット (TGT) や暗号化されたセッションは、 疑ってかかるべきです。パケットキャプチャを使用する攻撃者は、 これらの鍵やセッションを侵害できる可能性があります。

Nessus

Nessus サーバパッケージ (nessusd) のインストール後スクリプトは、 Nessus サーバとクライアントの間の安全な接続のためにいくつかの SSL 鍵を 作成します。 この接続チャネルは、悪意を持つユーザがサーバ/クライアント間で交換される 情報 (リモートホストの脆弱性の情報も含む) を横取りでき、ログインしたユーザ としてサーバにコマンドを送る潜在的可能性があるるため、侵害され得ると 考えられます。

加えて、管理者がリモート認証のために、このセキュリティ問題の影響を受ける OpenSSL バージョンをインストールしたサーバで Nessus CA 鍵またはユーザ 証明書を (nessus-mkcert-clientを使って) 作成していた場合、これらの鍵 は侵害できる可能性があると考えられます。Nessus サーバにアクセス権限を持つ リモートユーザは、攻撃を許可されているためにサーバに攻撃を実行可能で、 ローカルの設定でアップロードプラグインを有効にしている場合 (Debian での デフォルトは no です) は、 root 権限で Nessus サーバ内で実行される ということに注意してください。

メンテナ設定スクリプトは、設定時に、OpenSSL 証明書が見つからない場合それを再生成します。よって、次のように証明書を削除して、新しいものを生成する必要があります:

rm -f /var/lib/nessus/CA/cacert.pem
rm -f /var/lib/nessus/CA/servercert.pem
rm -f /var/lib/nessus/private/CA/cakey.pem
rm -f /var/lib/nessus/private/CA/serverkey.pem
dpkg-reconfigure nessusd

これを行ったら、/var/lib/nessus/users/USERNAME/auth にある古いユーザ鍵を 削除して、それらを nessus-mkcert-client で再度生成する必要があります。 古い鍵は CA 鍵が削除された時点で無効になります。

CA 鍵を再生成後、新しい CA 証明書をユーザに配布する必要もあります。 ユーザは一度再接続して、Nessus サーバからの新しい証明書を許可しなければ なりません。古いサーバ用の証明書の設定は自動で削除されるはずですが、 .nessusrc.cert (Nessus クライアントを使っている場合) または .openvasrc.cert (OpenVAS クライアントを使っている場合) を 編集し手動で削除することもできます。

OpenSWAN / StrongSWAN

rm /etc/ipsec.d/private/`hostname`Key.pem /etc/ipsec.d/certs/`hostname`Cert.pem
dpkg-reconfigure (open|strong)swan
/etc/init.d/ipsec restart

注意: ipsec サービスを再起動すると、その時点でオープンされている全ての IPSec コネクションが切断されます。 接続の反対側では再起動が必要になるかもしれません。

OpenVPN

秘密鍵ファイルをバックアップしてください。鍵の名前は好きにつけられ、 以下のコマンドを実行することで検出されます。

grep secret /etc/openvpn/*.conf

これらの鍵を以下のコマンドで再作成してください。

openvpn --genkey --secret SECRET_FILENAME

この後、共有の秘密鍵をリモートホストにコピーし、両端のホストで以下のコマンドを使って VPN を再起動してください。

/etc/init.d/openvpn force-reload

Proftpd

Debian パッケージでは鍵の生成を行うようになっていません。 したがって、以下の手順は、外部で SSL 鍵を作成した場合にのみ必要となるはずです。

次に proftpd を不安定版 (unstable) にアップロードする際には、 下記のコメントを tls.conf のテンプレートに含める予定です。

自己署名証明書の生成方法は、OpenSSL における一般的な手順のセクションで提案されているものとは、少し異なります。 これは、デーモンの起動時に明示的にパスワードを使用するのを避けるためです。

自己署名証明書の (再) 生成は、次のようなコマンドでできます。

 openssl req -x509 -newkey rsa:1024 -keyout /etc/ssl/private/proftpd.key -out /etc/ssl/certs/proftpd.crt -nodes -days 365

どちらのファイルも、読めるのは root のみでなくてはなりません。 ファイルのパスの確認や確認は、以下の設定ディレクティブでできます。

TLSRSACertificateFile                   /etc/ssl/certs/proftpd.crt
TLSRSACertificateKeyFile                /etc/ssl/private/proftpd.key
TLSCACertificateFile                    /etc/ssl/certs/CA.pem
TLSOptions                              NoCertRequest

puppet

puppet の証明書を扱うには二つの方法があります。capistrano を使う方法と、手動で行う方法です。

capistrano を使った場合の Puppet SSL 証明書を再作成する方法は、以下のページで詳しく説 明されています。 http://reductivelabs.com/trac/puppet/wiki/RegenerateSSL

手動で行うには、以下の手順をおこないます。

  1. CA 情報を消し去って再作成しなければなりません
    /etc/init.d/puppetmaster stop
    rm -rf $vardir/ssl/*
    /etc/init.d/puppetmaster start
    

    但し、init スクリプトから puppetmaster を起動する代わりに mongrel を実行している場合 は、まずフロントエンドのウェブリスナ (apache, nginx, etc.) を止めてから、以下の処理を 行う必要があるでしょう。

    puppetmasterd --daemonize ; sleep 30 ; pkill -f 'ruby /usr/sbin/puppetmasterd'
    

    このような処理が必要なのは、何らかの理由で mongrel を実行している場合、 puppetmaster が CA の再作成を行わないからです。

  2. 全てのクライアント証明書を消去する
    /etc/init.d/puppet stop
    rm $vardir/ssl/*
    
  3. 各クライアントから、新しい証明書を要求する。
    puppetd --onetime --debug --ignorecache --no-daemonize
    
  4. 全ての要求を取り込んだら、全部にまとめて署名できます
    puppetca --sign --all
    
  5. puppet クライアントを起動する
    /etc/init.d/puppet start
    

その方が好きなら、autosign を一時的に有効にしておくこともできます。

sendmail

sendmail は、(etch においても lenny においても) インストール時に、 デフォルトの OpenSSL 証明書を作成することを選択できます。

鍵のロールオーバーの手順は、以下のとおりごく簡単です。

/usr/share/sendmail/update_tls new

/etc/mail/tls 内のテンプレートをカスタマイズした場合は、 そのテンプレートの値が新たな証明書の作成に再利用されます。

ssl-cert

snakeoil 証明書 /etc/ssl/certs/ssl-cert-snakeoil.pem は、以下のようにして再作成できます。

make-ssl-cert generate-default-snakeoil --force-overwrite

telnetd-ssl

rm -f /etc/telnetd-ssl/telnetd.pem /etc/ssl/certs/telnetd.pem
dpkg-reconfigure telnetd-ssl

この手順により、標準のセットアップはカバーされます。ローカルの管理者がこれ以上の ssl インフラストラクチャに関する設定を行っている場合、それらに関する鍵の再作成も同様に必 要です。

tinc

次の方法で、疑わしい公開鍵・秘密鍵はすべて削除してください。

  1. rsa_key.priv を削除する。
  2. hosts/ ディレクトリ内のファイルをすべて編集して、公開鍵のブロックを削除する。

次の方法で、新たな公開鍵・秘密鍵の鍵対を生成してください。

tincd -n <netname> -K

VPN の他のメンバーと、新たな公開鍵とともにホストの設定ファイルを交換してください。 tinc デーモンを再起動するのをお忘れなく。

tor

Tor は安定版 (stable) には収録されていませんが、lenny では欠陥の影響を受けます。

バージョン 0.1.2.x を実行するクライアントは欠陥の影響を受けません。 あらゆるバージョンを実行する Tor ノードや秘匿サービス提供者、およびバージョン 0.2.0.x を使用するユーザは、欠陥の影響を受けます。

Tor アナウンス用メーリングリスト上の脆弱性のアナウンスを参照してください。

バージョン 0.1.2.19-3 (テスト版 (testing) および不安定版 (unstable)、 backports.org、通常の noreply.org のリポジトリから入手可能) またはバージョン 0.2.0.26-rc-1 (experimental および通常の noreply.org のリポジトリ) へのアップグレードをお勧めします。これらのバージョンでリレーを実行すると、 強制的に新しいサーバ鍵 (/var/lib/tor/keys/secret_*) が生成されます。

パッケージのインフラストラクチャ (debian-tor というユーザや、/var/lib/tor という DataDirectory など) を利用せずに Tor ノードを実行する場合は、 問題のある鍵を手で削除する必要があります。前述の勧告のリンクを参照してください。

秘匿サービス提供者であり、libssl に問題があった期間に鍵を生成した場合は、 秘匿サービスの秘密鍵を削除してください。それによって秘匿サービスのホスト名が変わり、 サーバの再設定が必要になるかもしれません。

バージョン 0.2.0.x を実行している場合は、アップグレードを強くお勧めします。 6 つの v3 認証サーバのうち 3 つが欠陥のある鍵を使用しているからです。 古いバージョン 0.2.0.x は、1 〜 2 週間で動作を停止する予定です。

xrdp

xrdp は生成された鍵を使用しています。 殆どのクライアントはデフォルトではこれらの鍵をチェックしないため、 鍵を交換しても大きな問題は出ません。単に以下のようにしてください。

rm /etc/xrdp/rsakeys.ini
/etc/init.d/xrdp restart

xrdp は安定版 (stable) には収録されていません。