Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
hashr — Создаёт форензические наборы хэшей файлов из образов дисков, пакетов и архивов в GCP, AWS и локальных источниках, с дедупликацией и экспортом в PostgreSQL/Spanner для рабочих процессов DFIR. | Kitploit
Инструменты/GitHubGitHub/google/hashr
Дисковая криминалистикаАнализ хэшейФорензикаЦифровая криминалистикаРеагирование на Инциденты
GitHubgoogle/hashr

hashr

Создаёт форензические наборы хэшей файлов из образов дисков, пакетов и архивов в GCP, AWS и локальных источниках, с дедупликацией и экспортом в PostgreSQL/Spanner для рабочих процессов DFIR.

Репозиторий
1309387 месяцев назадПроверено Kitploit

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

HashR: Generate your own set of hashes



Table of Contents

  • HashR: Generate your own set of hashes
    • Table of Contents
    • About
    • Requirements
    • Building HashR binary and running tests
    • Setting up HashR
      • HashR using docker
      • OS configuration & required 3rd party tooling
      • Setting up storage for processing tasks
        • Setting up PostgreSQL storage
        • Setting up Cloud Spanner
      • Setting up importers
        • GCP (Google Cloud Platform)
        • AWS (Amazon Web Services)
        • GCR (Google Container Registry)
        • Windows
        • WSUS
        • TarGz
        • Deb
        • RPM
        • Zip (and other zip-like formats)
        • ISO 9660
      • Setting up exporters
        • Setting up Postgres exporter
        • Setting up GCP exporter
      • Additional flags

About

HashR позволяет создавать собственные наборы хэшей на основе ваших источников данных. Это инструмент, который извлекает файлы и хэши из входных источников (например, сырой образ диска, образ диска GCE, ISO-файл, пакет обновления Windows, файл .tar.gz и т. д.).

HashR состоит из следующих компонентов:

  1. Importers, которые отвечают за копирование источника в локальное хранилище и выполнение необходимой предварительной обработки.
  2. Core, который занимается извлечением содержимого из источника с помощью image_export.py (Plaso), кэшированием и дедупликацией на уровне репозитория, а также подготовкой извлечённых файлов для экспортеров.
  3. Exporters, которые отвечают за экспорт файлов, метаданных и хэшей в заданные приёмники данных.

Реализованные в настоящее время импортеры:

  1. GCP, который извлекает файлы из базовых образов дисков GCP.
  2. Windows, который извлекает файлы из установочного носителя Windows в формате ISO-13346.
  3. WSUS, который извлекает файлы из пакетов обновления Windows.
  4. GCR, который извлекает файлы из образов контейнеров, хранящихся в Google Container Registry.
  5. TarGz, который извлекает файлы из архивов .tar.gz.
  6. Deb, который извлекает файлы из пакетов программного обеспечения Debian.
  7. RPM, который извлекает файлы из пакетов программного обеспечения RPM.
  8. Zip, который извлекает файлы из архивов .zip (и подобных zip).

После извлечения и хэширования файлов результаты передаются экспортерам. Реализованные в настоящее время экспортеры:

  1. PostgreSQL, который загружает данные в экземпляр PostgreSQL.
  2. Cloud Spanner, который загружает данные в экземпляр GCP Spanner.

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

Requirements

HashR требует для работы ОС Linux; это может быть физическая, виртуальная или облачная машина. Ниже приведены оптимальные аппаратные требования:

  1. 8-16 ядер
  2. 128 ГБ памяти
  3. 2 ТБ быстрого локального хранилища (предпочтительно SSD)

HashR, вероятно, может работать на машинах с более низкими характеристиками, однако это не было тщательно протестировано.

Building HashR binary and running tests

Чтобы собрать бинарный файл hashr, выполните следующую команду:``` shell env GOOS=linux GOARCH=amd64 go build hashr.go

root@kitploit:~
Чтобы запустить тесты для основного пакета hashR, вам необходимо запустить эмулятор Spanner:``` shell
gcloud emulators spanner start

