Google Cloud CLI에서 보안 침해된 OAuth 토큰 완화를 위한 권장사항

Last reviewed 2024-02-15 UTC

이 문서에서는 gcloud CLI에서 사용되는 OAuth 토큰의 보안을 침해하는 공격자의 영향을 완화하는 방법을 설명합니다.

공격자는 합법적인 사용자 계정 또는 서비스 계정이 이미 gcloud CLI로 인증된 엔드포인트에 액세스할 수 있는 경우 이러한 OAuth 토큰을 손상시킬 수 있습니다. 그런 다음 공격자는 이러한 토큰을 자신이 제어하는 다른 엔드포인트에 복사하여 합법적인 토큰을 가장하는 요청을 수행할 수 있습니다. 보안 침해된 엔드포인트에 대한 공격자의 액세스 권한을 삭제한 후에도 공격자가 복사된 토큰을 사용하여 인증된 API 요청을 계속 수행할 수 있습니다. 이 위험을 완화하기 위해 단기 컨텍스트 인식 사용자 인증 정보를 사용하여 시스템에 대한 액세스를 제어할 수 있습니다.

이 문서는 불법적인 액세스로부터 클라우드 리소스를 보호해야 하는 보안팀 또는 클라우드 설계자를 대상으로 합니다. 이 문서에서는 보안 침해된 gcloud CLI OAuth 토큰의 영향을 사전에 줄이고 엔드포인트의 보안이 침해된 후 환경을 해결하기 위해 사용할 수 있는 제어 기능을 소개합니다.

개요

이 위협의 작동 방식을 이해하려면 gcloud CLI가 OAuth 2.0 사용자 인증 정보를 저장하는 방법과 공격자가 보안을 침해할 경우 이러한 사용자 인증 정보가 어떻게 악용될 수 있는지 이해해야 합니다.

gcloud CLI에서 저장한 사용자 인증 정보 유형

gcloud CLI는 OAuth 2.0 액세스 토큰을 사용하여 Google Cloud API에 대한 요청을 인증합니다. OAuth 흐름은 사용된 사용자 인증 정보 유형에 따라 다르지만 일반적으로 액세스 토큰 및 기타 사용자 인증 정보는 로컬에서 액세스할 수 있습니다. 두 경우 모두 액세스 토큰은 60분 후에 만료되지만 다른 사용자 인증 정보 유형은 영구적일 수 있습니다.

사용자 계정으로 gcloud CLI를 승인하면 gcloud CLI가 사용자 대신 Google Cloud API에 액세스하는 3-legged OAuth 동의 흐름을 시작합니다. 사용자가 동의 흐름을 완료하면 gcloud CLI가 새로운 액세스 토큰을 요청할 수 있게 해주는 액세스 토큰과 갱신 토큰을 수신합니다. 기본 설정에서 장기 갱신 토큰은 만료 조건이 충족될 때까지 유지됩니다.

서비스 계정으로 gcloud CLI를 승인하면 gcloud CLI가 2-legged OAuth 흐름을 시작하여 Google Cloud API를 서비스 계정 ID로 액세스합니다. 비공개 키 파일에서 서비스 계정을 활성화하면 이 키는 주기적으로 액세스 토큰을 요청하는 데 사용됩니다. 장기 비공개 키는 gcloud CLI 구성에 저장되며 서비스 계정 키를 삭제할 때까지 유효합니다.

Compute Engine 또는 Cloud Shell과 같은 Google Cloud 환경에서 gcloud CLI를 실행하면 애플리케이션이 자동으로 사용자 인증 정보를 찾고 서비스 계정으로 인증할 수 있습니다. 예를 들어 Compute Engine에서 gcloud CLI와 같은 애플리케이션은 메타데이터 서버에 액세스 토큰을 쿼리할 수 있습니다. Google에서는 액세스 토큰을 만드는 데 사용되는 비공개 서명 키를 관리 및 순환하고, 장기 사용자 인증 정보는 애플리케이션에 노출되지 않습니다.

워크로드 아이덴티티 제휴로 인증하면 애플리케이션이 외부 ID 공급업체의 사용자 인증 정보를 기반으로 인증하고 제휴 단기 액세스 토큰을 수신합니다. 외부 ID 공급업체에서 사용하는 장기 사용자 인증 정보를 저장 및 관리하는 방법에 대한 자세한 내용은 워크로드 아이덴티티 제휴 사용 시 권장사항을 참조하세요.

공격자가 보안 침해된 OAuth 토큰을 사용하는 방법

