メモ:シェルスクリプトでパスワードを設定するにはchpasswdが使えるかも

ふつうにadduserでやると、いろいろ聞かれるのでスクリプト中では使いづらい。

# adduser test
Adding user `test' ...
Adding new group `test' (1000) ...
Adding new user `test' (1000) with group `test' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for test
Enter the new value, or press ENTER for the default
        Full Name []:
        Room Number []:
        Work Phone []:
        Home Phone []:
        Other []:
Is the information correct? [Y/n]

これは、2つのオプションを使うことで回避できる。パスワードは--disabled-password--disabled-loginをつけると聞かれなくなる。住所とかを聞いてくるのは--gecos ""を指定するといい。

# adduser --disabled-password --gecos "" test
Adding user `test' ...
Adding new group `test' (1000) ...
Adding new user `test' (1000) with group `test' ...
The home directory `/home/test' already exists.  Not copying from `/etc/skel'.

ただし、これだとパスワードでログインはできない。別途パスワードを設定する必要がある。という時に使えるのがchpasswdで、こんな感じでユーザ名:パスワードを渡すと使える。

# printf 'test:password123' | chpasswd

でもこれだとパスワードが丸見えなのでよろしくない。ので、--encryptedというオプションを指定する。これは、パスワードそのものではなくてパスワードハッシュを渡すオプション。

パスワードハッシュは/etc/shadowに入っているやつで、例えば上で設定したpassword123は以下のようになっている。

# grep test /etc/shadow
test:$6$.mmXVfRt$m5U1uip5K4R0oS/DRvaG22UwfInAAwjCJEF2uhaYJXtiu/p7braVYGuTyBS3qF.2KmYTo6vqMHjfNXdJNWfw0.:17047:0:99999:7:::

このパスワードの形式はcrypt(3)に書かれている

              $id$salt$encrypted

       then instead of using the DES machine, id identifies the encryption
       method used and this then determines how the rest of the password
       string is interpreted.  The following values of id are supported:

              ID  | Method
              ─────────────────────────────────────────────────────────
              1   | MD5
              2a  | Blowfish (not in mainline glibc; added in some
                  | Linux distributions)
              5   | SHA-256 (since glibc 2.7)
              6   | SHA-512 (since glibc 2.7)

(http://man7.org/linux/man-pages/man3/crypt.3.html)

つまり、

$6$.mmXVfRt$m5U1uip5K4R0oS/DRvaG22UwfInAAwjCJEF2uhaYJXtiu/p7braVYGuTyBS3qF.2KmYTo6vqMHjfNXdJNWfw0.

は、$で区切った3つの部分に分かれていて、

$6$.mmXVfRt$m5U1uip5K4R0oS/DRvaG22UwfInAAwjCJEF2uhaYJXtiu/p7braVYGuTyBS3qF.2KmYTo6vqMHjfNXdJNWfw0.
 - -------- --------------------------------------------------------------------------------------
ID   salt                                 encrypted password

ということらしい。これを手動で生成するにはmkpasswdというコマンドを使う。よくわからないけどUbuntu 16.04だとwhoisパッケージに入ってました。--methodで暗号化方式を選択して、--saltでsaltを指定する。

# apt install whois
(略)
# mkpasswd --method=SHA-512 --salt='.mmXVfRt' password123
$6$.mmXVfRt$m5U1uip5K4R0oS/DRvaG22UwfInAAwjCJEF2uhaYJXtiu/p7braVYGuTyBS3qF.2KmYTo6vqMHjfNXdJNWfw0.

で、これをchpasswd --encryptedに渡せばいい。

printf 'test:$6$.mmXVfRt$m5U1uip5K4R0oS/DRvaG22UwfInAAwjCJEF2uhaYJXtiu/p7braVYGuTyBS3qF.2KmYTo6vqMHjfNXdJNWfw0.' | chpasswd --encrypted

まあSHA512とはいえsalt付きのハッシュなので、さすがにこれを公開の場所に置くのはちょっとなーという感じもあって実際使えるのかは微妙なんですが、とりあえず調べたことは書き残しとこうと思って書いた系の記事です。たぶんパスワードに頼らないのが正解。