Затем, чтобы запустить все тесты, выполните следующую команду:``` shell go test -timeout 2m ./...

root@kitploit:~
## Setting up HashR

### HashR в инфраструктуре OSDFIR

Вы можете развернуть HashR в составе [проекта OSDFIR Infrastructure](https://github.com/google/osdfir-infrastructure/tree/main/charts/hashr)
Это развёртывание будет запускать HashR как kubernetes cronjobs и обеспечивает лёгкую
интеграцию с Timesketch.

### HashR с использованием docker

Чтобы запустить HashR в docker-контейнере, посетите [руководство по docker](https://github.com/google/hashr/blob/main/docker/README.md)

### Конфигурация ОС и необходимое стороннее ПО

HashR берёт на себя всю сложную работу (разбор образов дисков, томов, файловых систем) с помощью Plaso. Вам необходимо загрузить docker-контейнер Plaso с помощью следующей команды:``` shell
docker pull log2timeline/plaso

Нам также нужно, чтобы 7z, используемый импортером WSUS для рекурсивного извлечения пакетов Windows Update, был установлен на машине, где работает HashR:``` shell sudo apt install p7zip-full

root@kitploit:~
Вам нужно разрешить пользователю, под которым будет запускаться HashR, выполнять определённые команды через sudo. Если ваш пользователь — `hashr`, создайте файл `/etc/sudoers.d/hashr` и поместите в него:``` shell
hashr ALL = (root) NOPASSWD: /bin/mount,/bin/umount,/sbin/losetup,/bin/rm

Пользователь, под которым будет работать HashR, также должен иметь возможность запускать docker. Предполагая, что ваш пользователь — hashr, добавьте его в группу docker следующим образом:``` shell sudo usermod -aG docker hashr

root@kitploit:~
### Настройка хранилища для задач обработки

HashR необходимо хранить информацию об обработанных источниках. Также он хранит дополнительную телеметрию о задачах обработки: время обработки, количество извлечённых файлов и т.д. Вы можете выбрать один из вариантов:

1. PostgreSQL
1. Cloud (GCP) Spanner

#### Настройка хранилища PostgreSQL

Существует множество способов запуска и поддержки вашего экземпляра PostgreSQL, один из самых простых — запустить его в Docker-контейнере. Выполните следующие шаги, чтобы настроить Docker-контейнер PostgreSQL.

Шаг 1: Скачайте Docker-образ PostgreSQL.``` shell
docker pull postgres

Шаг 2: Инициализируйте и запустите контейнер PostgreSQL в фоновом режиме. Убедитесь, что вы изменили пароль.``` shell docker run -itd -e POSTGRES_DB=hashr -e POSTGRES_USER=hashr -e POSTGRES_PASSWORD=hashr -p 5432:5432 -v /data:/var/lib/postgresql/data --name hashr_postgresql postgres

root@kitploit:~
Шаг 3: Создайте таблицу, которая будет использоваться для хранения заданий на обработку.``` shell
cat scripts/CreateJobsTable.sql | docker exec -i hashr_postgresql psql -U hashr -d hashr

Для использования PostgreSQL для хранения информации о задачах обработки необходимо указать следующие флаги: -storage postgres -postgres_host <host> -postgres_port <port> -postgres_user <user> -postgres_password <pass> -postgres_db <db_name>

Настройка Cloud Spanner

Вы можете выбрать хранение данных о заданиях обработки в Cloud Spanner. Для этого понадобится проект Google Cloud. Основное преимущество такой настройки в том, что вы можете легко создавать информационные панели (дашборды) с помощью Google Data Studio и напрямую подключаться к экземпляру Cloud Spanner, что позволяет отслеживать и отлаживать работу без выполнения запросов к вашему экземпляру PostgreSQL.

Предполагая, что ваш инструмент gcloud настроен на ваш целевой проект hashr GCP, вам нужно выполнить следующие шаги для включения Cloud Spanner.

Создайте сервисный аккаунт HashR:``` shell gcloud iam service-accounts create hashr --description="HashR SA key." --display-name="hashr"

root@kitploit:~
Создайте ключ сервисного аккаунта и сохраните его в вашем домашнем каталоге. Установите *<project_name>* в качестве имени вашего проекта.``` shell
gcloud iam service-accounts keys create ~/hashr-sa-private-key.json --iam-account=hashr-sa@<project_name>.iam.gserviceaccount.com

