Сканирование уязвимостей с помощью Vuls в Ubuntu 18.04

Vuls – это сканер уязвимостей с открытым исходным кодом, написанный на Go. Он автоматизирует анализ уязвимостей программного обеспечения, установленного в системе, что довольно сложно сделать вручную в производственной среде. Vuls использует несколько известных баз данных уязвимостей, например Национальную базу данных уязвимостей (NVD). Будучи легким и не требовательным к ресурсам, Vuls может сканировать несколько систем одновременно и отправлять отчеты по электронной почте или в Slack. Он имеет три режима сканирования (fast, fast root и deep).

Vuls не обеспечивает широкое сканирование ИТ-безопасности; например, он не отслеживает сетевой трафик и не защищает от brute-force атак. Однако Vuls предоставляет средство автоматизации отчетов об уязвимостях для пакетов Linux. Когда базы данных, используемые Vuls, будут проинформированы об исправлении определенных уязвимостей, Vuls также включит эту информацию об исправлении в свои отчеты. При создании отчетов Vuls определяет приоритетность наиболее важных уязвимостей, используя установленную систему ранжирования из базы данных.

В этом мануале вы научитесь развертывать Vuls на сервере Ubuntu 18.04. Это включает в себя сборку Vuls и его зависимостей из исходного кода, настройку сканирования и отправки отчетов в Slack и (опционально) подключение к целевым машинам для удаленного сканирования. В результате у вас будет автоматизированная система, которая сможет предупреждать вас об уязвимостях, устраняя необходимость ручных проверок.

Требования

  • Сервер Ubuntu 18.04, настроенный по этому мануалу (пользователь sudo условно называется 8host).
  • 2 Гб RAM минимум.
  • (Опционально) Еще несколько серверов, желательно тоже Ubuntu 18.04, с доступом root и дополнительным пользователем sudo. Они нужны, если вы хотите попробовать настроить удаленное сканирование уязвимостей. В этом мануале аккаунт на втором сервер условно называется 8host-blog.

1: Установка зависимостей

Сначала нужно создать папку для хранения данных Vuls, установить последнюю версию языка программирования Go и установить другие пакеты и зависимости Vuls.

Войдите на главный сервер как пользователь 8host.

ssh 8host@your_server_ip

В мануале мы будем хранить данные Vuls в каталоге /usr/share/vuls-data. Создайте его:

sudo mkdir /usr/share/vuls-data

Чтобы у пользователя 8host был доступ к этому каталогу, введите команду:

sudo chown -R 8host /usr/share/vuls-data

Теперь у вас есть каталог vuls-data, который будет вашим рабочим пространством. Прежде чем вы перейдете к установке требуемых пакетов, обновите индекс локальных пакетов:

sudo apt update

Чтобы загрузить и скомпилировать зависимости, установите git, gcc, make, sqlite, debian-goodies, golang-go и wget.

sqlite – это СУБД, которую вы будете использовать для хранения информации об уязвимостях. debian-goodies содержит утилиту checkrestart, которая предоставляет информацию о том, какие пакеты можно и нужно перезапускать в тот или иной момент времени. golang-go – это язык программирования Go.

Вы можете установить их все одной командой:

sudo apt install sqlite git debian-goodies gcc make wget golang-go -y

Вы установили все необходимые пакеты, в том числе Go.

Для работы Go требуется установить несколько переменных среды: GOPATH и PATH. GOPATH определяет рабочий каталог для Go, а значение переменной PATH (она содержит каталоги, в которые помещаются программы) нужно расширить, чтобы сообщить системе, где она может найти Go.

Эти переменные среды необходимо устанавливать каждый раз, когда пользователь входит в систему. Чтобы автоматизировать этот процесс,  создайте исполняемый файл go-env.sh в /etc/profile.d. Этот файл будет выполняться каждый раз, когда пользователь входит в систему.

sudo nano /etc/profile.d/go-env.sh

