InfoGrab DocsInfoGrab Docs

Secrets Manager 이행 및 권한

요약

권한(entitlement)은 네임스페이스의 체험판, 유료 애드온, 청구 상태에 따라 해당 네임스페이스가 Secrets Manager로 무엇을 할 수 있는지 결정합니다. 권한이 다른 상태와 결합되는 방식은 이행 조합을 참조합니다.

권한(entitlement)은 네임스페이스의 체험판, 유료 애드온, 청구 상태에 따라 해당 네임스페이스가 Secrets Manager로 무엇을 할 수 있는지 결정합니다. 권한은 사용 가능 여부 조건에 설명된 라이선스 및 등록 조건과는 별개입니다. 세 가지 모두 작업을 허용해야 합니다.

권한이 다른 상태와 결합되는 방식은 이행 조합을 참조합니다.

권한 상태#

SecretsManagement::Entitlement는 데이터베이스 행과 상태 머신이 없는 값 객체입니다. SecretsManagement::Entitlement::Resolver가 필요할 때 이를 계산합니다.

상태 의미
trial_eligible 네임스페이스가 체험판을 시작할 수 있지만 아직 시작하지 않았습니다.
trial 체험판이 진행 중입니다.
paid 체험판이 끝난 뒤의 종량제 청구를 포함해 청구가 활성 상태입니다.
offline_paid 오프라인 인스턴스에 활성 Secrets Manager 애드온 구매가 있습니다.
blocked 청구가 네임스페이스를 차단합니다. blocked_reason이 항상 설정됩니다.
ineligible 권한이 없습니다. 조회가 실패했고 적용할 대체 값이 없을 때의 결과이기도 합니다.

blocked_reason 값은 trial_expired, credits_exhausted, on_demand_disabled, grace, subscription_grace_period_expired입니다. grace 사유는 유료 구독이 끝난 뒤 14일 동안에 해당합니다. GitLab.com에서는 구독 종료일에 이 기간이 시작됩니다. 온라인 라이선스를 사용하는 GitLab Self-Managed에서는 Secrets Manager 애드온 구매 종료일과 라이선스 종료일 중 더 늦은 날짜에 시작됩니다. 권한 타입의 gracePeriodEndDate 필드는 이 기간의 마지막 날을 반환합니다. 차단 사유가 grace일 때만 설정됩니다.

권한의 출처#

권한의 출처는 인스턴스 유형에 따라 다릅니다.

  • GitLab.com과 온라인 클라우드 라이선스를 사용하는 GitLab Self-Managed 인스턴스. 리졸버는 Gitlab::SubscriptionPortal::Client를 통해 CustomersDot에 묻습니다. GitLab.com에서는 최상위 그룹별로, GitLab Self-Managed에서는 인스턴스별로 묻습니다. CustomersDot은 체험판 상태와 컨슈머의 차단 여부를 반환합니다.
  • 오프라인 GitLab Self-Managed 인스턴스. Secrets Manager 애드온의 활성 AddOnPurchase가 있으면 offline_paid가 됩니다. 그 밖의 경우에는 subscription_grace_period_expired 사유의 blocked가 되므로, 오프라인 인스턴스에는 유예 기간이 없습니다.
  • GitLab Self-Managed 체험판 라이선스와 라이선스가 없는 인스턴스. 이 경우 ineligible로 해석됩니다.

상태별 허용 범위#

상태 초기화 및 프로비저닝 UI와 GraphQL에서 읽기 CI와 API를 통한 읽기 생성 및 업데이트 시크릿 삭제 권한 및 프로비저닝 해제
trial, paid, offline_paid 허용 허용 허용 허용 허용 허용
grace 사유의 blocked 차단 허용 허용 차단 허용 차단
그 밖의 사유의 blocked 차단 허용 차단 차단 허용 차단
trial_eligible 차단 최상위 그룹만1 차단 차단 최상위 그룹만1 차단
ineligible 차단 차단 차단 차단 차단 차단

blocked 네임스페이스는 느슨한 읽기 전용 모드입니다. 읽기와 삭제는 여전히 동작하고 쓰기는 동작하지 않습니다. 권한은 읽기도 차단할 때만 삭제를 차단합니다. 엄격한 읽기 전용은 다릅니다. Geo 보조 사이트나 유지 관리 모드처럼 데이터베이스 자체가 읽기 전용이어서 아무것도 기록되지 않는 상태를 뜻합니다.

