ユーザーの名前空間機能をテストするときは、UIDを任意の値に変更する必要がある場合があります。
現在、私は次のことを行います。
useradd -u <uid> testuser
su testuser
userdel testuser
任意のUIDを許可せず、?の有効なユーザー名のみを許可するsu
ため、最初にユーザーを追加する必要があります。su
/etc/passwd
任意のUIDを変更できる一般的なLinuxユーティリティはありますかCAP_SETUID
?
注:小さなアプリケーションをコンパイルできることはわかっていますが、setuid(2)
ユーザーの名前空間機能をテストしようとするたびにコンテナなどに転送するのは面倒です。
ベストアンサー1
正確に何を達成したいのか明確ではありません。あなたの質問によると、あなたは次のようになります。
- 毎回、そのユーザーを作成するオーバーヘッドなしでテスト用に他のユーザーを操作してみてください。
- 存在しないユーザーでプロセスを実行しようとしました(
/etc/passwd
より正確にはの項目と一致しませんgetent passwd
)。 - テストするアクション
CAP_SETUID
最初の2つのうちの1つの場合は、ビットセットを使用して実行可能ファイルを作成し、実行可能なユーザーとグループを任意の数に設定できsetuid
ますsetgid
。独自の実行可能ファイルをコンパイルする必要もなく、既存の実行可能ファイルをコピーするだけです。
rootユーザーとして:
mkdir test_dir
# Secure the directory to prevent tampering by other users
chmod go-rx test_dir
cd test_dir
cp $(which bash) .
# arbitrary user 1997 group 1998
chown 1997:1998 ./bash
chmod ug+s ./bash
chmod go+rx ./bash
# Run touch as an arbitrary user
./bash -p -c `touch /tmp/test_file`
# Check the result
ls -lh /tmp/test_file
-rw-r----- 1 1997 1998 0 Jan 11 08:22 /tmp/test_file
さらに、スクリプトプログラミング言語であるPythonは、さまざまなプラットフォームで利用できます。 setuidとsetgidを呼び出した後、何かを実行するために非常に短いPythonスクリプトを書くことができます。
たとえば、uid.py:
import os
import sys
import subprocess
# Set uid and gid
os.setuid(int(sys.argv[1]))
os.setgid(int(sys.argv[2]))
# Run the given command, passing in remaining arguments.
subprocess.run(*sys.argv[3:])
その後、CAP_SETUID
Pythonを使用すると、次のことができます。
python setuid.py 1997 1998 touch /tmp/test_file
touch
これは、uid 1997およびgid 1998を使用して実行するのと同じ効果があります。
Pythonスクリプトはファイルとして生成する必要はなく、インラインで渡すことができます。 https://stackoverflow.com/a/16938013/453851