
# Скрипт сборки образов виртуальных машин Kali Linux
Это скрипт сборки для создания образов виртуальных машин (VM) Kali Linux.
В настоящее время возможны два метода сборки:
build.sh — сборка прямо с вашей машиныbuild-in-container.sh — сборка из контейнера (Docker или Podman)В любом случае, сборка фактически происходит внутри виртуальной машины, создаваемой на лету инструментом сборки debos. Debos использует fakemachine под капотом, который, в свою очередь, полагается на QEMU/KVM.
Убедитесь, что git-репозиторий клонирован локально:
$ sudo apt install -y git
$ git clone https://gitlab.com/kalilinux/build-scripts/kali-vm.git
$ cd kali-vm/
Из-за требований QEMU/KVM вы должны быть частью группы kvm.
Вы можете проверить это так:
$ # Не в группе
$ grep kvm /etc/group
kvm:x:104:
$
$ # В группе
$ grep kvm /etc/group
kvm:x:104:kali
Если ваше имя пользователя не появляется в возвращённой строке, это означает, что вы не в группе, и вы должны добавить себя в группу kvm:
$ sudo adduser $USER kvm
Затем выйдите из системы и войдите снова, чтобы изменение вступило в силу.
Если вы собираете прямо со своей машины, используя build.sh, вам нужно установить debos:
$ sudo apt install -y 7zip debos dosfstools qemu-utils zerofree
Затем используйте скрипт build.sh, чтобы собрать образ VM непосредственно на вашей машине.
Если вы предпочитаете собирать из контейнера, вам нужно установить и настроить docker или podman на вашей машине.
Затем используйте скрипт build-in-container.sh, чтобы собрать образ.
build-in-container.sh — это просто обёртка поверх build.sh.
Он определяет, какой OCI-совместимый контейнерный движок использовать, заботится о создании образа контейнера, если он отсутствует, и, наконец, запускает контейнер для выполнения сборки изнутри.
docker требует добавления пользователя в группу Docker, как и в случае с KVM выше, или использования учётной записи root (например, $ sudo ./build-in-container.sh).
podman был протестирован как в rootful (например, $ sudo ./build-in-container.sh), так и в rootless (например, $ ./build-in-container.sh) режимах.
Используйте либо build.sh, либо build-in-container.sh, по вашему усмотрению.
С этого момента для краткости мы будем использовать build.sh.
Лучшая отправная точка, как всегда, — сообщение об использовании:
$ ./build.sh -h
Usage: build.sh <options> [-- <debos options>]
Build a Kali Linux VM image
Build options:
-a ARCH Build an image for this architecture, default: amd64
Supported values: amd64
-b BRANCH Kali branch used to build the image, default: kali-rolling
Supported values: kali-dev kali-last-snapshot kali-rolling
-f FORMAT Format to export the image to, default depends on the VARIANT
Supported values: hyperv ova ovf qemu raw vagrant virtualbox vmware
-k Keep raw disk image and other intermediary build artifacts
-m MIRROR Mirror used to build the image, default: http://http.kali.org/kali
-r ROOTFS rootfs to use to build the image, default: none
-s SIZE Size of the disk image in GB, default: 86
-v VARIANT Variant of image to build (see below for details), default: generic
Supported values: generic hyperv qemu rootfs virtualbox vmware
-x VERSION What to name the image release as, default: rolling
-z Zip images and metadata files after the build
Customization options:
-D DESKTOP Desktop environment installed in the image, default: xfce
Supported values: e17 gnome i3 kde lxde mate xfce none
-H HOSTNAME Set system host name, default: kali
-K KEYBOARD Set keyboard layout, default: us
Refer to the README.md for more details
-L LOCALE Set locale, default: en_US.UTF-8
-P PACKAGES Install extra packages (comma/space separated list)
-T TOOLSET The selection of tools to include in the image, default: default
Supported values: default everything headless large none
-U USERPASS Username and password, separated by a colon, default: kali:kali
-Z TIMEZONE Set timezone, default: America/New_York
The different variants of images are:
generic Image with all virtualization support pre-installed, default format: raw
hyperv Image pre-configured for Hyper-V "Enhanced Session Mode", default format: hyperv
qemu Image with QEMU and SPICE guest agents pre-installed, default format: qemu
rootfs Not an image, a root filesystem (no bootloader/kernel), packed in a .tar.gz
virtualbox Image with VirtualBox guest utilities pre-installed, default format: virtualbox
vmware Image with Open VM Tools pre-installed, default format: vmware
The different formats are:
hyperv VHDX disk image, powershell install scripts
ova streamOptimized VMDK disk image, OVF metadata file, packed in a OVA archive
ovf monolithicSparse VMDK disk image, OVF metadata file
qemu QCOW2 disk image, no metadata
raw sparse disk image, no metadata
virtualbox VDI disk image, .vbox metadata file
vmware 2GbMaxExtentSparse VMDK disk image, VMX metadata file
Supported environment variables:
http_proxy HTTP proxy URL, refer to the README.md for more details
Most useful debos options:
--artifactdir DIR Set artifact directory, default: images
--memory, -m SIZE Limit amount of memory to build VM in GB, default: 4G
--scratchsize SIZE Limit amount of HDD to build VM in GB, default: 45G
--debug-shell Get a shell on the VM
--help, -h See the complete list of options for debos
Refer to the README.md for examples
Параметры по умолчанию соберут образ Kali rolling, с окружением рабочего стола по умолчанию и набором инструментов по умолчанию для архитектуры AMD64.
Это образ сырого диска, т.е. обычный бинарный образ диска (который можно запустить с помощью QEMU).
Пример:
$ ./build.sh
Чтобы собрать образ Kali Linux, предназначенный для VMware. Это означает, что в нём предустановлены Open VM Tools, и полученный образ готов к импорту «как есть» в VMware.
Кроме того, мы собираем его из последнего стабильного выпуска Kali, и будем использовать GNOME в качестве окружения рабочего стола, вместо обычного стандартного Xfce:
./build.sh -v vmware -b kali-last-snapshot -D gnome
Чтобы собрать образ Kali Linux, предназначенный для VirtualBox. В нём предустановлены гостевые утилиты VirtualBox, и образ можно импортировать «как есть» в VirtualBox.
Кроме того, нам нужен виртуальный диск на 150 ГБ, и мы установим выбор инструментов «everything»:
./build.sh -v virtualbox -s 150 -S everything
Чтобы собрать лёгкий образ Kali, в котором нет окружения рабочего стола и стандартного набора инструментов. Это универсальный образ, он поставляется с поддержкой большинства механизмов виртуальных машин. Мы экспортируем его в формат OVA, подходящий как для VMware, так и для VirtualBox.
Вы можете установить дополнительные пакеты с помощью опции -P.
Либо используйте опцию несколько раз (например, -P pkg1 -P pkg2 ...), либо укажите значение, разделённое запятыми/пробелами (например, -P "pkg1,pkg2, pkg3 pkg4"), либо комбинацию того и другого.
Давайте также установим пакет metasploit-framework:
./build.sh -v generic -f ova -D headless -P metasploit-framework
При сборке серии образов может быть удобнее (и быстрее) разделить сборку на две части: сначала собрать rootfs, а затем собрать образы, повторно используя этот rootfs в качестве отправной точки.
В примере ниже мы сначала собрали rootfs kali-rolling, а затем собрали серию образов Vagrant:
./build.sh -b kali-rolling -v rootfs
./build.sh -r images/rootfs-rolling-amd64.tar.gz -f vagrant -v hyperv
./build.sh -r images/rootfs-rolling-amd64.tar.gz -f vagrant -v qemu
./build.sh -r images/rootfs-rolling-amd64.tar.gz -f vagrant -v virtualbox
./build.sh -r images/rootfs-rolling-amd64.tar.gz -f vagrant -v vmware
Чтобы задать настройки клавиатуры, используйте опцию -K.
Настройка имеет вид <layouts>/<models>/<variants>/<options>. Каждый параметр может быть опущен (в этом случае используется значение по умолчанию) или может иметь несколько значений, разделённых запятыми. В самом простом случае вы можете просто изменить раскладку клавиатуры, поэтому вы установите us для американской раскладки, de для немецкой раскладки и так далее. Более подробные объяснения и примеры можно найти на странице руководства keyboard(5).
Со списком поддерживаемых значений вы можете ознакомиться в файле /usr/share/X11/xkb/rules/xorg.lst (предоставляется пакетом xkb-data в Debian и Debian-подобных системах). Этот файл содержит различные разделы (! layout, ! model, !variant и !option), в которых перечислены возможные значения для каждого параметра.
Вы также можете проверить, что настроено в вашей системе, с помощью cat /etc/default/keyboard.
Существует также сокращение -K same, чтобы соответствовать хост-системе (т.е. тому, что указано в файле /etc/default/keyboard).
Чтобы задать локаль, используйте опцию -L.
Выберите значение в 1-м столбце файла /usr/share/i18n/SUPPORTED или проверьте, что настроено в вашей системе, с помощью grep -v ^# /etc/locale.gen, или просто echo $LANG.
Также существует сокращение -L same, чтобы соответствовать хост-системе.
Чтобы задать часовой пояс, используйте опцию -Z.
Загляните в /usr/share/zoneinfo и выберите каталог и подкаталог.
При сомнениях запустите tzselect, который вам подскажет, или посмотрите, что настроено в вашей системе, с помощью realpath /etc/localtime.
Также существует сокращение -Z same, чтобы соответствовать хост-системе.
Чтобы задать имя и пароль непривилегированного пользователя, используйте опцию -U.
Значение представляет собой одну строку, а символ : используется для разделения имени пользователя и пароля.
Здесь мы соберём образ Kali и настроим его так, чтобы он имитировал хост-систему: та же локаль, тот же часовой пояс и то же имя пользователя (с паролем password):
./build.sh -K same -L same -Z same -U $USER:password
Можно собрать различные варианты образа, в зависимости от того, в каком механизме виртуализации вы хотите запускать образ Kali. Вариант (VARIANT) в основном определяет, какой дополнительный пакет будет установлен в образ для добавления поддержки конкретного механизма виртуализации. Затем формат (FORMAT) определяет, в каком формате будет виртуальный диск и какие дополнительные файлы метаданных будут созданы.
Если не задано, формат (опция -f) автоматически устанавливается в соответствии с вариантом (опция -v).
Не каждая комбинация варианта и формата имеет смысл, поэтому приведённая ниже таблица пытается обобщить наиболее распространённые комбинации.
| вариант | формат | формат диска | метаданные | упаковка |
|---|---|---|---|---|
| generic | raw | raw (разреженный файл) | нет | |
| generic | ova | streamOptimized VMDK | OVF | OVA |
| generic | ovf | monolithicSparse VMDK | OVF | |
| qemu | qemu | QCOW2 | нет | |
| virtualbox | virtualbox | VDI | VBOX | |
| vmware | vmware | 2GbMaxExtentSparse VMDK | VMX |
Образы generic поставляются с предустановленными пакетами поддержки виртуализации для QEMU, VirtualBox и VMware, отсюда и название «generic» (универсальный).
В то время как другие образы, предназначенные для конкретного механизма виртуализации, содержат поддержку только этого конкретного механизма.
Только формат ova определяет контейнер: результатом сборки является файл .ova, который представляет собой просто tar-архив.
Для других форматов сборка создаёт отдельные файлы.
Их можно объединить в 7z-архив с помощью опции -z.
Существует также тип rootfs: это не образ.
Это просто дерево корневой файловой системы Kali Linux, без ядра и загрузчика, упакованное в архив .tar.gz.
Основной вариант использования — повторное использование в качестве входных данных для сборки образа ОС, и он не предназначен для использования вне системы сборки.
При сборке образов ОС полезно иметь механизм кэширования, чтобы избежать повторной загрузки всех пакетов из Интернета.
Для этого скрипт сборки пытается обнаружить известные кэширующие прокси, которые могут работать на локальном хосте. Сначала он обращается к локальной конфигурации APT Acquire::http::Proxy. Если она не задана, он пытается обнаружить apt-cacher-ng и squid-deb-proxy, проверяя, прослушивает ли служба их порт по умолчанию. Этот механизм не работает для approx (известного кэширующего прокси APT), так как он автоматически запускается по требованию.
Чтобы переопределить это обнаружение, вы можете самостоятельно экспортировать переменную окружения http_proxy.
Однако следует помнить, что сборка происходит внутри виртуальной машины QEMU, поэтому localhost в среде сборки относится к VM, а не к хосту.
Если вы хотите получить доступ к хосту из VM, вам, вероятно, следует использовать http://10.0.2.2.
Например, если вы хотите использовать прокси, работающий на вашей машине на порту 9876, используйте: export http_proxy=http://10.0.2.2:9876.
Если вы хотите убедиться, что прокси не используется, используйте: export http_proxy=.
Также обратитесь к https://github.com/go-debos/debos#environment-variables для получения более подробной информации.
Кроме того, вы можете настроить локальное зеркало.
Возможно разбить сборку на два этапа.
Вы можете сначала собрать rootfs с помощью ./build.sh -v rootfs, а затем собрать образ на основе этого rootfs с помощью ./build.sh -r ROOTFS_NAME.tar.gz.
Это имеет смысл, если вы планируете собрать несколько типов образов, например.
Когда временная область заполняется (т.е. значение --scratchsize слишком мало), сборка может завершиться ошибкой с сообщениями такого рода:
[...]: failed to write (No space left on device)
[...]: Cannot write: No space left on device
Решение: увеличьте значение --scratchsize.
Вы можете передавать аргументы debos после специального символа --, поэтому, если вам нужно, например, 50G, вы можете выполнить ./build.sh [...] -- --scratchsize=50G.
При отладке сбоев сборки удобно получить shell внутри VM, где происходит сборка.
Это возможно, если передать опцию --debug-shell в debos: ./build.sh [...] -- --debug-shell.
Это известная проблема, обратитесь к https://gitlab.com/kalilinux/build-scripts/kali-vm/-/work_items/25#note_1301070132 за обходным путём.