Bashシェルスクリプトで非インタラクティブにパスワードを設定する
はじめに
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 であることは全くわからないので、機密性のあるドキュメントなどに残しておく必要があります。
ひとこと
暗号化パスワードを記述してユーザを登録するという仕組みは Kubernetes や Ansible 、 Terraform などのオーケストレーションツールでも利用されている方法なので、覚えておくといいでしょう。
ディスカッション
コメント一覧
まだ、コメントがありません