22
Безопасность Drupal сайтов Фиделин Евгений, DrupalCamp Lviv 2012

Е. Фиделин Безопасность Drupal сайтов

  • Upload
    ffw

  • View
    359

  • Download
    3

Embed Size (px)

Citation preview

Page 1: Е. Фиделин Безопасность Drupal сайтов

Безопасность Drupal сайтов

Фиделин Евгений, DrupalCamp Lviv 2012

Page 2: Е. Фиделин Безопасность Drupal сайтов

Для чего взламывают сайты?

● Сервер:○ Получение доступа к закрытой информации на сайте

(логины, пароли, email, ...)○ Использование ресурсов сервера в своих целях

(spam-рассылка, баннеры, редиректы, вредоносный код, ...)

● Посетитель сайта:○ Получение доступа к конфиденциальным данным

посетителя (фишинг паролей, данных кредитных карт)

○ Использование ресурсов компьютера посетителя в своих целях (установка троянов, вирусов, ...)

Page 3: Е. Фиделин Безопасность Drupal сайтов

Что нужно знать о безопасности?

● Обеспечение безопасности - это постоянный процесс, а не разовые меры.

● За безопасность отвечают все, кто имеет доступ к сайту.

● Нужно следить за безопасностью не только Drupal, а всего ПО на сервере.

● Поиск уязвимостей, их исправление и публикация - это хорошая практика.

Page 4: Е. Фиделин Безопасность 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

Page 5: Е. Фиделин Безопасность Drupal сайтов

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();

Page 6: Е. Фиделин Безопасность Drupal сайтов

A2. Cross-site scriptingСамая распространенная уязвимость

Не позволяйте размещать опасный код.1. Валидируйте введенные данные2. Защититесь от SQL-injection3. Определяйте тип данных4. Фильтруйте вывод данных в зависимости от их типа

Page 7: Е. Фиделин Безопасность Drupal сайтов

A2. Cross-site scriptingФильтруем данные перед выводом

Page 8: Е. Фиделин Безопасность Drupal сайтов

A2. Cross-site scriptingУстойчивая уязвимость. Шаг 1

Page 9: Е. Фиделин Безопасность Drupal сайтов

A2. Cross-site scriptingУстойчивая уязвимость. Шаг 2

Page 10: Е. Фиделин Безопасность Drupal сайтов

A2. Cross-site scriptingУстойчивая уязвимость. Шаг 3

Page 11: Е. Фиделин Безопасность Drupal сайтов

A3. Broken Authentication and Session Management

Drupal по-умолчанию защищен:● Авторизационные cookie не могут изменяться

посетителями на стороне клиента● Авторизационные cookie не содержат логина,

пароля, а только ID сессии.● Сессии и cookie пользователя уничтожаются

и создаются заново при логине и логауте.● Сookie имеют уникальные имена для каждого

сайта и доступны только в пределах домена

Page 12: Е. Фиделин Безопасность Drupal сайтов

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;

Page 13: Е. Фиделин Безопасность Drupal сайтов

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'))

Page 14: Е. Фиделин Безопасность Drupal сайтов

A6. Security MisconfigurationШаг 1. Настройки Drupal

● Установите сложный пароль для админов.● Проверьте, кто имеет доступ к правам

"administer ..."● Правильно настройте форматы ввода

доступные обычным пользователям.● Не используйте формат ввода PHP!● Проверьте, какие типы файлов могут

загружать пользователи.● Используйте CAPTCHA.● Отключите вывод сообщений об ошибках.● Удалите devel и все неиспользуемые модули.

Page 15: Е. Фиделин Безопасность Drupal сайтов

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

Page 16: Е. Фиделин Безопасность Drupal сайтов

A6. Security MisconfigurationШаг 3. Настройки сервера

● Проверьте права на запись файлов.● Проверьте, что сервер не выдает список

файлов в папке.● Закройте доступ к phpMyAdmin.● Закройте доступ к бекапам БД.● Не используйте FTP - только SFTP или SSH.● Не используйте root пользователя в MySQL.● Убедитесь что ОС, PHP, сервер и др. имеют

актуальные версии.● Вы уверены в безопасности ваших соседей?

Page 17: Е. Фиделин Безопасность Drupal сайтов

A8. Unvalidated Redirects and Forwards

Что будет, если разместить следующий код?http://example.com/redirect?destination=evil.com

Как делать правильно?● Drupal позволяет делать редиректы только на

локальные URL через GET параметр destination.

● Для безопасного редиректа используйте drupal_goto() и $form['#redirect']

Page 18: Е. Фиделин Безопасность Drupal сайтов

A9. Insecure Cryptographic Storage

Drupal имеет надежную систему хранения секретных данных:● Используется Portable PHP password для

создания хешей паролей с солью user_hash_password().

● При установке Drupal создает уникальный приватный ключ, который нужно использовать при шифровании данных drupal_get_private_key().

● Механизм генерации паролей может быть расширен модулями.

Page 19: Е. Фиделин Безопасность Drupal сайтов

A10. Insufficient Transport Layer Protection

Используйте HTTPS для защиты особо важных данных:● Drupal поддерживает работу через HTTPS● Используйте модуль Secure pages для

защиты определенных страниц.○ http://drupal.org/project/securepages

● Используйте валидный SSL-сертификат

Page 20: Е. Фиделин Безопасность Drupal сайтов

Безопасен ли 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

Page 21: Е. Фиделин Безопасность Drupal сайтов

Что нужно делать разработчику

● Подпишитесь на рассылку 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

Page 22: Е. Фиделин Безопасность Drupal сайтов

Спасибо за внимание!Есть вопросы?

Фиделин Евгений [email protected]: eugene.fidelinfacebook.com/eugene.fidelin

Не откладывайте решение проблем с безопасностью - "потом" будет поздно.