Bashシェルスクリプトで非インタラクティブにパスワードを設定する

2023-03-27Bash

はじめに

Unix 上で ユーザを作成する場合は useradd コマンドユーザを変更する場合は usermod コマンド を利用します。

( adduser の利用を推奨するような記載を多くの Web ページで拝見しますので、そちらのほうが良いのかもしれません。 moduser コマンドは有りません。)

アプリケーションのデーモンプロセスで利用されるようなユーザはパスワードは不要ですが、オペレーションユーザの場合には パスワードが必要 となります。

パスワードは chpasswd コマンドを使って変更できますが、このコマンドを利用するとインタラクティブな操作を要求されるためスクリプトが組みにくいという問題があります。

どうやってパスワードを設定したら良いでしょう?

検証環境

$ 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)

useradd / usermod コマンドの --password オプションを利用する

useradd コマンド、 usermod コマンドのヘルプを引くと使えそうなオプションがすぐに見つかります。

$ useradd --help
Usage: useradd [options] LOGIN
       useradd -D
       useradd -D [options]

Options:
  ...
  -p, --password PASSWORD       encrypted password of the new account
  ...
$ usermod --help
Usage: usermod [options] LOGIN

Options:
  ...
  -p, --password PASSWORD       use encrypted password for the new password
  ...

いずれのコマンドにもズバリのオプションが見つかりました。
--password オプションを利用してインタラクティブにパスワードを設定できます。

useradd コマンドの --password オプションを利用する際の注意

ただし、注意点があります。
注意点については実際に使ってみてからお話しましょう。

それではパスワード付きでユーザを作成してみます。
ユーザは genzouw 、パスワードは test にしてみます。

# パスワード付きユーザを作成
$ useradd genzouw --password test

作成できたので、ユーザにスイッチしてみます。

# 適当なユーザ( ここでは hoge )からスイッチしてみる
[hoge@d6106253d792 ~]$ su - genzouw
Password:
su: Authentication failure

ユーザのパスワードが不正とのことでした。
先程のヘルプの説明をよく見ると記載されていますが、パスワードの文字列は暗号化された状態で指定する必要があります。
平分でコマンドをスクリプト内に記述するわけにいきませんからね(^_^;)

...
  -p, --password PASSWORD       use encrypted password for the new password
...

平文パスワード文字列から暗号化パスワード文字列を生成する

暗号化済みのパスワード文字列を生成するには、 perl のスクリプトを実行する方法がありますが、
ここでは openssl コマンドを利用した方法について取り上げます。

先程も述べたとおり、パスワードは test にしたいと思っています。
以下のコマンドを実行します。

$ openssl passwd "test"

ちなみに openssl コマンドが無い、というエラーが発生した場合はインストールしてやります。
今回は CentOS だったので、 yum でインストールしました。

# コマンドが見つからない模様
$ openssl passwd "test"
-bash: openssl: command not found

# yumでインストールする。aptやapkなどそれぞれのディストリビューションのパッケージ管理ツールを選択してください。
# rootユーザで実行するか、sudoを付与する日宇ようがある点に注意!
$ yum install openssl -y

うまく行けは以下のように謎の文字列が表示されます。

$ openssl passwd "test"
6b45Zv3qBLBrQ

これをメモしておきます。

usermod コマンドの --password オプションも使ってみる

すでに genzouw ユーザを作成してしまっているため、 usermod コマンドを使ってパスワードを変更してみます。

$ usermod genzouw --password "6b45Zv3qBLBrQ"

それでは再度、 genzouw ユーザにスイッチできるか試してみます。

# 適当なユーザ( ここでは hoge )からスイッチしてみる
[hoge@d6106253d792 ~]$ su - genzouw
Password:
Last login: Fri Jun 25 11:49:55 UTC 2021 on pts/0
[genzouw@d6106253d792 ~]$

正しく、 test というパスワードでログインできました!

シェルスクリプトにはどう記述したら良いの?

先程実行したコマンドのをそのまま記述しておけば OK です。

$ usermod genzouw --password "6b45Zv3qBLBrQ"

もちろん、上記のコマンドからは正しいパスワードが test であることは全くわからないので、機密性のあるドキュメントなどに残しておく必要があります。

ひとこと

暗号化パスワードを記述してユーザを登録するという仕組みは KubernetesAnsibleTerraform などのオーケストレーションツールでも利用されている方法なので、覚えておくといいでしょう。

2023-03-27Bash