Unix上で利用できるパスワード生成コマンドmkpasswdの使い方を紹介

2023-03-27Bash

はじめに

過去に Bash シェルスクリプトでランダムな文字列を作成する方法 について投稿しましたが、
もし Linux のパッケージマネージャでツールをインストールできる環境であれば、 mkpasswd を使うのがより柔軟かつかんたんです。

ランダムな文字列の生成だけでなく、パスワード生成ももちろん可能なコマンドです。

( コマンド名からわかるように、本来はパスワード生成を目的としたものですよね。 )

検証環境

$ uname -moi
x86_64 x86_64 GNU/Linux

$ head -n 2 /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"

$ bash -version | head -n 1
GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu)

mkpasswd コマンドとは?

mkpasswd コマンドは、パスワードを生成するためのコマンドです。

デフォルトでは 9 文字のランダムなパスワード が生成されますが、
オプションを指定することで生成されるパスワードの長さや文字種などを調整できます。

インストール

RedHat 系の OS の場合、 YUM を使って expect というパッケージをインストールします。

$ yum install expect -y

インストールされたかを確認してみます。

$ type mkpasswd
mkpasswd is hashed (/usr/bin/mkpasswd)

ちなみに、ヘルプを表示しようとすると、いきなり謎の文言が表示されます。

$ mkpasswd --help
Zy$6aO2nb

--help オプションは利用できないようですね。

僕の MacPC でも利用できましたが、 Homebrew で色々インストールしているため、どのパッケージでインストールされたのかわからず。。。
デフォルトでは MacPC では利用できないと思います。

mkpasswd コマンドの使い方

パスワードを生成する(デフォルト)

オプション無しで mkpasswd コマンドを実行すると、 9 文字 のパスワードが生成されます。

$ mkpasswd
3hc5LnkM*

# 実行するたびに変わります
$ mkpasswd
<gP7fZok6

# 何文字のパスワードが生成されたかを `wc` コマンドで確認してみます。(`tr` で改行を除去)
$ mkpasswd | tr -d "\n" | wc -c
9

-l : パスワードの長さを変更する

mkpasswd コマンドで生成されるパスワード長は 9 文字でしたが、 -l オプションを指定することで任意の長さに変更できます。

$ mkpasswd -l 15
sgbO9sXdr1>ackt

# 実行するたびに変わります
$ mkpasswd -l 15
"dcdlguaHvv5qT3

# 何文字のパスワードが生成されたかを `wc` コマンドで確認してみます。(`tr` で改行を除去)
$ mkpasswd -l 15 | tr -d "\n" | wc -c
15

-d : パスワードに最低何文字の数値を含むようにするかを指定

デフォルトでは、 最低 2 文字の数字 が含まれます。
数字の最低登場数を更に増やしたい場合には -d オプションをしています。

# trで数字だけを出力させてみると、2文字含まれているのがわかる
$ mkpasswd | tr -dc "[:digit:]"
71

# trで数字だけを出力させてみると、2文字含まれているのがわかる
$ mkpasswd | tr -dc "[:digit:]"
91

# -d オプションを指定して、数字が最低4文字含まれるようにする
$ mkpasswd -d 4
x2017d[IG

# -d オプションを指定して、数字が最低4文字含まれるようにする
$ mkpasswd -d 4
$65Ia18aJ

# 数字だけを出力させてみる
$ mkpasswd -d 4 | tr -dc "[:digit:]"
1649

想定通り、含まれる数字の数が変化しました。

-c : パスワードに最低何文字のアルファベット小文字を含むようにするかを指定

デフォルトでは、 最低 2 文字のアルファベット小文字 が含まれます。

「最低」 なので、デフォルト挙動では 2 文字以上含まれています。

# trでアルファベット小文字だけを出力させてみると、2文字含まれているのがわかる
$ mkpasswd | tr -dc "[a-z]"
vpbx

# trでアルファベット小文字だけを出力させてみると、2文字含まれているのがわかる
$ mkpasswd | tr -dc "[a-z]"
ff]ex

# -c オプションを指定して、数字が最低6文字含まれるようにしてみると、
# 9文字のパスワードでは他のルールと競合して生成できないと言われてしまう
$ mkpasswd -c 6
impossible to generate 9-character password with 2 numbers, 6 lowercase letters, 2 uppercase letters and 1 special characters.

