Защита пароля MySQL при разработке в Python?

Я пишу Python script, который использует базу данных MySQL, которая локально размещена. Программа будет поставляться в виде исходного кода. В результате пароль MySQL будет видимым для голых глаз. Есть ли хороший способ защитить это?

Идея состоит в том, чтобы помешать некоторым непослушным людям смотреть на исходный код, получать прямой доступ к MySQL и что-то делать... ну, озорной.

Ответ 1

Некоторые вещи сначала...

Вопрос здесь не в том, как скрыть пароль, а как защитить базу данных. Помните, что пароли часто являются очень слабой защитой и не должны считаться единственным механизмом защиты БД. Вы используете SSL? Нет? Ну, тогда даже если вам удастся скрыть пароль в коде приложения, все равно легко нюхать его в сети!

У вас есть несколько вариантов. Все с различной степенью безопасности:

"Роль приложения"

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

Pros

  • очень простая настройка
  • Предотвращает DROP запросы (f.ex. в SQL-инъекциях?)

Против

  • Каждый, кто видит пароль, имеет доступ ко всем данным в базе данных. Даже если эти данные обычно скрыты в приложении.
  • Если пароль взломан, пользователь может запускать запросы UPDATE и DELETE без критериев (т.е.: удалить/обновить всю таблицу сразу).

Atomic auth & auth

Создайте одного пользователя базы данных для каждого приложения/конечного пользователя. Это позволяет вам определять права доступа атома даже на основе столбцов. Например: Пользователь X может выбирать только столбцы far и baz из таблицы foo. И ничего больше. Но пользователь Y может SELECT все, но никаких обновлений, в то время как пользователь Z имеет полный доступ CRUD (выбор, вставка, обновление, удаление).

Pros

  • Довольно легко настроить.
  • Схема атомной авторизации

Против

  • Может быть утомительным
  • Пользователи с правами UPDATE и DELETE могут случайно (или намеренно?) удалять/обновлять без критериев. Вы рискуете потерять все данные в таблице.

Сохраненные процедуры с атомным auth & auth

Не записывайте SQL-запросы в приложение. Запустите все через SPROC. Затем создайте db-учетные записи для каждого пользователя и назначьте привилегии только для SPROC.

Pros

  • Самый эффективный механизм защиты.
  • SPROC могут заставить пользователей передавать критерии каждому запросу (включая DELETE и UPDATE)

Против

  • Не уверен, что это работает с MySQL (мои знания в этой области непроницаемы).
  • сложный цикл разработки: все, что вы хотите сделать, должно быть сначала определено в SPROC.

Заключительные мысли

Вы не должны разрешать приложениям администрирования базы данных. В большинстве случаев единственными операциями, которые требуются приложения, являются SELECT, INSERT, DELETE и UPDATE. Если вы следуете этому руководству, вряд ли существует риск того, что пользователи обнаружат пароль. Кроме упомянутых выше пунктов.

В любом случае сохраните резервные копии. Я предполагаю, что вы хотите спроектировать свою базу данных от случайных удалений или обновлений. Но случаются несчастные случаи... помните об этом;)

Ответ 2

В этом случае я создаю новый раздел в моем .my.cnf, например

[files]
host=127.0.0.1
port=3307
database=files
default-character-set=utf8
password=foobar

и использовать его при инициализации DB с помощью

d=MySQLdb.connect(
    read_default_group='files',
    port=0,  # read from .my.cnf
    db='files',
    cursorclass=cursors.DictCursor,
    # amongst other stuff
)

Ответ 3

Подобный без ответа вопрос здесь: https://stackoverflow.com/questions/2850710/connect-to-a-db-with-an-encrypted-password-with-django Пифайский DBAPI (PEP 249) не имеет интерфейса для подключения к базе данных с зашифрованным/хешированным паролем вместо пароля открытого текста.

Хотя эта функция на других языках утешительна, она не обеспечивает реальной дополнительной безопасности: хэш пароля так же хорош, как и пароль. Вы по-прежнему должны контролировать доступ к ресурсам базы данных, как exhuma описывает.

Сам MySQL не предоставляет никаких дополнительных параметров, независимо от привязок python или нет. Вы можете прочитать их руководство в разделе "Руководство пользователя MySQL" на "Защита паролем" . Рекомендуемый параметр защиты доступа к паролю - это сохранить его в файл опций и защитить файл, как описал glglgl.

С этой страницы:

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

Ответ 4

Используйте простой пароль, например root.Else Не используйте пароль.