Hatena::ブログ(Diary)

inuzの日記

2005-10-06

HTTPSサーバのSSL証明書有効期限をopensslコマンドだけで調べる

opensslコマンドって、意外と知られていない機能が満載なんですよ。

自己署名の証明書を作るには?なんていうページが大変多いけれど、あれは手順を書いただけで、たいていは本質的な事に何も触れていない事が多い。

で、今回はopensslコマンドだけであるサーバのSSL証明書有効期限を調べてみよう、という話です。

いきなりサンプルコードを載せます。解説はその後。

#!/bin/sh

OPENSSL='/usr/local/ssl/bin/openssl'
GREP='/usr/bin/grep'
TEMPFILE='/tmp/ssl_validity_checker.temp'
NULLFILE='/tmp/null.txt'
KW_NB='Not Before: '
KW_NA='Not After : '
LISTFILE=$1

touch ${NULLFILE}

for i in `cat ${LISTFILE} | grep -v '^#' | sed '/^$/d' `
do
  ${OPENSSL} s_client -connect ${i}:443 < $NULLFILE > ${TEMPFILE} 2>&1
  NB=`${OPENSSL} x509 -text -in ${TEMPFILE} | ${GREP} "${KW_NB}"`
  NA=`${OPENSSL} x509 -text -in ${TEMPFILE} | ${GREP} "${KW_NA}"`
  echo ${i}, ${NB}, ${NA}

done

$NULLFILEは、opensslコマンドが標準入力を待つので、それを回避するいい加減な小細工。$TEMPFILEは本当にテンポラリ。

  • 第一引数$1に入れた、調べたいサーバリストに対して、openssl s_client コマンドを使って接続しに行く。
  • サーバへのリクエストは何も送らないことにしたのでNULLFILEなんて名前にしているが、$NULLFILE の中にしかるべきリクエストの内容を入れても良い。(GET / HTTP/1.1 とか)
  • 結果を$TEMPFILEに格納する
  • 結果には証明書以外のいろんなものが含まれているが、これは特にいじらない
  • openssl x509 コマンドで証明書の詳細な情報を出力させる
  • 証明書以外の情報も食わせていることになるが、-----BEGIN CERTIFICATE----- と -----END CERTIFICATE----- の間に挟まれたものだけを対象にしてくれるので、どうでも良い。
  • openssl x509 コマンドの結果を、'Not Before: ' と 'Not After : 'でgrepし、それぞれを結果として得る。
  • SSL証明書って「いつからいつまで」、という期限じゃなくて、実は「いつより前でなくて、いつより後でない」という書き方になっている。

opensslコマンドは他にも、verify なんて便利なものもあるので、そのうち書こうかな。予定は未定。(そして多分かかない)

2005-09-09

JPNICのIPアドレス管理指定事業者別割当IPアドレス一覧

http://www.nic.ad.jp/ja/ip/member/cidr-block-list.txt

かつて、このファイルにはIPアドレス管理指定事業者ごとの割り振り済みIPアドレスブロック一覧が書かれていたのだけれど、気がついたらなくなってた。便利だったのになぁ。ざんねん。

2005-09-05

ハイフンで始まるファイルを作ったり消したりする。

FAQとも言えるコネタ。意外に知らない人が多いらしいので、記載。

$ touch -test
touch: invalid date format `est'

touchコマンドで、"-test" を作ろうとしたら、怒られた。

$ echo > -test
$

標準出力をリダイレクトすると怒られずに終了。作れたっぽい。

$ ls -l -test
ls: invalid option -- e
Try `ls --help' for more information.

ls -l しようとしたら、これまた怒られた。

$ ls -l | grep test
-rw-rw-r--    1 inu      inu             1 Sep  5 15:34 -test

しかしながら、確かにファイルはある。いらないから消してみよう。

