【Amazon Linux】sudo時のパスワードの強さをpwscoreを使ってチェックする
はじめに
こんにちは植木和樹@上越妙高です。本日は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にもパスワードをかけて安全なサーバー運用を心掛けましょう!