확인은 다음 위치에서 이루어집니다.

  • EE::ProjectPolicy와 EE::GroupPolicy의 Rails 정책. 쓰기를 차단하는 규칙은 의도적으로 삭제를 제외합니다.
  • 초기화 및 프로비저닝 서비스가 호출하는 SecretsManagement::EntitlementGate#validate_entitlement.
  • GraphQL 뮤테이션의 EnforcesWriteEntitlement concern. 시크릿 삭제 뮤테이션에는 포함되지 않습니다.
  • EE::Ci::RegisterJobService와 EE::Ci::BuildRunnerPresenter의 CI job 가져오기.

체험판과 애드온#

GitLab.com에서 SecretsManagerStartTrial 뮤테이션은 CustomersDot에서 체험판을 시작합니다. 체험판을 시작하기 전에 모든 캐시를 건너뛰고 CustomersDot에서 최신 응답을 가져옵니다. 그룹이 trial_eligible이 아니면 거부합니다. 체험판이 진행 중인 그룹은 trial_already_active 오류를 받고, 그 밖의 상태는 ineligible 오류를 받습니다. SecretsManagerEnableAddOn 뮤테이션은 체험판 없이 유료 청구를 켭니다. GitLab.com에서는 사용자에게 provision_secrets_manager 권한이 있으면 두 뮤테이션 모두 최상위 그룹의 Secrets Manager도 프로비저닝합니다. 체험판이 시작된 뒤 프로비저닝이 실패하면 체험판은 활성 상태로 유지되고, 오류는 권한과 함께 반환됩니다. 두 뮤테이션 모두 GitLab Self-Managed 인스턴스를 위한 인스턴스 수준 버전이 있습니다. 이 뮤테이션은 권한 캐시를 지우므로 새 상태가 즉시 표시됩니다.

SecretsManagerRefreshEntitlement 뮤테이션과 그 인스턴스 버전은 CustomersDot에 다시 묻고 모든 캐시를 건너뜁니다. Customers Portal에서 방금 청구 동의를 변경한 사용자를 위한 것입니다. enable_secrets_manager_add_on 권한이 필요하며 사용자당 분당 10회로 제한됩니다. 갱신이 실패하면 오류를 반환하고 캐시된 응답과 마지막으로 확인된 정상 응답을 유지합니다. 인스턴스 버전은 오프라인 라이선스에서 오류를 반환합니다.

체험판이 끝나면 네임스페이스는 trial_expired 사유의 blocked가 되며, 종량제 청구가 켜져 있으면 paid가 됩니다. 프로비저닝 해제되거나 삭제되는 항목은 없습니다. active 상태의 Secrets Manager는 active로 유지되고, 시크릿은 느슨한 읽기 전용 모드로 보존됩니다.

캐싱과 장애#

권한 응답은 여러 계층에서 캐시되므로 청구 변경이 항상 즉시 표시되지는 않습니다.

  • 리졸버는 요청마다 SafeRequestStore에 응답을 캐시합니다.
  • CI job 가져오기도 Rails.cache에 권한을 1분 동안 캐시합니다. Entitlement.new가 알 수 없는 키를 거부하므로 캐시 키에는 Entitlement 필드 목록의 다이제스트가 포함됩니다. Entitlement에 필드를 추가하면 키가 저절로 바뀌므로, 롤링 배포 중에 이전 노드와 새 노드가 서로의 항목을 읽지 않습니다.
  • CustomersDot 클라이언트는 각 응답을 응답의 Cache-Control max-age 동안, max-age가 없으면 120초 동안 Rails.cache에 캐시합니다. 오류는 캐시하지 않습니다.
  • 마지막 정상 응답 저장소는 가장 최근의 CustomersDot 응답을 Redis에 24시간 동안 보관합니다.

CustomersDot을 사용할 수 없으면 리졸버는 마지막 정상 응답을 재사용하되, 그 응답이 직접 읽기를 허용한 경우에만 재사용합니다. 그렇지 않으면 조회는 fail closed로 ineligible이 되며, UI 읽기와 CI job이 차단됩니다. 마지막 정상 응답 대체에는 킬 스위치 역할을 하는 운영용 기능 플래그가 있습니다.

