
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 Infrastructure에서의 HashR
HashR를 [OSDFIR Infrastructure 프로젝트](https://github.com/google/osdfir-infrastructure/tree/main/charts/hashr)의 일부로 배포할 수 있습니다.
이 배포는 HashR를 kubernetes cronjobs로 실행하며 간편한
Timesketch 통합을 지원합니다.
### docker를 사용한 HashR
docker 컨테이너에서 HashR를 실행하려면 [docker 전용 가이드](https://github.com/google/hashr/blob/HEAD/docker/README.md)를 방문하세요.
### OS 구성 및 필수 서드파티 도구
HashR는 Plaso를 사용하여 무거운 작업(디스크 이미지, 볼륨, 파일 시스템 파싱)을 처리합니다. 다음 명령을 사용하여 Plaso docker 컨테이너를 pull해야 합니다:``` shell
docker pull log2timeline/plaso
또한 Windows Update 패키지의 재귀적 추출을 위해 WSUS importer가 사용하는 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 인스턴스를 실행하고 유지 관리하는 방법은 여러 가지가 있으며, 가장 간단한 방법 중 하나는 Docker 컨테이너에서 실행하는 것입니다. 아래 단계에 따라 PostgreSQL Docker 컨테이너를 설정하세요.
1단계: PostgreSQL Docker 이미지를 가져옵니다.``` shell
docker pull postgres
Step 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 프로젝트가 있어야 하며 다음 단계를 수행해야 합니다:
Step 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를 처리하여 해시를 생성합니다. 임포터에는 최소한 하나의 HashR 워커(EC2 인스턴스)가 필요합니다.
##### AWS HashR 워커
AWS HashR 워커는 AMI의 볼륨이 연결되고 디스크 아카이브가 생성된 다음 S3 버킷에 업로드되는 EC2 인스턴스입니다. 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 작업자의 /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`라는 두 개의 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 importer는 다음과 같은 개괄적인 단계를 수행합니다:
아래 명령어는 debian-12 이미지를 처리하고 PostgreSQL 데이터베이스에 저장합니다.```shell
hashr -storage postgres -exporters postgres -importers aws -aws_bucket aws-hashr-bucket -aws_os_filter debian-12
**Note**: Amazon Linux (al2023-*) was used as a worker while developing the importer. Thus, the default value for `-aws_ssh_user` is set to `ec2-user`. A different distro may have a different default SSH user, use `-aws_ssh_user` to set the appropriate SSH user.
**참고**: importer를 개발하는 동안 Amazon Linux (al2023-*)를 worker로 사용했습니다. 따라서 `-aws_ssh_user`의 기본값은 `ec2-user`로 설정되어 있습니다. 다른 배포판은 기본 SSH 사용자가 다를 수 있으므로 `-aws_ssh_user`를 사용하여 적절한 SSH 사용자를 설정하세요.
#### GCR (Google Container Registry)
이 importer는 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"
#### Windows
이 임포터는 ISO-13346 형식의 공식 Windows 설치 미디어에서 파일을 추출합니다. 예를 들어 공식 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 패키지의 내용을 재귀적으로 추출합니다. 제공된 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/HEAD/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 DB에서 관련 정보를 덤프하여 export.csv 파일에 저장하고, WSUS 폴더의 내용을 GCS 버킷과 동기화합니다. WSUS importer는 export.csv 파일이 WSUS 리포지토리 루트에 존재하는지 확인하고, 존재하면 이를 사용합니다.
이것은 리포지토리를 순회하며 .tar.gz 파일을 찾는 간단한 importer입니다. 파일을 찾으면 파일의 처음 10MB와 마지막 10MB를 해시하여 이미 처리되었는지 확인합니다. 이는 리포지토리에서 새 소스를 검색할 때마다 전체 파일을 해시하지 않도록 하기 위한 것입니다. 이 importer를 사용하려면 다음 플래그를 지정해야 합니다:
-targz_repo_path — .tar.gz 파일이 포함된 로컬 파일 시스템 경로를 가리켜야 합니다이것은 TarGz importer와 매우 유사하지만 .deb 패키지를 찾습니다. 파일을 찾으면 파일의 처음 10MB와 마지막 10MB를 해시하여 이미 처리되었는지 확인합니다. 이는 리포지토리에서 새 소스를 검색할 때마다 전체 파일을 해시하지 않도록 하기 위한 것입니다. 이 importer를 사용하려면 다음 플래그를 지정해야 합니다:
-deb_repo_path — .deb 파일이 포함된 로컬 파일 시스템 경로를 가리켜야 합니다이것은 TarGz importer와 매우 유사하지만 .rpm 패키지를 찾습니다. 파일을 찾으면 파일의 처음 10MB와 마지막 10MB를 해시하여 이미 처리되었는지 확인합니다. 이는 리포지토리에서 새 소스를 검색할 때마다 전체 파일을 해시하지 않도록 하기 위한 것입니다. 이 importer를 사용하려면 다음 플래그를 지정해야 합니다:
-rpm_repo_path — .rpm 파일이 포함된 로컬 파일 시스템 경로를 가리켜야 합니다이것은 TarGz importer와 매우 유사하지만 .zip 아카이브를 찾습니다. 파일을 찾으면 파일의 처음 10MB와 마지막 10MB를 해시하여 이미 처리되었는지 확인합니다. 이는 리포지토리에서 새 소스를 검색할 때마다 전체 파일을 해시하지 않도록 하기 위한 것입니다. 이 importer를 사용하려면 다음 플래그를 지정해야 합니다:
-zip_repo_path — .zip 파일이 포함된 로컬 파일 시스템 경로를 가리켜야 합니다선택적으로 다음 플래그도 설정할 수 있습니다:
-zip_file_exts — zip 파일로 취급할 파일 확장자의 쉼표로 구분된 목록, 예: "zip,whl,jar". 기본값: "zip"이것은 TarGz importer와 매우 유사하지만 .iso 파일을 찾습니다. 파일을 찾으면 파일의 처음 10MB와 마지막 10MB를 해시하여 이미 처리되었는지 확인합니다. 이는 리포지토리에서 새 소스를 검색할 때마다 전체 파일을 해시하지 않도록 하기 위한 것입니다. 이 importer를 사용하려면 다음 플래그를 지정해야 합니다:
-iso_repo_path — .iso 파일이 포함된 로컬 파일 시스템 경로를 가리켜야 합니다Postgres exporter는 해시, 파일 메타데이터 및 파일의 실제 콘텐츠를 PostgreSQL 인스턴스로 보낼 수 있게 해줍니다. 최상의 성능을 위해 별도의 전용 머신에 설정하는 것이 좋습니다. 처리 작업 저장소를 선택할 때 PostgreSQL을 설정했다면 거의 준비가 된 것입니다. 다음 명령을 실행하여 필요한 테이블을 생성하기만 하면 됩니다:``` shell cat scripts/CreatePostgresExporterTables.sql | docker exec -i hashr_postgresql psql -U hashr -d hashr
Postgres를 처리 작업 저장소로 선택하지 않았다면, [PostgreSQL 스토리지 설정](####setting-up-postgresql-storage) 섹션의 1단계와 2단계를 따르세요.
현재 이 exporter는 기본값이므로 명시적으로 활성화할 필요가 없습니다. 기본적으로 실제 파일의 내용은 PostgreSQL DB에 업로드되지 않습니다. 이를 변경하려면 `-upload_payloads true` 플래그를 사용하세요.
Postgres exporter가 작동하려면 다음 플래그를 설정해야 합니다: `-exporters postgres -postgresHost <host> -postgresPort <port> -postgresUser <user> -postgresPassword <pass> -postgresDBName <db_name>`
#### GCP exporter 설정
GCP exporter는 해시와 파일 메타데이터를 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
If you have already set up Cloud Spanner for storing jobs data you just need to the run the command above and you're ready to go.
이미 작업 데이터 저장을 위해 Cloud Spanner를 설정했다면 위의 명령어를 실행하기만 하면 바로 사용할 준비가 됩니다.
If you'd like to upload the extracted files to GCS you need to create the GCS bucket:
추출된 파일을 GCS에 업로드하려면 GCS 버킷을 생성해야 합니다:
Step 1: Make the service account admin of this bucket:
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"
To use this exporter you need to provide the following flags: -exporters GCP -gcp_exporter_gcs_bucket <gcs_bucket_name>
-processing_worker_count: This flag controls number of parallel processing workers. Processing is CPU and I/O heavy, during my testing I found that having 2 workers is the most optimal solution.-cache_dir: Location of local cache used for deduplication, it's advised to change that from /tmp to e.g. home directory of the user that will be running hashr.-export: When set to false hashr will save the results to disk bypassing the exporter.-export_path: If export is set to false, this is the folder where samples will be saved.-reprocess: Allows to reprocess a given source (in case it e.g. errored out) based on the sha256 value stored in the jobs table.-upload_payloads: Controls if the actual content of the file will be uploaded by defined exporters.-gcp_exporter_worker_count: Number of workers/goroutines that the GCP exporter will use to upload the data.This is not an officially supported Google product.