понедельник, 29 августа 2011 г.

Аудит и внешняя аутентификация в MySQL

http://habrahabr.ru/blogs/mysql/126519/

Сегодня я расскажу как сделать вашу СУБД MySQL ближе к стандартам PCI DSS. Для начала вот что у нас получится:
Консоль админ пользователя mcshadow
mcshadow:~$mysql --user=mcshadow --password=mike mysql> select current_user(); +----------------+ | current_user() | +----------------+ | mike@localhost | +----------------+ mcshadow:~$mysql --user=mcshadow --password=root mysql> select current_user(); +----------------+ | current_user() | +----------------+ | root@localhost | +----------------+

Доступ возможен как с правами рута, так и с правами смертного пользователя mike.


Консоль смертного пользователя mike
mike:~$mysql --user=mcshadow --password=mike ERROR 1698 (28000): Access denied for user 'mcshadow'@'localhost'

Доступ к БД под администратором невозможен.


А тем временем в syslog
mysqld: User:mcshadow TRY access from:localhost with privileges:mike
mysqld: User:mcshadow SUCCESS access from:localhost with privileges:mike
mysql: SYSTEM_USER:'mcshadow', MYSQL_USER:'mcshadow', CONNECTION_ID:5, DB_SERVER:'--', DB:'--', COMMAND_RESULT:SUCCESS, QUERY:'select current_user();'
mysqld: User:mcshadow TRY access from:localhost with privileges:root
mysqld: User:mcshadow SUCCESS access from:localhost with privileges:root
mysql: SYSTEM_USER:'mcshadow', MYSQL_USER:'mcshadow', CONNECTION_ID:6, DB_SERVER:'--', DB:'--', COMMAND_RESULT:SUCCESS, QUERY:'select current_user();'
mysqld: User:mcshadow TRY access from:localhost with privileges:mike
mysqld: User:mcshadow FAILED access from:localhost with privileges:mike


Введение


Пост рекоммендуется тем, кому это действительно нужно, тут была фраза «сегодня буду краток», но по окончании написания статьи понял что не вышло.
Если вы, используете MySQL в качестве СУБД в крупной компании, вы столкнетесь с некоторыми проблемами, как то: в MySQL нет определяемой пользователем политики паролей, т.е. вы не сможете задать хитрую схему по экспирейшену используемого пароля, контролировать новые пароли на соответствие стандартам принятым в вашей организации, использовать систему SSO для коннекта к БД и т.д. Так же было бы крайне удобно логировать все успешные и неуспешные попытки соединения с БД и действия пользователей с правами DBA на пульт security офицера. По мимо этого часто очень хочется зайти в БД под своим логином, но с правами другого пользователя, к примеру для проведения установки или выполнения определенного набора действия для получения ошибки. При чем желательно не знать пароля этого пользователя, а так же сделать так, чтобы все действия корректно были отражены в логах безопасности. Другие БД позволяют сделать часть из этих пунктов, конечно далеко не все. MySQL начиная с версии 5.5.7+ позволит вам выполнить любой их них, без создания излишней нагрузки на БД.
Статья носит обучающий характер, использование данных решений в любых целях, включая описанные, исключительно на вашей совести.

Теория


Теперь поговорим что и откуда брать. Как вы понимаете, для того чтобы это заработало надо собрать внешнюю библиотеку. Ну мы как “опытные” сишники ничего сами писать не будем а просто возьмем готовое, и просто перекинем из одних исходников в другие.
Первое: логирование для клиента MySQL берем из перконы. Если сравнивать исходники MySQL 5.5.X и Percona 5.5.X, то различие в них исключительно в том, что перконовский клиент умеет логировать все подряд в syslog, но делает это опционально. Собственно нам надо просто перетащить часть этих исходных кодов. И сделать эту настройку по умолчанию. Можете просто взять исходник MySQL клиента для перконы, если боитесь накосячить при копипасте.
Второе: логироваение попыток входа в БД, как вы понимаете придется делать на сервере. Тут у нас выбор невелик. Как понять что надо логировать? Все просто в исходниках MySQL есть файл log.cc — он отвечает за general_log. Этот лог успешно записывает всё что происходит на БД, в том числе и успешный и неуспешные попытки коннекта. Все бы хорошо, но работает это из рук вон медленно — крайне не советую его включать на промышленной БД. Нам этот лог нужен для понимая того что искать и где. Согласно этому файлу на данный момент существует всего две имплементации позволяющие производить запись в лог general_log_print и general_log_write. Тут придется попотеть и внимательно просмотреть что менять и где.
Третье: и для нас пожалуй самое интересное — новая фича MySQL 5.5.7 GRANT PROXY.
GRANT PROXY   ON 'priv_user'@'localhost'   TO 'real_user'@'localhost';

чтобы это заработало пользователь real_user должен быть создан особым образом
CREATE USER 'real_user'@'localhost'   IDENTIFIED WITH 'auth_plugin_xxx' AS 'auth_string';

Теперь при коннекте пользователя real_user пароль можно проверять не просто средствами самого мускуля, а возложить это на сторонний плагин — auth_plugin_xxx. Можно написать этот плагин самостоятельно тынц, ну это для тру девелоперов, мы же такими вещами, пока, заниматься не будем, потому что: в целях тестирования и в качестве примера MySQL уже написала парочку плагинов, на которых можно ставить эксперименты. Их мы и возьмем за основу чтобы поиграться. Самое главное, для чего нужен этот плагин это то, что он может подменить на основании своей внутренней логики поле имя пользователя привилегии которого будет применены к сеансу. И если наш real_user имеет права на proxy под подмененным пользователем — MySQL успешно предоставит нам все права пользователя priv_user. Именно в этот плагим можно впихнуть обращение к SSO по вашему внутреннем у протоколу или же к ldap серверу, и наворотить всякую кучу другой логики.
Пока хватит теории — качаем MySQL 5.5.15 в исходных кодах.

Практика


Первое — логирование действий администратора с локальной машины. Считаем, что администратор БД не является администратором сервера и имеет доступ к БД только с консоли с использованием сокета либо по TCP — это не принципиально. Для того чтобы администрировать сервер этого более чем достаточно. В mysql.cc нам необходимо добавить следущие строчки:
#include <violite.h> // после этой строки для Linux систем включаем syslog #ifndef __WIN__ #include "syslog.h" 

Комментариев нет:

Отправить комментарий