いますぐ実践! Linuxシステム管理

[バックナンバーのトップへ] [Linux システム管理のトップへ]


いますぐ実践! Linux システム管理 / Vol.168 / 読者数:1371名

こんばんは、うすだです。

とうとう、Windows 7 が販売されましたね!

…なんていって、実はぜんぜん興味がありません。
職場でも、不思議なくらい話題になりませんし。

ところで、某メルマガを読んでいましたら、少し早いですが、 今年1年を振り返ってみましょう、といったことが書かれていました。
(あ、Windows 7 のことはもう忘れてくださいねー。)

まず、10月までの間に達成できたことを挙げて、自分を褒めてあげます。
それから、まだ達成できていないことを挙げ、 そのうちあと2ヶ月で達成できそうなことを、えいやーで着手するとよいそうです。

わたしの場合、前者は、個人的に行うとしまして、後者は、 当メルマガのサイトの家内制手工業的な運営を(なるべく)自動化することが、 ずうっと放置していた、やるべきことのひとつに挙げられます。

現在、半分手で HTML 化して、仕上げをスクリプトにやらせていますが、 手動で変換するのは骨が折れますし、なにかやろうとすると、 全部自分で実装しなければいけません。ああ、面倒です。

というわけですので、

  「今年中に、当サイトをWiki(かブログか何か)に移行する」

ことを、ここで高らかに宣言したいと思います。(きっぱり)

…言ってしまったことに後悔しつつ、今回も、はりきってまいります!!

今回のお題 - John the Ripper でパスワードをチェックする

システム管理をしていますと、いろんなユーザ様がいらっしゃることに、 いやでも気づかされます。

なんでも使いこなし、セキュリティに関する意識も高い、 スーパーな方がいらっしゃるかと思えば、IE でブラウズするのが精一杯、 パスワードはユーザ名と同じ、あるいは付箋に書いてディスプレイに貼りつけている、 というデンジャーな方もいらっしゃいます。

パスワードをメモして、デスクの目立つところに貼りつけるという行為は論外ですし、 止めてくださいと言うしかないと思います。

ですが、単純なパスワードを設定されていますと、 悪意を持った第三者がパスワードを推測して、侵入してしまうおそれがあります。
そうなりますと、単純にそのヒトだけの問題ではなくなり、 システム全体が危険に晒されてしまうことになります。

というわけで、今回は、John the Ripper というツールを使って、 単純なパスワードが設定されていないか、チェックしてみたいと思います。

John the Ripper とは?

John the Ripper とは、 shadow ファイルや passwd ファイルに含まれる暗号化されたパスワードを元に、 生のパスワードを推測するツールです。

John the Ripper password cracker
http://www.openwall.com/john/

UNIX 的な OS だけでなく、 Windows や DOS, BeOS, はたまた OpenVMS にまで対応しているようです。

歴史はかなり古く、 上記サイトの最古版(?)である 1.6 が2001年の日付になっていますが、 もっともっと前から存在していたように思います。

そんな由緒ある John さんですが、残念ながら、 パッケージは Fedora にしかないようです。
ですので、今回は、ソースコードを入手し、コンパイルして使ってみようと思います。

まずはコンパイルから

今回は、現時点で最新のバージョン 1.7.3.4 を、以下からダウンロードして使用しました。

http://www.openwall.com/john/g/john-1.7.3.4.tar.bz2

以下のようにソースコードを伸張して、src ディレクトリで make を実行しますと、 簡単にバイナリが作成されて…あ、されませんでした。

  $ tar xvfj john-1.7.3.4.tar.bz2
  $ cd john-1.7.3.4/src/
  $ make
  To build John the Ripper, type:
          make clean SYSTEM
  where SYSTEM can be one of the following:
  linux-x86-64             Linux, x86-64 with SSE2 (best)
  linux-x86-sse2           Linux, x86 with SSE2 (best if 32-bit)
  linux-x86-mmx            Linux, x86 with MMX
  linux-x86-any            Linux, x86
  ...

