Настройка защиты устройств VirtualHere паролем

В этой короткой статья я покажу как выполняется настройка защиты устройств VirtualHere паролем. Я покажу самый простой пример – для подключения любого из устройств нужно будет ввести один и тот же пароль. Это достаточно простой пример, но он позволит понять логику настройки. На основе этой логики вы уже можете выстроить свою цепочку проверок.

Настройка защиты устройств доступна только для коммерческой версии VirtualHere. В бесплатной версии этот модуль не работает.

Задача

При подключении любого устройства через клиент VirtualHere пользователь должен указать пароль. Для всех устройств используется один и тот же пароль. Скажем, “Qwerty123”.

Краткая теория

Подробное руководство по настройке логики аутентификации доступно в соответствующем разделе документации.

Я кратко покажу основные моменты.

В конфигурационном файле config.ini необходимо переменной clientAuthorization присвоить путь до файла скрипта со сконфигурированной логикой выполнения аутентификации клиента. В дополнении в этой же строке скрипту нужно будет передать ряд предопределнных параметров.

По умолчанию скрипт расположен в следующей директории:

/usr/local/etc/virtualhere/config.ini

Посмотрим пример уже настроенной переменной clientAuthorization:

~$ cat /usr/local/etc/virtualhere/config.ini
clientAuthorization=/etc/virtualhere/auth.sh "$VENDOR_ID$" "$PRODUCT_ID$" "$CLIENT_ID$" "$CLIENT_IP$" "$PRODUCT_SERIAL$" "$PASSWORD$" "$DEVPATH$" "$NICKNAME$" "$NUM_BINDINGS$"

Как видно из листинга выше /etc/virtualhere/auth.sh – это как раз путь до скрипта, который непосредственно выполняет проверку. О нем я еще расскажу.

Так же скрипту передается ряд параметров, на основе которых вы можете принимать решение – разрешать доступ до устройства или нет. Подробно их назначение приведено в документации по ссылке выше.

Касательно скрипта аутентификации. Вот выдержка из комментариев по настройке логики:

# Example script for performing basic user authorization for virtualhere
# Also includes a simple password protection mechanism for accessing a device
# Return 3 if the user needs to provide a username AND password (or the password is incorrect) to use the device
# Return 2 if the user needs to provide ONLY a password (or the password is incorrect) to use the device. The username defaults to the client OS username
# Return 1 if the user is allowed to access this device
# Return 0 if the user is not allowed to access this device
# Parameters are passed in as:
# $1 = VENDOR_ID
# $2 = PRODUCT_ID
# $3 = CLIENT_ID
# $4 = CLIENT_IP
# $5 = PRODUCT_SERIAL
# $6 = PASSWORD
# $7 = DEVPATH
# $8 = NICKNAME
# $9 = NUM_BINDINGS

т.е. я передаю скрипту входной набор параметров из списка выше (VENDOR_ID, PRODUCT_ID, PASSWORD и т.д.) и должен вернуть значение 1, если хочу разрешить доступ. Если я хочу запретить доступ, то я должен вернуть числовое значение 0.

Пример логики скрипта я приведу ниже в соответствбущем разделе.

Решение

Самое первое, что нужно сделать – это добавить в конфигурационный файл (config.ini) сервера VirtualHere строчку указывает расположение скрипта с проверкой аутентификации. Открываем файл config.ini в любом текстовом редактое:

sudo nano /usr/local/etc/virtualhere/config.ini

Добавляем строчку с указанием полного пути до скрипта проверки аутентификации (так же не забываем передать доступные параметры):

clientAuthorization=/etc/virtualhere/auth.sh "$VENDOR_ID$" "$PRODUCT_ID$" "$CLIENT_ID$" "$CLIENT_IP$" "$PRODUCT_SERIAL$" "$PASSWORD$" "$DEVPATH$" "$NICKNAME$" "$NUM_BINDINGS$"

Теперь создадим скрипт по тому пути, который мы указали в файле config.ini:

sudo mkdir -p /etc/virtualhere/
sudo touch /etc/virtualhere/auth.sh
sudo chmod +x /etc/virtualhere/auth.sh

Открываем файл auth.sh на редактирование:

sudo nano /etc/virtualhere/auth.sh

Содержимое скрипта для решения нашей задачи будет следующее:

# Example script for performing basic user authorization for virtualhere
# Also includes a simple password protection mechanism for accessing a device
# Return 3 if the user needs to provide a username AND password (or the password is incorrect) to use the device
# Return 2 if the user needs to provide ONLY a password (or the password is incorrect) to use the device. The username defaults to the client OS username
# Return 1 if the user is allowed to access this device
# Return 0 if the user is not allowed to access this device
# Parameters are passed in as:
# $1 = VENDOR_ID
# $2 = PRODUCT_ID
# $3 = CLIENT_ID
# $4 = CLIENT_IP
# $5 = PRODUCT_SERIAL
# $6 = PASSWORD
# $7 = DEVPATH
# $8 = NICKNAME
# $9 = NUM_BINDINGS
logger "Authorizing -> '$1' '$2' '$3' '$4' '$5' '$6' '$7' '$8' '$9'"
# value in logical comparer below is MD5 hash of password
if [ "$6" == "2af9b1ba42dc5eb01743e6b3759b6e4b" ];
then
    echo "Password ok"
    logger "Authorized! -> '$1' '$2' '$3' '$4' '$5' '$6' '$7' '$8' '$9'"
    exit 1
