Armadilloフォーラム

コンテナ内からのログインユーザ、パスワードの追加(ABOS)

k.sato

2023年9月15日 9時05分

佐藤と申します。
お世話になっております。

python_app.confに「add_volumes /etc:/etc」を追記したコンテナ内からログインユーザ、パスワードを追加したいです。
useradd test -p passwd」にて -p オプションでパスワードが設定できると思うのですが、
passwd = crypt.crypt(input_text, "$6$...")で暗号化したパスワードを -p オプションで指定して
cat /etc/shadow」で確認したとき「$」~「/」までが削除されています。

-p "$6$..."」として「"」でくくったり、
コンテナ内にbashで入ってから手動入力しても pythonから行ってもやはり抜けてしまっています。
何か抜けないような指定方法があれば教えていただけませんか?

また「passwd test」で設定できるのは確認したのですが、
実際はpythonで実行したいので対話式でない設定方法があれば教えていただけませんか?

以上、よろしくお願い致します。

コメント

at_dominique.m…

2023年9月15日 9時36分

佐藤さん、
お世話になっています。

マルティネです。

> python_app.confに「add_volumes /etc:/etc」を追記したコンテナ内からログインユーザ、パスワードを追加したいです。

Armadillo の /etc をコンテナにまるごとマウントすることは推奨できません。
試した分で動くように見えるかもしれませんが、Armadillo Base OS での /etc と debian の /etc は違う物です(インストールされているソフトウェアは違いますし、ユーザー情報だけでもコンテナと外のユーザーIDが異なりますのでファイルのオーナーがおかしくなります)

なので、やりたいことをもう少し説明していただけたら相談できます。
以前の問い合わせでコンソールでログインするとコンテナのコマンドを実行してメニューで色々設定できるようにしたかった記憶がありますので、コンテナのユーザーではなく、シリアルコンソールで使うユーザーのパスワードを変更できるようにしたいでしょうか?

よろしくお願いします

マルティネ様

佐藤です。

回答ありがとうございます。

> Armadillo の /etc をコンテナにまるごとマウントすることは推奨できません。
> 試した分で動くように見えるかもしれませんが、Armadillo Base OS での /etc と debian の /etc は違う物です(インストールされているソフトウェアは違いますし、ユーザー情報だけでもコンテナと外のユーザーIDが異なりますのでファイルのオーナーがおかしくなります)
そうでしたか。
LEDを点滅させるサンプルに「add_volumes /sys:/sys」とありましたのでそうできるのかと間違えていました。

> 以前の問い合わせでコンソールでログインするとコンテナのコマンドを実行してメニューで色々設定できるようにしたかった記憶がありますので、コンテナのユーザーではなく、シリアルコンソールで使うユーザーのパスワードを変更できるようにしたいでしょうか?
その通りです。

●特定のユーザでログインしたとき自作CLIツール起動(Base OS)
https://armadillo.atmark-techno.com/forum/armadillo/16736

上記で教えていただいたシリアルコンソールを使うユーザを変更したいです。

●Armadillo Base OSのコンテナからホストのネットワーク設定を変更できますか
https://armadillo.atmark-techno.com/forum/armadillo/15576
こちらの2.を参考にコンテナ内からsshにてホスト側の設定を変更することも試してみました。
こちらであれば「add_volumes /etc:/etc」の必要はありませんか?

以上、よろしくお願い致します。

at_dominique.m…

2023年9月15日 10時29分

佐藤さん、

マルティネです。

> LEDを点滅させるサンプルに「add_volumes /sys:/sys」とありましたのでそうできるのかと間違えていました。

ややっこしいですが、/sys は Armadillo Base OS や debian のディレクトリではなく、Linux カーネルの「仮想ディレクトリ」ですので、もともとコンテナイメージにないディレクトリです。
何もないところに /sys をマウントしているので問題になりませんが、コンテナのすでにある /etc の上で ABOS の /etc をマウントすると色々不具合につながります。

> ●特定のユーザでログインしたとき自作CLIツール起動(Base OS)
> https://armadillo.atmark-techno.com/forum/armadillo/16736
>
> 上記で教えていただいたシリアルコンソールを使うユーザを変更したいです。
>
> ●Armadillo Base OSのコンテナからホストのネットワーク設定を変更できますか
> https://armadillo.atmark-techno.com/forum/armadillo/15576
> こちらの2.を参考にコンテナ内からsshにてホスト側の設定を変更することも試してみました。
> こちらであれば「add_volumes /etc:/etc」の必要はありませんか?

