VM-pro-n-contra

виртуальные машины на службе системного администратора — за и против:\\ практические советы по развертыванию виртуальной инфраструктуры в полевых условиях

крис касперски ака мыщъх, a.k.a. nezumi, a.k.a. souriz, no-email

виртуализация, широко распространенная в эпоху майнфреймов, с приходом к власти персоналок оказалась забытой на многие годы, деградировав до эмуляторов ZX-Spectrum'а, Amig'ии прочих 8-битных машин, но современные процессоры настолько мощны, что позволяют эмулировать самих себя (!) практически без тормозов, открывая дверь в виртуальный мир, находящий большое практическое применение в области системного администрирования, однако, здесь все не так просто и прежде, чем возводить виртуальную систему, следует взвесить все аргументы за и против.

За последние годы на рынке появилось множество виртуальных машин — от узкоспециализированных (BOCHS, eEye), до эмуляторов общего назначения (VM Ware, Sun Virtual Box, QEMU, XEN, Microsoft Virtual PC). Интерес к виртуализации растет, а сами эмуляторы по ходу дела осваивают новые профессии, становясь все более и более привлекательными игрушками в глазах системных администраторов.

«Игрушками» потому что к введению в промышленную эксплуатацию существующие эмуляторы еще не готовы и ущерб от их использования намного превышает стоимость живого железа, которое они призваны заменять (не говоря уже о том, что большинство эмуляторов распространяются на коммерческой основе, то есть стоят денег).

Тем не менее, играться с виртуальными машинами можно и нужно! Есть все основания ожидать, что в ближайшие несколько лет разработчики вылижут баги и доведут эмуляторы до ума, а потому осваивать их надо прямо сейчас, чтобы потом не разворачивать виртуальную инфраструктуру впопыхах.

Существует по меньшей мере три типа виртуальных машин (не считая гибридов). К самым первым (и самым древним) относятся машины с полной эмуляций. Классический пример — BOCHS. Тормозит ужасно, зато позволяет эмулировать «чужеродные» архитектуры, например, x86 на Мотороллере или x86-64 на x86. Возвести многопроцессорную машину на однопроцессорной — без проблем. Причем, основная операционная система надежно изолирована от гостевых виртуальных машин и причинить ей ущерб невероятно трудно, а потому BOCHS очень хорошо подходит для экспериментов с вирусами, червями и прочим зловредным программным обеспечением. Так же его можно использовать для того, чтобы опробовать 64-разрядные операционные системы прежде чем решиться покупать x86-64. Но… высокие накладные расходы на эмуляцию (даже с учетом оптимизации и кэширования инструкций) предъявляют жесткие требования к аппаратной оснастке базовой машины. И проблема здесь даже не в том, что Windows на P-4 900 MHz под «Борщем» стартует около суток. Она вообще не стартует! Поскольку, куча операций отваливается по тайм-ауту, в частности, если процедура инициализации драйвера выполняется свыше 10 секунд, система автоматически выгружает драйвер со всеми вытекающими отсюда последствиями.

Рисунок 1 запуск Windows 2000 под виртуальной машиной BOCHS в режиме полной эмуляции

Динамические виртуальные машины (QEMU, VM Ware, Sun Virtual Box) эмулируют лишь привилегированные инструкции (равно как и непривилегированные инструкции, имеющие доступ к системным данным), за счет чего скорость эмуляции возрастает на пару порядков и на P-III 733 уже можно комфортно работать в среде виртуального Server 2003, а на P-4 все просто летает. Расплатой за скорость становится принципиальная невозможность эмуляции «чужеродных» архитектур, плюс потенциальный риск атаки на основную операционную систему из гостевой. Теоретически, создать надежный динамический эмулятор вполне возможно, но практически… это же тысячи строк на Си/Си++ и мегабайты кода! К тому же, разработчики QEMU и VM Ware даже не пытались защитить основную систему от атаки со стороны гостевых виртуальных машин, чем с успехом пользуются вирусы и черви.