공격자가 엔드포인트의 보안을 침해할 경우 OAuth 토큰과 같은 사용자 인증 정보는 공격자가 액세스를 유지하거나 에스컬레이션할 수 있으므로 중요한 대상입니다.

개발자는 코드를 작성하고 디버깅할 때 자신의 사용자 인증 정보를 확인해야 하는 적법한 필요가 있을 수 있습니다. 예를 들어 개발자는 지원되지 않는 클라이언트 라이브러리를 사용할 때 Google Cloud 서비스에 대한 REST 요청 사용을 인증해야 할 수 있습니다. 개발자는 다음을 포함한 다양한 방법으로 사용자 인증 정보를 볼 수 있습니다.

하지만 공격자가 엔드포인트의 보안을 침해한 후에도 이와 동일한 기법을 사용할 수 있습니다.

공격자가 개발자 워크스테이션과 같은 엔드포인트의 보안을 침해하는 경우 주된 위협은 공격자가 인증된 ID의 적법한 사용자 인증 정보로 gcloud CLI 명령어 또는 기타 코드를 실행할 수 있다는 것입니다. 또한 공격자는 OAuth 토큰을 자신이 제어하는 다른 엔드포인트에 복사하여 액세스 권한을 유지할 수 있습니다. 이 사용자 인증 정보 도난이 발생하면 보안 침해된 엔드포인트에 대한 액세스 권한을 삭제한 후에도 공격자가 장기 OAuth 토큰을 계속 사용할 수 있는 보조 위협이 있습니다.

공격자가 OAuth 토큰의 보안을 침해할 경우 다음과 같은 상황이 일어날 수 있습니다.

  • 공격자가 도용된 사용자 또는 서비스 계정을 가장할 수 있습니다. 보안 침해된 토큰을 사용하는 API 트래픽은 도용된 사용자 또는 서비스 계정에서 온 것처럼 로깅되므로 로그에서 일반 활동 및 악의적인 활동을 구별하기가 어렵습니다.
  • 공격자는 사용자와 연결된 영구 갱신 토큰 또는 서비스 계정과 연결된 비공개 키를 사용하여 액세스 토큰을 무기한 새로고침할 수 있습니다.
  • 토큰은 로그인 과정 후에 부여되므로 공격자는 사용자의 비밀번호 또는 2단계 인증을 통한 인증을 우회할 수 있습니다.

위험 완화를 위한 권장사항

다음 섹션에 설명된 제어를 구현하면 손상된 gcloud CLI 토큰 위험을 완화할 수 있습니다. 엔터프라이즈 기반 청사진 또는 Google Cloud의 시작 영역 설계에 설명된 보안 권장사항을 따르는 경우 의 경우 이러한 제어가 이미 설정되어 있을 수 있습니다.

Google Cloud 서비스의 세션 길이 설정하기

공격자가 보안 침해된 토큰을 악용할 수 있는 기간을 줄이려면 Google Cloud 서비스의 세션 길이를 설정하세요. 기본적으로 시스템이 인증 후 부여하는 갱신 토큰은 장기 사용자 인증 정보이며 gcloud CLI 세션에는 재인증이 필요하지 않습니다. 이 설정을 변경하여 세션 길이가 1~24시간인 재인증 정책을 구성합니다. 정의된 세션 기간이 지나면 재인증 정책은 갱신 토큰을 무효화하고 사용자가 비밀번호나 보안 키를 사용하여 gcloud CLI를 정기적으로 다시 인증하도록 합니다.

Google Cloud 서비스의 세션 길이는 Google 서비스의 세션 길이와는 별도로 설정되어 있으며, Google Workspace 서비스 간의 로그인을 위해 웹 세션을 제어하지만 Google Cloud의 재인증을 제어하지 않습니다. Google Workspace 서비스를 사용하는 경우 모두의 세션 길이를 설정합니다.

VPC 서비스 제어를 구성합니다.

정의된 경계 내에서 발생한 Google Cloud API 트래픽만 지원되는 리소스에 액세스할 수 있도록 환경 전반의 VPC 서비스 제어를 구성합니다. 경계는 환경 외부에 있는 공격자 제어 엔드포인트에서 시작된 제한된 서비스에 대한 요청을 차단하므로 서비스 경계는 보안 침해된 사용자 인증 정보의 유용성을 제한합니다.

BeyondCorp Enterprise 구성

