▼Samba4 の パスワードポリシーの --complexity=on は、どんなパスワードを有効とするのか▼

Samba4 で Active Directory を組んだ際、パスワードポリシー (どんなパスワードに変更できるかの制限) は samba-tool domain passwordsettings で変更しますが、 --complexity=on (デフォルト値) での「複雑なパスワード」 の具体的な内容について調べている人はいなかったようなので、調べてみました。

▼おさらい:Samba4 のパスワードポリシー

Samba4 の AD機上で、 以下のコマンドで現在値の設定がダンプできます。下記例はデフォルト値。

# samba-tool domain passwordsettings show
Password informations for domain 'DC=samdom,DC=example,DC=or,DC=jp'

Password complexity: on
Store plaintext passwords: off
Password history length: 24
Minimum password length: 7
Minimum password age (days): 1
Maximum password age (days): 42
Account lockout duration (mins): 30
Account lockout threshold (attempts): 0
Reset account lockout after (mins): 30

項目デフォルト値内容
Password complexityon パスワード変更時に、「複雑なパスワード」を必要とします。
Password history length24(回) 過去に使ったパスワードには変更できないようにします。 何回分まで覚えているかの設定。0で無効。
Minimum password length7(文字) パスワードの最低の長さ。Unicodeのコードポイント数で数えます。
Minimum password age (days)1(日) パスワードを変更したら、しばらくは再度パスワードを変更できないようにします。 0 で無効 (即パスワード再変更できる)
Maximum password age (days)42(日) パスワードの有効期限。この日数を過ぎると強制的にパスワード変更させられます。 0 で無期限。
Account lockout duration (mins)30(分) パスワード間違いすぎでアカウントがロックする際、 どのくらいの時間ロックをかけるか。
Account lockout threshold (attempts)0(回) パスワードを何回間違えたらロックをかけるか、の回数。 デフォルトで0回(ロックしない)。
Reset account lockout after (mins)30(分) パスワード間違いすぎでアカウントがロックされた際、 自動的に解除するまでの時間。

特にMinimum password age, Maximum password age はデフォルトから 変更しておきたいサイトは多いかと思います。 Password history length も 24回分では多すぎるかと。

▼「複雑なパスワード」の要件

Password complexity: on (--complexity=on) ではどんな制約が かかるか、というのはろくすっぽドキュメントが無いので、 Samba4のソースコードを当たってみます。 lib/util/genrand_util.ccheck_password_quality() が、具体的な判定を行っています。

で、コードの冒頭にはコメントで以下のように述べられています。

/**
  Microsoft composed the following rules (among others) for quality
  checks. This is an abridgment from
  http://msdn.microsoft.com/en-us/subscriptions/cc786468%28v=ws.10%29.aspx:

  Passwords must contain characters from three of the following five
  categories:

   - Uppercase characters of European languages (A through Z, with
     diacritic marks, Greek and Cyrillic characters)
   - Lowercase characters of European languages (a through z, sharp-s,
     with diacritic marks, Greek and Cyrillic characters)
   - Base 10 digits (0 through 9)
   - Nonalphanumeric characters: ~!@#$%^&*_-+=`|\(){}[]:;"'<>,.?/
   - Any Unicode character that is categorized as an alphabetic character
     but is not uppercase or lowercase. This includes Unicode characters
     from Asian languages.

 Note: for now do not check if the unicode category is
       alphabetic character
**/

何をもって「大文字」「小文字」とするか は、1バイトに収まる文字(0-127)については libc の isupper(3), islower(3) を使いますが、 その他のUnicode文字については Samba は自分で 変換表を抱えていて 判定しています。

1文字は Unicode codepoint 単位で数えるので、漢字も1文字です。 2文字相当にはなりません。 漢字を入れてもパスワードとしてのエントロピーはローマ字と比べても低そうなので、 そんなものかもしれません。


kabe.sra-tohoku.co.jp