【Amazon Linux】sudo時のパスワードの強さをpwscoreを使ってチェックする

2016.03.08

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは植木和樹@上越妙高です。本日はpwscoreというコマンドを使ってパスワードの強さをチェックしてみたいと思います。

Amazon Linuxでは標準でec2-userによる鍵認証方式でログインします。そのためパスワードを利用する機会は通常ありません。しかしセキュリティーの観点から以下の要件が考えられます。

  • ec2-user(共用ユーザー)の禁止
  • sudoは個人別のOSユーザー(管理者)にのみ許可する
  • sudo時には個人のパスワード認証を必須とする
  • パスワードは8文字以上で英数字を混在させなくてはならない

管理者ユーザー(ここではadminとしておきましょう)は、Linuxにはssh鍵認証方式でログインし、sudo時にはさらにパスワード認証が求められる、という運用にしてみましょう。

さてsudo時に必要となるパスワードが簡単にならないようにシステムでルールを設定してみます。

パスワードルールを決める libpwquality

パスワードのルールはlibpwqualityというライブラリでチェックされます。ルール自体は/etc/security/pwquality.confというファイルで設定します。(後述)

パスワードの強さをチェックする pwscore

libpwqualityをインストールすると、与えたパスワードの強さを評価してくれるpwscoreというユーティリティが付属しています。使い方はこんな感じです。

$ echo 'CHECKPASSWORD' | pwscore
または
$ echo 'CHECKPASSWORD' | pwscore admin

ユーザー名(例では"admin")を与えると、後述する「パスワードにユーザー名が含まれていないこと」のチェックも行ってくれます。

チェック用シェルスクリプト

下記のようなシェルスクリプトを作成して試してみました。

/tmp/pwd.sh

#!/bin/sh

declare -a PASSWORD
PASSWORD+=('Abc198$z')     # 1 OK
PASSWORD+=('abc198$z')     # 2 大文字なし
PASSWORD+=('ABC198$Z')     # 3 小文字なし
PASSWORD+=('AxByCz$z')     # 4 数字なし
PASSWORD+=('AxB198az')     # 5 記号なし
PASSWORD+=('Abc198$')      # 6 文字数不足
PASSWORD+=('Abc111$z')     # 7 同じ文字が3文字連続している
PASSWORD+=('ABXYc198$z')   # 8 大文字が4文字連続している
PASSWORD+=('Axbyc198$z')   # 9 小文字が4文字連続している
PASSWORD+=('Abc1984$z')    # 10 数字が4文字連続している
PASSWORD+=('Abc198$#!%z')  # 11 記号が4文字連続している
PASSWORD+=('AdmiN198$z')   # 12 パスワードにユーザー名が含まれている

