인스턴스 전체 컴플라이언스 및 보안 정책 관리
GitLab v19.5Offering: GitLab Self-Managed, GitLab Dedicated
요약
여러 그룹과 프로젝트에 걸쳐 단일하고 중앙화된 위치에서 보안 정책과 컴플라이언스 프레임워크를 적용할 수 있도록, 인스턴스 관리자는 컴플라이언스 및 보안 정책(CSP) 그룹을 지정할 수 있습니다. 인스턴스 전체 컴플라이언스 및 보안 정책 관리를 설정하려면, 컴플라이언스 및 보안 정책 그룹을 지정한 다음 해당 그룹에서 정책과 컴플라이언스 프레임워크를 생성합니다.
히스토리
여러 그룹과 프로젝트에 걸쳐 단일하고 중앙화된 위치에서 보안 정책과 컴플라이언스 프레임워크를 적용할 수 있도록, 인스턴스 관리자는 컴플라이언스 및 보안 정책(CSP) 그룹을 지정할 수 있습니다. 이를 통해 인스턴스 관리자는 다음을 수행할 수 있습니다.
- 인스턴스 전체에 자동으로 적용되는 보안 정책을 생성하고 구성합니다.
- 다른 최상위 그룹에서 사용할 수 있도록 중앙화된 컴플라이언스 프레임워크를 생성합니다.
- 컴플라이언스 프레임워크, 그룹, 프로젝트 또는 전체 인스턴스에 적용되도록 정책의 범위를 지정합니다.
- 어떤 정책이 어디에서 활성화되어 있는지 파악할 수 있도록 전체 정책 적용 범위를 확인합니다.
- 팀이 자체적으로 추가 정책과 프레임워크를 생성할 수 있도록 허용하면서 중앙화된 통제를 유지합니다.
사전 요구 사항#
- GitLab 18.2 이상.
- 인스턴스 관리자여야 합니다.
- 컴플라이언스 및 보안 정책 그룹으로 사용할 기존 최상위 그룹이 있어야 합니다.
- REST API를 사용하려면(선택 사항) 관리자 액세스 권한이 있는 토큰이 있어야 합니다.
인스턴스 전체 컴플라이언스 및 보안 정책 관리 설정#
인스턴스 전체 컴플라이언스 및 보안 정책 관리를 설정하려면, 컴플라이언스 및 보안 정책 그룹을 지정한 다음 해당 그룹에서 정책과 컴플라이언스 프레임워크를 생성합니다.
컴플라이언스 및 보안 정책 그룹 지정#
GitLab UI 또는 REST API를 사용하여 컴플라이언스 및 보안 정책 그룹을 지정할 수 있습니다.
GitLab UI 사용#
- 오른쪽 상단에서 Admin을 선택합니다.
- 왼쪽 사이드바에서 Settings > Security and Compliance를 선택합니다.
- Designate CSP Group 섹션에서 드롭다운 목록에 있는 기존 최상위 그룹을 선택합니다.
- Save changes를 선택합니다.
REST API 사용#
REST API를 사용하여 프로그래밍 방식으로 컴플라이언스 및 보안 정책 그룹을 지정할 수도 있습니다. 이 API는 자동화나 여러 인스턴스를 관리할 때 유용합니다.
컴플라이언스 및 보안 정책 그룹을 설정하려면 다음과 같이 합니다.
curl --request PUT \
--header "PRIVATE-TOKEN: <your_access_token>" \
--header "Content-Type: application/json" \
--data '{"csp_namespace_id": 123456}' \
--url "https://gitlab.example.com/api/v4/admin/security/policy_settings"
컴플라이언스 및 보안 정책 그룹을 해제하려면 다음과 같이 합니다.
curl --request PUT \
--header "PRIVATE-TOKEN: <your_access_token>" \
--header "Content-Type: application/json" \
--data '{"csp_namespace_id": null}' \
--url "https://gitlab.example.com/api/v4/admin/security/policy_settings"
현재 컴플라이언스 및 보안 정책 설정을 조회하려면 다음과 같이 합니다.
curl --request GET \
--header "PRIVATE-TOKEN: <your_access_token>" \
--url "https://gitlab.example.com/api/v4/admin/security/policy_settings"
자세한 내용은 정책 설정 API 문서를 참고합니다.
선택한 그룹은 컴플라이언스 및 보안 정책 그룹이 되며, 인스턴스 전체의 보안 정책과 컴플라이언스 프레임워크를 관리하는 중앙 위치 역할을 합니다.
컴플라이언스 및 보안 정책 그룹에서의 보안 정책 관리#
보안 정책에 대해서는 컴플라이언스 및 보안 정책 그룹 문서를 참고합니다.
중앙화된 컴플라이언스 프레임워크 관리#
컴플라이언스 및 보안 정책 그룹을 지정하고 나면, 인스턴스의 모든 최상위 그룹에서 자동으로 사용할 수 있는 컴플라이언스 프레임워크를 생성할 수 있습니다. 이를 통해 조직 전체에 일관된 방식으로 컴플라이언스를 적용할 수 있습니다.
컴플라이언스 및 보안 정책 그룹에서 생성된 컴플라이언스 프레임워크는 다음과 같은 특성을 갖습니다.
- 인스턴스의 다른 최상위 그룹에서 확인하고 사용할 수 있습니다.
- 그룹 Owner가 프로젝트에 적용할 수 있습니다.
- 컴플라이언스 및 보안 정책 그룹 외부의 사용자에게는 읽기 전용입니다.
- 컴플라이언스 적용을 강화하기 위해 보안 정책과 통합할 수 있습니다.
중앙화된 컴플라이언스 프레임워크를 생성하고 관리하는 자세한 방법은 중앙화된 컴플라이언스 프레임워크를 참고합니다.
사용자 워크플로#
인스턴스 관리자#
인스턴스 관리자는 다음을 수행할 수 있습니다.
- 기존 최상위 그룹 중에서 컴플라이언스 및 보안 정책 그룹을 지정합니다.
- 지정된 그룹에서 보안 정책을 생성합니다.
- 지정된 그룹에서 컴플라이언스 프레임워크를 생성합니다.
- 정책이 적용되는 범위를 결정하도록 정책 범위를 구성합니다.
- 특정 프레임워크가 적용된 프로젝트에 정책을 적용하도록 컴플라이언스 프레임워크에 정책 범위를 지정합니다.
- 그룹과 프로젝트 전반에서 어떤 정책이 활성화되어 있는지 파악하도록 정책 적용 범위를 확인합니다.
- 필요에 따라 중앙화된 정책과 프레임워크를 편집하고 관리합니다.
그룹 관리자 및 Owner#
그룹 관리자 및 Owner는 다음을 수행할 수 있습니다.
- Secure > Policies에서 로컬에 정의된 정책과 중앙에서 관리되는 정책을 포함하여 적용 가능한 모든 정책을 확인합니다.
- 자신의 그룹에 속한 프로젝트에서 중앙화된 컴플라이언스 프레임워크를 확인하고 적용합니다.
- 중앙에서 관리되는 정책 및 프레임워크와 별도로 특정 그룹이나 프로젝트를 위한 정책과 프레임워크를 생성합니다.
- 정책이 자신의 팀에서 온 것인지 중앙 관리에서 온 것인지를 명확한 표시로 확인합니다.
Policies 페이지에는 현재 그룹에 적용되어 있는 컴플라이언스 및 보안 정책 그룹의 정책만 표시됩니다.
프로젝트 관리자 및 Owner#
프로젝트 관리자 및 Owner는 다음을 수행할 수 있습니다.
- Secure > Policies에서 로컬에 정의된 정책과 중앙에서 관리되는 정책을 포함하여 적용 가능한 모든 정책을 확인합니다.
- 중앙화된 프레임워크를 포함하여 자신의 프로젝트에 적용된 컴플라이언스 프레임워크를 확인합니다.
- 중앙에서 관리되는 정책과 별도로 프로젝트 전용 정책을 생성합니다.
- 정책이 자신의 프로젝트, 그룹, 중앙 관리 중 어디에서 온 것인지를 명확한 표시로 확인합니다.
Policies 페이지에는 현재 그룹에 적용되어 있는 컴플라이언스 및 보안 정책 그룹의 정책만 표시됩니다.
Developer#
Developer는 다음을 수행할 수 있습니다.
- Secure > Policies에서 자신의 작업에 적용되는 모든 보안 정책을 확인합니다.
- 자신이 작업하는 프로젝트에 적용된 컴플라이언스 프레임워크를 확인합니다.
- 중앙에서 의무화한 정책을 명확하게 확인하여 보안 및 컴플라이언스 요구 사항을 파악합니다.
보안 정책 프로젝트에서 마이그레이션 자동화#
이미 보안 정책 프로젝트를 사용하여 여러 그룹에 정책을 적용하고 있다면, 연결된 그룹 중 하나를 컴플라이언스 및 보안 정책 그룹으로 지정할 수 있습니다. 단, 컴플라이언스 및 보안 정책 그룹이 아닌 나머지 모든 그룹에서는 보안 정책 프로젝트 연결을 해제해야 합니다. 그렇지 않으면 해당 그룹에서 동일한 정책이 두 번 적용됩니다. 한 번은 연결된 보안 정책 그룹에서, 또 한 번은 컴플라이언스 및 보안 정책 그룹에서 적용됩니다.
그룹을 컴플라이언스 및 보안 정책 그룹으로 마이그레이션하는 과정을 자동화하려면 다음 csp_designation.rb 스크립트를 사용할 수 있습니다.
이 스크립트는 컴플라이언스 및 보안 정책 그룹의 정책 프로젝트에 연결된 모든 그룹의 ID를 지정된 백업 파일에 저장합니다. 필요한 경우, 이를 통해 보안 정책 프로젝트와의 연결을 포함한 이전 상태로 복원할 수 있습니다.
사전 요구 사항:
- 컴플라이언스 및 보안 정책 그룹으로 지정하려는 그룹에 연결된 보안 정책 프로젝트가 있어야 합니다.
스크립트를 사용하려면 다음과 같이 합니다.
-
다음 섹션에서
csp_designation.rb스크립트 전체를 복사합니다. -
터미널 창에서 인스턴스에 연결합니다.
-
csp_designation.rb라는 이름의 새 파일을 생성하고 해당 파일에 스크립트를 붙여넣습니다. -
다음 명령을 실행하여 컴플라이언스 및 보안 정책 그룹을 할당합니다. 이때 다음을 변경합니다.
<group_id>를 컴플라이언스 및 보안 정책 그룹으로 설정하려는 그룹의 GitLab ID로 변경합니다.- 첫 번째
/path/to/를 백업 파일을 저장할 디렉터리의 전체 경로로 변경합니다. - 두 번째
/path/to/를csp_designation.rb파일을 저장한 디렉터리의 전체 경로로 변경합니다.
CSP_GROUP_ID=<group-id> BACKUP_FILENAME="/path/to/csp_backup.txt" ACTION=assign sudo gitlab-rails runner /path/to/csp_designation.rb -
선택 사항. 전체 변경 사항을 되돌려야 하는 경우, 이전에 사용한 것과 동일한 그룹 ID, 백업 파일 경로, 스크립트 경로를 사용하여 다음 명령을 실행합니다.
CSP_GROUP_ID=<group-id> BACKUP_FILENAME="/path/to/csp_backup.txt" ACTION=unassign sudo gitlab-rails runner /path/to/csp_designation.rb
자세한 내용은 Rails Runner 문제 해결 섹션을 참고합니다.
csp_designation.rb#
class CspDesignation
def initialize(csp_group_id, backup_filename)
@backup_filename = backup_filename
@csp_group = Group.find_by_id(csp_group_id)
@csp_configuration = @csp_group&.security_orchestration_policy_configuration
@user = @csp_configuration&.policy_last_updated_by
@spp = @csp_configuration&.security_policy_management_project
end
def assign
check_spp!
config_ids, group_ids = Security::OrchestrationPolicyConfiguration.for_management_project(@spp)
.where.not(namespace: @csp_group)
.pluck(:id, :namespace_id)
.transpose
if group_ids.present?
puts "Saving group IDs to #{@backup_filename} as backup: #{group_ids}..."
File.write(@backup_filename, "#{group_ids.join("\n")}\n")
end
puts "Setting #{@csp_group.full_path} as CSP..."
Security::PolicySetting.in_organization(Organizations::Organization.default_organization).update! csp_namespace: @csp_group
if config_ids.present?
puts "Unassigning the policy project #{@spp.id} from the groups in the background to remove duplicate policies..."
config_ids.each do |config_id|
::Security::DeleteOrchestrationConfigurationWorker.perform_async(
config_id, @user.id, @spp.id
)
end
end
puts "Done."
end
def unassign
check_spp!
puts "Unassigning #{@csp_group.full_path} as CSP..."
Security::PolicySetting.in_organization(Organizations::Organization.default_organization).update! csp_namespace: nil
if File.exist?(@backup_filename)
puts "Reading group IDs from #{@backup_filename} to restore the policy project links..."
namespace_ids = File.read(@backup_filename).split("\n").map(&:to_i).reject(&:zero?)
Namespace.id_in(namespace_ids).find_each(batch_size: 100) do |namespace|
puts "Assigning the policy project to #{namespace.full_path}..."
result = ::Security::Orchestration::AssignService.new(
container: namespace, current_user: @user,
params: { policy_project_id: @spp.id }
).execute
puts "Failed to assign policy project to #{namespace.full_path}: #{result[:message]}" if result.error?
end
end
end
private
def check_spp!
raise "CSP policy project doesn't exist" if @spp.blank?
end
end
SUPPORTED_ACTIONS = %w[assign unassign].freeze
action = ENV['ACTION']
csp_group_id = ENV['CSP_GROUP_ID']
backup_filename = ENV['BACKUP_FILENAME']
raise "Unknown action: #{action}. Use either 'assign' or 'unassign'." unless action.in? SUPPORTED_ACTIONS
raise "Missing CSP_GROUP_ID" if csp_group_id.blank?
raise "Missing BACKUP_FILENAME" if backup_filename.blank?
CspDesignation.new(csp_group_id, backup_filename).public_send(action)
문제 해결#
컴플라이언스 및 보안 정책 그룹을 지정할 수 없음
- 인스턴스 관리자 권한이 있는지 확인합니다.
- 해당 그룹이 하위 그룹이 아닌 최상위 그룹인지 확인합니다.
- 해당 그룹이 존재하고 액세스 가능한지 확인합니다.
피드백 및 지원#
이 기능은 베타 릴리스이므로 사용자 피드백을 적극 권장합니다. 다음 채널을 통해 경험, 제안, 문제를 공유합니다.
- GitLab 이슈.
- 평소 이용하는 GitLab 지원 채널.