Укажите переменную окружения GOOGLE_APPLICATION_CREDENTIALS на ваш ключ сервисного аккаунта:``` shell export GOOGLE_APPLICATION_CREDENTIALS=/home/hashr/hashr-sa-private-key.json

root@kitploit:~
Создайте экземпляр Spanner, при необходимости настройте config и значение processing-units:``` shell
gcloud spanner instances create hashr --config=regional-us-central1 --description="hashr" --processing-units=100

Создайте базу данных Spanner:``` shell gcloud spanner databases create hashr --instance=hashr

root@kitploit:~
Разрешите сервисному аккаунту использовать базу данных Spanner, укажите *<project_name>* в качестве имени вашего проекта:``` shell
gcloud spanner databases add-iam-policy-binding hashr --instance hashr --member="serviceAccount:hashr-sa@<project_name>.iam.gserviceaccount.com" --role="roles/spanner.databaseUser"

Обновить схему базы данных Spanner:``` shell gcloud spanner databases ddl update hashr --instance=hashr --ddl-file=scripts/CreateJobsTable.ddl

root@kitploit:~
Для использования Cloud Spanner для хранения информации о задачах обработки необходимо указать следующие флаги: `-jobStorage cloudspanner -spannerDBPath <spanner_db_path>`

### Настройка импортеров

Чтобы указать, какой импортер вы хотите запустить, используйте флаг `-importers`. Возможные значения: `GCP,targz,windows,wsus,deb,rpm,zip,gcr,iso9660`

#### GCP (Google Cloud Platform)```shell
-importers GCP

Этот импортер может извлекать файлы из GCP-дисков images. Это делается в несколько шагов:

  1. Проверка наличия новых образов в целевом проекте (например, ubuntu-os-cloud)
  2. Копирование нового/необработанного образа в проект hashR GCP
  3. Запуск Cloud Build, который создает временную VM, выполняет dd на скопированном образе и сохраняет вывод в файл .tar.gz.
  4. Экспорт raw_disk.tar.gz в бакет GCS в проекте hashR GCP
  5. Копирование raw_disk.tar.gz из GCS в локальное хранилище hashR
  6. Извлечение raw_disk.tar.gz и передача образа диска в Plaso

Список проектов GCP, содержащих публичные образы GCP, можно найти здесь. Чтобы использовать этот импортер, вам нужен проект GCP, и необходимо выполнить следующие шаги:

Шаг 1. Создайте сервисный аккаунт HashR. Если это уже было сделано при настройке Cloud Spanner, перейдите к шагу 4.``` shell gcloud iam service-accounts create hashr-sa --description="HashR SA key." --display-name="hashr"

root@kitploit:~
Шаг 2: Создайте ключ сервисного аккаунта и сохраните его в вашем домашнем каталоге. Убедитесь, что  установили *<project_name>* в качестве имени вашего проекта:``` shell
gcloud iam service-accounts keys create ~/hashr-sa-private-key.json --iam-account=hashr-sa@<project_name>.iam.gserviceaccount.com

Шаг 3: Укажите переменную окружения GOOGLE_APPLICATION_CREDENTIALS на ключ вашего сервисного аккаунта:``` shell export GOOGLE_APPLICATION_CREDENTIALS=~/hashr-sa-private-key.json

root@kitploit:~
Шаг 4: Создайте GCS bucket, который будет использоваться для хранения образов дисков в формате .tar.gz, укажите *<project_name>* как имя вашего проекта и  *<gcs_bucket_name>* как имя вашего нового GCS bucket:``` shell
gcloud storage buckets create gs://<gcs_bucket_name> --project=<project_name>

Шаг 5: Сделайте сервисный аккаунт администратором этого бакета:``` shell gcloud storage buckets add-iam-policy-binding gs://<gcs_bucket_name> --member="serviceAccount:hashr-sa@<project_name>.iam.gserviceaccount.com" --role="roles/storage.objectAdmin"

root@kitploit:~
Шаг 6: Включите Compute API:``` shell
gcloud services enable compute.googleapis.com cloudbuild.googleapis.com

