Samba で複雑なパスワードを強制させる方法
Samba 3.0.8 以降では、 check password script パラメータと、Sambaのソースアーカイブに同梱されているcrackcheckというプログラムを用いることで、Windows のグループポリシーやローカルポリシーなどで「パスワードは要求する複雑さを満たす」というポリシーと同様の機能を実現することが可能です。
Windows でこのポリシーを有効にすると、パスワードに大文字、小文字、数字、記号のうち、最低3種類を含むことが求められる他、いくつかの制限事項が発生します。詳細は「複雑なパスワードを要求するメッセージで、パスワードに対する文字グループの要件が明示されない」などを参照してください。
check password scriptパラメータの設定
check password scriptパラメータには、パスワードの強度をチェックするプログラムやスクリプトのフルパスを指定します。
指定されたプログラムはチェック対象のパスワードを標準入力から受けとり、パスワードが適切な場合は0を、不適切な場合は0以外を返却する必要があります。以下、パスワードの文字列が7文字以上なら0を、それ未満なら1を返却する以下のような簡単なスクリプト例に説明を行います。
#!/bin/sh # 最小パスワード長を7バイトに設定 MIN_PASSLENGTH=7 # 最大128バイトまでの長さでパスワードを読み込む read -n 128 -s new_pass # パスワード(改行文字を含むため、受けとった文字列の長さは実際のパスワード長より1バイト長い)が最小パスワード長以上なら0を、それ以外なら1を返却 if [ `echo $new_pass | wc -m` -gt ${MIN_PASSLENGTH} ] ; then exit 0 else exit 1 fi
※このスクリプトはパラメータの説明のためのスクリプト例で、実用的なものではありません。
説明の便宜上、このスクリプトを「/usr/local/sbin/smb-passchk」というフルパスで保存したものとします。スクリプトを作成したら以下のようにして動作を確認しておきましょう。
# echo dameda | /usr/local/samba/sbin/crackcheck ; echo $? 1 # echo damedam | /usr/local/samba/sbin/crackcheck ; echo $? 0 ※6バイトの文字列「dameda」の時に1、7バイトの「damedam」の時には0が返却されることを確認しています。なお、上記は、シェルがbashなどsh系の場合の実行例になります。tcshなどcsh系の場合は「echo $?」の代わりに「echo $status」を用いて確認を行ないます。
動作確認ができたら、smb.confに以下のような設定を行なうことで、パスワードのチェックが有効になります。
[global] ... check password script = /usr/local/sbin/smb-passchk
この設定後、制限に違反するパスワードを設定しようとすると以下のようなエラーが出力されます。
$ smbpasswd Old SMB password: New SMB password: Retype new SMB password: machine 127.0.0.1 rejected the (anonymous) password change: Error was : Password restriction. Failed to change password for monyo ※「Password restriction(パスワードの制限)」により変更に失敗したことが確認できます。
この時smbdのログファイルには、以下のようなメッセージが各々ログレベル5と1で出力されます。
[..., 5] smbd/chgpasswd.c:change_oem_password(1053) change_oem_password: check password script (/usr/local/samba/bin/smb-passchk) returned [1] [..., 1] smbd/chgpasswd.c:change_oem_password(1056) change_oem_password: check password script said new password is not good enough!
Samba付属のcrackcheckをインストールする
上記ではパラメータの説明のために簡単なスクリプトを紹介しましたが、実運用に耐える機能を持ったプログラムを作るのはそれなりに大変です。実はSambaにはcrackcheckというプログラムが同梱されていますので、まずはこのプログラムを使ってみることをお勧めします。
このプログラムは Samba のソースアーカイブの examples/auth/crackcheck にソースファイルの形で存在しています。使うには、コンパイルが必要ですが、特に難しいことはありません。gccを始めとする開発環境がインストールされており、cracklibのパッケージがインストールされていれば、以下のようにSambaのソースアーカイブを展開後、crackcheckディレクトリでmakeと入力するだけで、crackcheckプログラムがコンパイルされます。確認した限り、Fedora Core 5ではcracklibパッケージ、Debian GNU/Linux 3.1(sarge)ではcracklib2-devパッケージが必要です。
# tar xzf samba-3.0.XX.tar.gz ← ソースアーカイブの展開。「XX」の部分は、自分が取得したバージョンのSambaのソースアーカイブのバージョン番号 # cd samba-3.0.XX/example/auth/crackcheck # ls crackcheck.c Makefile ← crachcheckは存在していない # make gcc -O2 -c -o crackcheck.o crackcheck.c crackcheck.c: In functionn': crackcheck.c:132: warning: assignment discards qualifiers from pointer target type gcc -O2 -lcrack -o crackcheck crackcheck.o # ls crackcheck crackcheck.c crackcheck.o Makefile ← crackcheckが生成されている。
このcrachcheckを/usr/sbinなどの適切なディレクトリにコピーすることでインストールは完了ですが、実際にcrackcheckを使うには、オプションの設定が必要です。以下のように単に実行するとオプションの一覧が表示されます。
# /usr/sbin/crackcheck ERR - Missing cracklib dictionary Usage: crackcheck [-c] [-s] [-d <dictionary>] -c enables NT like complexity checks -d <dictionary file> for cracklib -s simple check use NT like checks ONLY The password is read via stdin.
-dはcracklibが単純なパスワードかどうかを判定する辞書ファイルのフルパス名を指定します。フルパス名はディストリビューションにより異なりますが、Fedora Core 5では/usr/share/cracklib/pw_dictを指定します。Debian GNU/Linux 3.1(sarge)では /var/cache/cracklib/cracklib_dict を指定しますが、あらかじめ/usr/sbin/crack_mkdictコマンドにより辞書ファイルを作成しておく必要がありますので注意してください。
-cと-sオプションにより、実際に行なわれるチェックの内容が以下のように制御されます。「Windows相当のチェック」とは、大文字、小文字、数字、記号のうち3種類以上が含まれていることのチェックです。「cracklibチェック」とは、cracklibに内蔵された機能や-dオプションで指定された辞書を用いたチェックになります。辞書ファイルが使えない場合は、-sオプションによるWindows相当のチェックのみが可能です。
表xx11: crackcheckが行なうチェックの種類 オプション, Windows相当のチェック, cracklibチェック (なし), ×, ○ -c, ○, ○ -c -s / -s, ○, ×
必要とする機能に応じたオプションを付加した形でsmb.confに設定を行なってください。Fedora Core 5の場合の設定例を以下に示します。
[global] ... check password script = /usr/sbin/crackcheck -c -d /usr/share/cracklib/pw_dict
なお、どのようなパスワードが禁止されるかは、あらかじめ以下のようにして確認しておくとよいでしょう。
$ echo PaSsW0rd | /usr/sbin/crackcheck -c -d /usr/share/cracklib/pw_dict; echo $? ERR - it is based on a dictionary word 253 $ echo "DameDame-1" | /usr/sbin/crackcheck -c -d /usr/share/cracklib/pw_dict; echo $? 0