Аппаратная виртуализация (поддерживаемая последними моделями процессоров Intel и AMD) устраняет ляпы в x86 архитектуре, где системные данные надежно защищены только от записи, но могут быть прочитаны с прикладного уровня легальными непривилегированными командами, вынуждая эмулятор просматривать блок кода перед его выполнением, на что расходуется время. В процессорах фирмы Motorola таких дефектов нет и потому динамическая эмуляция на них работает намного быстрее (и без всякой новомодной аппаратной поддержки). Но рынок захватила x86-архитектура, вытеснив Motorol'у, и потому аппаратная виртуализация встречается с очень большим энтузиазмом. Теоретически, скорость эмуляции должна вплотную приближаться к «живому» процессору, поскольку, накладные расходы на виртуализацию близки к нулю. Однако, помимо процессора, виртуальная машины вынуждена эмулировать еще и оборудование. Без жестких дисков ведь не обойтись, а давать прямой доступ к физическим жестким дискам — самоубийство. А потому, производительность виртуальных машин (даже с поддержкой аппаратной эмуляции) существенно отстает от живого железа, но все-таки обгоняет динамическую эмуляцию. Естественно, за повышение скорости приходится платить. Во-первых, необходимо приобрести процессор с поддержкой аппаратной виртуализации (ладно, это не проблема, в ходе очередного планового апгрейда — приобретем), во-вторых (а вот это уже действительно серьезно) — процессоры содержат кучу дефектов, позволяющих воздействовать на основную операционную систему из гостевых виртуальных машин. Причем, исправить ошибку в процессоре, намного сложнее, чем в полностью программном эмуляторе! И что самое неприятное, спонтанные падения основной системы происходят даже без всякой атаки со стороны вредоносного кода! Короче, аппаратная виртуализация до сих пор остается плохо отлаженной игрушкой, не готовой к промышленному внедрению. Тем не менее, Microsoft уже включила эмулятор с поддержкой аппаратной виртуализации в состав Server 2008, конкурирующий с бесплатным проектом XEN.

Словом, мир виртуальных машин огромен и разнообразен, а потому мы сосредоточимся лишь на самых популярных эмуляторах — VM Ware (классика) и Microsoft Virtual PC комплекта поставки Server 2008 – не самая лучшая штука, но, поскольку, она достается нам вместе с сервером, есть смысл познакомится с ней поближе.

vm-pro-n-contra_image_1.jpg

Рисунок 2 Intel Core 2 Duo – процессор с поддержкой аппаратной виртуализации, существенно увеличивающей скорость эмуляции

Как можно использовать виртуальную машину в корпоративной или офисной сети? Например, воздвигнуть виртуальный сервер. А что? Допустим, нам нужен публичный WEB и приватный SQL. По соображениям безопасности, публичный сервер должен быть расположен в так называемой демилитаризованной (DMZ) зоне, а приватный SQL – внутри локальной сети, обнесенной по периметру глубоким защитным рвом (брандмауэром), что требует двух машин, а как быть, если в наличии имеется только одна?!

Теоретически (подчеркиваю — теоретически), можно поднять VM Ware или Microsoft Virtual PC, разместив публичный WEB-сервер на виртуальной машине, а приватный SQL – на основной. И это как бы будет работать. «Как бы» потому что для достижения приемлемого уровня производительности даже при поддержке аппаратной виртуализации, нам понадобиться довольно мощное «железо», способное тянуть эмулятор с разумной скоростью. То есть, много сэкономить все равно не удастся, а если добавить к этой сумме издержки от неизбежных атак на виртуальную машину и сбои самой виртуальной машины, в долгосрочной перспективе мы имеем весьма внушительные убытки. Купить два отдельных физических сервера — дешевле, да работать они будут _намного_ стабильнее. А если денег на железо нет, то лучше отказаться от DMZ-зон, поселив публичные и приватные сервисы на одной машине, запретив приватным сервисам принимать трафик с внешних интерфейсов и для надежности закрыв порты на брандмауэре. Как говориться — дешево и сердито, но это все таки лучше, чем возня с виртуальными машинами.

Рисунок 3 падение основной операционной системы, вызванное некорректным поведением гостевой виртуальной машины

Достаточно часто виртуальные машины используется для экспериментов с потенциально небезопасным программным обеспечением, полученным из ненадежных источников. Антивирусная проверка — не слишком-то хорошее средство для поиска неизвестных или модифицированных червей, вирусов и руткитов. Всем вредителям хорошо известно как «ослепить» проактивные технологии и эвристические анализаторы. Утилиты, ориентированные на поиск руткитов, хорошо работают лишь в первые дни своего появления, а затем хакеры находят обходной путь, выдумывая все новые способы маскировки и внедрения зловредного кода в систему.