갱신처럼 GitLab 밖의 CustomersDot에서 이루어진 변경은 어떤 캐시도 지우지 않습니다. 사용자가 권한 갱신 뮤테이션을 실행하지 않으면 이전 응답이 CustomersDot 캐시가 만료될 때까지 유지될 수 있습니다. 갱신은 CustomersDot이 응답할 때만 캐시된 응답을 대체하며, 마지막 정상 응답을 재사용하지 않습니다.

베타 프로그램#

베타 프로그램은 종료되었습니다. NamespaceEnrollment의 beta 또는 GitLab Self-Managed의 인스턴스 등록으로 표시되는 베타 등록 네임스페이스도 다른 네임스페이스와 같은 권한을 받습니다. 유일한 차이는 trial_eligible 상태의 베타 네임스페이스가 하위 그룹과 프로젝트의 시크릿을 여전히 보고 삭제할 수 있다는 점입니다.

청구 이벤트#

Secrets Manager는 두 가지 사용량 이벤트를 발생시킵니다.

  • secrets_stored. 일일 cron이 NamespaceSecretCount를 기준으로 루트 네임스페이스별 저장된 시크릿 수를 세고, 개수가 0이 아닌 네임스페이스마다 이벤트 하나를 발생시킵니다.
  • secrets_read. OpenBao 감사 로그에서 가져온, 시크릿 읽기 성공 한 건당 이벤트 하나.

권한은 두 이벤트를 차단하지 않습니다. 두 이벤트 모두 권한 상태와 차단 사유를 메타데이터로 포함하며, CustomersDot이 요율을 결정합니다. GitLab.com에서 옵트아웃한 네임스페이스와 등록되지 않은 GitLab Self-Managed 인스턴스는 secrets_stored를 발생시키지 않습니다.

시크릿 개수는 ReconcileNamespaceSecretCountWorker가 최신 상태로 유지합니다. 이 워커는 시크릿을 생성하거나 삭제할 때마다, 프로비저닝 해제 후에, 그리고 일일 cron에서 실행됩니다. OpenBao의 시크릿을 세고, Secrets Manager가 없거나 active가 아니면 개수 행을 제거합니다.

Footnotes

  1. 이전 베타 프로그램에 등록된 네임스페이스를 제외하고 하위 그룹과 프로젝트는 표시되지 않습니다. ↩ ↩2

Secrets Manager 이행 및 권한

GitLab v19.5
원문 보기

요약

권한(entitlement)은 네임스페이스의 체험판, 유료 애드온, 청구 상태에 따라 해당 네임스페이스가 Secrets Manager로 무엇을 할 수 있는지 결정합니다. 권한이 다른 상태와 결합되는 방식은 이행 조합을 참조합니다.

권한(entitlement)은 네임스페이스의 체험판, 유료 애드온, 청구 상태에 따라 해당 네임스페이스가 Secrets Manager로 무엇을 할 수 있는지 결정합니다. 권한은 사용 가능 여부 조건에 설명된 라이선스 및 등록 조건과는 별개입니다. 세 가지 모두 작업을 허용해야 합니다.

권한이 다른 상태와 결합되는 방식은 이행 조합을 참조합니다.

권한 상태#

SecretsManagement::Entitlement는 데이터베이스 행과 상태 머신이 없는 값 객체입니다. SecretsManagement::Entitlement::Resolver가 필요할 때 이를 계산합니다.

상태 의미
trial_eligible 네임스페이스가 체험판을 시작할 수 있지만 아직 시작하지 않았습니다.
trial 체험판이 진행 중입니다.
paid 체험판이 끝난 뒤의 종량제 청구를 포함해 청구가 활성 상태입니다.
offline_paid 오프라인 인스턴스에 활성 Secrets Manager 애드온 구매가 있습니다.
blocked 청구가 네임스페이스를 차단합니다. blocked_reason이 항상 설정됩니다.
ineligible 권한이 없습니다. 조회가 실패했고 적용할 대체 값이 없을 때의 결과이기도 합니다.

blocked_reason 값은 trial_expired, credits_exhausted, on_demand_disabled, grace, subscription_grace_period_expired입니다. grace 사유는 유료 구독이 끝난 뒤 14일 동안에 해당합니다. GitLab.com에서는 구독 종료일에 이 기간이 시작됩니다. 온라인 라이선스를 사용하는 GitLab Self-Managed에서는 Secrets Manager 애드온 구매 종료일과 라이선스 종료일 중 더 늦은 날짜에 시작됩니다. 권한 타입의 gracePeriodEndDate 필드는 이 기간의 마지막 날을 반환합니다. 차단 사유가 grace일 때만 설정됩니다.

