Основы безопасности для веб-разработчиков

Часто случается так, что при разработке нового сайта или в процессе поддержки уже готового проекта веб-мастера и программисты все свое время отдают непосредственно творчеству (дизайну, продумыванию и реализации механизмов и алгоритмов), совершенно при этом забывая о такой важной вещи, как безопасность создаваемого проекта. А ведь чем больше труда вложено в сайт, чем больше сил и времени потрачено на его дизайн и программирование, чем больше средств вложено в эти процессы, тем обиднее видеть, как Ваш сайт рушится под атаками хакеров из-за банальной ошибки, допущенной при разработке.
Есть расхожее мнение, что обеспечение безопасности есть дело некоего всезнающего системного администратора, который следит за всем, видит все и в случае чего "примет меры". Однако при этом программист и дизайнер (а зачастую это один человек) забывают о том, что работать их проект будет не в какой-то закрытой офисной сети, где есть только проверенные сотрудники, а в всемирной сети Интернет. Доступ к ней, а значит и к Вашему сайту, имеют не только те, для кого предназначается Ваш веб-ресурс, но и нечистые на руку люди, развлекающиеся хакеры подросткового возраста и прочая не всегда желательная публика со всего света.
Как показывает практика, есть некий набор правил, относящихся к обеспечению безопасности, которые нужно соблюдать как при разработке веб-проекта, так и в процессе дальнейшей его эксплуатации. Попробуем рассмотреть наиболее частые ошибки и потенциально уязвимые места:

  • Установка готовых скриптов производства третьих лиц
  • Безопасность при программировании
  • Безопасность при работе с СУБД
  • "Правильные" пароли и разграничение доступа персонала
  • Внимательное чтение документации по всему, что Вы используете
  • Security updates
  • Резервные копии всего проекта

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

Потенциальная опасность заключается в том, что единожды скачав такой скрипт и установив его на своем сайте, веб-мастер начисто забывает о том, что необходимо следить за выходом новых версий используемого скрипта. Надо знать, что новые версии - это не только новые возможности, которые, может быть, не очень-то Вам и нужны. Выпуск новых версий часто сопровождается исправлением ошибок, допущенных в предыдущих версиях. Может быть, Вас устраивает, как работает тот скрипт, что Вы установили и используете, но в нем могут содержаться ошибки, которые крайне негативно влияют на уровень безопасности Вашего веб-ресурса. Не желая использовать новую версию, веб-мастер тем самым подвергает свой проект опасности. Существуют организованные группы хакеров, основной деятельностью которых является исследование наиболее популярных скриптов на предмет выявления ошибок. Далее эти люди публикуют результаты своей работы в Интернете, и любой, кому по какой-то причине не понравился Ваш сайт, может, если увидит у Вас один из "дырявых" скриптов, использовать описанную где-то уязвимость для атаки на Ваш веб-ресурс.
Вывод - если принято решение использовать кем-то написанный скрипт, возьмите за правило подписываться на список рассылки с уведомлениями о новых версиях используемого продукта и следите не только за тем, какие новые возможности в нем появляются, но и за тем, какие были исправлены ошибки. Если появилось сообщение о найденной уязвимости, немедленно установите новую версию. Обычно авторы оперативно реагируют на обнаружение уязвимостей и сразу выпускают обновленные версии.

Безопасность при программировании


Обычно при создании сайта используют программы на языках Perl или PHP. Такой выбор обуславливается тем, что эти языки имеют множество функций и возможностей, специально предназначенных для разработчиков веб-приложений. И Perl, и PHP имеют в документации статьи, специально предназначенные для тех, кто хочет больше знать о безопасном программировании. Имеет смысл ознакомиться с этими документами и очень серьезно отнестись к рассматриваемым там вещам.
Иногда бывает полезным задействовать в работе веб-проекта систему управления базами данных (СУБД). Появилось довольно большое количество не очень сложных в настройке и использовании СУБД, которые пользуются популярностью у хостинговых компаний и их клиентов. Однако при использовании СУБД также нужно помнить о безопасности. Рассмотрим наиболее типичные security-проблемы веб-разработчиков, которые используют СУБД MySQL. Это наиболее популярная СУБД для дешевого платного хостинга, которой пользуются более половины разработчиков веб-ресурсов. Если у Вас свой собственный MySQL-сервер под Вашим администрированием, нужно серьезно подойти к изучению системы ограничения прав доступа, которая реализована в MySQL. В этой СУБД используются так называемые Access Control Lists (ACLs), позволяющие управлять соединениями, запросами и другими операциями, которые пользователи могут пытаться делать. Очень важным моментом является установка адекватной политики доступа к хранимой в базе данных информации, когда доступ разрешается только к той информации, которая реально нужна. То есть, если у Вас есть два пользователя, которые могут совершать запросы к базе данных и данные, которыми они пользуются, не пересекаются, нужно запретить доступ одного пользователя к данным другого. Если у одного из пользователей каким-то образом будет похищен пароль, злоумышленник получит доступ только к тем данным, которые принадлежат соответствующему пользователю MySQL.