Шаг 7: Создайте роль IAM и назначьте ей необходимые разрешения:``` shell gcloud iam roles create hashr --project=<project_name> --title=hashr --description="Permissions required to run hashR" --permissions compute.images.create,compute.images.delete,compute.globalOperations.get

root@kitploit:~
Шаг 8: Привяжите роль IAM к сервисному аккаунту:``` shell
gcloud projects add-iam-policy-binding <project_name> --member="serviceAccount:hashr-sa@<project_name>.iam.gserviceaccount.com" --role="projects/<project_name>/roles/hashr"

Шаг 9a: Включите cloudbuild API``` shell gcloud services enable cloudbuild.googleapis.com --project <project_name>

root@kitploit:~
Шаг 9b: Получите свой project_number```shell
gcloud projects list --filter="mlegin-testing-things" --format="value(PROJECT_NUMBER)"

Шаг 9c: Предоставьте сервисным учётным записям доступ, необходимый для запуска Cloud Build, и обязательно измените значения <project_name> и <project_number>:``` shell gcloud projects add-iam-policy-binding <project_name> --member='serviceAccount:hashr-sa@<project_name>.iam.gserviceaccount.com' --role='roles/storage.admin'

gcloud projects add-iam-policy-binding <project_name>
--member='serviceAccount:hashr-sa@<project_name>.iam.gserviceaccount.com'
--role='roles/viewer'

gcloud projects add-iam-policy-binding <project_name>
--member='serviceAccount:hashr-sa@<project_name>.iam.gserviceaccount.com'
--role='roles/resourcemanager.projectIamAdmin'

gcloud projects add-iam-policy-binding <project_name>
--member='serviceAccount:hashr-sa@<project_name>.iam.gserviceaccount.com'
--role='roles/cloudbuild.builds.editor'

gcloud projects add-iam-policy-binding <project_name>
--member='serviceAccount:<project_number>@cloudbuild.gserviceaccount.com'
--role='roles/compute.admin'

gcloud projects add-iam-policy-binding <project_name>
--member='serviceAccount:<project_number>@cloudbuild.gserviceaccount.com'
--role='roles/iam.serviceAccountUser'

gcloud projects add-iam-policy-binding <project_name>
--member='serviceAccount:<project_number>@cloudbuild.gserviceaccount.com'
--role='roles/iam.serviceAccountTokenCreator'

gcloud projects add-iam-policy-binding <project_name>
--member='serviceAccount:<project_number>@cloudbuild.gserviceaccount.com'
--role='roles/compute.networkUser'

gcloud projects add-iam-policy-binding <project_name>
--member='serviceAccount:<project_number>[email protected]'
--role='roles/compute.storageAdmin'

gcloud projects add-iam-policy-binding <project_name>
--member='serviceAccount:<project_number>[email protected]'
--role='roles/storage.objectViewer'

gcloud projects add-iam-policy-binding <project_name>
--member='serviceAccount:<project_number>[email protected]'
--role='roles/storage.objectAdmin'

root@kitploit:~
Чтобы использовать этот импортер, необходимо указать следующие флаги:

1. `-gcp_projects` — разделённый запятыми список облачных проектов, содержащих образы дисков. Если вы хотите импортировать публичные образы, обратитесь [сюда](https://cloud.google.com/compute/docs/images/os-details#general-info)
1. `-hashr_gcp_project` — проект GCP, который будет использоваться для хранения копий образов дисков для обработки, а также для запуска Cloud Build
1. `-hashr_gcs_bucket` — бакет GCS, который будет использоваться для хранения выходных данных Cloud Build (образы дисков в формате .tar.gz)

#### AWS

Этот импортер обрабатывает AMI, принадлежащие Amazon, и генерирует хеши. Импортеру требуется как минимум один HashR worker (экземпляр EC2).

##### AWS HashR-воркеры

AWS HashR worker — это экземпляр EC2, к которому подключается том AMI, создается архив диска, а затем он загружается в бакет S3. Рекомендуется иметь как минимум два AWS HashR worker. Если в вашей настройке используется один AWS worker, используйте `-processing_worker_count 1`.

AWS HashR worker должен соответствовать следующим требованиям:

- Экземпляры EC2 должны иметь тег `InUse: false`. Если значение равно `true`, worker не используется для обработки.```shell
aws ec2 describe-instances --instance-id INSTANCE_ID | jq -r ‘.Reservations[].Instances[0].Tags’
  • Система, на которой выполняется hashr, должна иметь возможность подключаться по SSH к экземпляру EC2, используя:

    • SSH-ключ, как описано в Keyname. ```shell aws ec2 describe-instances --instance-id INSTANCE_ID | jq -r ‘.Reservations[].Instances[0].Keyname’
    root@kitploit:~
  • В FQDN, как описано в PublicDnsName. ```shell aws ec2 describe-instances --instance-id INSTANCE_ID | jq -r ‘.Reservations[].Instances[0].PublicDnsName’

    root@kitploit:~
  • scripts/hashr-archive должен быть скопирован на воркер AWS HashR в /usr/local/sbin/hashr-archive

  • Учётная запись AWS с правами на загрузку файлов в корзину HashR. Конфигурация AWS и учётные данные должны храниться в каталоге $HOME/.aws/.```shell aws configure

root@kitploit:~
##### Приложение HashR

На системе, на которой выполняется `hashr`, требуется следующее.

- Учётная запись AWS с разрешениями на вызов следующих API:
  - EC2
    - AttachVolume
    - CopyImage
    - CreateTags
    - CreateVolume
    - DeleteVolume
    - DescribeAvailabilityZones
    - DescribeImages
    - DescribeInstances
    - DescribeSnapshots
    - DescribeVolumes
    - DetachVolume
  - S3
    - DeleteObject
- Файл конфигурации AWS и файл учётных данных должны находиться в каталоге `$HOME/.aws/`.
- Приватный SSH-ключ, используемый для AWS HashR, должен находиться в каталоге `$HOME/.ssh/`. Он должен соответствовать значению `Keyname`, как описано в `aws ec2 describe-instances --instance-id INSTANCE_ID | jq -r ‘.Reservations[].Instances[0].Keyname’