권한의 출처#

권한의 출처는 인스턴스 유형에 따라 다릅니다.

  • GitLab.com과 온라인 클라우드 라이선스를 사용하는 GitLab Self-Managed 인스턴스. 리졸버는 Gitlab::SubscriptionPortal::Client를 통해 CustomersDot에 묻습니다. GitLab.com에서는 최상위 그룹별로, GitLab Self-Managed에서는 인스턴스별로 묻습니다. CustomersDot은 체험판 상태와 컨슈머의 차단 여부를 반환합니다.
  • 오프라인 GitLab Self-Managed 인스턴스. Secrets Manager 애드온의 활성 AddOnPurchase가 있으면 offline_paid가 됩니다. 그 밖의 경우에는 subscription_grace_period_expired 사유의 blocked가 되므로, 오프라인 인스턴스에는 유예 기간이 없습니다.
  • GitLab Self-Managed 체험판 라이선스와 라이선스가 없는 인스턴스. 이 경우 ineligible로 해석됩니다.

상태별 허용 범위#

상태 초기화 및 프로비저닝 UI와 GraphQL에서 읽기 CI와 API를 통한 읽기 생성 및 업데이트 시크릿 삭제 권한 및 프로비저닝 해제
trial, paid, offline_paid 허용 허용 허용 허용 허용 허용
grace 사유의 blocked 차단 허용 허용 차단 허용 차단
그 밖의 사유의 blocked 차단 허용 차단 차단 허용 차단
trial_eligible 차단 최상위 그룹만1 차단 차단 최상위 그룹만1 차단
ineligible 차단 차단 차단 차단 차단 차단

blocked 네임스페이스는 느슨한 읽기 전용 모드입니다. 읽기와 삭제는 여전히 동작하고 쓰기는 동작하지 않습니다. 권한은 읽기도 차단할 때만 삭제를 차단합니다. 엄격한 읽기 전용은 다릅니다. Geo 보조 사이트나 유지 관리 모드처럼 데이터베이스 자체가 읽기 전용이어서 아무것도 기록되지 않는 상태를 뜻합니다.

확인은 다음 위치에서 이루어집니다.

  • EE::ProjectPolicy와 EE::GroupPolicy의 Rails 정책. 쓰기를 차단하는 규칙은 의도적으로 삭제를 제외합니다.
  • 초기화 및 프로비저닝 서비스가 호출하는 SecretsManagement::EntitlementGate#validate_entitlement.
  • GraphQL 뮤테이션의 EnforcesWriteEntitlement concern. 시크릿 삭제 뮤테이션에는 포함되지 않습니다.
  • EE::Ci::RegisterJobService와 EE::Ci::BuildRunnerPresenter의 CI job 가져오기.

체험판과 애드온#

GitLab.com에서 SecretsManagerStartTrial 뮤테이션은 CustomersDot에서 체험판을 시작합니다. 체험판을 시작하기 전에 모든 캐시를 건너뛰고 CustomersDot에서 최신 응답을 가져옵니다. 그룹이 trial_eligible이 아니면 거부합니다. 체험판이 진행 중인 그룹은 trial_already_active 오류를 받고, 그 밖의 상태는 ineligible 오류를 받습니다. SecretsManagerEnableAddOn 뮤테이션은 체험판 없이 유료 청구를 켭니다. GitLab.com에서는 사용자에게 provision_secrets_manager 권한이 있으면 두 뮤테이션 모두 최상위 그룹의 Secrets Manager도 프로비저닝합니다. 체험판이 시작된 뒤 프로비저닝이 실패하면 체험판은 활성 상태로 유지되고, 오류는 권한과 함께 반환됩니다. 두 뮤테이션 모두 GitLab Self-Managed 인스턴스를 위한 인스턴스 수준 버전이 있습니다. 이 뮤테이션은 권한 캐시를 지우므로 새 상태가 즉시 표시됩니다.

SecretsManagerRefreshEntitlement 뮤테이션과 그 인스턴스 버전은 CustomersDot에 다시 묻고 모든 캐시를 건너뜁니다. Customers Portal에서 방금 청구 동의를 변경한 사용자를 위한 것입니다. enable_secrets_manager_add_on 권한이 필요하며 사용자당 분당 10회로 제한됩니다. 갱신이 실패하면 오류를 반환하고 캐시된 응답과 마지막으로 확인된 정상 응답을 유지합니다. 인스턴스 버전은 오프라인 라이선스에서 오류를 반환합니다.