$ rm -test
rm: invalid option -- t
Try `rm --help' for more information.

-testって名前のファイルなんだから消してくれよ!!

と、まぁ物を知らないと上記の通り。ハイフン(-)で始まるファイル名は、コマンドにオプションと解釈されてしまうから、特殊な扱いが必要なのです。' とか " で囲んでもダメだしね。

rm -- -test

はい、これで消えます。ハイフンを2つ重ねると、「ここから後ろはオプションありませんよ」ということになる。リダイレクトしたら作れるのは、そこにオプションという物が存在しないから。

ダラダラと長く書いたけど、コネタだね。今度はマシなこと書きます。

2005-08-31

ハニーポッター

インターネットはたいへんこわいところです。せかいじゅうのハッカー(パソコンをわるいことにつかうひと)がみんなのパソコンにいやがらせをしたり、ウィルスをおくってきたりします。

というわけで、今回はハニーポットの話と、少々。

何の対策もしないPCを放置すると、たちどころにヤられてしまうのは周知の事。itmediaだった気がするけれど、WindowsPCを放置したらどうなるか実験をやってましたね。ものの1時間でやられてたと記憶しています。

で、こういうのはWindowsの事がよく言われていますが、UNIX相手でも実はよくある話なのです。

近頃目立って多いのが、sshでアクセスし、あらかじめ用意されたユーザIDとパスワードの組でのログインを試すアタック。sshの接続元制限がなく、よくあるユーザ名にありがちなパスワードをつけていると、簡単にログインされてしまいます。

ファイアウォールやらIDSなんていうセキュリティ技術だけでなく、ソフトウェアの作りそのものがセキュリティ面を考慮した作りになっている昨今、rootのパスワードにrootと付けたばっかりに…なんて事例が本当にあります。(ちょっと話がそれるけれど、OpenSSHの標準設定が、あるバージョン以降 root でのログインを許すようになっている気がする。良い子は PermitRootLogin no にしましょう。)

そういうログインを試す輩はログインできたら何をするんだろう?

と、言うわけで試したよ。

結論から言うと、「さらなるダメサーバを探すプログラムを動かし始めた」でした。結果自身はつまんなかったけど、ログインを試行するためのユーザID・パスワードの組が面白かったので、記載。内容の重複を除いて全部で8526パターンあった。(約2500件は重複データ。sort | uniq ぐらいやればいいのに。)

  • ユーザ名と同じパスワード(これは最低だね)
  • ユーザ名+数字または数字+ユーザ名

このほか、そういう規則性のないものも一部。どこかで実際に使われていたパスワード、ということでしょうか。だいたいこんな傾向。

次に、どのアカウントが多く試されているかを調べたよ。上位から適当にコピペ。

3540    root
225     admin
24      uucp
24      bin
21      test
20      wwwrun
19      news
19      daemon
17      postgres
15      webmaster
15      man
15      apache

圧倒的にrootログインを試みる物が多いことがわかる。やっぱりSSHでrootログインを許可してはいけない。

root のパスワード試行パターンは3540個もあるだけに、その内容は様々。

root michael
root michael.
root Michael
root michel
root michele
root michell
root michelle

世界中のマイケルをターゲットにしたこんなものまで。コレはほんとにごく一部ですよ。

ずいぶん前に書いたパスワード生成スクリプトが出てきたので貼ります。

  • 最初の文字に記号って嫌だなぁ(なんとなく)
  • 1 と l と I , 0 と O はわかりにくくて嫌だなぁ
  • @ とか # とか ( とか ) とか、そういう記号は嫌だなぁ

という仕様で書いたもの。これで作ったパスワードで何があっても責任は持ちませんよ(念のため)。

#! /usr/bin/perl

# Create a password
$passwd = &getpasswd;

print "$passwd\n";
exit;

sub getpasswd {

        my $retc="";
        my @card1 = (   'a'..'k', 'm'..'z',
                        'A'..'H', 'J'..'N', 'P'..'Z',
                        '2'..'9', '2'..'9');
        my @card2 = (   'a'..'k', 'm'..'z',
                        'A'..'H', 'J'..'N', 'P'..'Z',
                        '2'..'9', '2'..'9',
                        '!', '?', '-', '_');

        $retc = splice(@card1, rand @card1, 1);

        for ($i = 1; $i < 8; $i ++) {
                $retc .= splice(@card2, rand @card2, 1);
        }

        return "$retc";

}

2005-08-25

ひさしぶりに Apache 1.3系をコンパイルしたよ。

mod_ssl なんかも組み込んで。実に懐かしい。そしてApache2ばかり使うようになった今となっては、なんて面倒なモノなのやら。

mod_sslを組み込んでApache1.3系を作るには、mod_ssl付属の INSTALL ファイルを見るのが一番良い。手順どおりやればだいたい問題なく作れる。

今回使ったバージョンは以下のとおり。

  • Apache 1.3.33
  • OpenSSL 0.9.7d (わけあって古いもの。良い子は真似しないこと。)
  • mm 1.1.3 (これも古い。最新版は1.3.1だけど、1.1系でないとコンパイル通らないっぽい)

こんなところ。

$ cd mod_ssl-2.8.22-1.3.33
$ ./configure \
--with-apache=../apache_1.3.33 \
--with-ssl=../openssl-0.9.7d \
--with-mm=../mm-1.1.3 \
--prefix=/opt/apache1-3-33 \
--enable-shared=max

そして出力されたメッセージが導くままに

$ cd ../apache_1.3.33
$ make

と、ここまでやって思い出した。遅いよ俺。MaxClientsというかHARD_SERVER_LIMITの話。

Apache2からは、ServerLimitにて設定できるようになっている、最大起動プロセス数(この言い方はpreforkの場合か)の設定は、1.3時代にはコンパイル時にハードコーディングされていて、後から変更することができない。しかも、この値はWINDOWSなら1024、NETWAREなら2048で、それ以外は256となっている。

つまり、MaxClientsは256以上に設定できないようになっていて、この制限を大きくするにはコンパイル時に小細工をする必要がある、ということ。

(余談になるけれど、ServerLimitにしても実は20000という上限がある。これは1桁書き間違えて酷い目にあうかもしれない我々に対するApacheの中の人たちの優しさ。)

ほんと、心の底から忘れてたよ。

$ env CFLAGS="-DHARD_SERVER_LIMIT=1024" \
./configure \
--with-apache=../apache_1.3.33 \
--with-ssl=../openssl-0.9.7d \
--with-mm=../mm-1.1.3 \
--prefix=/opt/apache1-3-33 \
--enable-shared=max

このように、configure に CFLAGS="-DHARD_SERVER_LIMIT=1024" などと与えてあげれば良い。mod_sslのconfigureはそのままApacheのconfigureを叩いてくれるので、CFLAGSはApacheのconfigureに引き継がれるのです。

その後makeして無事終了。

詳しくはGoogle神様に聞くか、Apacheのソースツリーで

$ grep -r HARD_SERVER_LIMIT *

なんてことをやらかしてください。

ほんとに1024になったのかしら?という疑問は

$ ./src/httpd -V

と、出来上がったhttpd に -V オプションを渡すと確認できる。

$ ./src/httpd -V
Server version: Apache/1.3.33 (Unix)
Server built:   Aug -- 2005 --:--:--
Server's Module Magic Number: --------:--
Server compiled with....
(省略)
 -D HARD_SERVER_LIMIT=1024
(省略)