一般的なLinuxユーティリティで、特定のCAP_SETUIDに対して任意のUIDに変更できますか?

一般的なLinuxユーティリティで、特定のCAP_SETUIDに対して任意のUIDに変更できますか?

ユーザーの名前空間機能をテストするときは、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_SETUIDPythonを使用すると、次のことができます。

python setuid.py 1997 1998 touch /tmp/test_file

touchこれは、uid 1997およびgid 1998を使用して実行するのと同じ効果があります。

Pythonスクリプトはファイルとして生成する必要はなく、インラインで渡すことができます。 https://stackoverflow.com/a/16938013/453851

おすすめ記事