체험판이 끝나면 네임스페이스는 trial_expired 사유의 blocked가 되며, 종량제 청구가 켜져 있으면 paid가 됩니다. 프로비저닝 해제되거나 삭제되는 항목은 없습니다. active 상태의 Secrets Manager는 active로 유지되고, 시크릿은 느슨한 읽기 전용 모드로 보존됩니다.

캐싱과 장애#

권한 응답은 여러 계층에서 캐시되므로 청구 변경이 항상 즉시 표시되지는 않습니다.

  • 리졸버는 요청마다 SafeRequestStore에 응답을 캐시합니다.
  • CI job 가져오기도 Rails.cache에 권한을 1분 동안 캐시합니다. Entitlement.new가 알 수 없는 키를 거부하므로 캐시 키에는 Entitlement 필드 목록의 다이제스트가 포함됩니다. Entitlement에 필드를 추가하면 키가 저절로 바뀌므로, 롤링 배포 중에 이전 노드와 새 노드가 서로의 항목을 읽지 않습니다.
  • CustomersDot 클라이언트는 각 응답을 응답의 Cache-Control max-age 동안, max-age가 없으면 120초 동안 Rails.cache에 캐시합니다. 오류는 캐시하지 않습니다.
  • 마지막 정상 응답 저장소는 가장 최근의 CustomersDot 응답을 Redis에 24시간 동안 보관합니다.

CustomersDot을 사용할 수 없으면 리졸버는 마지막 정상 응답을 재사용하되, 그 응답이 직접 읽기를 허용한 경우에만 재사용합니다. 그렇지 않으면 조회는 fail closed로 ineligible이 되며, UI 읽기와 CI job이 차단됩니다. 마지막 정상 응답 대체에는 킬 스위치 역할을 하는 운영용 기능 플래그가 있습니다.

갱신처럼 GitLab 밖의 CustomersDot에서 이루어진 변경은 어떤 캐시도 지우지 않습니다. 사용자가 권한 갱신 뮤테이션을 실행하지 않으면 이전 응답이 CustomersDot 캐시가 만료될 때까지 유지될 수 있습니다. 갱신은 CustomersDot이 응답할 때만 캐시된 응답을 대체하며, 마지막 정상 응답을 재사용하지 않습니다.

베타 프로그램#

베타 프로그램은 종료되었습니다. NamespaceEnrollment의 beta 또는 GitLab Self-Managed의 인스턴스 등록으로 표시되는 베타 등록 네임스페이스도 다른 네임스페이스와 같은 권한을 받습니다. 유일한 차이는 trial_eligible 상태의 베타 네임스페이스가 하위 그룹과 프로젝트의 시크릿을 여전히 보고 삭제할 수 있다는 점입니다.

청구 이벤트#

Secrets Manager는 두 가지 사용량 이벤트를 발생시킵니다.

  • secrets_stored. 일일 cron이 NamespaceSecretCount를 기준으로 루트 네임스페이스별 저장된 시크릿 수를 세고, 개수가 0이 아닌 네임스페이스마다 이벤트 하나를 발생시킵니다.
  • secrets_read. OpenBao 감사 로그에서 가져온, 시크릿 읽기 성공 한 건당 이벤트 하나.

권한은 두 이벤트를 차단하지 않습니다. 두 이벤트 모두 권한 상태와 차단 사유를 메타데이터로 포함하며, CustomersDot이 요율을 결정합니다. GitLab.com에서 옵트아웃한 네임스페이스와 등록되지 않은 GitLab Self-Managed 인스턴스는 secrets_stored를 발생시키지 않습니다.

시크릿 개수는 ReconcileNamespaceSecretCountWorker가 최신 상태로 유지합니다. 이 워커는 시크릿을 생성하거나 삭제할 때마다, 프로비저닝 해제 후에, 그리고 일일 cron에서 실행됩니다. OpenBao의 시크릿을 세고, Secrets Manager가 없거나 active가 아니면 개수 행을 제거합니다.

Footnotes

  1. 이전 베타 프로그램에 등록된 네임스페이스를 제외하고 하위 그룹과 프로젝트는 표시되지 않습니다. ↩ ↩2