や・・やばい、、サーバへのパスワードを忘れてしまった・・・
Linuxサーバでのユーザパスワード確認方法
Linuxサーバ上で設定したユーザのパスワードを忘れた場合、割り出す方法は総当りしかない。
それを考えるとroot権限で「passwd ユーザ名」を実行しユーザのパスワードを変更するのが簡単だ。
パスワードそのものを取り出すことはできない
Linuxサーバ上のパスワードは暗号化され保存されているため、設定しているパスワードそのものを取り出すことは不可能。
しかし、「今利用しているパスワードでログインできない」という場合の切り分けとして、以下の2点は確認することができる。
確認できることその1:パスワードがいつ設定されたか
サーバ上のパスワードがいつ設定されているかを確認することができる。
そうすれば、変更しているからログインできないのか、変更はされていないがログインできないのかを確認することができる。
確認できることその2:手元にあるパスワードから変わっていないか
実際にサーバに保存されているパスワードと比較することで、正しいと思っているパスワードが本当に正しいかどうかを確認することができる。
そんなの、ログインできない時点でパスワードが違うってわかるじゃん
と思うかもしれないが、利用しているソフトやサーバ上の設定により、パスワードは正しいのに認証が通過できないということもある。そのため、サーバ上で登録されているパスワードと手元のパスワードを比較することは大変重要な切り分けとなる。
それでは、これら2点をどのように確認できるか、解説していこうと思う。
確認方法:パスワードがいつ変更されたか
chageコマンドを用いた確認
「chage」コマンド用いて確認 # chage -l meatsource Last password change : Mar 28, 2011 Password expires : never Password inactive : never Account expires : never Minimum number of days between password change : 0 Maximum number of days between password change : 99999 Number of days of warning before password expires : 7 #
上記で、ユーザ「meatsource」のパスワードが2011年3月28日に変更されたことが分る。
この日付に変更した記憶が無いのであれば、残念。再設定の他ない。
/etc/shadowファイルを確認する方法
もう一つの確認方法は、root権限でしか閲覧できない/etc/shadowファイルを参照する方法。
/etc/shadowから「meatsource」を検索 # grep meatsource /etc/shadow meatsource:$1$cNDLh5SC$NmkQbDRx9wSlAJAzGmKNU/:15061:0:99999:7::: #
上記コマンドで確認した「meatsource」ユーザの情報を読み取ってみましょう。
/etc/shadowの構造を説明しておきます。「:」を一区切りとして読みましょう。
文字列 | 意味 |
meatsource | ユーザID |
$1$cNDLh5SC$NmkQbDRx9wSlAJAzGmKNU/ | MD5で暗号化されたパスワード:後ほど、パスワードがあっているかを確認する方法を説明します。 |
15061 | パスワード変更日(1970年1月1日からの日数) |
0 | パスワードを変更できるまでの日数。「0」はいつでも変更可能 |
99999 | パスワードを変更しなくてもいい期間(日数) |
7 | パスワード変更期限○日前に警告 |
この情報のうち「15061」を元に変更日時を特定します。
「date」コマンドを用いて、1970年1月1日から15061日後を割り出す # date -d "19700101 + 15061 days" Mon Mar 28 00:00:00 JST 2011 #
確認方法:サーバ上のパスワードが手元のパスワードと同じか
さて、最後に
現在手元にあるパスワードと、/etc/shadowに登録されているパスワードが正しいかどうか
確認を行ないます。
MD5(エムディーファイブ)は、ハッシュ関数の一つで、「与えられた文字列」から「ランダムな文字列」を作成します。
この「ランダムな文字列」からは、「与えられた文字列」を特定することが出来ないという性質があります。
これを、一方向関数と呼びます。
さて、このMD5の性質上、/etc/shadowを見てもパスワードを特定できないことが分ると思います。これがパスワードが暗号化されている仕組みです。
したがって、/etc/shadowから参照した暗号化されたパスワードの記述を元に、
「パスワードは○○か?」という検証を行います。
以下「/etc/shadow」から確認したパスワードの部分 $1$cNDLh5SC$NmkQbDRx9wSlAJAzGmKNU/
上記を元に、以下「perl」を用いて確認します。
確認した文字列のうち下記赤字部分を利用して確認します。
$1$cNDLh5SC$NmkQbDRx9wSlAJAzGmKNU/
この赤字が暗号化する際の鍵となっているので、手元にあるパスワードをこの鍵となる文字列を用いて再度暗号化し、それを/etc/passwdに記載のある文字列と比較することで、パスワードが正しいのかを確認できる。
パスワードが「5upaGetti」の場合
# perl -e 'print crypt("5upaGetti","\$1\$cNDLh5SC\$"),"\n"'
$1$cNDLh5SC$NmkQbDRx9wSlAJAzGmKNU/
#
上記のように、「perl ~」で始まるコマンドにパスワードを現在のパスワードを与え、得られる結果が/etc/shadowの記述と同じ場合は、パスワードは手元のものであるということがわかる。
以上
コメント