Нельзя никому давать пароль суперпользователя (обычно он называется root)! Не используйте это имя для обращения к базе из скриптов, которые обеспечивают функционирование непосредственно веб-сервера. Да, root по умолчанию имеет доступ ко всем данным и это очень удобно, но это может и погубить всю Вашу работу, если будет украден его пароль или получен доступ под правами root с использованием "дырки" в каком-либо из скриптов. Заведите дополнительного пользователя, наделите его необходимыми правами и пользуйтесь этим аккаунтом для обращения к базе там, где реально не требуются права суперпользователя.

Не храните в базе пароли в виде открытого текста. В MySQL есть специальная функция, которая позволяет создавать шифрованные с помощью алгоритма md5 пароли. Для того, чтобы получить шифрованный пароль, можно воспользоваться такой командой в интерактивном режиме работы с MySQL:

update mysql.user set Password=password('your_pass') where user='web';
В данном случае 'your_pass' является паролем, который будет зашифрован, а 'web' - имя пользователя, которому будет установлен такой пароль.

Дополнительные рекомендации по генерации паролей можно прочитать в соответствующем разделе этой статьи.

Никогда не доверяйте данным, которые вводят пользователи на веб-сервере. Проверяйте строки, которые Ваши скрипты получают из веб-форм. Например, в форме есть поле, в которое нужно ввести количество заказываемого в Вашем интернет-магазине товара. Вы предполагаете, что пользователь введет туда число. А на самом деле туда может быть введено не "5", что-то типа "5; drop database mysql". Конечно, это уж слишком трагичный пример, но и его вполне можно использовать, если Ваш скрипт производит соединение к базе под пользователем root. Менее "опасный" пример - select * from passwords - если у Вас есть, допустим, такая табличка с паролями. Проверяйте все данные, которые приходят с веба. Помещать в MySQL непроверенные данные очень опасно.

Иногда очень полезным (особенно для начинающих пользователей и разработчиков) является сделать веб-интерфейс для администрирования MySQL. Если Вы воспользовались утилитами типа phpMyAdmin, не забудьте запаролировать доступ к такому интерфейсу. Будет очень неприятно, если такой веб-интерфейс найдут хакеры и просто сделают drop database, а таких случаев было очень много. Это, кстати, является одной из наиболее частых ошибок пользователей при работе с MySQL - Обратите особое внимание. Вообще, делая какой-то административный интерфейс, не надейтесь, что никто не найдет URL вида http://www.domain.ru/myadminweb. Найдут. Лучше поставьте на доступ к такому интерфейсу пароль. Это вполне можно сделать средствами веб-сервера apache.
Стоит также понимать, что изложенные тезисы применимы не только к MySQL, но и к любой другой СУБД. Отличия могут быть в синтаксисе команд и деталях.

"Правильные" пароли и разграничение доступа персонала


Не придумывайте слишком простых паролей. Не делайте паролей, состоящих из простых слов. Существуют огромные словари, которые могут быть использованы хакером при подборе украденного шифрованного пароля или при подборе пароля в online-режиме. Например, пароль 'application' гораздо менее устойчив к перебору, чем, скажем, пароль 'hjsdg123'. Стоит делать действительно сложные пароли. Например, 'J3g45HrrT', 'Kfgd45h345' или 'K4j5uff34'. Чем более сложным кажется такой пароль, тем лучше.
Если на Вашем сайте предусмотрен административный интерфейс для сотрудников компании или просто команды администраторов сайта, обратите внимание на разграничение прав доступа к информации. Делайте доступной для конкретного пользователя только ту информацию, с которой он реально должен работать. Если, например, человек отвечает за раздел "Книги" Вашего интернет-магазина, не стоит без веских на то причин давать ему управлять и разделом "Видеокассеты".
Это называется принципом минимальных прав, когда рядовым сотрудникам выдаются только те права, которые им реально необходимы. Да, конечно, есть администраторы, которые получают большие или даже все возможные права, но для рядовых сотрудников этого делать не стоит. Если Вы будете придерживаться принципа минимальных прав, при краже пароля пользователя ущерб, который может быть нанесен, ограничится данными только одного раздела, а к другим частям административного интерфейса Вашего проекта доступ злоумышленник получить не сможет.

Внимательное чтение документации по всему, что Вы используете


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

Следить за security updates


Современный хостинг является довольно сложной технологией, состоящей из десятков или даже сотен программных продуктов, которые обмениваются друг с другом данными, работают в одном адресном пространстве, и следить за тем, чтобы все версии программ регулярно обновлялись, не содержали security ошибок и "дырок", должны специалисты хостинг-провайдера. Как правило, провайдеры успевают обновлять используемое ПО, так что Вам остается следить за своими программами.
Существуют списки рассылки, посвященные безопасности, на которые имеет смысл подписаться. Также следует периодически посещать сайты соответствующей тематики и просматривать там анонсы найденных уязвимостей. Да, зачастую то, что Вы увидите, не будет Вам полезно. Однако замеченное однажды скромное сообщение о "дырке" в используемой Вами, например, веб-конференции позволит сохранить много нервов.
Если уж кто-то воспользовался "дыркой" на Вашем сайте и, например, удалил все его содержимое, будет очень просто восстановить работоспособность всего проекта в считанные минуты, если Вы периодически создавали резервные копии. Делайте архивы всего контента виртуального сервера и скачивайте их на свой компьютер. Если хостинг-провайдер предлагает возможность централизованного создания backup-копий сайта, обязательно пользуйтесь этой возможностью.

Заключение


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