사용자 네임스페이스 기능을 테스트할 때 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
처음 두 개 중 하나인 경우 비트 세트를 사용하여 실행 파일을 만들고 실행 가능한 사용자 및 그룹을 임의의 숫자로 설정할 수 setuid
있습니다 setgid
. 자신만의 실행 파일을 컴파일할 필요도 없으며 기존 실행 파일을 복사하기만 하면 됩니다.
루트 사용자로서:
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
답변2
UID
특정 항목 으로 변경할 수 있는 일반적인 Linux 유틸리티가 있습니까CAP_SETUID
?
아니요, 그렇지 않습니다.
작은 애플리케이션을 컴파일할 수 있다는 것을 알고 있지만
setuid(2)
사용자 네임스페이스 기능을 테스트하려고 할 때마다 이를 컨테이너로 전송하는 것은 번거롭습니다.
Bash에서 테스트 프레임워크를 수행할 계획이라면,모든 것이것은 아무리 말해도 "성가신" 일입니다.