Linux の /etc/shadow のsha512形式の暗号化パスワードを生成するのに OpenSSL を利用したメモです.
最近は SHA512 が規定値になっている
$ grep ^ENCRYPT_METHOD /etc/login.defs ENCRYPT_METHOD SHA512
openssl passwd は 1.1.1 から sha512 がサポートされている
*) 'openssl passwd' can now produce SHA256 and SHA512 based output,
-6 オプションが SHA512
$ openssl version OpenSSL 1.1.1a 20 Nov 2018 (Library: OpenSSL 1.1.1b 26 Feb 2019) $ openssl passwd --help Usage: passwd [options] Valid options are: -help Display this summary -in infile Read passwords from file -noverify Never verify when reading password from terminal -quiet No warnings -table Format output as table -reverse Switch table columns -salt val Use provided salt -stdin Read passwords from stdin -6 SHA512-based password algorithm -5 SHA256-based password algorithm -apr1 MD5-based password algorithm, Apache variant -1 MD5-based password algorithm -aixmd5 AIX MD5-based password algorithm -crypt Standard Unix password algorithm (default) -rand val Load the file(s) into the random number generator -writerand outfile Write random data to the specified file
こんな感じで作れる
$ が区切り文字になっていて, 6 部分が暗号形式のid,SALT 部分がsalt,その後ろが暗号化パスワードになっている
$ openssl passwd -salt SALT -6 PASSWORD $6$SALT$io0TPmhM8ythCm7Idt0AfYvTuFCLyA1CMVmeT3EUqarf2NQcTuLKEgP9.4Q8fgClzP7OCnyOY1wo1xDw0jtyH1
この文字列を, /etc/shadow の第2フィールドに埋め込むとlogin に利用できる
SALT もランダムにしたい場合は,
/dev/random や
$ tr -cd '[:alnum:]' < /dev/random | head -c 8 ouOpUJoq
openssl rand が使える
$ openssl rand --help Usage: rand [flags] num Valid options are: -help Display this summary -out outfile Output file -rand val Load the file(s) into the random number generator -writerand outfile Write random data to the specified file -base64 Base64 encode output -hex Hex encode output -engine val Use engine, possibly a hardware device $ openssl rand -base64 6 Gy/YhLzM
salt 8 文字で sha512 なパスワードを作成
$ openssl passwd -6 -salt $(openssl rand -base64 6) PASSWORD $6$O2bwYkq/$QIIeAsVueV3vfGZqK/obGMevpB3DwRb/wq2uqn3ykdst1hEV3.72cGPu3gX0p3mD5KPWNrK0M6OPdElDPGD000
実際に /etc/shadow に設定して認証を試してみる
$ sudo useradd testuser $ sudo sed -i 's,^testuser:[^:]*,testuser:$6$O2bwYkq/$QIIeAsVueV3vfGZqK/obGMevpB3DwRb/wq2uqn3ykdst1hEV3.72cGPu3gX0p3mD5KPWNrK0M6OPdElDPGD000,' /etc/shadow $ sudo grep ^testuser: /etc/shadow testuser:$6$O2bwYkq/$QIIeAsVueV3vfGZqK/obGMevpB3DwRb/wq2uqn3ykdst1hEV3.72cGPu3gX0p3mD5KPWNrK0M6OPdElDPGD000:17970:0:99999:7::: $ su testuser Password: $ whoami testuser $
openssl のバージョンが古くてSHA512に対応していない場合は適当なscriptで生成できる
salt を同じものにして試すと同じ文字列が得られるのが確認できる
$ perl -e 'print crypt("PASSWORD", ( "\$6\$" . "O2bwYkq/" ));' $6$O2bwYkq/$QIIeAsVueV3vfGZqK/obGMevpB3DwRb/wq2uqn3ykdst1hEV3.72cGPu3gX0p3mD5KPWNrK0M6OPdElDPGD000 $ python -c "import crypt, getpass, pwd; print crypt.crypt('PASSWORD','\$6\$O2bwYkq/\$')" $6$O2bwYkq/$QIIeAsVueV3vfGZqK/obGMevpB3DwRb/wq2uqn3ykdst1hEV3.72cGPu3gX0p3mD5KPWNrK0M6OPdElDPGD000
環境
$ dpkg-query -W openssl login login 1:4.5-1.1 openssl 1.1.1a-1 $ lsb_release -dr Description: Debian GNU/Linux buster/sid Release: testing $ uname -m aarch64
参考URL