読者です 読者をやめる 読者になる 読者になる

トリコロールな猫/セキュリティ

セキュリティ情報の備忘録的まとめ。

個人が使うWebサービスのパスワード管理について、現状を整理し、結局どうするのがいいのか考えてみる

対策 読み物 パスワード

※ここに書かれていることはnekotricolor個人の見解であり、所属する組織の公式見解ではありません。
一度書いてみたかった

パスワード問題、結局どうすればいいのかというのを考えてみました。
ダラダラと書いてたらエラい力作になってしまいました。
ユーザ名は?という話もありますが、隠しようがなかったりメールアドレスだったりパスワード並みに複雑にできたり様々なのでここでは触れません。

長すぎて読む気がしないという方は「めんどくさいから簡単にできる方法を教えてという人へ」へどうぞ。

このエントリが対象とするサービス

  1. インターネットバンキング
  2. Amazon楽天などのネットショップ(クレジットカード決済)
  3. FacebookTwittermixiなどのSNS
  4. GmailhotmailなどのWebメール
  5. LINE、Skypeなどの無料通話・チャットサービス

パスワードが破られたときに起こること

正確には、「自分のパスワードが漏えいし、自分が使っているサービスに他人にログインされたときに起こること」ですね。

サービスを使っている本人にとっては明白でしょうが、あえて整理してみます。

パターン 狙われるサービス
自分のお金を奪われる インターネットバンキング 自分の口座から他人の口座に振込
自分のお金で物を買われる ネットショップ 自分のクレジットカードで他人の物を買う
自分の情報を奪われる Facebook 居住地、家族構成などを知られる
自分の信頼を奪われる Twitter 自分になりすましてとんでもない発言をする
自分の信頼を奪われる Gmail 自分になりすましてとんでもないメールを送る
自分の信頼を奪われる LINE 今何してますか?忙しいですか?

インターネットバンキングやネットショップでの金銭的被害は誰にとっても重大だと思いますが、SNSのように情報や信頼を奪われるサービスについては、人によって受けるダメージが違うので、自分にとってどれがどの程度ダメージを受けるか把握しておくといいと思います。

パスワードを狙った攻撃

次にパスワードを破る主な方法を見てみます。

お手軽攻撃

「人のパスワードを破ってみるぜ!」という人が最初に試すのは以下3つだと思われます。
やったら犯罪ですのでやらないように。

  1. ユーザ名をパスワードにしてみる
  2. 「123456」「password」などちょー簡単なのを試してみる
  3. 誕生日や電話番号など、SNS等で入手可能なユーザの情報で試してみる

「123456てwww」って思います?これね、意外と侮れないんですよ?2013年にAdobeから3800万以上のアカウントのパスワードが漏えいしたことがあるのですが、そのうち191万件以上のパスワードが「123456」だったそうです。

辞書攻撃

様々な単語が載っている「辞書」を使う攻撃です。
例えばこんな辞書ファイル。英単語をaから順に並べたもの。

a
aardvark
abaci
aback
abacus
abaft
abalone
abandon
abandoned

上から1個ずつ試していきます。自動的にやってくれるツールが存在します。

この辞書ファイルはネット上に公開されていて、上に挙げた例のように本物の辞書と同じようにAから順に単語が並んだもの、パスワードとしてよく使われる単語や文字列を集めたもの、日本語の単語をローマ字に直したものなど数多く存在します。

また、aを@に、oを0に、Eを3に、などありがちな変換もすでに登録されている場合が多いです。例えば、「password」という単語だけでなく「p@ssw0rd」という単語も載ってたりします。

ブルートフォース

いわゆる「総当たり攻撃」です。
例えば4桁の数字をブルートフォースで破ろう、といった場合には、「0000」「0001」「0002」・・・「9997」「9998」「9999」というように1個ずつ試していきます。これも自動化ツールがあります。

辞書攻撃は、辞書ファイルに載っていない文字列であれば破られないのに対し、ブルートフォースは、時間はかかるけどいつか必ず当たります。

