Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
Безопасность
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
                                              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
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-injection
3.   Определяйте тип данных
4.   Фильтруйте вывод данных в зависимости от их типа
A2. Cross-site scripting
Фильтруем данные перед выводом
A2. Cross-site scripting
Устойчивая уязвимость. Шаг 1
A2. Cross-site scripting
Устойчивая уязвимость. Шаг 2
A2. Cross-site scripting
Устойчивая уязвимость. Шаг 3
A3. Broken Authentication and
 Session Management
Drupal по-умолчанию защищен:
● Авторизационные cookie не могут изменяться
  посетителями на стороне клиента
● Авторизационные cookie не содержат логина,
  пароля, а только ID сессии.
● Сессии и cookie пользователя уничтожаются
  и создаются заново при логине и логауте.
● Сookie имеют уникальные имена для каждого
  сайта и доступны только в пределах домена
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;
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.com
             Skype: eugene.fidelin
             facebook.com/eugene.fidelin

More Related Content

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

  • 1. Безопасность Drupal сайтов Фиделин Евгений, DrupalCamp Lviv 2012
  • 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. Фильтруйте вывод данных в зависимости от их типа
  • 7. A2. Cross-site scripting Фильтруем данные перед выводом
  • 8. A2. Cross-site scripting Устойчивая уязвимость. Шаг 1
  • 9. A2. Cross-site scripting Устойчивая уязвимость. Шаг 2
  • 10. A2. Cross-site scripting Устойчивая уязвимость. Шаг 3
  • 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