Добавьте в файл следующие строки:

export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin

Команда export устанавливает заданной переменной среды необходимое значение; здесь она используется для заполнения GOPATH и PATH соответствующими значениями.

Сохраните и закройте файл.

В настоящее время go-env.sh не является исполняемым. Чтобы это исправить, выполните следующую команду:

sudo chmod +x /etc/profile.d/go-env.sh

Чтобы обновить настройки в текущей сессии, введите:

source /etc/profile.d/go-env.sh

Исходная команда перезагружает данный файл в текущей оболочке.

В этом разделе вы установили язык Go, настроили его переменные среды и установили пакеты, которые вам потребуются позже. Далее нужно загрузить и скомпилировать программы Go, необходимые для Vuls. Этими программами являются go-cve-dictionary и goval-dictionary, которые Vuls использует для запросов к базам данных уязвимостей.

2: Установка и запуск go-cve-dictionary

В этом разделе вы скачаете и скомпилируете go-cve-dictionary, пакет Go, который обеспечивает доступ к NVD (Национальной базе данных уязвимостей). Затем мы запустим его и получим данные об уязвимостях для Vuls. NVD – это хранилище данных правительства США об уязвимостях кибербезопасности, содержащее идентификаторы уязвимостей (CVE – Common Vulnerabilities and Exposures), резюме и анализ воздействия. Оно также доступно в машиночитаемом формате.

Go хранит пакеты в $GOPATH/src/. Вы можете добавить подкаталоги, чтобы отметить происхождение пакета. К примеру, пакеты с GitHub, разработанные пользователем example-user, будут храниться в каталоге $GOPATH/src/github.com/example-user.

Сначала мы установим go-cve-dictionary (он разработан kotakanbe) путем клонирования пакета Go с GitHub и последующей его компиляции.

Начните с создания каталога для хранения пакета (согласно вышеприведенному примеру пути):

mkdir -p $GOPATH/src/github.com/kotakanbe

Перейдите в этот каталог:

cd $GOPATH/src/github.com/kotakanbe

Затем клонируйте go-cve-dictionary с GitHub на ваш сервер:

git clone https://github.com/kotakanbe/go-cve-dictionary.git

Перейдите в корневой каталог пакета:

cd go-cve-dictionary

Скомпилируйте и установите его:

make install

Помните, что выполнение этой команды может занять некоторое время. Чтобы сделать пакет доступным для всей системы, скопируйте его в /usr/local/bin:

sudo cp $GOPATH/bin/go-cve-dictionary /usr/local/bin

go-cve-dictionary требует доступа к логам, по умолчанию они хранятся в каталоге /var/log/vuls. Создайте его:

sudo mkdir /var/log/vuls

Прямо сейчас каталог лог-файлов доступен для чтения всем пользователям. Ограничить доступ к каталогу текущим пользователем можно с помощью следующей команды:

sudo chmod 700 /var/log/vuls

Флаги привилегий 700 ограничивают доступ к каталогу для всех пользователей, кроме владельца.

Чтобы сделать каталог доступным для 8host или другого пользователя, выполните следующую команду:

sudo chown -R 8host /var/log/vuls

Теперь можно извлечь данные об уязвимостях с NVD в рабочее пространство Vuls (каталог /usr/share/vuls-data):

for i in `seq 2002 $(date +"%Y")`; do sudo go-cve-dictionary fetchnvd -dbpath /usr/share/vuls-data/cve.sqlite3 -years $i; done

Эта команда итерирует данные с 2002 года по текущий год (seq 2002 $(date +»%Y»)) и вызывает go-cve-dictionary fetchnvd для извлечения данных NVD за текущий год путем передачи -years $i. Затем она сохраняет эту информацию в базе данных в /usr/share/vuls-data.

Примечание: Выполнение этой команды займет много времени и завершится ошибкой, если на вашем сервере менее 2 ГБ RAM.