##### Настройка EC2-инстанса AWS

В этом разделе описывается, как создать EC2-инстансы для использования с HashR. В идеале нужны две учётные записи AWS: `hashr.uploader` и `hashr.worker`.

`hashr.uploader` используется на EC2-инстансах и требует разрешений на загрузку архивных образов дисков в корзину S3. `scripts/aws/AwsHashrUploaderPolicy.json` содержит пример политики для корзины S3 `hashr-bucket`.

`hashr.worker` используется на компьютере, с которого выполняются команды HashR. Учётная запись требует разрешений EC2 и S3. `scripts/aws/AwsHashrWorkerPolicy.json` содержит пример политики для учётной записи `hashr.worker`.

`hashr_setup.sh` — это скрипт, который помогает создавать EC2-инстансы. Отредактируйте `hashr_setup.sh` и при необходимости проверьте и обновите следующие поля:

- `AWS_PROFILE`
- `AWS_REGION`
- `SECURITY_SOURCE_CIDR`
- `WORKER_AWS_CONFIG_FILE`

**Примечание**: Файл, указанный в `WORKER_AWS_CONFIG_FILE`, должен находиться в каталоге с `hashr_setup.sh`.

**Примечание**: `hashr_setup.sh` должен запускаться из того же каталога, где находится `hashr_setup.sh`.

Выполните следующие команды, чтобы создать и настроить EC2-инстансы.```shell
$ git clone https://github.com/google/hashr
$ cd hashr/scripts/aws
$ aws configure
$ cp -r ~/.aws ./
$ tar -zcf hashr.uploader.tar.gz .aws
$ hash_setup.sh setup
Рабочий процесс импортера AWS HashR

Импортер AWS выполняет следующие основные шаги:

  1. Копирует новую/необработанную AMI, принадлежащую Amazon, в проект HashR
  2. Создает том на основе скопированной AMI
  3. Подключает том к доступному воркеру AWS HashR
  4. На воркере AWS HashR a. Создает архив диска (tar.gz) на воркере AWS HashR b. Загружает архив диска в корзину S3 HashR
  5. Скачивает архив диска из корзины S3 HashR
  6. Распаковывает образ диска
  7. Обрабатывает сырой диск с помощью Plaso
Команда импортера AWS HashR

Приведенная ниже команда обрабатывает образы debian-12 и сохраняет их в базе данных PostgreSQL.```shell hashr -storage postgres -exporters postgres -importers aws -aws_bucket aws-hashr-bucket -aws_os_filter debian-12

