
GCP、AWS、およびローカルソースにわたるディスクイメージ、パッケージ、アーカイブからフォレンジックファイルハッシュセットを構築し、重複排除とDFIRワークフロー向けのPostgreSQL/Spannerエクスポートを備えています。
HashRを使用すると、データソースに基づいて独自のハッシュセットを構築できます。入力ソース(例: 生のディスクイメージ、GCEディスクイメージ、ISOファイル、Windows更新プログラムパッケージ、.tar.gzファイルなど)からファイルとハッシュを抽出するツールです。
HashRは次のコンポーネントで構成されています:
現在実装されているインポーター:
ファイルが抽出されハッシュ化されると、結果はエクスポーターに渡されます。現在実装されているエクスポーター:
実行するインポーターを選択できます。それぞれに異なる要件があります。詳細については、以下のセクションを参照してください。
HashRの実行にはLinux OSが必要です。物理マシン、仮想マシン、クラウドマシンのいずれでも構いません。以下は最適なハードウェア要件です:
HashRは低スペックのマシンでも実行できる可能性がありますが、これは十分にテストされていません。
hashrバイナリをビルドするには、次のコマンドを実行します:``` shell env GOOS=linux GOARCH=amd64 go build hashr.go
コア hashR パッケージのテストを実行するには、Spanner エミュレータを実行する必要があります:``` shell
gcloud emulators spanner start
その後、すべてのテストを実行するには、次のコマンドを実行します:``` shell go test -timeout 2m ./...
## HashR のセットアップ
### OSDFIR インフラストラクチャにおける HashR
HashR は [OSDFIR Infrastructure プロジェクト](https://github.com/google/osdfir-infrastructure/tree/main/charts/hashr) の一部としてデプロイできます。
このデプロイメントでは、HashR を Kubernetes の cronjob として実行し、Timesketch との簡単な
統合を可能にします。
### Docker を使用した HashR
HashR を Docker コンテナで実行するには、[Docker 固有のガイド](https://github.com/google/hashr/blob/main/docker/README.md) を参照してください。
### OS の設定と必要なサードパーティツール
HashR は、Plaso を使用して、ディスクイメージ、ボリューム、ファイルシステムの解析といった重労働を処理します。以下のコマンドを使用して、Plaso の Docker コンテナをプルする必要があります。``` shell
docker pull log2timeline/plaso
また、WSUSインポーターがWindows Updateパッケージの再帰的抽出に使用する7zも、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インスタンスを実行・維持する方法は多数ありますが、最も簡単な方法の1つはDockerコンテナで実行することです。以下の手順に従って、PostgreSQL Dockerコンテナをセットアップしてください。
ステップ1: PostgreSQL Dockerイメージをプルします。``` 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ディスクイメージからファイルを抽出できます。これはいくつかのステップで行われます:
公開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: ディスクイメージを.tar.gz形式で保存するために使用するGCSバケットを作成し、*<project_name>* をプロジェクト名に、*<gcs_bucket_name>* をプロジェクトの新しいGCSバケット名に設定します:``` 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` — 処理用のディスクイメージのコピーを保存し、Cloud Build を実行するためにも使用される GCP プロジェクト
1. `-hashr_gcs_bucket` — Cloud Build の出力(.tar.gz 形式のディスクイメージ)を保存するために使用される GCS バケット
#### AWS
このインポーターは、Amazon が所有する AMI を処理してハッシュを生成します。このインポーターには、少なくとも 1 つの HashR ワーカー(EC2 インスタンス)が必要です。
##### AWS HashR Workers
AWS HashR ワーカーは、AMI のボリュームがアタッチされ、ディスクアーカイブが作成され、S3 バケットにアップロードされる EC2 インスタンスです。少なくとも 2 つの AWS HashR ワーカーを推奨します。セットアップで単一の AWS ワーカーを使用する場合は `-processing_worker_count 1` を使用してください。
AWS HashR ワーカーは以下の要件を満たす必要があります:
- EC2 インスタンスにはタグ `InUse: false` が必要です。値が `true` の場合、そのワーカーは処理に使用されません。```shell
aws ec2 describe-instances --instance-id INSTANCE_ID | jq -r ‘.Reservations[].Instances[0].Tags’
hashr を実行するシステムは、以下を使用して EC2 インスタンスに SSH できる必要があります:
Keyname に記述されている SSH キー。 ```shell
aws ec2 describe-instances --instance-id INSTANCE_ID | jq -r ‘.Reservations[].Instances[0].Keyname’PublicDnsName に記載されているとおり FQDN へ。 ```shell
aws ec2 describe-instances --instance-id INSTANCE_ID | jq -r ‘.Reservations[].Instances[0].PublicDnsName’
scripts/hashr-archive は AWS HashR worker の /usr/local/sbin/hashr-archive にコピーする必要があります
HashR バケットにファイルをアップロードする権限を持つ AWS アカウント。AWS 設定と認証情報は $HOME/.aws/ ディレクトリに保存する必要があります。```shell
aws configure
##### HashR アプリケーション
`hashr` を実行するシステムでは、以下が必要です。
- 以下の API を呼び出す権限を持つ AWS アカウント:
- EC2
- AttachVolume
- CopyImage
- CreateTags
- CreateVolume
- DeleteVolume
- DescribeAvailabilityZones
- DescribeImages
- DescribeInstances
- DescribeSnapshots
- DescribeVolumes
- DetachVolume
- S3
- DeleteObject
- AWS アカウントの設定と認証情報ファイルは、`$HOME/.aws/` ディレクトリに配置されている必要があります。
- AWS HashR で使用する SSH 秘密鍵は、`$HOME/.ssh/` ディレクトリに配置されている必要があります。これは、`aws ec2 describe-instances --instance-id INSTANCE_ID | jq -r '.Reservations[].Instances[0].Keyname'` で説明されている `Keyname` の値と一致している必要があります。
##### AWS EC2 インスタンスのセットアップ
このセクションでは、HashR で使用する EC2 インスタンスの作成方法について説明します。理想的には、`hashr.uploader` と `hashr.worker` の 2 つの AWS アカウントが必要です。
`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ユーザーが異なる場合があるため、適切なSSHユーザーを `-aws_ssh_user` で設定してください。
#### GCR(Google Container Registry)
このインポーターは、GCRリポジトリに保存されているコンテナイメージからファイルを抽出します。セットアップするには、次の手順を実行します。
ステップ 1: HashRサービスアカウントを作成します。他のGCP依存コンポーネントのセットアップ中にこれを行った場合は、ステップ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: 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
このインポーターは、ISO-13346 形式の公式 Windows インストールメディアからファイルを抽出します。例えば、公式 Microsoft [ウェブサイト](https://www.microsoft.com/en-gb/software-download/windows10ISO) からダウンロードできるものです。
1 つの ISO ファイルに複数の WIM イメージが含まれる場合があります:
1. Windows10ProEducation
1. Windows10Education
1. Windows10EducationN
1. Windows10ProN
1. など
このインポーターは、`install.wim` ファイル内で見つけられるすべてのイメージからファイルを抽出します。
#### WSUS
このインポーターは、7z を使用して Windows Update パッケージの内容を再帰的に抽出します。指定された GCS バケット内の Windows Update ファイルを探します。GCS バケットを新しい更新プログラムで自動的に更新する最も簡単な方法は、次のとおりです:
1. hashr GCP プロジェクトで Windows Server を実行する GCE VM をセットアップします。
1. WSUS ロールを構成し、処理したい Windows Update パッケージを選択します
1. 更新プログラムをローカルストレージに自動的に承認およびダウンロードするように WSUS を構成します
1. ローカルストレージのコンテンツを GCS バケットに自動的に同期する Windows タスクをセットアップします: `gcloud storage rsync --recursive D:/WSUS/WsusContent gs://hashr-wsus/` (パスを調整することを忘れないでください)
1. 更新パッケージのファイル名 (通常は KB 番号を含む) を ID として使用したい場合 (デフォルトでは 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/
This will dump the relevant information from WSUS DB, store it in the export.csv file and sync the contents of the WSUS folder with GCS bucket. WSUS importer will check if export.csv file is present in the root of the WSUS repo, if so it will use it.
This is a simple importer that traverses repositories and looks for .tar.gz files. Once found it will hash the first and the last 10MB of the file to check if it was already processed. This is done to prevent hashing the whole file every time the repository is scanned for new sources. To use this importer you need to specify the following flag(s):
-targz_repo_path which should point to the path on the local file system that contains .tar.gz filesThis is very similar to the TarGz importer except that it looks for .deb packages. Once found it will hash the first and the last 10MB of the file to check if it was already processed. This is done to prevent hashing the whole file every time the repository is scanned for new sources. To use this importer you need to specify the following flag(s):
-deb_repo_path which should point to the path on the local file system that contains .deb filesThis is very similar to the TarGz importer except that it looks for .rpm packages. Once found it will hash the first and the last 10MB of the file to check if it was already processed. This is done to prevent hashing the whole file every time the repository is scanned for new sources. To use this importer you need to specify the following flag(s):
-rpm_repo_path which should point to the path on the local file system that contains .rpm filesThis is very similar to the TarGz importer except that it looks for .zip archives. Once found it will hash the first and the last 10MB of the file to check if it was already processed. This is done to prevent hashing the whole file every time the repository is scanned for new sources. To use this importer you need to specify the following flag(s):
-zip_repo_path which should point to the path on the local file system that contains .zip filesOptionally, you can also set the following flag(s):
-zip_file_exts comma-separated list of file extensions to treat as zip files, eg. "zip,whl,jar". Default: "zip"This is very similar to the TarGz importer except that it looks for .iso file. Once found it will hash the first and the last 10MB of the file to check if it was already processed. This is done to prevent hashing the whole file every time the repository is scanned for new sources. To use this importer you need to specify the following flag(s):
-iso_repo_path which should point to the path on the local file system that contains .iso filesPostgres exporter allows sending of hashes, file metadata and the actual content of the file to a PostgreSQL instance. For best performance it's advised to set it up on a separate and dedicated machine. If you did set up PostgreSQL while choosing the processing jobs storage you're almost good to go, just run the following command to create the required tables:``` shell cat scripts/CreatePostgresExporterTables.sql | docker exec -i hashr_postgresql psql -U hashr -d hashr
処理ジョブの保存先としてPostgresを選択しなかった場合は、[PostgreSQLストレージのセットアップ](####setting-up-postgresql-storage)セクションの手順1と2に従ってください。
これは現在デフォルトのエクスポーターであり、明示的に有効にする必要はありません。デフォルトでは、実際のファイルの内容はPostgreSQL DBにアップロードされません。これを変更したい場合は、`-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: このバケットのサービスアカウントを管理者にします。``` 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値に基づいて、指定されたソースを再処理できます(例えば、エラーが発生した場合など)。-upload_payloads: 定義されたエクスポーターによってファイルの実際のコンテンツがアップロードされるかどうかを制御します。-gcp_exporter_worker_count: GCPエクスポーターがデータのアップロードに使用するワーカー/goroutineの数。これはGoogleが公式にサポートする製品ではありません。