make のあとに、linux-x86-なんとか を指定する必要があります。
一番手堅いのは、linux-x86-any を指定することですが、 ご使用の環境がわかっているなら、他を選択した方が高速に動作すると思います。
(ちなみに、/proc/cpuinfo の flags を見ると、 sse2 や mmx に対応しているかどうかがわかります。)

  $ make linux-x86-any
  ...

特に問題がなければ、../run/john などのバイナリが作成されます。
ですので、以降では、run ディレクトリで作業を行います。

  $ cd ../run/

それでは使用方法を

さて、コンパイルが無事終わりましたので、ここでは、 使用方法をご紹介していこうと思います。

残念ながら、John さんは直接 shadow ファイルを扱えません。
ですので、unshadow を使用して、passwd ファイルと一体にします。
(ここで生成する privpasswd というファイルの扱いには、十分注意してください。 いろいろ試した後は、すみやかに消去してください。)

  $ sudo ./unshadow /etc/passwd /etc/shadow > privpasswd
  $ chmod 400 privpasswd

そうしましたら、john を実行します。
もっとも簡単な起動方法は、引数に、先ほど生成したファイルだけを指定する方法です。

  $ ./john privpasswd

ただ、これですと、3つのモードを使用して、パスワードが見つかるまで延々と、 何日も探しつづけます。

ですので、時間が限られているときは、以下のように、使用したいモードを指定して、 起動するとよいと思います。

まず、GECOS フィールドなど、 ユーザ名を元にパスワードを推測する単純なモード("single crack" mode) だけを試すなら、--single オプションをつけて実行してください。

  $ ./john --single privpasswd

パスワードの候補となるリストを元にパスワードを推測するモードを使用するには、 ワードリストのファイルとともに、--wordlist オプションを指定します。

  $ ./john --wordlist=password.lst privpasswd

そして、いろんなパターンを試すモード("incremental" mode)を使用するには、 --incremental オプションを指定します。
(お察しの通り、これがもっとも時間のかかるモードです。)

  $ ./john --incremental privpasswd

 

ただ、上記の場合、 パスワードを設定しているすべてのユーザをチェックしようとしてしまいます。
特定のユーザだけをチェックしてほしいときは、そのユーザ名とともに、 --users オプションを指定します。
たとえば、test ユーザだけを試すには、以下のように実行します。

  $ ./john --users=test privpasswd

複数のユーザを指定したいときは、以下のように , で区切ります。

  $ ./john --users=hall,oates privpasswd

 

とはいえ、綿密にチェックを行うには、ものすごく時間がかかります。
ですので、しびれを切らして、 Ctrl-c で中断せざるを得ないこともあると思います。
そんなときは、最初からチェックしないといけない…ということはなく、 --resume オプションで再開させることができます。

  $ ./john privpasswd
  (Ctrl-c で中断)
  $ ./john --resume

ちなみに、--status オプションで、状況がおぼろげにわかります。

  $ ./john --status
  guesses: 0  time: 1:07:32:25  c/s: 2189

 

さて、めでたく(?)パスワードを発見しますと、 john.pot というファイルにその旨が記録されます。 このファイルはバイナリ形式ですので、中身を見るには、 --show オプションを指定して john を実行します。

  $ ./john --show privpasswd
  toto:africa:10001:100::/home/toto:/bin/bash

  1 password hash cracked, 3 left

toto ユーザさんのパスワードが africa だということが突き止められてしまったようです。(そして、まだ3つは見つかっていないようですね。)

実行例

…長くてくどーい説明で、申し訳ありません。
では、実際に試した例を、簡単にご紹介したいと思います。

