初めに #
パスワードは、システムを利用するうえで多くの場面において必要となります。
例えば、Linux 環境では、以下のような場面で認証用パスワードを新規に生成する必要があります。
- 新たにユーザーアカウントを作成する場合
- SSH 接続の認証情報を用意する場合
- データベースや Web サーバなど、各種ミドルウェアの初期設定を行う場合
- アプリケーションの管理者アカウントや API 用の認証情報を作成する場合
これらのパスワードを人手で考えて生成すると、使い回しや単純な文字列になりやすく、セキュリティ品質のばらつきやヒューマンエラーの原因となります。
よくある方法として、ランダムパスワードを生成できる外部の Web サイトを利用するケースがあります。
しかし、この方法は利便性が高い一方で、運用やセキュリティの観点からはいくつか注意点があります。
- 生成処理が第三者の管理する環境に依存するため、セキュリティポリシー上問題となる場合がある
- インターネット接続が前提となり、閉域環境やオフライン環境では利用できない
- コマンドやスクリプトと連携しづらく、運用の自動化に向かない
- 生成ルールや文字種の細かな制御が難しい場合がある
このように、外部サイトによるパスワード生成は一般的ではあるものの、業務利用やサーバ運用においては必ずしも最適とは限りません。
一方で、Linux 環境そのものに備わっているコマンドを利用すれば、外部サービスに依存せず、ローカル環境内で安全にパスワードを生成することができます。
本記事では、AlmaLinux 10 環境を利用し標準のコマンドにてランダムなパスワードを生成する方法をご紹介します。
OpenSSL コマンドで生成 #
もっとも有名な方法として、OpenSSL コマンドを利用してランダムパスワードを生成する方法があります。
OpenSSL コマンドは、多くの Linux ディストリビューションにおいて標準構成に含まれています。
そのため AlmaLinux 10 環境においても初期状態のまま利用することができます。
基本的な使い方は以下の通りとなっております。
openssl rand -<出力形式> <バイト数>
各指定項目の説明は以下の通りとなっております。
| 項目 | 説明 |
|---|---|
| 出力形式 | 生成される文字列の形式を指定。 主に -base64 や -hex が指定される。 |
| バイト数 | 生成する文字列の長さをバイト数で指定。 |
なお、ここで指定する「バイト数」は、生成される文字列の文字数を直接指定するものではありません。
実際に出力される文字数は指定する出力形式によって異なります。
例えば、Base64 形式で 15 バイト分のランダムパスワードを生成する場合は、以下のように実行します。
$ openssl rand -base64 15
rC8/gseVL2TmNXS2lkn8
今回は「rC8/gseVL2TmNXS2lkn8」が生成されました。
なお、コマンドにて生成される値は乱数を用いているため、実行するたびに出力される値が異なります。
再度実行すると、次のように別の値が生成されます。
$ openssl rand -base64 15
t4F+WlBMcdKLFXUP+qKZ
記号を含めたくない場合は、以下のように 16 進数形式で出力すると扱いやすくなります。
$ openssl rand -hex 15
df17c9ef3b9f847a4860eee1ab2a81
/dev/urandom と tr を利用して生成 #
/dev/urandom は、Linux が提供する乱数生成デバイスの一つとなります。
tr コマンドと併用することで、生成される文字種を制御しながらランダムなパスワードを生成することができます。
そのため、特定の文字をパスワードから除外したい場合などに適した方法となります。
基本的な使い方は以下の通りとなっております。
tr -dc '<使用する文字種>' < /dev/urandom | head -c <文字数>
例えば、大文字・小文字・記号を含めたランダムパスワードを生成する場合は、以下のように実行します。
$ tr -dc 'a-zA-Z!@#$%^&*' < /dev/urandom | head -c 15
HUrXrHbhi!v^wIc
この例では、英大文字・英小文字に加え、! @ # $ % ^ & * の記号を含む 15 文字のランダムなパスワードが生成されます。
先述した OpenSSL コマンドによる生成と異なり、生成される文字数を直接指定する事ができます。
また、使用する文字をあらかじめ指定したうえでパスワードを生成できるため、パスワードポリシーに合わせた複雑な調整が可能となっております。
以下は、代表的なパスワードポリシーの指定例となります。
要件に応じてこれらを組み合わせて指定してください。
| ポリシー例 | パスワードに含める文字 |
|---|---|
| 英小文字のみ | a-z |
| 英大文字のみ | A-Z |
| 数字のみ | 0-9 |
| 英小文字 + 英大文字 | a-zA-Z |
| 英小文字 + 英大文字 + 数字 | a-zA-Z0-9 |
| 英小文字 + 英大文字 + 数字 + 記号 | a-zA-Z0-9!@#$%^&* |
bashで実装する #
ここまで紹介した各種コマンドによる生成方法とは別に、シェルスクリプト(bash)内でパスワード生成処理を実装することも可能です。
この方法では、あらかじめ使用する文字を配列として定義し、その中からランダムに文字を選択することでパスワードを生成しています。
ただし、$RANDOM は疑似乱数であり、暗号学的に安全な乱数ではありません。
そのため、本番環境での利用は避け、検証用途や簡易的なスクリプトでの使用に留めてください。
以下は、英小文字・英大文字・数字を使用して 15 文字のランダムパスワードを生成する簡単な例となります。
#!/bin/bash
chars=(a b c d e f g h i j k l m n o p q r s t u v w x y z \
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z \
0 1 2 3 4 5 6 7 8 9)
length=15
password=""
for ((i=0; i<length; i++)); do
password+="${chars[RANDOM % ${#chars[@]}]}"
done
echo "$password"
例えば、上記スクリプトを generate_password.sh として保存し、実行権限を付与したうえで実行した場合は、次のようにランダムなパスワードが出力されます。
$ chmod +x generate_password.sh
$ ./generate_password.sh
KwElVK4ErsSqlf89
必要に応じて配列をカスタマイズすることで、パスワード生成に利用する文字を自由に調整することが可能です。
複数のパスワードを一括で生成する #
これまでの例では、単一のパスワードを生成していました。
しかし、複数のパスワードをまとめて用意する必要があるケースも考えられます。
そういった場合は、fold コマンドを併用することで、複数のパスワードを一括で生成することができます。
基本的な使い方は以下の通りとなっております。
tr -dc '<使用する文字種>' < /dev/urandom | fold -w <文字数> | head -n <出力する数>
例えば、英大文字・英小文字・数字・記号を使用して、15 文字のパスワードを 10 個生成する場合は、以下のように実行します。
$ tr -dc 'a-zA-Z0-9!@#$%^&*' < /dev/urandom | fold -w 15 | head -n 10
jIRcGauBi0*yxJW
X*AX&DHlqBbuaNx
HeB72U&ctU0AslB
0V%6swtxIdFj8&p
M!htJvcHBFStv!O
Y&ES86Ij9nV#*7O
F@Me1VM9h@8W782
CxVJEnf1!TJRo9d
ava&9hoQyC5#UAQ
T0W7@R9PgWF3fcK
このように、複数のパスワードを一括で生成することができます。
まとめ #
本記事では、AlmaLinux 10 環境において標準コマンドのみで「安全なランダムパスワードを生成する方法」を初心者向けに解説しました。
用途や要件に応じて、OpenSSL、/dev/urandom、あるいはスクリプトによる方法を使い分けることで、安全かつ効率的なパスワード生成が可能となります。
ぜひ活用してみてください。