Linux
RaspberryPi
WiFi
セキュリティ
wpa_supplicant

wpa_supplicant.conf に書く PSK を wpa_passphrase コマンドで暗号化する意味はあんまし無い

はじめに

Linuxで無線LANの設定をするときに、以下のように wpa_passphrase コマンドを使うと思います。

pi@raspberrypi:~ $ wpa_passphrase ssid01 passwordofssdi01
network={
        ssid="ssid01"
        #psk="passwordofssdi01"
        psk=ba5354bc7fada71ea01250be88bf5c75a5e806bce7a617a5671a14f5b84bb0ef
}

これってあんまし意味無いよねというお話をします。

設定ファイルに書かれるパスワードを暗号化することの意義

まず一般論から。

設定ファイルにパスワードが平文で書いてあると不安になります。

そこで、暗号化しようと思います。

暗号化する場合、それのための「鍵」が必要になります。

しかしながら、鍵を用意したらそれをどこに保存するのか? という問題が発生します。

よくあるのは、「複雑なアルゴリズムで暗号化すること」を鍵とするものです。

そうすれば、鍵の保存が必要ありません。

しかし!そうするとアルゴリズムを知っている者なら誰でも復号化できてしまいます。オープンソースならだれでも知れることになります。ソースが無くても、バイナリから解析されるのは時間の問題です。

さらに、利用者に「暗号化されてて安心」という印象を与えてしまい、設定ファイルの保護に意識が向かなくなるので、そこが運用上のセキュリティ脆弱性となってしまいます。

伽藍とバザール (The Cathedral and the Bazaar)にも同じようなことが書いてあります。

 別の教訓は、隠すことでセキュリティを高めるという点についてのものだった。Fetchmail ユーザの一部は、ソフトの仕様を変えて、パスワードを暗号化して rc ファイルに保存するようにしてくれと要求してきた。のぞき屋たちが気軽にそれをのぞいたりできないようにしてほしいから、と言って。

 これはやらなかった。これでは実は、セキュリティはぜんぜん高まらないからだ。rc ファイルを読む許可を与えられている人間なら、だれでも fetchmail をどのみちあなたと同じように好き勝手に動かせてしまうんだから――そしてそいつがあなたのパスワード目当てなら、fetchmail のコードそのものから必要なデコーダをぬきだして、ファイルを解読して盗むことができてしまう。

 だから .fetchmailrc パスワード暗号化なんかしても、ものごとをつきつめて考えない人たちに、セキュリティが高まったかのようなまちがった幻想を与えるだけだ。ここでの一般原則は以下の通り:

  1. セキュリティシステムのセキュリティは、そこで使われてる秘密の安全性にかかっている。見かけだけの秘密は要注意。

あと、解析しなくても設定ファイルをコピーするだけで同じソフトからは利用できてしまう点でも、暗号化の意義が薄いです。

wpa_passphrase ってどんな暗号化してるの?

まずここで用いる用語の整理をしておきます。
無線アクセスポイントに設定したパスワードを ASCII passphrase とします。
wpa_passphrase で生成されたものを 256bit key とします。

ASCII passphrase から 256bit key への変換は「暗号化」しているものだと思っていました。初期化時に、それを読み取って、「復号化」して使用しているのだと。

この変換は具体的に何をやっているのかを調べてみると、PBKDF2を用いていました。これは一方向ハッシュ関数です。ということは、元のASCII passphraseに戻すことができません。。。

どーゆーことなんだー!?と思って調べてみると、

実は、WPA-PSK は 256bit key のほうを用いているのです。

ということは、我々が暗号化して保存していると思っていたものは、実はモロ平文だった。というオチです。

例えば Windows 10 の無線LANの設定で、普通は ASCII passphrase を入力すると思いますが、256bit key の方を入力しても設定出来ちゃいます。

macOSでも同様です。

マジ卍 ←言ってみたかっただけ

wpa_supplicant.conf に ASCII passphrase を書いても 256bit key を書いても本質的な違いはありません。

強いてセキュリティ的意味を考えてみると、ショルダーハックでハッカーの脳ミソに記憶されてしまうリスクが減ることぐらいでしょうか。

じゃあどうしたらいいの?

wpa_supplicant.conf を、第三者に見られないようにする。それに尽きます。

シングルユーザーで使用している場合は、ログインパスワードを知られないようにすること。また、ストレージを物理的にアクセスされないようにすることでしょうか。

マルチユーザーで使用している場合は、ファイルのパーミッションを適切にすることぐらいしかないかもしれません。厳しめの運用なら、起動の度に手動で無線LANを有効にするという手段もあります。(無線LANにぶら下がってるコンピュータをマルチユーザーで使用するのはレアケースだと思いますが。)

おわりに

無線LANパスワードの漏洩は、AWSの認証情報をうっかり漏らして採掘にでも使われてしまうケースよりは被害が少ないかもしれないけれども、被害に気づきにくい点や、漏れたデータによってはプライスレスな点で、より気を付けなければならないかもしれません。

ここは怖いインターネッツ。十分注意しましょう!