まず、unshadow する前に、 パスワードを見破られるユーザを生成したいと思います。
以降では、test という名前のユーザを生成し、 test1 というパスワードを設定しています。

  # useradd -g users test
  # passwd test
  Changing password for user test.
  New password: (test1 と入力)
  BAD PASSWORD: it is too short
  Retype new password: (めげずに test1 と入力)
  passwd: all authentication tokens updated successfully.

他に、abc123 というパスワードを設定している test2 というユーザと、 john123 というパスワードを設定している test3 ユーザを、 あらかじめ生成しておきました。(実行例は割愛します。)

さて、まずは、unshadow でパスワードファイルを生成しましょう。

  $ sudo ./unshadow /etc/passwd /etc/shadow > zpasswd
  $ chmod 400 zpasswd

あ、そうしましたら、安全のため、先ほど生成したユーザは削除しておきましょう。

  # userdel -r test
  # userdel -r test2
  # userdel -r test3

それではまず、test ユーザに対して、"single crack" mode でどうか、 試してみましょう。

  $ ./john --single --users=test zpasswd
  Loaded 1 password hash (FreeBSD MD5 [32/32])
  test1            (test)
  guesses: 1  time: 0:00:00:00 100%  c/s: 138  trying: test1

…ああ、一瞬で見破られてしまいました。

  $ ./john --show zpasswd
  test:test1:10001:100::/home/test:/bin/bash

  1 password hash cracked, 3 left

では次に、test2 ユーザに対して、試してみましょう。

  $ ./john --single --users=test2 zpasswd
  Loaded 1 password hash (FreeBSD MD5 [32/32])
  guesses: 0  time: 0:00:00:00 100%  c/s: 1595  trying: test21900
  $ ./john --show zpasswd
  test:test1:10001:100::/home/test:/bin/bash

  1 password hash cracked, 3 left

"single crack" mode では、見破られません。
では、ワードリストを使うとどうでしょうか。
と言っても、abc123 という文字列は、password.lst に含まれますので…

  $ grep abc123 password.lst
  abc123
  $ ./john --wordlist=password.lst --users=test2 zpasswd
  Loaded 1 password hash (FreeBSD MD5 [32/32])
  abc123           (test2)
  guesses: 1  time: 0:00:00:00 100%  c/s: 100  trying: abc123
  $ ./john --show zpasswd
  test:test1:10001:100::/home/test:/bin/bash
  test2:abc123:10003:100::/home/test2:/bin/bash

  2 password hashes cracked, 2 left

…出来レースでしたので、一瞬で見つけられてしまいました。

それでは、最後の砦、test3 ユーザさんの登場です。
--single でも --wordlist でも見つけられませんでしたので、 最終手段である --incremental オプションをつけて実行してみました。

  $ ./john --incremental --users=test3 zpasswd
  Loaded 1 password hash (FreeBSD MD5 [32/32])
  john123          (test3)
  guesses: 1  time: 0:08:51:43  c/s: 2122  trying: john123
  $ ./john --show zpasswd
  test:test1:10001:100::/home/test:/bin/bash
  test2:abc123:10003:100::/home/test2:/bin/bash
  test3:john123:10004:100::/home/test3:/bin/bash

  3 password hashes cracked, 1 left

9時間近く(!)かかりましたが、なんとか見つけることができました。

 

ちなみに、わたしのパスワードがどうかも試していますが、 1週間強ほど経過した現在も、まだ発見されていません。
過信はできませんが、一応ほっとしておきます。

cracklib でもチェックできます

ところで、John the Ripper 以外にも、パスワードをチェックするツールがあります。

CrackLib という、パスワードチェック用のライブラリにもれなくついてくる、 cracklib-check というコマンド(Debian 系ですと crack_testlib)で、 確認することができます。

RedHat 系なら cracklib、 Debian 系なら cracklib-runtime パッケージに含まれますが、 もし見当たらない場合は、yum や apt-get などで入手してください。

