
仮想マシン操作フレームワーク
Mofosは、仮想マシンの作成、実行、管理を目的としたツールです。Libvirt/QEMU/KVMとPythonを利用しており、あらゆるLinuxディストリビューションと互換性があります。Qubes OS(https://www.qubes-os.org/)から強い影響を受けており、Mofosはその機能の多くを再現することを目指しています。
このツールはDebian上で、Debianベースの仮想マシンを使用して広範囲にテストされています。他のLinuxディストリビューションでも動作する見込みですが、追加の設定が必要になる場合があります。詳細は追って追加されます。
Mofosは、仮想マシンを安全に管理することに重点を置いたさまざまな機能を提供します。その内容は次のとおりです。
mofosマシンは、overlayfsを使用して結合された2つのディスクで構成されます。最初のディスクは下位レイヤーと呼ばれる読み取り専用のテンプレートディスクで、2番目のディスクは仮想マシンによって行われたすべての変更を保存します。このテンプレートディスクは複数の仮想マシン間で共有されます。その結果、新しい仮想マシンの作成には、変更データを保持するために既にパーティション分割された空のディスクのクローンを作成するだけで済みます。このアプローチにより、新しい仮想マシンを迅速に作成できる一方、テンプレートは独立して更新できます。テンプレートへの更新は、依存する仮想マシンが次回再起動したときに反映されます。
Linuxディストリビューションに応じて、Makefileを使用してdebパッケージを生成するか、ファイルを直接インストールできます。```
make deb
apt install ./mofos-VERSION.deb
`apt` インストール中に、さまざまな設定がプロンプト表示されます。通常はデフォルトのオプションを受け入れて問題ありません。注意が必要な唯一の設定は、mofos libvirt ネットワークで使用されるサブネットアドレスです(デフォルト: `192.168.90.0/24`)。
または
次の依存関係をインストールします:
- guestfs-tools
- libnotify-bin
- libvirt
- libvirt-clients
- libvirt-daemon
- make
- python3-click
- python3-click-completion
- python3-colorama
- python3-cryptography
- python3-dbus
- python3-jinja2
- python3-lxml
- python3-prettytable
- python3-pyroute2
- python3-tqdm
- qemu-system-common
- qemu-system-modules-spice
- socat
- spice-client-gtk
- sudo
- virtinst
- virt-install
- virtiofsd
- virt-manager
- virt-viewer```
make install_files
ディストリビューションによっては、/usr/lib/python3/dist-packages にコピーした Python ファイルが Python インタプリタによって検出されない場合があり、別の場所に配置する必要があります。たとえば、Fedora では、Python ファイルを /usr/lib/python3.11/site-packages にコピーする必要があります。
[!WARNING] 注意: Debian trixie 以降、
xpraはパッケージとして提供されなくなりました。カスタムリポジトリから手動でインストールする必要があります。詳細な手順は https://github.com/Xpra-org/xpra/wiki/Download#-for-debian-based-distributions を参照してください。
Mofos は QEMU/KVM システムセッションを使用するため、virsh コマンドが仮想マシンおよび関連リソースにアクセスできるように、環境変数 LIBVIRT_DEFAULT_URI を qemu:///system に設定します。```console
export LIBVIRT_DEFAULT_URI=qemu:///system
### セキュリティ上の考慮事項
QEMU/KVM システムセッションを使用すると、qemu インスタンスを専用ユーザー (`libvirt-qemu`) で実行し、各インスタンスに固有のセキュリティプロファイルを適用することで、ホストとゲスト仮想マシン間の分離が向上します。
ただし、デフォルトでは、通常のユーザーは `libvirtd` システムソケットとやり取りしてマシン、ネットワーク、その他のリソースを管理することはできません。アクセスするには、ユーザーは libvirt Unix グループのメンバーであるか、sudo を使用する必要があります。歴史的に、ローカル権限昇格の脆弱性は、libvirt グループのメンバーシップを悪用して root 権限を取得してきました。
これらのリスクを軽減するため、このリポジトリは、AppArmor を使用するシステム上の `libvirtd` プロセス向けに強化された AppArmor プロファイルを提供します。このプロファイルは、`libvirtd` がファイルを書き込める場所と実行できるプログラムを大幅に制限します。
さらに、`libvirt` グループのメンバーに許可される操作をより詳細に制御するための `polkit` ルールも含まれています。
AppArmor プロファイルは `deb` パッケージに含まれていますが、Makefile の `install_files` ターゲットではインストールされないため、別途インストールする必要があることに注意してください。
## Mofos の設定
Mofos が正しく機能するには、`$HOME/.config/mofos/config.toml` に配置された最小限の設定を含む構成ファイルが必要です。最小限の設定例は `/usr/share/mofos/config.minimal.toml` にあります。一方、より包括的な設定は `/usr/share/mofos/config.sample.toml` に文書化されています。
次のエラーは、構成ファイルが見つからなかったことを示しています:```
[-] Copy the sample configuration file from /usr/share/mofos/config.minimal.toml to ~/.config/mofos/config.toml
次のエラーは、現在のユーザーが libvirt グループのメンバーではないことを示しています:``` [-] libvirtError("authentication unavailable: no polkit agent available to authenticate action 'org.libvirt.unix.manage'")
設定ファイルでカスタマイズする主な設定項目は次のとおりです:
- key (パス): 仮想マシンへのアクセスに使用する SSH 秘密鍵ファイルです。この目的のために専用の鍵を作成することをお勧めします。
- user (文字列): 仮想マシンへの SSH アクセスに使用するユーザー名です。
- root_password (ハッシュ値): 新しいテンプレートのインストール中に設定される、ハッシュ化された root パスワードです。
- root_ssh_pubkey (文字列): テンプレートのインストール中に root ユーザーのディレクトリにインストールされる公開 SSH キーです。
さらに、テンプレートのインストールには以下のパラメータを設定する必要があります:
- ntp
- dns (プロキシが提供されている場合はオプション)
- proxy
## テンプレートのインストール
### ファイアウォールの設定
インストールプロセスは PXE netboot に依存するため、アクティブなインターネット接続が必要です。以下のファイアウォールルールを設定する必要があります:```
sysctl net.ipv4.ip_forward=1
iptables -t nat -I POSTROUTING -s 192.168.90.0/24 -j MASQUERADE
iptables -t nat -I POSTROUTING -s 192.168.91.0/24 -j MASQUERADE
または nftables を使う場合:``` sysctl net.ipv4.ip_forward=1 nft insert inet nat postrouting iifname "install-*" masquerade nft insert inet nat postrouting iifname "mof0" masquerade
`ip_forward` パラメータが 1 に設定されている場合、ネットワーク上の他のデバイスがホストをルーターとして使用できないように、FORWARD チェーンを設定する必要があります。
全体として、以下のルールが推奨されます:```
iptables -I INPUT -i mof0 -p udp --sport 68 --dport 67 -j ACCEPT -m comment --comment "mofos dhcp"
iptables -I INPUT -i mof0 -p udp --dport 69 -j ACCEPT -m comment --comment "mofos tftp"
iptables -I OUTPUT -o mof0 -j ACCEPT -m comment --comment "host -> mofos"
iptables -I FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -I FORWARD -i mof0 -j ACCEPT -m comment --comment "mofos ->"
iptables -t nat -I POSTROUTING -s 192.168.90.0/24 -j MASQUERADE
iptables -t nat -I POSTROUTING -s 192.168.91.0/24 -j MASQUERADE
または nftables を使用する場合:```
table inet filter {
chain input {
type filter hook input priority 0; policy drop
iifname "install-*" ip daddr 255.255.255.255 udp sport 68 udp dport 67 accept comment "mofos dhcp"
iifname "mof0" ip daddr 255.255.255.255 udp sport 68 udp dport 67 accept comment "mofos dhcp"
iifname "install-*" udp dport 69 accept comment "mofos tftp"
}
chain forward {
type filter hook forward priority 0; policy drop
ct state established,related accept;
ct state invalid drop;
iifname "mof0" counter accept
iifname "install-*" counter accept
}
chain output {
type filter hook output priority 0; policy drop
oifname "mof0" counter accept
}
} table inet nat { chain postrouting { type nat hook postrouting priority 100 iifname "mof0" masquerade iifname "install-*" masquerade } }
It is recommended to restrict masquerade and forwarding rules based on your specific needs, to prevent mofos virtual machines from accessing the entire host network.
特定のニーズに基づいてマスカレードおよび転送ルールを制限し、mofos 仮想マシンがホストネットワーク全体にアクセスできないようにすることをお勧めします。
Isolation between virtual machines is automatically enforced by a libvirt hook, which requires nft to function properly.
仮想マシン間の分離は libvirt フックによって自動的に強制され、正しく機能するには nft が必要です。
### Install
### インストール
The first step is to build the initial layer: the template. By default, Mofos can install a Debian 12–based template.
最初のステップは初期レイヤーであるテンプレートを構築することです。デフォルトでは、Mofos は Debian 12 ベースのテンプレートをインストールできます。```
mofos template create debian-template
注: すべてのコマンドで、予期しない動作が発生した場合に詳細な技術情報を取得するために --debug オプションを使用できます。特にこのコマンドでは、--debug フラグを使用すると、インストールの進行状況を表示するグラフィカルウィンドウも強制的に表示されます。あるいは、virt-manager. を使用してインストールを監視することもできます。
現在、インストールでサポートされているテンプレートは Debian 12 のみです。以下の Python ディクショナリは、使用するインストールイメージを指定しています:```python NETBOOT = { "debian-stable-amd64": { "variant": "debian11", "url": "https://deb.debian.org/debian/dists/stable/main/installer-amd64/current/images/netboot/netboot.tar.gz", } }
バリアントは `debian11` に設定されています。これは、Debian 12 では、Debian 12 用の `osinfo` バリアントがまだ libvirt 経由でインストールできないためです。
別のディストリビューションをインストールするには、`/usr/lib/python3/dist-packages/mofos/settings.py` にあるディクショナリを変更します。
上記のコマンドを実行すると、Mofos はネットブートファイルをダウンロードし、`tar.gz` アーカイブを `$HOME/.cache/template-installer` にキャッシュします。現在、ネットブートアーカイブが既に存在する場合、Mofos は再度ダウンロードしません。キャッシュされたアーカイブが古い場合、これによりエラーが発生する可能性があります。インストール中にそのようなエラーが発生した場合は、キャッシュされたアーカイブを削除すると、Mofos が更新版をダウンロードするようになり、問題が解決するはずです。
次に、アーカイブは `/tmp` に展開され、libvirt がその内容を TFTP 経由で提供するように設定されます。
次に、テンプレート仮想マシンが作成され、PXE 経由でブートするように設定され、提供された preseed ファイル(デフォルトでは `/usr/share/mofos/templates/debian/preseed.cfg.j2`)を使用して指定されたディストリビューションがインストールされます。このファイルは `jinja2` テンプレートです。TFTP ルートディレクトリにコピーする前に、設定ファイルの変数(`ntp`、`proxy`、`dns`、`root_password`)が注入されます。
インストールの最後に、`postinstall` スクリプトが TFTP ディレクトリに配置され、テンプレート上で実行されます。デフォルトでは、`/usr/share/mofos/templates/postinstall.sh.j2` にあるスクリプトが使用されます。この `jinja2` テンプレートは、テンプレートに設定する公開 SSH キーを注入します。
root SSH 公開キーの設定に加えて、次の操作が実行されます。
- 標準の SSH サービスを無効にし、仮想ソケット(vsock)経由の SSHD を有効にします。
- `/etc/resolv.conf` ファイルを空にします。
- GRUB タイムアウトを 0 秒に設定します。
- `overlay` というラベルのパーティションが検出されたときに overlayfs をマウントする initramfs フックをインストールします。
インストールが完了すると、libvirt 仮想マシンが取得され、現在のディレクトリに保存されるローカルの `qcow2` ファイルに圧縮されます。```
$ mofos template create debian-template
[*] Installing debian-template
[*] Configure the SSH host key of the template
[*] Waiting for the installation to be complete
[*] Installation is complete
[*] Downloading the resulting qcow2 disk
[*] Compressing the disk
[*] Save template's public ssh host key
[+] Template installation finished
[+] Template disk is debian-template-disk.qcow2
qcow2ファイルに加えて、このプロセスは、マシン名とその公開SSHキーを含むエントリをファイル$HOME/.local/share/mofos/ssh.jsonに作成します:```json
{
"disk": {
"debian-template-disk.qcow2": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINrbOdOPENEj2KeHrYLdorQe9Ez1b9Bu5agZmgNDMayy"
}
}
This file is automatically used during the import process.
### インポート
次のステップとして、作成したテンプレート `qcow2` ファイルを Mofos にインポートします。```
$ mofos template import debian-template debian-template-disk.qcow2 http://debian.org/debian/11
[*] Uploading debian-template-disk.qcow2 to mofos pool
[*] Creating the virtual machine debian-template
[*] Configuring the template metadata
[*] Configuring the SSH key
[+] debian-template successfully imported
当面は、osinfo バリアントが必須です。これらは次のファイルにあります:
/usr/lib/python3/dist-packages/mofos/settings.py。
インポートすると、mofos ls コマンドでテンプレートを確認できます:```
$ mofos ls
+----+-----------------+---------+-------------+-------+-----+--------------+
| Id | Name | State | Description | Alias | Cid | IPv4 address |
+----+-----------------+---------+-------------+-------+-----+--------------+
| | debian-template | shutoff | | | | |
+----+-----------------+---------+-------------+-------+-----+--------------+
この時点から、テンプレートを起動し、必要に応じて変更のためにアクセスすることができます。```
$ mofos start debian-template
$ mofos ls
+----+-----------------+---------+-------------+-------+-----+----------------+
| Id | Name | State | Description | Alias | Cid | IPv4 address |
+----+-----------------+---------+-------------+-------+-----+----------------+
| 3 | debian-template | running | | | 3 | 192.168.90.202 |
+----+-----------------+---------+-------------+-------+-----+----------------+
Please provide the Markdown content to translate.``` $ mofos ssh debian-template --user root root@linux:~#
## 上位レイヤーの空ディスクを作成
次のコマンドは、ディスクの単一パーティション上に、指定されたラベルを持つ空の上位レイヤーを作成します。```
$ mofos template create-overlay-disk
デフォルトでは、このディスクは50 GBに設定されていますが、初期状態では約100 MBのみを占有します。このサイズは設定ファイルでカスタマイズできます。
注: Mofos 仮想マシンを操作する前に、常にテンプレートをシャットダウンすることをお勧めします。テンプレートとその仮想マシンを同時に実行することはサポートされていますが、不安定になる可能性があります。``` $ mofos new test [] New virtual machine name is test [+] Virtual machine test successfully created [] Triggering post install actions [] Create SSH known_hosts entries for test [] Waiting for test to be up [+] test is ready $ mofos ssh test -u root Last login: Mon Jun 2 11:09:51 2025 from UNKNOWN root@linux:~#
SSH接続は仮想ソケットを介して行われることに注意してください。そのため、新しく作成したマシンに直接SSH接続することはできません。代わりに、mofos ssh コマンドを使用する必要があります。あるいは、`ProxyCommand `を指定したSSH設定を作成して、マシンのSSHポートにアクセスすることもできます:```
$ mofos inventory --format ssh
Host debian-template
User user
PasswordAuthentication no
IdentityFile /home/user/.ssh/id_ed25519
ProxyCommand /usr/bin/mofos proxy-cmd %h
CanonicalizeHostname=no
Host test
User user
PasswordAuthentication no
IdentityFile /home/user/.ssh/id_ed25519
ProxyCommand /usr/bin/mofos proxy-cmd %h
CanonicalizeHostname=no
Sqliteman: 最もシンプルで強力なSQLiteクライアント
ライセンス: GNU GPLv2.0
Sqlitemanは、SQLiteデータベースの管理と操作のためのパワフルでユーザーフレンドリーなインターフェースを提供する、軽量でクロスプラットフォームなSQLiteデータベースクライアントです。シンプルでありながら多機能になるよう設計されており、SQLiteデータベース管理のための信頼できるツールを必要とする開発者、データベース管理者、愛好家に最適です。
sudo apt-get install sqliteman
brew install sqliteman
公式ウェブサイトからインストーラーをダウンロードするか、パッケージマネージャーを使用してください。
CMakeを使用してソースからビルドします:
git clone https://github.com/devbean/sqliteman.git
cd sqliteman
mkdir build && cd build
cmake ..
make
sudo make install
インストール後、アプリケーションメニューからSqlitemanを起動するか、次のコマンドを実行します:
sqliteman
データベースファイルを開くには:
sqliteman path/to/database.db
包括的なドキュメントは公式ウェブサイトで入手できます。
設定 > 外観 に移動し、お好みのテーマを選択します。
Sqlitemanは主にデスクトップアプリケーションです。サーバー側のSQLite管理には、CLIツールやWebベースのクライアントの使用を検討してください。
以下のサムネイルをクリックすると、フルサイズ版が表示されます。
コントリビューションを歓迎します!以下の手順に従ってください:
このプロジェクトはGNU General Public License v2.0の下でライセンスされています。詳細はLICENSEファイルを参照してください。``` $ mofos inventory --format ssh > ~/.ssh/mofos $ echo "Include ~/.ssh/mofos" >> ~/.ssh/config $ ssh root@test Linux linux 6.1.0-37-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.140-1 (2025-05-22) x86_64
The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Mon Jun 2 11:09:51 2025 from UNKNOWN root@linux:~#
During a `mofos ssh` session, a `ControlMaster` socket is established beforehand to speed up subsequent connections. This is why the MOTD is not displayed.
`mofos ssh` セッション中は、`ControlMaster` ソケットが事前に確立され、後続の接続を高速化します。そのため、MOTD は表示されません。
## Customization
## カスタマイズ
To simplify the customization of templates and virtual machines, Mofos introduces the concept of hooks and tags. For each tag, a corresponding hook (a Bash script) can be executed to perform automated actions on the target virtual machine or template and configure it accordingly.
テンプレートと仮想マシンのカスタマイズを簡素化するために、Mofos はフックとタグの概念を導入しています。各タグに対して、対応するフック(Bash スクリプト)を実行し、対象の仮想マシンまたはテンプレートに対して自動アクションを実行して、それに応じて設定できます。
Minimal hooks are located in `/usr/share/mofos/hooks`. These are simple Bash scripts that receive the following inputs:
最小限のフックは `/usr/share/mofos/hooks` にあります。これらは以下の入力を受け取るシンプルな Bash スクリプトです。```
TAG=$1
NAME=$2
OS=$3
DISTRIB=$4
HOSTNAME=$5
このメカニズムは、テンプレートのインストール中にプレイブックを実行するためにAnsibleを活用できます:```bash #!/bin/bash
TAG=$1 NAME=$2 OS=$3 DISTRIB=$4 HOSTNAME=$5
if [ -z "${TAG}" ] || [ -z "${NAME}" ] || [ -z "${DISTRIB}" ] ; then exit 1 fi
ANSIBLE_DIRECTORY="/home/user/Documents/ansible" RANDOM_SUFFIX=$(printf "%x" $RANDOM) INVENTORY_FILE="${ANSIBLE_DIRECTORY}/inventory-${NAME}-${RANDOM_SUFFIX}.ini"
trap 'rm -f "${INVENTORY_FILE}"; exit' EXIT
cat > $INVENTORY_FILE <<EOF [all:vars] ansible_ssh_common_args="-o ProxyCommand='mofos proxy-cmd %h' -o CanonicalizeHostname=no"
[${TAG}] ${NAME}
[${DISTRIB}] ${NAME} EOF
export ANSIBLE_CONFIG="/home/user/Documents/ansible/ansible.cfg" export ANSIBLE_VERBOSITY=1
/usr/bin/ansible-playbook
-i "${INVENTORY_FILE}"
-l "${NAME}"
/home/user/Documents/ansible/playbooks/pentest/install.yml
このスクリプトは、インベントリを動的に作成し、それに対してプレイブックを実行します。
### 仮想マシン - 新規フック
仮想マシンの作成中に、例えばホスト名をランダム化するために、別のフックを使用することもできます。
デフォルトでは、Mofos は一般的な Windows の命名規則に基づいてエイリアスを生成します(例: `DESKTOP-2BF9753`)。この名前は、他の情報とともにフックスクリプトに渡されます:```
#!/bin/bash
TAG=$1
NAME=$2
OS=$3
DISTRIB=$4
HOSTNAME=$5
if [ -z "${TAG}" ] || [ -z "${NAME}" ] || [ -z "${OS}" ] ; then
exit 1
fi
if [ -z "${HOSTNAME}" ] ; then
HOSTNAME="${NAME}"
fi
mofos run -u root "${NAME}" "echo ${HOSTNAME} > /etc/hostname && hostname ${HOSTNAME}"
次に、このフックを有効にするには、設定を編集する必要があります:``` [hooks.test] new = "/home/user/.config/mofos/hooks/new.sh"
その後、仮想マシンの作成中に、このスクリプトが実行されます:```
$ mofos new test2 --tags test
[*] New virtual machine name is test2
[+] Virtual machine test2 successfully created
[*] Triggering post install actions
[*] Create SSH known_hosts entries for test2
[*] Waiting for test2 to be up
[*] Running new hook: test
[+] test2 is ready
INPUT: を提供してください。翻訳するテキストがありません。``` $ mofos ssh test2 -u root Last login: Mon Jun 2 11:09:51 2025 from UNKNOWN root@DESKTOP-2BF9753:~#
インストールフェーズと同様に、この段階でもAnsibleプレイブックを実行できます。この場合、`mofos inventory` コマンドを使用してAnsibleインベントリを生成でき、仮想マシンの選択とアクセスのプロセスを簡素化できます:```
$ mofos inventory
{
"_meta": {
"hostvars": {
"debian-template": {
"ansible_host": "debian-template",
"ansible_ssh_common_args": "-o ProxyCommand='/usr/bin/mofos proxy-cmd %h' -o CanonicalizeHostname=no"
},
"test": {
"ansible_host": "test",
"ansible_ssh_common_args": "-o ProxyCommand='/usr/bin/mofos proxy-cmd %h' -o CanonicalizeHostname=no"
},
"test2": {
"ansible_host": "test2",
"ansible_ssh_common_args": "-o ProxyCommand='/usr/bin/mofos proxy-cmd %h' -o CanonicalizeHostname=no"
}
}
},
"debian": [
"debian-template",
"test",
"test2"
],
"test": [
"test2"
]
グループは、ディストリビューションのバリアントとタグに基づいて作成されることに注意してください。これらのグループを使用して、異なる変数をロードできます。
例えば、以下のスクリプトは任意のプレイブックを実行します。```bash #!/bin/bash
TAG=$1 NAME=$2 OS=$3 DISTRIB=$4 HOSTNAME=$5
if [ -z "${TAG}" ] || [ -z "${NAME}" ] || [ -z "${OS}" ] ; then exit 1 fi
if [ -z "$HOSTNAME" ] ; then HOSTNAME=$NAME fi
if [ $OS == "windows" ] ; then TAGS="hostname,desktop" else TAGS="hostname,hosts,desktop" fi
export ANSIBLE_CONFIG="/home/user/Documents/ansible/ansible.cfg" export ANSIBLE_VERBOSITY=0
/usr/bin/ansible-playbook
-i /home/user/Documents/ansible/inventory.py
-l "${NAME}"
-t "${TAGS}"
-e "hostname=${HOSTNAME}"
/home/user/Documents/ansible/playbooks/pentest/update.yml
### 仮想マシン - 開始フック
同様に、開始フックは仮想マシンの起動時に実行されます。これは通常、仮想マシンが必要とするサービスを起動するために使用されます。
例えば、仮想マシン内でシームレスなWindows統合を有効にするには、`Xpra` をインストールできます。
まず `ansible` をインストールします:```
# apt install ansible
次に、ansible ディレクトリにあるユーザープレイブックを実行します。その前に、playbooks/user.yml ファイルを編集して、パスワードハッシュとユーザーのホームディレクトリにインストールする公開SSHキーを更新してください。```
~/mofos/ansible$ ls
ansible.cfg ansible.log inventory.sh playbooks
入力テキストが提供されていません。翻訳対象のMarkdownコンテンツを貼り付けてください。```
$ ansible-playbook playbooks/user.yml -l test2
Using /home/user/mofos/ansible/ansible.cfg as config file
[WARNING]: Found both group and host with same name: test
PLAY [Create and configure a user]
[...]
PLAY RECAP
test2 : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
その後、設定でこのユーザーがデフォルトとして指定されている場合、このユーザーアカウントにSSH接続できます:``` $ mofos ssh test2 user@DESKTOP-2BF9753:~$
次に、`Xpra` プレイブックを実行します。このプレイブックは、Debian ミラーからパッケージをインストールします。Mofos ネットワークは、デフォルトでは DNS、プロキシ、またはデフォルトゲートウェイを設定しないことに注意してください。これらは、プレイブックを実行する前に設定する必要があります。
デフォルトでは、プレイブックの変更は不要です。```
ansible-playbook playbooks/xpra.yml -l test2
このプレイブックは、Xpra をインストールして設定し、仮想マシン上で xpra サービスを起動します。
リモートサービスは、次を使用して手動で起動できます:``` user@DESKTOP-2BF9753:~$ systemctl --user start xpra
そうでなければ、サービスは次回の再起動時に自動的に起動します。
次に、ローカルクライアントサービスも手動で開始できます。```
$ mofos xpra start test2
仮想マシン側では、ディスプレイが :10(デフォルト)に設定されているはずです。その後、グラフィカルアプリケーションを起動すると、ホストのデスクトップ環境内に表示されます。```
user@DESKTOP-2BF9753:$ export DISPLAY=:10
user@DESKTOP-2BF9753:$ xterm
このメカニズムがスムーズかつ自動的に動作するようにするため、`mofos xpra` コマンドはスタートフックから起動できます。```bash
#!/bin/bash
TAG=$1
NAME=$2
OS=$3
DISTRIB=$4
HOSTNAME=$5
if [ -z "${TAG}" ] || [ -z "${NAME}" ] ; then
exit 1
fi
mofos xpra start "${NAME}"
libvirt/qemu マシンの起動と停止を通知するには、libvirt の qemu フックを変更して、ホストユーザーの名前(デフォルトでは user)を指定します。```
### Clipboard
Mofosは、仮想マシンとホスト間のクリップボードも管理できます。アイデアとしては、特定のキーバインドを設定して、現在フォーカスされているVMへのSSH接続をトリガーし、X11クリップボードを取得するか、コンテンツをプッシュします。
仮想マシンのX11クリップボードにコンテンツをプッシュするには:```
mofos clipboard in pentest-0
仮想マシンのX11クリップボードからコンテンツを取得するには:``` mofos clipboard out pentest-0
各操作で、mofos は仮想マシンへの SSH 接続を確立して xclip を使用し、ホスト上ではウィンドウシステムの技術(Wayland vs X11)に応じて `wl-copy` または `xclip` を使用します。
上記のトレース内のマシン名は省略される場合があります。その場合、スクリプトは現在フォーカスされている仮想マシンを特定して対象にします。
Gnome Wayland を使用している場合、`sudo make install_gnome_extension` で [email protected] Gnome Shell 拡張機能をインストールする必要があるかもしれません。
拡張機能が確実にインストールされるよう、ログアウトして再度ログインする必要があります。
### マシン間のルーティングを設定する
mofos で VM をルーティングするには、2 つのオプションがあります:
- `mofos route`: ゲートウェイを受け取り、ホスト上で `ip rule` を設定して、仮想マシンをこのゲートウェイ経由でルーティングします。
- `mofos pivot`: 別の mofos マシンを受け取り、その IP アドレスを取得して、現在の仮想マシンのデフォルトゲートウェイとして設定します。
どちらのオプションも、設定する DNS サーバーを受け取ることができます。
### ペンテストボックス経由のトンネリングを設定する
`mofos tunnel` コマンドは、SSH VPN(`ssh -w`)をセットアップして、mofos マシンのトラフィックをサーバー経由でルーティングします。この機能は、いくつかの設定に依存しています:
具体的には、`mofos tunnel` コマンドは次のアクションを実行します(ここに黒魔術はありません):
1. ローカルの tun インターフェースを作成し(`sudo /usr/libexec/mofos/mofosnet.py tun add pentest_box`)、このインターフェースに IP アドレスを割り当てます。
2. リモートサーバー上で `tunneling.command` を実行します。このコマンドは tun インターフェースを作成し、ローカルのインターフェースとリンクさせます(`/usr/libexec/mofos/mofosnet.py sshvpn start pentest_box`)。
3. mofos マシンのトラフィックをリモートボックスのゲートウェイ経由でルーティングし(`/usr/libexec/mofos/mofosnet.py route mofos_vm_ip gateway_ip`)、mofos 仮想マシンのデフォルトゲートウェイも変更されます。
`tunneling.command` は `/etc/mofos/mofosnet.toml` 設定ファイル内で定義する必要があります。例:```toml
[tunneling.command]
start = "sudo ssh-vpn start" # the peer remote address will be supplied as argv[1]
stop = "sudo ssh-vpn stop"
route および pivot コマンドに関しては、DNSを指定して設定することもできます。
mofos usb コマンドを使用すると、USBデバイスを管理できます。
デバイスはそのID(vendor_id:product_id)によって識別され、これは attach および detach コマンドに必要です:```console $ mofos ls usb +-----------+------------------------------------------------+-------------+ | ID | Device | Attached to | +-----------+------------------------------------------------+-------------+ | 0bda:8153 | Realtek, RTL8153 Gigabit Ethernet Adapter | | | 046d:c077 | Logitech, Mouse | | | 0a5c:5842 | Broadcom Corp, 58200 | | | 1bcf:28d2 | CN0Y9V728LG003AGBCJZA01, Integrated_Webcam_FHD | | +-----------+------------------------------------------------+-------------+ $ mofos usb attach pentest-1 0bda:8153 $ mofos usb +-----------+------------------------------------------------+-------------+ | ID | Device | Attached to | +-----------+------------------------------------------------+-------------+ | 0bda:8153 | Realtek, RTL8153 Gigabit Ethernet Adapter | pentest-1 | | 046d:c077 | Logitech, Mouse | | | 0a5c:5842 | Broadcom Corp, 58200 | | | 1bcf:28d2 | CN0Y9V728LG003AGBCJZA01, Integrated_Webcam_FHD | | +-----------+------------------------------------------------+-------------+ $ mofos usb detach pentest-4 0bda:8153
`force` オプションは、デバイスを切断して再装着します。これは通常、事前に切断せずに抜かれたデバイスを再装着するために使用されます。
注: USB デバイスの装着は、仮想マシンの現在の稼働期間中のみ有効です。仮想マシンが停止すると、デバイスは自動的に切断されます。
### PCI デバイスの管理
USB デバイスと同様に、mofos は実行中の仮想マシンへの PCI デバイスの装着を許可します。コマンドは同じです。
追加の制限として、グループに属する一部の PCI デバイスが関係します。たとえば、実行中の仮想マシンにイーサネットボードを装着する場合、PCI グループ全体を仮想マシン内に移動する必要があるかもしれません。これは逐次的に行うことができないため、まだサポートされていません。ただし、Wi-Fi ネットワークカードのような単一の PCI デバイスでは問題なく動作します。
### 共有フォルダ
`mofos mount` コマンドは共有フォルダを作成し、新しく追加されたファイルシステムを仮想マシン内のディレクトリにマウントできます。`mofos umount` はディレクトリをアンマウントし、仮想マシン設定から共有フォルダを削除します。
このメカニズムは、共有メモリの有効化を必要とする `virtiofsd` テクノロジーに依存しています。これは現在、仮想マシン作成時にデフォルトで行われます。それ以外の場合は、次のコマンドで有効化できます。```console
virt-xml -c qemu:///system --edit --memorybacking source.type=memfd,access.mode=shared DOMAIN
さらに、提供されているAppArmorポリシーは、ホストが共有できるディレクトリを制限します。これは、ユーザーが/etcディレクトリやファイルシステムのルートに共有を設定し、仮想マシン内でroot権限を使用して変更することを防ぐためです。したがって、任意のディレクトリの共有を許可するには、usr.lib.qemu.virtiofsdポリシーを変更する必要があります。
適応すべき2行があります:``` @{SHARE_DIRS}=/data/libvirt/shares// /home/user/Public/**/ [...] pivot_root /data/libvirt/shares//, pivot_root /home/user/Public/**/,
The `SHARE_DIRS` 変数はポリシー内で再利用されますが、apparmor の制限により、`pivot_root` ディレクティブに再利用することはできません。そのため、各共有ディレクトリに対して `pivot_root` ディレクティブを手動で調整する必要があります。
ローカルディレクトリをマウントするには:```
mofos mount test ./Public/share -d /home/user/share
共有をマウントする仮想マシンを妨害しないように、リモートディレクトリが空でない場合には警告が発行され、スクリプトはマウント操作を手動で実行させます。
最後に、マウント操作は永続的ではなく、再起動のたびに再実行する必要があります。
Windows 仮想マシンを作成するには、最初にテンプレートマシンを手動で作成する必要があります。このテンプレートのディスクは、子マシンを作成するためのバッキングファイルとして使用されます。既定では、Mofos で作成された Windows 仮想マシンは事前設定されていません。ただし、フックを使用して Mofos を設定し、ホスト名の変更や known_hosts ファイルへの専用エントリの追加などの事後設定タスクを実行することができます。
作成後セットアップを有効にするには、以下の前提条件が必須です:
authorized_keys は C:\Program Data\ssh\administrators_authorized_keys に作成し、特定の ACL を設定する必要があります```powershell
$admin_group = "Administrators"
$system = "SYSTEM"$acl = Get-Acl C:\ProgramData\ssh\administrators_authorized_keys $acl.SetAccessRuleProtection($true, $false) $administratorsRule = New-Object system.security.accesscontrol.filesystemaccessrule($admin_group,"FullControl","Allow") $systemRule = New-Object system.security.accesscontrol.filesystemaccessrule($system,"FullControl","Allow") $acl.SetAccessRule($administratorsRule) $acl.SetAccessRule($systemRule) $acl | Set-Acl
- OpenSSH は `cmd.exe` の代わりに `PowerShell` シェルを使用して構成する必要があります。```powershell
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" `
-Name DefaultShell `
-Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" `
-PropertyType String `
-Force
$HOME/.local/share/mofos/ssh.json. This will ensure that a corresponding known_hosts entry for each new machine will be created with the template host key.## オートコンプリート
オートコンプリートは、`bash` と `fish` では追加設定なしで処理されるはずです。`zsh` の場合、以下のコマンドを実行する必要があるかもしれません。```
autoload -Uz compinit
compinit
source /usr/share/zsh/vendor-completions/_mofos
同じテンプレートディスクに基づく仮想マシンは、DHCP 識別子によってネットワークカードの MAC アドレスが変わっても、同じ IP アドレスを取得する場合があります。この動作は、テンプレートのネットワーク構成を編集することで変更できます。
systemd-networkd の場合:``` [Match] Name=eth0
[Network] DHCP=yes MulticastDNS=no IPv6AcceptRA=no
[DHCP] ClientIdentifier=mac
レガシーネットワークインターフェース `/etc/network/interfaces` の場合:```
iface eth0 inet dhcp
client no