고급 서비스를 사용한 BigQuery 행 수준 보안

예를 들어 영업 조직을 위한 솔루션을 만들려고 한다고 가정해 보겠습니다. 영업 조직은 여러 리전으로 나뉘며 각 리전에는 자체 리전 관리자가 있습니다. BigQuery의 영업 데이터 세트에는 리전별 및 날짜별 영업 금액이 있습니다.

제안된 솔루션에는 리전 관리자가 자신의 리전의 영업 데이터만 볼 수 있는 단일 대시보드가 있습니다.

요구사항

  • 대시보드 뷰어는 Google 계정으로 로그인합니다.
  • 사용자의 이메일과 액세스 권한이 있는 데이터/행 간의 매핑을 사용할 수 있습니다.
  • 서비스 계정은 BigQuery 데이터에 액세스하는 데 사용됩니다. 따라서 결제는 대시보드 제공업체에서 중앙 집중식으로 관리합니다.

제한사항

  • 대시보드에는 첫 번째 뷰에서 각 뷰어의 일회성 승인이 필요합니다.
  • 뷰어는 대시보드를 수정하거나 다른 사용자와 공유할 수 없습니다.
  • Workspace 고객이고 관리자가 '링크가 있는 모든 사용자'에게 Drive 파일 공유를 사용 중지한 경우 공유 제한을 삭제하거나 Gmail.com 계정에서 솔루션을 개발합니다.

솔루션

솔루션을 구현하려면 다음 단계를 모두 완료하세요.

새 커뮤니티 커넥터 만들기

커뮤니티 커넥터 작동 방식을 검토하고 커뮤니티 커넥터 Codelab을 완료하여 시작하세요. 개발자 도구를 사용하여 커넥터를 만들면 개발 프로세스를 더 빠르고 쉽게 진행할 수 있습니다.

커넥터 코드 작성

  1. getAuthType()NONE을 반환해야 합니다.
  2. getConfig()는 빈 구성을 반환해야 합니다.
    • 선택사항: 대시보드를 구성하는 데 특정 입력이 필요한 경우 여기에서 사용자 입력을 요청할 수 있습니다.
  3. getSchema()는 쿼리의 스키마를 반환해야 합니다.
    • 선택사항: SQL 쿼리에서 또는 스키마의 일부로 계산된 필드를 사용하여 커스텀 필드와 계산을 추가할 수 있습니다.
  4. getData()이후 단계에서 완료됩니다.

매니페스트 업데이트

매니페스트 참조를 보고 다음을 비롯한 모든 필수 정보로 매니페스트를 완료합니다.

  1. dataStudio.forceViewersCredentialstrue로 설정합니다.
  2. dataStudio.advancedServices.datatrue로 설정합니다.
  3. oauthScopeshttps://www.googleapis.com/auth/userinfo.emailhttps://www.googleapis.com/auth/script.external_request를 추가합니다. 자세한 내용은 Authorization Scopes for Apps Script를 참고하세요.
    • 조건부: 커넥터에 사용된 서비스와 관련된 모든 범위를 추가합니다.

매니페스트는 다음과 같아야 합니다.

{
  ...
  "dataStudio": {
    "forceViewersCredentials": true,
    "advancedServices": {
       "data": true
    },
    ...
  }
  "oauthScopes": [
    "https://www.googleapis.com/auth/script.external_request",
    "https://www.googleapis.com/auth/userinfo.email"
    ],
  ...
}

서비스 계정 구현

  1. 서비스 계정을 만듭니다. Google Cloud 프로젝트에서 이 프로젝트가 결제 프로젝트가 됩니다.
  2. 이 서비스 계정에 클라우드 프로젝트의 BigQuery 액세스 권한이 있는지 확인합니다.
    • 필수 Identity and Access Management (IAM) 역할: BigQuery Data Viewer, BigQuery Job User
  3. JSON 파일을 다운로드하여 서비스 계정 키를 가져옵니다. 커넥터 프로젝트의 스크립트 속성에 키를 저장합니다.
  4. 포함합니다. Apps Script용 OAuth2 라이브러리를 Apps Script 프로젝트에
  5. 서비스 계정에 필요한 OAuth2 코드를 구현합니다.
    var SERVICE_ACCOUNT_CREDS = 'SERVICE_ACCOUNT_CREDS';
    var SERVICE_ACCOUNT_KEY = 'private_key';
    var SERVICE_ACCOUNT_EMAIL = 'client_email';
    var BILLING_PROJECT_ID = 'project_id';
    
    /**
     * Copy the entire credentials JSON file from creating a service account in GCP.
     */
    function getServiceAccountCreds() {
      return JSON.parse(scriptProperties.getProperty(SERVICE_ACCOUNT_CREDS));
    }
    
    function getOauthService() {
      var serviceAccountCreds = getServiceAccountCreds();
      var serviceAccountKey = serviceAccountCreds[SERVICE_ACCOUNT_KEY];
      var serviceAccountEmail = serviceAccountCreds[SERVICE_ACCOUNT_EMAIL];
    
      return OAuth2.createService('RowLevelSecurity')
        .setAuthorizationBaseUrl('https://accounts.google.com/o/oauth2/auth')
        .setTokenUrl('https://accounts.google.com/o/oauth2/token')
        .setPrivateKey(serviceAccountKey)
        .setIssuer(serviceAccountEmail)
        .setPropertyStore(scriptProperties)
        .setCache(CacheService.getScriptCache())
        .setScope(['https://www.googleapis.com/auth/bigquery.readonly']);
    }

getData() 구현

  1. BigQuery 쿼리를 구성합니다.
    • 이메일을 사용하여 이메일과 데이터 간의 매핑을 조회합니다.
    • JOIN 또는 WHERE 절을 사용하여 데이터를 필터링합니다.
  2. 유효한 사용자의 이메일 (사용자 ID 참조)을 가져옵니다.
  3. [데이터 스튜디오 고급 서비스] 를 사용하여 getData에서 쿼리 구성을 반환합니다.
    • 구성된 쿼리, 결제 프로젝트, 서비스 계정 OAuth 토큰을 전달합니다.
    • 조건부: 커넥터 getConfig를 통해 사용자 입력을 받는 경우 입력을 BigQuery 매개변수로 통합해야 합니다.

대시보드 만들기

  1. 커넥터의 배포 및 버전 작동 방식을 이해합니다.
  2. 커넥터의 프로덕션 배포를 만듭니다.
  3. 프로덕션 배포를 사용하여 데이터 스튜디오에서 데이터 소스와 새 보고서를 만듭니다.
  4. 보고서에 모든 표와 차트를 추가합니다.
  5. 이제 대시보드를 사용자와 공유할 수 있습니다.

사용자가 대시보드를 사용할 수 있도록 설정

  1. 선택한 사용자 또는 ' 링크가 있는 모든 사용자'와 커넥터 스크립트를 공유합니다.
  2. 대시보드 공유를 선택한 사용자 또는 '링크가 있는 모든 사용자'와 공유합니다.
  3. 선택사항: URL 단축기 서비스를 사용하여 대시보드 URL의 짧은 링크를 만듭니다. 단축된 URL을 사용자와 공유합니다. 이렇게 하면 나중에 필요한 경우 대시보드 URL을 대체하는 데 도움이 됩니다.
  4. 선택사항: 대시보드 사용량 측정을 위해 Google 애널리틱스를 설정하여 보고서에 연결합니다.

코드 예