구글 TS2팀 이수림
1. 개요
대부분의 경우 스토리지 관리자는 Storage Transfer Service를 사용하여 서로 다른 액세스 권한을 가진 모든 파일을 포함한 전체 파일 시스템을 마이그레이션합니다. 사용자가 POSIX 액세스가 관찰되는지 확인해야 하는 경우 다중 테넌트 스토리지 환경에서 데이터를 마이그레이션하는 것이 어려울 수 있습니다. 전송 도구는 허용된 것만 전송할 수 있어야 합니다. Storage Transfer Service는 루트 권한으로 작동하지만 전송 에이전트에 액세스 제어를 적용하는 방법이 있습니다.
이 블로그에서는 Storage Transfer Service에 대한 액세스 제어 설정 방법에 대해 알아보도록 하겠습니다.
2. Storage Transfer Service 소개
Storage Transfer Service(이하 STS)는 Google Cloud Storage, Amazon S3, Azure Storage, 온프레미스 데이터 등을 비롯한 파일 스토리지 시스템과 객체 간의 데이터 전송을 자동화하는 서비스로, 코드를 작성할 필요 없이 대량의 데이터를 빠르고 안정적으로 전송하는 데 사용할 수 있습니다.
데이터 무결성을 통해 전송 중에 데이터가 손상되지 않았는지 확인 가능하며, 자동 재시도, 병렬 아키텍처를 통한 전송 속도 가속화 등 우수한 성능을 자랑합니다.
STS가 사용되는 사례는 다음과 같습니다.
1) Cloud Storage로 데이터 마이그레이션:
STS를 사용하여 다른 클라우드 스토리지 제공업체, 온프레미스 데이터 센터, HTTP/HTTPS URL의 데이터를 Cloud Storage로 마이그레이션할 수 있습니다.
2) 백업:
데이터를 Google Cloud에 복제하거나 다른 리전에 Cloud Storage 버킷 사본을 생성합니다.
3) 데이터 처리 파이프라인:
BigQuery 또는 Dataproc을 사용한 분석을 위해 다른 클라우드, 데이터 센터, 에지에서 생성된 데이터를 Google Cloud로 이동합니다.
4) 아카이브:
값비싼 온프레미스 스토리지 시스템의 콜드 데이터를 Cloud Storage로 옮겨 스토리지 비용을 절감합니다.
3. 액세스 제어 개요
마운트/권한 설정이 없으면 전송 에이전트는 마운트 내의 모든 데이터를 전송할 수 있습니다.
/mnt/에 마운트된 에이전트는 모든 기본 디렉터리인 dataset A, dataset B, dataset C, dataset D에서 Cloud Storage로 데이터를 전송할 수 있습니다.

멀티 테넌트 NAS/NFS 스토리지 환경에서 특정 사용자 그룹에 대한 전송 서비스를 설정해야 하는 경우, 특정 마운트 /POSIX 사용자 계정 권한을 사용하여 그룹에 속하지 않는 데이터에 대한 액세스를 제한해야 합니다. 여러 그룹에 대해 서로 다른 POSIX 사용자 계정 권한을 사용하여 여러 설정을 수행할 수 있습니다.

에이전트 풀 A의 모든 에이전트는 /mnt/dataset A의 데이터에만 액세스할 수 있으며, 다른 dataset B, dataset C, dataset D에는 액세스할 수 없습니다.
마찬가지로, 에이전트 풀 B의 모든 에이전트는 /mnt/dataset B의 데이터에만 액세스할 수 있으며, 다른 dataset A, dataset C, dataset D에는 액세스할 수 없습니다.
이처럼 특정 에이전트는 특정 마운트 및 기본 디렉터리의 데이터만 Cloud Storage로 전송할 수 있습니다.
4. 액세스 제어 방법

컨테이너를 전송 에이전트로 설정하여 액세스 제어 방법을 설명합니다.
데이터에 대한 전송 에이전트 액세스 권한을 제한하는 방법에는 두 가지가 있습니다. 두 가지 액세스 제어 방법을 단독으로 사용하거나 결합하여 사용할 수 있습니다.
1) Mount
컨테이너의 마운트 옵션에 디렉토리를 지정하여 서비스를 전송합니다.
마운트 위치 외부의 데이터에 액세스할 수 없습니다. 전송 노드/VM이 디렉터리에 액세스할 수 있더라도 Docker 컨테이너/에이전트에 마운트되지 않으면 데이터에 액세스할 수 없습니다.
대규모 파일 시스템에서는 프로젝트가 디렉터리 구조로 구성될 가능성이 높습니다. 에이전트에 특정 디렉터리를 탑재하면 에이전트 풀이 특정 프로젝트 데이터를 대상으로 할 수 있다는 장점이 있습니다.

2) POSIX user account permission
에이전트가 디렉터리 상단에 액세스할 수 있더라도 POSIX 사용자 계정 권한에 따라 액세스가 제한됩니다.
다중 테넌트 환경에서 관리자는 POSIX 권한으로 사용자 액세스를 제한할 수 있다는 장점이 있습니다.

5. 에이전트 설정 명령어
다음은 Mount / POSIX 사용자 계정 권한으로 전송 에이전트를 설정하는 명령 예시입니다.
1) 서비스 계정 json 키 설정
gcloud iam service-accounts keys create service_account.json --iam-account=<service account name>
2) 전송 에이전트 설정
docker run --ulimit memlock=64000000 -d --rm -v <directory to be transferred>:<directory to be transferred> -v <path to the service account key>/service_account.json:<path to the service account key>service_account.json --user 1000:1001 gcr.io/cloud-ingest/tsop-agent:latest --project-id=thomashk-migration1 --creds-file=<path to the service account key>service_account.json --hostname=$(hostname) --agent-pool=<name of the agent pool>
- Mount : “–user uid:gid”를 사용하여 POSIX 사용자 권한을 설정합니다.
- POSIX user account permission : -v <directory to be transferred>:<directory to be transferred> 를 사용합니다.
권한 없이 디렉터리를 전송하려는 경우 다음과 같은 오류가 표시됩니다.

위에서 언급한 설정 방법을 통해 멀티 테넌트 NAS 환경에서 액세스 제어를 사용하여 여러 전송 에이전트를 설정할 수 있습니다.
