На главную Напишите нам! Напишите нам!
14-11-2012
колонтитул в word 2007, 0000002111

Как обезопасить MySQL от хакеров

При подключении к серверу MySQL используется, как правило, пароль. По линии связи пароль не передается в виде открытого текста, но алгоритм шифрования не очень сложный. Толковый хакер, если ему удастся перехватить трафик между клиентом и сервером, при определенной настойчивости может взломать пароль. Поэтому если связь между клиентом и сервером осуществляется по ненадежной сети, для шифрования связи следует использовать SSH-туннель.

Вся остальная информация передается в текстовом виде и может быть прочитана кем угодно, кто в состоянии отлеживать подключение. Если это вас беспокоит, можно воспользоваться протоколом со сжатием данных (в MySQL 3.22 и последующих версиях), что значительно затруднит подобные действия. Чтобы еще более повысить безопасность связи, следует использовать протокол ssh. Open source-клиент ssh доступен в сети. С помощью такого протокола можно обеспечить зашифрованную связь по протоколу TCP/IP между сервером MySQL и клиентом MySQL.

Если вы используете MySQL 4.0, то можете также использовать предусмотренную в этой версии поддержку протокола OpenSSL. Обратитесь к разделу - Использование безопасных соединений.

Для обеспечения безопасности MySQL-системы необходимо строго придерживаться следующих рекомендаций:

  • У всех пользователей MySQL должны быть пароли. Для приложений клиент/сервер является общепринятым, что клиент может указывать любое имя пользователя, но если для other_user не задан пароль, то кто угодно может зайти под любым именем, просто введя mysql -u other_user db_name. Чтобы этого избежать, можно изменить пароль для всех пользователей, отредактировав скрипт mysql_install_db перед запуском приложения, или только пароль для root-пользователя MySQL, как это показано ниже:

    shell> mysql -u root mysql
    mysql> UPDATE user SET Password=PASSWORD('new_password')
           WHERE user='root';
    mysql> FLUSH PRIVILEGES;
    
  • Не запускайте демон MySQL от имени пользователя Unix root. Это очень опасно, потому что любой пользователь, имеющий привилегию FILE, будет в состоянии создавать файлы как пользователь root (например ~root/.bashrc). Чтобы предотвратить это, mysqld откажется запускаться от имени пользователя root, если это не будет задано напрямую с помощью опции --user=root. В то же время mysqld может быть запущена от имени обычного непривилегированного пользователя. Можно также, в целях еще большего укрепления безопасности, создать новый аккаунт Unix-пользователя mysql. При запуске mysqld от имени другого пользователя Unix у вас отпадает необходимость заменять имя пользователя root в таблице user, так как имена пользователя в MySQL не имеют ничего общего с аккаунтами пользователей Unix. Для запуска mysqld от имени другого пользователя Unix добавьте в группу [mysqld] файла опций /etc/my.cnf или файла опций my.cnf, находящегося в каталоге данных сервера, строку user, задающую имя пользователя. Например:

    [mysqld]
    user=mysql
    

    В результате сервер будет запущен от имени назначенного пользователя, независимо от того, производится запуск вручную или посредством safe_mysqld или mysql.server. Для получения дополнительной информации обратитесь к разделу - Запуск MySQL от обычного пользователя.

  • Откажитесь от поддержки символических ссылок на таблицы (ее можно запретить с помощью опции --skip-symlink). Это особенно важно в том случае, если вы запускаете mysqld от имени пользователя root, поскольку у того, кто имеет право доступа для записи в каталоги данных mysqld, появляется возможность стереть любой файл в системе! Обратитесь к разделу - Использование символических ссылок для таблиц.

  • Удостоверьтесь, что пользователь Unix, от имени которого запускается mysqld, является единственным пользователем, имеющим привилегии чтения/записи в директории базы данных.

  • Не предоставляйте привилегии PROCESS всем пользователям. Команда mysqladmin processlist выводит текст запросов, обрабатываемых в данный момент. Следовательно, любой пользователь, имеющий право на выполнение этой команды, получает возможность прочитать, например, такой запрос другого пользователя, как UPDATE user SET password=PASSWORD('not_secure'). mysqld резервирует добавочное подключение для пользователей, имеющих привилегию PROCESS, так что пользователь MySQL под именем root может подключиться и осуществлять контроль даже в том случае, когда все обычные подключения заняты.

  • Не предоставляйте привилегии FILE всем пользователям. Любой пользователь, имеющий такую привилегию, может записать в любом месте файловой системы файл с привилегиями демона mysqld! Чтобы обеспечить здесь хоть минимальную защиту, все файлы создаваемые с помощью команды SELECT ... INTO OUTFILE, сделаны общедоступными для записи, но перезаписать существующие файлы нельзя.

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

    Можно также прочитать любой файл в текущую базу данных. Это может быть использовано в корыстных целях. Возможно, например, с помощью команды LOAD DATA загрузить /etc/passwd в таблицу и прочесть ее позже с помощью SELECT.

  • Если вы не доверяете своему DNS-серверу, используйте в таблицах привилегий вместо имен хостов IP-адреса. В любом случае следует очень осторожно относиться к внесению в таблицы привилегий записей, в которых значения имени хоста содержат шаблонные символы!

  • Чтобы ограничить число подключений, доступных для отдельного пользователя, можно в mysqld задать значение переменной max_user_connections.

