2023年 06月 29日
パスワードポリシー強化各種設定のいろいろ、文字数、文字種を指定
ユーザアカウント名は8文字以内にすべきか?ユーザの命名規則の理由と対策
大病院で起きた大規模サイバーテロ:閉塞網が作る慢心が産んだ惨事
Windows11 pro の場合、( C:¥ > gpedit.msc ) グループポリシーエディタの、コンピューターの設定 > Windows の設定 > セキュリティの設定 > アカウントのポリシー、の中にパスワードポリシーがあります。一般的な企業、組織ではドメインのポリシーとして設定します。
この中の「複雑さの要件を満たす必要があるパスワード」を有効にすると、ユーザはパスワードを真剣に考える必要に迫られます。この機能が無効だと、一文字のパスワード、定期的に使い回すパスワードなど、好ましくないパスワードが使われてしまいます。
定期的にパスワードを変更させ、履歴を記憶し、同じパスワードを使い回しされない様パスワードの有効期限をここで設定します。工夫すれば大文字小文字混じりのパスワードで似た文字列を、使い回しできないパスワードを強制できます。
※ 定期的なパスワード変更のポリシーは、最近流行らないようです。しかし、ユーザのパスワードを強制リセットさせるためには、定期的なパスワード変更を求める方法を使うしかないでしょう。
「複雑さの要件を満たす必要があるパスワード」については次のドキュメントに記述があります。
"複雑さの要件を満たす必要があるパスワードパスワードは、次のカテゴリのうち 3 つに該当する文字を含んでいる必要があります。・ヨーロッパ言語の大文字 (A - Z、識別記号を含む、ギリシャ文字、キリル文字)・ヨーロッパ言語の小文字 (a - z、シャープ s、識別記号を含む、ギリシャ文字、キリル文字)・10 進法の数字 (0 - 9)・英数字以外の文字 (特殊文字): (~!@#$%^&*_-+=`|\\(){}\[\]:;"'<>,.?/) ユーロや英国ポンドなどの通貨記号は、このポリシー設定の特殊文字としてカウントされません。・アルファベット文字として分類されますが、大文字または小文字ではない Unicode 文字。 このグループには、アジア言語の Unicode 文字が含まれます。複雑さの要件は、パスワードの変更時や作成時に適用されます。"
ここで文字種として、特殊文字も使われるわけですが、バッチ処理などで ”> ,| ,* ,” などのパイプ文字やワイルドカードが含まれると誤動作することもあり得るわけですから、仕込む側からすると注意が必要です。
ギリシャ文字やキリル文字、Unicode 文字も使えそうですが、止した方が良いでしょう。このポリシーは自動的に6文字以上で、アルファベット大文字・小文字・記号を要求するのでかなり有力ですが、「パスワードの変更禁止期間」を一日以上、「パスワードの履歴を記憶」を9回程度に設定すると、ユーザはパスワードを一旦変更して、元のパスワードに戻して使い回すことができなくなります。かなり強力です。ユーザが毎日パスワードを変えて、元のパスワードに使いまわしたくても、9日以上はかかる訳です。ただし以前のパスワードと同じ文字を含む文字列は使えないという制限が Windows にはないので、"Password+01", "Password+02" の様なインクリメント型パスワード変更には対応していません。Windows のセキュリティの残念ポイントですね。「複雑さの要件を満たす必要があるパスワード」はあくまでも、「セキュリティ・アリバイ」の一種で、「最低限そういう機能がある」程度の低いレベルのものです。「セキュリティ・パスワード根性論」に基づいて、エンドユーザはもっと複雑なルールでパスワードを管理しなくてはなりません。
Windows ではランダムなパスワード生成をするための標準的なツールはありませんが、PoweShell で難儀なコマンドを実行するとパスワードを生成してくれます。あまりにも面倒なので、その種のフリーウェアを探したほうが無難なようです。
Windows10 までは「次回ログオンでパスワードを変更」というオプションがありましたが、 Windows11 にはこの機能がない(?)と思ったらありました。
スタートボタン > 右クリック > コンピュータの管理 > ユーザ名 > 「ユーザは次回ログオン時にパスワード変更が必要」にチェックを入れます。
UNIX 系 OS のパスワードは長年8文字以降は、スルーされるモノと思っていましたが、最近は長い桁数までマッチテストされるようです。パスワードの最低長、最長文字数ははっきり書かれたものが見当たらなかったのですが、 ChatGPT によれば6文字から72文字の間だそうです。
Linux では、Windows と同様に多くの特殊記号が使えますが、多くの特殊文字はシェルスクリプトなどに組み込む場合、誤動作の原因になるため一般的には使わない方がいいケースが多いようです。パイプ文字やワイルドカード、DNS に使うデリミタや @ マークなどです。(と、ChatGPT が教えてくれた)
ただし一般ユーザが UI でログインにのみ使用する場合は、使っても構わないと思います。
パスワードポリシー制限は次の2つのファイルに定義されます。
- /etc/login.defs
- /etc/security/pwquality.conf
/etc/login.defs には、パスワードの強制変更のポリシーを管理します。パスワードの有効期限(日数)(PASS_MAX_DAYS)や、パスワードをリセットしてからの変更できない日数(PASS_MIN_DAYS)、パスワードの有効期限が切れるまでの警告日数(PASS_WARN_AGE)を設定できます。パスワードの定期的な変更を要求し、容易にリセットしたパスワードを使い慣れたパスワードに戻してほしくない場合、数日間パスワードを変更できないよう設定できるわけです。詳しくは man login..defs で確認してください。下の値は openSUSE Leap 15/SLE15 での初期値です。MAX が最大値なのでパスワードのリセットが強制されていない状態です。
PASS_MAX_DAYS 99999PASS_MIN_DAYS 0PASS_WARN_AGE 7
PASS_MIN_DAYS を、1以上に設定しておくと、ユーザはパスワードを一旦変更して、もう一度変更するには翌日以降でなければできなくなります。"password01" を ”password02” に変更して、もう一度変更して使い回すには翌日以降でなければできなくなります。悪意のあるユーザがパスワードを変更しても、元に戻すという事ができません。ざまぁ見ろ、という事です。
/etc/security/pwquality.conf はパスワードの中身(品質)をチェックします。パスワードで最低限含めなければならない、大文字、小文字の個数、以前のパスワードの使いまわしを避けるための同一の文字数、再使用の制限などがチェックされます。
パスワードに大文字小文字の組み合わせを要求して、以前使ったパスワードと数文字以上違うパスワードを要求して使い回させないよう、パスワードポリシーをここで設定します。
# man pwquality.conf
pwquality.conf(5) - Linux man pagehttps://linux.die.net/man/5/pwquality.conf
平易にまとめたページがありましたので要点を翻訳しました。
How to enforce password complexity on Linux
パラメータ値
- minlen = パスワードの最小長- minclass = 使用する必要がある文字タイプの最小数 (つまり、大文字、小文字、数字、その他)- maxrepeat = 単一文字を繰り返すことができる最大回数- maxclassrepeat = 同じクラスに含めることができる行内の最大文字数- lcredit = クレジットを生成する小文字の最大数- ucredit = クレジットを生成する大文字の最大数- dcredit = クレジットを生成する最大桁数- ocredit = クレジットを生成する他の文字の最大数- difok = 古いパスワードと異なっていなければならない最小文字数- remember = 再使用できないようにシステムによって記憶されるパスワードの数- gecoscheck = ユーザーの passwd エントリ GECOS 文字列の単語をチェックするかどうか (値が 0 でない場合に有効)- dictcheck = cracklib 辞書の単語をチェックするかどうか (値が 0 でない場合に有効)- usercheck = パスワードに何らかの形式でユーザー名が含まれているかどうかをチェックするかどうか (値が 0 でない場合に有効)- enforcing = チェックに失敗し、値が 0 でない場合、新しいパスワードは拒否されます。- dictpath = クラックリブ辞書へのパス。デフォルトでは、cracklib のデフォルトが使用されます。
openSUSE Leap15/SLE Linux の Credit 値は、デフォルト0です。大文字を必ず一文字含める場合は ucredit=1 とすれば、必ず大文字を一文字使え、と言う事になります。maxrepeat=1 とか2とかにセットしておけば、aaaaa みたいなパスワードは設定できません。usercheck=1 に設定しておけば、ID=myname Password=myname というようなパスワードは使えません。
difok = 1 に設定すると、以下の様に一文字違いのパスワードは受け付けてくれません。"password01"を"password02" に変更する、パスワードインクリメント変更方式は受け付けないので、ユーザはほぼパスワード全体を違うものにする必要があります。パスワードポリシーとしては結構強力です。
user-ace@localhost:~> passwd user-aceChanging password for user-ace.Current password:New password:BAD PASSWORD: is too similar to the old onepasswd: Authentication token manipulation errorpasswd: password unchangeduser-ace@localhost:~>
ここで受けるパスワードチェックは、実際に変更するユーザ自身が passwd コマンドで受けるチェックにに有効です。 root でパスワードを変更するときには適用されません。
openSUSE Leap15/SLE15 では次のようにデフォルトが設定されています。(コメント削除)
localhost:/etc/security # cat pwquality.conf# Configuration for systemwide password quality limits# Defaults:# difok = 1# minlen = 8# dcredit = 0# ucredit = 0# lcredit = 0# ocredit = 0# minclass = 0# maxrepeat = 0# maxclassrepeat = 0# gecoscheck = 0# dictcheck = 1# usercheck = 1# usersubstr = 0# enforcing = 1# dictpath =# retry = 3# enforce_for_root# local_users_only
openSUSE Leap15 でパスワードを強制的に期限切れにするには root から password -e user_name を実行します。
passwd -e user-acepasswd: password expiry information changed.
pwgen パスワードジェネレータは 8 文字の任意のパスワードを提供してくれるジェネレータです。openSUSE Leap15/SLE15 では、デフォルトでインストールされないので YasT か zypper を使ってインストールします。
使い方は簡単です。
# pwgenOoweS8ai Nie5Saen Od9uphae Poh4Eewo ag5Iwohm Qui8Mohy aeF6eeha ge8Aa1he.....: 以下略
# pwgen -B 12 < ---- 12文字で曖昧に読める文字( i ,L ,1 など紛らわしい文字)を遣いたくない場合# pwgen -By 12 <---- 12 文字に -y で特殊文字も含める
SLES/openSUSE Leap には標準で cracklib-check コマンドが付いているので、このコマンドで一般的なパスワード辞書で使われているパスワードかどうかを調べる事ができます。
opensuse~ # cracklib-checkabcdefgabcdefg: it is too simplistic/systematicjohnnyjacksonjohnnyjackson: OKeasycompanyeasycompany: OKpasswordpassword: it is based on a dictionary word1click+11click+1: it is based on a dictionary wordnewzPaPernewzPaPer: OK^Copensuse~ #
他に pam でパスワードやログインに関するポリシーを定義できる機能がありますが、注意しないといけないのは、パスワード再入力させて失敗すると、再試行ログインできなくなる設定をしてしまうことでしょうか。総当たり攻撃などで、重要なアカウントをロックさせて、管理者すらログインできなくなってしまっては元も子もないという事です。
他にも SSH で特定の端末からしかログインさせないとか、パスワード以外のセキュリティ対策の王道みたいなものがあります。此処から先はもう専門家の領域です。(と逃げる)
macOS の場合、パスワードのポリシーをキッチリ定義できる機能は見当たりませんでした。どうも Apple としては iPhone を中心とした生体認証に志向しているような気がします。
パスワードなどの一括管理をするには Apple Business Manager (ABM) というオプションが必要なようです。つまり別なサービスです。 ABM は、Apple 製デバイスのアプリケーション管理など面白い機能が沢山あるようなので、興味があれば調べてみると良いでしょう。iPad なんかを注文取りに使っている飲食店なんかで使っているのかな?
mac の標準機能ではパスワードポリシーを定義できませんが、代わりにパスワードを自動生成してくれる方法があります。
システム設定 > ユーザとグループ > ユーザを選んで「パスワードリセット」をクリックして、「鍵ボタン」を選ぶとランダムなパスワードを生成してくれます。
確かにパスワードを考えてランダムな文字列を提供してくれるのは結構なのですが、それを覚えておくこの脳味噌がオーバーフローしそうです。ブラウザなどにキーチェーンで覚えさせる場合は、ここで得たランダムなパスワードをウェブサイトにコピー・ペーストすると良い、と言う事になります。
パスワードジェネレータ pwgen も使えます。homebrew を使って pwgen をインストールします。
% brew install pwgen==> Downloading https://formulae.brew.sh/api/formula.jws.json###############################################################################################: 以下略%% pwgen 12 4 -Byaik3oith}ox9 hie&t9yuF/oo um!eeLew3aim beet&oox7To%
macOS 用 CrackLib は Homebrew でインストールします。
% brew install cracklib
: 中略
% cracklib-check
abcdefg
abcdefg: 単純/系統的すぎます
john&pink
john&pink: OK
bluerose
bluerose: 辞書の単語に基づいています
brownCats
brownCats: 辞書の単語に基づいています
pansy%site
pansy%site: OK
^C
残念なことに、これらはすべて、パーソナルコンピュータの電源を投入したときの ID とパスワードのポリシーです。異なる複数のウェブサイトや異なる社内システムはそれぞれ別々のパスワードポリシー、認証システムを持っています。
そのそれぞれのシステム同士で、パスワードの使いまわし、ずさんなパスワードの運用に対処する方法ははないわけです。たとえ複数のサービスへの認証システムを統合できるキーチェーンがあったとしても、ユーザのパスワード管理はセキュリティインシデントの一番の弱点であることは変わりないでしょう。昔は ldap などのID基盤にシステムが対応しているかどうかが重要でしたが、最近はあまり耳にしません。近年「パスワードの定期変更を強制するのは意味がない」という傾向にあります。私もそうだろうなと考えます。しかし不適切なパスワードをつかっているユーザにパスワードを変更させるには、パスワードの強制変更のポリシーを適用するしか方法はないのですね。もっとも不適切なパスワードがどういったパスワードなのか。またパスワード使いまわしの危険性をどの様にユーザに指導すれば良いのか。その辺りをキチンと説明してトレーニングする事はもっと重要です。人間はズルするものです。危険なパスワードを使う習慣がある人は必ず厳しいポリシーに反したパスワード運用をしてしまうのです。また、「こういうパスーワードはいいパスワード」という解説もよく見ますが、こういった事例は、パスワードクラッキングリストに入ってしまうんじゃないかと危惧するのは私だけでしょうか。昔どういったパスワードが良いパスワードなのかという事を随分考えたことがありましたが、今そんな「従来の良いパスワードの事例」がすっかりパスワードクラッキングリストに入ってしまっています。やっぱり「良いパスワード」は時代とともに変わってしまうという事も考えてみてほしいですね
ITにおける標準化策定:機能のクラス分け
忘れたパスワードをブラウザの履歴で確認、そして履歴を削除
大病院で起きた大規模サイバーテロ:閉塞網が作る慢心が産んだ惨事
そのままじゃ危険だらけ:リモートデスクトップの安全対策
今すぐできる Windows リモートデスクトップの脆弱対策:医療機関でのランサムウェア被害からの反省で私達が学ぶもの