Google Cloud 콘솔 및 Google Cloud API를 보호하는 데 도움이 되도록 BeyondCorp Enterprise 정책을 구성합니다. IP 기반 액세스 또는 상호 TLS용 인증서 기반 액세스를 포함하여 모든 API 요청에서 평가되는 속성을 선택적으로 허용하도록 BeyondCorp Enterprise 액세스 수준 및 바인딩을 구성합니다. 손상된 승인 사용자 인증 정보를 사용하지만 BeyondCorp Enterprise 정책에 정의된 조건을 충족하지 않는 요청은 거부됩니다.

BeyondCorp Enterprise는 정의된 조건을 충족하지 않는 사용자 API 트래픽을 거부하는 사용자 중심 제어입니다. VPC 서비스 제어는 리소스가 통신할 수 있는 경계를 정의하는 리소스 중심 제어입니다. VPC 서비스 제어는 모든 사용자 ID와 서비스 계정 ID에 적용되지만 BeyondCorp Enterprise는 조직 내의 사용자 ID에만 적용됩니다. BeyondCorp Enterprise 및 VPC 서비스 제어를 함께 사용하면 환경 외부에 있는 공격자 제어 머신의 보안 침해된 사용자 인증 정보로 인한 영향을 줄일 수 있습니다.

원격 서버 액세스를 위한 2단계 인증 시행

개발자가 SSH를 통해 Compute Engine 리소스에 액세스하도록 허용하려면 2단계 인증으로 OS 로그인을 구성합니다. 이렇게 하면 사용자가 비밀번호 또는 보안 키로 다시 인증해야 하는 추가 체크포인트가 시행됩니다. 보안 침해된 OAuth 토큰을 가졌지만 비밀번호 또는 보안 키가 없는 공격자는 이 기능으로 차단됩니다.

Compute Engine의 Windows 인스턴스에 대한 원격 데스크톱 프로토콜(RDP) 액세스는 OS 로그인 서비스를 지원하지 않으므로 RDP 세션에 2단계 인증을 세밀하게 적용할 수 없습니다. IAP 데스크톱 또는 Google Chrome 기반 RDP 플러그인을 사용할 때 Google 서비스의 세션 길이와 같은 대략적인 제어와 사용자의 웹 세션에 2단계 인증 설정을 사용하고 2단계 인증에서 사용자가 기기를 신뢰하도록 허용 설정을 사용 중지합니다.

서비스 계정 키 사용 제한

서비스 계정 키를 사용하여 인증하면 다운로드한 키 파일과 별도로 gcloud CLI 구성 파일에 키 값이 저장됩니다. 환경에 액세스할 수 있는 공격자는 gcloud CLI 구성에서 키를 복사하거나 로컬 파일 시스템 또는 내부 코드 저장소에서 키 파일을 복사할 수 있습니다. 따라서 보안 침해된 액세스 토큰을 완화하는 계획 외에도 다운로드한 서비스 계정 키 파일을 관리하는 방법을 고려하세요.

보다 안전한 인증 대안을 검토하여 서비스 계정 키를 사용하는 사용 사례를 줄이거나 없애고 조직 정책 제약조건 iam.disableServiceAccountKeyCreation을 적용하여 서비스 계정 키 생성을 중지합니다.

최소 권한의 원칙 고려

IAM 정책을 설계할 때는 최소 권한을 고려하세요. 가장 작은 범위에서 작업을 수행하는 데 필요한 역할을 사용자에게 부여합니다. 필요하지 않은 역할을 부여하지 마세요. 역할 권장사항을 검토하고 적용하여 환경에서 사용되지 않는 과도한 역할이 포함된 IAM 정책을 방지합니다.

엔드포인트 보호

공격자가 개발자 워크스테이션 또는 Compute Engine 인스턴스와 같은 엔드포인트에 물리적으로 액세스하거나 원격으로 액세스할 수 있는 방법을 고려합니다. 보안 침해된 OAuth 토큰의 위협을 해결하기 위한 계획도 중요하지만 공격자가 신뢰할 수 있는 엔드포인트의 보안을 침해할 수 있는 위협을 애초에 대응하는 방법도 고려하세요. 공격자가 신뢰할 수 있는 엔드포인트에 액세스할 수 있는 경우 엔드포인트 자체에서 직접 gcloud CLI 명령어 또는 기타 코드를 실행할 수 있습니다.

