Обновление Greenbone Vulnerability Management (GVM) на Debian 11 Bullseye

Опишу порядок действий по обновлению Greenbone Vulnerability Management (GVM) до актуальной версии.

Обновление GVM буду производить с версии 22.4.1 до 22.7.3 (самая актуальная на дату написания статьи). Все действия ниже будут выполняться от root.

 

Сперва останавливаем службы GVM:

systemctl stop notus-scanner
systemctl stop ospd-openvas
systemctl stop gvmd
systemctl stop gsad

 

Greenbone Security Assistant (GSA) требуется установленная версия NodeJS >= v18.x. В моем случае NodeJS была установлена версии v14.x., если у вас так же, то выполняем обновление NodeJS до v18.x.:

export NODE_VERSION=node_18.x
export KEYRING=/usr/share/keyrings/nodesource.gpg
export DISTRIBUTION="$(lsb_release -s -c)"

curl -fsSL https://deb.nodesource.com/gpgkey/nodesource.gpg.key | gpg --dearmor | sudo tee "$KEYRING" >/dev/null
gpg --no-default-keyring --keyring "$KEYRING" --list-keys
echo "deb [signed-by=$KEYRING] https://deb.nodesource.com/$NODE_VERSION $DISTRIBUTION main" | sudo tee /etc/apt/sources.list.d/nodesource.list
echo "deb-src [signed-by=$KEYRING] https://deb.nodesource.com/$NODE_VERSION $DISTRIBUTION main" | sudo tee -a /etc/apt/sources.list.d/nodesource.list

apt-get update && apt-get upgrade
node -v

 

Для удобства создадим каталог для размещения актуальных версий пакетов входящих в состав GVM и скачиваем исходников пакетов и распаковываем их:

mkdir -p /opt/update
cd /opt/update/

