Hadoop에서 권한 마이그레이션

이 문서에서는 Apache Hadoop 분산 파일 시스템 (HDFS), Ranger HDFS, Apache Hive의 권한을 Cloud Storage 또는 BigQuery의 Identity and Access Management (IAM) 역할로 이전하는 방법을 설명합니다.

권한 이전 프로세스는 다음 단계로 구성됩니다.

  1. 먼저 주 구성원 규칙 집합 YAML 구성 파일을 만들어 주 구성원 매핑 파일을 생성합니다. 그런 다음 HDFS 또는 Ranger 메타데이터 파일이 포함된 주 구성원 규칙 집합 YAML 파일로 권한 이전 도구를 실행하여 주 구성원 매핑 파일을 생성합니다.
  2. 먼저 권한 규칙 집합 YAML 파일을 만들어 타겟 권한 매핑 파일을 생성합니다. 그런 다음 권한 규칙 세트 YAML 파일, 테이블 매핑 구성 파일, HDFS 또는 Ranger 메타데이터 파일과 함께 권한 이전 도구를 실행하여 타겟 권한 매핑 파일을 생성합니다.
  3. 타겟 권한 파일로 권한 이전 도구를 실행하여 Cloud Storage 또는 BigQuery에 권한을 적용합니다. 제공된 Python 스크립트를 사용하여 권한을 직접 적용하는 데 사용할 수 있는 Terraform 파일을 생성할 수도 있습니다.

시작하기 전에

권한을 이전하기 전에 다음을 완료했는지 확인하세요.

출시 패키지 내의 terraform.zip 파일에서도 Terraform 생성기 스크립트를 찾을 수 있습니다.

주 구성원 매핑 파일 생성

주 구성원 매핑 파일은 소스의 주 구성원을 Trusted Cloud IAM 주 구성원에 매핑하는 매핑 규칙을 정의합니다.

주 구성원 매핑 파일을 생성하려면 먼저 주 구성원이 소스에서 Trusted Cloud IAM 주 구성원으로 매핑되는 방식을 정의하는 주 구성원 규칙 집합 YAML 파일을 수동으로 만들어야 합니다. 주 구성원 규칙 집합 YAML 파일에서 ranger, HDFS 또는 둘 다와 같은 각 소스의 매핑 규칙을 정의합니다.

다음 예는 Apache Ranger 그룹을 Trusted Cloud by S3NS의 서비스 계정에 매핑하는 주 구성원 규칙 집합 YAML 파일을 보여줍니다.

  ranger:
    user_rules:
      - skip: true
    group_rules:
      # Skip internal Ranger groups.
      - skip: true
        when: "group.groupSource == 0"

      # Map all roles to Google Cloud Platform service accounts.
      - map:
          type:
            value: serviceAccount
          email_address:
            expression: "group.name + 'my-service-account@my-project.s3ns-system.iam.gserviceaccount.com'"

    role_rules:
      - skip: true

  hdfs:
    user_rules:
      - skip: true
    group_rules:
      - skip: true
    other_rules:
      - skip: true

다음 예는 HDFS 사용자를 특정 Trusted Cloud 사용자에게 매핑하는 주 구성원 규칙 집합 YAML 파일을 보여줍니다.

  ranger:
    user_rules:
      - skip: true
    group_rules:
      - skip: true
    role_rules:
      - skip: true

  hdfs:
    user_rules:
      # Skip user named 'example'
      - when: "user.name == 'example'"
        skip: true
      # Map all other users to their name at google.com
      - when: "true"
        map:
          type:
            value: user
          email_address:
            expression: "user.name + '@google.com'"

    group_rules:
      - skip: true
    other_rules:
      - skip: true

주 구성원 규칙 세트 YAML 파일을 만드는 구문에 대한 자세한 내용은 규칙 세트 YAML 파일을 참고하세요.

주 구성원 규칙 집합 YAML 파일을 만든 후 Cloud Storage 버킷에 업로드합니다. 권한을 이전하는 소스에 따라 HDFS 파일, dwh-migration-dumper 도구로 생성된 Apache Ranger 파일 또는 둘 다 포함해야 합니다. 그런 다음 권한 이전 도구를 실행하여 주 구성원 매핑 파일을 생성할 수 있습니다.

다음 예시에서는 권한 이전 도구를 실행하여 HDFS와 Apache Ranger 모두에서 이전하는 방법을 보여줍니다. 그 결과 principals.yaml라는 주 구성원 매핑 파일이 생성됩니다.