Итак, вы загрузили и установили go-cve-dictionary и получили данные NVD для последующего использования в Vuls. В следующем разделе вы загрузите и установите goval-dictionary и извлечете данные OVAL для Ubuntu.

3: Установка и запуск goval-dictionary

Скачайте и скомпилируйте goval-dictionary, пакет Go, который предоставляет доступ к базе данных OVAL для Ubuntu. Затем мы запустим его и получим данные об уязвимостях для использования Vuls. OVAL расшифровывается как Open Vulnerability and Assessment Language, он является открытым языком, используемым для быстрой проверки и позволяет определить, существуют ли уязвимости программного обеспечения в данной системе.

Тот же автор, kotakanbe, написал и goval-dictionary. Потому его нужно хранить рядом с предыдущим пакетом.

Перейдите в папку $GOPATH/src/github.com/kotakanbe:

cd $GOPATH/src/github.com/kotakanbe

Клонируйте пакет с GitHub:

git clone https://github.com/kotakanbe/goval-dictionary.git

Перейдите в каталог пакета:

cd goval-dictionary

Скомпилируйте и установите пакет с помощью make:

make install

Скопируйте его в /usr/local/bin, чтобы сделать его общедоступным.

sudo cp $GOPATH/bin/goval-dictionary /usr/local/bin

Затем извлеките данные OVAL для Ubuntu 18.x:

sudo goval-dictionary fetch-ubuntu -dbpath=/usr/share/vuls-data/oval.sqlite3 18

Итак, вы загрузили и установили goval-dictionary и получили данные OVAL для Ubuntu 18.x.

4: Загрузка и настройка Vuls

Установив все зависимости, вы можете загрузить и скомпилировать Vuls из исходного кода. После этого вы настроите его для сканирования локального компьютера.

Создайте новый каталог с помощью следующей команды:

mkdir -p $GOPATH/src/github.com/future-architect

Перейдите в него:

cd $GOPATH/src/github.com/future-architect

Клонируйте Vuls с GitHub:

git clone https://github.com/future-architect/vuls.git

Перейдите в каталог проекта:

cd vuls

Скомпилируйте и установите пакет:

make install

Помните, что выполнение этой команды может занять некоторое время.

Скопируйте пакет в /usr/local/bin, чтобы сделать его общедоступным:

sudo cp $GOPATH/bin/vuls /usr/local/bin

Теперь нужно создать конфигурационный файл для Vuls. Вернитесь в /usr/share/vuls-data:

cd /usr/share/vuls-data

Vuls хранит свою конфигурацию в файле TOML, который должен называться config.toml. Создайте его, используя текстовый редактор:

sudo nano config.toml

Введите следующую конфигурацию:

[cveDict]
type = "sqlite3"
SQLite3Path = "/usr/share/vuls-data/cve.sqlite3"
[ovalDict]
type = "sqlite3"
SQLite3Path = "/usr/share/vuls-data/oval.sqlite3"
[servers]
[servers.localhost]
host = "localhost"
port = "local"
scanMode = [ "fast" ]
#scanMode = ["fast", "fast-root", "deep", "offline"]

Первые два раздела этой конфигурации (cveDict и ovalDict) указывают базы данных уязвимостей, которые вы создали ранее. Следующий раздел (servers) содержит информацию, связанную с сервером. Отдельные разделы будут группировать информацию о каждом сервере. Единственный сервер, который будет сканировать Vuls по этой конфигурации – это локальный сервер (localhost).

Vuls предоставляет четыре режима сканирования:

  • Быстрый режим (по умолчанию): сканирует без привилегий root, не имеет зависимостей и использует мало ресурсов на целевом сервере.
  • Быстрый режим root: сканирует с правами суперпользователя и может обнаруживать обновленные, но еще не перезапущенные процессы.
  • Режим глубокого сканирования: аналогичен режиму быстрого сканирования root, но проверяет логи изменений, что может привести к высокой нагрузке на целевой сервер.
  • Оффлайн режим: сканирует машину без доступа к Интернету и может использоваться в сочетании с другими режимами.

