テックブログ

技術ネタ

パスワードのセキュリティー設定を試してみる

こんにちは、技術部のfです。もうすっかり寒くなってきましたね。
突然ですが、RedHat社が公開しているセキュリティーガイドをご覧になられたことは
ありますでしょうか。

Red Hat Enterprise Linux 7
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/security_guide/

Red Hat Enterprise Linux 6
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/security_guide/

今回は「第4章 ツールとサービスを使用したシステム強化
(6系のセキュリティーガイドの場合は「第2章 ネットワークのセキュリティ保護」)の内容について、
実際にサーバで少し触ってみたいと思います。

強固なパスワードの作成

7系のURLはこちら、6系のURLはこちらです。

この項においては実際に何かサーバ側の設定を行うものではありませんが、安全なパスワードに
ついての解説があります。「安全ではないパスワード」の点についても記載がありますので、今一度
普段から利用しているパスワードが以下に該当していないか、確認してみましょう。

以下はセキュリティガイドからの引用となります。

安全なパスワードの作成にはいくつものアプローチがありますが、以下の悪い点は必ず避けてください。

  • 辞書の 1 単語を使用する。外国語の 1 単語を使用する。反転した単語を使用する。数字のみを使用する。
  • パスワードまたはパスフレーズを 10 文字未満にする。
  • キーボードのレイアウトにおけるキーの配列を使用する。
  • パスフレーズを書き留める。
  • 誕生日や記念日、家族の名前、ペットの名前などの個人情報をパスフレーズに使用する。
  • 複数のマシンで同じパスワードまたはパスフレーズを使用する。

出典:第4章 ツールとサービスを使用したシステム強化 – Red Hat Customer Portal

いかがでしょうか。

パスワードは複雑なものにしようとすると、当然人間の頭では覚えにくいものになって
しまいますので、つい簡単であったり自分自身や身近なものに設定してしまいがちでは
ありますが、悪用されない為にも複雑なパスワードを設定すると良いですね。

強固なパスワードの強制

7系のURLはこちら、6系はこちらです。

「○文字以上のパスワードが必須」といった一般ユーザのパスワードポリシーをサーバ側で任意に
設定することができるというものです。

RHEL6(CentOS6)ではpam_cracklib.so PAMモジュールが利用されていましたが、
RHEL7(CentOS7)ではpam_pwquality.so PAM モジュールが使われているようです。

それでは、実際にサーバ上で試してみます。利用環境は以下の通りです。

$ cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)

まずはユーザを作成します。ユーザ名はhogeとしましょう。

# useradd hoge

# grep hoge /etc/shadow
hoge:!!:17849:0:99999:7:::

できました。ちなみに、この時点でhogeに切り替わりパスワードを設定しようとしても、アカウントが
ロックされたままの状態となっている為、パスワードの変更を行うことはできませんでした。

# su - hoge
$ passwd
ユーザー hoge のパスワードを変更。
hoge 用にパスワードを変更中
現在の UNIX パスワード:
passwd: 認証トークン操作エラー

6系のドキュメントになってしまいますが、こちらに記載されている通り、passwdコマンドで
パスワードの設定を行い、ユーザをアクティベートさせる必要があります。
shadowファイルの「!!」は、アカウントがロックされている状態を表しています。

ということで、パスワードを設定します。

# passwd hoge
ユーザー hoge のパスワードを変更。
新しいパスワード:
よくないパスワード: このパスワードには一部に何らかの形でユーザー名が含まれています。
新しいパスワードを再入力してください:
passwd: すべての認証トークンが正しく更新できました。

「よくないパスワード」として警告されていますが、そのままパスワードを設定することができました。
shadowファイルの中身も更新されています。(※一部マスクしています)

# grep hoge /etc/shadow
hoge:$6$QQREg*****/YHeF.:17849:0:99999:7:::

次に、hogeユーザに切り替えパスワードを変更してみます。

$ passwd
ユーザー hoge のパスワードを変更。
hoge 用にパスワードを変更中
現在の UNIX パスワード:
新しいパスワード:
よくないパスワード: このパスワードは辞書チェックに失敗しました。 - 異なる文字が十分に含まれていません
新しいパスワード:
よくないパスワード: このパスワードは辞書チェックに失敗しました。 - 異なる文字が十分に含まれていません
新しいパスワード:
よくないパスワード: このパスワードは辞書チェックに失敗しました。 - 異なる文字が十分に含まれていません
passwd: サービスの最大試行回数に達しました

$ passwd
ユーザー hoge のパスワードを変更。
hoge 用にパスワードを変更中
現在の UNIX パスワード:
新しいパスワード:
よくないパスワード: このパスワードは過去に設定されたものと同じです。
新しいパスワード:
よくないパスワード: このパスワードは過去に設定されたものと同じです。
新しいパスワード:
よくないパスワード: このパスワードは過去に設定されたものと同じです。
passwd: サービスの最大試行回数に達しました

一回目は最初に設定したパスワードとは異なるものの、簡単なパスワードを入力し、
二回目は最初に設定したパスワードと全く同じパスワードを入力しましたが、
いずれも「よくないパスワード」として警告が出ます。
それでもしつこく入力すると、いよいよお断りされてしまいました。

セキュリティーガイドの注記にもある通り、rootユーザがパスワードを設定する場合は
ポリシーに沿っていないような、推測が容易なパスワードであっても設定が可能ですが
一般ユーザではこのように設定ができないようになっています。