Опции запуска mysqld, относящиеся к безопасности

К безопасности имеют отношение следующие опции mysqld:

  • --local-infile[=(0|1)]

    При установке опции --local-infile=0 теряется возможность выполнять команду LOAD DATA LOCAL INFILE.

  • --safe-show-database

    Если установлена эта опция, команда SHOW DATABASES возвращает только те базы данных, для которых пользователь имеет какую-либо привилегию. Начиная с версии 4.0.2 эта опция отменена и не служит ни для чего (она включена по умолчанию), т.к. сейчас у нас имеется привилегия SHOW DATABASES. Обратитесь к разделу - Синтаксис команд GRANT и REVOKE.

  • --safe-user-create

    При установке этой опции пользователь не может создавать новых пользователей с помощью команды GRANT, если у него отсутствует привилегия INSERT для таблицы mysql.user. Чтобы предоставить пользователю доступ именно для создания новых пользователей с теми привилегиями, которые он имеет право предоставлять, для этого пользователя следует установить следующую привилегию:

    mysql> GRANT INSERT(user) ON mysql.user TO 'user'@'hostname';
    

    Задание такой привилегии гарантирует, что этот пользователь не сможет непосредственно вносить изменения ни в одном из столбцов привилегий, а для предоставления привилегий другим пользователям должен будет использовать команду GRANT.

  • --skip-grant-tables

    Установка этой опции запрещает серверу вообще использовать систему привилегий. Это открывает кому бы то ни было полный доступ ко всем базам данных! (После запуска сервера можно заставить его снова использовать таблицы привилегий с помощью команды mysqladmin flush-privileges или mysqladmin reload.)

  • --skip-name-resolve

    При установке данной опции имена хостов не разрешены. Все значения в столбцах Host таблиц привилегий должны быть либо IP-адресами, либо localhost.

  • --skip-networking

    Не разрешает осуществлять подсоединений по протоколу TCP/IP через сеть (данная опция запрещает такие подсоединения). Все подсоединения к mysqld должны осуществляться посредством сокетов Unix. Для MySQL старше 3.23.27 эта опция непригодна для систем, в которых используются MIT-потоки, так как MIT-потоки на тот момент не поддерживали сокеты Unix.

  • --skip-show-database

    Разрешает выполнение команды SHOW DATABASES только в том случае, если пользователь имеет привилегию SHOW DATABASES. Начиная с версии 4.0.2 в этой опции больше нет необходимости, т.к. теперь доступ может предоставляться избирательно с помощью привилегии SHOW DATABASES.

колонтитулы в word 2007, 000000211111
Класс!

Маленькая база для маленькой компании

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

Итак, есть список сотрудников и клиентов фирмы, а также перечень ее партнеров. Требуется создать набор учетных карточек как людей, так и организаций,— причем с возможностью различных выборок. К примеру, мы должны иметь возможность, задав название фирмы, получить список ее сотрудников — или, наоборот, выбрав определенного человека, получить информацию (адрес, телефон и др.) о той организации, где он числится.

В реляционных базах данных (а сейчас распространены практически только такие БД) информация хранится в таблицах. Нам понадобится две.

В первой будут размещены учетные карточки людей. Это значит, что столбцы таблицы будут содержать такую информацию, как имя, домашний адрес, телефон, e-mail и место работы.

Вторая таблица, относящаяся к предприятию, будет иметь следующие поля: название организации, ее адрес, телефон, факс и т.д.

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

 
Яндекс.Метрика
Копирование возможно при указании прямой индексируемой гиперссылки
0000002