./dwh-permissions-migration expand \
    --principal-ruleset gs://MIGRATION_BUCKET/principals-ruleset.yaml \
    --hdfs-dumper-output gs://MIGRATION_BUCKET/hdfs-dumper-output.zip \
    --ranger-dumper-output gs://MIGRATION_BUCKET/ranger-dumper-output.zip \
    --output-principals gs://MIGRATION_BUCKET/principals.yaml

MIGRATION_BUCKET을 이전 파일이 포함된 Cloud Storage 버킷 이름으로 바꿉니다.

도구를 실행한 후 생성된 principals.yaml 파일을 검사하여 소스의 주 구성원이 Trusted CloudIAM 주 구성원에 매핑되어 있는지 확인합니다. 다음 단계를 진행하기 전에 파일을 수동으로 수정할 수 있습니다.

타겟 권한 파일 생성

타겟 권한 파일에는 Hadoop 클러스터에 설정된 소스 권한 집합과 BigQuery 또는 Cloud Storage 관리 폴더의 IAM 역할 간 매핑에 관한 정보가 포함되어 있습니다. 타겟 권한 파일을 생성하려면 먼저 Ranger 또는 HDFS의 권한이 Cloud Storage 또는 BigQuery에 매핑되는 방식을 지정하는 권한 규칙 집합 YAML 파일을 수동으로 만들어야 합니다.

다음 예에서는 Cloud Storage에 대한 모든 Ranger 권한을 허용합니다.

gcs:
  ranger_hive_rules:
    - map: {}
      log: true

다음 예시에서는 hadoop 주 구성원을 제외한 모든 HDFS 권한을 허용합니다.

gcs:
  hdfs_rules:
    - when:
        source_principal.name == 'hadoop'
      skip: true
    - map: {}

다음 예에서는 tab0 테이블의 기본 역할 매핑을 재정의하고 다른 모든 권한에는 기본값을 사용합니다.

gcs:
  ranger_hive_rules:
    ranger_hive_rules:
      - when: table.name == 'tab0'
        map:
          role:
            value: "roles/customRole"
      - map: {}

권한 규칙 세트 YAML 파일을 만드는 구문에 대한 자세한 내용은 규칙 세트 YAML 파일을 참고하세요.

권한 규칙 세트 YAML 파일을 만든 후 Cloud Storage 버킷에 업로드합니다. 권한을 이전하는 소스에 따라 HDFS 파일, dwh-migration-dumper 도구로 생성된 Apache Ranger 파일 또는 둘 다 포함해야 합니다. 표 구성 YAML 파일주 구성원 매핑 파일도 포함해야 합니다.

그런 다음 권한 이전 도구를 실행하여 타겟 권한 파일을 생성할 수 있습니다.

다음 예에서는 권한 이전 도구를 실행하여 HDFS와 Apache Ranger 모두에서 이전하는 방법을 보여줍니다. 테이블 매핑 구성 파일과 principals.yaml라는 주 구성원 매핑 파일이 있으며, 결과적으로 permissions.yaml라는 주 구성원 매핑 파일이 생성됩니다.

./dwh-permissions-migration build \
    --permissions-ruleset gs://MIGRATION_BUCKET/permissions-config.yaml \
    --tables gs://MIGRATION_BUCKET/tables/ \
    --principals gs://MIGRATION_BUCKET/principals.yaml \
    --ranger-dumper-output gs://MIGRATION_BUCKET/ranger-dumper-output.zip \
    --hdfs-dumper-output gs://MIGRATION_BUCKET/hdfs-dumper-output.zip \
    --output-permissions gs://MIGRATION_BUCKET/permissions.yaml

MIGRATION_BUCKET을 이전 파일이 포함된 Cloud Storage 버킷 이름으로 바꿉니다.

도구를 실행한 후 생성된 permissions.yaml 파일을 검사하여 소스의 권한이 Cloud Storage 또는 BigQuery IAM 바인딩에 매핑되어 있는지 확인합니다. 다음 단계를 진행하기 전에 수동으로 수정할 수 있습니다.

권한 적용

타겟 권한 파일을 생성한 후 권한 이전 도구를 실행하여 Cloud Storage 또는 BigQuery에 IAM 권한을 적용할 수 있습니다.

권한 이전 도구를 실행하기 전에 다음 기본 요건을 충족하는지 확인하세요.

  • Trusted Cloud에서 필요한 주 구성원 (사용자, 그룹, 서비스 계정)을 만들었습니다.
  • 마이그레이션된 데이터를 호스팅할 Cloud Storage 관리 폴더 또는 테이블을 만들었습니다.
  • 도구를 실행하는 사용자에게 Cloud Storage 관리 폴더 또는 테이블의 역할을 관리할 권한이 있습니다.