# 11文字のパスワードにするように `-l` オプションもセットで付与する
$ mkpasswd -c 6 -l 11
jRf2reKf"r6

$ mkpasswd -c 6 -l 11
j2cyNG8s#qm

# アルファベット小文字だけを出力させてみる
$ mkpasswd -c 6 -l 11 | tr -dc "[a-z]"
jqatku

-C : パスワードに最低何文字のアルファベット大文字を含むようにするかを指定

デフォルトでは、 最低 2 文字のアルファベット大文字 が含まれます。

$ mkpasswd -C 6 -l 11
ER%1YJ9HggD

$ mkpasswd -C 6 -l 11
5TRA*mU3OKm

# アルファベット大文字だけを出力させてみる
$ mkpasswd -C 6 -l 11 | tr -dc "[A-Z]"
QZKZDZ

-s : パスワードに最低何文字の特殊文字を含むようにするかを指定

デフォルトでは、 最低 1 文字の特殊文字(数字、アルファベット以外) が含まれます。

# 生成されたパスワードからアルファベット、数字を除去してみると、特殊文字が1文字だけであることがわかる
$ mkpasswd | tr -d "[0-9a-zA-Z\n]"
+

$ mkpasswd | tr -d "[0-9a-zA-Z\n]"
{

# 特殊文字だけを出力させてみる
$ mkpasswd -s 2 | tr -d "[0-9a-zA-Z\n]"
QZKZDZ

# 特殊文字を2文字含むようにする
$ mkpasswd -s 2
6bb5D_-Wn

# 特殊文字を2文字含むようにする
$ mkpasswd -s 2
h)8wJ1'Bt

# 生成されたパスワードからアルファベット、数字を除去してみると、特殊文字が2文字だけであることがわかる
$ mkpasswd -s 2 | tr -d "[0-9a-zA-Z\n]"
*-

$ mkpasswd -s 2 | tr -d "[0-9a-zA-Z\n]"
<*

-2 : できるだけ右手と左手のキータッチが交互に行われるパスワードを生成

タイプしているところを見られていたとしても解読されにくくなるように、
できる限り右手と左手のキータッチが交互に行われるパスワードを生成します。

できる限り ということで、必ず交互になるわけではないようです。

# L > R > R > R > L > R > L > R > L
$ mkpasswd -2
47@PsirkR

# R > R >  L > R >  L > R > R > R > R
$ mkpasswd -2
@mq7wm6ND

# R > R > R >  L > R >  L > R >  L > R
$ mkpasswd -2
\6UshZhz0

Unix 上のユーザにランダムなパスワードを設定する

mkpasswd に引数を渡すと、引数で指定されたユーザのパスワードをランダムなもので再設定します。

$ useradd genzouw

$ mkpasswd genzouw
Cw]6mh5Xf

# 試しにログインしてみる
$ su genzouw
Password:

# 新しいパスワードでログイン成功
[genzouw@5dc7f0438eed ~]$

その他 : ランダムな文字列を生成してみる

含まれる文字種を限定して、ランダムな文字列を生成してみましょう。

# 数字のみ
$ mkpasswd -c 0 -C 0 -s 0 -d 9
292202143

# アルファベットのみ
$ mkpasswd -s 0 -d 0
bqbpBvnPs

# アルファベット大文字のみ
$ mkpasswd -c 0 -C 9 -s 0 -d 0
KCHJWUUKF

# アルファベット小文字のみ
$ mkpasswd -c 9 -C 0 -s 0 -d 0
bznvrfopv

# 特殊文字のみ
$ mkpasswd -c 0 -C 0 -s 9 -d 0
'|=^<~'\-

# 英数字のみ
$ mkpasswd -s 0
nxuz4Nm8T

mkpasswd をインストールしなければならないことを考えると、Bash シェルスクリプトでランダムな文字列を作成する方法 で十分な気はします。

ひとこと

アカウント発行時のランダムなパスワード生成処理に利用できますね。
下手なロジックを自分で組むより遥かに良いでしょう。

2023-03-27Bash