Безопасный браузер в виртуальной машине
Ожидает приглашения
Все наслышаны об опасности открывания случайных страниц на случайных сайтах, где могут скрываться различные зловреды в виде JavaScript, троянов, эксплойтов уязвимостей, и так далее.
И хотя браузеры в наше время довольно безопасны, все равно, с точки зрения ОС, браузер — это задача, которая запущена под твоим аккаунтом, с твоими правами. То есть она фактически имеет полный доступ к твоим файлам, включая документы, семейные фото, ключи шифрования. Есть ненулевая вероятность, что злоумышленники могут воспользоваться уязвимостями браузеров, плагинов, Java машины, и, например, зашифровать твои документы, а потом требовать выкуп.
Что делать? Запускать браузер в ВМ, как это сделал я. Далее под катом.
Я для себя решил так: на безопасные сайты — на сайты банков, gmail, и т.п. — я буду ходить обычным браузером. А вот для широкого поиска в интернете или посещения сайтов, которым я не очень доверяю, я буду запускать браузер в ВМ. В этой ВМ не должны храниться важные документы, ключи и т.п. И если она скомпроментирована, то ее всегда можно безжалостно уничтожить и создать новую.
Моя основная (хост) система:
ОС — Ubuntu Studio 14 LTE.
RAM: 16GB
CPU: Intel i7
SDD: 120GB для ОС
HDD: 500GB для редко используемых файлов.
Памяти и процессора мне хватает, и можно запустить довольно большую ВМ.
Я пробовал готовую ВМ ChromiumVM. Очень легкая и быстрая. Но Хром не поддерживает нужные мне видео плагины, и не выдавал звук, поэтому я от него отказался в пользу Lubuntu с Firefox.
Можно запускать браузер и в консоли ВМ, но я предпочел запускать его в окнах (X11) хоста. В этом случае окна ВМ-браузера не отличаются от других окон хоста, их можно двигать, менять размеры, закрывать и тп. При этом сама задача браузера работает в ВМ. На хост приходит только картинка и звук, с хоста в ВМ идут только клавиши и мышь.
Установка ВМ — обычная установка для линуксов. Сделать ее можно прямо из Менеджера Виртуальных Машин.
Для начала можно задать 2ГБ памяти и один ЦПУ. Диска хватит 6 ГБ.
Сетевую карту сконфигурировал NAT
Дисковые устройства и сетевая карта — VirtIO. Для производительности.
В качестве ОС я выбрал Lubuntu, из-за относительно легкого веса и достаточно широких возможностей. Основное мое требование было — поддержка Firefox и SSH.
Имя ВМ — VM, так же как и имя ОС в ней — vm.
Можно запускать X окна из ВМ на хосте и без SSH. Но с SSH проще. Не надо конфигурировать на хосте секьюрити для X11, заставлять X11 слушать TCP, и разрешать порт 6000 в фаерволле (если он есть).
Итак, в ВМ ставим и запускаем SSH сервис. Для соединения без ввода пароля на хосте создаем ключ (~/.ssh/id_rsa.pub), если еще не создан!
Копируем публичный ключ в ВМ и добавляем в «ключницу»:
Пробуем:
Пробуем браузер:
Самой большой проблемой оказалось конфигурирование звука. В Линуксе звук может идти через ALSA или OSS, поверх которых обычно стоит PulseAudio (и может JACK). Пользовательские программы обычно работают через PulseAudio. Firefox работает через него.
Вообще можно сделать так, что ВМ будет пропускать звук с виртуальной карты на физическую карту или в ALSA/PulseAudio хоста. Есть также установки для VNC и Spice чтобы они пропускали звук из ВМ в qemu на хосте. Но у меня ничего из этого не получилось сделать в течении получаса.
Я пошел более простым путем — пустил звук через сеть с помощью PulseAudio. К счастью PulseAudio может работать через TCP/IP сеть.
PulseAudio (ПА) надо заставить стать сетевым сервером.
В файл ~/.pulse/default.pa добавляем:
После перезапуска ПА:
Проверяем, слушает ли ПА TCP порт 4713:
Должно вернуть нечто вроде:
Все. ПА сервер работает.
! Если на хосте есть фаервол, то убедитесь, что порт 4713 разрешен для подсетки ВМ.
Чтобы ПА клиент с ВМ мог присоединиться к ПА серверу на хосте, надо скопировать ему куки с сервера. На хосте исполняем:
Проверяем:
Если слышно, значит ПА работает.
Проверяем браузер:
Если видно и слышно, значит все работает.
На хосте делаем скрипт MySafeBrowser.sh, содержащий 2 строчки:
Всё! Осталось добавить этот скрипт как иконку на десктоп.
И хотя браузеры в наше время довольно безопасны, все равно, с точки зрения ОС, браузер — это задача, которая запущена под твоим аккаунтом, с твоими правами. То есть она фактически имеет полный доступ к твоим файлам, включая документы, семейные фото, ключи шифрования. Есть ненулевая вероятность, что злоумышленники могут воспользоваться уязвимостями браузеров, плагинов, Java машины, и, например, зашифровать твои документы, а потом требовать выкуп.
Что делать? Запускать браузер в ВМ, как это сделал я. Далее под катом.
Я для себя решил так: на безопасные сайты — на сайты банков, gmail, и т.п. — я буду ходить обычным браузером. А вот для широкого поиска в интернете или посещения сайтов, которым я не очень доверяю, я буду запускать браузер в ВМ. В этой ВМ не должны храниться важные документы, ключи и т.п. И если она скомпроментирована, то ее всегда можно безжалостно уничтожить и создать новую.
Моя основная (хост) система:
ОС — Ubuntu Studio 14 LTE.
RAM: 16GB
CPU: Intel i7
SDD: 120GB для ОС
HDD: 500GB для редко используемых файлов.
Памяти и процессора мне хватает, и можно запустить довольно большую ВМ.
Я пробовал готовую ВМ ChromiumVM. Очень легкая и быстрая. Но Хром не поддерживает нужные мне видео плагины, и не выдавал звук, поэтому я от него отказался в пользу Lubuntu с Firefox.
Можно запускать браузер и в консоли ВМ, но я предпочел запускать его в окнах (X11) хоста. В этом случае окна ВМ-браузера не отличаются от других окон хоста, их можно двигать, менять размеры, закрывать и тп. При этом сама задача браузера работает в ВМ. На хост приходит только картинка и звук, с хоста в ВМ идут только клавиши и мышь.
Установка ВМ
Установка ВМ — обычная установка для линуксов. Сделать ее можно прямо из Менеджера Виртуальных Машин.
Для начала можно задать 2ГБ памяти и один ЦПУ. Диска хватит 6 ГБ.
Сетевую карту сконфигурировал NAT
Дисковые устройства и сетевая карта — VirtIO. Для производительности.
В качестве ОС я выбрал Lubuntu, из-за относительно легкого веса и достаточно широких возможностей. Основное мое требование было — поддержка Firefox и SSH.
Имя ВМ — VM, так же как и имя ОС в ней — vm.
Конфигурирование X11 и SSH
Можно запускать X окна из ВМ на хосте и без SSH. Но с SSH проще. Не надо конфигурировать на хосте секьюрити для X11, заставлять X11 слушать TCP, и разрешать порт 6000 в фаерволле (если он есть).
Итак, в ВМ ставим и запускаем SSH сервис. Для соединения без ввода пароля на хосте создаем ключ (~/.ssh/id_rsa.pub), если еще не создан!
user@host: ssh-keygen
Копируем публичный ключ в ВМ и добавляем в «ключницу»:
user@host: scp ~/.ssh/id_rsa.pub user@vm:~/host_user_rsa.pub
user@vm: cat ~/host_user_rsa.pub >> ~/.ssh/authorized_keys
Пробуем:
user@host: ssh -X user@vm xclock
Пробуем браузер:
user@host: ssh -Y user@vm firefox &
Конфигурирование звука
Самой большой проблемой оказалось конфигурирование звука. В Линуксе звук может идти через ALSA или OSS, поверх которых обычно стоит PulseAudio (и может JACK). Пользовательские программы обычно работают через PulseAudio. Firefox работает через него.
Вообще можно сделать так, что ВМ будет пропускать звук с виртуальной карты на физическую карту или в ALSA/PulseAudio хоста. Есть также установки для VNC и Spice чтобы они пропускали звук из ВМ в qemu на хосте. Но у меня ничего из этого не получилось сделать в течении получаса.
Я пошел более простым путем — пустил звук через сеть с помощью PulseAudio. К счастью PulseAudio может работать через TCP/IP сеть.
Конфигурация PulseAudio на хосте
PulseAudio (ПА) надо заставить стать сетевым сервером.
В файл ~/.pulse/default.pa добавляем:
load-module module-native-protocol-tcp
load-module module-x11-publish
После перезапуска ПА:
user@host: killall pulseaudio
user@host: pulseaudio
Проверяем, слушает ли ПА TCP порт 4713:
user@host: xprop -root | grep PULSE_SERVER
Должно вернуть нечто вроде:
PULSE_SERVER(STRING) = "{32615b6567257d71581bac8751245653}unix:/run/user/1000/pulse/native tcp:host.localhost:4713 tcp6:host.localhost:4713"
Все. ПА сервер работает.
! Если на хосте есть фаервол, то убедитесь, что порт 4713 разрешен для подсетки ВМ.
Конфигурация PulseAudio на ВМ
Чтобы ПА клиент с ВМ мог присоединиться к ПА серверу на хосте, надо скопировать ему куки с сервера. На хосте исполняем:
user@host: scp ~/.config/pulse/cookie user@vm:~/.config/pulse/cookie
Проверяем:
user@host: ssh -Y user@vm -R 4713:localhost:4713 "PULSE_SERVER=localhost paplay /usr/share/sounds/alsa/Front_Center.wav"
Если слышно, значит ПА работает.
Проверяем браузер:
user@host: ssh -Y user@vm -R 4713:localhost:4713 "PULSE_SERVER=localhost firefox http://www.youtube.com"
Если видно и слышно, значит все работает.
Конфигурация автозапуска ВМ и браузера в ней
На хосте делаем скрипт MySafeBrowser.sh, содержащий 2 строчки:
virsh start VM
ssh -Y user@vm -R 4713:localhost:4713 "PULSE_SERVER=localhost firefox"
Всё! Осталось добавить этот скрипт как иконку на десктоп.