IPAが公開している「情報漏えいを防ぐためのモバイルデバイス等設定マニュアル」には、ブルートフォースでパスワードを破る場合、パスワードの文字種や桁数によってどの程度コストがかかるかという表が載っています。数字4桁だとお話にならないほど簡単なようです。

f:id:nekotricolor:20140919163021p:plain*1

リスト型攻撃

あるサイトを攻撃して得たユーザIDとパスワードを使って、他のサイトでログインを試みる攻撃です。サービスAとサービスBで同じパスワードを使っていて、サービスAのパスワードが何らかの方法で犯人に知られてしまった場合、サービスBの方にもログインすることができてしまいます。

これがかなりの被害件数に登っていて、サービスごとに違うパスワードを使うことの重要性を物語っています。

つい最近IPAからこんなの出てました。

フィッシング詐欺

オンラインバンキングでは、これがいま最もホットな攻撃だと思います。
代表的なのは、銀行から(来たように見える)メールで「あなたの銀行口座が大変です!以下のサイトからログインして至急確認ください!!!」というようなメッセージを受け取り、メールに記載されたリンク先(=犯人が作った偽のサイト)に行ってログイン用のパスワードから振込用の暗証番号から全部入力してしまい、労せずパスワードを盗む方法です。

最近では大手銀行がかなりこの対策に力を入れているらしく(それだけ被害が大きいのでしょう)、テレビのCMで流れたりしてますね。具体例をサイトでも公開しています。

重要なのは、これに引っかかると、どれほど強固なパスワードを設定していても意味がないということです。だって直接教えちゃうんだから。とにかく引っかからないようにするしかありません。

マルウェア感染

マルウェアの中には、「キーロガー」という機能を備えているものがあります。キーロガーは、その名の通りキーボードからの入力を全て記録し、攻撃者に送信します。その手のマルウェアに感染しているPCでサービスへログインすれば、当然パスワードも攻撃者に送信されてしまいます。
これもフィッシング詐欺と同じで、どれほど強固なパスワードを設定していても、感染してしまっては意味がありません。

ぼくのかんがえたさいきょうのぱすわーど

この5つの攻撃手法から身を守るための最強のパスワードを考えてみました。

vs. お手軽攻撃

ユーザ名と同じ文字列、よく使われる文字列、誕生日や電話番号などの個人情報をパスワードにしないこと。

vs. 辞書攻撃

よく使われている文字列や、単語単体を使わない。辞書ファイルに載っていないパスワードなら破られません。

vs. ブルートフォース

単純に、なるべく複雑なパスワードにすること。それでも時間をかければいつかは解読されますが、前述のIPAの表での最強のパスワード、記号をフルに使った16文字以上のものを解読するというのは非現実的でしょう。
例えばこういう感じ。

G(%?{;}]8=;?2yxk

vs. リスト型攻撃

これは何らかのサービスのパスワードが破られた「後」の話なので個別のパスワードに対して何かできるわけではないですね。
対策はすべてのサービスについて違うパスワードを使うこと。これなら1つ破られても、他のサービスに影響が出ません。

vs. フィッシング詐欺マルウェア感染

これも引っかかったら/マルウェアに感染したら、パスワードをどれほど強固にしようが意味がないです。万が一引っかかった時にリスト型攻撃に利用されないよう、すべてのサービスについて違うパスワードを設定する、くらいですかね。

以上5つを踏まえると・・・

最強のパスワードは、「よく使われている文字列や単語単体ではなく」「記号をフルに使った16文字以上で」「サービスごとにすべて異なる」パスワードになります。以下、例です。

サービス名 パスワード
A銀行 G(%?{;}]8=;?2yxk
Bカード f>{*$z$d93F))]*;
Camazon +%h8}(XQ$)%*W/@2
Dwitter uaT}&,}@@}B6/.4?

はい。無理です。こんなの覚えられん。

ただ、理想的なパスワードが、「長くて複雑で全てのサービスにおいて違うパスワード」である、というは事実です。ここから先は、利便性のためにこの理想型からどう妥協していくかという話になります。

「さいきょう」でなくても、ある程度の強度を持つパスワードを使おう

