私は走るunshare -r touch file
。しかしunshare -r chown nobody file
それは私に与えられましたInvalid argument
。なぜ?
答え1
新しいユーザーネームスペースを作成した後にタスクを「完了」するには、UIDとGIDのマッピングを一度に完了する必要があります。
初期ユーザー(権限がない場合)はこのマッピングを実行できますが、自分を新しいユーザーの名前空間にのみマッピングできます。一つUIDと一つGIDは権限なしでマッピングできます。
この制限がある場合、この単一ユーザーマッピングに興味がある候補である新しいユーザー名前空間には2人のユーザーしかいません。他の関連する名前空間(ネットワークやマウントなど)に関連する権限を含む権限を取得するためのルートまたはユーザーの名前空間自体(通常は複数のレイヤーを含む):初期(john) - > userns1(root) - > userns2(再) john)).したがって、通常はルートが選択されます(この-r
オプションが実行するアクションです)。
root権限では、一部の権限はプロセス、ファイルのUIDの変更、または影響に関連しています。ただし、この新しいユーザー名前空間では、選択したUID(ルートの場合は0)を除く他のすべてのUIDはマップされません。それらは次のようにマッピングされます。(オーバーフローしたUID)誰もいない(65534)とそれを変更または変更しようとすると、EINVAL(無効なパラメータ)が発生します。これは、初期ユーザーの名前空間で、権限のないユーザーが同じ操作を実行した結果である操作不能(EPERM)とは異なります。しかし、全体的な目標は同じです。つまり、ユーザーネームスペースを使用してなりすましを試みることで、ホスト(初期ネームスペース...)への権限やアクセスを取得する方法はありません。
権限のないユーザーが作成した名前空間で複数のUIDを使用する必要がある場合は、次のものを使用する必要があります。特権助ける人。これらのヘルパーはどこにもあり、権限のないユーザーと一緒に使用する場合のコンテナ技術(Docker、LXC...)の前提条件です。newuidmap
(そしてその仲間たちnewgidmap
)。このツールはsetuid-root(少なくともCAP_SETUIDが必要ですが他のものも必要です)であり、/etc/subuid
ユーザー自身に加えて、/内のすべてのユーザー項目の完全なマッピング範囲を新しいユーザー名前空間に付与できます。/etc/subgid
詳細はこのQ/Aで確認できます。サブユーザーIDを使用してファイルシステム権限を付与できますか?
答え2
ルートのみが所有権を他のユーザーに変更できます。あなたはunshare -r
ルートになりますが、自分の名前空間でのみ可能です。
~$ unshare -r touch /tmp/foo
~$ unshare -r ls -l /tmp/foo
-rw-r--r-- 1 root root 0 27. Jul 14:20 /tmp/foo
~$ ls -l /tmp/foo
-rw-r--r-- 1 user user 0 27. Jul 14:20 /tmp/foo
名前空間のファイルシステムが「実際の」名前空間のファイルシステムを改ざんできるため、chown
これは回避されます。