2016-08-02 1 views
-4

Я пытаюсь скопировать некоторые файлы пользователю root с очень низким (почти никаких привилегий). Мне нужно разрешить кому-то доступ к низкой учетной записи копировать некоторые файлы на более высокую учетную запись. Я подумал об использовании сценария bin/Bash, но я не хочу, чтобы в файле просматривался какой-либо пароль.Переключиться на учетную запись root в Linux при выполнении двоичного кода C++ с паролем, ВОЗМОЖНО?

Я решил создать приложение на C++, у которого есть пароль учетной записи, которую я хотел бы передать командам su/setuid. Я знаю, что пароль можно просмотреть в двоичном формате, но это не проблема. Недостаточно пароля не в обычном тексте.

Моя проблема заключается в том, что я не могу понять, как «войти» в качестве пользователя, которому необходимо обновить файлы для службы, запущенной в этой учетной записи. У меня есть имя учетной записи пользователя, которое является localadmin, и пароль для этой учетной записи. Но как я могу передать их в Linux для копирования файлов в home/подкаталог localadmin из приложения C++?

Я пытался в C++:

системы ("су localadmin"); // Это запрашивает пароль, но не знает, как передать пароль.

setuid (0); // Опять же, где я могу передать пароль, чтобы получить привилегии учетной записи? Все, что я получаю, это «операция не разрешена».

Приносим извинения, если это простой вопрос. Я просто пытаюсь запустить команды как localadmin и сделать это.

+1

Запись пароля root в вашей программе является плохой идеей по нескольким причинам, в том числе по крайней мере (1) можно извлечь пароль из двоичного файла, и (2) ваша программа ломается, если пароль root изменен. Вот почему программы, которые должны предоставлять повышенные привилегии непривилегированным пользователям, обычно настраиваются как setuid-root, который является функцией их владения и режима, а не их реализации. –

+1

Звучит как [проблема XY] (http://meta.stackexchange.com/q/66377). Как насчет общего каталога с ACL (списком контроля доступа), который дает привилегии без привилегий пользователя? – Peter

+0

@JohnBollinger, спасибо за ваш ответ и очень благодарен. Я действительно понимаю последствия встраивания пароля в двоичный файл, но это не проблема. Человек, которому я даю это, не имеет такого знания. Мне просто нужен этот двоичный файл, чтобы выполнять все команды в качестве пользователя root. Я надеялся выполнить это, просто предоставив им двоичный файл. –

ответ

6

Вам не нужно указывать пароль. Сделайте свое приложение setuid root таким, чтобы оно выполнялось с правами root.

с привилегиями суперпользователя, выполните следующие действия:

chown root {program} 
chmod 4755 {program} 

Теперь исполняемый принадлежит корень и имеет Setuid бит. Поэтому, когда любой пользователь запускает его, он запускается с правами root. Тогда программа может делать то, что нужно.

При создании корневой программы setuid необходимо соблюдать особую осторожность, чтобы гарантировать, что все входы должным образом дезинфицированы, чтобы предотвратить переполнение буфера или проблемы с форматированием строки. Кроме того, если ваша программа делает больше, чем просто вызвать другую программу, она должна отказаться от привилегий, когда она начнет использовать seteuid({callers_uid}), при необходимости повысит привилегии с seteuid(0) и снова отбросит их, когда закончите.

Если вы хотите, чтобы определенные пользователи могли запускать эту программу, вы можете использовать sudo вместо создания программы setuid root. Корневому пользователю необходимо обновить файл/etc/sudoers и добавить запись для рассматриваемого пользователя и программы и включить параметр, чтобы не требовать пароль.

Например:

user_name ALL = (root) NOPASSWD:program_to_run 

Затем пользователь может запустить:

sudo program_to_run 

Тогда этот пользователь (и только этот пользователь) может запустить программу с правами администратора для выполнения все, что нужно сделать ,

+0

Ты избил меня. Тем не менее, было бы полезно добавить комментарий о том, что может быть потенциальной проблемой безопасности для программ setuid-root. –

+0

Спасибо за информацию, но я просто передаю этот двоичный код кому-то, у кого нет опыта работы с Linux, и никаких привилегий из нижней учетной записи для выполнения. Мне нужно, чтобы получить привилегии root для копирования файлов в подкаталог корневой учетной записи. Я надеялся сделать все это в одном бинарном исполняемом файле. –

+0

@JayMa: Если у них нет привилегий и они не знают пароль, чтобы получить их с помощью 'su', то как они должны получить привилегии? Если у вас есть привилегии, вы можете создать программу setuid на целевой машине и рассказать им об этом. –

0

Я думаю, вы не понимаете, как setuid обычно работает.В вашем приложении нет необходимости хранить какой-либо пароль: вы просто кодируете его как обычно, чтобы делать то, что вам нужно, как если бы вы были root. Если у вас есть двоичный файл (принадлежит root), вы устанавливаете его setuid привилегию как атрибут двоичного файла, используя chmod.

После этого двоичный код, как и любой пользователь, которому разрешено выполнять его, будет способствовать их корневому использованию в целях выполнения двоичного кода. Для этого не нужно вводить пароль.

Обратите внимание, что вам необходимо быть осторожными с программами setuid: они могут вызвать проблемы с безопасностью из-за их привилегии root. Лучше всего держать их такими же простыми и сосредоточенными, насколько это возможно, делая абсолютный минимум, который на самом деле требует привилегий root, оставляя другие программы без setuid выполнять любую непривилегированную работу, чтобы свести к минимуму потенциальные возможные ошибки.

+0

OP предлагает использовать функцию 'setuid()', которую его программа не может успешно обойтись без привилегий в первую очередь. Поскольку все дело в том, что пользователи * не имеют привилегии, которые не будут служить его потребностям, но это не недоразумение setuid в смысле файлового режима. –

+0

Спасибо за информацию, но я просто передаю этот двоичный код кому-то, у кого нет опыта работы с Linux, и никаких привилегий из нижней учетной записи для выполнения. Мне нужно, чтобы получить привилегии root для копирования файлов в подкаталог корневой учетной записи. Я надеялся сделать все это в одном бинарном исполняемом файле. –

+0

После того, как вы установили атрибут 'setuid' в двоичном файле, любой * может * выполнить его без привилегий. Бинарный - это то, что имеет атрибут, а не пользователи, которые должны его использовать. Подумайте о том, как работает программа linux 'passwd': любой может использовать ее для изменения своего пароля, но на самом деле для этого нужно стать root. Это достигается без ввода пользователем пароля root или наличия каких-либо специальных привилегий: это привилегированная программа 'passwd'. – Smeeheey

Смежные вопросы