Permissions docs
This commit is contained in:
11
equinix/design/permissions-migration/home.org
Normal file
11
equinix/design/permissions-migration/home.org
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
#+TITLE: Permissions Migration Home
|
||||||
|
#+AUTHOR: Adam Mohammed
|
||||||
|
#+DATE: September 18, 2024
|
||||||
|
|
||||||
|
* Initial Design Doc
|
||||||
|
|
||||||
|
* Test Plan
|
||||||
|
|
||||||
|
* Architecture Design Review doc
|
||||||
|
|
||||||
|
* Permissions Overview for Handbook
|
||||||
@@ -0,0 +1,88 @@
|
|||||||
|
#+TITLE: Permissions Redesign
|
||||||
|
#+AUTHOR: Adam Mohammed
|
||||||
|
|
||||||
|
* Overview
|
||||||
|
|
||||||
|
This document describes what granularity we'll have available for MVP
|
||||||
|
when using permissions-api as the policy decision point (PDP).
|
||||||
|
|
||||||
|
* Top-Level Resources
|
||||||
|
|
||||||
|
** User Based Resources
|
||||||
|
|
||||||
|
- User
|
||||||
|
- APIKeys (bound to user)
|
||||||
|
|
||||||
|
** Project Level Resources
|
||||||
|
|
||||||
|
- Project (Read/update/delete)
|
||||||
|
- Instances
|
||||||
|
- Appliances
|
||||||
|
- Reservations (aka Hardware Reservations)
|
||||||
|
- Document
|
||||||
|
- IP Reservation
|
||||||
|
- IP Address
|
||||||
|
- IP Assignment
|
||||||
|
- Virtual Network
|
||||||
|
- Virtual Circuit
|
||||||
|
- Interconnection (Read/update)
|
||||||
|
- VRF
|
||||||
|
- Membership
|
||||||
|
- Invitations
|
||||||
|
- BGP Sessions
|
||||||
|
- BGP Configs
|
||||||
|
- Project API Keys
|
||||||
|
|
||||||
|
*** Lower-tier resources
|
||||||
|
|
||||||
|
- BGPDynamicNeighbors authorizes through MetalGateway
|
||||||
|
- ElasticIps authorizes through MetalGateway
|
||||||
|
|
||||||
|
- VRFIPReservation authorizes through VRF
|
||||||
|
- VRFLearnedRoutes authorizes through VRF
|
||||||
|
- VRFBGPNeighbors authorizes through VRF
|
||||||
|
- VRFStaticRoutes authorizes Through VRF
|
||||||
|
|
||||||
|
- Authorizes through Instance:
|
||||||
|
- Actions (reboot/power-cycle) (create, list)
|
||||||
|
- Ip Assignments (create, list only)
|
||||||
|
- Traffic (index only)
|
||||||
|
- Termination (POST only)
|
||||||
|
- BGPSessions (CRUD)
|
||||||
|
- BGPNeighbors (index only)
|
||||||
|
- Bandwidth (index only)
|
||||||
|
- SSH-keys (index only)
|
||||||
|
- Diagnostics (Read only)
|
||||||
|
- Metadata (read only)
|
||||||
|
- Userdata (read only)
|
||||||
|
- Error reports (create, read)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
** Organization Level Resources
|
||||||
|
|
||||||
|
- Organization
|
||||||
|
- Project (create-only)
|
||||||
|
- Interconnection (create/delete)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
** Weird ones
|
||||||
|
|
||||||
|
BGP Config Requestss
|
||||||
|
2FA enforce
|
||||||
|
|
||||||
|
* Phase 2
|
||||||
|
|
||||||
|
|
||||||
|
We decided to just throw actions on organizations/projects/user
|
||||||
|
|
||||||
|
|
||||||
|
ok, so I can configure the check access to dump out the context I need.
|
||||||
|
|
||||||
|
For every controller + action, I need:
|
||||||
|
The resource type the permission check is on
|
||||||
|
The action name that the check requires
|
||||||
|
|
||||||
|
|
||||||
|
With that I can produce the policy that we need on the Permissions API side
|
||||||
286
equinix/design/permissions-migration/policy.org
Normal file
286
equinix/design/permissions-migration/policy.org
Normal file
@@ -0,0 +1,286 @@
|
|||||||
|
#+TITLE: Metal API Policy
|
||||||
|
#+AUTHOR: Adam Mohammed
|
||||||
|
* How to produce this information?
|
||||||
|
Using this snippet placed in =config/initializers/packet.rb=
|
||||||
|
#+begin_src ruby
|
||||||
|
def permission_logger
|
||||||
|
Class.new do
|
||||||
|
def initialize(db)
|
||||||
|
@db = db
|
||||||
|
end
|
||||||
|
|
||||||
|
def permissions_sql
|
||||||
|
<<-SQL
|
||||||
|
INSERT INTO metal_permissions (
|
||||||
|
controller_name, path, resource, action
|
||||||
|
) VALUES ( ?, ?, ?, ?);
|
||||||
|
SQL
|
||||||
|
end
|
||||||
|
|
||||||
|
def check_access(*args, **kwargs)
|
||||||
|
context = kwargs[:context]
|
||||||
|
controller = context[:controller]
|
||||||
|
path = controller.request.path
|
||||||
|
controller_action = "#{controller.class.name}##{controller.action_name}"
|
||||||
|
@db.execute(permissions_sql, [controller_action, path, args[1], args[2]])
|
||||||
|
true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def permissions_checker
|
||||||
|
::Authorization::PolicyEngine::IAMChecker.new(client: permission_logger.new(sqlite_db))
|
||||||
|
end
|
||||||
|
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
I then pushed a branch so the standard CI pipeline build would spit out
|
||||||
|
a DB with the results:
|
||||||
|
|
||||||
|
#+begin_src diff
|
||||||
|
modified .buildkite/pipeline.yaml
|
||||||
|
@@ -96,6 +96,8 @@ steps:
|
||||||
|
commands:
|
||||||
|
- /home/packet/api/.buildkite/script/parallel_test_setup.sh
|
||||||
|
- /home/packet/api/.buildkite/script/cucumber-container.sh
|
||||||
|
+ artifact_paths:
|
||||||
|
+ - 'test.db'
|
||||||
|
retry:
|
||||||
|
automatic:
|
||||||
|
- exit_status: "*"
|
||||||
|
@@ -109,6 +111,7 @@ steps:
|
||||||
|
env:
|
||||||
|
BUILD_NUMBER: ${BUILDKITE_BUILD_NUMBER}
|
||||||
|
API_BUILD_IMAGE: ${API_BUILD_IMAGE}
|
||||||
|
+ POLICY_ENGINE: "cancancan_wins"
|
||||||
|
|
||||||
|
- label: Rspec
|
||||||
|
key: "rspec"
|
||||||
|
@@ -117,6 +120,8 @@ steps:
|
||||||
|
commands:
|
||||||
|
- /home/packet/api/.buildkite/script/parallel_test_setup.sh
|
||||||
|
- /home/packet/api/.buildkite/script/rspec-container.sh
|
||||||
|
+ artifact_paths:
|
||||||
|
+ - 'test.db'
|
||||||
|
retry:
|
||||||
|
automatic:
|
||||||
|
- exit_status: "*"
|
||||||
|
@@ -132,6 +137,7 @@ steps:
|
||||||
|
env:
|
||||||
|
BUILD_NUMBER: ${BUILDKITE_BUILD_NUMBER}
|
||||||
|
API_BUILD_IMAGE: ${API_BUILD_IMAGE}
|
||||||
|
+ POLICY_ENGINE: "cancancan_wins"
|
||||||
|
|
||||||
|
- label: Build spec image
|
||||||
|
key: "spec-build"
|
||||||
|
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
If later you want to combine these dbs you can do so as follows:
|
||||||
|
|
||||||
|
1. Download =test.db= from the rspec step and name it =test-rspec.db=
|
||||||
|
2. Download =test.db= from the cucumber step and name it =test-cucumber.db=
|
||||||
|
3. Create the merged =test-full-suite.db=
|
||||||
|
#+begin_src bash
|
||||||
|
$ cp test-rspec.db test-full-suite.db
|
||||||
|
$ sqlite3 'test-full-suite.db'
|
||||||
|
sqlite> ATTACH 'test-cucumber' AS cuke
|
||||||
|
sqlite> BEGIN;
|
||||||
|
sqlite> INSERT INTO metal_permissions SELECT * FROM cuke.metal_permissions;
|
||||||
|
sqlite> COMMIT;
|
||||||
|
sqlite> DETACH cuke;
|
||||||
|
sqlite> .quit
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
|
||||||
|
* Organization actions
|
||||||
|
#+begin_src
|
||||||
|
metal_billing_information_get
|
||||||
|
metal_billing_information_update
|
||||||
|
metal_capability_list
|
||||||
|
metal_coupon_usage_list
|
||||||
|
metal_coupon_usage_redeem
|
||||||
|
metal_credit_create
|
||||||
|
metal_credit_delete
|
||||||
|
metal_credit_list
|
||||||
|
metal_discount_create
|
||||||
|
metal_enforce_2fa_create
|
||||||
|
metal_instances_listing_list
|
||||||
|
metal_interconnection_create
|
||||||
|
metal_interconnection_delete
|
||||||
|
metal_interconnection_get
|
||||||
|
metal_interconnection_list
|
||||||
|
metal_interconnection_port_get
|
||||||
|
metal_interconnection_port_list
|
||||||
|
metal_interconnection_update
|
||||||
|
metal_interconnection_virtual_circuit_create
|
||||||
|
metal_interconnection_virtual_circuit_list
|
||||||
|
metal_interconnection_virtual_circuit_update
|
||||||
|
metal_invitation_create
|
||||||
|
metal_invitation_delete
|
||||||
|
metal_invitation_get
|
||||||
|
metal_invitation_list
|
||||||
|
metal_invitation_resend
|
||||||
|
metal_invitation_update
|
||||||
|
metal_ip_address_delete
|
||||||
|
metal_ip_address_get
|
||||||
|
metal_lab_get
|
||||||
|
metal_leave_organization_create
|
||||||
|
metal_member_delete
|
||||||
|
metal_member_list
|
||||||
|
metal_member_update
|
||||||
|
metal_membership_delete
|
||||||
|
metal_membership_update
|
||||||
|
metal_organization_create
|
||||||
|
metal_organization_delete
|
||||||
|
metal_organization_get
|
||||||
|
metal_organization_logos
|
||||||
|
metal_organization_update
|
||||||
|
metal_payment_get
|
||||||
|
metal_payment_method_create
|
||||||
|
metal_payment_method_delete
|
||||||
|
metal_payment_method_get
|
||||||
|
metal_payment_method_list
|
||||||
|
metal_payment_method_update
|
||||||
|
metal_project_create
|
||||||
|
metal_search_search_plans
|
||||||
|
metal_tier_inquiry_create
|
||||||
|
metal_vendor_list
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
* Project actions
|
||||||
|
|
||||||
|
#+begin_src
|
||||||
|
metal_acl_list
|
||||||
|
metal_activate_create
|
||||||
|
metal_allocation_list
|
||||||
|
metal_batch_delete
|
||||||
|
metal_batch_get
|
||||||
|
metal_batch_list
|
||||||
|
metal_bgp_config_delete
|
||||||
|
metal_bgp_config_request_create
|
||||||
|
metal_bgp_config_update
|
||||||
|
metal_bgp_config_view
|
||||||
|
metal_bgp_dynamic_neighbor_create
|
||||||
|
metal_bgp_dynamic_neighbor_list
|
||||||
|
metal_bgp_neighbor_list
|
||||||
|
metal_bgp_session_create
|
||||||
|
metal_bgp_session_delete
|
||||||
|
metal_bgp_session_get
|
||||||
|
metal_bgp_session_list
|
||||||
|
metal_bgp_session_update
|
||||||
|
metal_discount_create
|
||||||
|
metal_dn_create
|
||||||
|
metal_dn_list
|
||||||
|
metal_ecx_connection_create
|
||||||
|
metal_ecx_connection_list
|
||||||
|
metal_error_report_create
|
||||||
|
metal_error_report_get
|
||||||
|
metal_event_alert_configuration_create
|
||||||
|
metal_event_alert_configuration_get
|
||||||
|
metal_event_alert_configuration_update
|
||||||
|
metal_firmware_set_get
|
||||||
|
metal_global_bgp_range_list
|
||||||
|
metal_hardware_reservation_get
|
||||||
|
metal_health_get
|
||||||
|
metal_instance_action_create
|
||||||
|
metal_instance_action_list
|
||||||
|
metal_instance_batch_create
|
||||||
|
metal_instance_create
|
||||||
|
metal_instance_delete
|
||||||
|
metal_instance_get
|
||||||
|
metal_instance_list
|
||||||
|
metal_instance_metadatum_show_by_ip
|
||||||
|
metal_instance_password_create
|
||||||
|
metal_instance_update
|
||||||
|
metal_instances_listing_list
|
||||||
|
metal_interconnection_create
|
||||||
|
metal_interconnection_list
|
||||||
|
metal_interconnection_virtual_circuit_create
|
||||||
|
metal_interconnection_virtual_circuit_list
|
||||||
|
metal_interconnection_virtual_circuit_update
|
||||||
|
metal_invitation_create
|
||||||
|
metal_invitation_list
|
||||||
|
metal_ip_address_delete
|
||||||
|
metal_ip_address_get
|
||||||
|
metal_ip_address_update
|
||||||
|
metal_ip_assignment_create
|
||||||
|
metal_ip_assignment_list
|
||||||
|
metal_ip_availability_available
|
||||||
|
metal_ip_reservation_create
|
||||||
|
metal_ip_reservation_list
|
||||||
|
metal_ip_reservation_request_create
|
||||||
|
metal_ip_reservation_update
|
||||||
|
metal_leave_project_create
|
||||||
|
metal_license_activation_get
|
||||||
|
metal_license_create
|
||||||
|
metal_license_delete
|
||||||
|
metal_license_get
|
||||||
|
metal_license_list
|
||||||
|
metal_license_update
|
||||||
|
metal_membership_delete
|
||||||
|
metal_membership_get
|
||||||
|
metal_membership_list
|
||||||
|
metal_membership_update
|
||||||
|
metal_metal_gateway_create
|
||||||
|
metal_metal_gateway_delete
|
||||||
|
metal_metal_gateway_elastic_ip_create
|
||||||
|
metal_metal_gateway_elastic_ip_list
|
||||||
|
metal_metal_gateway_get
|
||||||
|
metal_metal_gateway_list
|
||||||
|
metal_metering_limit_create
|
||||||
|
metal_move_create
|
||||||
|
metal_project_api_key_create
|
||||||
|
metal_project_api_key_list
|
||||||
|
metal_project_create
|
||||||
|
metal_project_delete
|
||||||
|
metal_project_get
|
||||||
|
metal_project_update
|
||||||
|
metal_reservation_create
|
||||||
|
metal_reservation_get
|
||||||
|
metal_reservation_list
|
||||||
|
metal_screenshot_get
|
||||||
|
metal_spot_market_request_create
|
||||||
|
metal_spot_market_request_delete
|
||||||
|
metal_spot_market_request_get
|
||||||
|
metal_spot_market_request_list
|
||||||
|
metal_subscribed_event_create
|
||||||
|
metal_subscribed_event_delete
|
||||||
|
metal_subscribed_event_get
|
||||||
|
metal_subscribed_event_list
|
||||||
|
metal_subscribed_events_all_create
|
||||||
|
metal_subscribed_events_all_delete
|
||||||
|
metal_traffic_list
|
||||||
|
metal_transfer_request_create
|
||||||
|
metal_transfer_request_delete
|
||||||
|
metal_transfer_request_get
|
||||||
|
metal_transfer_request_update
|
||||||
|
metal_userdatum_show_by_ip
|
||||||
|
metal_virtual_network_create
|
||||||
|
metal_virtual_network_delete
|
||||||
|
metal_virtual_network_get
|
||||||
|
metal_virtual_network_list
|
||||||
|
metal_virtual_network_update
|
||||||
|
metal_vrf_create
|
||||||
|
metal_vrf_delete
|
||||||
|
metal_vrf_get
|
||||||
|
metal_vrf_list
|
||||||
|
metal_vrf_route_create
|
||||||
|
metal_vrf_route_delete
|
||||||
|
metal_vrf_route_get
|
||||||
|
metal_vrf_route_list
|
||||||
|
metal_vrf_route_update
|
||||||
|
metal_vrf_update
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
* User actions
|
||||||
|
|
||||||
|
#+begin_src
|
||||||
|
metal_discount_create
|
||||||
|
metal_metering_limit_create
|
||||||
|
metal_sales_report_get
|
||||||
|
metal_user_avatars
|
||||||
|
metal_user_force_verify
|
||||||
|
metal_user_get
|
||||||
|
metal_user_update
|
||||||
|
#+end_src
|
||||||
23
equinix/design/permissions-migration/test-plan.org
Normal file
23
equinix/design/permissions-migration/test-plan.org
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
#+TITLE: Testing IAM-Runtime checks for Metal API
|
||||||
|
#+AUTHOR: Adam Mohammed
|
||||||
|
|
||||||
|
* What's changed
|
||||||
|
|
||||||
|
* Stages of testing
|
||||||
|
- Initial Canary
|
||||||
|
- Run terraform against internal canary URL
|
||||||
|
- Slow roll to production
|
||||||
|
- Watch for errors
|
||||||
|
- In-production warn mode
|
||||||
|
- Observe for discrepancies between cancancan/iam-runtime
|
||||||
|
- Runtime winning mode
|
||||||
|
- Completed
|
||||||
|
|
||||||
|
* Monitoring
|
||||||
|
- Trace attributes that are relevant
|
||||||
|
|
||||||
|
- Dashboards
|
||||||
|
- Create dashboard around cancancan disagreements
|
||||||
|
- Create dashboard where resource was not metal org/project/user
|
||||||
|
|
||||||
|
* Handling broken cases
|
||||||
Reference in New Issue
Block a user