こんにちは、pixiv開発支援チームのmipsparcです。
パスワード、もしかして使いまわしていますか? 複数のサービスで同じパスワードを利用していると、「パスワードリスト型攻撃」によって不正アクセスの被害を受けてしまうかもしれません。 パスワードリスト型攻撃の被害にあわないためには、ブラウザやパスワード管理ツールで自動生成された安全なパスワードを利用するのが好ましいです。
しかし、実際には多くの人が「使いまわしたパスワード」や「簡単なパスワード」(以下、脆弱なパスワード)を利用していますし、啓蒙活動にも限界があります。 pixivではサイバー攻撃への対策を複数とっていますが、根本的な対策のひとつとして、脆弱なパスワードを新しく設定できないようにしました。
脆弱なパスワードの判定方法
脆弱なパスワードの利用はどのように防ぐことができるでしょうか?
好ましくない方法としては、「英数字、大文字小文字記号すべてを含む」といった制限を設ける方法があります。しかし、これではパスワードの使い回しの防止にはなりません。また、仕方なくパスワードの末尾に「1」などをつけてこの制限を回避してしまうユーザーもいるでしょう。 ほかの一般的な方法としては、辞書に載っている単語やキー配置などから推測できる単語のリストを作成して制限することがあると思います。こちらは簡単なパスワードを防止するのには有効な方法ですが、パスワードの使い回しの防止にはなりませんし、リストを網羅的に作成するのは困難でしょう。
今回は先進的な取り組みとして、過去に他のサービスで漏洩済みとして公開されている、ハッシュ化*1された漏洩パスワードのリストを使用しました。この方法は、実際にユーザーに使われている「生きた」パスワードのリストなので、網羅性がある点で優れています。また、1人が複数サービスで使いまわしているパスワードなども掲載されているため、使い回しの防止にもなります。
ハッシュ化された漏洩パスワードのリストは「Have I Been Pwned」(以下HIBP)というサービスによりセキュリティの向上のために非営利で提供されています。
漏洩パスワードを保有することについての違法性については、不正アクセス禁止法(不正アクセス行為の禁止等に関する法律)第6条に「何人も、不正アクセス行為の用に供する目的で、不正に取得されたアクセス制御機能に係る他人の識別符号を保管してはならない。」とあり、安全確保目的でパスワードを保持することに問題はないと解釈できます。
HIBPから提供されているハッシュ化された漏洩パスワードのリストには、パスワードのSHA-1ハッシュ値と、そのパスワードが過去に漏洩した回数が含まれています。回数が多いほどより一般的で単純なパスワードだという指標になります。以下にその例を示します。
C7A4D890AC7326FA165E590249D32C46498F49B1 : 23547453回 7F3CCBD108E84037A2FD769956CC3CC47AEA4314 : 7799814回 1B3B77A3500CDE106787A7F45147FF00577F25E1 : 3912816回 B5AA164E9C9BF3F3602852B0C68F33B1E76EF88D : 3730471回 D3F4B20FD71CEB832BC06D4E96941A70F1D9E0D3 : 3120735回 C722F22B29D728A82FF29512438E39420836C7D0 : 2938594回
ハッシュ値を漏洩した回数とともにデータベースに格納することで、漏洩回数が多いパスワードから段階的に使用できなくすることができます。なお、執筆時最新のバージョン5では5億5千万件程度のハッシュ値が含まれており、情報量が大きいので取り扱いには注意が必要です。pixivでは運用との兼ね合いから、一定の漏洩回数以上のパスワードのみをデータベースに格納しています。
先行事例
PythonのソフトウェアリポジトリサービスのPyPIでは、すでにHIBPを利用して漏洩したパスワードを使用しているユーザーに告知するセキュリティ対策を行っています。
また、Google パスワード マネージャーにも、保存されたパスワードが不正利用されていないかを確認する機能があり、同様に漏洩したパスワードを活用しています。
この取り組みの根拠
NIST(アメリカ国立標準技術研究所)は、文書SP 800-63B「Digital Identity Guidelines: Authentication and Lifecycle Management」内の「5.1.1.2 Memorized Secret Verifiers」(いわゆるパスワードに相当する)について、以下の見解を示しています。(原文から翻訳・要約)
- 過去の漏洩事案により入手したパスワード
- 辞書にある単語
- 繰り返したり順番になっている文字列(
aaaaaa
や1234abcd
など)- サービス名やユーザー名など、推測可能な単語
などに入力されたパスワードが合致した場合は拒絶して、その理由を伝えるものとする。
漏洩パスワードを設定できなくする本施策はこの見解に沿うものです。なお、「辞書にある単語」や「繰り返したり順番になっている単語」もその多くが漏洩パスワードに含まれているため、別途追加することはしていません。
今後の展望
新規設定だけでなく、すでにご利用いただいている方についても脆弱なパスワードを順次変更いただく取り組みを進めていきたいと考えています。 さらに、FIDOや多要素認証といったパスワードに頼らない認証方法によるセキュリティ強化についても対応していく計画です。
参考リンク
- NIST SP 800-63B https://pages.nist.gov/800-63-3/sp800-63b.html
- Why is PyPI telling me my password is compromised? - PyPI https://pypi.org/help/#compromised-password
- Google パスワードマネージャー https://passwords.google.com/
*1:ハッシュ化: 逆関数の計算が困難な関数「ハッシュ関数」によりもとのパスワードへの復元が困難な状態にすること。