Безопасное предоставление пользователям возможности создавать учетные записи

1) Я изо всех сил пытаюсь найти безопасный способ позволить новым пользователям создавать учетные записи, не предоставляя им права администратора для этого. Если у вас уже есть учетная запись в моей системе и вы можете работать в командной строке UNIX, вы можете использовать такие программы, как puTTY, для доступа к ней. В настоящее время я создаю программу, которая позволяет визуально передавать файлы туда и обратно, с макетом, похожим на dropbox. Однако я хотел бы добавить функцию «Создать нового пользователя», и я не уверен, как это сделать.

Конечно, я могу заставить программу выполнить что-то вроде «sudo adduser jim» и предоставить пароль sudo, но это потребовало бы, чтобы я включил административный пароль в файл jar. Я знаю, что там есть программы обфускации, но это не обязательно делает их более безопасными. Я бы предпочел создавать пользователей с помощью ssh, но я открыт для любых работ и является безопасным.

2) Я только что подумал. Что делать, если я создал административного пользователя с их способностью sudo ограничиваться только созданием новых пользователей? Это звучит как разумно безопасное решение? Если да, то как я должен это делать? Если нет, каковы недостатки этого метода?

EDIT: Это мое решение до сих пор: предполагая, что я дезинформировал входные данные, я создам скрипт, который будет принимать первый аргумент как имя пользователя, а второй – как пароль, а затем установить его разрешения (бит setuid) на незаписываемый , и когда не-корневые учетные записи запускают его, им разрешено запускать это и ТОЛЬКО с привилегиями root. Вот самый базовый код:

adduser --disabled-password --gecos "" "$1" echo "$1":"$2" | chpasswd 

Как вы думаете? Как вы думаете, я могу улучшить его?

Есть несколько способов сделать это, но я бы написал небольшую программу или скрипт, который принимает информацию о пользователе и запускает adduser . Программа будет принадлежать root, с установленным битом setuid.

Держите его как можно проще. Если вы не будете правильно дезинфицировать свой вход, у вас может быть отверстие для безопасности. В любом случае добавление пользователей в систему опасно. Самое приятное в этой стратегии, однако, состоит в том, что весь исполняемый файл не должен запускаться как root, а только скрипт / программа, которая добавляет пользователя.

РЕДАКТИРОВАТЬ:

Что касается санкционирующего ввода, то, как вы это делаете, зависит от того, как вы реализуете программу. Если вы пишете его на C, используйте функцию execve () вместо system (). Существует замечательный документ с примерами неудач, которые могут быть использованы в CERT . Если вы пишете на Python, предпочитайте модуль подпроцесса системе () по тем же причинам.

Я бы дезинформировал, уничтожив любые символы, которые не являются буквами или цифрами, если у вас нет конкретной необходимости. Создают ли пользователи пароли? Если это так, это усложняет ситуацию. Ключ в том, что вы не хотите, чтобы они могли передавать какие-либо специальные символы в оболочку или вызываемую программу, имеющие особое значение. Для bash некоторые очевидны: $ ; , && . Для mysql вы хотели бы предотвратить как минимум ' , " , и.

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

Если ваша единственная проблема с sudo заключается в использовании пароля, вы можете добавить тег NOPASSWD в файл sudoers . Вы хотите

 some_user ALL = (ALL) NOPASSWD:/path/to/adduser