シェルのないシステムユーザーでもある他のユーザー(rootではない)としてPythonスクリプトを実行しようとしています。スクリプトにsuidフラグを直接設定できないことを理解しているので、C++ラッパーを作成しました。
wrapper.cpp
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <iostream>
int main(void)
{
std::cout << geteuid() << std::endl;
setgid(getgid());
setuid(getuid());
execl("/usr/bin/python2.6", "/usr/bin/python2.6", "test.py", NULL);
}
そして、以下の権限を設定します
sudo chown NoShellUser:NoShellGroup /path/to/wrapper
sudo chmod 7755 /path/to/wrapper
最後に、試してみるために、Pythonスクリプトがあります
import sys
import getpass
import os
import pwd
print "VERSION:", sys.version
print "USER:", getpass.getuser(), pwd.getpwuid(os.getuid())
print "EUSER:", pwd.getpwuid(os.geteuid())
それがまったく重要な場合は、次の権限が必要です
sudo chown NoShellUser:NoShellGroup /path/to/test.py
sudo chmod 7755 /path/to/test.py
これをユーザー「テスト」として実行すると、次のように表示されます。
255 # UID of NoShellUser
VERSION: 2.6.8 (unknown, Apr 12 2012, 20:59:36) # Don't know where that comes from
[GCC 4.1.2 20080704 (Red Hat 4.1.2-52)] # Don't know where that comes from
USER: test pwd.struct_passwd(pw_name='test', pw_passwd='hash', pw_uid=20804, pw_gid=604, pw_gecos='Name Surname', pw_dir='/home/test', pw_shell='/bin/bash')
EUSER: pwd.struct_passwd(pw_name='test', pw_passwd='hash', pw_uid=20804, pw_gid=604, pw_gecos='Name Surname', pw_dir='/home/test', pw_shell='/bin/bash')
ご覧のとおり、有効なユーザーはまだ「テスト」です。すでにいくつかの例を見ていて、それらはすべてほぼ同じことを示しているように見えるので、誰かが私が間違っていることを指摘してもらえますか?