さて、使用方法ですが、標準入力から生のパスワードを渡しますと、 それがパスワードとして使用しても問題ないかどうか、判定してくれます。
たとえば、password という文字がパスワードにふさわしいかどうか確認するには、 以下のように実行します。
(Debian 系の貴兄は、cracklib-check を cracklib_testlib だと思ってください。 以降も同様です。)

  $ echo password | cracklib-check
  password: it is based on a directory word

…ああ、単純過ぎるようですね。
ちなみに、複数の文字列を判定してもらうことも可能です。

  $ cracklib-check << E-O-F
  > test
  > test123
  > t1e2s3t
  > E-O-F
  test: it is too short
  test123: it is based on a dictionary word
  t1e2s3t: ok

最後のだけ、お墨付きが得られました。

John the Ripper のように、 shadow ファイルなどからパスワードを推測してくれるわけではありませんが、 こういうツールもあるのだということを頭の片隅においておくと、 もしものときに役立つ…かもしれませんよ。

おわりに

以上、John the Ripper を使って、 単純なパスワードを設定しているひとがいないかどうか、 確認する方法をご紹介しました。

とはいえ、正面から侵入を挑む悪党は、今日では少ないかもしれません。

たとえば、泣く子も黙る株式会社ラック様が公開されている、 JSOCの侵入傾向分析レポートを拝見させていただきますと、

JSOC REPORT | LAC
http://www.lac.co.jp/info/jsoc_report/

Webサーバに対する攻撃、 特にSQLインジェクションを突っつく攻撃が大半を占めているようです。

あ、しかし、 ブルートフォース攻撃(力ずくでパスワードを試行しまくるという攻撃) も根強くありますよ、とも書いてありました。

ですので、備えあれば憂いなしということで、 定期的に確認されるとよいのではないでしょうか。

宿題の答え

前回の宿題は、

  /etc/securetty がない場合、rootのログインは許可されるでしょうか?

でした。

以下のように、一瞬だけ rename してみればわかります。
(ホンモノサーバではない、お試し環境で実践してください。)

  # mv /etc/securetty /etc/securetty.ORG

そして、telnet でログインを試みてみますと…。
(もちろん、そのマシンで telnetd が起動している必要があります。)

  $ telnet localhost
  Trying 127.0.0.1...
  Connected to localhost.
  Escape character is '^]'.

  Vine Linux 4.2 (Lynch Bages)
  Kernel 2.6.18.8-xen on an i686
  login: root
  Password: (root のパスワードを入力します)
  Last login: Thu Oct 24 12:44:45 from testsrv
  #

root でログインできてしまいました。

とはいえ、いまどき telnetd が動作しているマシンは、 ほとんどないと言っても過言ではないと思います。
じゃあ、SSH の場合はどうかと言いますと、/etc/securetty とは無関係に、 sshd_config の以下の設定で決まります。

  PermitRootLogin yes (←許す場合 / 許さないなら no)

いえ、厳密には、PAM の設定を変更すれば、 SSH でも /etc/securetty を見るようになります。
具体的には、以下の1行を、/etc/pam.d/sshd (もしくは ssh) の先頭付近に追加します。

  auth    required    pam_securetty.so

すると、PermitRootLogin を yes にしていても、 root ではログインできなくなります。
ただし、SSH の場合、遠隔からのログインに決まっていますので、 上記のように設定する意味はおそらくない…と思います。

以上、なんともな感じの答えでした。
あ、試した後は、以下のように、元に戻すことをお忘れなく。

  # mv /etc/securetty.ORG /etc/securetty

今回の宿題

今回の宿題は、

  入力されたパスワードが正しいかどうかを確認するツールを、作成して
  ください。

です。

ようは、自力で暗号化して、 shadow ファイルの暗号化されたパスワードと一致することを確認するモノを作ってください、ということです。

なんだか既出っぽい気もしますが、気にせず作ってみてください。

あとがき

私事ではありますが、ThinkPad を新調しました。

