概要
- Ansible等のプロビジョニングツールでLinuxのユーザの作成を行う際に、強固なパスワードとそのハッシュ値が必要になることがある
- 以下にmacOS Venturaでパスワードとハッシュ値の生成を行う手順をまとめた
パスワードの生成
# パスワードジェネレータのインストール
$ brew install pwgen
# -c: 少なくとも1つの大文字を含める
# -n: 少なくとも1つの数字を含める
# -s: ランダム性の高いパスワードを生成する
# -B: 曖昧な文字列(例えば0とO)を含めない
# 16: 生成するパスワードの文字数
# 1: 生成するパスワードの数
$ pwgen -c -n -s -B 16 1
vhhH7AuEUjnbwsqr
# -y: 記号を含める
$ pwgen -c -n -s -y -B 16 1
bF('LFiJ3U%T)`>h
ハッシュ値の生成
- Linuxでは、MCF(Modular Crypt Format)という形式でパスワードが保存されている
- MCFは
$ident$salt$hashed
の形式-
ident
: アルゴリズムの識別子。1
はMD5、5
はSHA-256、6
SHA-512を表す -
salt
: 生成されたランダムなソルト -
hashed
: ソルトとパスワードを組み合わせてハッシュ化されたパスワード
-
- 今回はこの形式でSHA-512のハッシュ値を生成する方法についてまとめる
# パスワードの生成
$ pwgen -c -n -s -B 16 1
HNogpasjJ7YPhU3N
# ソルトの生成
$ pwgen -c -n -s -B 8 1
wmi3rAXY
# macOSにデフォルトでインストールされているのはOpenSSLからフォークされて開発されているLibreSSL
$ openssl version
LibreSSL 3.3.6
# -6 オプション、つまりSHA-512でハッシュ化するオプションが用意されていないことが分かる
# バージョンが古いからなのか、OpenSSLとはオプションが違うからなのかは調査していない
$ openssl passwd -6 -salt=wmi3rAXY HNogpasjJ7YPhU3N
unknown option '-6'
usage: passwd [-1 | -apr1 | -crypt] [-in file] [-noverify] [-quiet]
[-reverse] [-salt string] [-stdin] [-table] [password]
-1 Use MD5 based BSD password algorithm 1
-apr1 Use apr1 algorithm (Apache variant of BSD algorithm)
-crypt Use crypt algorithm (default)
-in file Read passwords from specified file
-noverify Do not verify password
-quiet Do not output warnings
-reverse Reverse table columns (requires -table)
-salt string Use specified salt
-stdin Read passwords from stdin
-table Output cleartext and hashed passwords (tab separated)
# 参照先の確認
$ which openssl
/usr/bin/openssl
# HomebrewでOpenSSLをインストール
$ brew install openssl
# opensslコマンドの実行時にHomebrewでインストールしたOpenSSLを参照するようにする
# 設定を永続化したい場合はシェルの設定ファイルに記述する(~/.zshrc等)
$ export PATH=/usr/local/opt/openssl@3/bin:$PATH
# LibreSSLからOpenSSLに変更された
$ openssl version
OpenSSL 3.1.0 14 Mar 2023 (Library: OpenSSL 3.1.0 14 Mar 2023)
# 参照先もHomebrewでインストールしたOpenSSLに変更されている
$ which openssl
/usr/local/opt/openssl@3/bin/openssl
# MCFのSHA-512のハッシュ値が生成できた
$ openssl passwd -6 -salt=wmi3rAXY HNogpasjJ7YPhU3N
$6$wmi3rAXY$tnfg9MoWyFM0epIaatCQMmFxTksnkXVU7Ep3fmRnrTuBcU3Sm9eq5cuiKpGECjvdhfVblWR7TU.FsnbCvW3tc.