パスワードの管理方法をUnixで確認する
Googleなど各サービスのユーザーのアカウントやパスワード管理方法は公開されていません。
多くのサービスのOSとして一般的に使われている、Unixの管理方法を拡張した考え方で管理されていることが予想されます。
基本的なパスワードの管理方法はパスワードの管理方法で紹介していますが、実際のOSでパスワードの管理方法を学ぶことでより理解が深まります。
Unixのアカウントやパスワード管理
Unixの場合、一般的にユーザーのIDなどの基本的なアカウント情報は
/etc/passwd
のファイルに記載されています。
以前はここにそのままパスワードが書かれていましたが、近年のOSではパスワード自体は
/etc/shadow
にハッシュ化した物が記載されています。
Unixで実際にパスワードの管理方法を確認する
Unixなら何でもかまいませんが、今回はUbuntu 18.04.3 LTSで確認してみます。
(これ以降、意味がわからない方は検索してください)
UbuntuでTerminalを開きますが、そのままでは各ファイルが参照できません。root権限が必要になります。
$sudo su -
として、root権限で利用します。
$cat /etc/passwd
とすればアカウントのファイルが表示されます。
通常、ファイルの最後に作成したアカウントの情報があります。
kamikura:$1$.FJx0/hu$/03YlcdQ4RLMCbsqJCobD/:17749:0:99999:7:::
たとえば、今回の設定ではこのようになっていました。
この行の説明は、各サイトに詳細がありますが、前半のkamikuraがアカウントのID部分、ランダムな文字がハッシュ化したパスワード、作成日などになっています。
ランダムな文字列の$1$は、ハッシュ関数のMD5を使っているという意味。それにつづく.FJx0/huがSaltです。
このハッシュ化はcrypt(3)で行われていますが、Pythonで簡単にこのハッシュ値の確認が出来ます。
このアカウントのパスワードは「ubuntu」です。この自分で設定したパスワードの「ubuntu」でハッシュ値を計算してみます。
$python3
で起動し、Pythonのcryptモジュールを呼び出します。
>>> import crypt
実際のパスワードの「ubuntu」とSaltの「$1$.FJx0/hu$」を使って計算してみます。
>>> crypt.crypt('ubuntu', '$1$.FJx0/hu$')
結果
'$1$.FJx0/hu$/03YlcdQ4RLMCbsqJCobD/'
/etc/shadow の内容と一致しました。
今回は自分で設定した「ubuntu」というパスワードがわかっているので、簡単に /etc/shadow の内容と一致できました。パスワードがわからない場合は全パターンで計算する必要があり、それだけでかなりの時間がかかります。
今回の様な辞書に載っているような6文字の単語なら、ハッシュ化されたパスワードが記録されているファイルが流出すれば、全パターンでの総当たり攻撃ですぐパスワードが解読されてしまいます。もしもシステム側の問題でパスワードのファイルが流出したとしても、総当たり攻撃に備えるには、より長いパスワードにする、記号なども組み合わせた複雑な物にするのが有効です。
Googleのアカウント管理はさらに複雑
Googleのサーバーに不正にログインして、今回で言えば /etc/shadow ファイルなどを盗み出せば、パスワードはわかるかもしれません。
しかし、Googleアカウントが10億以上のユーザーのアカウントをどう管理しているのかはもちろん、パスワード等の管理をどうしているかの細かいことも含めて何も公開されていません。このような事をすること自体が困難です。もしかすると論文で一部が公開されているかも知れないので、興味がある方は調べてください。
仮にハッシュ化されたパスワードファイルが流出しても、そこからパスワードを解析するのは困難と予想されます。
さらに、単純にアカウントのIDとパスワードがわかったとしても、それ以外のアクセス情報での本人確認などもあるため、簡単にログインされることはありません。