Identity and Access Management (IAM) 거부 정책을 태그와 함께 사용하여 Developer Connect 연결의 Git 저장소 링크에 대한 특정 작업을 차단할 수 있습니다.
연결에 태그를 연결한 다음 해당 태그와 일치하는 조건이 있는 거부 정책을 만듭니다. 연결의 모든 Git 저장소 링크는 태그를 상속하므로 거부 정책은 해당 연결을 통해 연결된 모든 저장소에 적용됩니다.
태그 및 거부 정책을 사용해야 하는 경우
IAM 허용 정책은 권한을 부여합니다. 거부 정책을 사용하면 주 구성원이 가진 역할에 관계없이 허용 정책보다 우선 적용되는 가드레일을 설정할 수 있습니다. 거부 정책을 태그와 결합하면 프로젝트의 모든 연결이 아닌 선택한 연결에 이러한 가드레일을 적용할 수 있습니다.
예를 들어 이 접근 방식을 사용하여 다음을 수행할 수 있습니다.
- AI 에이전트 또는 자동화 서비스 계정이 Developer Connect를 통해 커밋 및 pull 요청을 읽을 수 있도록 허용하지만 프로덕션 저장소에서 pull 요청을 열거나 수정하거나 댓글을 달지 못하도록 합니다.
- 민감한 저장소에 연결되는 연결에서 주 구성원 그룹의 모든 저장소 작업을 차단하면서 동일한 프로젝트의 다른 연결에 대한 액세스 권한은 유지합니다.
- 조직 수준에서 태그와 거부 정책을 만들어 여러 프로젝트에 일관된 제한사항 집합을 적용합니다.
태그가 Git 저장소 링크에 적용되는 방식
Developer Connect에서는 연결에 태그를 연결할 수 있지만 Git 저장소 링크에 직접 연결할 수는 없습니다.
Git 저장소 링크는 연결의 하위 리소스입니다. IAM이 Git 저장소 링크의 작업에 대한 거부 정책을 평가할 때 링크의 유효 태그에 대해 조건이 평가됩니다. 유효 태그에는 상위 연결에 연결된 태그와 연결의 프로젝트, 폴더, 조직에서 상속된 태그가 포함됩니다.
Git 저장소 링크는 연결에서 태그를 상속하므로 이 문서의 제어는 연결별로 적용됩니다. 저장소마다 다른 제어가 필요한 경우 다른 연결을 통해 해당 저장소를 연결한 다음 각 연결에 개별적으로 태그를 지정합니다.
시작하기 전에
- 하나 이상의 연결된 Git 저장소가 있는 Developer Connect 연결이 있는지 확인합니다.
- 조직 ID와 연결이 포함된 프로젝트의 프로젝트 번호를 알고 있어야 합니다.
- 이 문서의 명령줄 예시를 사용하려면 Google Cloud CLI를 설치하고 구성합니다.
필요한 역할
태그를 만들고, 연결에 태그를 연결하고, 거부 정책을 만드는 데 필요한 권한을 얻으려면 관리자에게 조직에 대한 다음 IAM 역할을 부여해 달라고 요청하세요.
-
태그 키 및 태그 값 만들기 및 관리: 태그 관리자 (
roles/resourcemanager.tagAdmin) -
연결에 태그 값 연결: 태그 값에 대한 태그 사용자 (
roles/resourcemanager.tagUser) 및 연결에 대한 Developer Connect 관리자 (roles/developerconnect.admin) -
거부 정책을 만들고 업데이트하고 삭제하려는 경우: 거부 관리자 (
roles/iam.denyAdmin)
역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.
커스텀 역할이나 다른 사전 정의된 역할을 통해 필요한 권한을 얻을 수도 있습니다.
거부할 수 있는 권한
Git 저장소 링크에 대한 다음 권한을 거부할 수 있습니다. 거부 정책에서 developerconnect.googleapis.com/gitRepositoryLinks.PERMISSION 형식을 사용합니다.
저장소 데이터 읽기
| 권한 | 주 구성원이 |
|---|---|
developerconnect.googleapis.com/gitRepositoryLinks.fetchCommit |
커밋을 가져옵니다. |
developerconnect.googleapis.com/gitRepositoryLinks.fetchCommitList |
커밋을 나열합니다. |
developerconnect.googleapis.com/gitRepositoryLinks.diffCommit |
커밋 간의 차이를 가져옵니다. |
developerconnect.googleapis.com/gitRepositoryLinks.fetchFileBlame |
파일의 blame 정보를 가져옵니다. |
developerconnect.googleapis.com/gitRepositoryLinks.fetchPullRequest |
pull 요청을 가져옵니다. |
developerconnect.googleapis.com/gitRepositoryLinks.fetchPullRequestList |
pull 요청을 나열합니다. |
developerconnect.googleapis.com/gitRepositoryLinks.fetchGitRefs |
브랜치 및 태그를 나열합니다. |
저장소 데이터 변경
| 권한 | 주 구성원이 |
|---|---|
developerconnect.googleapis.com/gitRepositoryLinks.openPullRequest |
pull 요청을 엽니다. |
developerconnect.googleapis.com/gitRepositoryLinks.modifyPullRequest |
pull 요청(예: 제목, 설명, 상태)을 수정합니다. |
developerconnect.googleapis.com/gitRepositoryLinks.addPullRequestComment |
pull 요청에 댓글을 추가합니다. |
developerconnect.googleapis.com/gitRepositoryLinks.addPullRequestReviewComment |
pull 요청에 리뷰 댓글을 추가합니다. |
액세스 토큰 및 Git 프록시
| 권한 | 주 구성원이 |
|---|---|
developerconnect.googleapis.com/gitRepositoryLinks.fetchReadToken |
저장소의 읽기 전용 액세스 토큰을 가져옵니다. |
developerconnect.googleapis.com/gitRepositoryLinks.fetchReadWriteToken |
저장소의 읽기-쓰기 액세스 토큰을 가져옵니다. |
developerconnect.googleapis.com/gitRepositoryLinks.gitProxyRead |
Developer Connect 프록시를 통해 저장소에서 읽습니다. |
developerconnect.googleapis.com/gitRepositoryLinks.gitProxyWrite |
Developer Connect 프록시를 통해 저장소에 씁니다. |
거부 정책에서 지원하는 전체 권한 목록은 거부 정책에서 지원되는 권한을 참조하세요.
태그를 만들고 연결에 연결
이 예시에서는 read-only라는 태그 값이 있는 scm-agent-access라는 태그 키를 만든 다음 태그 값을 연결에 연결합니다.
태그 키를 만듭니다. 다음 명령어는 조직에 태그 키를 만들어 모든 프로젝트의 연결에서 사용할 수 있도록 합니다.
gcloud resource-manager tags keys create scm-agent-access \ --parent=organizations/ORGANIZATION_ID \ --description="Controls agent access to Developer Connect repositories"
ORGANIZATION_ID를 조직 ID로 바꿉니다.
--parent를projects/PROJECT_ID로 설정하여 프로젝트에서 태그 키를 만들 수도 있습니다. 프로젝트 수준 태그 키는 해당 프로젝트의 리소스에만 연결할 수 있습니다.태그 값을 만듭니다.
gcloud resource-manager tags values create read-only \ --parent=ORGANIZATION_ID/scm-agent-access
연결에 태그 값을 연결합니다.
gcloud resource-manager tags bindings create \ --tag-value=ORGANIZATION_ID/scm-agent-access/read-only \ --parent=//developerconnect.googleapis.com/projects/PROJECT_NUMBER/locations/LOCATION/connections/CONNECTION_ID \ --location=LOCATION
다음을 바꿉니다.
- PROJECT_NUMBER: 연결이 포함된 프로젝트의 프로젝트 번호입니다.
- LOCATION: 연결의 리전(예:
us-central1) - CONNECTION_ID: 연결의 ID
태그가 연결에 연결되어 있는지 확인합니다.
gcloud resource-manager tags bindings list \ --parent=//developerconnect.googleapis.com/projects/PROJECT_NUMBER/locations/LOCATION/connections/CONNECTION_ID \ --location=LOCATION
태그 만들기 및 연결에 대한 자세한 내용은 태그 만들기 및 관리를 참조하세요.
거부 정책 만들기
다음 거부 정책은 연결에 scm-agent-access 태그가 read-only로 설정된 Git 저장소 링크에서 서비스 계정이 pull 요청을 열거나 수정하거나 댓글을 달지 못하도록 하고, 읽기-쓰기 토큰을 가져오거나 Developer Connect 프록시를 통해 쓰지 못하도록 합니다. 허용 정책에서 서비스 계정에 해당 권한을 부여하는 경우 서비스 계정은 여전히 커밋 및 pull 요청을 읽을 수 있습니다.
다음 콘텐츠로
policy.json이라는 파일을 만듭니다.{ "displayName": "Read-only Developer Connect access for agents", "rules": [ { "denyRule": { "deniedPrincipals": [ "principal://iam.googleapis.com/projects/-/serviceAccounts/SERVICE_ACCOUNT_EMAIL" ], "deniedPermissions": [ "developerconnect.googleapis.com/gitRepositoryLinks.openPullRequest", "developerconnect.googleapis.com/gitRepositoryLinks.modifyPullRequest", "developerconnect.googleapis.com/gitRepositoryLinks.addPullRequestComment", "developerconnect.googleapis.com/gitRepositoryLinks.addPullRequestReviewComment", "developerconnect.googleapis.com/gitRepositoryLinks.fetchReadWriteToken", "developerconnect.googleapis.com/gitRepositoryLinks.gitProxyWrite" ], "denialCondition": { "title": "Connection is tagged scm-agent-access=read-only", "expression": "resource.matchTag('ORGANIZATION_ID/scm-agent-access', 'read-only')" } } } ] }
SERVICE_ACCOUNT_EMAIL를 제한하려는 서비스 계정의 이메일 주소로 바꿉니다. 사용자 또는 그룹과 같은 다른 유형의 주 구성원을 제한하려면 주 구성원 식별자를 참조하세요.
거부 정책을 만들고 조직에 연결합니다.
gcloud iam policies create scm-agent-read-only \ --attachment-point=cloudresourcemanager.googleapis.com/organizations/ORGANIZATION_ID \ --kind=denypolicies \ --policy-file=policy.json
거부 정책을 폴더 또는 프로젝트에 연결할 수도 있습니다. 거부 정책은 연결 지점 아래의 모든 리소스에 적용됩니다.
거부 정책 만들기에 대한 자세한 내용은 리소스에 대한 액세스 거부를 참조하세요.
거부 정책 확인
태그 및 거부 정책의 변경사항은 eventual consistency를 갖습니다. 새 태그 바인딩 또는 거부 정책이 적용되는 데 몇 분 정도 걸릴 수 있습니다. 자세한 내용은 태그 변경의 영향 및 액세스 변경 전파를 참조하세요.
변경사항이 전파된 후 태그가 지정된 연결의 Git 저장소 링크에 대해 거부된 권한을 거부된 주 구성원이 요청하면 HTTP 403 PERMISSION_DENIED 오류와 함께 실패합니다. 오류 메시지에는 권한 및 Git 저장소 링크가 표시되고 IAM 거부 정책에 의해 액세스가 거부되었다고 표시됩니다. 예를 들면 다음과 같습니다.
Permission 'developerconnect.gitRepositoryLinks.openPullRequest' denied on resource '//developerconnect.googleapis.com/projects/my-project/locations/us-central1/connections/my-connection/gitRepositoryLinks/my-repo' due to an IAM deny policy.
정책에서 거부하지 않는 권한 요청과 태그가 없는 연결의 Git 저장소 링크 요청은 거부 정책의 영향을 받지 않습니다.
거부 정책이 주 구성원 및 Git 저장소 링크에 적용되는지 확인하려면 정책 문제 해결 도구를 사용합니다.
gcloud policy-intelligence troubleshoot-policy iam \ //developerconnect.googleapis.com/projects/PROJECT_ID/locations/LOCATION/connections/CONNECTION_ID/gitRepositoryLinks/GIT_REPOSITORY_LINK_ID \ --principal-email=SERVICE_ACCOUNT_EMAIL \ --permission=developerconnect.googleapis.com/gitRepositoryLinks.openPullRequest
제한 삭제
단일 연결에서 제한을 삭제하려면 연결에서 태그 바인딩을 삭제합니다.
gcloud resource-manager tags bindings delete \ --tag-value=ORGANIZATION_ID/scm-agent-access/read-only \ --parent=//developerconnect.googleapis.com/projects/PROJECT_NUMBER/locations/LOCATION/connections/CONNECTION_ID \ --location=LOCATION
모든 연결에서 제한을 삭제하려면 거부 정책을 삭제합니다.
gcloud iam policies delete scm-agent-read-only \ --attachment-point=cloudresourcemanager.googleapis.com/organizations/ORGANIZATION_ID \ --kind=denypolicies
제한사항
- 태그는 연결별로 연결됩니다. 연결에는 태그를 연결할 수 있지만 Git 저장소 링크에는 연결할 수 없습니다. 연결의 모든 Git 저장소 링크는 연결의 태그를 공유합니다.
- 거부 조건은 태그만 지원합니다. 거부 규칙의 조건은
resource.matchTag()및resource.hasTagKey()와 같은 태그 함수만 사용할 수 있습니다. 저장소 이름 또는 기타 리소스 속성을 기반으로 거부 조건을 작성할 수 없습니다. 자세한 내용은 거부 조건을 참조하세요. - 태그 키는 네임스페이스화되어야 합니다.
resource.matchTag()에서 태그 키를 닉네임이 아닌 네임스페이스화된 이름(예:ORGANIZATION_ID/scm-agent-access또는PROJECT_ID/scm-agent-access)으로 식별합니다. - 변경사항이 전파되는 데 시간이 걸립니다. 새 태그 바인딩, 변경된 태그 값, 거부 정책은 즉시 적용되지 않으며 태그를 삭제해도 액세스 권한이 즉시 복원되지 않습니다. 각 변경사항이 적용되는 데 몇 분 정도 걸릴 수 있으므로 구성을 사용하기 전에 테스트하세요.
- 유효 태그가 연결에 나열됩니다. Git 저장소 링크에 적용되는 태그를 보려면 상위 연결의 유효 태그를 나열합니다.
다음 단계
- 거부 정책 자세히 알아보기
- 태그 및 조건부 액세스 자세히 알아보기
- Developer Connect 역할 및 권한에 대해 알아보기