개발자 워크스테이션에 대한 포괄적인 보호는 이 문서에서 다루지 않지만 보안 도구와 작업이 보안 침해로부터 엔드포인트 보호를 보장하고 모니터링하는 데 어떤 도움이 되는지 평가하세요. 다음 질문을 고려하세요.

  • 개발자 워크스테이션의 물리적 보안은 어떻게 보호되나요?
  • 네트워크 침해를 어떻게 식별하고 대응하나요?
  • 사용자가 SSH 또는 RDP 세션에 원격으로 액세스하도록 하려면 어떻게 해야 하나요?
  • SSH 키 또는 서비스 계정 키와 같은 다른 영구 사용자 인증 정보는 어떻게 보안 침해될 수 있나요?
  • 단기 사용자 인증 정보로 바꿀 수 있는 영구 사용자 인증 정보를 사용하는 워크플로가 있나요?
  • 누군가 다른 사용자의 캐시된 gcloud CLI 사용자 인증 정보를 읽을 수 있는 공유 기기가 있나요?
  • 사용자가 신뢰할 수 없는 기기에서 gcloud CLI로 인증할 수 있나요?
  • 승인된 트래픽이 VPC 서비스 제어 경계 내부의 리소스에 어떻게 연결되나요?

보안 운영에서 이러한 각 질문을 처리하는지 확인합니다.

대응팀 정비

이슈 대응을 담당하는 보안팀이 Google Cloud Console 및 관리 콘솔 전체에 적절한 액세스 권한을 가지는지 확인합니다. 별도의 팀이 Google Cloud Console과 관리 콘솔을 관리하는 경우 이슈 중에 응답이 지연될 수 있습니다.

보안 침해된 사용자 계정에서 액세스 권한을 삭제하려면 이슈 대응팀에 사용자 관리 관리자와 같은 관리 콘솔 역할이 필요합니다. Google Cloud 리소스에서 의심스러운 활동이 발생했는지 평가하려면 이 팀에는 모든 프로젝트의 보안 검토자 또는 중앙 집중식 로그 싱크의 로그 뷰어와 같은 IAM 역할이 필요할 수도 있습니다. 보안팀에 필요한 역할은 환경의 설계 및 운영에 따라 다릅니다.

보안 이슈 이후 해결 조치 권장사항

엔드포인트의 보안이 침해된 경우, 이슈 관리 계획의 일부로 보안 침해된 엔드포인트의 주요 위협에 대응하는 방법과 보안 침해된 토큰의 2차 위협으로 인해 진행 중인 잠재적 손상을 완화하는 방법을 알아봅니다. 공격자가 개발자 워크스테이션에 영구적으로 액세스할 수 있는 경우 공격자는 적법한 사용자가 다시 인증한 후에 토큰을 다시 복사할 수 있습니다. gcloud CLI 토큰이 보안 침해되었다고 의심되는 경우 Cloud Customer Care를 통해 티켓을 열고 다음 섹션의 권장사항을 완료하세요. 이러한 작업은 Google Cloud 조직에서 이와 같은 이벤트의 영향을 제한하는 데 도움이 될 수 있습니다.

이 섹션의 권장사항은 보안 침해된 Google Cloud 사용자 인증 정보 처리의 일반적인 안내와 유사하지만 보안 침해된 엔드포인트에서 복사된 gcloud CLI 토큰의 위협에 중점을 둡니다.

Google Cloud 세션 제어가 있는 모든 사용자 계정의 활성 토큰 만료

아직 Google Cloud 세션 제어를 적용하지 않은 경우 짧은 재인증 빈도로 사용 설정합니다. 이 제어는 모든 갱신 토큰이 정의한 기간이 끝날 때 만료되도록 하여 공격자가 보안 침해된 토큰을 사용할 수 있는 기간을 제한합니다.

보안 침해된 사용자 계정의 토큰 수동 무효화

보안 침해되었을 수 있는 사용자 ID의 보안 침해된 사용자 인증 정보 처리에 대한 안내를 검토하세요. 특히 gcloud CLI 사용자 인증 정보를 삭제하는 것은 보안팀이 사용자 ID의 손상된 OAuth 토큰을 해결하는 가장 효과적인 방법입니다. gcloud CLI의 갱신 토큰과 액세스 토큰을 즉시 무효화하고 사용자가 비밀번호나 보안 키로 재인증하도록 강제하려면 사용자의 연결된 애플리케이션 목록에서 gcloud CLI를 삭제하세요.

개별 사용자는 자신의 개인 계정에서 gcloud CLI 사용자 인증 정보를 삭제할 수도 있습니다.