for num in $( seq 0 $(( ${#PASSWORD[@]} - 1)) )
do
  p=${PASSWORD[$num]}
  echo "[$((num + 1))] $p"
  echo $p | pwscore admin
done

初期設定で試す

Amazon Linuxデフォルトではそれ程強いルールになっていないようです。簡単な辞書チェックと、パスワードにユーザー名が含まれているかのチェックはしてくれているみたいですね。(記号を4つも使ったパスワードが単純といわれるのも理不尽な気がしますが)

# sh /tmp/pwd.sh
[1] Abc198$z
24
[2] abc198$z
15
[3] ABC198$Z
15
[4] AxByCz$z
0
[5] AxB198az
21
[6] Abc198$
パスワードの品質チェックに失敗しました。
 このパスワードは辞書チェックに失敗しました。 - 辞書の単語に基づいています
[7] Abc111$z
18
[8] ABXYc198$z
47
[9] Axbyc198$z
50
[10] Abc1984$z
38
[11] Abc198$#!%z
パスワードの品質チェックに失敗しました。
 このパスワードは辞書チェックに失敗しました。 - 単純/系統的すぎます
[12] AdmiN198$z
パスワードの品質チェックに失敗しました。
 このパスワードには一部に何らかの形でユーザー名が含まれています。

パスワードルールを設定してみる

それでは/etc/security/pwquality.confを修正して、ルールを強化してみましょう。

  • パスワードは8文字以上
  • 大文字、小文字、数字、記号が最低1文字含まれていなければならない
  • 111, AAA のように同じ文字が3文字以上連続してはならない
  • 2016, PASS のように同じ文字種が4文字以上連続してはならない
$ grep "^[^#]" /etc/security/pwquality.conf
minlen = 8 #最低8文字
dcredit = -1 #数字を最低1文字含める
ucredit = -1 #大文字を最低1文字含める
lcredit = -1 #小文字を最低1文字含める
ocredit = -1 #記号を最低1文字含める
minclass = 2 #最低2種類の文字種(数字、大文字、小文字、記号)を含める(※今回は上記で最低1文字以上の制約があるため意味なし)
maxrepeat = 2 #同じ文字の連続は2文字まで許可
maxclassrepeat = 3 #同じ文字種の連続は3文字まで許可

それでは再度チェックしてみましょう。

$ sh /tmp/pwd.sh
[1] Abc198$z
37
[2] abc198$z
パスワードの品質チェックに失敗しました。
 このパスワードには 1 個未満の大文字のアルファベットが含まれています。
[3] ABC198$Z
パスワードの品質チェックに失敗しました。
 このパスワードには 1 個未満の小文字のアルファベットが含まれています。
[4] AxByCz$z
パスワードの品質チェックに失敗しました。
 このパスワードには 1 個未満の数字が含まれています。
[5] AxB198az
パスワードの品質チェックに失敗しました。
 このパスワードには 1 個未満の記号が含まれています。
[6] Abc198$
パスワードの品質チェックに失敗しました。
 このパスワードは 8 未満の文字列です。
[7] Abc111$z
パスワードの品質チェックに失敗しました。
 このパスワードは 2 個を越える連続する同じ文字が含まれています。
[8] ABXYc198$z
パスワードの品質チェックに失敗しました。
 このパスワードは 3 個を越える連続する同じ種類の文字が含まれています。
[9] Axbyc198$z
パスワードの品質チェックに失敗しました。
 このパスワードは 3 個を越える連続する同じ種類の文字が含まれています。
[10] Abc1984$z
パスワードの品質チェックに失敗しました。
 このパスワードは 3 個を越える連続する同じ種類の文字が含まれています。
[11] Abc198$#!%z
パスワードの品質チェックに失敗しました。
 このパスワードは 3 個を越える連続する同じ種類の文字が含まれています。
[12] AdmiN198$z
パスワードの品質チェックに失敗しました。
 このパスワードには一部に何らかの形でユーザー名が含まれています。

デフォルト設定でOKだったパスワードがちゃんとNGになってますね!

password 設定時にも有効

pwquality.conf で設定したパスワードルールは、passwdコマンドでパスワードを設定する時にも有効になります。 (passwd → libpam.so → pam_pwquality.so → libpwquality.so という関係になってるっぽい)

$ passwd
ユーザー admin のパスワードを変更。
admin 用にパスワードを変更中
現在の UNIX パスワード:
新しいパスワード:
よくないパスワード: このパスワードは 3 個を越える連続する同じ種類の文字が含まれています。
新しいパスワード:
新しいパスワードを再入力してください:
passwd: すべての認証トークンが正しく更新できました。

まとめ

Linuxでのパスワードルール強化方法と、チェック方法についてまとめてみました。

パスワードをいくつか試してみましたが、パスワード長が長ければ長いほど点数が高くなるようです。パスワードジェネレーターで作成した8文字のパスワードは40点、9文字にすると56点でした。だいたい50点以上が適度な強さ目安でしょうか? pwmakeコマンドを使うとルールの則った十分な強度のパスワード文字列を生成してくれます。1Passwordなどのツールを使っているならば、パスワードを覚える必要もないですので長いパスワードを使いましょう。

$ echo 'F4puX@0h' | pwscore
40
$ echo 'F4puX@0h1' | pwscore
56
$ pwmake 80
aKWamuR4j2Aj!Yt$4

共用サーバーでは個人別ユーザーでログインし、sudoにもパスワードをかけて安全なサーバー運用を心掛けましょう!

参考資料