とあるサイトで、月末になると、1日毎に 5% ずつ安くしてくれるところがありまして、 頃合いを見計らって、清水の舞台から飛び降りました。

もちろん、最終日まで待てば、かなり安くなります。(最大35%引き!)
ですが、それまでに他のひとが先に購入してしまうかもしれない、 というリスクもあります。

こちらも、予算がありますし、できるだけ安く買いたいのですが、 今まで 2回買い逃していますので、今度こそは! という思いもあります。

そんな葛藤もあって、30%引きになったところで、購入しました。
同スペックのマシンが他にありませんでしたので(最後の1台!)、 まあ妥当な判断だと言ってよいのではないでしょうか。

…と思っていたのですが、その後確認してみたところ、 最後の1台を購入したはずなのに、同スペックのマシンが新たに1台増えていました。

…うーん、商売上手…。
悔しくないと言えばウソになりますが、よい勉強をしたと思います。
(そう思わせてください。)

ま、そんなこんなで、本日、我が家に ThinkPad が到着しております。
早速、Windowsのパーティションを削り、 Ubuntu をインストールした状態までたどり着きました。あとは、 さらに Xen か KVM を入れて、 Linux と Windows を同時に動作させたいと思っています。ふふふふ。
(ああ、楽しくってしかたがありません。)

 

今回も、ここまで読んでいただき、誠にありがとうございました。
次回は、11月15日(日) の未明にお会いしましょう!

 

「いますぐ実践! Linux システム管理」の解除は、以下からできます。
http://www.usupi.org/sysad/ (まぐまぐ ID:149633)

バックナンバーは、こちらにほぼ全部そろっています。
http://www.usupi.org/sysad/backno.html

「栗日記」- 栗の季節が…それでも栗画は1日1枚増えていきます。
http://www.usupi.org/kuri/ (まぐまぐ ID:126454)
http://usupi.seesaa.net/ (栗日記ブログ)
http://usupi.org/k/ (モバイル栗日記)


[バックナンバーのトップへ] [Linux システム管理のトップへ]

トップ

バックナンバー
    [日付順] [目的別]

プロフィール

▼ リンク

独学Linux
Linuxデスクトップ環境に関する情報が満載です。 メルマガもありますよ。
Server World
CentOS 6をサーバとしたときの設定例が、これでもかというくらいたくさん載っています。 CentOS以外のディストリビューション(Fedora, Ubuntu)も充実しています。
LINUXで自宅サーバーを構築・導入(Fedora9)
Fedora9のインストールの仕方から管理方法まで、詳しく載っています。 SearchManには情報がもりだくさんです。
マロンくん.NET
〜サーバ管理者への道〜
Linuxをサーバとして使用するための、いろいろな設定方法が載っています。 マロンくんもかわいいです。 なんといっても、マロンくんという名前がいいですね!!
日経Linux
今や数少なくなってしまったLinuxの雑誌。ニュースやガイドもあります。
Linux Square − @IT
@ITが提供する、Linux の情報が満載。 載っていない設定方法はないんじゃないでしょうか。
gihyo.jp…技術評論社
Linuxに限らず様々な技術情報が満載のサイト。 SoftwareDesign誌も、 ソフトウェア技術者は必見です。
SourceForge.JP Magazine
Linux に限らず、オープンソース関連の記事が網羅されています。
ITmediaエンタープライズ:Linux Tips 一覧
Tips というより FAQ 集でしょうか。わからないことがあれば覗きましょう。
IBM developerWorks : Linux
開発者向けですが、勉強になりますよ。
Yahoo!ニュース - Linux
Yahoo!のLinuxに関するニュース一覧です。
栗日記
システム管理とかと全然関係ありませんが、毎日栗の絵を描いています。
システム管理につかれちゃったとき、癒されたいときに、ご覧ください。:-)
WEB RANKING - PC関連
ランキングに参加してみました。押してやってください。

▼ 作ってみました

Add to Google

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本