다음 명령어를 실행하여 권한을 적용할 수 있습니다.

./dwh-permissions-migration apply \
--permissions gs://MIGRATION_BUCKET/permissions.yaml

여기서 MIGRATION_BUCKET은 이전 파일이 포함된 Cloud Storage 버킷의 이름입니다.

Terraform 구성으로 권한 적용

마이그레이션된 권한을 적용하려면 대상 권한 파일을 Terraform 코드형 인프라 (IaC) 구성으로 변환하여 Cloud Storage에 적용할 수도 있습니다.

  1. Python 3.7 이상이 있는지 확인합니다.
  2. 새 가상 환경을 만들고 활성화합니다.
  3. permissions-migration/terraform 디렉터리에서 다음 명령어를 사용하여 requirements.txt 파일의 종속 항목을 설치합니다.

    python -m pip install -r requirements.txt
  4. 생성기 명령어를 실행합니다.

    python tf_generator PATH LOCATION OUTPUT

    다음을 바꿉니다.

    • PATH: 생성된 permissions.yaml 파일의 경로입니다.
    • LOCATION: 스크립트가 권한 구성에 따라 폴더를 확인하고 만드는 Cloud Storage 버킷의 위치입니다.
    • OUTPUT: 출력 파일 main.tf의 경로입니다.

규칙 세트 YAML 파일

규칙 집합 YAML 파일은 HDFS 또는 Apache Ranger에서Trusted Cloud로 권한을 이전할 때 주 구성원과 역할을 매핑하는 데 사용됩니다. 규칙 세트 YAML 파일은 Common Expression Language(CEL)를 사용하여 결과가 불리언인 술어와 결과가 문자열인 표현식을 지정합니다.

규칙 세트 YAML 파일에는 다음과 같은 특징이 있습니다.

  • 각 유형의 매핑 규칙은 각 입력 객체에 대해 위에서 아래로 순차적으로 실행됩니다.
  • CEL 표현식은 컨텍스트 변수에 액세스할 수 있으며 컨텍스트 변수는 규칙 세트의 섹션에 따라 달라집니다. 예를 들어 user 변수를 사용하여 소스 사용자 객체에 매핑하고 group 변수를 사용하여 그룹에 매핑할 수 있습니다.
  • CEL 표현식을 사용하거나 정적 값을 사용하여 기본값을 변경할 수 있습니다. 예를 들어 그룹을 매핑할 때 기본값 group에서 출력 값 typeserviceAccount와 같은 다른 값으로 재정의할 수 있습니다.
  • 모든 입력 객체와 일치하는 규칙이 하나 이상 있어야 합니다.

HDFS 또는 Apache Ranger 권한 이전에서 규칙 세트 YAML 파일을 사용하여 주 구성원 매핑 파일 또는 역할 매핑 파일을 정의할 수 있습니다.

규칙 세트 YAML 파일의 매핑 규칙

규칙 세트 YAML 파일은 권한 이전 중에 소스의 객체가 타겟과 일치하는 방식을 지정하는 매핑 규칙으로 구성됩니다. 매핑 규칙에는 다음 섹션 또는 조항이 포함될 수 있습니다.

  • when: 규칙의 적용 가능성을 제한하는 술어 절입니다.
    • 문자열은 불리언 CEL 표현식을 나타냅니다. 값은 true 또는 false일 수 있습니다.
    • 이 규칙은 when 절이 true로 평가되는 경우에만 적용됩니다.
    • 기본값은 true입니다.
  • map: 결과 필드의 콘텐츠를 지정하는 절입니다. 이 절의 값은 처리된 객체의 유형에 따라 다르며 다음과 같이 정의할 수 있습니다.
    • 문자열로 평가할 expression
    • 상수 문자열의 경우 value
  • skip: 입력 객체를
    • true 또는 false일 수 있습니다.
  • log: 규칙을 디버그하거나 개발하는 데 도움이 되는 술어 절입니다.
    • 문자열은 불리언 CEL 표현식을 나타냅니다. 값은 true 또는 false일 수 있습니다.
    • 기본값은 false입니다.
    • true로 설정하면 출력에 실행 문제를 모니터링하거나 진단하는 데 사용할 수 있는 실행 로그가 포함됩니다.

주 구성원 규칙 세트 YAML 파일 만들기

주 구성원 매핑 파일은 email_addresstype 값을 제공하여 주 구성원 식별자를 생성하는 데 사용됩니다.

  • email_address을 사용하여 Trusted Cloud 구성원의 이메일을 지정합니다.
  • type을 사용하여 Trusted Cloud의 주체 유형을 지정합니다. type의 값은 user, group 또는 serviceAccount일 수 있습니다.

