Я пытаюсь скопировать некоторые файлы пользователю root от пользователя с очень низким уровнем (почти нет привилегий). Мне нужно разрешить кому-либо, имеющему доступ к низкому аккаунту, копировать некоторые файлы в более высокий аккаунт. Я думал об использовании сценария bin / Bash, но не хочу, чтобы пароль в файле просматривался.
Я решил создать приложение на C ++ с паролем учетной записи, которую я хотел бы передать командам su / setuid. Я знаю, что пароль можно просмотреть в двоичном коде, но это не проблема. Пароль не в текстовом формате достаточно.
Моя проблема в том, что я не могу понять, как войти в систему как пользователь, которому нужно обновить файлы для службы, работающей в этой учетной записи. У меня есть имя учетной записи пользователя, которое является localadmin, и пароль для этой учетной записи. Но как мне передать их в Linux, чтобы скопировать файлы в домашний / подкаталог учетной записи localadmin из приложения C ++?
Я пробовал в C ++:
система («su localadmin»); // Это запрашивает пароль, но не уверен, как передать пароль.
УИП (0); // Опять же, куда мне передать пароль, чтобы получить права учетной записи? Все, что я получаю, это «операция не разрешена».
Я прошу прощения, если это простой вопрос. Я просто пытаюсь запустить команды от имени localadmin и все готово.
Вам не нужно вводить пароль. Сделайте ваше приложение setuid root, чтобы оно работало с правами root.
С привилегиями root сделайте следующее:
chown root {program}
chmod 4755 {program}
Теперь ваш исполняемый файл принадлежит пользователю root и у него установлен бит setuid. Поэтому, когда любой пользователь запускает его, он запускается от имени пользователя root. Тогда программа может делать то, что ей нужно.
При создании корневой программы setuid необходимо соблюдать особую осторожность, чтобы гарантировать, что все входные данные должным образом очищены для предотвращения переполнения буфера или уязвимости форматной строки. Кроме того, если ваша программа делает больше, чем просто вызывает другую программу, она должна отказаться от привилегий, когда она начинает использовать seteuid({callers_uid})
повысить привилегии, когда это необходимо seteuid(0)
и снова бросьте их обратно, когда закончите.
Если вы хотите, чтобы эта программа запускалась только определенными пользователями, вы можете использовать sudo
вместо создания программы setuid root. Пользователь root должен обновить файл / etc / sudoers и добавить запись для пользователя и рассматриваемой программы, а также включить параметр, не требующий пароля.
Например:
user_name ALL = (root) NOPASSWD:program_to_run
Затем пользователь может запустить:
sudo program_to_run
Затем этот пользователь (и только этот пользователь) может запустить программу с привилегиями root, чтобы выполнить все, что ему нужно.
Я думаю, вы неправильно поняли, как setuid
вообще работает. Нет необходимости хранить какой-либо пароль в вашем приложении: вы просто кодируете его как обычно, чтобы делать то, что вам нужно, как если бы вы были root
, Когда у вас есть бинарный файл (принадлежит root), вы устанавливаете его setuid
привилегия как атрибут бинарного использования chmod
,
После этого исполняется двоичный файл, поскольку любой пользователь, которому разрешено выполнять его, переводит их в root для выполнения кода двоичного кода. Для этого не нужно вводить пароль.
Обратите внимание, что вы должны быть осторожны с setuid
программы: они могут вызвать проблемы с безопасностью из-за их root
привилегия. Лучше держать их как можно более простыми и сфокусированными, выполняя абсолютный минимум, который фактически требует корневых привилегий, оставляя другиеsetuid
программы для выполнения любой непривилегированной работы, чтобы минимизировать потенциальные уязвимости, которые можно использовать.