Post on 29-Nov-2014
description
Безопасность Drupal сайтов
Фиделин Евгений, DrupalCamp Lviv 2012
Для чего взламывают сайты?
● Сервер:○ Получение доступа к закрытой информации на сайте
(логины, пароли, email, ...)○ Использование ресурсов сервера в своих целях
(spam-рассылка, баннеры, редиректы, вредоносный код, ...)
● Посетитель сайта:○ Получение доступа к конфиденциальным данным
посетителя (фишинг паролей, данных кредитных карт)
○ Использование ресурсов компьютера посетителя в своих целях (установка троянов, вирусов, ...)
Что нужно знать о безопасности?
● Обеспечение безопасности - это постоянный процесс, а не разовые меры.
● За безопасность отвечают все, кто имеет доступ к сайту.
● Нужно следить за безопасностью не только Drupal, а всего ПО на сервере.
● Поиск уязвимостей, их исправление и публикация - это хорошая практика.
ТОП-10 уязвимостей сайтов (owasp.org)Насколько Drupal сайты им подвержены
Drupal Cервер Модуль
A1 SQL-injections 7% X
A2 Cross-site scripting (XSS) 48% X X
A3 Broken Authentication and Session Management 3% X
A4 Insecure Direct Object References 8% X
A5 Cross Site Request Forgery (CSRF) 10% X
A6 Security Misconfiguration 12% X X X
A7 Failure to Restrict URL Access 8% X
A8 Unvalidated Redirects and Forwards ~ X
A9 Insecure Cryptographic Storage ~ X
A10 Insufficient Transport Layer Protection ~ X X X
A1. SQL-injection
Небезопасный код:db_query('SELECT nid FROM node WHERE user = '. $_GET['user']);
А что будет здесь?http://www.example.com/page?user=1;DELETE FROM users;
В чем ошибка?● Нет фильтрации аргументов
● Нет псевдонимов таблиц
Правильные варианты:db_query('SELECT nid FROM {node} WHERE user = :user', array(':user' => $_GET['user']);
db_select('node', 'n')->fields('n', array('nid')) ->condition('uid', $_GET['user'])->execute();
A2. Cross-site scriptingСамая распространенная уязвимость
Не позволяйте размещать опасный код.1. Валидируйте введенные данные2. Защититесь от SQL-injection3. Определяйте тип данных4. Фильтруйте вывод данных в зависимости от их типа
Created by Greg Knaddison http://crackingdrupal.com
A2. Cross-site scriptingФильтруем данные перед выводом
Created by Greg Knaddison, Gabor Hojtsy http://drupalscout.com
A2. Cross-site scriptingУстойчивая уязвимость. Шаг 1
Created by Ben Jeavons http://drupalscout.com
A2. Cross-site scriptingУстойчивая уязвимость. Шаг 2
Created by Ben Jeavons http://drupalscout.com
A2. Cross-site scriptingУстойчивая уязвимость. Шаг 3
Created by Ben Jeavons http://drupalscout.com
A3. Broken Authentication and Session Management
Drupal по-умолчанию защищен:● Авторизационные cookie не могут изменяться
посетителями на стороне клиента● Авторизационные cookie не содержат логина,
пароля, а только ID сессии.● Сессии и cookie пользователя уничтожаются
и создаются заново при логине и логауте.● Сookie имеют уникальные имена для каждого
сайта и доступны только в пределах домена
A4. Insecure Direct Object ReferencesA7. Failure to Restrict URL Access
Drupal имеет мощную систему проверки доступа к любой странице и даже элементу страницы:● 'access callback' в hook_menu()● user_access('administer nodes', $account);
● node_access('edit', $node, $account);
● $select->addtag('node_access');
● Form API ○ проверяет данные на валидность.○ позволяет указать доступ для каждого поля
$form['f']['#access'] = TRUE;
A5. Cross Site Request Forgery (CSRF)
Что будет, если разместить следующий код?<img src="user/logout" /><img src="node/10/delete" />
Как защититься?● Для форм использовать Form API
○ Автоматически добавляет уникальный form_id и проверяет его валидность.
● Для ссылок и AJAX без Form API использовать токены○ при запросе добавлять
'query' => array('token' => drupal_get_token('my_id')
○ при обработке проверятьif (drupal_valid_token($_GET['token'], 'my_id'))
A6. Security MisconfigurationШаг 1. Настройки Drupal
● Установите сложный пароль для админов.● Проверьте, кто имеет доступ к правам
"administer ..."● Правильно настройте форматы ввода
доступные обычным пользователям.● Не используйте формат ввода PHP!● Проверьте, какие типы файлов могут
загружать пользователи.● Используйте CAPTCHA.● Отключите вывод сообщений об ошибках.● Удалите devel и все неиспользуемые модули.
A6. Security MisconfigurationШаг 2. Дополнительные модули
● Security review - проверка основных настроек○ http://drupal.org/project/security_review
● Hacked - проверка на изменение в исходных кодах модулей и тем○ http://drupal.org/project/hacked
● Coder и Secure code review - проверка модулей на качество кода и основные уязвимости.○ http://drupal.org/project/coder○ http://drupal.org/project/secure_code_review
A6. Security MisconfigurationШаг 3. Настройки сервера
● Проверьте права на запись файлов.● Проверьте, что сервер не выдает список
файлов в папке.● Закройте доступ к phpMyAdmin.● Закройте доступ к бекапам БД.● Не используйте FTP - только SFTP или SSH.● Не используйте root пользователя в MySQL.● Убедитесь что ОС, PHP, сервер и др. имеют
актуальные версии.● Вы уверены в безопасности ваших соседей?
A8. Unvalidated Redirects and Forwards
Что будет, если разместить следующий код?http://example.com/redirect?destination=evil.com
Как делать правильно?● Drupal позволяет делать редиректы только на
локальные URL через GET параметр destination.
● Для безопасного редиректа используйте drupal_goto() и $form['#redirect']
A9. Insecure Cryptographic Storage
Drupal имеет надежную систему хранения секретных данных:● Используется Portable PHP password для
создания хешей паролей с солью user_hash_password().
● При установке Drupal создает уникальный приватный ключ, который нужно использовать при шифровании данных drupal_get_private_key().
● Механизм генерации паролей может быть расширен модулями.
A10. Insufficient Transport Layer Protection
Используйте HTTPS для защиты особо важных данных:● Drupal поддерживает работу через HTTPS● Используйте модуль Secure pages для
защиты определенных страниц.○ http://drupal.org/project/securepages
● Используйте валидный SSL-сертификат
Безопасен ли Drupal? Да! Но люди совершают ошибки
● Налаженный процесс поиска и исправления уязвимостей, в котором участвуют:○ Security team○ Сертифицированные организации○ Каждый разработчик (http://drupal.org/node/101494)
● Документация по обеспечению безопасности сайта:○ http://drupal.org/security/secure-configuration
● Модули, повышающие безопасность:○ http://drupalscout.com/knowledge-base/contributed-
modules-securing-your-drupal-site
Что нужно делать разработчику
● Подпишитесь на рассылку Drupal security announcements
● Регулярно обновляйте модули и ядро Drupal
● Проводите код-ревью модулей на предмет уязвимостей:○ http://drupal.org/security/writing-secure-code○ http://drupalscout.com/knowledge-base○ http://crackingdrupal.com/blog○ https://www.owasp.org/images/0/0f/OWASP_T10_-
_2010_rc1.pdf
Спасибо за внимание!Есть вопросы?
Фиделин Евгений eugene.fidelin@gmail.comSkype: eugene.fidelinfacebook.com/eugene.fidelin
Не откладывайте решение проблем с безопасностью - "потом" будет поздно.