Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우
계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
In the Google Cloud console, on the project selector page,
select or create a Google Cloud project.
Roles required to select or create a project
Select a project: Selecting a project doesn't require a specific
IAM role—you can select any project that you've been
granted a role on.
Create a project: To create a project, you need the Project Creator role
(roles/resourcemanager.projectCreator), which contains the
resourcemanager.projects.create permission. Learn how to grant
roles.
To enable APIs, you need the serviceusage.services.enable permission. If you
created the project, then you likely already have this permission through the
Owner role (roles/owner). Otherwise, you can get this permission through the
Service Usage Admin role (roles/serviceusage.serviceUsageAdmin).
Learn how to grant roles.
In the Google Cloud console, on the project selector page,
select or create a Google Cloud project.
Roles required to select or create a project
Select a project: Selecting a project doesn't require a specific
IAM role—you can select any project that you've been
granted a role on.
Create a project: To create a project, you need the Project Creator role
(roles/resourcemanager.projectCreator), which contains the
resourcemanager.projects.create permission. Learn how to grant
roles.
To enable APIs, you need the serviceusage.services.enable permission. If you
created the project, then you likely already have this permission through the
Owner role (roles/owner). Otherwise, you can get this permission through the
Service Usage Admin role (roles/serviceusage.serviceUsageAdmin).
Learn how to grant roles.
서비스 계정 토큰 생성자
(roles/iam.serviceAccountTokenCreator)
자동 저장소 출시 및 자동 워크플로 실행의 경우 Dataform 서비스 에이전트에 유효한 서비스 계정에 대한 iam.serviceAccounts.actAs 권한을 부여합니다.
Knowledge Catalog에서 메타데이터 보강 및 데이터 품질 스코어카드 통합을 사용 설정하려면 워크플로 실행에 사용되는 커스텀 서비스 계정 또는 Google 계정에 프로젝트 또는 @bigquery 항목 그룹에 대한 Dataplex 카탈로그 편집자(roles/dataplex.catalogEditor) 역할을 부여합니다.
보안 고려사항
Dataform 서비스 에이전트, 커스텀 서비스 계정 또는 사용자의 Google 계정에 Dataform에서 필요한 역할을 부여할 때는 다음과 같은 보안 고려사항이 있습니다.
필요한 역할이 부여된 모든 커스텀 서비스 계정은 VPC 서비스 제어에 관계없이 서비스 계정이 속한 프로젝트의 BigQuery, Secret Manager 또는 Knowledge Catalog에 액세스할 수 있습니다. Dataform이 커스텀 서비스 계정을 사용하여 워크플로를 실행하면 Dataform 요청이 저장소가 포함된 프로젝트의 VPC 서비스 제어 경계 내에서 시작된 것으로 처리됩니다. 따라서 이러한 리소스가 동일한 서비스 경계 내에 있는 경우 VPC 서비스 제어는 Dataform과 BigQuery, Secret Manager, Knowledge Catalog와 같은 다른 서비스 간의 통신을 차단하지 않습니다.
이러한 보안 경계를 관리하는 방법에 관한 자세한 내용은 VPC 서비스 제어 구성을 참고하세요.
dataform.repositories.create IAM 권한이 있는 모든 사용자는 Dataform 서비스 에이전트와 해당 서비스 에이전트 또는 서비스 계정에 부여된 모든 권한을 사용하여 코드를 실행할 수 있습니다.
사용자, 서비스 에이전트 또는 서비스 계정이 BigQuery에서 읽거나 쓸 수 있는 데이터를 제한하려면 선택한 BigQuery 데이터 세트 또는 테이블에 대한 세분화된 BigQuery IAM 권한을 부여하면 됩니다. 자세한 내용은 데이터 세트 액세스 제어 및 테이블 및 뷰 액세스 제어를 참조하세요.
사용자가 다른 사용자의 Google 계정 사용자 인증 정보를 사용하여 작업을 실행하지 못하도록 다음 제한사항이 적용됩니다.
워크플로 구성에 연결된 다른 Google 계정의 사용자 인증 정보로 워크플로 구성을 수정하려면 워크플로 구성에 자체 Google 계정의 사용자 인증 정보를 연결하거나 커스텀 서비스 계정으로 인증하도록 워크플로 구성을 변경해야 합니다.
다른 Google 계정 사용자의 사용자 인증 정보가 연결된 출시 구성을 참조하는 워크플로 구성이 있는 경우 출시 구성의 컴파일 결과를 수정할 수 없습니다.
Google 계정 사용자 인증 정보로 인증하고 일정이 있는 출시 구성을 참조하도록 워크플로 구성을 설정할 수 없습니다. 이 제한사항으로 인해 다음과 같은 결과가 발생합니다.
Google 계정 사용자 인증 정보로 인증하도록 설정된 출시 구성을 참조하는 워크플로 구성이 있는 경우 일정을 사용하도록 출시 구성을 업데이트할 수 없습니다.
Google 계정 사용자 인증 정보로 인증하고 일정이 있는 출시 구성을 가리키는 워크플로 구성을 만들 수 없습니다.
Google 계정 사용자 인증 정보를 사용하고 일정이 있는 출시 구성을 가리키도록 워크플로 구성을 만들거나 업데이트할 수 없습니다.
Google 계정 최종 사용자 사용자 인증 정보의 사용을 허용하지 않으려면 조직 관리자가 end_user_auth_config 설정을 거부하는 맞춤 조직 정책 제약 조건을 만들면 됩니다. 자세한 내용은 커스텀 조직 정책 제약 조건 만들기를 참고하세요.
필요한 BigQuery 역할 부여
Dataform 서비스 에이전트, Dataform에서 사용하려는 커스텀 서비스 계정 또는 Dataform에서 인증하는 데 사용하려는 사용자의 Google 계정에 필요한 BigQuery IAM 역할을 부여하려면 다음 단계를 따르세요.
새 주 구성원 필드에 서비스 에이전트 ID, 서비스 계정 ID 또는 사용자의 Google 계정 이메일을 입력합니다.
역할 선택 목록에서 BigQuery 작업 사용자 역할을 선택합니다.
다른 역할 추가를 클릭한 다음 역할 선택 목록에서 BigQuery 데이터 편집자 역할을 선택합니다.
다른 역할 추가를 클릭한 다음 역할 선택 목록에서 BigQuery 데이터 뷰어 역할을 선택합니다.
저장을 클릭합니다.
자동 워크플로에 필요한 역할 부여
Dataform에서 커스텀 서비스 계정을 사용하려면 Dataform 서비스 에이전트가 커스텀 서비스 계정에 액세스할 수 있어야 합니다. 이렇게 하면 Dataform에서 서비스 에이전트 계정이 아닌 커스텀 서비스 계정에 정의된 권한을 사용하여 워크플로를 실행할 수 있습니다.
이 액세스 권한을 부여하려면 Dataform 서비스 에이전트에 서비스 계정 토큰 생성자 역할(roles/iam.serviceAccountTokenCreator)을 주 구성원으로 부여해야 합니다. 이렇게 하면 Dataform 서비스 에이전트가 토큰이라고 하는 단기 사용자 인증 정보를 만들어 서비스 계정을 가장할 수 있습니다. 이러한 토큰은 Dataform이 커스텀 서비스 계정의 ID를 사용하여 워크플로를 실행하는 데 필요합니다.
또한 Dataform 서비스 에이전트에 서비스 계정 사용자 역할(roles/iam.serviceAccountUser)을 부여해야 합니다. 이렇게 하면 Dataform 서비스 에이전트가 커스텀 서비스 계정으로 실행되는 워크플로 구성에 대해 새로운 자동 워크플로 실행을 시작할 수 있습니다.
Dataform 서비스 에이전트에 커스텀 서비스 계정에 대한 액세스 권한을 부여하려면 다음 단계를 따르세요.
역할 선택 목록에서 서비스 계정 토큰 생성자 역할과 서비스 계정 사용자 역할을 선택합니다.
저장을 클릭합니다.
이제 Dataform 저장소 내에서 커스텀 서비스 계정을 구성할 수 있습니다.
감사 서비스 계정 구성
이 섹션에서는 Dataform 리소스를 감사하여 적절한 서비스 계정 사용 및 권한 부여를 보장하는 방법을 보여줍니다. 감사는 특히 커스텀 서비스 계정을 사용할 때 중요합니다. Dataform 서비스 에이전트가 작동하려면 특정 권한이 필요하기 때문입니다.
Dataform 저장소 또는 워크플로 구성에 커스텀 서비스 계정을 사용하는 경우 Dataform 서비스 에이전트에 커스텀 서비스 계정에 대한 서비스 계정 사용자 역할(roles/iam.serviceAccountUser)이 있는지 확인해야 합니다. 이 역할은 Dataform 서비스 에이전트가 시작한 예약된 실행이 커스텀 서비스 계정을 가장할 수 있도록 하는 iam.serviceAccounts.actAs 권한을 부여합니다. 또한 Dataform 서비스 에이전트에게 유효한 서비스 계정에 대한 서비스 계정 토큰 생성자 역할(roles/iam.serviceAccountTokenCreator)이 있는지 확인합니다.
저장소 서비스 계정 확인
먼저 Dataform 자체 예약 및 실행 범위에 속하는 dataform.Repository 애셋을 식별합니다. 그런 다음 범위 내 저장소의 서비스 계정 구성을 확인합니다.
Cloud 애셋 인벤토리를 사용하여 dataform.Repository 유형의 모든 리소스를 나열합니다.
자세한 내용은 애셋 보기를 참고하세요.
Cloud 애셋 인벤토리 출력의 각 저장소에 대해 resource.data.labels 필드를 확인하여 범위 내에 있는지 확인합니다. 정확한 경로는 내보내기 형식에 따라 약간 다를 수 있습니다.
single-file-asset-type 키의 라벨 맵을 검사하여 범위 외 저장소를 식별합니다. 이 키가 있으면 저장소가 BigQuery 기능에서 사용됨을 나타냅니다. 값이 sql 또는 data_canvas이면 서비스 계정 권한 확인에서 저장소를 제외할 수 있습니다.
이 키 또는 값이 없는 나머지 저장소는 서비스 계정 권한 확인 범위에 있습니다.
범위 내 각 저장소에 대해 Cloud 애셋 인벤토리 출력의 resource.data.serviceAccount 필드를 확인하여 커스텀 서비스 계정이 구성되어 있는지 확인합니다.
resource.data.serviceAccount 필드가 있고 값이 프로젝트의 Dataform 서비스 에이전트 이메일 주소와 다른 경우 저장소에서 커스텀 서비스 계정을 사용합니다.
resource.data.serviceAccount 필드가 없거나 필드 값이 프로젝트의 Dataform 서비스 에이전트와 일치하면 저장소에서 서비스 에이전트를 사용합니다.
커스텀 서비스 계정을 사용하는 경우 Dataform 서비스 에이전트에 해당 커스텀 서비스 계정에 대한 서비스 계정 사용자 역할(roles/iam.serviceAccountUser)과 서비스 계정 토큰 생성자 역할(roles/iam.serviceAccountTokenCreator)이 모두 있는지 확인합니다.
워크플로 구성 서비스 계정 확인
Dataform 워크플로 구성에 전용 커스텀 서비스 계정을 사용하는 것은 최소 권한 원칙에 부합하는 보안 권장사항입니다.
dataform.WorkflowConfig resources의 서비스 계정 사용량을 확인하려면 다음 단계를 따르세요.
Cloud 애셋 인벤토리를 사용하여 dataform.WorkflowConfig 유형의 모든 리소스를 나열합니다.
각 워크플로 구성에 대해 Cloud 애셋 인벤토리 출력을 검사하여 유효한 서비스 계정을 확인합니다.
resource.data.serviceAccount 필드가 있으면 이 값은 워크플로 구성에 명시적으로 설정된 서비스 계정의 이메일 주소입니다.
resource.data.serviceAccount 필드가 없으면 워크플로 구성이 상위 저장소에서 서비스 계정을 상속합니다.
상위 저장소의 구성을 확인하여 유효한 서비스 계정을 찾습니다.
유효한 서비스 계정의 이메일 주소를 프로젝트의 Dataform 서비스 에이전트의 이메일 주소와 비교하여 커스텀 서비스 계정이 사용되고 있는지 확인합니다. 다른 경우 맞춤 서비스 계정이 사용 중입니다.
커스텀 서비스 계정을 사용하는 경우 Dataform 서비스 에이전트에 해당 커스텀 서비스 계정에 서비스 계정 사용자 역할(roles/iam.serviceAccountUser)과 서비스 계정 토큰 생성자 역할(roles/iam.serviceAccountTokenCreator)이 모두 부여되어 있는지 확인합니다. 이러한 권한을 통해 Dataform 서비스 에이전트는 커스텀 서비스 계정을 가장하여 워크플로 실행을 시작할 수 있습니다.
Security Command Center로 서비스 에이전트 권한 모니터링
최소 권한 원칙을 지속적으로 준수하려면 Security Command Center에서 권한이 과도한 서비스 계정 및 서비스 에이전트와 관련된 발견 항목을 적극적으로 모니터링하세요.
Dataform 서비스 에이전트의 SERVICE_AGENT_GRANTED_BASIC_ROLE 발견 항목을 수정할 때는 권한이 과도하게 부여된 역할을 필요한 최소 권한이 있고 특정 리소스에 범위가 지정된 사전 정의된 역할로 바꿉니다. 예를 들어 특정 서비스 계정에 서비스 계정 사용자 역할 (roles/iam.serviceAccountUser)을 부여합니다.
Permissions to comment, at the repository level. Grants CRUD access over commentThread and comment resources.
dataform.commentThreads.*
dataform.commentThreads.create
dataform.commentThreads.delete
dataform.commentThreads.get
dataform.commentThreads.list
dataform.commentThreads.update
dataform.comments.*
dataform.comments.create
dataform.comments.delete
dataform.comments.get
dataform.comments.list
dataform.comments.update
dataform.folders.get
dataform.folders.queryContents
dataform.locations.get
dataform.repositories.get
dataform.repositories.readFile
resourcemanager.projects.get
resourcemanager.projects.list
Code Creator
(roles/dataform.codeCreator)
Access only to private and shared code resources. The permissions in the Code Creator let you create and list code in Dataform, and access only the code that you created and code that was explicitly shared with you.
dataform.commentThreads.get
dataform.commentThreads.list
dataform.comments.get
dataform.comments.list
dataform.folders.create
dataform.locations.*
dataform.locations.get
dataform.locations.list
dataform.repositories.create
dataform.repositories.list
resourcemanager.projects.get
resourcemanager.projects.list
Code Editor
(roles/dataform.codeEditor)
Edit access code resources.
dataform.commentThreads.*
dataform.commentThreads.create
dataform.commentThreads.delete
dataform.commentThreads.get
dataform.commentThreads.list
dataform.commentThreads.update
dataform.comments.*
dataform.comments.create
dataform.comments.delete
dataform.comments.get
dataform.comments.list
dataform.comments.update
dataform.compilationResults.*
dataform.compilationResults.create
dataform.compilationResults.get
dataform.compilationResults.list
dataform.compilationResults.query
dataform.folders.addContents
dataform.folders.create
dataform.folders.get
dataform.folders.getIamPolicy
dataform.folders.queryContents
dataform.locations.*
dataform.locations.get
dataform.locations.list
dataform.operations.get
dataform.repositories.commit
dataform.repositories.computeAccessTokenStatus
dataform.repositories.create
dataform.repositories.createTagBinding
dataform.repositories.deleteTagBinding
dataform.repositories.fetchHistory
dataform.repositories.fetchRemoteBranches
dataform.repositories.get
dataform.repositories.getIamPolicy
dataform.repositories.list
dataform.repositories.listEffectiveTags
dataform.repositories.listTagBindings
dataform.repositories.queryDirectoryContents
dataform.repositories.readFile
dataform.workspaces.commit
dataform.workspaces.create
dataform.workspaces.delete
dataform.workspaces.fetchFileDiff
dataform.workspaces.fetchFileGitStatuses
dataform.workspaces.fetchGitAheadBehind
dataform.workspaces.get
dataform.workspaces.getIamPolicy
dataform.workspaces.installNpmPackages
dataform.workspaces.list
dataform.workspaces.makeDirectory
dataform.workspaces.moveDirectory
dataform.workspaces.moveFile
dataform.workspaces.pull
dataform.workspaces.push
dataform.workspaces.queryDirectoryContents
dataform.workspaces.readFile
dataform.workspaces.removeDirectory
dataform.workspaces.removeFile
dataform.workspaces.reset
dataform.workspaces.searchFiles
dataform.workspaces.writeFile
resourcemanager.projects.get
resourcemanager.projects.list
Code Owner
(roles/dataform.codeOwner)
Full access to code resources.
dataform.commentThreads.*
dataform.commentThreads.create
dataform.commentThreads.delete
dataform.commentThreads.get
dataform.commentThreads.list
dataform.commentThreads.update
dataform.comments.*
dataform.comments.create
dataform.comments.delete
dataform.comments.get
dataform.comments.list
dataform.comments.update
dataform.compilationResults.*
dataform.compilationResults.create
dataform.compilationResults.get
dataform.compilationResults.list
dataform.compilationResults.query
dataform.folders.*
dataform.folders.addContents
dataform.folders.create
dataform.folders.delete
dataform.folders.deleteTree
dataform.folders.get
dataform.folders.getIamPolicy
dataform.folders.move
dataform.folders.queryContents
dataform.folders.setIamPolicy
dataform.folders.update
dataform.locations.*
dataform.locations.get
dataform.locations.list
dataform.operations.get
dataform.operations.list
dataform.repositories.commit
dataform.repositories.computeAccessTokenStatus
dataform.repositories.create
dataform.repositories.createTagBinding
dataform.repositories.delete
dataform.repositories.deleteTagBinding
dataform.repositories.fetchHistory
dataform.repositories.fetchRemoteBranches
dataform.repositories.get
dataform.repositories.getIamPolicy
dataform.repositories.list
dataform.repositories.listEffectiveTags
dataform.repositories.listTagBindings
dataform.repositories.move
dataform.repositories.queryDirectoryContents
dataform.repositories.readFile
dataform.repositories.setIamPolicy
dataform.repositories.update
dataform.workspaces.*
dataform.workspaces.commit
dataform.workspaces.create
dataform.workspaces.delete
dataform.workspaces.fetchFileDiff
dataform.workspaces.fetchFileGitStatuses
dataform.workspaces.fetchGitAheadBehind
dataform.workspaces.get
dataform.workspaces.getIamPolicy
dataform.workspaces.installNpmPackages
dataform.workspaces.list
dataform.workspaces.makeDirectory
dataform.workspaces.moveDirectory
dataform.workspaces.moveFile
dataform.workspaces.pull
dataform.workspaces.push
dataform.workspaces.queryDirectoryContents
dataform.workspaces.readFile
dataform.workspaces.removeDirectory
dataform.workspaces.removeFile
dataform.workspaces.reset
dataform.workspaces.searchFiles
dataform.workspaces.setIamPolicy
dataform.workspaces.writeFile
resourcemanager.projects.get
resourcemanager.projects.list
Code Scheduler
Beta
(roles/dataform.codeScheduler)
Access for scheduling workflows and releases.
dataform.releaseConfigs.create
dataform.workflowConfigs.create
Code Viewer
(roles/dataform.codeViewer)
Read-only access to all code resources.
dataform.compilationResults.*
dataform.compilationResults.create
dataform.compilationResults.get
dataform.compilationResults.list
dataform.compilationResults.query
dataform.folders.get
dataform.folders.getIamPolicy
dataform.folders.queryContents
dataform.locations.*
dataform.locations.get
dataform.locations.list
dataform.repositories.computeAccessTokenStatus
dataform.repositories.fetchHistory
dataform.repositories.fetchRemoteBranches
dataform.repositories.get
dataform.repositories.getIamPolicy
dataform.repositories.list
dataform.repositories.listEffectiveTags
dataform.repositories.listTagBindings
dataform.repositories.queryDirectoryContents
dataform.repositories.readFile
dataform.workspaces.fetchFileDiff
dataform.workspaces.fetchFileGitStatuses
dataform.workspaces.fetchGitAheadBehind
dataform.workspaces.get
dataform.workspaces.getIamPolicy
dataform.workspaces.list
dataform.workspaces.queryDirectoryContents
dataform.workspaces.readFile
dataform.workspaces.searchFiles
resourcemanager.projects.get
resourcemanager.projects.list
Team Folder Commenter
Beta
(roles/dataform.teamFolderCommenter)
View and comment access to a team folder and its contents.
dataform.commentThreads.*
dataform.commentThreads.create
dataform.commentThreads.delete
dataform.commentThreads.get
dataform.commentThreads.list
dataform.commentThreads.update
dataform.comments.*
dataform.comments.create
dataform.comments.delete
dataform.comments.get
dataform.comments.list
dataform.comments.update
dataform.compilationResults.*
dataform.compilationResults.create
dataform.compilationResults.get
dataform.compilationResults.list
dataform.compilationResults.query
dataform.folders.get
dataform.folders.getIamPolicy
dataform.folders.queryContents
dataform.locations.*
dataform.locations.get
dataform.locations.list
dataform.repositories.computeAccessTokenStatus
dataform.repositories.fetchHistory
dataform.repositories.fetchRemoteBranches
dataform.repositories.get
dataform.repositories.getIamPolicy
dataform.repositories.list
dataform.repositories.listEffectiveTags
dataform.repositories.listTagBindings
dataform.repositories.queryDirectoryContents
dataform.repositories.readFile
dataform.teamFolders.get
dataform.teamFolders.getIamPolicy
dataform.workspaces.fetchFileDiff
dataform.workspaces.fetchFileGitStatuses
dataform.workspaces.fetchGitAheadBehind
dataform.workspaces.get
dataform.workspaces.getIamPolicy
dataform.workspaces.list
dataform.workspaces.queryDirectoryContents
dataform.workspaces.readFile
dataform.workspaces.searchFiles
resourcemanager.projects.get
resourcemanager.projects.list
Team Folder Contributor
(roles/dataform.teamFolderContributor)
Edit access to a team folder and its contents.
dataform.commentThreads.*
dataform.commentThreads.create
dataform.commentThreads.delete
dataform.commentThreads.get
dataform.commentThreads.list
dataform.commentThreads.update
dataform.comments.*
dataform.comments.create
dataform.comments.delete
dataform.comments.get
dataform.comments.list
dataform.comments.update
dataform.compilationResults.*
dataform.compilationResults.create
dataform.compilationResults.get
dataform.compilationResults.list
dataform.compilationResults.query
dataform.folders.addContents
dataform.folders.create
dataform.folders.get
dataform.folders.getIamPolicy
dataform.folders.queryContents
dataform.locations.*
dataform.locations.get
dataform.locations.list
dataform.operations.get
dataform.repositories.commit
dataform.repositories.computeAccessTokenStatus
dataform.repositories.create
dataform.repositories.createTagBinding
dataform.repositories.deleteTagBinding
dataform.repositories.fetchHistory
dataform.repositories.fetchRemoteBranches
dataform.repositories.get
dataform.repositories.getIamPolicy
dataform.repositories.list
dataform.repositories.listEffectiveTags
dataform.repositories.listTagBindings
dataform.repositories.queryDirectoryContents
dataform.repositories.readFile
dataform.teamFolders.get
dataform.teamFolders.getIamPolicy
dataform.teamFolders.update
dataform.workspaces.commit
dataform.workspaces.create
dataform.workspaces.delete
dataform.workspaces.fetchFileDiff
dataform.workspaces.fetchFileGitStatuses
dataform.workspaces.fetchGitAheadBehind
dataform.workspaces.get
dataform.workspaces.getIamPolicy
dataform.workspaces.installNpmPackages
dataform.workspaces.list
dataform.workspaces.makeDirectory
dataform.workspaces.moveDirectory
dataform.workspaces.moveFile
dataform.workspaces.pull
dataform.workspaces.push
dataform.workspaces.queryDirectoryContents
dataform.workspaces.readFile
dataform.workspaces.removeDirectory
dataform.workspaces.removeFile
dataform.workspaces.reset
dataform.workspaces.searchFiles
dataform.workspaces.writeFile
resourcemanager.projects.get
resourcemanager.projects.list
Team Folder Creator
(roles/dataform.teamFolderCreator)
Access to create new team folders.
dataform.teamFolders.create
Team Folder Owner
(roles/dataform.teamFolderOwner)
Full access to a team folder and its contents. Can share the team folder and its contents.
dataform.commentThreads.*
dataform.commentThreads.create
dataform.commentThreads.delete
dataform.commentThreads.get
dataform.commentThreads.list
dataform.commentThreads.update
dataform.comments.*
dataform.comments.create
dataform.comments.delete
dataform.comments.get
dataform.comments.list
dataform.comments.update
dataform.compilationResults.*
dataform.compilationResults.create
dataform.compilationResults.get
dataform.compilationResults.list
dataform.compilationResults.query
dataform.folders.*
dataform.folders.addContents
dataform.folders.create
dataform.folders.delete
dataform.folders.deleteTree
dataform.folders.get
dataform.folders.getIamPolicy
dataform.folders.move
dataform.folders.queryContents
dataform.folders.setIamPolicy
dataform.folders.update
dataform.locations.*
dataform.locations.get
dataform.locations.list
dataform.operations.get
dataform.operations.list
dataform.repositories.commit
dataform.repositories.computeAccessTokenStatus
dataform.repositories.create
dataform.repositories.createTagBinding
dataform.repositories.delete
dataform.repositories.deleteTagBinding
dataform.repositories.fetchHistory
dataform.repositories.fetchRemoteBranches
dataform.repositories.get
dataform.repositories.getIamPolicy
dataform.repositories.list
dataform.repositories.listEffectiveTags
dataform.repositories.listTagBindings
dataform.repositories.move
dataform.repositories.queryDirectoryContents
dataform.repositories.readFile
dataform.repositories.setIamPolicy
dataform.repositories.update
dataform.teamFolders.delete
dataform.teamFolders.deleteTree
dataform.teamFolders.get
dataform.teamFolders.getIamPolicy
dataform.teamFolders.setIamPolicy
dataform.teamFolders.update
dataform.workspaces.*
dataform.workspaces.commit
dataform.workspaces.create
dataform.workspaces.delete
dataform.workspaces.fetchFileDiff
dataform.workspaces.fetchFileGitStatuses
dataform.workspaces.fetchGitAheadBehind
dataform.workspaces.get
dataform.workspaces.getIamPolicy
dataform.workspaces.installNpmPackages
dataform.workspaces.list
dataform.workspaces.makeDirectory
dataform.workspaces.moveDirectory
dataform.workspaces.moveFile
dataform.workspaces.pull
dataform.workspaces.push
dataform.workspaces.queryDirectoryContents
dataform.workspaces.readFile
dataform.workspaces.removeDirectory
dataform.workspaces.removeFile
dataform.workspaces.reset
dataform.workspaces.searchFiles
dataform.workspaces.setIamPolicy
dataform.workspaces.writeFile
resourcemanager.projects.get
resourcemanager.projects.list
Team Folder Viewer
(roles/dataform.teamFolderViewer)
View access to a team folder and its contents.
dataform.compilationResults.*
dataform.compilationResults.create
dataform.compilationResults.get
dataform.compilationResults.list
dataform.compilationResults.query
dataform.folders.get
dataform.folders.getIamPolicy
dataform.folders.queryContents
dataform.locations.*
dataform.locations.get
dataform.locations.list
dataform.repositories.computeAccessTokenStatus
dataform.repositories.fetchHistory
dataform.repositories.fetchRemoteBranches
dataform.repositories.get
dataform.repositories.getIamPolicy
dataform.repositories.list
dataform.repositories.listEffectiveTags
dataform.repositories.listTagBindings
dataform.repositories.queryDirectoryContents
dataform.repositories.readFile
dataform.teamFolders.get
dataform.teamFolders.getIamPolicy
dataform.workspaces.fetchFileDiff
dataform.workspaces.fetchFileGitStatuses
dataform.workspaces.fetchGitAheadBehind
dataform.workspaces.get
dataform.workspaces.getIamPolicy
dataform.workspaces.list
dataform.workspaces.queryDirectoryContents
dataform.workspaces.readFile
dataform.workspaces.searchFiles
resourcemanager.projects.get
resourcemanager.projects.list
Service agent roles
Service agent roles should only be granted to service agents.
Role
Permissions
Dataform Service Agent
(roles/dataform.serviceAgent)
Gives permission for the Dataform API to access a secret from Secret Manager
dataform.compilationResults.create
dataform.workflowInvocations.create
resourcemanager.projects.get
resourcemanager.projects.list
커스텀 Dataform 역할
커스텀 역할에는 사용자가 지정하는 모든 권한이 포함될 수 있습니다. 개발 작업공간 만들기 또는 개발 작업공간 내에서 파일 및 디렉터리 만들기 등 특정 관리 작업을 수행할 수 있는 권한이 포함된 커스텀 역할을 만들 수 있습니다. 커스텀 역할을 만들려면 커스텀 역할 만들기 및 관리를 참조하세요.
Dataform 권한의 보안 고려사항
dataform.repositories.create 권한이 있는 사용자는 커스텀 서비스 계정과 해당 서비스 계정에 부여된 모든 권한을 사용하여 BigQuery에서 코드를 실행할 수 있습니다. 여기에는 Dataform 워크플로 실행과 Knowledge Catalog에서 메타데이터를 관리하는 기능이 포함됩니다.
모든 저장소에 엄격한 '다음으로 작업' 모드가 적용되므로 dataform.repositories.create 권한을 사용하려면 사용자가 후속 워크플로 실행을 위한 맞춤 서비스 계정에 대한 '다음으로 작업' 권한을 보유해야 합니다. 이렇게 하면 명시적 가장 권한이 있는 사용자만 서비스 계정의 ID를 사용하여 코드를 실행할 수 있습니다.
dataform.repositories.create 권한은 다음 IAM 역할에 포함되어 있습니다.
사용자 또는 서비스 계정이 BigQuery에서 읽거나 쓸 수 있는 데이터를 제한하려면 선택한 BigQuery 데이터 세트 또는 테이블에 대한 세분화된 BigQuery IAM 권한을 부여하면 됩니다. 자세한 내용은 데이터 세트 액세스 제어 및 테이블 및 뷰 액세스 제어를 참조하세요.
Secret Manager 보안 비밀을 사용하여 비공개 NPM 패키지를 구성하는 경우, 코드 수정 권한이 있거나 저장소의 특정 Git 커밋에서 코드 컴파일을 트리거할 수 있는 사용자가 해당 보안 비밀에 액세스할 수 있습니다.
패키지 설치 중(작업공간에 패키지를 수동으로 설치하거나 특정 Git 커밋에서 코드를 컴파일할 때 트리거됨) NPM 클라이언트는 .npmrc 파일에서 사용자 인증 정보를 읽고 인증 토큰을 구성된 NPM 레지스트리로 전송합니다. 워크스페이스에서 .npmrc 파일을 수정할 권한이 있는 사용자는 레지스트리 요청을 외부 서버로 리디렉션하여 비밀에 액세스하도록 설정을 구성할 수 있습니다.
이 설치 및 잠재적인 토큰 노출은 다음 시나리오에서 발생할 수 있습니다.
작업공간 패키지 설치: 작업공간 내에서 수동으로 트리거됩니다.
이를 위해서는 작업공간 수정 권한이 필요하며, 이 권한은 Dataform 편집자(roles/dataform.editor) 또는 Dataform 코드 편집기(roles/dataform.codeEditor) 역할에서 확인할 수 있습니다.
Git commitish 컴파일: 저장소에서 Git 참조 (예: 브랜치 또는 태그)의 컴파일 결과를 만들 때 자동으로 트리거됩니다. 이 시나리오에는 dataform.compilationResults.create 권한이 필요합니다.
사용자 인증 정보를 보호하려면 다음을 수행하는 것이 좋습니다.
신뢰할 수 있는 사용자에게만 저장소 수정 권한 (예: Dataform 코드 편집자) 또는 컴파일 권한 (예: Dataform 코드 뷰어)이 있는 역할을 부여합니다.
조직 정책을 사용하여 Dataform이 연결할 수 있는 원격 Git 저장소를 제한합니다. 자세한 내용은 원격 저장소 제한을 참고하세요.
Dataform 서비스 에이전트의 Secret Manager 액세스를 필요한 보안 비밀로만 제한합니다.
end_user_auth_config 설정을 거부하는 맞춤 조직 정책 제약 조건을 사용하여 최종 사용자 인증 정보 사용을 허용하지 않습니다. 자세한 내용은 커스텀 조직 정책 제약 조건 만들기를 참고하세요.
allAuthenticatedUsers 주 구성원에게 저장소의 IAM 역할을 부여하여 Dataform 저장소에 대한 공개 액세스 권한을 부여할 수 있습니다.
allAuthenticatedUsers 주 구성원에게 IAM 역할을 할당하면 서비스 계정과 Google 계정으로 인증된 인터넷의 모든 사용자에게 해당 역할이 부여됩니다. 여기에는 개인 Gmail 계정과 같이 Google Workspace 계정이나 Cloud ID 도메인에 연결되지 않은 계정이 포함됩니다. 익명 방문자와 같은 인증되지 않은 사용자는 포함되지 않습니다. 자세한 내용은 모든 인증된 사용자를 참고하세요.
예를 들어 sales 저장소의 allAuthenticatedUsers에 Dataform 뷰어 역할을 부여하면 Google 계정으로 인증된 모든 서비스 계정 및 인터넷 사용자는 모든 sales 코드 리소스에 대해 읽기 전용 액세스 권한만 갖습니다.
iam.allowedPolicyMemberDomains 정책에서 allAuthenticatedUsers를 제한하면 프로젝트의 모든 IAM 정책에서 allAuthenticatedUsers 주 구성원을 사용할 수 없으므로 Dataform 저장소를 비롯한 모든 리소스에 대한 공개 액세스 권한이 부여되지 않습니다.
iam.allowedPolicyMemberDomains 정책 및 설정 방법에 관한 자세한 내용은 도메인별 ID 제한을 참고하세요.
Dataform의 직원 ID 제휴
직원 ID 제휴를 사용하면 외부 ID 공급업체 (IdP)를 통해 IAM으로 사용자를 인증 및 승인하여 Google Cloud 서비스에 액세스할 수 있습니다.
Dataform은 알려진 제한사항 없이 직원 ID 제휴를 지원합니다.
IAM으로 개별 테이블에 대한 액세스 제어
이 섹션에서는 개별 Dataform 테이블과 뷰에 대한 BigQuery IAM 역할을 부여하고 취소하는 방법을 보여줍니다.
Dataform은 테이블이나 뷰를 실행할 때 BigQuery에서 리소스를 만듭니다. Dataform에서 개발하는 동안 개별 테이블과 뷰에 BigQuery 역할을 부여하여 실행 후 BigQuery에서 액세스를 제어할 수 있습니다.
projects.locations.repositories 리소스에서 setAuthenticatedUserAdmin 필드를 true로 설정하면 Dataform은 저장소를 만드는 사용자에게 해당 저장소에 대한 Dataform 관리자 역할(roles/dataform.admin)을 자동으로 부여합니다. 또한 Dataform은 해당 저장소에서 작업공간을 만드는 모든 사용자에게 새 작업공간에 대한 Dataform 관리자 역할을 부여합니다.
projects.locations.updateConfig 메서드의 creator_role 필드(미리보기)를 사용하여 이 동작을 재정의할 수 있습니다. setAuthenticatedUserAdmin이 true이고 creator_role 필드를 맞춤 역할로 구성하면 Dataform에서 기본 dataform.admin 역할 대신 맞춤 역할을 부여합니다.