diff --git a/.gitlab/CODEOWNERS b/.gitlab/CODEOWNERS index 1a4d182c3d1ebf4e1dfe7e02c2e419a92e31fda7..e4fa6713a900159dfc55ad64a9238c9e78d2810a 100644 --- a/.gitlab/CODEOWNERS +++ b/.gitlab/CODEOWNERS @@ -116,8 +116,6 @@ Dangerfile @gl-quality/eng-prod /ee/spec/services/network_policies/** @gitlab-org/protect/container-security-backend /app/models/clusters/applications/cilium.rb @gitlab-org/protect/container-security-backend /spec/models/clusters/applications/cilium_spec.rb @gitlab-org/protect/container-security-backend -/ee/app/controllers/projects/security/network_policies_controller.rb @gitlab-org/protect/container-security-backend -/ee/spec/controllers/projects/security/network_policies_controller_spec.rb @gitlab-org/protect/container-security-backend /ee/app/services/network_policies/** @gitlab-org/protect/container-security-backend /ee/spec/services/network_policies/** @gitlab-org/protect/container-security-backend /ee/app/services/security/orchestration/** @gitlab-org/protect/container-security-backend diff --git a/.rubocop_todo/layout/hash_alignment.yml b/.rubocop_todo/layout/hash_alignment.yml index b13a561958e977e03b62c51bdf66ee882f60f6d2..137f6cb7a05925715b66a59c2fd53e9c0f505b9d 100644 --- a/.rubocop_todo/layout/hash_alignment.yml +++ b/.rubocop_todo/layout/hash_alignment.yml @@ -386,7 +386,6 @@ Layout/HashAlignment: - 'ee/spec/controllers/ee/projects/variables_controller_spec.rb' - 'ee/spec/controllers/groups/epic_boards_controller_spec.rb' - 'ee/spec/controllers/groups/issues_controller_spec.rb' - - 'ee/spec/controllers/projects/security/network_policies_controller_spec.rb' - 'ee/spec/controllers/projects/settings/operations_controller_spec.rb' - 'ee/spec/controllers/trials_controller_spec.rb' - 'ee/spec/factories/dependencies.rb' diff --git a/.rubocop_todo/layout/line_length.yml b/.rubocop_todo/layout/line_length.yml index d46c7a6da62582c25ed9fa491540b3b8b1f9924d..8124b129c2575e18aa50db6fc67858777e48a393 100644 --- a/.rubocop_todo/layout/line_length.yml +++ b/.rubocop_todo/layout/line_length.yml @@ -1179,7 +1179,6 @@ Layout/LineLength: - 'ee/app/controllers/projects/licenses_controller.rb' - 'ee/app/controllers/projects/protected_environments_controller.rb' - 'ee/app/controllers/projects/requirements_management/requirements_controller.rb' - - 'ee/app/controllers/projects/security/network_policies_controller.rb' - 'ee/app/controllers/projects/security/policies_controller.rb' - 'ee/app/controllers/projects/security/vulnerabilities/notes_controller.rb' - 'ee/app/controllers/projects/threat_monitoring_controller.rb' @@ -1904,7 +1903,6 @@ Layout/LineLength: - 'ee/spec/controllers/projects/push_rules_controller_spec.rb' - 'ee/spec/controllers/projects/runners_controller_spec.rb' - 'ee/spec/controllers/projects/security/configuration_controller_spec.rb' - - 'ee/spec/controllers/projects/security/network_policies_controller_spec.rb' - 'ee/spec/controllers/projects/security/vulnerabilities_controller_spec.rb' - 'ee/spec/controllers/projects/subscriptions_controller_spec.rb' - 'ee/spec/controllers/projects/threat_monitoring_controller_spec.rb' diff --git a/.rubocop_todo/rspec/verified_doubles.yml b/.rubocop_todo/rspec/verified_doubles.yml index 70fb8414f5573fb4cb8e719f8cc0425664ad5363..a2cca0b5b29bdf76142737fc204aa65ecc81d381 100644 --- a/.rubocop_todo/rspec/verified_doubles.yml +++ b/.rubocop_todo/rspec/verified_doubles.yml @@ -7,7 +7,6 @@ RSpec/VerifiedDoubles: - ee/spec/controllers/groups/sso_controller_spec.rb - ee/spec/controllers/oauth/geo_auth_controller_spec.rb - ee/spec/controllers/projects/clusters_controller_spec.rb - - ee/spec/controllers/projects/security/network_policies_controller_spec.rb - ee/spec/db/production/license_spec.rb - ee/spec/elastic/migrate/20210510113500_delete_merge_requests_from_original_index_spec.rb - ee/spec/elastic/migrate/20210510143200_delete_notes_from_original_index_spec.rb diff --git a/ee/app/controllers/projects/security/network_policies_controller.rb b/ee/app/controllers/projects/security/network_policies_controller.rb deleted file mode 100644 index 0915bb969ce6939dddf895a241b870f89fb6b9f7..0000000000000000000000000000000000000000 --- a/ee/app/controllers/projects/security/network_policies_controller.rb +++ /dev/null @@ -1,106 +0,0 @@ -# frozen_string_literal: true - -module Projects - module Security - class NetworkPoliciesController < Projects::ApplicationController - include SecurityAndCompliancePermissions - - POLLING_INTERVAL = 5_000 - - before_action :authorize_read_threat_monitoring! - before_action :set_polling_interval, only: [:summary] - - # This controller is being removed in https://gitlab.com/gitlab-org/gitlab/-/issues/352285 - feature_category :not_owned # rubocop:todo Gitlab/AvoidFeatureCategoryNotOwned - - def summary - return not_found unless environment.has_metrics? - - adapter = environment.prometheus_adapter - return not_found unless adapter.can_query? - - result = adapter.query( - :packet_flow, environment.deployment_namespace, - params[:interval] || "minute", - parse_time(params[:from], 1.hour.ago).to_s, - parse_time(params[:to], Time.current).to_s - ) - - respond_to do |format| - format.json do - if result - status = result[:success] ? :ok : :bad_request - render status: status, json: result[:data] - else - render status: :accepted, json: {} - end - end - end - end - - def index - response = NetworkPolicies::ResourcesService.new(project: project, environment_id: params[:environment_id]).execute - respond_with_service_response(response) - end - - def create - response = NetworkPolicies::DeployResourceService.new( - manifest: params[:manifest], - environment: environment - ).execute - - respond_with_service_response(response) - end - - def update - response = NetworkPolicies::DeployResourceService.new( - resource_name: params[:id], - manifest: params[:manifest], - environment: environment, - enabled: params[:enabled] - ).execute - - respond_with_service_response(response) - end - - def destroy - response = NetworkPolicies::DeleteResourceService.new( - resource_name: params[:id], - manifest: params[:manifest], - environment: environment - ).execute - - respond_with_service_response(response) - end - - private - - def parse_time(params, fallback) - Time.zone.parse(params) || fallback - rescue StandardError - fallback - end - - def environment - @environment ||= project.environments.find(params[:environment_id]) - end - - def set_polling_interval - Gitlab::PollingInterval.set_header(response, interval: POLLING_INTERVAL) - end - - def authorize_read_threat_monitoring! - render_403 unless can?(current_user, :read_threat_monitoring, project) - end - - def respond_with_service_response(response) - payload = response.success? ? response.payload : { payload: response.payload, error: response.message } - respond_to do |format| - format.json do - render status: response.http_status, json: payload - end - end - end - end - end -end diff --git a/ee/app/helpers/ee/security_orchestration_helper.rb b/ee/app/helpers/ee/security_orchestration_helper.rb index 4e31f48b7d9250e64c53992b9795790c2dca33f7..530dfa201c7da74c79a9e28cb2fe7b4603eb1fb3 100644 --- a/ee/app/helpers/ee/security_orchestration_helper.rb +++ b/ee/app/helpers/ee/security_orchestration_helper.rb @@ -39,7 +39,6 @@ def orchestration_policy_data(container, policy_type = nil, policy = nil, enviro project_path: container.full_path, project_id: container.id, default_environment_id: container.default_environment&.id || -1, - network_policies_endpoint: project_security_network_policies_path(container), create_agent_help_path: help_page_url('user/clusters/agent/install/index'), network_documentation_path: help_page_path('user/application_security/policies/index'), environments_endpoint: project_environments_path(container), diff --git a/ee/app/views/projects/threat_monitoring/show.html.haml b/ee/app/views/projects/threat_monitoring/show.html.haml index a0d580fdc2320309e1d875573310a3994fea2292..6cd192d947068d60d2f7fb37a03fbdaf307f4675 100644 --- a/ee/app/views/projects/threat_monitoring/show.html.haml +++ b/ee/app/views/projects/threat_monitoring/show.html.haml @@ -9,7 +9,6 @@ #js-threat-monitoring-app{ data: { documentation_path: 'https://docs.gitlab.com/ee/user/application_security/threat_monitoring/', empty_state_svg_path: image_path('illustrations/monitoring/unable_to_connect.svg'), network_policy_no_data_svg_path: image_path('illustrations/network-policies-not-detected-sm.svg'), - network_policy_statistics_endpoint: summary_project_security_network_policies_path(@project, format: :json), environments_endpoint: project_environments_path(@project), new_policy_path: new_project_threat_monitoring_policy_path(@project), default_environment_id: default_environment_id, diff --git a/ee/config/routes/project.rb b/ee/config/routes/project.rb index 334c2e44275d47026693405e9f866f8c17ccd3db..efba032ae2bfe23ad91e28a2f6fd3e178809be72 100644 --- a/ee/config/routes/project.rb +++ b/ee/config/routes/project.rb @@ -48,10 +48,6 @@ resources :audit_events, only: [:index] namespace :security do - resources :network_policies, only: [:index, :create, :update, :destroy], constraints: { id: %r{[^/]+} } do - get :summary, on: :collection - end - resources :dashboard, only: [:index], controller: :dashboard resources :vulnerability_report, only: [:index], controller: :vulnerability_report resources :policies, only: [:index, :new, :edit], constraints: { id: %r{[^/]+} } diff --git a/ee/spec/controllers/projects/security/network_policies_controller_spec.rb b/ee/spec/controllers/projects/security/network_policies_controller_spec.rb deleted file mode 100644 index 6b22bd83795ffb9a54f5f0975f41fef71c1dd678..0000000000000000000000000000000000000000 --- a/ee/spec/controllers/projects/security/network_policies_controller_spec.rb +++ /dev/null @@ -1,357 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe Projects::Security::NetworkPoliciesController do - let_it_be(:group) { create(:group) } - let_it_be(:user) { create(:user) } - - let_it_be(:project) { create(:project, :public, :repository, group: group) } - let_it_be(:environment) { create(:environment, :with_review_app, project: project) } - - let_it_be(:action_params) { { project_id: project, namespace_id: project.namespace, environment_id: environment.id } } - - let_it_be(:manifest) do - <<~POLICY - apiVersion: networking.k8s.io/v1 - kind: NetworkPolicy - metadata: - name: example-name - namespace: example-namespace - spec: - podSelector: - matchLabels: - role: db - policyTypes: - - Ingress - ingress: - - from: - - namespaceSelector: - matchLabels: - project: myproject - POLICY - end - - shared_examples 'CRUD service errors' do - context 'with an error service response' do - before do - allow(service).to receive(:execute) { ServiceResponse.error(http_status: :bad_request, message: 'error') } - end - - it 'responds with bad_request' do - subject - - expect(response).to have_gitlab_http_status(:bad_request) - expect(response.body).to eq('{"payload":{},"error":"error"}') - end - end - end - - before do - stub_licensed_features(threat_monitoring: true) - - sign_in(user) - end - - describe 'GET #summary' do - subject(:request) { get :summary, params: action_params, format: :json } - - let_it_be(:kubernetes_namespace) { environment.deployment_namespace } - - include_context '"Security & Compliance" permissions' do - let(:valid_request) { request } - - before_request do - group.add_developer(user) - end - end - - context 'with authorized user' do - before do - group.add_developer(user) - end - - context 'with prometheus configured' do - let(:adapter) { double("configured?" => true, "can_query?" => true) } - - before do - allow_next_instance_of(Gitlab::Prometheus::Adapter) do |instance| - allow(instance).to receive(:prometheus_adapter) { adapter } - end - end - - it 'returns network policies summary' do - freeze_time do - expect(adapter).to( - receive(:query) - .with(:packet_flow, kubernetes_namespace, "minute", 1.hour.ago.to_s, Time.current.to_s) - .and_return({ success: true, data: { ops_rate: [[Time.zone.at(0).to_i, 10]], ops_total: 10 } }) - ) - subject - end - - expect(response).to have_gitlab_http_status(:ok) - expect(json_response['ops_total']).to equal(10) - expect(json_response['ops_rate']).to eq([[0, 10]]) - end - - context 'with additional parameters' do - let(:action_params) do - { - project_id: project, namespace_id: project.namespace, environment_id: environment, - interval: "day", from: Time.zone.at(0), to: Time.zone.at(100) - } - end - - it 'queries with requested arguments' do - expect(adapter).to( - receive(:query) - .with(:packet_flow, kubernetes_namespace, "day", Time.zone.at(0).to_s, Time.zone.at(100).to_s) - .and_return({ success: true, data: {} }) - ) - subject - end - end - - context 'with invalid Time range' do - let(:action_params) do - { - project_id: project, namespace_id: project.namespace, environment_id: environment, - from: "not a time", to: "not a time" - } - end - - it 'queries with default arguments' do - freeze_time do - expect(adapter).to( - receive(:query) - .with(:packet_flow, kubernetes_namespace, "minute", 1.hour.ago.to_s, Time.current.to_s) - .and_return({ success: true, data: {} }) - ) - subject - end - end - end - - context 'with nil results' do - it 'responds with accepted' do - allow(adapter).to receive(:query).and_return(nil) - subject - - expect(response).to have_gitlab_http_status(:accepted) - end - end - end - - context 'without prometheus configured' do - it 'returns not found' do - subject - - expect(response).to have_gitlab_http_status(:not_found) - end - end - - it 'sets a polling interval header' do - subject - - expect(response.headers['Poll-Interval']).to eq('5000') - end - end - - context 'with unauthorized user' do - it 'returns unauthorized' do - subject - - expect(response).to have_gitlab_http_status(:forbidden) - end - end - end - - describe 'GET #index' do - subject(:request) { get :index, params: action_params, format: :json } - - include_context '"Security & Compliance" permissions' do - let(:valid_request) { request } - - before_request do - group.add_developer(user) - end - end - - context 'with authorized user' do - let(:service) { instance_double('NetworkPolicies::ResourcesService', execute: ServiceResponse.success(payload: [policy])) } - let(:policy) do - Gitlab::Kubernetes::NetworkPolicy.new( - name: 'policy', - namespace: 'another', - selector: { matchLabels: { role: 'db' } }, - ingress: [{ from: [{ namespaceSelector: { matchLabels: { project: 'myproject' } } }] }] - ) - end - - before do - group.add_developer(user) - allow(NetworkPolicies::ResourcesService).to receive(:new).with(environment_id: environment.id.to_s, project: project) { service } - end - - it 'responds with policies' do - subject - - expect(response).to have_gitlab_http_status(:success) - expect(response.body).to eq([policy].to_json) - end - - include_examples 'CRUD service errors' - end - - context 'with unauthorized user' do - it 'returns unauthorized' do - subject - - expect(response).to have_gitlab_http_status(:forbidden) - end - end - end - - describe 'POST #create' do - subject(:request) { post :create, params: action_params.merge(manifest: manifest), format: :json } - - let(:service) { instance_double('NetworkPolicies::DeployResourceService', execute: ServiceResponse.success(payload: policy)) } - let(:policy) do - Gitlab::Kubernetes::NetworkPolicy.new( - name: 'policy', - namespace: 'another', - selector: { matchLabels: { role: 'db' } }, - ingress: [{ from: [{ namespaceSelector: { matchLabels: { project: 'myproject' } } }] }] - ) - end - - include_context '"Security & Compliance" permissions' do - let(:valid_request) { request } - - before_request do - group.add_developer(user) - end - end - - context 'with authorized user' do - before do - group.add_developer(user) - allow(NetworkPolicies::DeployResourceService).to( - receive(:new) - .with(manifest: manifest, environment: environment) - .and_return(service) - ) - end - - it 'responds with success' do - subject - - expect(response).to have_gitlab_http_status(:success) - expect(response.body).to eq(policy.to_json) - end - - include_examples 'CRUD service errors' - end - - context 'with unauthorized user' do - it 'returns unauthorized' do - subject - - expect(response).to have_gitlab_http_status(:forbidden) - end - end - end - - describe 'PUT #update' do - subject(:request) { put :update, params: action_params.merge(id: 'example-policy', manifest: manifest, enabled: enabled), as: :json } - - let(:enabled) { nil } - let(:service) { instance_double('NetworkPolicies::DeployResourceService', execute: ServiceResponse.success(payload: policy)) } - let(:policy) do - Gitlab::Kubernetes::NetworkPolicy.new( - name: 'policy', - namespace: 'another', - selector: { matchLabels: { role: 'db' } }, - ingress: [{ from: [{ namespaceSelector: { matchLabels: { project: 'myproject' } } }] }] - ) - end - - include_context '"Security & Compliance" permissions' do - let(:valid_request) { request } - - before_request do - group.add_developer(user) - end - end - - context 'with authorized user' do - before do - group.add_developer(user) - allow(NetworkPolicies::DeployResourceService).to( - receive(:new) - .with(manifest: manifest, environment: environment, enabled: enabled, resource_name: 'example-policy') - .and_return(service) - ) - end - - it 'responds with success' do - subject - - expect(response).to have_gitlab_http_status(:success) - expect(response.body).to eq(policy.to_json) - end - - include_examples 'CRUD service errors' - end - - context 'with unauthorized user' do - it 'returns unauthorized' do - subject - - expect(response).to have_gitlab_http_status(:forbidden) - end - end - end - - describe 'DELETE #destroy' do - subject(:request) { delete :destroy, params: action_params.merge(id: 'example-policy', manifest: manifest), format: :json } - - let(:service) { instance_double('NetworkPolicies::DeleteResourceService', execute: ServiceResponse.success) } - - include_context '"Security & Compliance" permissions' do - let(:valid_request) { request } - - before_request do - group.add_developer(user) - end - end - - context 'with authorized user' do - before do - group.add_developer(user) - allow(NetworkPolicies::DeleteResourceService).to( - receive(:new) - .with(environment: environment, manifest: manifest, resource_name: 'example-policy') - .and_return(service) - ) - end - - it 'responds with success' do - subject - - expect(response).to have_gitlab_http_status(:success) - end - - include_examples 'CRUD service errors' - end - - context 'with unauthorized user' do - it 'returns unauthorized' do - subject - - expect(response).to have_gitlab_http_status(:forbidden) - end - end - end -end diff --git a/ee/spec/helpers/ee/security_orchestration_helper_spec.rb b/ee/spec/helpers/ee/security_orchestration_helper_spec.rb index 9360bb0a004d83843a3ff29030ecd3db7d857ada..9490cc6b8bad3a7cfbaea4906e4de7ef8827fbe6 100644 --- a/ee/spec/helpers/ee/security_orchestration_helper_spec.rb +++ b/ee/spec/helpers/ee/security_orchestration_helper_spec.rb @@ -97,7 +97,6 @@ assigned_policy_project: nil.to_json, default_environment_id: -1, disable_scan_policy_update: 'false', - network_policies_endpoint: kind_of(String), create_agent_help_path: kind_of(String), environments_endpoint: kind_of(String), network_documentation_path: kind_of(String), diff --git a/ee/spec/routing/project_routing_spec.rb b/ee/spec/routing/project_routing_spec.rb index ed8ec6a27948c7104876fe9c85b54d375b920346..ae47aed8cc76541d2f8382aad2699d116ed32195 100644 --- a/ee/spec/routing/project_routing_spec.rb +++ b/ee/spec/routing/project_routing_spec.rb @@ -84,16 +84,4 @@ end end end - - describe Projects::Security::NetworkPoliciesController, 'routing' do - where(:id) do - %w[test.1.2 test-policy test:policy] - end - - with_them do - it "to #update" do - expect(put("/gitlab/gitlabhq/-/security/network_policies/#{id}")).to route_to('projects/security/network_policies#update', namespace_id: 'gitlab', project_id: 'gitlabhq', id: id) - end - end - end end