少し話が逸れてしまいましたが、実際にサーバ上でパスワードの強度を設定しようと思います。

セキュリティーガイドにある通り、/etc/security/pwquality.confに追加して設定してみます。
デフォルトでは各種パラメータに関する記述があるものの、全てコメントアウトされている状態でした。

まずはセキュリティーガイドにもある「minclass」を設定してみたいと思います。
pwquality.confにデフォルトで記述されている設定のコメントアウトをそのまま外してみます。

# vi /etc/security/pwquality.conf
(略)
# The minimum number of required classes of characters for the new
# password (digits, uppercase, lowercase, others).
minclass = 4
(略)

コメントアウトの解説を読むと、minclassは「新しいパスワードに必要なクラスの
最小数(数字、大文字、小文字、その他)」を設定することが出来るようです。

minclass=4 と指定した場合、「パスワードに数字、大文字、小文字、その他(=記号)を
含める必要がある」というポリシーになります。

では実際にパスワードを設定して試してみましょう。
expectパッケージがインストールされている環境であれば、mkpasswdコマンドで
ランダムなパスワードを生成することができます。

まずは小文字のみのパスワードを生成し、設定してみます。

$ mkpasswd -l 8 -C 0 -d 0 -s 0
fsgggjfi

$ passwd
ユーザー hoge のパスワードを変更。
hoge 用にパスワードを変更中
現在の UNIX パスワード:
新しいパスワード:
よくないパスワード: このパスワードは 4 種類未満の文字の種類が含まれています。
新しいパスワード:
よくないパスワード: このパスワードは 4 種類未満の文字の種類が含まれています。
新しいパスワード:
よくないパスワード: このパスワードは 4 種類未満の文字の種類が含まれています。
passwd: サービスの最大試行回数に達しました

駄目でした。では次に、小文字+大文字のパスワードを設定してみます。

$ mkpasswd -l 8 -C 1 -d 0 -s 0
ojhocwnS

$ passwd
ユーザー hoge のパスワードを変更。
hoge 用にパスワードを変更中
現在の UNIX パスワード:
新しいパスワード:
よくないパスワード: このパスワードは 4 種類未満の文字の種類が含まれています。
(略)
passwd: サービスの最大試行回数に達しました

これも条件を満たしていないので、設定できませんでした。
次に小文字+大文字+数字のパスワードを設定してみます。

$ mkpasswd -l 8 -C 1 -d 1 -s 0
aphe5soN

$ passwd
ユーザー hoge のパスワードを変更。
hoge 用にパスワードを変更中
現在の UNIX パスワード:
新しいパスワード:
よくないパスワード: このパスワードは 4 種類未満の文字の種類が含まれています。
(略)
passwd: サービスの最大試行回数に達しました

まだ足りないので、今後は小文字+大文字+数字+記号のパスワードを設定してみます。

$ mkpasswd -l 8 -C 1 -d 1 -s 1
w+ag9zWn

$ passwd
ユーザー hoge のパスワードを変更。
hoge 用にパスワードを変更中
現在の UNIX パスワード:
新しいパスワード:
新しいパスワードを再入力してください:
passwd: すべての認証トークンが正しく更新できました

ようやくこれでパスワードを変更することができました!
「よくないパスワード」と怒られることもありません。

逆に、minclass=0にするとどうでしょうか。

# vi /etc/security/pwquality.conf
minclass = 0

$ mkpasswd -l 8 -C 0 -d 0 -s 0
pnvvzbts

$ passwd
ユーザー hoge のパスワードを変更。
hoge 用にパスワードを変更中
現在の UNIX パスワード:
新しいパスワード:
新しいパスワードを再入力してください:
passwd: すべての認証トークンが正しく更新できました。

minclass=4では設定することのできなかった「小文字のみのパスワード」でも
変更できるようになっています。
実際にminclassの設定が有効になっていることがわかりますね。

minclass以外にも、minlen(パスワードの最小文字数)やdifok(現在設定されているパスワードと
○文字以上異なっていれば設定可能な文字数)などのパラメータを設定することができます。

difokは少し分かりにくいかもしれませんが、例えばdifok=1に設定した場合であれば
以下のような変更は認められますが、

変更前 → pnvvzbts
変更後 → pnvvzbta

difok=2に設定した場合、上記だと変更前から1文字しか変わっていない為、
以下のようなエラーメッセージが出て変更することができないのです。

$ passwd
ユーザー hoge のパスワードを変更。
hoge 用にパスワードを変更中
現在の UNIX パスワード:
新しいパスワード:
よくないパスワード: このパスワードは古いパスワードと似すぎています。
(略)
passwd: サービスの最大試行回数に達しました

difok=2の場合は、元のパスワードから2文字以上変更すれば設定が可能となります。

更に数値を大きくすることで、同じようなパスワードを繰り返し
使われないようにすることができるという訳ですね。

これでも4章のスクロールバーが半分もいっていませんが、横道に逸れつつも
色々と試してみながら進めていたら結構な量になってしまいました。

セキュリティーガイドで公開されている内容はかなりのボリュームがありますので、
よろしければ色々と試してみてください。

それではまた。

実績数30,000件!
サーバーやネットワークなど
ITインフラのことならネットアシストへ、
お気軽にご相談ください