了解しました。

それでしたら /etc をマウントする必要はないですね:
* 「特定のユーザでログインしたとき自作CLIツール起動(Base OS)」( https://armadillo.atmark-techno.com/forum/armadillo/16736 )では、ABOS 側のユーザーさえあれば問題ないので、コンテナのユーザーは関係ないですね。
コンテナ内で非root ユーザーでコマンドを実行したい場合はコンテナの Dockerfile でユーザーをパスワード無しで追加して、podman exec コマンドの引数に 「--user hogehoge」を設定してパスワードと関係なく使えます。
ABOS側のユーザーのパスワードさえあれば使えます。

* 「Armadillo Base OSのコンテナからホストのネットワーク設定を変更できますか」( https://armadillo.atmark-techno.com/forum/armadillo/15576 ) の ssh 設定が行っていたら、ネットワークと同じく ssh で ABOS側のユーザーパスワードを変更できます。
プログラムから変更を行うとのことですので、chpasswd コマンドを ssh 経由に使ってみてください。
永続化のため、chpasswd の後に 「persist_file /etc/shadow」も実行必要があります。

いかがでしょうか?

マルティネ様

佐藤です。

> コンテナ内で非root ユーザーでコマンドを実行したい場合はコンテナの Dockerfile でユーザーをパスワード無しで追加して、podman exec コマンドの引数に 「--user hogehoge」を設定してパスワードと関係なく使えます。
> ABOS側のユーザーのパスワードさえあれば使えます。
ゆくゆくはCLIメニューアプリを自動起動する非rootユーザで実行すると思います。
このCLIメニューは「/etc/doas.d/user.conf」の「permit nopass atmark as root cmd podman」から起動していますが、
Dockerfile の修正が必要になりますか?
ユーザの追加とは「RUN useradd -m -u 1000 atmark」この辺りを参考にするのでしょうか?

> * 「Armadillo Base OSのコンテナからホストのネットワーク設定を変更できますか」( https://armadillo.atmark-techno.com/forum/armadillo/15576 ) の ssh 設定が行っていたら、ネットワークと同じく ssh で ABOS側のユーザーパスワードを変更できます。
> プログラムから変更を行うとのことですので、chpasswd コマンドを ssh 経由に使ってみてください。
ホスト側で「echo testuser:testuser | chpasswd」する分にはパスワードが変更されるのですが、
今、Armadilloにrootでログインして「podman exec -it python_app bash」でコンテナに入り
chpasswdを実行したときにエラーとなります。

root@dfc308e19e4b:/# ssh -o StrictHostKeyChecking=no root@10.88.0.1 echo testuser:testuser | chpasswd
root@10.88.0.1's password:
chpasswd: (user testuser) pam_chauthtok() failed, error:
Authentication token manipulation error
chpasswd: (line 1, user testuser) password not changed

これは何がおかしいのでしょうか?

at_dominique.m…

2023年9月15日 14時41分

マルティネです。

> > コンテナ内で非root ユーザーでコマンドを実行したい場合はコンテナの Dockerfile でユーザーをパスワード無しで追加して、podman exec コマンドの引数に 「--user hogehoge」を設定してパスワードと関係なく使えます。
> > ABOS側のユーザーのパスワードさえあれば使えます。
>
> ゆくゆくはCLIメニューアプリを自動起動する非rootユーザで実行すると思います。
> このCLIメニューは「/etc/doas.d/user.conf」の「permit nopass atmark as root cmd podman」から起動していますが、
> Dockerfile の修正が必要になりますか?
> ユーザの追加とは「RUN useradd -m -u 1000 atmark」この辺りを参考にするのでしょうか?

一旦情報の整理をさせていただきます。

* ユーザーは、Armadillo ABOS側のユーザーとコンテナ側のユーザーがあります。
* シリアルでログインするときは、ABOS のユーザーを使います。
* doas は ABOS側で使いますので、その設定は ABOS側のユーザーに適用されます。
* コンテナのユーザーはそのやり方(podman exec)だとパスワードも使いません、実行時にユーザーを選ぶだけです。
コンテナでも root が一般ユーザーより権限が多いので一般的には非 root ユーザーを使うことがいいですが、ほとんどの場合は固定のユーザーで使われています。コンテナイメージを一度作ったらコンテナ内のユーザーの変更が難しいからです。
今回のイメージでは、atmark をそのまま使うか、Dockerfile の「useradd -m -u 1000 atmark」を変更して適切な名前を設定するだけでいいですね。

> > * 「Armadillo Base OSのコンテナからホストのネットワーク設定を変更できますか」( https://armadillo.atmark-techno.com/forum/armadillo/15576 ) の ssh 設定が行っていたら、ネットワークと同じく ssh で ABOS側のユーザーパスワードを変更できます。
> > プログラムから変更を行うとのことですので、chpasswd コマンドを ssh 経由に使ってみてください。
> ホスト側で「echo testuser:testuser | chpasswd」する分にはパスワードが変更されるのですが、
> 今、Armadilloにrootでログインして「podman exec -it python_app bash」でコンテナに入り
> chpasswdを実行したときにエラーとなります。

> root@dfc308e19e4b:/# ssh -o StrictHostKeyChecking=no root@10.88.0.1 echo testuser:testuser | chpasswd

> これは何がおかしいのでしょうか?

これは echo だけを ssh で実行して、chpasswd をコンテナに実行したので、コンテナにそのユーザーが存在しないだけのエラーですね。
quote を使うかスクリプトにまとめてそのスクリプトを実行してみてください。

補足です。
> quoteを使う

root@dfc308e19e4b:/# ssh -o StrictHostKeyChecking=no root@10.88.0.1 "echo testuser:testuser | chpasswd"

こういう事です。|の後はsshした先ではなく、このコマンドを実行している側で実行されます。

大澤様

佐藤です。

> 補足です。
> > quoteを使う

root@dfc308e19e4b:/# ssh -o StrictHostKeyChecking=no root@10.88.0.1 "echo testuser:testuser | chpasswd"

> こういう事です。|の後はsshした先ではなく、このコマンドを実行している側で実行されます。
ありがとうございます。
quoteを調べようと思っていたところでした。
無事コンテナ内からパスワードを変更することができました。

マルティネ様
> * ユーザーは、Armadillo ABOS側のユーザーとコンテナ側のユーザーがあります。
> * シリアルでログインするときは、ABOS のユーザーを使います。
> * doas は ABOS側で使いますので、その設定は ABOS側のユーザーに適用されます。
> * コンテナのユーザーはそのやり方(podman exec)だとパスワードも使いません、実行時にユーザーを選ぶだけです。
> コンテナでも root が一般ユーザーより権限が多いので一般的には非 root ユーザーを使うことがいいですが、ほとんどの場合は固定のユーザーで使われています。コンテナイメージを一度作ったらコンテナ内のユーザーの変更が難しいからです。
> 今回のイメージでは、atmark をそのまま使うか、Dockerfile の「useradd -m -u 1000 atmark」を変更して適切な名前を設定するだけでいいですね。
すみません。
ここがわからないので詳細を教えていただけませんか?
今回はatmarkをそのまま使用しようと考えています。

現在rootでログインし、「podman exec -it python_app bash」でコンテナに入り
python3 /vol_app/src/cli.py」で起動したCLIメニューからは下記のログインユーザの追加と削除ができました。
①useradd {new_user}で新規ログインユーザ追加
②mkdir /home/{new_user}で新規ホームディレクトリ作成
③chpasswdで新規ログインパスワード設定
④/etc/doas.d/user.conf「permit nopass {new_user} as root cmd podman」を更新
⑤persist_fileで/etc/doas.d/user.conf保存
⑥useradd {now_user}で現在ログインユーザ削除
⑦persist_file -d /home/{now_user}で現在ホームディレクトリ削除
⑧persist_file /home/{new_user}で新規ホームディレクトリ保存
⑨persist_file /etc/passwdでpasswdファイル保存
⑩persist_file /etc/shadowでshadowファイル保存

/etc/doas.d/user.conf

permit nopass testuser as root cmd podman

/usr/libexec/cli.sh

#!/bin/sh -e
doas podman exec -it python_app /vol_app/src/cli.py

/etc/passwd

atmark:x:1000:1000:Linux User,,,:/home/testuser:/usr/libexec/cli.sh

このような設定にしてtestuserでログインした場合は
⑥useradd {now_user}で現在ログインユーザ削除
で現在のコンテナのログインユーザが削除できないという状態になります。

> * ユーザーは、Armadillo ABOS側のユーザーとコンテナ側のユーザーがあります。
> * シリアルでログインするときは、ABOS のユーザーを使います。
> * doas は ABOS側で使いますので、その設定は ABOS側のユーザーに適用されます。
> * コンテナのユーザーはそのやり方(podman exec)だとパスワードも使いません、実行時にユーザーを選ぶだけです。
これで実行すればこういうことにはならないということでしょうか?

/usr/libexec/cli.sh

#!/bin/sh -e
doas podman exec --user atmark -it python_app /vol_app/src/cli.py

上記のように変更してみたのですが非rootユーザでログイン時に下記となってしまいます。

armadillo login: testuser
Password:
Error: unable to find user atmak: no matching entries in passwd file

全然検討違いのことをしていたら申し訳ございません。

よろしくお願い致します。

at_dominique.m…

2023年9月19日 11時53分

佐藤さん

マルティネです。

> このような設定にしてtestuserでログインした場合は
> ⑥useradd {now_user}で現在ログインユーザ削除
> で現在のコンテナのログインユーザが削除できないという状態になります。

「userdel」ですね。
実行時使用中のユーザーを削除して、再び別のユーザーを追加してしまったら同じ UID が使われる可能性がありますので、一般的にセキュリティの問題になります:古いユーザーがまだ新しいユーザーのデーターやプロセスを編集できるからです。

今回はユーザーが自由にコマンドを実行できないので、userdel ではなくdeluser を使えばそのチェックがないので削除できるようになると思います。
(deluser と userdel、adduser と useradd は紛らわしいですが別のコマンドになっています… useradd/userdel の方が色々チェックしてくれてますので一般的にはそっちを使った方がいいですが、今回の様に deluser を使う必要がある場合もあります)

とはいえ、今使われているユーザーを削除できてしまう armadillo と接することはできなくなる可能性がありますので、新しいユーザーを追加した後に新しいユーザーから古いユーザーを削除した方が流れてきにいいと思います(新しいユーザーが動いていることを確認することで安心して古いユーザーを削除できます)

そこは設計の問題なので、よく考えてみてください。

> > * コンテナのユーザーはそのやり方(podman exec)だとパスワードも使いません、実行時にユーザーを選ぶだけです。
> これで実行すればこういうことにはならないということでしょうか?
>
> /usr/libexec/cli.sh

> #!/bin/sh -e
> doas podman exec --user atmark -it python_app /vol_app/src/cli.py

はい、これでコンテナ内の atmark ユーザーでコマンドを実行することになります。

> 上記のように変更してみたのですが非rootユーザでログイン時に下記となってしまいます。

> armadillo login: testuser
> Password:
> Error: unable to find user atmak: no matching entries in passwd file

vscode プロジェクトのままの Dockerfile で作られたコンテナでしょうか?
こちらで確認したところ実行できたので、エラーメッセージに書いてるとおりにそのイメージの /etc/passwd に atmark ユーザーがないと思われます(「podman exec -it python_app cat /etc/passwd」で確認できます)
まだ何かの volume が残っているか、Dockerfile から adduser コマンドを削除しているかのどっちかだと思いますがどうでしょうか。

マルティネ様

佐藤です。

> > このような設定にしてtestuserでログインした場合は
> > ⑥useradd {now_user}で現在ログインユーザ削除
> > で現在のコンテナのログインユーザが削除できないという状態になります。
> 「userdel」ですね。
> 実行時使用中のユーザーを削除して、再び別のユーザーを追加してしまったら同じ UID が使われる可能性がありますので、一般的にセキュリティの問題になります:古いユーザーがまだ新しいユーザーのデーターやプロセスを編集できるからです。
すみません。その通り「userdel」です。
古いユーザの削除については再度検討します。

> 今回はユーザーが自由にコマンドを実行できないので、userdel ではなくdeluser を使えばそのチェックがないので削除できるようになると思います。
「deluser」にしたところ無事削除できました。

> vscode プロジェクトのままの Dockerfile で作られたコンテナでしょうか?
> こちらで確認したところ実行できたので、エラーメッセージに書いてるとおりにそのイメージの /etc/passwd に atmark ユーザーがないと思われます(「podman exec -it python_app cat /etc/passwd」で確認できます)
> まだ何かの volume が残っているか、Dockerfile から adduser コマンドを削除しているかのどっちかだと思いますがどうでしょうか。
vscode プロジェクトの Dockerfile から
FROM docker.io/${ARCH}/debian:bullseye-slim」→「FROM docker.io/${ARCH}/debian:bookworm-slim
の変更をしたものです。

> > > * コンテナのユーザーはそのやり方(podman exec)だとパスワードも使いません、実行時にユーザーを選ぶだけです。
> > これで実行すればこういうことにはならないということでしょうか?
> > /usr/libexec/cli.sh

#!/bin/sh -e
doas podman exec --user atmark -it python_app /vol_app/src/cli.py

> はい、これでコンテナ内の atmark ユーザーでコマンドを実行することになります。
すみません。/usr/libexec/cli.sh の「atmark」が「atmak」になっていたため起動できていませんでした。

①useradd {new_user}で新規ログインユーザ追加
②mkdir /home/{new_user}で新規ホームディレクトリ作成
③chpasswdで新規ログインパスワード設定
#④/etc/doas.d/user.conf「permit nopass {new_user} as root cmd podman」を更新 ←atmarkでログインするのなら変更の必要なし
#⑤persist_fileで/etc/doas.d/user.conf保存                      ←同じく保存の必要なし
⑥deluser {now_user}で現在ログインユーザ削除
#⑦persist_file -d /home/{now_user}で現在ホームディレクトリ削除 ←deluserで削除されたので必要なし
⑧persist_file /home/{new_user}で新規ホームディレクトリ保存
⑨persist_file /etc/passwdでpasswdファイル保存
⑩persist_file /etc/shadowでshadowファイル保存

上記の修正をしてから「testuser」でログインし「doas podman exec --user atmark -it python_app /vol_app/src/cli.py」でCLIメニューから「testuser1」に変更できました。
しかし次に「testuser1」でログインしたときに下記と表示されました。

armadillo login: testuser1
Password:
doas: Operation not permitted
 
Welcome to Alpine Linux 3.17
Kernel 5.10.185-0-at on an armv7l (/dev/ttymxc0)
 
armadillo login:

これはどこか権限の設定がおかしいのでしょうか?

以上、よろしくお願い致します。

at_dominique.m…

2023年9月19日 15時08分

佐藤さん

> ①useradd {new_user}で新規ログインユーザ追加
> ②mkdir /home/{new_user}で新規ホームディレクトリ作成

(adduser で生成されるはずです)

> ③chpasswdで新規ログインパスワード設定
> #④/etc/doas.d/user.conf「permit nopass {new_user} as root cmd podman」を更新 ←atmarkでログインするのなら変更の必要なし
> #⑤persist_fileで/etc/doas.d/user.conf保存                      ←同じく保存の必要なし

doas の権限は ABOS側のユーザーなので、更新が必要です。

> ⑥deluser {now_user}で現在ログインユーザ削除
> #⑦persist_file -d /home/{now_user}で現在ホームディレクトリ削除 ←deluserで削除されたので必要なし

deluser でメモリ上の overlayfs から削除されてますが、persist_file はまだ有効です。
persist_file を実行しないと再起動した際にディレクトリが戻ります。
(ディレクトリを残しても特に問題ないですが)

> 上記の修正をしてから「testuser」でログインし「doas podman exec --user atmark -it python_app /vol_app/src/cli.py」でCLIメニューから「testuser1」に変更できました。
> しかし次に「testuser1」でログインしたときに下記と表示されました。

> doas: Operation not permitted

> これはどこか権限の設定がおかしいのでしょうか?

doas のエラーなので、doas のコンフィグに新しいユーザーが設定されてないですね。

マルティネ様

佐藤です。

> > ③chpasswdで新規ログインパスワード設定
> > #④/etc/doas.d/user.conf「permit nopass {new_user} as root cmd podman」を更新 ←atmarkでログインするのなら変更の必要なし
> > #⑤persist_fileで/etc/doas.d/user.conf保存                      ←同じく保存の必要なし
> doas の権限は ABOS側のユーザーなので、更新が必要です。
すみません。
「/etc/doas.d/user.conf」と「/usr/libexec/cli.sh」がごっちゃになっていました。
③、④の「/etc/doas.d/user.conf」のユーザを新規に置換することで
新規ログインユーザからのログインでCLIメニューが起動するようになりました。

> > ⑥deluser {now_user}で現在ログインユーザ削除
> > #⑦persist_file -d /home/{now_user}で現在ホームディレクトリ削除 ←deluserで削除されたので必要なし
> deluser でメモリ上の overlayfs から削除されてますが、persist_file はまだ有効です。
> persist_file を実行しないと再起動した際にディレクトリが戻ります。
> (ディレクトリを残しても特に問題ないですが)
「persist_file -d」を行うよう修正します。

> > ①useradd {new_user}で新規ログインユーザ追加
> > ②mkdir /home/{new_user}で新規ホームディレクトリ作成
> (adduser で生成されるはずです)
「adduser 」とするとパスワードの入力待ちとなり、うまくいかなかったので「useradd 」としました。
思えば「useradd {new_user} -m -s /usr/libexec/cli.sh」とすればよかったですね...