else
    exit 0
fi

Выделенный жирный код – это md5 хэш вашего пароля. Можете использовать любой онлайн сервис.

logger – это встроенная функция командной оболочки, которая пишет события в файл /var/log/syslog. Использование этой строки не является обязетельным.

Итого, что делаеь скрипт. Он проверяет – совпадает ли md5 хэш переданного параметра $6 (PASSWORD) с тем, что мы ожидаем от пользователя (Qwerty123). Если совпадает, то мы завершаем работы скрипта и возвращаем значение 1 – т.е. разрешаем доступ. В противном случае скрипт вернет числовое значение 0 – доступ запрещен.

Сохраняем изменения.

Перезапускаем службы VirtualHere:

sudo systemctl restart virtualhere.service

Проверяем, что служба запустилась успешно:

sudo systemctl status virtualhere.service
roman@vhsrv:~$ sudo systemctl status virtualhere.service
● virtualhere.service - VirtualHere Server
     Loaded: loaded (/etc/systemd/system/virtualhere.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2022-07-05 23:34:36 +07; 1min 23s ago
    Process: 2009 ExecStart=/usr/local/sbin/vhusbdx86_64 -b -c /usr/local/etc/virtualhere/config.ini (code=exited, status=0/SUCCESS)
   Main PID: 2010 (vhusbdx86_64)
      Tasks: 12 (limit: 4582)
     Memory: 1.7M
     CGroup: /system.slice/virtualhere.service
             └─2010 /usr/local/sbin/vhusbdx86_64 -b -c /usr/local/etc/virtualhere/config.ini

июл 05 23:34:36 vhsrv systemd[1]: Starting VirtualHere Server...
июл 05 23:34:36 vhsrv vhusbdx86_64[2009]: >>> Starting VirtualHere USB Server v4.4.1 (Built: May  3 2022, 11:36:40)<<<
июл 05 23:34:36 vhsrv vhusbdx86_64[2009]: Using configuration /usr/local/etc/virtualhere/config.ini
июл 05 23:34:36 vhsrv systemd[1]: Started VirtualHere Server.
июл 05 23:34:36 vhsrv vhusbdx86_64[2010]: Server licensed to=unlicensed max_devices=1
июл 05 23:34:36 vhsrv vhusbdx86_64[2010]: Using large URB's
июл 05 23:34:36 vhsrv vhusbdx86_64[2010]: Listening on all network interfaces at TCP port 7575
июл 05 23:34:36 vhsrv vhusbdx86_64[2010]: Found Full speed device [0e0f:0003] "VMware, VMware Virtual USB Mouse" at address 31
roman@vhsrv:~$ 

Если служба не запустилась корректно, значит есть какие-то ошибки или опечатки в файлах config.ini или auth.sh.

Как это работает

Теперь попробуем запустить графический клиент VirtualHere и подключить одно из устройств:

На скриншоте выше видно, что сервер запросил у нас дополнительное подтверждение – пароль. Если я указываю правильный пароль (в моем случае Qwerty123), то смогу использовать устройство по сети.

Что делать, если не работает

Однозначно сказать сложно, но перым делом загляните в syslog. Возможно там вы найдете ответ на ваш вопрос. Например, для бесплатной версии можно найти следующее сообщение, которое объяснем почему генерируется ошибка при подключении в случае использования модуля аутентификации:

tail /var/log/syslog
roman@vhsrv:~$ tail /var/log/syslog
Jul  5 23:53:53 vhsrv NetworkManager[775]: <info>  [1657040033.4795] dhcp4 (ens33): state changed extended -> extended
Jul  5 23:53:53 vhsrv systemd[1]: Starting Network Manager Script Dispatcher Service...
Jul  5 23:53:53 vhsrv dbus-daemon[774]: [system] Successfully activated service 'org.freedesktop.nm_dispatcher'
Jul  5 23:53:53 vhsrv systemd[1]: Started Network Manager Script Dispatcher Service.
Jul  5 23:54:04 vhsrv systemd[1]: NetworkManager-dispatcher.service: Succeeded.
Jul  5 23:55:59 vhsrv vhusbdx86_64[2112]: Connection 1 remotely disconnected gracefully (rx msg size)
Jul  5 23:56:04 vhsrv vhusbdx86_64[2112]: 10.10.10.44 connected as connection 2
Jul  5 23:56:08 vhsrv vhusbdx86_64[2112]: Must purchase this server to use ClientAuthorization!
Jul  5 23:56:08 vhsrv vhusbdx86_64[2112]: Error binding device 41 [125f:dd33] to connection 2, BIND_ERROR
Jul  5 23:56:09 vhsrv vhusbdx86_64[2112]: Connection 1 successfully removed (reason:timeout)
roman@vhsrv:~$ 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *