
Создаёт форензические наборы хэшей файлов из образов дисков, пакетов и архивов в GCP, AWS и локальных источниках, с дедупликацией и экспортом в PostgreSQL/Spanner для рабочих процессов DFIR.
HashR позволяет создавать собственные наборы хэшей на основе ваших источников данных. Это инструмент, который извлекает файлы и хэши из входных источников (например, сырой образ диска, образ диска GCE, ISO-файл, пакет обновления Windows, файл .tar.gz и т. д.).
HashR состоит из следующих компонентов:
Реализованные в настоящее время импортеры:
После извлечения и хэширования файлов результаты передаются экспортерам. Реализованные в настоящее время экспортеры:
Вы можете выбрать, какие импортеры запускать, у каждого из них разные требования. Подробнее об этом можно узнать в разделах ниже.
HashR требует для работы ОС Linux; это может быть физическая, виртуальная или облачная машина. Ниже приведены оптимальные аппаратные требования:
HashR, вероятно, может работать на машинах с более низкими характеристиками, однако это не было тщательно протестировано.
Чтобы собрать бинарный файл hashr, выполните следующую команду:``` shell env GOOS=linux GOARCH=amd64 go build hashr.go
Чтобы запустить тесты для основного пакета hashR, вам необходимо запустить эмулятор Spanner:``` shell
gcloud emulators spanner start
Затем, чтобы запустить все тесты, выполните следующую команду:``` shell go test -timeout 2m ./...
## 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
Вам нужно разрешить пользователю, под которым будет запускаться 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
### Настройка хранилища для задач обработки
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
Шаг 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. Для этого понадобится проект 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"
Создайте ключ сервисного аккаунта и сохраните его в вашем домашнем каталоге. Установите *<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
Создайте экземпляр 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
Разрешите сервисному аккаунту использовать базу данных 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
Для использования 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. Это делается в несколько шагов:
Список проектов GCP, содержащих публичные образы GCP, можно найти здесь. Чтобы использовать этот импортер, вам нужен проект GCP, и необходимо выполнить следующие шаги:
Шаг 1. Создайте сервисный аккаунт HashR. Если это уже было сделано при настройке Cloud Spanner, перейдите к шагу 4.``` 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
Шаг 3: Укажите переменную окружения GOOGLE_APPLICATION_CREDENTIALS на ключ вашего сервисного аккаунта:``` shell export GOOGLE_APPLICATION_CREDENTIALS=~/hashr-sa-private-key.json
Шаг 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"
Шаг 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
Шаг 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>
Шаг 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'
Чтобы использовать этот импортер, необходимо указать следующие флаги:
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, используя:
Keyname. ```shell
aws ec2 describe-instances --instance-id INSTANCE_ID | jq -r ‘.Reservations[].Instances[0].Keyname’В FQDN, как описано в PublicDnsName. ```shell
aws ec2 describe-instances --instance-id INSTANCE_ID | jq -r ‘.Reservations[].Instances[0].PublicDnsName’
scripts/hashr-archive должен быть скопирован на воркер AWS HashR в /usr/local/sbin/hashr-archive
Учётная запись AWS с правами на загрузку файлов в корзину HashR. Конфигурация AWS и учётные данные должны храниться в каталоге $HOME/.aws/.```shell
aws configure
##### Приложение 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 выполняет следующие основные шаги:
Приведенная ниже команда обрабатывает образы debian-12 и сохраняет их в базе данных PostgreSQL.```shell
hashr -storage postgres -exporters postgres -importers aws -aws_bucket aws-hashr-bucket -aws_os_filter debian-12
**Примечание**: 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
Шаг 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"
Для использования этого импортера необходимо указать следующий(ие) флаг(и):
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, и если да, использует его.
Это простой импортер, который обходит репозитории и ищет файлы .tar.gz. Когда файл найден, он вычисляет хэш первых и последних 10 МБ файла, чтобы проверить, был ли он уже обработан. Это делается для того, чтобы не хэшировать весь файл каждый раз при сканировании репозитория на предмет новых источников. Чтобы использовать этот импортер, необходимо указать следующий(е) флаг(и):
-targz_repo_path — должен указывать на путь в локальной файловой системе, содержащий файлы .tar.gzЭтот импортер очень похож на импортер TarGz, за исключением того, что он ищет пакеты .deb. Когда файл найден, он вычисляет хэш первых и последних 10 МБ файла, чтобы проверить, был ли он уже обработан. Это делается для того, чтобы не хэшировать весь файл каждый раз при сканировании репозитория на предмет новых источников. Чтобы использовать этот импортер, необходимо указать следующий(е) флаг(и):
-deb_repo_path — должен указывать на путь в локальной файловой системе, содержащий файлы .debЭтот импортер очень похож на импортер TarGz, за исключением того, что он ищет пакеты .rpm. Когда файл найден, он вычисляет хэш первых и последних 10 МБ файла, чтобы проверить, был ли он уже обработан. Это делается для того, чтобы не хэшировать весь файл каждый раз при сканировании репозитория на предмет новых источников. Чтобы использовать этот импортер, необходимо указать следующий(е) флаг(и):
-rpm_repo_path — должен указывать на путь в локальной файловой системе, содержащий файлы .rpmЭтот импортер очень похож на импортер TarGz, за исключением того, что он ищет архивы .zip. Когда файл найден, он вычисляет хэш первых и последних 10 МБ файла, чтобы проверить, был ли он уже обработан. Это делается для того, чтобы не хэшировать весь файл каждый раз при сканировании репозитория на предмет новых источников. Чтобы использовать этот импортер, необходимо указать следующий(е) флаг(и):
-zip_repo_path — должен указывать на путь в локальной файловой системе, содержащий файлы .zipПри желании можно также указать следующие флаг(и):
-zip_file_exts — список расширений файлов через запятую, которые следует рассматривать как zip-файлы, например "zip,whl,jar". По умолчанию: "zip"Этот импортер очень похож на импортер TarGz, за исключением того, что он ищет файлы .iso. Когда файл найден, он вычисляет хэш первых и последних 10 МБ файла, чтобы проверить, был ли он уже обработан. Это делается для того, чтобы не хэшировать весь файл каждый раз при сканировании репозитория на предмет новых источников. Чтобы использовать этот импортер, необходимо указать следующий(е) флаг(и):
-iso_repo_path — должен указывать на путь в локальной файловой системе, содержащий файлы .isoЭкспортер Postgres позволяет отправлять хэши, метаданные файлов и фактическое содержимое файла в экземпляр PostgreSQL. Для достижения наилучшей производительности рекомендуется развернуть его на отдельной выделенной машине. Если вы настроили PostgreSQL при выборе хранилища заданий обработки, вы почти готовы к работе — просто выполните следующую команду для создания необходимых таблиц:``` shell cat scripts/CreatePostgresExporterTables.sql | docker exec -i hashr_postgresql psql -U hashr -d hashr
Если вы не выбрали 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>
Шаг 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>
-processing_worker_count: Этот флаг управляет количеством параллельных воркеров. Обработка требует значительных ресурсов CPU и I/O; в ходе моего тестирования оптимальным решением оказалось использование 2 воркеров.-cache_dir: Расположение локального кэша, используемого для дедупликации; рекомендуется изменить его с /tmp на, например, домашний каталог пользователя, который будет запускать hashr.-export: Если установлено значение false, hashr сохранит результаты на диск, минуя экспортер.-export_path: Если export установлен в false, это папка, в которую будут сохранены сэмплы.-reprocess: Позволяет повторно обработать указанный источник (например, если он завершился с ошибкой) на основе значения sha256, хранящегося в таблице jobs.-upload_payloads: Управляет тем, будет ли фактическое содержимое файла загружено определёнными экспортерами.-gcp_exporter_worker_count: Количество воркеров/горутин, которые GCP-экспортер будет использовать для загрузки данных.Это не официально поддерживаемый продукт Google.