Greenbone(绿骨)开源GVM容器docker部署和汉化介绍
文章目录
- Greenbone(绿骨)开源GVM容器docker部署和汉化介绍
- 前言
- 用容器部署GVM
- 第一步:安装依赖项
- 第二步:安装 Docker
- 第三步:使用 docker-compose编排文件,完成GVM服务部署
- 第四步:启动Greenbone社区容器
- 配置远程web访问服务
- GVM的汉化
- 附录:Kali GNU/Linux Rolling系统实操记录
Greenbone(绿骨)开源GVM容器docker部署和汉化介绍
前言
本文主要是介绍从容器运行 Greenbone Community Edition 也就是一般我们说的GVM(以前叫Openvas),使用和部署其开源社区版方式很多,可以从官方申请免费的虚拟机镜像,也可以参照Greenbone社区文档从源构建。
笔者每种方式都尝试过,期间遇到过很多问题(不同linux系统,问题不一样,解决起来很麻烦),最简单直接的方式还是用容器部署。
另外说明,写此文的目的只是为了方便懒得阅读英文,而又需要部署GVM漏洞扫描的同志。
用容器部署GVM
容器化的最大好处就是不调系统,不需要依赖,简单方便。
操作前请注意:
官方建议的系统基本配置:
最小配置:
CPU 内核:2
随机存取内存:4GB
硬盘:20GB 可用
推荐配置:
CPU 内核:4
随机存取存储器:8GB
硬盘:60GB 可用
特别需要强调的是:如果做了/var单独挂载的,/var存储空间一定要大于20G。在/var/docker目录里会存放容器和镜像的主要数据,少于20G会提示空间不足。
第一步:安装依赖项
推荐使用:Debian/Ubuntu 服务器系统
安装 ca-certificates、curl 和 gnupg Debian/Ubuntu 软件包
sudo apt install ca-certificates curl gnupg
第二步:安装 Docker
如果系统已经有docker可以略过此步骤,当然为了避免失败,也可以重新部署docker。
重新部署Docker:
#卸载冲突的 Debian 软件包
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt remove $pkg; done#设置 Docker 存储库
# 1. 创建受信任的密钥存储目录(APT 密钥环专用目录)
sudo mkdir -p /etc/apt/keyrings && sudo chmod 0755 /etc/apt/keyrings
# 2. 下载 Docker 官方 GPG 密钥并转换格式
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# 3. 设置密钥文件为全局可读,确保普通用户也能读取密钥(否则 apt 更新会报权限错误)
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# 4. 生成 Docker 仓库配置文件
echo \"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \sudo tee /etc/apt/sources.list.d/docker.list > /dev/null#安装 Docker Debian 软件包
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin#将当前用户添加到 docker 组,并为当前 shell 环境应用组更改。要允许当前用户运行 docker 并因此启动容器,必须将其添加到 docker 用户组。要使组更改生效,请注销并重新登录或使用 su。
sudo usermod -aG docker $USER && su $USER
关键说明
1.curl 参数
-f:静默失败(不输出错误页面)
-sS:静默模式但显示错误信息
-L:跟随重定向
2.gpg 参数
–dearmor:将 ASCII 格式的 PGP 密钥转换为二进制格式(.gpg)
3.tee 参数
> /dev/null:抑制终端输出(因已通过管道显示内容)
第三步:使用 docker-compose编排文件,完成GVM服务部署
#先创建一个新目录用来存放下载的 Greenbone Community Edition docker compose 文件,文件类型为.yml
#1.创建下载目录
export DOWNLOAD_DIR=$HOME/greenbone-community-container && mkdir -p $DOWNLOAD_DIR#2.下载Docker Compose 文件
curl -f -O -L https://greenbone.github.io/docs/latest/_static/docker-compose.yml --output-dir "$DOWNLOAD_DIR"
关键说明
1.export 临时指定DOWNLOAD_DIR变量路径为$HOME/greenbon-community-container
注意:重启系统后会失效
2.因为国内网络访问greenbone.github.io社区步稳定,如果下载不成功可以多试几次。又或者用wget命令替代。
3. docker compose 文件提供的容器及其服务请参考官方社区:https://greenbone.github.io/docs/latest/22.4/container/index.html
第四步:启动Greenbone社区容器
使用以下载的docker-compose.yml文件,可以下载( 拉取 )容器镜像,并且可以在后台启动容器。
#下载 Greenbone 社区容器
docker compose -f $DOWNLOAD_DIR/docker-compose.yml pull#启动 Greenbone 社区容器
docker compose -f $DOWNLOAD_DIR/docker-compose.yml up -d#显示正在运行的容器中所有服务的日志消息
docker compose -f $DOWNLOAD_DIR/docker-compose.yml logs -f
#Ctrl-C 停止日志流。
下载容器镜像比较废时间,具体耗时与实际网速相关。完成后最好还是用最后一条命令查看容器服务的日志,如果有错修正后再试。
#删除容器和卷(所有数据)
docker compose -f $DOWNLOAD_DIR/docker-compose.yml down -v
设置 Admin 用户密码,这是web访问时的用户名和密码。
docker compose -f $DOWNLOAD_DIR/docker-compose.yml \exec -u gvmd gvmd gvmd --user=admin --new-password='<password>'
配置远程web访问服务
默认下,Web 服务器配置为仅侦听主机的本地地址 (127.0.0.1)。要允许在主机的所有接口上进行远程访问,必须修改docker-compose.yml文件以将 Web 服务器 gsad 配置为侦听所有网络接口。
sudo nano $DOWNLOAD_DIR/docker-compose.yml
修改docker-compose.yml文件内容:
...gsa:image: greenbone/gsa:stablerestart: on-failureports:- 127.0.0.1:9392:80 #删除此行- 9392:80 #增加此行volumes:- gvmd_socket_vol:/run/gvmddepends_on:- gvmd
...
保存退出后,重启容器:
docker compose -f $DOWNLOAD_DIR/docker-compose.yml up -d
在客户端浏览器地址栏输入:http://<服务器ip>:9392,即可。
在前文中修改docker-compose.yml文件时,我们修改的内容时9392:80,这代表http协议的9392端口提供web服务,可以按自己的需求修改。
另外,当进行到这一步实际打开web服务后,你会发现所访问的页面是英文的,不像我图中显示的是中文。
如果需要汉化,请参看后文:
GVM的汉化
汉化的原理很简单,在浏览器中发访问gvm时,页面内点击鼠标右键打开"检查"右窗格,然后选择”network",再刷新页面,你就会发现:
在访问站点时加载了一个gsa-en.json的文件,如下图所示:
这个json文件其实就是GVM的语言包,默认加载后可以切换英语和德语。
所以,小伙伴们可能就想到了,我们可以修改其语言包的加载项来实现汉化显示中文,方法很多,我这里介绍最简单的一种:
首先,我们需要进入到gsa的容器中:
#使用docker ps命令查看在运行的容器,可以看到一个name为greenbone-community-edition-gsa-1的容器,这就是gmv网站发布的容器。
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2e4757c9851e registry.community.greenbone.net/community/gsa:stable "/usr/local/bin/entr…" 7 minutes ago Up 4 minutes 0.0.0.0:9392->80/tcp, [::]:9392->80/tcp greenbone-community-edition-gsa-1
78f2c2586e6d registry.community.greenbone.net/community/gvmd:stable "/usr/local/bin/entr…" 25 minutes ago Up 24 minutes greenbone-community-edition-gvmd-1
68c61c23d533 registry.community.greenbone.net/community/openvas-scanner:stable "/bin/sh -c /usr/loc…" 25 minutes ago Up 24 minutes greenbone-community-edition-openvasd-1
58636a638997 registry.community.greenbone.net/community/ospd-openvas:stable "/usr/bin/tini -- /u…" 28 minutes ago Up 24 minutes greenbone-community-edition-ospd-openvas-1
eb11337bcd72 registry.community.greenbone.net/community/openvas-scanner:stable "/bin/sh -c 'cat /et…" 28 minutes ago Up 24 minutes greenbone-community-edition-openvas-1
3f1076d2df84 registry.community.greenbone.net/community/redis-server "/bin/sh -c 'rm -f /…" 28 minutes ago Up 25 minutes greenbone-community-edition-redis-server-1
289ae734b67c registry.community.greenbone.net/community/pg-gvm:stable "/usr/local/bin/entr…" 28 minutes ago Up 25 minutes greenbone-community-edition-pg-gvm-1#怕眼花看错,也可以加个过滤,查看gsa的容器名称和IDdocker ps --filter "name=gsa"
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2e4757c9851e registry.community.greenbone.net/community/gsa:stable "/usr/local/bin/entr…" 56 minutes ago Up 52 minutes 0.0.0.0:9392->80/tcp, [::]:9392->80/tcp greenbone-community-edition-gsa-1
然后,进入到greenbone-community-edition-gsa-1容器中:
#以交互的方式进入greenbone-community-edition_gsa_1
docker exec -it greenbone-community-edition_gsa_1 /bin/sh
进入web源代码目录,通过修改gsa-en.json文件完成汉化
# cd /usr/local/share/gvm/gsad/web/locales
# ls -l
total 476
-rw-r--r-- 1 root root 11681 Apr 8 09:08 gsa-ar.json
-rw-r--r-- 1 root root 132074 Apr 8 09:08 gsa-de.json
-rw-r--r-- 1 root root 121801 Apr 8 09:08 gsa-en.json
-rw-r--r-- 1 root root 3 Apr 8 09:08 gsa-fr.json
-rw-r--r-- 1 root root 11919 Apr 8 09:08 gsa-pt_BR.json
-rw-r--r-- 1 root root 3 Apr 8 09:08 gsa-ru.json
-rw-r--r-- 1 root root 3 Apr 8 09:08 gsa-tr.json
-rw-r--r-- 1 root root 106850 Apr 8 09:08 gsa-zh_CN.json
-rw-r--r-- 1 root root 78000 Apr 8 09:08 gsa-zh_TW.json
可以看到/usr/local/share/gvm/gsad/web/locales目录中,除了gsa-en.json文件外还有其他的语言包文件,其中gsa-zh_CN.json既是简体中文语言包。
接下来就简单了:
备份原gsa-en.json
# cp gsa-en.json gsa-en.json.bak修改gsa-zh_CN.json文件名为gsa-en.json
# cp gsa-zh_CN.json gsa-en.json
# exit
刷新浏览器,看到的就是中文界面的gvm(加载的虽然任然时gsa-en.json,但这是我们替换后的了)
要注意的是:
这种方式修改,只是临时性修改,当你重启容器后就会失效,除非文件挂载到宿主机的卷中(容器内文件的挂载,需要修改.yml文件内容,并重启容器,这里略过不再多少)
其实GVM汉化作用不是很大,因为它只汉化了web界面,输出的报告等还是英文的,要搞这个对我来说太难太费事,还不如直接上翻译软件。
所以……仅供参考。
附录:Kali GNU/Linux Rolling系统实操记录
最后,附上我在kali系统中的操作记录
(root㉿kali)-[~]
└─# for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt remove $pkg; done
Package 'docker.io' is not installed, so not removed
Summary:Upgrading: 0, Installing: 0, Removing: 0, Not Upgrading: 82
Package 'docker-doc' is not installed, so not removed
Summary:Upgrading: 0, Installing: 0, Removing: 0, Not Upgrading: 82
Package 'docker-compose' is not installed, so not removed
Summary:Upgrading: 0, Installing: 0, Removing: 0, Not Upgrading: 82
Package 'podman-docker' is not installed, so not removed
Summary:Upgrading: 0, Installing: 0, Removing: 0, Not Upgrading: 82
Package 'containerd' is not installed, so not removed
Summary:Upgrading: 0, Installing: 0, Removing: 0, Not Upgrading: 82
Package 'runc' is not installed, so not removed
Summary:Upgrading: 0, Installing: 0, Removing: 0, Not Upgrading: 82┌──(root㉿kali)-[~]
└─# sudo install -m 0755 -d /etc/apt/keyrings┌──(root㉿kali)-[~]
└─# curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod a+r /etc/apt/keyrings/docker.gpg
usage: gpg [options] --dearmor [file]┌──(root㉿kali)-[~]
└─# echo \
> "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
dquote> "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
pipe> sudo tee /etc/apt/sources.list.d/docker.list > /dev/null┌──(root㉿kali)-[~]
└─# sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin
docker-ce is already the newest version (5:28.1.1-1~debian.12~bookworm).
docker-ce-cli is already the newest version (5:28.1.1-1~debian.12~bookworm).
containerd.io is already the newest version (1.7.27-1).
docker-compose-plugin is already the newest version (2.35.1-1~debian.12~bookworm).
Summary:Upgrading: 0, Installing: 0, Removing: 0, Not Upgrading: 82──(root㉿kali)-[~]
└─# exit ┌──(root㉿kali)-[~]
└─# su blue
┌──(blue㉿kali)-[/root]
└─$ cd ~┌──(blue㉿kali)-[~]
└─$ ls┌──(blue㉿kali)-[~]
└─$ export DOWNLOAD_DIR=$HOME/greenbone-community-container && mkdir -p $DOWNLOAD_DIR┌──(blue㉿kali)-[~]
└─$ export DOWNLOAD_DIR=$HOME/greenbone-community-container && mkdir -p $DOWNLOAD_DIR┌──(blue㉿kali)-[~]
└─$ ls
greenbone-community-container┌──(blue㉿kali)-[~]
└─$ sudo usermod -aG docker $USER && su $USER
[sudo] password for blue:
Password:
┌──(blue㉿kali)-[~]
└─$ ls
greenbone-community-container┌──(blue㉿kali)-[~]
└─$ curl -f -O -L https://greenbone.github.io/docs/latest/_static/docker-compose.yml --output-dir "$DOWNLOAD_DIR"% Total % Received % Xferd Average Speed Time Time Time CurrentDload Upload Total Spent Left Speed
100 6642 100 6642 0 0 3355 0 0:00:01 0:00:01 --:--:-- 3354─(blue㉿kali)-[~]
└─$ docker compose -f $DOWNLOAD_DIR/docker-compose.yml pull
[+] Pulling 34/34✔ configure-openvas Skipped - Image is already being pulled by openvas 0.0s ✔ openvasd Skipped - Image is already being pulled by openvas 0.0s ✔ cert-bund-data Pulled 38.7s ✔ ospd-openvas Pulled 4.2s ✔ scap-data Pulled 1631.1s ✔ dfn-cert-data Pulled 20.0s ✔ gvmd Pulled 4.9s ✔ vulnerability-tests Pulled 288.0s ✔ gvm-tools Pulled 4.2s ✔ gpg-data Pulled 4.6s ✔ report-formats Pulled 25.4s ✔ data-objects Pulled 13.8s ✔ openvas Pulled 7.3s ✔ pg-gvm Pulled 4.6s ✔ redis-server Pulled 7.2s ✔ gsa Pulled 4.3s ✔ notus-data Pulled 4.4s ┌──(blue㉿kali)-[~]
└─$ docker compose -f $DOWNLOAD_DIR/docker-compose.yml up -d
[+] Running 25/29✔ Network greenbone-community-edition_default Created 0.1s ✔ Volume "greenbone-community-edition_gpg_data_vol" Created 0.0s ✔ Volume "greenbone-community-edition_data_objects_vol" Created 0.0s ✔ Volume "greenbone-community-edition_cert_data_vol" Created 0.0s ✔ Volume "greenbone-community-edition_vt_data_vol" Created 0.0s ✔ Volume "greenbone-community-edition_openvas_data_vol" Created 0.0s ✔ Volume "greenbone-community-edition_redis_socket_vol" Created 0.0s ✔ Volume "greenbone-community-edition_openvas_log_data_vol" Created 0.0s ✔ Volume "greenbone-community-edition_scap_data_vol" Created 0.0s ✔ Volume "greenbone-community-edition_ospd_openvas_socket_vol" Created 0.0s ✔ Volume "greenbone-community-edition_gvmd_data_vol" Created 0.0s ✔ Volume "greenbone-community-edition_notus_data_vol" Created 0.0s ✔ Volume "greenbone-community-edition_psql_data_vol" Created 0.0s ✔ Volume "greenbone-community-edition_gvmd_socket_vol" Created 0.0s ✔ Volume "greenbone-community-edition_psql_socket_vol" Created 0.0s ✔ Container greenbone-community-edition-redis-server-1 Created 2.5s ✔ Container greenbone-community-edition-cert-bund-data-1 Created 1.9s ✔ Container greenbone-community-edition-scap-data-1 Created 1.6s ✔ Container greenbone-community-edition-notus-data-1 Created 1.9s ✔ Container greenbone-community-edition-vulnerability-tests-1 Created 1.9s ✔ Container greenbone-community-edition-data-objects-1 Created 1.6s ⠦ Container greenbone-community-edition-pg-gvm-1 Creating 4.7s ✔ Container greenbone-community-edition-gpg-data-1 Created 1.9s ✔ Container greenbone-community-edition-configure-openvas-1 Created 2.4s ✔ Container greenbone-community-edition-report-formats-1 Created 2.0s ✔ Container greenbone-community-edition-dfn-cert-data-1 Created 2.2s ⠹ Container greenbone-community-edition-openvasd-1 Creating 2.2s ⠹ Container greenbone-community-edition-openvas-1 Creating 2.2s ⠹ Container greenbone-community-edition-ospd-openvas-1 Creating 2.2s
Error response from daemon: failed to mkdir /var/lib/docker/volumes/greenbone-community-edition_openvas_data_vol/_data/gnupg: mkdir /var/lib/docker/volumes/greenbone-community-edition_openvas_data_vol/_data/gnupg: file exists
#这里有个报错创建卷的时候已经存在该目录了,这个可能是因为我之前第一次拉起镜像失败的原因就是/var目标不够,所以调整/var卷空间后的残留,删除后重新启动就正常了。┌──(blue㉿kali)-[~]
└─$ sudo ls -ld /var/lib/docker/volumes/greenbone-community-edition_openvas_data_vol/_data/gnupg
[sudo] password for blue:
drwx------ 2 root root 4096 Apr 22 21:37 /var/lib/docker/volumes/greenbone-community-edition_openvas_data_vol/_data/gnupg┌──(blue㉿kali)-[~]
└─$ sudo ls -ld /var/lib/docker/volumes/greenbone-community-edition_openvas_data_vol/_data/gnupg
drwx------ 2 root root 4096 Apr 22 21:37 /var/lib/docker/volumes/greenbone-community-edition_openvas_data_vol/_data/gnupg┌──(blue㉿kali)-[~]
└─$ sudo rm -rf /var/lib/docker/volumes/greenbone-community-edition_openvas_data_vol/_data/gnupg┌──(blue㉿kali)-[~]
└─$ sudo ls -ld /var/lib/docker/volumes/greenbone-community-edition_openvas_data_vol/_data/gnupg
ls: cannot access '/var/lib/docker/volumes/greenbone-community-edition_openvas_data_vol/_data/gnupg': No such file or directory┌──(blue㉿kali)-[~]
└─$ docker compose -f $DOWNLOAD_DIR/docker-compose.yml up -d
[+] Running 17/17✔ Container greenbone-community-edition-gvmd-1 Started 93.7s ✔ Container greenbone-community-edition-openvasd-1 Started 89.2s ✔ Container greenbone-community-edition-gvm-tools-1 Started 94.6s ✔ Container greenbone-community-edition-gsa-1 Started 94.5s ✔ Container greenbone-community-edition-pg-gvm-1 Started 3.2s ✔ Container greenbone-community-edition-vulnerability-tests-1 Exited 86.2s ✔ Container greenbone-community-edition-gpg-data-1 Exited 39.2s ✔ Container greenbone-community-edition-redis-server-1 Started 2.8s ✔ Container greenbone-community-edition-notus-data-1 Started 3.2s ✔ Container greenbone-community-edition-cert-bund-data-1 Exited 84.9s ✔ Container greenbone-community-edition-scap-data-1 Exited 90.7s ✔ Container greenbone-community-edition-data-objects-1 Exited 85.2s ✔ Container greenbone-community-edition-configure-openvas-1 Exited 85.2s ✔ Container greenbone-community-edition-dfn-cert-data-1 Exited 82.0s ✔ Container greenbone-community-edition-report-formats-1 Exited 81.4s ✔ Container greenbone-community-edition-openvas-1 Started 1.7s ✔ Container greenbone-community-edition-ospd-openvas-1 Started ┌──(blue㉿kali)-[~]
└─$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4a25339b6ba5 registry.community.greenbone.net/community/gsa:stable "/usr/local/bin/entr…" 12 minutes ago Up 11 minutes 127.0.0.1:9392->80/tcp greenbone-community-edition-gsa-1
78f2c2586e6d registry.community.greenbone.net/community/gvmd:stable "/usr/local/bin/entr…" 12 minutes ago Up 11 minutes greenbone-community-edition-gvmd-1
68c61c23d533 registry.community.greenbone.net/community/openvas-scanner:stable "/bin/sh -c /usr/loc…" 12 minutes ago Up 11 minutes greenbone-community-edition-openvasd-1
58636a638997 registry.community.greenbone.net/community/ospd-openvas:stable "/usr/bin/tini -- /u…" 15 minutes ago Up 11 minutes greenbone-community-edition-ospd-openvas-1
eb11337bcd72 registry.community.greenbone.net/community/openvas-scanner:stable "/bin/sh -c 'cat /et…" 15 minutes ago Up 11 minutes greenbone-community-edition-openvas-1
3f1076d2df84 registry.community.greenbone.net/community/redis-server "/bin/sh -c 'rm -f /…" 15 minutes ago Up 12 minutes greenbone-community-edition-redis-server-1
289ae734b67c registry.community.greenbone.net/community/pg-gvm:stable "/usr/local/bin/entr…" 15 minutes ago Up 12 minutes greenbone-community-edition-pg-gvm-1┌──(blue㉿kali)-[~]
└─$ docker compose -f $DOWNLOAD_DIR/docker-compose.yml \
> exec -u gvmd gvmd gvmd --user=admin --new-password='aslghr634@#7gfhj662'
md main:MESSAGE:2025-04-24 07h39.54 utc:52: Greenbone Vulnerability Manager version 25.2.1 (DB revision 259)
md manage: INFO:2025-04-24 07h39.54 utc:52: Modifying user password.
md manage:MESSAGE:2025-04-24 07h39.55 utc:52: No SCAP database found┌──(blue㉿kali)-[~]
└─$ curl http://127.0.0.1:9392
<!doctype html>
<html lang="en"><head><meta charset="UTF-8" /><link rel="icon" href="/img/favicon.png" type="image/png" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Greenbone Security Assistant</title><script type="text/javascript" src="/config.js"></script><script type="module" crossorigin src="/assets/index-CU-VHQ9A.js"></script><link rel="modulepreload" crossorigin href="/assets/opensight-ui-BibHGzjq.js"><link rel="stylesheet" crossorigin href="/assets/opensight-ui-DDxyL7fw.css"><script type="module">import.meta.url;import("_").catch(()=>1);(async function*(){})().next();if(location.protocol!="file:"){window.__vite_is_modern_browser=true}</script><script type="module">!function(){if(window.__vite_is_modern_browser)return;console.warn("vite: loading legacy chunks, syntax error above and the same error below should be ignored");var e=document.getElementById("vite-legacy-polyfill"),n=document.createElement("script");n.src=e.src,n.onload=function(){System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))},document.body.appendChild(n)}();</script></head><body><div id="app"></div><div id="portals"></div><script>window.addEventListener('DOMContentLoaded', () => {try {const vendorLabel = config.vendorLabel;const match = vendorLabel.match(/gsm-(\w+)_label\.svg/);if (match) {let labelPart = match[1];if (isNaN(labelPart)) {labelPart = labelPart.toUpperCase();}const pageTitle = `Greenbone - ${labelPart}`;document.title = pageTitle;} else {document.title = 'Greenbone Security Assistant';}} catch (error) {}});</script><script nomodule>!function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",(function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()}),!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();</script><script nomodule crossorigin id="vite-legacy-polyfill" src="/assets/polyfills-legacy-CkbRX7EO.js"></script><script nomodule crossorigin id="vite-legacy-entry" data-src="/assets/index-legacy-B95omMZq.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script></body>
</html>