Сохраните и закройте файл.

Чтобы проверить конфигурацию, введите:

vuls configtest

Вы увидите вывод:

[Feb 27 19:36:42]  INFO [localhost] Validating config...
[Feb 27 19:36:42]  INFO [localhost] Detecting Server/Container OS...
[Feb 27 19:36:42]  INFO [localhost] Detecting OS of servers...
[Feb 27 19:36:42]  INFO [localhost] (1/1) Detected: localhost: ubuntu 18.04
[Feb 27 19:36:42]  INFO [localhost] Detecting OS of containers...
[Feb 27 19:36:42]  INFO [localhost] Checking Scan Modes...
[Feb 27 19:36:42]  INFO [localhost] Checking dependencies...
[Feb 27 19:36:42]  INFO [localhost] Dependencies... Pass
[Feb 27 19:36:42]  INFO [localhost] Checking sudo settings...
[Feb 27 19:36:42]  INFO [localhost] sudo ... No need
[Feb 27 19:36:42]  INFO [localhost] It can be scanned with fast scan mode even if warn or err messages are displayed due to lack of dependent packages or sudo settings in fast-root or deep scan mode
[Feb 27 19:36:42]  INFO [localhost] Scannable servers are below...
localhost

Это значит, что конфигурация введена правильно и Vuls обнаружил, что он может сканировать локальный сервер.

5: Запуск локального сканирования

Теперь попробуйте запустить локальное сканирование, а затем просмотрите сгенерированный отчет об уязвимостях. К настоящему времени вы настроили только локальный сервер, который Vuls правильно обнаружил в последнем разделе. Режим сканирования по умолчанию – быстрое сканирование (если не указано другое).

Чтобы запустить сканирование, выполните следующую команду:

vuls scan

Команда вернет:

[Feb 27 19:44:12]  INFO [localhost] Start scanning
[Feb 27 19:44:12]  INFO [localhost] config: /usr/share/vuls-data/config.toml
[Feb 27 19:44:12]  INFO [localhost] Validating config...
[Feb 27 19:44:12]  INFO [localhost] Detecting Server/Container OS...
[Feb 27 19:44:12]  INFO [localhost] Detecting OS of servers...
[Feb 27 19:44:12]  INFO [localhost] (1/1) Detected: localhost: ubuntu 18.04
[Feb 27 19:44:12]  INFO [localhost] Detecting OS of containers...
[Feb 27 19:44:12]  INFO [localhost] Checking Scan Modes...
[Feb 27 19:44:12]  INFO [localhost] Detecting Platforms...
[Feb 27 19:44:12]  INFO [localhost] (1/1) localhost is running on other
[Feb 27 19:44:12]  INFO [localhost] Scanning vulnerabilities...
[Feb 27 19:44:12]  INFO [localhost] Scanning vulnerable OS packages...
[Feb 27 19:44:12]  INFO [localhost] Scanning in fast mode
One Line Summary
================
localhost       ubuntu18.04     539 installed
To view the detail, vuls tui is useful.
To send a report, run vuls report -h.

Vuls зарегистрировал в логах все свои действия. Чтобы просмотреть отчет, введите:

vuls tui

Vuls делит представление отчета на четыре панели:

  • Отсканированные машины: в левом верхнем углу перечислены машины, отсканированные Vuls.
  • Найденные уязвимости: находятся справа от списка компьютеров. Здесь указаны уязвимости, обнаруженные Vuls в установленных пакетах.
  • Подробная информация: занимает левую часть экрана, показывает подробную информацию об уязвимости, извлеченной из баз данных.
  • Уязвимые пакеты: находится справа от подробной информации и показывает версии пакетов, подверженных уязвимости, и есть ли исправленная версия этих пакетов.