root@kitploit:~
**Примечание**: Amazon Linux (al2023-*) использовался в качестве рабочей машины при разработке импортера. Поэтому значение по умолчанию для `-aws_ssh_user` установлено как `ec2-user`. В других дистрибутивах пользователь SSH по умолчанию может отличаться; используйте `-aws_ssh_user`, чтобы задать подходящего пользователя SSH.

#### GCR (Google Container Registry)
Этот импортер извлекает файлы из образов контейнеров, хранящихся в репозиториях GCR. Чтобы настроить его, выполните следующие шаги:

Шаг 1: Создайте сервисный аккаунт HashR; перейдите к шагу 4, если это уже было сделано при настройке других компонентов, зависящих от GCP.``` shell
gcloud iam service-accounts create hashr-sa --description="HashR SA key." --display-name="hashr"

Шаг 2: Создайте ключ сервисного аккаунта и сохраните его в вашем домашнем каталоге. Убедитесь, что вы установили <project_name> в качестве имени вашего проекта:``` shell gcloud iam service-accounts keys create ~/hashr-sa-private-key.json --iam-account=hashr-sa@<project_name>.iam.gserviceaccount.com

root@kitploit:~
Шаг 3: Укажите переменную окружения GOOGLE_APPLICATION_CREDENTIALS, указывающую на ваш ключ сервисного аккаунта:``` shell
export GOOGLE_APPLICATION_CREDENTIALS=~/hashr-sa-private-key.json

Шаг 4: Предоставьте ключу сервисного аккаунта hashR необходимые разрешения для доступа к указанному репозиторию GCR.``` shell gcloud storage buckets add-iam-policy-binding gs://artifacts.<project_name_hosting_gcr_repo>.appspot.com --member="serviceAccount:hashr-sa@<project_name>.iam.gserviceaccount.com" --role="roles/storage.objectViewer"

root@kitploit:~
Для использования этого импортера необходимо указать следующий(ие) флаг(и):

1. `-gcr_repos` — должен содержать разделенный запятыми список репозиториев GCR, из которых вы хотите импортировать образы контейнеров.

#### Windows

