「パスワードの定期変更」を正しく理解する
技術::security
序
「パスワードの定期変更」というと、その実や経緯についての考慮なく、ただ「すべきもの」もしくは「馬鹿らしいもの」とだけ断じて正しいことを述べたかのような気になる、という人が多い。 実際、そのような観点で作られるシステムもまた、多いのが現状だ。
だが、なぜそのようなものが生まれ、運用されてきたかということを考えると、そう一筋縄ではいかないことがわかる。 たとえ結論が変わらないのだとしても、正しく理解し、その上で考えて述べるのとは別物だ。
そこで、パスワードの定期変更についての考察を深める一助となればということで、ここに記す。
ATMまでの話
パスワードの定期変更は前身として「暗証番号の定期変更」を持つ。
そして、その暗証番号の定期変更だが、その発祥は多くの人が想像するようにキャッシュカードである。
しかし、そもそもキャッシュカードや暗証番号という概念は、当初からあったわけではない。 キャッシュカードの登場はCD(現金自動預払機)の登場に伴うものである。
そして、それ以前から銀行というものはあった。 銀行において認証に使われるのが「預金通帳」と「印鑑」である。
つまり、銀行は一要素二段階認証を採用する。 これは現代とは少し異なる。当初、取引において本人確認というのは重視されていなかったから、身分証明書は必須の認証要素ではなかった。 また、そもそもの話「取引するために本人である必要がある」という前提でいるのではなく、印鑑を以て取引主体の認証を行うわけである。 通帳は対象となる口座の認証であり、いわばアカウントIDに相当する。そもそもアカウントは口座なわけだから、むしろこっちが元である。
そして、印鑑がパスワードのような役割を果たすわけだが、代理取引も可能なようになっており、取引をする者は印鑑を持つものである、という認証の形になっている。 (法人口座でも)複数の印鑑を登録できるわけではないので、ロール管理はなく、あくまでも共有される認証要素である。
なお、現代においては「本人であること」が重要視され、本人であることが確認されれば通帳、印鑑ともに所持しない状態でも(再登録を伴って)取引を行うことができる。
しかし、CDにおいては印鑑を認証に使うのがあまり現実的な話ではなかった。 そこで認証に用いるものとして、キャッシュカードと暗証番号が用いられた。 1960年代のことである(その原型はもう少し前からある)。
キャッシュカードは保有、暗証番号は知識であるため、これは二要素認証となる。
定期変更が行われるようになった経緯
ここで注意すべきは、それ以前に取引が個人に強く結びついていなかった、ということである。 これはそんなに古い話でもなく、私自身21世紀に入ってから私名義の口座から親が窓口でお金を引き出す、ということがあった。 本人であること、または本人の意思が確認できることを断固として要求するようになったのは、本当に最近だ。
このため、特に家族など近い人物は暗証番号を知る機会がおおかった。 また、誕生日を暗証番号にするというのも一般的で、近い人物は直接に知らなくても推測する余地がある。
この場合、暗証番号はもはや秘密ではない。 さらに、他人であっても暗証番号は衆人環視の下入力せざるをえないものであり、ショルダーハッキングはそれほど難しくない。 暗証番号は多くの場合、秘密として不十分なのである。
この状態ではキャッシュカードを持ちさえすれば取引が可能である。 近い人は当然キャッシュカードを拾う機会も多いし、盗もうとする者は事前にマークしてショルダーハッキングによって暗証番号を得ることも多いだろう。 つまり、キャッシュカードを他者にもたれる状況下で、暗証番号が砦として機能しづらいのである。
それが社会的な問題となり、TVでも報じられたことで、暗証番号の定期変更が呼びかけられるようになった。
定期変更の効力
定期変更は「知識上の秘密が盗まれる場合においてその行使を阻害する」効果がある。 これは特にショルダーハッキングに対する影響が大きい。
非常にわかりやすいのが、スマートフォンのパスコードだろう。
一般的に、家族は家族の端末のパスコードを知る可能性が高い。 それを見る機会が多いから、そこまで強く意識しなくても覚えてしまうことができる。 小さな子供がいる家庭では、いつの間にか子供がパスコードによるロックを解除できるようになってしまっていた、という経験をしたことがある人も少なくないはずだ。
このような場合において、定期的に変更されるとその被害にあいづらくなる。 継続的に発生しづらいという意味もあるし、覚えるのに必要な期間よりも短く変更すれば突破されない、ということになる。 キャッシュカードの暗証番号はスマートフォンのパスコードほど近くで見る機会が多いわけではないため、そこまでの高頻度で変更する必要はない。
もちろん、これが完全な防御というわけではない。変更する間もなく確認した上で盗む、といったことをされるとどうしようもないからだ。 しかし、ある程度の意味があり、実際に被害を軽減させることに成功した。
現代においてはこれが正しい答えでない、ということはすぐにおもいつくだろうし、実際現代ではそれは標準ではない。 ATMにおいては生体認証が取り入れられることが多いからだ。
だが、その弱点をカバーするために生体認証を取り入れようにも、当時高精度で迅速な生体認証をすべてのATMに導入するようなことは到底現実的な話ではなかったし、 そもそも現在においても生体認証を導入しているATMのほうがずっと少ない。
生体認証を部分的に導入すると、暗証番号入力機会が減り、それを意識していればショルダーハッキングによる暗証番号の流出自体起こりづらくなる。 とはいえ、暗証番号を知られた状態になればそれを有効に使う方法はあるわけで、完全にカバーされているわけではなく、「方法を変えれば良い」というのは現実味のない理想論だということがわかるだろう。
その状況下で現実的かつ効力を持つ対策が暗証番号の定期変更だったのである。
また、仮により困難な方法へ変更できたとしても、それが受け入れられた可能性は低い。 これだけ意識の変わった現代において、子供のいる家庭の人においても、突破されることのない長いパスフレーズロックを採用している人は見たことないし、 それどころか長いPINを使っている人すら私以外に見たことがない。 パスコードやパターンのまま、破られたら変える、ぐらいが現実的でコストと安全性のバランスが取れている、と考える人は少なくないだろう。
インターネットにおいて
だが、インターネット上の話だとこの構図は前提が違う。
キャッシュカードと暗証番号、というのは、必ずオフライン攻撃を伴う話のことをしているし、定期変更自体、オフライン攻撃に対する防御である。 現代においてすら、パスワード等の定期変更はオフライン攻撃、特にショルダーハッキングに対して効力を発揮する。先のパスコードもそうだが、ラップトップのパスワードもまた同様の危機を持っており、変更することでそのリスクを低減できる。これは、システムのログインパスワードに限らず、webサービスのパスワードであるとしても、やはりショルダーハッキングによってパスワードを知られる状況下では、パスワードが維持されていればリスクは時間と共に高まっていく。
だが、オンラインのリスクとオフラインのリスクは別の話なのだ。 オフラインのリスクが想定される環境では、当然ながらそれに対応したセキュリティが必要になる。 一方で、現代において容易に問題になるのはオンラインのリスクである。
この問題の本質は「オンラインのリスクを軽減する方法としてオフライン向けの手法を持ち出す」ことにある。
オンライン攻撃の条件というのは様々にあるのだが、 結局のところウェブサービスのパスワードもまた、最も破られやすい経路がショルダーハッキングにあることはあまり変わらない。 だが、それはそもそもオフライン攻撃であるし、「特定のユーザーアカウントへの不正アクセスを行う方法としては」という話である。 パスワードハッキングは破るのが容易な条件にあるユーザーを攻撃するものであり、それは、ある程度強固なパスワードであれば諦めるか、既にその特定ユーザーのパスワードが推測可能な条件にあるか、といったあたりの話である。
この場合において脆弱なパスワードとは
- ありがち (辞書的にみつかる)
- 単純 (パターンの探索でみつかる)
- 総当りで見つけやすい (短い)
のいずれかである(2つ以上かもしれない)。 例を挙げよう。
まずは、「ありがち」
password
p1cture
(辞書にある後のiを1に代えただけ)qwerty
(キーボードの左上から)
「単純」
123456
alice
(ユーザー名と同じ)aabbccdd
123123abcabc
「見つけやすい」
amfjei
OWEURI
196504
これはあくまで総当り的な攻撃に弱いパスワード である。 攻撃者はパスワードの候補とユーザー名の候補を持っており(ユーザー名の候補は実在が確認されているかもしれない)、その組み合わせによってクラックしようとしている。 よくあるものだが、成功率は高くない。同時に「脆弱なパスワードを使っているならば、突破されて当然」という類のものである。 あなたが使っているパスワードがこのようなものであるならば、遅かれ早かれ被害にあう のだ。運はあまり関係ない。
当然の話として、数字4桁の暗証番号は10000種しか存在せず、何を選ぼうが常に脆弱である。 しかし、試行回数が限られる場合その限りではない。銀行取引などでは3回程度しかリトライできないのが一般的だ。 もちろん、これは良いデザインではない。何らかの理由でうち間違える可能性はある(例えばキーボードが不調かもしれないし、回線が不安定かもしれない)のだから、試行回数を限るよりも、十分に強力なパスワードを使えるようにするべきだ。このようなデザインでは、パスワード側を固定し、ユーザー側を変えることで「そのパスワードを使っているユーザーを探す」という攻撃方法が成り立つ。 しかし、突破される可能性は試行回数に依存しているのは事実だ。
例えば暗号化されたユーザーとパスワードのリストが流出したとする。
この場合、暗号化されているためパスワードを「当てる」必要はあるが、ローカルにあるため非常に高速に、かつ無制限に試行することができる。
例えば 51f5b2190c38b3b48d3190a18d7f2765ebadd620
というパスワードがあるとする。これは、 abcdpass
という値のSHA1値だが、これは非常に簡単に発見できる。
その暗号化がもう少し強固であればより多くの計算を必要とするだろう。例えば同じ
acdepass
というパスワードの暗号化結果を
cd1b662e2139c8625a044bacd829628995f03d54
とすることができる。これはacdepassABC
という値のSHA1値である。
システム側は「パスワードにABC
を足す」というルールを知っているため、パスワードの正当性は検証可能だ。実際に入力されたパスワードにABC
を足してSHA1に通した結果と格納している値が一致するか確認すれば良い。一方、攻撃者は「正しいパスワードの導出方法」を探る必要があるため、困難性は上がる。このABC
をsaltといい、saltにどのような値を足すかは秘密となるべきものだ。
しかし、この方法も完璧ではない。1234
やpassword
のようなパスワードを使う者はたくさんいるはずだから、こうしたパスワードにsaltを足し、たくさん一致するものがあればそれが正しいsaltである、ということになる。
いずれにせよ、なんらかの方法で攻撃者がパスワードを知ったとする。 もっとも、あなたにある程度のリテラシーがあり、サービス上でのブルートフォースによって破られるような脆弱なパスワードを使っていないならば、それは何らかの流出によるものだろう。 流出したパスワードが暗号化されているという前提があれば、オフラインでもそうすぐには解読できないようなパスワードを使っていれば時間的猶予があり、そのパスワードを変更すれば良い。 暗号化されていないパスワードが流出したならば、被害にあうかどうかは運でしかない。できることは、速やかにパスワードを変更した上で、暗号化もせずパスワードを保存するようなサービスを退会することだ。
しかし、パスワードが知られたこと自体が問題になりうる。 これが「何らかの理由でパスワードを推測可能な状態」であるからだ。 どんなに複雑なパスワードだろうが、そのように使われていることが明らかになったパスワードは攻撃リストに入るし、同じユーザー名とパスワードの組み合わせは当然に試される。 同じパスワードの使いまわしは非常に危険なのである。
ちなみに、同じパスワードを使いまわしていると、従業員がアクセスできるユーザー情報を使って他のサービスで不正ログインを試みる、といったことが発生しうる。 だから、パスワードの使いまわしは非常にリスクが高い行為である。
以上を踏まえると
- 十分に強固なパスワードを使え
- パスワードは使いまわすな
の2点が教訓として得られる。 パスワードの変更は堅牢性に影響を及ぼさない。 つまり、パスワードの変更はオンライン攻撃の対策として意味をなさないのだ。
「パスワードは覚える」派の人などはただでさえ同一のパスワードを使う傾向が強まるが、そこで変更を強要するとさらに同一のパスワードや、短時間で覚えやすい単純なパスワードを使う可能性が高まる。 本質的に、パスワード変更によってリスクが高まる人はパスワード変更を伴わなくてもリスクは高めである可能性が高いが、パスワード変更の強要がリスクを高める可能性があるのは事実だ。
だが、これは本質的なことではない。「より危険だ」という要素よりも「無意味だ」という要素のほうが本質なのだ。 そして、オンライン攻撃への対策としてオフライン攻撃への対策を行うよう求めることが、そもそもセキュリティを理解していないことの証左であり、そのような理解でセキュリティを担当する人が作ったシステムはセキュリティは脆弱であろう、ということのほうがより問題である。
なお、私はカウントしてみたところ、574のサービスに登録しているようであった。 1サービスで複数アカウントが存在するケースもあるが、まぁだいたい600くらいのパスワードを持っていると考えて良い。 この中に同一のパスワードを使っているものはなく、当然ながらこれは覚えられない。 私は暗号論的擬似乱数を用いて生成したパスワードを使用しており、これをEncFS上に配置している。 EncFSの暗号鍵、つまり「マスターパスワード」によってこれらすべてのアクセス可能ではあるが、これは十分に長く複雑なものを使用している。 20種程度ならそれでも覚えられるものだ。
また、メールアドレスも各サービスで異なるものを使用している。ものすごい数になるが、私は自前でメールサーバーを持っているため実現可能だ。
一般的なメールサービスであっても、拡張文字を使うことで無限にメールアドレスを増やせる可能性がある。
GMailでも可能だが、だいたいのサービスで拡張文字は+
であり、メールアドレスに+
を許さないサービスが多いのが悩みどころだ。
パスワードの変更
私が実際にパスワードを変更したケースは以下の通りだ。
- 継続的に観測可能な環境下で一定期間使用した
- ランダムに観測可能な環境下で一定期間使用した
- サービスで情報の漏洩が確認された
- サービスの登録に使用したメールアドレス宛にスパムメールが届いた
解説していこう。
1は、例えば同棲しているときなどが挙げられる。 この環境下で見られるパスワード、特にスマートフォンのPINなどはそれほど長くない期間(数ヶ月程度)で変更している。 かなり強度の高いPINを使っているが、それでも数ヶ月あれば覚えることは不可能ではないからだ。
ちなみに、生体認証(指紋など)を使うことでPINの入力頻度を下げられるので、変更頻度を減らすことができる。
あまりにも変更対象が多いととても大変なので、基本的にパスワード入力は観測されないようにすべきだ。 コピペなどなら直接画面を見られなければ大丈夫なので、やはりEncFSに置く方法は強い。 最近はパスワードを画面上に表示しなくても良いように変更しつつあり、ショルダーハッキングへの対策を強めている。
2については、「理屈の上でパスワードを知ることが不可能ではない」環境であることだ。 例えばラップトップやスマートフォンは持ち歩くものであり、そのパスワードの入力時に絶対にショルダーハッキングされないようにすることは不可能に近く、また監視カメラなどに映り込むかもしれない。 こちらは「リスクは排除できないが、リスクは低い」ものであるため、1のケースよりも長いスパン、例えば半年ペースなどで変更している。
1と2の中間のようなケースとして、私は会社用のPCは他のPCとは異なるパスワードを設定しており、やや短いスパンで変更している。
3は直ちに変更すべきケースだ。 退会しても即座にサービス利用不可能にならないものもあるため、退会を決断する場合でもパスワード変更を行ったほうが良い。
4については、各サービス異なるメールアドレスを使用しているため、これが発生した時点で漏洩があったとみなすことができる。例えばPeatixの漏洩はこれで知った。 あとは、出会い系業者に個人情報を渡している悪質なサービスを見つけることもできる。タップルのことだ。 これも3と同じ扱いになる。というよりも、このケースについては3よりもより強く出るべきで、直ちに退会以外の選択肢はない。
1と2に関しては、最近まともに外出してもおらず、外でスマートフォンのPINを入力することも避けている(Androidは72時間ごとに入力を求められるが、この場合トイレなど人目につかない場所で解除している)し、ラップトップを持ち歩くとこもないし、最近はほとんど発生していないが、最もリスクが高かった2017年くらいだと1は1ヶ月程度、2は3ヶ月程度で変更していた。
3と4に関しては「年に数回程度」のペースで発生している。
このように、パスワードの変更が「必要なケース」もあるし、「予防的に変更すべきケース」も存在する。 だが、「定期的に変更」のようなポリシーが成り立つのは1や2のケースに限られる。 逆に言えば 1や2のケースにおいては定期的変更というポリシーが成立する。
その目的や効果を正しく理解しているのであれば良いのだが、現実は冒頭の通り、関係ないにも関わらず盲信するか、それとも頑なに否定するかのどちらかであることが多い。
Finally
以上の通り、パスワードの定期変更は、意味自体はあるが、誤用され無意味な形で使われていることが多い、というのが問題の本質である。
念の為、内容を要約しておこう
- パスワードの定期変更はキャッシュカード暗証番号の定期変更に由来する
- 現代のパスワード管理においても、ショルダーハッキング対策としては有効性がある
- オンライン攻撃に対する対策としては無意味であり、関連性がない
- パスワードの定期変更は無意味なものではないが、セキュリティとして求めるものでもない