규칙에 사용된 모든 CEL 표현식은 처리된 객체를 나타내는 변수에 액세스할 수 있습니다. 변수의 필드는 HDFS 또는 Apache Ranger 메타데이터 파일의 콘텐츠를 기반으로 합니다. 사용 가능한 변수는 규칙 세트의 섹션에 따라 다릅니다.

  • user_rules에는 user 변수를 사용합니다.
  • group_rules에는 group 변수를 사용합니다.
  • other_rules에는 other 변수를 사용합니다.
  • role_rules에는 role 변수를 사용합니다.

다음 예에서는 HDFS의 사용자를 사용자 이름과 @google.com을 이메일 주소로 사용하여 Trusted Cloud의 사용자에 매핑합니다.

hdfs:
  user_rules:
    # Skip user named 'example'
    - when: "user.name == 'example'"
      skip: true
    # Map all other users to their name at google.com
    - when: "true"
      map:
        type:
          value: user
        email_address:
          expression: "user.name + '@google.com'"

기본 역할 매핑 재정의

기본이 아닌 주 구성원을 사용하려면 규칙 세트 파일을 사용하여 기본 역할 매핑을 건너뛰거나 수정하면 됩니다.

다음 예에서는 규칙 섹션을 건너뛰는 방법을 보여줍니다.

hdfs:
  user_rules:
    - skip: true
  group_rules:
    - skip: true
  other_rules:
    - skip: true

권한 규칙 세트 YAML 파일 만들기

권한 규칙 세트 YAML 파일은 타겟 권한 매핑 파일을 생성하는 데 사용됩니다. 권한 규칙 집합 YAML 파일을 만들려면 권한 규칙 집합 YAML에서 CEL 표현식을 사용하여 HDFS 또는 Apache Ranger 권한을 Cloud Storage 또는 BigQuery 역할에 매핑합니다.

기본 역할 매핑

HDFS 파일 역할은 소스 파일 권한에 따라 결정됩니다.

  • w 비트가 설정된 경우 기본 역할은 writer입니다.
  • r 비트가 설정된 경우 기본 역할은 reader입니다.
  • 두 비트가 모두 설정되지 않으면 역할이 비어 있습니다.

Ranger HDFS:

  • 액세스 세트에 write이 포함된 경우 기본 역할은 writer입니다.
  • 액세스 세트에 read이 포함된 경우 기본 역할은 reader입니다.
  • 액세스 세트에 둘 다 포함되어 있지 않으면 역할이 비어 있습니다.

레인저:

  • 액세스 세트에 update, create, drop, alter, index, lock, all, write 또는 refresh이 포함된 경우 기본 역할은 writer입니다.
  • 액세스 세트에 select 또는 read이 포함된 경우 기본 역할은 reader입니다.
  • 액세스 세트에 위의 권한이 포함되어 있지 않으면 역할이 비어 있습니다.

Cloud Storage:

  • roles/storage.objectUser - Writer
  • roles/storage.objectViewer - 리더

BigQuery:

  • roles/bigquery.dataOwner - Writer
  • roles/bigquery.dataViewer - 리더

다음 예에서는 규칙 세트 YAML 파일의 변경 없이 기본 매핑을 수락하는 방법을 보여줍니다.

ranger_hdfs_rules:
  - map: {}

기본 역할 매핑 재정의

기본값이 아닌 역할을 사용하려면 규칙 세트 파일을 사용하여 기본 역할 매핑을 건너뛰거나 수정하면 됩니다.

다음 예시에서는 값 원인을 사용하여 역할 필드가 있는 map 절을 사용하여 기본 역할 매핑을 재정의하는 방법을 보여줍니다.

ranger_hdfs_rules:
  - map:
    role:
      value: "roles/customRole"

권한 매핑 병합

동일한 타겟 리소스에 대해 여러 권한 매핑이 생성되면 액세스 범위가 가장 넓은 매핑이 사용됩니다. 예를 들어 HDFS 규칙이 HDFS 위치에서 주 구성원 pa1에게 리더 역할을 부여하고 Ranger 규칙이 동일한 위치에서 동일한 주 구성원에게 작성자 역할을 부여하는 경우 작성자 역할이 할당됩니다.

CEL 표현식의 문자열 인용

따옴표 ""를 사용하여 YAML에서 전체 CEL 표현식을 래핑합니다. CEL 표현식 내에서 문자열을 인용할 때는 작은따옴표 ''를 사용합니다. 예를 들면 다음과 같습니다.

"'permissions-migration-' + group.name + '@google.com'"