2. Для чего взламывают сайты?
● Сервер:
○ Получение доступа к закрытой информации на сайте
(логины, пароли, email, ...)
○ Использование ресурсов сервера в своих целях
(spam-рассылка, баннеры, редиректы, вредоносный
код, ...)
● Посетитель сайта:
○ Получение доступа к конфиденциальным данным
посетителя (фишинг паролей, данных кредитных
карт)
○ Использование ресурсов компьютера посетителя в
своих целях (установка троянов, вирусов, ...)
3. Что нужно знать о безопасности?
● Обеспечение безопасности - это постоянный
процесс, а не разовые меры.
● За безопасность отвечают все, кто имеет
доступ к сайту.
● Нужно следить за безопасностью не только
Drupal, а всего ПО на сервере.
● Поиск уязвимостей, их исправление и
публикация - это хорошая практика.
4. ТОП-10 уязвимостей сайтов (owasp.org)
Насколько Drupal сайты им подвержены
Drupal Cервер Модуль
A1 SQL-injections 7% X
A2 Cross-site scripting (XSS) 48% X X
A3 Broken Authentication and
3% X
Session Management
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
5. 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();
6. A2. Cross-site scripting
Самая распространенная уязвимость
Не позволяйте размещать опасный код.
1. Валидируйте введенные данные
2. Защититесь от SQL-injection
3. Определяйте тип данных
4. Фильтруйте вывод данных в зависимости от их типа
11. A3. Broken Authentication and
Session Management
Drupal по-умолчанию защищен:
● Авторизационные cookie не могут изменяться
посетителями на стороне клиента
● Авторизационные cookie не содержат логина,
пароля, а только ID сессии.
● Сессии и cookie пользователя уничтожаются
и создаются заново при логине и логауте.
● Сookie имеют уникальные имена для каждого
сайта и доступны только в пределах домена
12. A4. Insecure Direct Object References
A7. 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;
13. 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'))
14. A6. Security Misconfiguration
Шаг 1. Настройки Drupal
● Установите сложный пароль для админов.
● Проверьте, кто имеет доступ к правам
"administer ..."
● Правильно настройте форматы ввода
доступные обычным пользователям.
● Не используйте формат ввода PHP!
● Проверьте, какие типы файлов могут
загружать пользователи.
● Используйте CAPTCHA.
● Отключите вывод сообщений об ошибках.
● Удалите devel и все неиспользуемые модули.
15. 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
16. A6. Security Misconfiguration
Шаг 3. Настройки сервера
● Проверьте права на запись файлов.
● Проверьте, что сервер не выдает список
файлов в папке.
● Закройте доступ к phpMyAdmin.
● Закройте доступ к бекапам БД.
● Не используйте FTP - только SFTP или SSH.
● Не используйте root пользователя в MySQL.
● Убедитесь что ОС, PHP, сервер и др. имеют
актуальные версии.
● Вы уверены в безопасности ваших соседей?
17. A8. Unvalidated Redirects and
Forwards
Что будет, если разместить следующий код?
http://example.com/redirect?destination=evil.com
Как делать правильно?
● Drupal позволяет делать редиректы только на
локальные URL через GET параметр
destination.
● Для безопасного редиректа используйте
drupal_goto() и $form['#redirect']
18. A9. Insecure Cryptographic Storage
Drupal имеет надежную систему хранения
секретных данных:
● Используется Portable PHP password для
создания хешей паролей с солью
user_hash_password().
● При установке Drupal создает уникальный
приватный ключ, который нужно
использовать при шифровании данных
drupal_get_private_key().
● Механизм генерации паролей может быть
расширен модулями.
19. A10. Insufficient Transport Layer
Protection
Используйте HTTPS для защиты особо важных
данных:
● Drupal поддерживает работу через HTTPS
● Используйте модуль Secure pages для
защиты определенных страниц.
○ http://drupal.org/project/securepages
● Используйте валидный SSL-сертификат
20. Безопасен ли 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
21. Что нужно делать разработчику
● Подпишитесь на рассылку 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
22. Спасибо за внимание!
Есть вопросы?
Не откладывайте решение проблем
с безопасностью - "потом" будет поздно.
Фиделин Евгений
eugene.fidelin@gmail.com
Skype: eugene.fidelin
facebook.com/eugene.fidelin