ある程度って何よ!!!といわれると思いますし、ここが一番難しいと思いますが、nekotricolorは以下のルールで作ることをおすすめします。

お手軽攻撃で破られない

ユーザ名と同じ/よく使われている文字列/誕生日や電話番号などの個人情報をパスワードにしないこと。
例えばここに載っているようなパスワードはダメ!

数字のみはダメ

前述の表の通り、数字のみだとどんなに長くても強度が低いです。誕生日や電話番号などもってのほか。

単語単体はやめる

繰り返しになりますが、辞書攻撃によって一発で破られてしまいます。

文章にしてしまう

パスワードは長ければ長いほどいいです。複雑な記号と英数字を組み合わせた8文字より、英小文字+数字16文字のほうが一般的には強固です。文章だと覚えやすいというのもある。
例えばこんな感じに。

1990nenSAKAAGARIgaDEKITA

さらに記号が使えるなら、

1990nen_S@K@@G@R1_g@_D3K1T@!

とか。単語単体のパスワードでa→@などのありがちな変換をしてもそれ自体が辞書に載っていたりするのであまり意味がありませんが、文章の中で使うとかなり効果的です。
そんなに長く登録できない!というのであれば、頭文字を取って

1990nenSgD!

という具合。 Microsoftが強固なパスワードの作り方についての文書を公開していました。

Microsoftは他にも、パスワードチェッカーなるものも公開しています。自分が作ったパスワードが十分強固かどうか、ここで確認してみるといいかも。

パスワードを強固にする以外の対策

さて。さすがに「パスワードを強固にしてね。あとサービスごとに違うパスワードにしてね」だけでは無体なので、他の対策も挙げてみましょう。サービス提供者側もいろいろな対策を提供しています。

対策は、辞書攻撃やブルートフォースによるパスワードの漏えいを防ぐための対策と、フィッシング詐欺マルウェア感染によってすでに漏えいしたパスワードの不正利用(リスト型攻撃も含む)を防ぐための対策に分けてみました。
さらにこれら2種類の対策について、ユーザとサービス提供者ができることをまとめてみました。

ユーザ

漏えい防止のために
  • なくても困らないサービスには登録しない
  • 使わなくなったサービスはちゃんと退会する
不正利用防止のために
  • サービスごとに違うパスワードを使う
  • 余計な情報を登録しない
  • 利用状況をチェックする

サービス提供者

漏えい防止のために
不正利用防止のために
  • 二段階認証を実装する
  • 利用状況をチェックする

と、分けてみて自分的にはスッキリしましたが、ユーザやサービス提供者にとってはどっちかしかやらないのは片手落ちであんまり分ける意味はなかったw
ということで以降は一緒に説明します。

ユーザができること

なくても困らないサービスには登録しない

私はそもそもこれをちゃんと考えるべきだと思います。

インターネットバンキングなんかは、よっぽどしょっちゅう振込が必要な人でない限りはいらないんじゃないの?と私は思ってます。結局、現金を下ろすためにはATMなり銀行なりに行かなきゃいけないし、記帳や振込はその時にできるからです。

とかいいつつ私は使ってますが、ばあちゃんに勧めるかといわれると勧めないなぁと。振込手数料がインターネットバンキングの方が安いっていうのはあるけど、その数百円のためにパスワード管理のリスクを負うかどうかは考えてみてもいいと思います。フィッシング詐欺の被害が相当あるみたいですし。

使わなくなったらちゃんと退会する

これも忘れがちですが重要です。後で書きますが、使わなくなったサービス=利用状況をチェックしないサービスということになりがちですので、パスワードが破られ不正利用されても気づかないことが多いからです。使わなくなったサービスなんだからいいじゃん。と思うかもしれませんが、そのパスワードを他のサービスでも使っている場合には、リスト型攻撃に利用されるかもしれません。

サービスごとに違うパスワードを使う

大事なことなので何度でもいうよ。リスト型攻撃を避けるために、サービスごとに違うパスワードを使うべきです。

余計な情報を登録しない

