Як взаємодіє гіпервізор з віртуальними машинами ?
Один з варіантів використати агент для віртуальної машини.
У Proxmox це qemu-agent [1], від існує для різних операційних систем.
Так для FreeBSD існує версія пакунку "qemu-guest-agent-5.0.1 QEMU guest-agent utilities", з функціоналом але дещо обмеженим.
Для роботи з агентом є команда qm guest.
qm guest cmd <vmid> <command>
qm guest exec-status <vmid> <pid>
qm guest passwd <vmid> <username> [OPTIONS]
qm guest exec <vmid> [<extra-args>] [OPTIONS]
Manual proxmox qm :
qm guest cmd <vmid> <command>
Execute Qemu Guest Agent commands.
<vmid>: <integer> (1 - N) - The (unique) ID of the VM.
<command>: <fsfreeze-freeze | fsfreeze-status | fsfreeze-thaw | fstrim | get-fsinfo | get-host-name | get-memory-block-info | get-memory-blocks | get-osinfo | get-time | get-timezone | get-users | get-vcpus | info | network-get-interfaces | ping | shutdown | suspend-disk | suspend-hybrid | suspend-ram>
The QGA command.
qm guest exec <vmid> [<extra-args>] [OPTIONS]
Executes the given command via the guest agent
<vmid>: <integer> (1 - N) - The (unique) ID of the VM.
<extra-args>: <array> Extra arguments as array
--pass-stdin <boolean> (default = 0)
When set, read STDIN until EOF and forward to guest agent via input-data (usually treated as STDIN to process launched by guest agent). Allows maximal 1 MiB.
--synchronous <boolean> (default = 1)
If set to off, returns the pid immediately instead of waiting for the commmand to finish or the timeout.
--timeout <integer> (0 - N) (default = 30)
The maximum time to wait synchronously for the command to finish. If reached, the pid gets returned. Set to 0 to deactivate
qm guest exec-status <vmid> <pid>
Gets the status of the given pid started by the guest-agent
<vmid>: <integer> (1 - N) - The (unique) ID of the VM.
<pid>: <integer> - The PID to query
qm guest passwd <vmid> <username> [OPTIONS]
Sets the password for the given user to the given password
<vmid>: <integer> (1 - N) - The (unique) ID of the VM.
<username>: <string> - The user to set the password for.
--crypted <boolean> (default = 0)
set to 1 if the password has already been passed through crypt()
Запитаємо функціонал агента в FreeBSD обмеження мають статус disabled:
qm guest cmd 113 info
{
"supported_commands" : [
{
"enabled" : true,
"name" : "guest-get-osinfo",
"success-response" : true
},
{
"enabled" : true,
"name" : "guest-get-timezone",
"success-response" : true
},
{
"enabled" : true,
"name" : "guest-get-users",
"success-response" : true
},
{
"enabled" : true,
"name" : "guest-get-host-name",
"success-response" : true
},
{
"enabled" : true,
"name" : "guest-exec",
"success-response" : true
},
{
"enabled" : true,
"name" : "guest-exec-status",
"success-response" : true
},
{
"enabled" : false,
"name" : "guest-get-memory-block-info",
"success-response" : true
},
{
"enabled" : false,
"name" : "guest-set-memory-blocks",
"success-response" : true
},
{
"enabled" : false,
"name" : "guest-get-memory-blocks",
"success-response" : true
},
{
"enabled" : true,
"name" : "guest-set-user-password",
"success-response" : true
},
{
"enabled" : true,
"name" : "guest-get-fsinfo",
"success-response" : true
},
{
"enabled" : false,
"name" : "guest-set-vcpus",
"success-response" : true
},
{
"enabled" : true,
"name" : "guest-get-vcpus",
"success-response" : true
},
{
"enabled" : true,
"name" : "guest-network-get-interfaces",
"success-response" : true
},
{
"enabled" : false,
"name" : "guest-suspend-hybrid",
"success-response" : false
},
{
"enabled" : false,
"name" : "guest-suspend-ram",
"success-response" : false
},
{
"enabled" : false,
"name" : "guest-suspend-disk",
"success-response" : false
},
{
"enabled" : false,
"name" : "guest-fstrim",
"success-response" : true
},
{
"enabled" : false,
"name" : "guest-fsfreeze-thaw",
"success-response" : true
},
{
"enabled" : false,
"name" : "guest-fsfreeze-freeze-list",
"success-response" : true
},
{
"enabled" : false,
"name" : "guest-fsfreeze-freeze",
"success-response" : true
},
{
"enabled" : false,
"name" : "guest-fsfreeze-status",
"success-response" : true
},
{
"enabled" : true,
"name" : "guest-file-flush",
"success-response" : true
},
{
"enabled" : true,
"name" : "guest-file-seek",
"success-response" : true
},
{
"enabled" : true,
"name" : "guest-file-write",
"success-response" : true
},
{
"enabled" : true,
"name" : "guest-file-read",
"success-response" : true
},
{
"enabled" : true,
"name" : "guest-file-close",
"success-response" : true
},
{
"enabled" : true,
"name" : "guest-file-open",
"success-response" : true
},
{
"enabled" : true,
"name" : "guest-shutdown",
"success-response" : false
},
{
"enabled" : true,
"name" : "guest-info",
"success-response" : true
},
{
"enabled" : true,
"name" : "guest-set-time",
"success-response" : true
},
{
"enabled" : true,
"name" : "guest-get-time",
"success-response" : true
},
{
"enabled" : true,
"name" : "guest-ping",
"success-response" : true
},
{
"enabled" : true,
"name" : "guest-sync",
"success-response" : true
},
{
"enabled" : true,
"name" : "guest-sync-delimited",
"success-response" : true
}
],
"version" : "5.0.1"
}
Виконаємо команду для отримання змісту файлу від імені "root" !!!
![]() |
| qm guest exec 113 -- sh -c "cat /root/test.txt" |
Так, якщо використати при створенні віртуальної машини параметр: "--hookscript <string> Script that will be executed during various steps in the vms lifetime", то можна додатково контролювати віртуальні машини через агент.
Приклад скрипту: /usr/share/doc/pve-manager/examples/vzdump-hook-script.pl
Але використання агента віртуальної машини в неконтрольованому середовищі може бути не зовсім безпечно, коли до гіпервізора має доступ хакер.
За матеріалами:

Немає коментарів:
Дописати коментар