export GVM_LIBS_VERSION=$(curl -s https://api.github.com/repos/greenbone/gvm-libs/releases/latest | grep -Po '"tag_name":.*?[^\\]",' | awk '{print $2}' | sed  's/^..\(.*\)..$/\1/')
export GVMD_VERSION=$(curl -s https://api.github.com/repos/greenbone/gvmd/releases/latest | grep -Po '"tag_name":.*?[^\\]",' | awk '{print $2}' | sed  's/^..\(.*\)..$/\1/')
export PG_GVM_VERSION=$(curl -s https://api.github.com/repos/greenbone/pg-gvm/releases/latest | grep -Po '"tag_name":.*?[^\\]",' | awk '{print $2}' | sed  's/^..\(.*\)..$/\1/')
export GSA_VERSION=$(curl -s https://api.github.com/repos/greenbone/gsa/releases/latest | grep -Po '"tag_name":.*?[^\\]",' | awk '{print $2}' | sed  's/^..\(.*\)..$/\1/')
export GSAD_VERSION=$(curl -s https://api.github.com/repos/greenbone/gsad/releases/latest | grep -Po '"tag_name":.*?[^\\]",' | awk '{print $2}' | sed  's/^..\(.*\)..$/\1/')
export OPENVAS_SMB_VERSION=$(curl -s https://api.github.com/repos/greenbone/openvas-smb/releases/latest | grep -Po '"tag_name":.*?[^\\]",' | awk '{print $2}' | sed  's/^..\(.*\)..$/\1/')
export OPENVAS_SCANNER_VERSION=$(curl -s https://api.github.com/repos/greenbone/openvas-scanner/releases/latest | grep -Po '"tag_name":.*?[^\\]",' | awk '{print $2}' | sed  's/^..\(.*\)..$/\1/')
export OSPD_OPENVAS_VERSION=$(curl -s https://api.github.com/repos/greenbone/ospd-openvas/releases/latest | grep -Po '"tag_name":.*?[^\\]",' | awk '{print $2}' | sed  's/^..\(.*\)..$/\1/')
export NOTUS_VERSION=$(curl -s https://api.github.com/repos/greenbone/notus-scanner/releases/latest | grep -Po '"tag_name":.*?[^\\]",' | awk '{print $2}' | sed  's/^..\(.*\)..$/\1/')

echo $GVM_LIBS_VERSION
echo $GVMD_VERSION
echo $PG_GVM_VERSION
echo $GSA_VERSION
echo $GSAD_VERSION
echo $OPENVAS_SMB_VERSION
echo $OPENVAS_SCANNER_VERSION
echo $OSPD_OPENVAS_VERSION
echo $NOTUS_VERSION

curl -f -L https://github.com/greenbone/gvm-libs/archive/refs/tags/v$GVM_LIBS_VERSION.tar.gz -o gvm-libs-$GVM_LIBS_VERSION.tar.gz
curl -f -L https://github.com/greenbone/gvmd/archive/refs/tags/v$GVMD_VERSION.tar.gz -o gvmd-$GVMD_VERSION.tar.gz
curl -f -L https://github.com/greenbone/pg-gvm/archive/refs/tags/v$PG_GVM_VERSION.tar.gz -o pg-gvm-$PG_GVM_VERSION.tar.gz
curl -f -L https://github.com/greenbone/gsa/archive/refs/tags/v$GSA_VERSION.tar.gz -o gsa-$GSA_VERSION.tar.gz
curl -f -L https://github.com/greenbone/gsad/archive/refs/tags/v$GSAD_VERSION.tar.gz -o gsad-$GSAD_VERSION.tar.gz
curl -f -L https://github.com/greenbone/openvas-smb/archive/refs/tags/v$OPENVAS_SMB_VERSION.tar.gz -o openvas-smb-$OPENVAS_SMB_VERSION.tar.gz
curl -f -L https://github.com/greenbone/openvas-scanner/archive/refs/tags/v$OPENVAS_SCANNER_VERSION.tar.gz -o openvas-scanner-$OPENVAS_SCANNER_VERSION.tar.gz
curl -f -L https://github.com/greenbone/ospd-openvas/archive/refs/tags/v$OSPD_OPENVAS_VERSION.tar.gz -o ospd-openvas-$OSPD_OPENVAS_VERSION.tar.gz
curl -f -L https://github.com/greenbone/notus-scanner/archive/refs/tags/v$NOTUS_VERSION.tar.gz -o notus-scanner-$NOTUS_VERSION.tar.gz

tar -xvzf gvm-libs-$GVM_LIBS_VERSION.tar.gz && mv gvm-libs-$GVM_LIBS_VERSION gvm-libs
tar -xvzf gvmd-$GVMD_VERSION.tar.gz && mv gvmd-$GVMD_VERSION gvmd
tar -xvzf pg-gvm-$PG_GVM_VERSION.tar.gz && mv pg-gvm-$PG_GVM_VERSION pg-gvm
tar -xvzf gsa-$GSA_VERSION.tar.gz && mv gsa-$GSA_VERSION gsa
tar -xvzf gsad-$GSAD_VERSION.tar.gz && mv gsad-$GSAD_VERSION gsad
tar -xvzf openvas-smb-$OPENVAS_SMB_VERSION.tar.gz && mv openvas-smb-$OPENVAS_SMB_VERSION openvas-smb
tar -xvzf openvas-scanner-$OPENVAS_SCANNER_VERSION.tar.gz && mv openvas-scanner-$OPENVAS_SCANNER_VERSION openvas-scanner
tar -xvzf ospd-openvas-$OSPD_OPENVAS_VERSION.tar.gz && mv ospd-openvas-$OSPD_OPENVAS_VERSION ospd-openvas
tar -xvzf notus-scanner-$NOTUS_VERSION.tar.gz && mv notus-scanner-$NOTUS_VERSION notus-scanner

Читать далее

Как очистить почтовые ящики Dovecot из командной строки.

При использовании Postfix и Dovecot, в какой-то момент столкнулся с проблемой, что некоторые почтовые ящики пользователей заполнились настолько, что попытки удалить почту через web-клиент приводили к его зависанию. В папках было огромное количество спам-писем.

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

 

Для полной очистки папки INBOX для ВСЕХ пользоватлей, команда:

doveadm expunge -A mailbox INBOX ALL

Для полной очистки папки INBOX конкретного пользователя, команда:

doveadm expunge -u example@domain.com mailbox INBOX ALL
ИНФОРМАЦИЯ. Тут очищается папка «Входящие» — INBOX, для «Отправленные» надо заменить на SENT.

 

Для очистки папки INBOX писем стерше 2х недель, выполним команду:

doveadm expunge -A mailbox INBOX savedbefore 2w

Для очистки папки INBOX писем стерше 1го дня, выполним команду:

doveadm expunge -A mailbox INBOX before 1d

Читать далее

Как ввести Debian в домен Windows (Active Directory) с помощью realmd, SSSD.

Рассмотрим как ввести систему Debian в домен Windows с помощью realmd, SSSD.

Realmd (Realm Discovery) – сервис D-Bus, позволяющий производить настройку сетевой аутентификации и членства в домене (Active Directory) без сложных настроек. Информация о домене обнаруживается автоматически. Для аутентификации и проверки учетных записей realmd использует SSSD (через Kerberos и LDAP) или Winbind.

SSSD (System Security Services Daemon) — это клиентский компонент централизованных решений для управления идентификацией, таких как Microsoft Active Directory, Kerberos, OpenLDAP  и других серверов каталогов. SSSD обслуживает и кэширует информацию, хранящуюся на удаленном сервере каталогов, и предоставляет услуги идентификации, аутентификации и авторизации хост-машине.

 

Исходные данные:

  • Контроллер домена (DC1) на Windows Server 2019, домен JAKONDA.LOCAL (IP — 192.168.1.100)
  • Linux система (debian) на Debian 11 Bullseye (IP — 192.168.1.10)

 

Подготовка системы

# Обновляем информацию о репозиториях и обновляем установленные пакеты:

apt-get update && apt-get upgrade -y

 

Указываем FQDN (Fully Qualified Domain Name) имя системы, в файле /etc/hostname:

debian.jakonda.local

Файл /etc/hosts приводим к виду таким образом, чтобы в нём была запись с полным доменным именем компьютера и с коротким именем, ссылающаяся на один из внутренних IP хоста:

127.0.0.1	localhost
192.168.1.10	debian.jakonda.local debian

 

Настраиваем клиент DNS на хосте. Файл /etc/resolv.conf приводим к виду с учетом ваших данных:

domain jakonda.local
search jakonda.local
nameserver 192.168.1.100

 

Настройка синхронизации времени

Очень важно для корректной работы чтобы разница во времени между хостом и домен контроллером была минимальная или не превышала более 5 минут, в противном случае не возможно получить билет от Kerberos. Настроим синхронизацию времени с контроллером домена.

 

# Устанавливаем необходимые пакеты:

apt-get install ntp ntpdate

В файле /etc/ntp.conf, указываем контроллер домена в качестве точки синхранизации, остальные комментируем :

# You do need to talk to an NTP server or two (or three).
server dc1.jakonda.local

# pool.ntp.org maps to about 1000 low-stratum NTP servers.  Your server will
# pick a different set every time it starts up.  Please consider joining the
# pool: <http://www.pool.ntp.org/join.html>
# pool 0.debian.pool.ntp.org iburst
# pool 1.debian.pool.ntp.org iburst
# pool 2.debian.pool.ntp.org iburst
# pool 3.debian.pool.ntp.org iburst

Выполняем единовременную синхронизацию времени с контроллером домена и запускаем службу:

/etc/init.d/ntp stop
ntpdate -bs jakonda.local
/etc/init.d/ntp start

Читать далее

Установка из исходников OpenConnect VPN-сервера (ocserv) на Debian 11 Bullseye

Разберем как установить из исходников актуальную (на момент написания статьи) версию VPN-сервера OpenConnect 1.2.2 на Debian 11 Bullseye.

# Все ниже действия будут производится из под root.

 

# Обновляем информацию о репозиториях и обновляем установленные пакеты:

apt-get update && apt-get upgrade -y

# Устанавливаем необходимые зависимости:

apt-get install build-essential make pkg-config libgnutls28-dev libev-dev libpam0g-dev liblz4-dev libseccomp-dev libreadline-dev libnl-route-3-dev libkrb5-dev libradcli-dev libpcl1-dev libcjose-dev libjansson-dev liboath-dev libprotobuf-c-dev libtalloc-dev libhttp-parser-dev libcurlpp-dev libssl-dev libmaxminddb-dev libbsd-dev libsystemd-dev libwrap0-dev libuid-wrapper libpam-wrapper libnss-wrapper libsocket-wrapper gss-ntlmssp tcpdump protobuf-c-compiler iperf3 lcov ssl-cert libpam-oath

 

# Скачиваем и распаковываем исходники OpenConnect (на момент написания статьи последняя версия 1.2.2):

wget -P /opt/ https://www.infradead.org/ocserv/download/ocserv-1.2.2.tar.xz
tar -xvf /opt/ocserv-1.2.2.tar.xz -C /opt/ 

cd /opt/ocserv-1.2.2

# Собираем и устанавливаем — OpenConnect:

./configure --prefix= --enable-oidc-auth

make && make install

 

# Создаем рабочий каталог для ocserv и копируем примеры файлов конфигурации в него:

mkdir -p /etc/ocserv/

cp doc/sample.config /etc/ocserv/ocserv.conf
cp doc/sample.passwd /etc/ocserv/
cp doc/sample.otp /etc/ocserv/
cp doc/profile.xml /etc/ocserv/

 

# Создаем пользователя ocserv от которого будет работать служба:

useradd -r -M -U -s /usr/sbin/nologin ocserv

Читать далее

Центр сертификации OpenSSL (Root и Intermediate CA certificates) на Debian 11 Bullseye

Разберем как поднять двухуровневую PKI (Root и Intermediate CA) инфраструктуру на базе OpenSSL в Debian 11 Bullseye.

Схема PKI (Root и Intermediate CA) инфраструктуры:

 

Используемые сервера и их обозначения в инструкции ниже:

  • Корневой ЦС — rootCA
  • Промедуточный ЦС — intermidiateCA
  • OCSP Responder — intermidiateCA
  • Веб-сервер — webCA

 

Устанавливаем OpenSSL на оба сервера (rootCA, intermidiateCA):

apt-get install openssl -y
ИНФОРМАЦИЯ. Если необходима поддерка шифрования по ГОСТ Р 34.10-2012 в OpenSSL, то установку OpenSSL следует выполнять по этой статье — Шифрование по ГОСТ Р 34.10-2012 в OpenSSL 1.1.1 на Debian 10 Buster 

 

Корневой центр сертификации (Offline Root CA)

Структура каталогов и файлов

Создадим структуру каталогов для хранения файлов ЦС, сертификатов и закрытых ключей:

mkdir -p /opt/CA/rootCA/{certs,crl,newcerts,private,csr}
cd /opt/CA/rootCA

где:

certs Этот каталог содержит сертификаты, сгенерированные и подписанные ЦС.
crl Каталог списка отзыва сертификатов (CRL) содержит списки отзыва сертификатов, сгенерированные ЦС.
newcerts В этом каталоге хранится копия каждого сертификата, подписанного ЦС, с серийным номером сертификата в качестве имени файла.
private Этот каталог содержит закрытые ключи для ЦС, включая закрытые ключи корневого ЦС и промежуточного ЦС. Эти ключи используются для подписи сертификатов и CRL.
csr В этом каталоге хранится копия каждого запроса сертификата.

Читать далее

Как изменить размер раздел диска Linux

Рассмотрим как на виртуальной машине Linux увеличить раздел диска без LVM.

Исходные данные

  • Debian 11
  • Исходный размер /dev/sda — 20G
  • Необходимо увеличить размер /dev/sda — 25G

 

Исходные данные

В системе один диск /dev/sda размером 20G, отобразим информацию по нему:

fdisk -l

Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 sectors
Disk model: Virtual Disk
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0x73000288

Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 39942143 39940096 19G 83 Linux
/dev/sda2 39944190 41940991 1996802 975M 5 Extended
/dev/sda5 39944192 41940991 1996800 975M 82 Linux swap / Solaris
df -h

Filesystem Size Used Avail Use% Mounted on
udev       944M 0     944M   0% /dev
tmpfs      192M 500K  192M   1% /run
/dev/sda1   19G 990M   17G   6% /
tmpfs      960M    0  960M   0% /dev/shm
tmpfs      5.0M    0  5.0M   0% /run/lock
tmpfs      192M    0  192M   0% /run/user/1000

 

Увеличение размера диска

Увеличиваем размер жесткого диска в ВМ, в моем случае я увеличиваю до 25G. После расширения диска в ВМ, принудительно выполним рескан дисков, командой:

echo 1 > /sys/block/sda/device/rescan

Проверяем изменения. В случае если после рескана размер диска не увеличился в системе, то выполняем перезагрузку и проверяем повторно.

fdisk -l

Disk /dev/sda: 25 GiB, 26843545600 bytes, 52428800 sectors
Disk model: Virtual Disk
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0x73000288

Device     Boot    Start      End  Sectors  Size Id Type
/dev/sda1  *        2048 39942143 39940096   19G 83 Linux
/dev/sda2       39944190 41940991  1996802  975M  5 Extended
/dev/sda5       39944192 41940991  1996800  975M 82 Linux swap / Solaris
ВНИМАНИЕ. Рекомендуется перед последующими действиями сделать резервную копию ВМ.

Читать далее

Не освободилось место после удаления файла в Linux

Иногда сталкиваюсь с таким явлением как место не освобождается после удаления файла в Linux, это случает в случае если удаленный файл все еще занят каким-либо процессом.

 

К примеру мы имеем большой файл /var/log/mysql/error.log и мы его удалили:

rm -rf /var/log/mysql/error.log

 

Теперь проверим удалился ли файл или все еще фактически остался на диске и используется каким либо процессом, выполним команду:

lsof | grep deleted | grep error.log

COMMAND   PID  TID TASKCMD   USER   FD   TYPE   DEVICE   SIZE/OFF  NODE   NAME
mariadbd  641  768 mariadbd  mysql  6u   REG    8,1      178689523 917524 /var/log/mysql/error.log (deleted)

Видим что файл /var/log/mysql/error.log с пометкой (deleted) занят процессом mariadbd и не может быть удален. Можно конечно перезагрузить сервер и тогда файл удалится, но не всегда перезагрузка возможна, поэтому мы освободим удаленный файл от процесса, тем самым высвободим занимаемое им место.

 

Зная PID процесса (641) найдем номер файлового дескриптора удаленного файла, командой:

ls -l /proc/641/fd | grep error.log

l-wx—— 1 root root 64 Dec 25 10:00 10 -> /var/log/mysql/error.log

Читать далее

Полезные команды по работе с SSL-сертификатами при помощи OpenSSL

Иногда приходится работать с SSL-сертификатами и каждый раз приходится вспоминать, либо искать информацию как сделать то или иное действие с сертификатами при помощи OpenSSL.

Поэтому решил создать дополняему статью на тему полезных команд по работе с SSL-сертификатами при помощи OpenSSL.

 

Проверка на валидность сертификата

Проверка .pem, .crt — сертификата.
Проверка .key — приватного ключа.
Проверка .csr — ключ запроса сертификата.

MD5 у всех должен совпадать. Важно чтобы MD5 были одинаковые только у приватного ключа (.key) и сертификата (.pem, .crt), .csr нужен в случае если понадобится продлевать данный сертификат.

openssl x509 -noout -modulus -in server.crt | openssl md5
openssl rsa -noout -modulus -in server.key | openssl md5
openssl req -noout -modulus -in request.csr | openssl md5

Пример.

root@openssl:~/intermediate# openssl rsa -noout -modulus -in private/server.key | openssl md5
(stdin)= f6647d0867087e0adae0d65d5451a994
root@openssl:~/intermediate# openssl x509 -noout -modulus -in certs/server.crt | openssl md5
(stdin)= f6647d0867087e0adae0d65d5451a994
root@openssl:~/intermediate# openssl req -noout -modulus -in csr/server.csr | openssl md5
(stdin)= f6647d0867087e0adae0d65d5451a994

Читать далее

Как извлечь файлы .crt и .key из файла .pfx

Файл .pfx, который находится в формате PKCS#12, содержит сертификат SSL (открытые ключи) и соответствующие закрытые ключи. Иногда необходимо извлечь сертификат и закрытый ключ в незашифрованный текстовый формат, чтобы использовать их в другой системе.

Рассморим как преобразовать файл .pfx в отдельные файлы .crt и .key.

 

Извлечение .crt и .key из файла .pfx

Команда чтобы извлечь закрытый ключ:

openssl pkcs12 -in [yourfile.pfx] -nocerts -out [encrypted_key.key]

В процессе извлечения необходимо ввести пароль, который использовали при создании файла .pfx. Далее будет предложено ввести новый пароль для защиты экспортируемого файла .key.

 

Команда чтобы расшифровать закрытый ключ:

openssl rsa -in [encrypted_key.key] -out [decrypted_key.key]

Для дешифрации необходимо ввести пароль, который задавали для защиты файла закрытого ключа на предыдущем шаге.

 

Команда чтобы извлечь сертификат:

openssl pkcs12 -in [yourfile.pfx] -clcerts -nokeys -out [certificate.crt]

Читать далее

Ошибка — Cannot find key for kvno in keytab

В один момент перестала работать Kerberos/SSO аутентификация на сайте размещённом на веб-сервере Apache, в логах значатся ошибки вида:

...
[Mon Sep 04 11:04:58.724720 2023] [auth_kerb:error] [pid 19547] [client 10.51.90.61:58932] gss_accept_sec_context() failed: Unspecified GSS failure. Minor code may provide more information (, Cannot find key for HTTP/svc.web@JAKONDA.LOCAL kvno 4 in keytab)
...

 

Проверяем текущее значение номера Key Version Number (KVNO) в keytab-файле:

klist -k /etc/svc.web.keytab

Keytab name: FILE:/etc/svc.web.keytab
KVNO Principal
---- --------------------------------------------------------------------------
   2 HTTP/zabbix.jakonda.ru@JAKONDA.LOCAL

Видим что номер Key Version Number (KVNO) учётной записи равен 2, в то время у учетной записи AD атрибут msDS-KeyVersionNumber равен 4.

Такое может получится при внесении изменений в учетную запись, к примеру при смене пароля и т.д., в этом случае все keytab-файлы, которые генерировались ранее для этой учётной записи (где номер KVNO меньше текущего) становятся недействительными.

 

В Windows можно посмотреть текущее значение KVNO для учетной записи в свойствах учётной записи — атрибут msDS-KeyVersionNumber

Читать далее