脆弱正診断ツール

Nessus
脆弱性管理用のサーバ/検査を実行するクライアントの対で動作し、外部の任意のホストの脆弱性を診断できるツール。
Nessus サーバは Linux/BSD 等でしか動作しませんが、クライアントは Windows 版もあります。
なかなか便利です。
構築したサーバにうっかり脆弱性があったら洒落になりませんし。

MD5 クラッキング

とりあえず何でもハッシュにしておけば安全、は間違いです。
CRC32 等、ハッシュアルゴリズムとソースデータの性質によっては衝突する可能性が高くなりますし、ハッシュにすると、ハッシュ自体が表現できる範囲を超えた数を検査すると必ず重複します(CRC32 なら 32ビット, MD5 なら128ビット)。
また、いくら不可逆とはいえ、元のデータが簡単に類推できるものなら総当たりで調べる事が可能(*1)です。
たとえば単純に現在時刻のタイムスタンプ(や精度が十分に高くない乱数)からのハッシュ、ユーザのインプットなど、外部に判明している値からのハッシュ、アルファベット1文字や単純な繰り返しからのハッシュは推測されやすく安全とはいえません。
さらに、類推ができなくても元データの表現している範囲が狭いのであれば衝突の確率も高くなります。また、MD5 には元データさえわかれば、全く同じハッシュを持ちつつ、元のデータを改ざんできる脆弱性がある事も判明(*2)しています。
 
とはいえ、以上の性質を理解した上で、一時的な値として利用する分にはハッシュというのは価値の高いものだと
 
 *1:
XMD5.org
Project MD5 RainbowCrack
  メモリ消費を犠牲に処理速度を向上する技法を使ったMD5 の総当たりチェックプログラム. Windows 版もあります。
  8 文字までの半角英数字文字列であれば数分で解読できるとのこと。
  少し前までオンラインでも試せましたが、現在はオンライン版は公開終了しているようです。
 
 *2: 非公開なデータ(一部、あるいは全て)が十分に長くなるようにし、かつハッシュ値の有効期間も限定するなど、制限を設ける等回避方法もあります。あるいは(今のところ)安全な SHA-256 を使うのも方法です。
SHA-0、MD5、 MD4にコリジョン発見、reduced SHA-1も(/.j)
MD4/MD5 コリジョンの実証コードが公開(/.j)
RFC4270 インターネットプロトコルにおける暗号技術的ハッシュ関数についての攻撃

HTTPS でクライアント認証に証明書を使う

電子申請や決済サイトでの管理など、各所で利用されてきているので導入してみました。
以下は自分が承認した証明書のみを受け付ける時の設定手順です。

1. CA 構築のための鍵のペアを生成する
2. Apache の設定で、クライアント証明書が承認を要求して CA を参照するように設定する
2. クライアント用の鍵のペアを生成する
3. クライアント用の鍵から証明書を作成する
4. 証明書を .p12 形式に変換する
5. 4 で作った証明書をクライアントのブラウザにインポートしてもらう

という手順を踏めば見られるようになります。証明書がないと閲覧不可になります。
参考:
SSL 入門
OpenSSL を使った CA の構築

CUI で SSL 証明書と秘密鍵の中身を表示する

OpenSSL プログラムを利用することで表示が可能です。
– server.crt という証明書の情報を表示する。

openssl x509 -noout -text -in server.crt

– server.key という RSA 方式秘密鍵の情報を表示する。

openssl rsa -noout -text -in server.key

 
参考:
トラブルシューティング – サーバが起動したように見えるが、セキュアサイトにアクセスできない(Linux JF)

Tomcat で Filter を使う例(IPアドレスによるアクセス制限)

<http://www.jajakarta.org/kvasir/bbs/technical/688?expand=true>
jakarta.org: Ja-Jakarta Project 掲示板 -> Tomcatでの特定のディレクトリに
対してのアクセス制限の方法
より転載(一部改変).
フィルタの実装の仕方、web.xml のパラメータの取得の仕方が分かるし、実用的。
web.xmlの設定:

<!– ローカルネットワークからだけのアクセス許可–>
<filter>
<filter-name>Allow Local Network Access</filter-name>
<filter-class>IpAddressFilter</filter-class>
<init-param>
<param-name>allowIP</param-name>
<param-value>192.168.0.</param-value>
</init-param>
</filter>
 
<filter-mapping>
<filter-name>Allow Local Network Access</filter-name>
<url-pattern>/pages/manage/*</url-pattern>
</filter-mapping>

 
IpAddressFilter.java:

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class IpAddressFilter implements Filter {

private FilterConfig config;
private String allow_ip;

/**
* パスに対してアクセス制限を行う
*
*/
public final void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
final String ip_address = ((HttpServletRequest) request).getRemoteAddr();

if (!ip_address.startsWith(allow_ip)) {
((HttpServletResponse) response).sendError(HttpServletResponse.SC_FORBIDDEN);
}
else {
chain.doFilter(request, response);
}
}

public final void init(FilterConfig filterConfig) throws ServletException {
this.config = filterConfig;
this.allow_ip = config.getInitParameter(“allowIP”);
}

public final void destroy() {
this.config = null;
this.allow_ip = null;
}
}

その他参考:
– Java で Hello World
<http://www.hellohiro.com/filter.htm>

JavaScriptでランダムなパスワードを生成する

JavaScriptを使ったランダムなパスワード文字列を生成するサンプルコードです。

/// length 桁のパスワードを生成する
function createRandomPassword(length){
  var lc = "abcdefghijklmnopqrstuvwxyz"; 
  var sList = lc + lc.toUpperCase()+"0123456789_-"; // 小文字 + 大文字 + 数字 + 対応する記号
  var password = ""; 
  for (i = 0; i < length; i++)
      password += sList.charAt(Math.floor(Math.random() * sList.length));
  return password;
}

// 利用例
var passwordLength = 12; 
var myPassword = createRandomPassword(passwordLength);
console.log(myPassword);
prompt(passwordLength + "桁のパスワードを生成しました。", myPassword);

デモ:

桁数:

ボタンを押すたびランダムなパスワード文字列を作成します。
ポチポチ押してみてくださいね。

Apache を簡単に chroot する

ports:www/mod_chroot
(http://core.segfault.pl/~hobbit/mod_chroot/)
Apache13 でも問題なく動くようにテストされてるけど 20 以降だとさらに手軽にできるとか書いてる.
mod_security の chroot 特化バージョンという位置付け.
ただし Directory, Location, VirtualHost の中には入れられない.
 
追記(2008-03-21):
FreeBSD の ports を使って Apache22 で試したところ、問題なくビルド、インストールできました。
VirtualHost を使っている場合は、VirtualHost ごとに chroot にするのではなく共通の chroot を使い, Apache を root 権限実行して VirtualHost ごとに所有者を分け, DocumentRoot を 0700 にして suexec で所有者権限でしか実行できなくするのが望ましいかもしれません。