SNSに律儀に自宅の住所や電話番号を入力する必要はありません。必要最低限のものだけ登録しましょう。たとえパスワードを破られても、「自分の情報を奪われる」被害を最小限に抑えられます。また、「お手軽攻撃」に使われる情報を減らすことができます。

「なくても困らないサービスには登録しない」というのもそうなんですが、とにかくケアしなきゃいけないものを減らすことが大事です。

利用状況をチェックする

パスワードの漏えいや不正利用に気づくために、ちゃんと利用状況をチェックしましょう。ネットショップでクレジットカード決済をしている場合は、クレジットカードの明細のチェックも忘れずに。

大規模な不正アクセスがあれば、さすがにサービス提供者が気づくと思いますが、サービス提供者が気づかない場合も多々あります。実は数ヶ月前に漏えいしてました!っていうのもよく聞く話。

最近は最終ログインの日時や場所などを表示するサービスも多いので、ログインした時にチェックする癖をつけましょう。銀行やネットショップの場合は、たまに利用履歴に不審な点がないかを確かめておくといいです。

GoogleFacebookなんかでは、ユーザのログインについてかなり詳細な情報を見ることができます。

明らかにおかしい使用履歴やログインがあった場合は、とりあえずパスワードを変更して、サービス提供者に報告しましょう。

ちなみにnekotricolorは何年か前に、使っていたネットショップが不正アクセスされて勝手に買い物をされたかもという連絡を受けたことがあります。買い物されたかもしれない期間が、その連絡が来た時点から7ヶ月前でした。当時はクレジットカードの明細を紙で受け取っていて保管してあり、特に不振な支払はなかったことを確認できました。クレジットカードの明細は1年くらいはとっておきましょう。紙で受け取っておらず、ネットで確認している方は、明細のPDFをダウンロードしておいた方がいいです。

サービス提供者ができる(やっている)こと

パスワードの強度をチェックする

登録ページ「うちのパスワードは記号が全部使えて何文字でもオッケーです!」
ユーザ「123456」
サービス提供者「◯ね!」

とならないために、ユーザ登録の際にパスワードの強度をチェックします。チェック項目はサービスによって違いますが、例えば、「誕生日になっていないか」「ユーザIDと同じじゃないか」「大文字小文字両方使っているか」「記号が1つでも入っているか」等々。

ただこの強度チェックはやっているところは多いと思うのですが、「あなたのパスワードの強度はこれくらいですよー」と通知はするものの、弱いパスワードを登録できないようにはしていない場合が結構あるんですよね。ちゃんと強度のあるパスワードを設定しましょうね。

ロックアウト

パスワードを何回か間違えるとログインできなくなるあの現象です。何回間違えたらロックアウトされるか、ロックアウトを解除するにはどうすればいいか、はサービスによって違いますが、例えば「3回間違ったら1時間ログイン不可能」「5回間違ったらアカウント停止」等々。
これによって、辞書攻撃やブルートフォースで何度もパスワードを試されることを防いでいます。

二段階認証

パスワードでの認証を終えた後に別の方法でもう一度認証する方法です。現在はこれが主流になりつつあります。お使いのサービスが二段階認証を提供しているのであれば、絶対に使ったほうがいいです。デフォルト無効の場合もあるので注意。
どんな方法があるのか見たほうが分かりやすいと思うので具体例を。

銀行の第二暗証番号

インターネットバンキングに登録した時に送られてくるカードの裏に書いてある乱数表です。振込などの手続きをするときに求められるあれです。

ほとんどのインターネットバンキングでは二段階認証が取り入れられており、たとえパスワードが漏えいして他人にログインされたとしても、口座の利用状況や残高を見るくらいしかできません(それも十分嫌ですが)。つまり金銭的被害は抑えられます。だからこそ、フィッシング詐欺で第二暗証番号を全部入力させるようなサイトに誘導したりするのです。

ワンタイムパスワード

On Time Passwordの頭文字を取ってOTPといわれたりもします。認証のつど新しいパスワードをサービス提供者が発行するという方法です。大手銀行は第二暗証番号からこちらの方法に移行しつつあるみたいですね。
OTPをユーザに渡す方法として以下の様なものがあります。