Но прямое сравнение дисковых образов палит всех руткитов, червей и вирусов без исключения (конечно, при том условии, что они вносят изменения в файловую систему, а не ограничиваются заражением одной лишь оперативной памяти, умирая при перезагрузке). Алгоритм поиска заразы выглядит так: снимаем образ стерильной системы, сохраняя его в надежном месте, устанавливаем новое программное обеспечение, снимаем еще один образ. Монтируем оба образа на заведомо незараженную систему и сравниваем их. Тривиальное пофайловое сравнение выявляет до 90% малвари, остальные 10% обнаруживает побайтовое сравнение, «вытягивающее» вирусы, прячущиеся в NTFS-потоках или других местах (естественно, работая с диском на низком уровне, мы должны знать все базовые структуры файловой системы, подробно описанные в моей книге «Техника восстановления данных», электронную копию которой можно бесплатно скачать с http://nezumi.org.ru/recover-full-rus.zip и http://nezumi.org.ru/recover-full-eng.zip).

Естественно, проводить подобные эксперименты лучше всего под эмулятором. Намного проще оперировать образами виртуальных жестких дисков, да и выделять отдельную (физическую) машину не потребуется. Удобство, простота и экономия — налицо. Однако, такая простота хуже воровства и экономия на выделенной машине до добра не доводит. Если виртуальная машина соединена с основной системой виртуальной сетью, то черви могут атаковать базовую операционную систему, используя дыры в сетевых службах, так что администратору следует либо своевременно устанавливать все заплатки, либо же отключить вирусный загон от сети вообще, не забывая и про «шары», т.е. shared folders. Виртуальная машина VM Ware поддерживает их в обход Ethernet-адаптера и потому шары продолжают работать даже после удаления виртуальной сетевой карты, причем, «шары» подвержены сразу двум типам атак — через дыры в сервисе «общих папок» и путем засылки червей, модифицирующих шаблон папки, автоматически «подхватываемый» Проводником. Тоже самое относится и ко всем остальным типам носителей, что существенно затрудняет обмен данными между виртуальной и основной машинами. Самое надежное — копировать данные через CD-ROM (не обязательно физический — сойдет и виртуальный, просто берем любую программу для создания iso-образов и монтируем ее на основную систему и на VM Ware).

Рисунок 4 VM Ware одна из самых популярных виртуальных машин с динамической виртуализацией

Важное замечание: по умолчанию VM Ware автоматически распознает все подключаемые USB-устройства и дает виртуальным машинам к ним полный доступ. Допустим, мы подключаем FLASH, внешний жесткий диск с USB-интерфейсом или другой девайс подобного рода, на котором тут же поселяется вирус, вырвавшийся из застенков виртуальной машины. Чтобы предотвратить вторжение достаточно отключить USB-контроллер в свойствах виртуальной машины.

Однако, проблемы на этом не заканчиваются, а только начинаются. Руткиты уже давно научились распознавать виртуальные машины, отказываясь от заражения в их присутствии, что ломает весь концепт. Мы устанавливаем программное обеспечение с руткитом на виртуальную машину, сравниваем образы, ничего не находим и довольные собой, запускам руткита в основную систему. Выходит, что гарантированно обнаружить современных руткитов при помощи виртуальных машин невозможно, а если еще учесть большое количество дыр в эмуляторах, то руткит имеет все шансы заразить основную систему из гостевой машины! Выход? Либо использовать выделенную живую машину, либо надежную виртуальную машину с полной эмуляцией (например, BOCHS), что предотвратит вирусное вторжение, но, увы, не спасет от детекции виртуальной машины руткитом. BOCHS содержит множество мелких дефектов эмуляции (т.е. ведет себя не как живой процессор), которые не препятствуют работе нормальных программ, но могут быть использованы для детекта эмулятора, плюс ко всему _любой_ эмулятор несет на своем борту довольно специфический набор виртуального железа, по которому его легко опознать. И хотя при наличии исходных текстов, мы можем воспрепятствовать этому — купить живой компьютер намного дешевле, чем корежить виртуальное железо, чтобы с одной стороны оно было полностью неузнаваемо, а с другой — сохранило работоспособность.

Резюмируя вышесказанное — виртуальные машины не слишком-то надежный загон для вирусов, хотя если не быть параноиком, то (с учетом низкого качества подавляющего большинства вирусов и руткитов), лучше использовать виртуальную машину, чем всецело полагаться на антивирусы.

Офисные сети обычно не испытывают необходимости в сенсорах и датчиках, детектирующих вторжение, а если и испытывают, то дело обычно ограничивается приобретением коммерческой IDS/IPS системы, обычно встраиваемой в брандмауэр и спокойно работающей на шлюзе в Инетернет или на одном из узлов локальной сети.

Однако, с ростом сети появляется желание установить специализированную систему обнаружения вторжений, например, Snort (бесплатный) или AMP (коммерческий), разместив ее на выделенном узле, поскольку, для установки того же AMP, администратор должен предоставить его поставщикам удаленный shell на свою машину, причем, AMP будет не только автоматом скачивать свежие сигнатуры из сети, но и отправлять весь подозрительный трафик для анализа на серверы компании Endeavor, которая и является его разработчиком.

Рисунок 5 Endeavor Active Malware Protection (AMP ) словила нового червя и отобразила его структуру в наглядном удобочитаемом виде

Доверие — это прекрасно, но отдавать свой трафик в чужие руки… Гм, нет, определенно, лучше размесить эту штуку на отдельном узле, отключенном от основной локальной сети, но запитанного от того же самого ISP, то есть, ловящего тех же вирусов и червей, что и основные узлы локальной сети. Можно ли использовать для этой цели виртуальную машину? Конечно! Главное надежно изолировать ее от корпоративной сети.

Наибольшую проблему представляют виртуальные сетевые карты, через которые гостевая операционная система легко доберется до основной. Следовательно, все виртуальные карты в обязательном порядке должны быть отключены. Но… если у нас нет сети, как же тогда общаться с внешним миром и ловить трафик?! Вариантов много. Вот только один из них — ADSL-модем с USB-интерфейсом, подключенный к виртуальной машине с выдернутой сетевой картой и заблокированными шарами.

Какую именно виртуальную машину следует использовать? VM Ware слишком известна и слишком дырява. BOCHS слишком медленно работает. Virtual PC неплохой выбор, но учитывая большое количество дыр в процессорах, его использование крайне небезопасно. Так что, реально остается только Sun Virtual Box, XEN или QEMU, хотя первый из них все еще достаточно сырой и до сих пор не отлаженный.

Рисунок 6 внешний вид эмулятора Sun Virtual Box

Вредоносная природа червей и вирусов вполне объяснима. Они как раз для этого и писались. Однако, честное программное обеспечение зачастую наносит намного больший урон. Взять хотя бы обновления безопасности или новые версии. Всем администраторам хорошо известно, что их установка зачастую приводит к трудноразрешимым конфликтам, потерям данным, а то и полному краху операционной системы.

Аналогичным образом дела обстоят с кручением настроек смысла которых администратор до конца не понимает и действует методом тыка. Одно неверное движение руки — и система отказывается загружаться, а чтобы поднять ее требуются знания и квалификация, вырабатываемые только в борьбе с вот такими взлетами и падениями. По книжкам многое не выучишь…

Здесь виртуальные машины просто незаменимы. Просто устанавливаем систему со всеми приложениями и сервисными службами на VM Ware или Microsoft Virtual PC и все новые заплатки, обновления, настройки в первую очередь обкатываем на гостевой операционной системе, наблюдая за ее реакцией. Если полет нормальный — переносим все изменения на основную машину. Если же нет — соображаем что здесь не так и где косяк.

Виртуальные машины открывают практически неограниченные возможности для экспериментов. Главное — правильно ими воспользоваться, предусмотрев максимум возможных побочных эффектов и разработав план по их устранению.

Существующие виртуальные машины предназначены для запуска честных приложений и чисто конструктивно не приспособлены для изоляции зловредного программного обеспечения, а потому использовать их в роли «песочницы» (своеобразного загона для вирусов) категорически не рекомендуется, а если и использовать, то только с кучей предосторожностей, описанных в настоящей статье.

Никакой, даже самый крутой руткит, не устоит против сравнения дисковых образом (за вычетом руткитов, обитающих исключительно в оперативной памяти и не вносящих в файловую систему никаких изменений). Проблема, однако, в том, что руткиты уже научились детектировать популярные виртуальные машины, отказываясь от вторжения в их присутствии. А потому, чем меньше известна виртуальная машина — тем лучше (для администратора) и хуже для руткита.