ХАКЕР 04 /171/ 2013 Подушка безопасности 119GRUB И BTRFSСкорее всего, при загрузке с раздела Btrfs Grub будетругаться, что-де разреженные файлы недопустимы,и просить нажать любую клавишу. Чтобы это сообщениене выскакивало, открой в любимом текстовомредакторе файл /etc/grub.d/00.header и закомментируйтам следующую строчку:1. Все необходимые для работы запускаемой программы приложенияи библиотеки ты определяешь сам. Это наиболеегибкий способ, но и наиболее замороченный.2. Chroot-окружение формируется динамически. Одно времясуществовал проект Isolate, который это и делал, но нынчепо неизвестным причинам он канул в Лету.3. Развертывание базовой системы в указанном каталогеи чрутинг на него — его я и опишу.Для начала установим пакет debootstrap, который используетсякак раз с этой целью.$ sudo apt-get install debootstrapЗатем создадим каталог, в котором будет находиться chroot,и развернем базовую систему quantal в нем. В общем-то, егоможно создать где угодно, но традиционное место его размещения— /var/chroot. Поскольку большинство следующих командтребуют права root, имеет смысл переключиться на аккаунтсуперпользователя:$ sudo su -# mkdir /var/chroot && cd /var/chroot# debootstrap quantal ./quantal-chr1http://mirror.yandex.ru/ubuntuРазберем последнюю команду. Она разворачивает релизубунты Quantal в отдельный каталог quantal-chr1 (мало ли, вдругпонадобится еще один chroot) с ближайшего зеркала. Послезавершения развертывания необходимо отобразить файловыесистемы procfs, sysfs и (если это необходимо) каталог /devна данное поддерево. В случае если chroot будет использоватьсядля текстовых приложений только до перезагрузки, должнохватить следующих команд:Огнелис в песочнице— об этом говоритзаголовокINFOКоманды Btrfs имеютстандартный и сокращенныйвид. Например,команду «btrfs subvolumesnapshot» можно записатькак «btrfs su sn».Сравнение скоростикомпиляции на ext4и на Btrfsif [ -n "\${have_grubenv}" ]; then if [ -z"\${boot_once}" ]; then save_env recordfailfi; fiСобственно, переменная recordfail необходима,чтобы предотвратить циклическую перезагрузку,для чего она при старте взводится, а затем, в случаеуспешной загрузки, устанавливается в 0. Хоть комментироватькод, отвечающий за эту процедуру, инежелательно, но думаю, что на настольной системевполне можно обойтись и без него.# mount --bind /proc /var/chroot/quantal-chr1/proc# mount --bind /sys /var/chroot/quantal-chr1/sys# mount --bind /dev /var/chroot/quantal-chr1/devЕсли же требуется, чтобы данное поддерево работало и послеперезагрузки, добавь соответствующие строки в /etc/fstab.Ну а для работы некоторых графических приложений такжеследует отобразить каталоги /tmp и /var/run/dbus. После этогоуже можно вводить следующую команду, которая, собственно,и делает chroot:# chroot /var/chroot/quantal-chr1/И ты уже заперт в нем. Для того чтобы не спутать chroot с реальнойсистемой, рекомендую изменить приглашение оболочки.Для примера давай установим и запустим в chroot Skype.Для этого потребуется установить на хостовой системе пакетschroot, который позволяет упростить запуск программв chroot-окружении:# apt-get install schrootЗатем добавим запись в файл /etc/schroot/schroot.conf.В моем случае я добавил следующую:/etc/schroot/schroot.conf[quantal-skype]description=Quantal Skypedirectory=/var/chroot/quantal-chr1priority=3users=romgroups=romroot-groups=root,romПробрасываем /dev, /proc, /sys, /tmp и /var/run/dbus —как это сделать, смотри выше. Добавим в chroot пользователяи группу skype — при этом желательно, чтобы uid и gid совпадалис uid/gid основного пользователя реальной системы (в моемслучае — rom), для чего набираем следующие команды:
120 UnixoidХАКЕР 04 /171/ 2013ОПЦИИ КОМАНДНОЙ СТРОКИ ARKOSE# schroot -c quantal-skype -u root# addgroup --gid 1000 skype# adduser --disabled-password --force --uid 1000--gid 1000 skypeПосле этого ставим свежескачанный Skype — опять жев chroot — и удовлетворяем его зависимости:# dpkg --force-all -iskype-ubuntu-precise_4.1.0.20-1_i386.deb# apt-get -f install# exitВ основной системе разрешаем соединения с X-серверомс localhost и заходим в chroot как обычный пользователь:$ xhost +localhost$ cd / && schroot -c quantal-skype -u rom /bin/bashУстанавливаем переменную DISPLAY (которую надо посмотретьв основной системе) и запускаем Skype:$ export DISPLAY=":0.0"$ skype --dbpath=/home/skype/.Skype &Скайп успешно установлен и запущен в chroot-окружении.Можно было бы написать скрипт для облегчения запуска,но это ты можешь сделать и сам.ИСПОЛЬЗОВАНИЕ ARKOSEArkose действует аналогично песочницам в Windows, таким,например, как Sandboxie. Практически это удобная оберткадля контейнеров LXC. Но, как известно, удобство и гибкостьпорой несовместимы — тонкая настройка создаваемых контейнеровзатруднительна. Из плюсов отмечу интуитивно понятныйинтерфейс (это если использовать GUI — впрочем,запуск из командной строки тоже очень прост), из минусовже — по умолчанию требует довольно много свободного местана жестком диске и имеются некоторые возможные пути обхода;но, если использовать Arkose как дополнительную оберткудля потенциальных путей внедрения малвари (браузер) илидаже просто для экспериментов с каким-нибудь интереснымОткат на снапшот BtrfsWWWhttps://btrfs.wiki.kernel.org— wiki по Btrfs.www.palecrow.com/chroot-jail-paper.html— пример запускадемона в chrootокружении.Несколькоустарело, однакообщие принципыостались те же.Развертывание в chrootбазовой системы с помощьюdebootstrap• n {none,direct,filtered} — отображение сети на песочницу.Опции none и direct не требуют пояснения, filtered создаетдля каждой песочницы свой интерфейс. На практике желучше использовать либо none, либо direct, посколькуfiltered настраивать достаточно долго.• d {none,system,session,both} — доступ к шинам D-Bus из песочницы.• s размер — устанавливает размер хранилища в мегабайтах.По умолчанию 2000 Мб для ext4 или половина памятидля tmpfs. После завершения работы запускаемой в песочницепрограммы хранилище уничтожается.• t [ext4,tmpfs] — тип файловой системы хранилища. По дефолтуиспользуется ext4.• root каталог — указывает каталог, который отображаетсяна песочницу в качестве корня.• root-type {cow,bind} — как именно отображать корень. Еслииспользовать cow, то любые изменения после закрытияпесочницы пропадут, а если bind — сохранятся.• base-path — указывает место хранения песочницы.По умолчанию это ~/.arkose.• bind каталог и --cow каталог — отображает каталог либо в режимеcow, либо напрямую. Естественно, использованиетой или иной опции зависит от типа отображения корня —использовать опцию --cow на каталоге, который и так ужеcopy-on-write, не имеет смысла.• h — использовать реальный домашний каталог. Действуетаналогично --bind $HOME.• p — разрешает использовать PulseAudio.приложением, это никак не повредит. Перед тем как использоватьArkose, его надо установить. Процедура стандартна:$ sudo apt-get install arkose-guiБудет установлен как графический интерфейс (arkose-gui),так и утилита командной строки (arkose). Графический интерфейснастолько прост, что описывать его я смысла не вижу, лучшесразу перейдем к практике. Для примера запустим Firefox:$ sudo arkose -n direct -p firefoxДанная команда запустит Firefox с доступом к сетии к PulseAudio. Поскольку для каждого вновь создаваемогоконтейнера по умолчанию создается свой домашний каталог,то и профиль огнелиса будет новый, без установленных до-SECCOMP И SECCOMP-BPFSeccomp — малоизвестный механизм, внедренныйеще в ядро 2.6.12, который позволяет процессу совершитьодносторонний переход в «безопасное» состояние,где ему будет доступно только четыре системныхвызова — exit(), sigreturn(), read() и write(), причем последниедва доступны только для уже открытых файлов.Если же процесс попытается вызвать любой другойсисколл, он будет немедленно убит.Очевидно, что это решение не очень гибкое. В связис этим в ядре 3.5 появился seccomp-bpf, которыйпозволяет с помощью правил BPF тонко настраивать,какие именно системные вызовы (и их аргументы)разрешены, а какие — нет. Seccomp-bpf применяетсяв Google Chrome, Chrome OS, а также бэкпортированв Ubuntu 12.04.