ホストsansrootからLinuxコンテナ上のファイルにアクセスする

0
2022.01.06

systemd-nspawnのコンテナがあります。コンテナ/var/lib/machines/our-runner用フォルダはvu-our-runner-0:vg-our-runner-0が所有しています。私はそれがvg-our-runner-0が存在しないことを言うようにしかし、私はls -ldがそう言ったにもかかわらず、usermod -aG vg-our-runner-0 www-dataを行うことができない、ホストapache2のインスタンスからその中のファイルを提供しようとしています。 rootとして実行する以外にapacheにアクセスを許可するにはどうすればよいですか(rootはコンテナー内のフォルダーにアクセスできるため)?ホストはDebian、コンテナはArchです。

回答
1
2022.01.07

ls -ldが別の言い方をしているにもかかわらず、vg-our-runner-0は存在しないと言っています

まあ、それらは同じものではありません。 usermodが表示される/ etc / groupにグループが「存在」しないのは事実です。これは、systemd-machinedによって定義された仮想グループです。 getgrnam()またはgetgrid()関数がlsによって呼び出されたときにグループが「存在する」こと事実です。これらは/ etc / groupだけでなく多くの場所から情報を収集するためです。

/ etc / passwdファイルと/ etc / groupファイルは、Linuxのpasswdおよびgroup情報のソースであるだけではありません。 ls -lのようなプログラムがグループ名またはGIDを検索しようとすると、複数のnsswitchモジュールがこの情報を提供できます。 (これらはすべて/etc/nsswitch.confにリストされており、「libnss_files」モジュールは実際に/ etc / groupを読み取るものです。)

特に、ls -lもsystemdにすることによりインストールされ、現在実行中のコンテナについてオンザフライで情報を提供している「libnss_mymachines」モジュールを尋ねます。また、コンテナが停止すると、グループが突然認識されなくなるのもそのためです。 (これは、systemd-machinedがアイドル状態で終了するたびにすべてのvu- / vg-名が認識されなくなる理由でもあります...)

幸い、nsswitchには、複数のモジュールからのメンバーシップ結果のマージをサポートするグループ向けの特別なケースがあります。このグループを手動で/ etc / groupに追加し、そのGIDを保持していることを確認すると、メンバーを追加できるようになります。

あなたは(この場合には例えば1164378112)ls -ldnを使用してGIDを検索し、/ etcに新しい行を追加することができるように/このようなグループ:

 echo "vg-our-runner-0:x:1164378112:www-data" >> /etc/group

これで、 id www-datagroups www-data (nsswitchを介してグループメンバーシップを収集する)などのツールが新しいGIDを報告します。グループが定義されたカーネルには関係ありません。GIDはGIDです。