専用トークン
30秒とか1分とか、一定時間が経つと違う数字を表示するような専用の機器です。

専用機器ということでなくしさえしなければ悪用は難しく、アプリやメールよりも安全な方法ですので、トークンを選べるならそうした方がいいでしょう。

専用アプリ

スマホアプリです。仕組みはトークンと同じで、一定時間ごとに新しい数字が表示されます。

Googleが提供しているGoogle Authenticatorは、GoogleだけでなくDropboxEvernoteの二段階認証でも使われています。でも敷居が若干高いんだよなぁ。

Facebookは、Facebookのアプリ自身がOTPを生成してくれます。こっちも結構敷居が高い・・・。

メール・SMS
必要になった時に、サービス提供者がメールやSMSでユーザにOTPを送信します。
ただこれ、銀行のアプリに見せかけたアプリを入れさせ、そのアプリが銀行からのOTPのメールを傍受してOTPを攻撃者に送信するという手法が確認されています。

iCloudもSMSによる二段階認証に対応したそうで。(今まではAppleIDのみだった)
と思ったら日本はまだなのかな?

クレジットカードのセキュリティコード

ネットショップなど、クレジットカード決済をするときには実物のカードの裏に記載されたセキュリティコードを入力する場合が多いですよね。これも二段階認証と言えます。

また、クレジットカード会社のWebサイトに登録している場合、セキュリティコードでなくそっちのパスワードを入力させるというのもあります。

利用状況をチェックする

Googleはユーザの行動をチェックしていて、普段と違うことをしていた場合には、その場所やデバイスからのログインを停止させるそうです。

if we see unusual account activity, we’ll stop sign-in attempts from unfamiliar locations and devices. *2

パスワードとは関係ないですが、クレジットカード会社も普段と違う場所で大量の買い物をしたりするとすぐ連絡が来るらしい。

銀行・クレジットカード会社の補償について

考えたくないですが、万が一金銭的被害を被った場合に銀行やクレジットカード会社が補償をしてくれるかどうかについても調べてみました。

全銀協ガイドライン

銀行については、全国銀行協会というところがガイドラインを出しています。法人向けのものはつい最近出されました。

インターネットバンキングに関しては、「補償を行う際には、被害に遭ったお客さまの態様やその状況等を加味して判断する。」としか書かれていませんが、各銀行がこれを受けてもう少し具体的なことを書いています。

重要と思われるポイントは、「重大な過失・過失があった場合」や「銀行への通知が30日以内に行われなかった場合」には補償の対象外、または減額としているところでしょうか。

重大な過失・過失って?

重大な過失・過失ってなんだって話ですが、インターネットバンキングのパスワードについては明確な定義は見つけられませんでした。ただ、キャッシュカードの暗証番号については以下のような記載がありました。

当行から生年月日などの類推されやすい暗証番号から別の番号に変更するよう個別的、具体的、複数回にわたる働きかけが行われたにもかかわらず、生年月日、自宅の住所・地番・電話番号、勤務先の電話番号、自動車などのナンバーを暗証番号にしていた場合であり、かつ、キャッシュカードをそれらの暗証番号を推測させる書類など(免許証、健康保険証、パスポートなど)とともに携行・保管していた場合*3

これに準拠するとすると、「お手軽攻撃」で書いたような、パスワードを誕生日とか電話番号にするのは言語道断ですな。まぁインターネットバンキングならそういうパスワードはそもそも設定できないようにしていると思いますが。

ちなみに、キャッシュカードについての"重大な過失"として「他人に暗証番号を知らせた場合」とあるんですが、フィッシング詐欺に引っかかったときはどうなるんですかね。知らせるつもりなく知らせたということで過失にはならないのかな。

30日以内に連絡を

これは今回調べてみて初めて知りました。まぁいつまでも補償しますってわけにはいかないですもんね。やっぱり利用状況の確認は大事です!

クレジットカードの補償