Вы можете перемещать курсор по панелям, нажимая клавишу Enter, и перемещаться с помощью стрелок на клавиатуре.

6: Настройка нескольких целевых машин (опционально)

В этом разделе вы узнаете, как настроить Vuls для сканирования нескольких целевых машин. Это подразумевает настройку /etc/sudoers на целевых машинах и настройку Vuls для сканирования этих машин.

В предыдущем разделе вы настроили Vuls для сканирования локального компьютера (localhost). Вы можете добавить столько серверов, сколько хотите, если у вас есть следующее:

  • IP-адрес целевого сервера
  • root-доступ к целевому серверу
  • доступная учетная запись на целевом сервере (в этом руководстве это 8host-blog)

На целевом сервере для сканирования в быстром режиме вы можете использовать только учетную запись пользователя без привилегий root. Чтобы включить сканирование в быстром режиме с доступом к root и в глубоком режиме, вам нужно отредактировать файл /etc/sudoers на целевых компьютерах. Файл sudoers определяет, какие пользователи могут выполнять те или иные команды и нужен ли для этого пароль.

Поскольку visudo – это утилита для определения правил обычного и привилегированного доступа, вы можете запустить ее только как root. Поскольку файл sudoers очень важен, вы не сможете закрыть его без предупреждения, если в нем будут ошибки.

На целевом сервере войдите в систему как пользователь root и откройте sudoers для редактирования, запустив visudo:

visudo

Добавьте в конец файла такую строку:

8host-blog ALL=(ALL) NOPASSWD: /usr/bin/apt-get update, /usr/bin/stat *, /usr/sbin/checkrestart

Теперь команда sudo позволит пользователю 8host-blog запускать apt-get update, checkrestart и другие команды, доступные в stat, без пароля.

Сохраните и закройте файл. Если вы допустили ошибку в синтаксисе, visudo найдет ее и предложит вам ее исправить.

Примечание: Добавив пользователя 8host-blog в sudoers, вы позволяете Vuls сканировать удаленную систему в быстром root  и глубоком режимах. Если вы хотите использовать эти режимы и на локальном хосте, отредактируйте sudoers на localhost.

Vuls использует утилиту checkrestart для проверки обновленных пакетов, которые требуют перезапуска. Чтобы такая утилита была на целевом сервере, войдите в систему как пользователь sudo и установите ее, выполнив следующую команду:

sudo apt install debian-goodies -y

Это все, что вам нужно сделать на целевом сервере. Теперь вы можете выйти из системы и снова войти на свой главный сервер.

Чтобы добавить новый сервер для сканирования, откройте config.toml и добавьте следующие строки под меткой [servers]:

[servers.target_name]
host = "target_ip"
port = "22"
user = "account_username"
keyPath = "account_rsa_key"
scanMode = [ "deep" ] # "fast", "fast-root" or "deep"

Вышеуказанные строки служат шаблоном для добавления новых серверов. Не забудьте заменить target_name на именем сервера, target_ip IP-адресом целевого сервера, account_username – именем пользователя, а account_rsa_key — путем к ключу RSA. Vuls не поддерживает парольную аутентификацию SSH, поэтому необходимо указать keyPath.

Сохраните и закройте файл.

Затем нужно подтвердить ключи RSA каждого добавленного целевого сервера на локальном компьютере. Для этого вы должны войти на целевой сервер со своего главного сервера, предоставив соответствующий ключ:

ssh 8host-blog@target_ip -i account_rsa_key

Когда система спросит, хотите ли вы продолжить соединение, введите yes, а затем выйдите из системы, нажав CTRL+D.

Если вы получили сообщение об ошибке, в котором сказано, что права доступа к файлу ключа недостаточно строги, установите значение 600, выполнив следующую команду:

chmod 600 account_rsa_key

Установка привилегий 600 гарантирует, что только владелец может читать и изменять файл ключа.

Чтобы проверить новую конфигурацию, выполните следующую команду:

vuls configtest

Эта команда не вернет вывода, если ошибок нет. Если она нашла какие-либо ошибки, проверьте ваш config.toml и исправьте их.

7: Автоматизация сканирования и отправки отчетов для Slack

Теперь нужно настроить Vuls для отправки отчетов в Slack и создать задание cron для автоматизации сканирования Vuls через определенный интервал времени.

Чтобы использовать интеграцию со Slack, в Slack вам понадобится входящий веб-хук для вашего рабочего пространства. Входящие веб-хуки – простой способ обмена информацией между приложениями в режиме реального времени. В этом случае нужно настроить Vuls для отправки сообщений в ваш канал Slack.

Если вы никогда не создавали веб-хуков, вам сначала нужно создать приложение для вашей рабочей области. Для этого сначала войдите в Slack и перейдите на страницу создания приложения. Выберите описательное имя, нужное рабочее пространство и нажмите Create App.

Вы будете перенаправлены на страницу настроек нового приложения. Выберите Incoming Webhooks в левой панели навигации.

Чтобы включить веб-хуки, кликните переключатель рядом с заголовком Activate Incoming Webhooks.

В нижней части страницы будет открыт новый раздел. Пролистайте вниз и нажмите кнопку Add New Webhook to Workspace. На следующей странице выберите канал, на который вы хотите отправлять отчеты, и нажмите Authorize.

Вы будете перенаправлены обратно на страницу настроек веб-хуков. В таблице вы увидите новый веб-хук. Нажмите Copy, чтобы скопировать его в буфер, и запишите его, он понадобится далее.

Затем откройте config.toml:

sudo nano config.toml

Добавьте такие строки:

[slack]
hookURL      = "your_hook_url"
channel      = "#your_channel_name"
authUser     = "your_username"
#notifyUsers  = ["@username"]

Замените your_hook_URL URL-адресом веб-хука, который вы указали ранее, your_username – именем пользователя, создавшего веб-хук, а your_channel_name – именем нужного канала. Сохраните и закройте файл.

Чтобы проверить интеграцию, вы можете сгенерировать тестовый отчет:

sudo vuls report -to-slack

Vuls потребуется несколько минут. Если вы получили ошибку, убедитесь, что ввели правильные данные в предыдущих настройках.

Вы можете проверить приложение Slack и убедиться, что Vuls успешно отправил отчет.

Теперь, когда вы настроили отчетность, пора запланировать сканирование. cron – это повременной планировщик задач, который можно найти на каждом компьютере Ubuntu. Он настраивается с помощью файла crontab, синтаксис которого точно определяет, когда должна выполняться команда. Чтобы облегчить редактирование, можно использовать утилиту crontab, которая открывает текущий файл crontab в редакторе.

Откройте crontab, выполнив следующую команду:

crontab -e

по запросу выберите текстовый редактор. Затем добавьте в конец файла:

0 0 * * * vuls scan -config=/usr/share/vuls-data/config.toml; vuls report -config=/usr/share/vuls-data/config.toml > /dev/null 2>&1

Теперь cron будет запускать сканирование и отправлять отчеты vuls (vuls scan и vuls report) каждый день в полдень (0 0 * * * в синтаксисе cron).

Сохраните и закройте файл.

Вы подключили Vuls к своему рабочему пространству Slack и настроили cron для запуска сканирования Vuls и отправки отчетов каждый день в полдень.

Заключение

Узнать больше о дополнительных возможностях отчетности и об устранении неполадок можно в документации Vuls.

Vuls упрощает оценку уязвимости для производственных сред. В качестве альтернативы cron можно использовать Vuls в рабочем процессе непрерывного развертывания, поскольку сканирование Vuls не требует много ресурсов и вы можете запускать его по мере необходимости. Вы также можете рассмотреть возможность использования брандмауэра с Vuls, чтобы ограничить доступ и уменьшить потребность в привилегиях root.

Tags: , ,