完全に備忘録ですが、パスワードを自動生成するコマンド&スクリプトを紹介します。
- mkpasswdを利用した方法(コマンド)
- ランダム文字列を利用して生成する方法(スクリプト)
のふたつを記載しています。
単純にパスワードを作成したければ mkpasswd コマンドを利用すれば手っ取り早いと思いますが、今回はパスワードに使用する文字を指定したかった(文字種や文字数ではなく)という理由があったため、ランダム文字列(乱数)から生成するスクリプトを作成しました。
mkpasswdコマンドを利用したパスワード生成
mkpasswdでオプション指定できる内容はあくまで「文字種ごとの文字数」なので、特定の文字を指定してパスワードを生成することはできないようです。例えば、視認性の悪い以下のような文字列を含めたくないというような細かい希望は叶いません。
- 0(数字のゼロ)
- 1(数字のイチ)
- o,O(アルファベットのオー)
- l(アルファベット小文字のエル)
これらを踏まえたうえで、以下が mkpasswd の使い方になります。
オプション | 内容 |
-l | パスワードの長さ |
-d | 数字の最低個数 |
-c | アルファベット小文字の最低個数 |
-C | アルファベット大文字の最低個数 |
-s | 特殊文字(記号文字)の最低個数 |
mkpasswd コマンドは expect というパッケージに含まれているのでyumでインストールします。
1 |
# yum -y install expect |
以下のルールで生成します。
パスワードの長さ | 16文字 |
数字の個数 | 4個 |
アルファベット小文字の個数 | 4個 |
アルファベット大文字の個数 | 4個 |
特殊文字(記号文字)の個数 | 4個 |
expectパッケージをインストールできたら、mkpasswd コマンドを利用できます。
1 2 |
# mkpasswd -l 16 -d 4 -c 4 -C 4 -s 4 r'J76W+4}z3UY^gt |
指定した内容で生成されました。英数字や記号文字の長さの合計がパスワード長さ(16文字)に合うように指定しましたが、合わない場合はアルファベット小文字で補完されるようです。以下のルールで実行し、確認してみました。
パスワードの長さ | 16文字 |
数字の個数 | 2個 |
アルファベット小文字の個数 | 2個 |
アルファベット大文字の個数 | 2個 |
特殊文字(記号文字)の個数 | 2個 |
1 2 |
# mkpasswd -l 16 -d 2 -c 2 -C 2 -s 2 xvphD0ly>T8'ynvz |
ランダム文字列(乱数)を利用してパスワードを生成
この方法ならパスワードに使用する文字を細かく指定することができます。例えば、
- パスワードに含めたくない特殊文字(記号文字)がある
- 視認性の悪い文字や数字を含めたくない
などの場合に重宝します。
では、作り方の前に以下のパスワードルールで作成します。ルールはスクリプト内の指定で変更可能です。
- 文字列の桁数:16文字
- 数字を必ず含む
- アルファベット(大文字/小文字)を必ず含む
- 記号文字を必ず含む
- 最初と最後の文字は英数字とする(特に意味はないが気持ち悪いので)
補足
数字やアルファベットは、視認性の悪い文字は省いています。例えば、0,1,9(数字)やO,o(大文字小文字のオー)、l(小文字のエル)q(小文字のキュー)など。
記号は、"や[]などを使うと、grepの指定で面倒なことになりそうなのと、ほかの処理と組み合わせて使うときに意図しない動きに悩まされそうだったので外しています。
以下がパスワード生成スクリプトです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
#!/bin/sh ### パスワードルール(追加・変更するときはここを変更) # 使用するアルファベット Alphabet="abcdefghjkmnprstuvwxyzABCDEFGHJKLMNPRSTUVWXYZ" # 使用する数字 Numeric="2345678" # 使用する特殊文字(\はエスケープ) Symbol="\#\%\&\+\-\!" # 使用する文字列すべて/英数字のみの指定 Target="${Alphabet}${Numeric}${Symbol}" Al_Num="${Alphabet}${Numeric}" # パスワード文字数 Length=16 ### パスワード生成 cat /dev/urandom | \ # 指定した英数字、記号文字のみを取得(trコマンドの動きとしては「$Targetに含まれない文字すべてを削除」となる) tr --delete --complement "${Target}" | \ # 文字数を指定(foldコマンドの動きとしては「指定した幅で改行」となる) fold --width=${Length} | \ # 最初の文字を英数字 grep "^[${Al_Num}]" | \ # 最後の文字を英数字 grep "[${Al_Num}]$" | \ # 記号を2文字以上入れる(記号の間に1~10桁の英数字を入れる) grep "[${Symbol}][${Al_Num}]\{1,10\}[${Symbol}]" | \ # パスワード文字列を1個のみ表示 head -1 |
記号を2文字以上入れる指定の仕方がいまひとつな感じがしないでもないですが、これで複雑性をもたせたパスワードが生成できます。
まとめ
総務省からはパスワードの定期変更は不要とする発表もありました。最初に複雑性をもたせたパスワードを生成して不正ログインなどのリスクを排除しましょう。
↓↓↓ 持っていると便利な一冊 ↓↓↓