こちらはちゃんと連絡すればすぐに補償してくれることが多いようです。さきほども書きましたが、変な場所で決済が発生すると逆にクレジットカード会社から連絡が来たりします。ただクレジットカード会社も気づかない場合がもちろんあると思いますので、利用状況の確認は大事なのです!

めんどくさいから簡単にできる方法を教えてという人へ

これが、コンサルしてくれという「仕事」だったら、使っているサービスを洗い出して、パスワードが破られたときにどれがどの程度の被害になるかで優先順位を決めて、二段階認証が可能なら+5点とかスコアリングして・・・みたいに定量化してやるんでしょうが、友人に「で、どーすればいいの?」と聞かれたら以下を勧めます。

  • パスワード管理ソフトを使う
  • 二段階認証を有効にする
  • 利用状況をちゃんとチェックする

根拠は「私は現実問題、これで十分だと思う」というだけです。少なくとも私はこうしています。二段階認証と利用状況のチェックは前述の通りとして、ここで初めて出てきたパスワード管理ソフトについて。

パスワード管理ソフト最強説

パスワードについて最も重要なことは何かと問われたら、私は「ある程度の強度を持つパスワードを使う(少なくとも「お手軽攻撃」で破られるパスワードは絶対に使わない)」「サービスごとに違うパスワードを使う」の2点をあげます。これはパスワード管理ソフトを使おうが使うまいが同じです。なので使うサービスは少なければ少ないほど楽だし、「なくても困らないサービスには登録しない」とかシレッと書いてますが、私もかなりの数のサービスを使ってます。

ということで、たとえパスワードを意味のある文章にしたとしても全てを記憶するのは難しいので、その管理はパスワード管理ソフトに任せます。

私はAgileというところが出している「1Password」を使っています。使い方はここでは述べませんが、MacWindowsiPhoneAndroidと様々なデバイスで使えて便利です。長さや記号の桁数などを指定できるパスワードジェネレータもついてます。まあこれがクラックされると大変なことになるというリスクはありますが、そうなったらしょうがないと諦められる程度には安全に見えますし、二段階認証で被害を最小限に抑えるということで。パスワード管理ソフトのマスターパスワードはとにかく強固なものにしておくこと。1Passwordほどの機能はついていませんが、iPhoneAndroidには無料のアプリもあります。ていうか、iOS8では1Passwordはフリーミアム化されたらしい。(PC版は別料金で2014年9月17日時点、Mac版は5,000円)

ぶっちゃけ二段階認証があるというだけで個人的にはかなりの安心感があって、そこまで強固なパスワードは必要ない気がしていますが、二段階認証がなくて重要なサービス、私にとってはTwitterがそうなんですが、これはもう強固なパスワードを設定するしかありません。(一時はあったらしいのだが今は停止してます)

頭では覚えられないくらい強固なパスワードが必要なサービスが複数あっても、パスワード管理ソフトがあれば負担は重くありません。その気になれば全てのパスワードを「ぼくのかんがえたさいきょうのぱすわーど」にすることも簡単です。

「買うのやだ!」という人のために、パスワード管理ソフトを使わず、リストにしてパスワード付きファイルとして保存する方法が載った記事。
でもこれだと結局めんどくさくなって同じパスワードを使い始める気がする。

最後に

13,000文字以上書きました。A4にして17ページwww

レインボーテーブルの話とか、今どき辞書攻撃やブルートフォースはデータベースからぶっこ抜いたデータにしか使わないんじゃないかとか、書きたいことはまだまだありましたが、全部書き終わるまで待ってたら永遠に公開できなそうだし、一旦ここでまとめ。

で、結論はただ一言、「うん、もうみんなパスワード管理ソフトを買えばいいよ。」でした。こんだけ書いたのに。

2015/12/15追記
JALマイレージバンクのパスワード導入記念に、Twitterでパスワードについて言及しているツイートを日本語英語それぞれ収集して、頻出単語を割り出してどういう傾向があるかを調べてみました。

2014/10/23追記
航空会社のマイレージサービスのパスワードのついてまとめたエントリ「ANAマイレージクラブのパスワード導入記念に航空会社のパスワードについて調べてみました」もぜひご一読ください。