Хранение общесистемного пароля соединения с БД для модуля Python - PullRequest
0 голосов
/ 18 января 2010

У меня написан модуль Python, который из-за его специфики должен иметь соединение с базой данных MySQL. В настоящее время детали этого соединения (хост, база данных, имя пользователя и пароль для подключения) хранятся в /etc/mymodule.conf в виде открытого текста, что, очевидно, не очень хорошая идея.

Предположительно, файл /etc/mymodule.conf редактируется пользователем root после установки модуля, поскольку модуль и его база данных могут использоваться всеми пользователями системы Unix.

Как мне вместо этого надежно хранить пароль?

Ответы [ 2 ]

4 голосов
/ 18 января 2010

Ваши ограничения ставят очень сложную проблему: каждый пользователь в системе должен иметь доступ к этому паролю (поскольку это единственный способ для пользователей получить доступ к этой базе данных) ... но они не должны (кроме случаев, когда этот скрипт запускается, и, по-видимому, только при запуске без сеанса, например, python -i, который позволил бы им установить точку останова непосредственно перед вызовом соединения и просматривать всю память, поэтому, безусловно, может смотреть на пароль).

Вы можете написать процесс-демон, который запускается от имени пользователя root (поэтому можете прочитать mymodule.conf, который вы можете сделать доступным для чтения только пользователю root) и принимать запросы, каким-то образом проверяя, что запрос поступил от «хорошего» процесса (который запускает именно тот модуль, о котором идет речь, а не интерактивный), и только потом предоставляет пароль. Это хрупко, в основном из-за необходимости определить, может ли процесс иметь точку останова, установленную в критической точке выполнения, или нет.

В качестве альтернативы, вы могли бы еще больше повысить технологические ставки, обеспечив возврат демона, а не пароля, а открытый сокет, готовый для упаковки в оболочку, совместимую с DB-API; некоторые системы Unix позволяют отправлять открытые файловые дескрипторы между несвязанными процессами (предварительное условие для этого подхода) - и, конечно, вам придется существенно переработать API-интерфейс БД на основе MySQL, чтобы разрешить скорее открытие соединения вокруг уже открытого сокета чем свежеприготовленный. Обратите внимание, что утвержденный процесс запроса, который оказывается интерактивным, все же сможет получить объект подключения после его создания и отправлять совершенно произвольные запросы - они не смогут увидеть пароль , технически, но это не слишком утешительно. Так что маловероятно, что здесь потребуются большие усилия.

Таким образом, следующая возможная архитектура заключается в передаче всего взаимодействия с БД с помощью проверяющего демона: процесс «войдет» в демона, получит подтверждение и, если все в порядке, получит прокси-соединение с (например) сервером XMLRPC, предоставляющим доступ к серверу соединение с БД и его функциональность (демон, вероятно, разветвляет каждый такой прокси-процесс сразу после считывания пароля из файла, доступного только для чтения из корня, и сразу же удаляет привилегии, просто на общем основании безопасности).

Плюс по сравнению с предыдущей альтернативой, в дополнение к, вероятно, более простой реализации, заключается в том, что прокси-сервер также будет проверять каждый запрос SQL, который собирается отправить в базу данных MySQL, и сможет проверять и подвергать цензуре эти запросы как хорошо (предположительно на основе отказа по умолчанию, опять же для общих принципов безопасности), таким образом, серьезно ограничивая количество ущерба, который может нанести «мошенническому» клиентскому процессу (работающему в интерактивном режиме с отладчиком) ... можно надеяться; -).

Да, здесь нет простых решений - но тогда проблема, которую ставят ваши ограничения, настолько далека от простой, что граничит с внутренне противоречивой невозможностью ;-). Кстати, проблема не связана исключительно с Python, это, по сути, выбор безопасной архитектуры, которая приближается к «возведению в квадрат» - жесткие противоречивые ограничения на права доступа! -)

1 голос
/ 18 января 2010

Почему бы не создать учетную запись пользователя MySQL по умолчанию с ограниченными разрешениями? Вы может настроить его так, чтобы он мог читать только конкретную базу данных. Вы могли бы также ограничить пользователя по умолчанию только возможностью SELECT, без возможности INSERT, UPDATE или УДАЛЯТЬ. Конкретные привилегии, которые вы должны установить, конечно же, зависят от вашей ситуации.

Синтаксис ограничения / предоставления привилегий описан здесь: http://dev.mysql.com/doc/refman/5.1/en/grant.html

Создав стандартного пользователя MySQL с ограниченными правами, вы, возможно, могли бы ввести пароль в текстовом файле без вреда.

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

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

С уважением, unutbu

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...