
Kali Linux VM 이미지 빌드 스크립트
이것은 Kali Linux 가상 머신(VM) 이미지를 생성하기 위한 빌드 스크립트입니다.
현재 두 가지 빌드 방법이 가능합니다:
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 그룹의 구성원이어야 합니다.
다음과 같이 확인할 수 있습니다:
$ # Not apart of the group
$ grep kvm /etc/group
kvm:x:104:
$
$ # In the group
$ 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는 위의 KVM과 마찬가지로 사용자가 Docker 그룹에 추가되어야 하거나 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
기본 옵션은 AMD64 아키텍처용 Kali rolling 이미지, 기본 데스크톱 및 기본 툴셋을 빌드합니다.
이것은 raw 디스크 이미지, 즉 디스크의 단순 바이너리 이미지입니다(QEMU로 시작할 수 있습니다).
예:
$ ./build.sh
VMware에 맞춤화된 Kali Linux 이미지를 빌드하려면: 즉, Open VM Tools가 사전 설치된 상태로 제공되며, 생성된 이미지는 VMware에 "있는 그대로" 가져올 준비가 되어 있습니다.
또한 Kali의 마지막 안정 릴리스에서 빌드할 것이며, 일반적인 기본값인 Xfce 대신 GNOME을 데스크톱 환경으로 사용하겠습니다:
./build.sh -v vmware -b kali-last-snapshot -D gnome
VirtualBox용으로 설계된 Kali Linux 이미지를 빌드하려면: VirtualBox 게스트 유틸리티가 사전 설치된 상태로 제공되며, 이미지는 VirtualBox에 "있는 그대로" 가져올 수 있습니다.
또한 150GB 가상 디스크를 원하며, "everything" 툴 선택 항목을 설치하겠습니다:
./build.sh -v virtualbox -s 150 -S everything
데스크톱 환경과 기본 툴셋이 없는 경량 Kali 이미지를 빌드하려면: 이것은 일반(generic) 이미지로, 대부분의 VM 엔진에 대한 지원이 포함되어 있습니다. VMware와 VirtualBox 모두에 적합한 OVA 형식으로 내보내겠습니다.
-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를 시작점으로 재사용하여 이미지를 빌드합니다.
아래 예제에서는 먼저 kali-rolling rootfs를 빌드한 다음, 일련의 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 키보드 레이아웃에는 us, 독일 키보드 레이아웃에는 de를 설정하는 식입니다.
더 자세한 설명과 예제는 keyboard(5) 매뉴얼 페이지에서 확인할 수 있습니다.
지원되는 값 목록은 /usr/share/X11/xkb/rules/xorg.lst 파일(Debian 및 Debian 계열 시스템의 xkb-data 패키지에서 제공)을 참조할 수 있습니다.
이 파일에는 각 설정에서 가능한 값을 나열하는 여러 섹션(! layout, ! model, !variant, !option)이 있습니다.
cat /etc/default/keyboard로 시스템에 구성된 내용을 확인할 수도 있습니다.
호스트 시스템(즉, /etc/default/keyboard 파일에 설정된 값)과 일치시키는 -K same 단축키도 있습니다.
로케일을 설정하려면 -L 옵션을 사용하세요.
/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 이미지를 실행하려는 VM 엔진에 따라 다양한 이미지 변형을 빌드할 수 있습니다. VARIANT는 주로 특정 VM 엔진에 대한 지원을 추가하기 위해 이미지에 설치할 추가 패키지를 정의합니다. 그런 다음 FORMAT은 가상 디스크의 형식과 생성할 추가 메타데이터 파일을 정의합니다.
설정하지 않으면 형식(-f 옵션)은 변형(-v 옵션)에 따라 자동으로 설정됩니다.
변형과 형식의 모든 조합이 의미 있는 것은 아니므로, 아래 표는 가장 일반적인 조합을 요약한 것입니다.
| 변형 | 형식 | 디스크 형식 | 메타데이터 | 패키징 |
|---|---|---|---|---|
| generic | raw | raw (sparse file) | none | |
| generic | ova | streamOptimized VMDK | OVF | OVA |
| generic | ovf | monolithicSparse VMDK | OVF | |
| qemu | qemu | QCOW2 | none | |
| virtualbox | virtualbox | VDI | VBOX | |
| vmware | vmware | 2GbMaxExtentSparse VMDK | VMX |
generic 이미지에는 QEMU, VirtualBox, VMware용 가상화 지원 패키지가 사전 설치되어 있어 "generic"이라는 이름이 붙었습니다.
반면 특정 VM 엔진을 대상으로 하는 다른 이미지는 해당 특정 가상화 엔진에 대한 지원만 포함합니다.
ova 형식만 컨테이너를 정의합니다: 빌드 결과는 단순히 tar 아카이브인 .ova 파일입니다.
다른 형식의 경우 빌드는 별도의 파일들을 생성합니다.
-z 옵션을 사용하여 7z 아카이브로 함께 묶을 수 있습니다.
rootfs 유형도 있습니다: 이것은 이미지가 아닙니다.
커널과 부트로더가 없는 Kali Linux 루트 파일시스템 트리일 뿐이며, .tar.gz 아카이브로 패킹되어 있습니다.
주요 사용 사례는 OS 이미지를 빌드하기 위한 입력으로 재사용하는 것이며, 빌드 시스템 외부에서 사용하기 위한 것이 아닙니다.
OS 이미지를 빌드할 때는 인터넷에서 모든 패키지를 반복해서 다운로드하지 않도록 캐싱 메커니즘을 갖추는 것이 유용합니다.
이를 위해 빌드 스크립트는 로컬 호스트에서 실행 중일 수 있는 알려진 캐싱 프록시를 감지하려고 시도합니다.
먼저 로컬 APT 구성 Acquire::http::Proxy를 참조합니다.
설정되어 있지 않으면, 기본 포트에서 서비스가 수신 대기 중인지 확인하여 apt-cacher-ng 및 squid-deb-proxy를 감지하려고 시도합니다.
이 메커니즘은 잘 알려진 APT 캐싱 프록시인 approx에는 작동하지 않습니다. approx는 필요 시 자동으로 시작되기 때문입니다.
이 감지를 재정의하려면 환경 변수 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도 참조하세요.
또는 로컬 미러를 설정할 수 있습니다.
빌드를 두 단계로 나눌 수 있습니다.
먼저 ./build.sh -v rootfs로 rootfs를 빌드한 다음, ./build.sh -r ROOTFS_NAME.tar.gz로 이 rootfs를 기반으로 이미지를 빌드할 수 있습니다.
예를 들어, 여러 이미지 유형을 빌드할 계획이라면 유용합니다.
스크래치 영역이 가득 차면(즉, --scratchsize 값이 너무 낮으면) 빌드가 다음과 같은 종류의 오류 메시지와 함께 실패할 수 있습니다:
[...]: failed to write (No space left on device)
[...]: Cannot write: No space left on device
해결 방법: --scratchsize 값을 높이세요.
특수 문자 -- 뒤에 debos에 인수를 전달할 수 있습니다. 예를 들어 50G가 필요하다면 ./build.sh [...] -- --scratchsize=50G를 실행하면 됩니다.
빌드 실패를 디버깅할 때, 빌드가 수행되는 VM 내부의 셸로 진입하게 되는 것이 편리합니다.
debos에 --debug-shell 옵션을 전달하면 가능합니다: ./build.sh [...] -- --debug-shell.
알려진 문제입니다. 해결 방법은 https://gitlab.com/kalilinux/build-scripts/kali-vm/-/work_items/25#note_1301070132를 참조하세요.