メインコンテンツへスキップ
  1. ブログ/

【openssl・urandom】Linuxコマンドでランダムパスワードを生成する方法|AlmaLinux10対応

·
AlmaLinux セキュリティ Bash プログラム
目次

【openssl・urandom】Linuxコマンドでランダムパスワードを生成する方法|AlmaLinux10対応
【openssl・urandom】Linuxコマンドでランダムパスワードを生成する方法|AlmaLinux10対応

初めに
#

パスワードは、システムを利用するうえで多くの場面において必要となります。

例えば、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、あるいはスクリプトによる方法を使い分けることで、安全かつ効率的なパスワード生成が可能となります。

ぜひ活用してみてください。

関連記事

【簡単】AlmaLinux 10 に mod_security + OWASP CRS を導入し無料WAFを構築する方法
AlmaLinux セキュリティ Apache Mod_security WAF OWASP CRS
【簡単・実例付き】WPScanでWordPress脆弱性診断を行う方法|AlmaLinux 10
AlmaLinux セキュリティ WordPress
【超入門】AlmaLinux 10でChrootによるSSHユーザー隔離環境を構築する方法
セキュリティ Linux AlmaLinux Chroot
【入門】AlmaLinux 9でClamAVを導入し、定期スキャンを自動設定する方法
セキュリティ AlmaLinux ClamAV
AlmaLinuxのSSHにGoogle Authenticatorで二段階認証(TOTP)を導入する方法
SSH セキュリティ AlmaLinux 二要素認証
【初心者向け】RPMのChangelogからセキュリティ修正を確認する方法
Linux RPM セキュリティ AlmaLinux