Этот импортер извлекает файлы из официальных установочных носителей Windows в формате ISO-13346, например таких, которые можно загрузить с официального [сайта Microsoft](https://www.microsoft.com/en-gb/software-download/windows10ISO).
Один ISO-файл может содержать несколько образов WIM:

1. Windows10ProEducation
1. Windows10Education
1. Windows10EducationN
1. Windows10ProN
1. и т. д.

Этот импортер извлечет файлы из всех образов, которые он сможет найти в файле `install.wim`.

#### WSUS

Этот импортер использует 7z для рекурсивного извлечения содержимого пакетов Windows Update. Он будет искать файлы Windows Update в указанном GCS-бакете; проще всего автоматически обновлять GCS-бакет новыми обновлениями следующим образом:

1. Создайте виртуальную машину GCE под управлением Windows Server в GCP-проекте hashr.
1. Настройте ее с ролью WSUS, выберите пакеты Windows Update, которые вы хотите обработать.
1. Настройте WSUS для автоматического утверждения и загрузки обновлений в локальное хранилище.
1. Настройте задачу Windows для автоматической синхронизации содержимого локального хранилища с GCS-бакетом: `gcloud storage rsync --recursive D:/WSUS/WsusContent gs://hashr-wsus/` (не забудьте изменить пути)
1. Если вы хотите использовать имя файла пакета обновления (которое обычно содержит номер KB) в качестве идентификатора (по умолчанию используется sha1, так MS хранит обновления WSUS) и его описание, это можно выгрузить из внутренней базы данных WID WSUS. Для этого можно использовать следующий сценарий Power Shell и запускать его как задачу:```
#SQL Query
$delimiter = ";"
$SqlQuery = 'select DISTINCT CONVERT([varchar](https://github.com/google/hashr/blob/main/512), tbfile.FileDigest, 2) as sha1, tbfile.[FileName], vu.[KnowledgebaseArticle], vu.[DefaultTitle]  from [SUSDB].[dbo].[tbFile] tbfile
  left join [SUSDB].[dbo].[tbFileForRevision] ffrev
  on tbfile.FileDigest = ffrev.FileDigest
  left join [SUSDB].[dbo].[tbRevision] rev
  on ffrev.RevisionID = rev.RevisionID
  left join [SUSDB].[dbo].[tbUpdate] u
  on rev.LocalUpdateID = u.LocalUpdateID
  left join [SUSDB].[PUBLIC_VIEWS].[vUpdate] vu
  on u.UpdateID = vu.UpdateId'
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = 'server=\\.\pipe\MICROSOFT##WID\tsql\query;database=SUSDB;trusted_connection=true;'
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.CommandText = $SqlQuery
$SqlCmd.Connection = $SqlConnection
$SqlCmd.CommandTimeout = 0
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $SqlCmd
#Creating Dataset
$DataSet = New-Object System.Data.DataSet
$SqlAdapter.Fill($DataSet)
$DataSet.Tables[0] | export-csv -Delimiter $delimiter -Path "D:\WSUS\WsusContent\export.csv" -NoTypeInformation

gcloud storage rsync --recursive D:/WSUS/WsusContent gs://hashr-wsus/

Это выгрузит соответствующую информацию из базы данных WSUS, сохранит её в файл export.csv и синхронизирует содержимое папки WSUS с бакетом GCS. Импортер WSUS проверит, присутствует ли файл export.csv в корне репозитория WSUS, и если да, использует его.

TarGz

Это простой импортер, который обходит репозитории и ищет файлы .tar.gz. Когда файл найден, он вычисляет хэш первых и последних 10 МБ файла, чтобы проверить, был ли он уже обработан. Это делается для того, чтобы не хэшировать весь файл каждый раз при сканировании репозитория на предмет новых источников. Чтобы использовать этот импортер, необходимо указать следующий(е) флаг(и):

  1. -targz_repo_path — должен указывать на путь в локальной файловой системе, содержащий файлы .tar.gz

Deb

Этот импортер очень похож на импортер TarGz, за исключением того, что он ищет пакеты .deb. Когда файл найден, он вычисляет хэш первых и последних 10 МБ файла, чтобы проверить, был ли он уже обработан. Это делается для того, чтобы не хэшировать весь файл каждый раз при сканировании репозитория на предмет новых источников. Чтобы использовать этот импортер, необходимо указать следующий(е) флаг(и):

  1. -deb_repo_path — должен указывать на путь в локальной файловой системе, содержащий файлы .deb

RPM

Этот импортер очень похож на импортер TarGz, за исключением того, что он ищет пакеты .rpm. Когда файл найден, он вычисляет хэш первых и последних 10 МБ файла, чтобы проверить, был ли он уже обработан. Это делается для того, чтобы не хэшировать весь файл каждый раз при сканировании репозитория на предмет новых источников. Чтобы использовать этот импортер, необходимо указать следующий(е) флаг(и):

  1. -rpm_repo_path — должен указывать на путь в локальной файловой системе, содержащий файлы .rpm

Zip (и другие zip-подобные форматы)

Этот импортер очень похож на импортер TarGz, за исключением того, что он ищет архивы .zip. Когда файл найден, он вычисляет хэш первых и последних 10 МБ файла, чтобы проверить, был ли он уже обработан. Это делается для того, чтобы не хэшировать весь файл каждый раз при сканировании репозитория на предмет новых источников. Чтобы использовать этот импортер, необходимо указать следующий(е) флаг(и):

  1. -zip_repo_path — должен указывать на путь в локальной файловой системе, содержащий файлы .zip

При желании можно также указать следующие флаг(и):

  1. -zip_file_exts — список расширений файлов через запятую, которые следует рассматривать как zip-файлы, например "zip,whl,jar". По умолчанию: "zip"

ISO 9660

Этот импортер очень похож на импортер TarGz, за исключением того, что он ищет файлы .iso. Когда файл найден, он вычисляет хэш первых и последних 10 МБ файла, чтобы проверить, был ли он уже обработан. Это делается для того, чтобы не хэшировать весь файл каждый раз при сканировании репозитория на предмет новых источников. Чтобы использовать этот импортер, необходимо указать следующий(е) флаг(и):

  1. -iso_repo_path — должен указывать на путь в локальной файловой системе, содержащий файлы .iso

Настройка экспортеров

Настройка экспортера Postgres

Экспортер Postgres позволяет отправлять хэши, метаданные файлов и фактическое содержимое файла в экземпляр PostgreSQL. Для достижения наилучшей производительности рекомендуется развернуть его на отдельной выделенной машине. Если вы настроили PostgreSQL при выборе хранилища заданий обработки, вы почти готовы к работе — просто выполните следующую команду для создания необходимых таблиц:``` shell cat scripts/CreatePostgresExporterTables.sql | docker exec -i hashr_postgresql psql -U hashr -d hashr

root@kitploit:~
Если вы не выбрали Postgres для хранения заданий обработки, выполните шаги 1 и 2 из раздела [Настройка хранилища PostgreSQL](####setting-up-postgresql-storage).

В настоящее время это экспортер по умолчанию, его не нужно явно включать. По умолчанию содержимое самих файлов не загружается в базу данных PostgreSQL; если вы хотите это изменить, используйте флаг `-upload_payloads true`.

Для работы экспортера Postgres необходимо указать следующие флаги: `-exporters postgres -postgresHost <host> -postgresPort <port> -postgresUser <user> -postgresPassword <pass> -postgresDBName <db_name>`

#### Настройка экспортера GCP

Экспортер GCP позволяет отправлять хэши и метаданные файлов в экземпляр GCP Spanner. При желании вы можете загружать извлечённые файлы в бакет GCS. Если вы ещё не настроили Cloud Spanner для хранения заданий обработки, выполните шаги из раздела [Настройка Cloud Spanner](####setting-up-cloud-spanner), а вместо последнего шага выполните следующую команду для создания необходимых таблиц:``` shell
gcloud spanner databases ddl update hashr --instance=hashr --ddl-file=scripts/CreateCloudSpannerExporterTables.ddl

Если вы уже настроили Cloud Spanner для хранения данных о заданиях, вам просто нужно запустить команду выше — и вы готовы к работе.

Если вы хотите загрузить извлечённые файлы в GCS, вам нужно создать бакет GCS:

Шаг 1: Сделайте сервисный аккаунт администратором этого бакета:``` shell gcloud storage buckets create gs://<gcs_bucket_name> --project=project_name>

root@kitploit:~
Шаг 2: Сделайте сервисный аккаунт администратором этого bucket:``` shell
gcloud storage buckets add-iam-policy-binding gs://<gcs_bucket_name> --member="serviceAccount:hashr-sa@<project_name>.iam.gserviceaccount.com" --role="roles/storage.objectAdmin"

Чтобы использовать этот экспортер, вам нужно указать следующие флаги: -exporters GCP -gcp_exporter_gcs_bucket <gcs_bucket_name>

Дополнительные флаги

  1. -processing_worker_count: Этот флаг управляет количеством параллельных воркеров. Обработка требует значительных ресурсов CPU и I/O; в ходе моего тестирования оптимальным решением оказалось использование 2 воркеров.
  2. -cache_dir: Расположение локального кэша, используемого для дедупликации; рекомендуется изменить его с /tmp на, например, домашний каталог пользователя, который будет запускать hashr.
  3. -export: Если установлено значение false, hashr сохранит результаты на диск, минуя экспортер.
  4. -export_path: Если export установлен в false, это папка, в которую будут сохранены сэмплы.
  5. -reprocess: Позволяет повторно обработать указанный источник (например, если он завершился с ошибкой) на основе значения sha256, хранящегося в таблице jobs.
  6. -upload_payloads: Управляет тем, будет ли фактическое содержимое файла загружено определёнными экспортерами.
  7. -gcp_exporter_worker_count: Количество воркеров/горутин, которые GCP-экспортер будет использовать для загрузки данных.

Это не официально поддерживаемый продукт Google.

Скачать инструмент