사용자 정지, 사용자 비밀번호 재설정, 로그인 쿠키 재설정 등의 다른 방법은 보안 침해된 OAuth 토큰의 위협을 구체적으로 해결하지 않습니다. 이러한 방법은 일반적으로 이슈 대응에 유용하지만 공격자가 이미 제어하는 액세스 토큰을 무효화하지는 않습니다. 예를 들어 조사 중에 사용자를 정지하도록 선택했지만 gcloud CLI 토큰을 취소하지 않은 경우, 액세스 토큰이 만료되기 전에 정지된 사용자가 복원되면 액세스 토큰이 여전히 유효할 수 있습니다.

많은 사용자 계정의 토큰을 프로그래매틱 방식으로 무효화

위반이 의심되지만 영향을 받은 사용자를 식별할 수 없는 경우 재인증 정책에서 허용하는 것보다 더 빠르게 조직 내 모든 사용자의 활성 세션을 취소하는 것이 좋습니다.

이러한 접근 방식은 정상적인 사용자에게 지장을 줄 수 있고 사용자 인증 정보를 사용하는 장기 실행 프로세스를 종료할 수 있습니다. 이 접근 방식을 채택한 경우 보안 운영 센터(SOC)에 맞게 스크립트화된 솔루션을 준비해서 미리 실행하고 일부 사용자에게 테스트하세요.

다음 샘플 코드는 Workspace Admin SDK를 사용하여 gcloud CLI에 액세스할 수 있는 Google Workspace 또는 Cloud ID 계정의 모든 사용자 ID를 식별합니다. 사용자가 gcloud CLI를 승인한 경우 스크립트는 갱신 토큰 및 액세스 토큰을 취소하고 비밀번호 또는 보안 키로 재인증하도록 합니다. Admin SDK API를 사용 설정하고 이 코드를 실행하는 방법에 대한 자세한 내용은 Google Apps Script 빠른 시작을 참조하세요.

/**
 * Remove access to the Google Cloud CLI for all users in an organization
 * @see https://developers.google.com/admin-sdk/directory/reference/rest/v1/tokens
 * @see https://developers.google.com/admin-sdk/directory/reference/rest/v1/users
 * @see https://developers.google.com/apps-script/guides/services/advanced#enabling_advanced_services
 */

function listUsersAndInvalidate() {
  const users = AdminDirectory.Users.list({
    customer: 'my_customer' // alias to represent your account's customerId
    }).users;
  if (!users || users.length === 0) {
    Logger.log('No users found.');
    return;
  }
  for (const user of users){
    let tokens = AdminDirectory.Tokens.list(user.primaryEmail).items
    if (!tokens || tokens.length === 0) {
      continue;
    }
    for (const token of tokens) {
      if (token.clientId === "32555940559.apps.googleusercontent.com") {
        AdminDirectory.Tokens.remove(user.primaryEmail, token.clientId)
        Logger.log('Invalidated the tokens granted to gcloud for user %s', user.primaryEmail)
      }
    }
  }
}

서비스 계정의 사용자 인증 정보 무효화 및 순환

사용자 ID에 부여된 액세스 토큰과 달리 서비스 계정에 부여된 액세스 토큰은 관리 콘솔 또는 gcloud auth revoke와 같은 명령어를 통해 무효화할 수 없습니다. 또한 Google Cloud 세션 제어에서 지정한 세션 시간은 Cloud ID 또는 Google Workspace 디렉터리의 사용자 계정에 적용되지만 서비스 계정에는 적용되지 않습니다. 따라서 보안 침해된 서비스 계정에 대한 이슈 대응은 영구 키 파일 및 단기 액세스 토큰을 모두 해결해야 합니다.

서비스 계정의 사용자 인증 정보의 보안이 침해된 것으로 의심되는 경우 서비스 계정을 사용 중지하고 서비스 계정 키를 삭제한 다음 60분 후 서비스 계정을 사용 설정합니다. 서비스 계정 키를 삭제하면 장기 사용자 인증 정보가 무효화되어 공격자가 새로운 액세스 토큰을 요청할 수 없지만 이미 부여된 액세스 토큰이 무효화되지는 않습니다. 액세스 토큰이 60분 동안 악용되지 않도록 하려면 서비스 계정을 60분 동안 사용 중지해야 합니다.

또는 서비스 계정을 삭제하고 교체하여 단기 및 장기 사용자 인증 정보를 모두 즉시 취소할 수 있지만 애플리케이션에서 서비스 계정을 교체하려면 더 많은 중단을 유발하는 작업이 필요할 수 있습니다.

다음 단계