Armadilloフォーラム

パスワードなしのユーザーがBase OSアップデート後、/etc/shadowから消えてしまう

nshmr

2024年9月30日 17時24分

別スレッド https://armadillo.atmark-techno.com/forum/armadillo/22549 の検証をしていて気が付きました。

Base OS version:3.19.1-at.1 上で、
Base OSアップデート前に、パスワードなしのユーザー"setup"を

armadillo:~# useradd setup -p ''
armadillo:~# chage -d 0 setup
armadillo:~# cd /home
armadillo:/home# mkdir setup
armadillo:/home# chown setup:setup setup
armadillo:/home# chmod 2755 setup

のように初回ログイン時にパスワード設定を強制するように作成した状態で、
Base OS 3.20.3-at.3 に、Base OSだけをアップデートするための以下のdescファイル

swdesc_option component=base_os
 
# Allow user setup's password is empty
swdesc_option ALLOW_EMPTY_LOGIN
 
# Change version string as same as Base OS image version
swdesc_option version=3.20.3-at.3
 
# Change Base OS archive file name
swdesc_tar --preserve-attributes --base-os baseos-x2-3.20.3-at.3.tar.zst

で、作成したswuファイルを使ってアップデートすると、
/etc/shadow上から ユーザー"setup"の行が消えてしまい、初回ログインができなくなってしまいました。
# /etc/passwd上の"setup"行や/home/setupなどは残っています。

アップデート前に、ユーザー"setup"のパスワード設定を行った場合は、アップデート後も残ります。
パスワード未設定状態でも、アップデート後に、/etc/shadowから消えないようにする方法はないでしょうか?

(補足)
/etc/swupdate_persist_fileに、persist_file -p /etc/shadow で追加してみたり、
descファイルに、swdesc_option ALLOW_EMPTY_LOGIN 行を追加してみたりは試してみましたが、状況は変わりませんでした。

この機能は、生産後に在庫のアップデートを行う(初期イメージを書いた後に、出荷前に最新版に更新する)ために必要になると考えています。

コメント

at_dominique.m…

2024年9月30日 21時07分

nshmrさん

マルティネです。

> /etc/shadow上から ユーザー"setup"の行が消えてしまい、初回ログインができなくなってしまいました。

やはり、エラーしない理由としてこの問題がありましたね。

こちらでも確認できました。パスワードがまだ設定されてないユーザーの場合はアップデート内の「Base OS」側のユーザーを残したくあえてスキップしていましたが、Base OS に存在しない場合に間違って消えてしまっていました。

まだレビュー中ですが、github の「test」ブランチに修正を出してみました:
https://github.com/atmark-techno/mkswu/tree/test

以下の様に使ってみてください

# リポ取得
atmark@atde9:~$ git clone -b test https://github.com/atmark-techno/mkswu mkswu-repo
Cloning into 'mkswu-repo'...
[省略]
 
# 日本語のメッセージ生成。英語のままでよろしければ不要です。
atmark@atde9:~$ make -C mkswu-repo/
make: Entering directory '/home/atmark/mkswu-repo'
[省略]
msgfmt -o locale/ja/LC_MESSAGES/mkswu.mo po/ja/mkswu.po
make: Leaving directory '/home/atmark/mkswu-repo'
 
# クローンしたディレクトリから直接に実行する
atmark@atde9:~$ ./mkswu-repo/mkswu path/to/base_os.desc
path/to/base_os.swu を作成しました。

このブランチでしたら
* パスワードが設定されてないユーザーでも保存されます
* パスワードが設定されなくても、expiry されている(chage -d 0 または passwd -e で次のログインにパスワードー変更を要求する)場合にエラーしません(ALLOW_EMPTY_LOGINは基本的に不要になる)

> /etc/swupdate_persist_fileに、persist_file -p /etc/shadow で追加してみたり、

/etc/shadow (または passwd, group) の処理は複雑で、swupdate_preserve_files に設定されても影響ありません。
POST (persist_file -P) で設定された場合は一時的に動くかもしれませんがアップデートで別の理由で動かなくなる恐れがありますので、swupdate_preserve_files のリストからそれらのファイルを外した方がいいと思います。

> この機能は、生産後に在庫のアップデートを行う(初期イメージを書いた後に、出荷前に最新版に更新する)ために必要になると考えています。

はい、base os のイメージに手を加えてそちらにもユーザーを追加すれば消えませんがこのまま修正できたと思いますので、今のテストブランチで問題なければそのまま10月のリリースに加えます。

よろしくお願いします。

マルティネさん
ありがとうございます。

> /etc/shadow (または passwd, group) の処理は複雑で、swupdate_preserve_files に設定されても影響ありません。
> POST (persist_file -P) で設定された場合は一時的に動くかもしれませんがアップデートで別の理由で動かなくなる恐れがありますので、swupdate_preserve_files のリストからそれらのファイルを外した方がいいと思います。

アップデート前のイメージで、swupdate_preserve_filesから/etc/shadowは削除しました。

その上で、
・mkswu-repo / mkswu-repo(make後)
・base osのみのアップデート / boot-loader + コンテナのアップデート / base OS + boot-loader + コンテナのアップデート
・descファイルに”swdesc_option ALLOW_EMPTY_LOGIN”あり / なし
の組み合わせ 12種類のswuファイルでのアップデートを試してみました。

いづれのswuファイルでも、アップデートは実行され、アップデート後、/etc/shadowから、パスワードなし次回パスワード設定のアカウントが残っていることが確認できました。

ALLOW_EMPTY_LOGINのあり/なしで、差がないことが確認できましたので、今後は、ALLOW_EMPTY_LOGIN なしですすめようと思います。