Migrate all `attr_encrypted` attributes to `ActiveRecord::Encryption`
## Generic process
### Preliminary notes
- A `migrate_to_encrypts` helper method is introduced to simplify the model code changes.
- You will need to create a [Batched Background Migration](https://docs.gitlab.com/ee/development/database/batched_background_migrations.html) to migrate encrypted data.
### Process
- In release M:
- Create a migration to add a `tmp_<field>` column
- In the model, replace `attr_encrypted` with `migrate_to_encrypts`
- Create a [Batched Background Migration](https://docs.gitlab.com/ee/development/database/batched_background_migrations.html) to populate the new `tmp_<field>` column from the `attr_encrypted` column. The background migration should define the model inline, and set each encrypted attribute to migrate with the value of the legacy encrypted attribute, e.g.
```ruby
# frozen_string_literal: true
module Gitlab
module BackgroundMigration
class MigrateAssetProxySecretKeyToNewEncryptionFramework < BatchedMigrationJob
operation_name :migrate_asset_proxy_secret_key_to_new_encryption_framework
feature_category :cell
# Class that is imitating ApplicationSetting
class ApplicationSetting < ::ApplicationRecord
include Gitlab::EncryptedAttribute
migrate_to_encrypts :asset_proxy_secret_key,
mode: :per_attribute_iv,
key: :db_key_base_truncated,
algorithm: 'aes-256-cbc',
insecure_mode: true
end
def perform
each_sub_batch do |sub_batch|
sub_batch.each do |application_setting|
application_setting = Gitlab::BackgroundMigration::MigrateAssetProxySecretKeyToNewEncryptionFramework::ApplicationSetting
.find(application_setting.id)
next if application_setting.asset_proxy_secret_key.empty?
application_setting.asset_proxy_secret_key = application_setting.attr_encrypted_asset_proxy_secret_key
application_setting.save!
end
end
end
end
end
end
```
- Handle `<field>` queries to first try `tmp_<field>` and fallback to `<field>`
- In release M+1:
- Check if the BBM has finished on GitLab.com. If it has finished, it's time to [finalize the migration with the `skip_early_finalization_validation: true` argument](https://docs.gitlab.com/development/database/batched_background_migrations/#finalize-a-batched-background-migration) (e.g. https://gitlab.com/gitlab-org/gitlab/-/merge_requests/117483).
- Rename the `tmp_<field>` column to `<field>` (with [a normal](https://docs.gitlab.com/ee/development/database/avoiding_downtime_in_migrations.html#add-the-regular-migration-release-m) and [a post-deploy migration](https://docs.gitlab.com/ee/development/database/avoiding_downtime_in_migrations.html#add-a-post-deployment-migration-release-m))
- Change `migrate_to_encrypts :<field>, [extra_args]` to just `encrypts :<field>`, the application will just use the behavior from AR::Encryption from now on
- [Ignore the `tmp_<field>` column with `ignore_column :tmp_<field> ...`](https://docs.gitlab.com/ee/development/database/avoiding_downtime_in_migrations.html#ignore-the-column-release-m) (`remove_with:` should be set to M+2)
- [Ignore the `encrypted_<field>`, `encrypted_<field>_iv`, and `encrypted_<field>_salt` columns with `ignore_columns %i[encrypted_<field> encrypted_<field>_iv encrypted_<field>_salt] ...`](https://docs.gitlab.com/ee/development/database/avoiding_downtime_in_migrations.html#ignoring-the-column-release-m) (`remove_with:` should be set to M+3)
- In release M+2:
- [Drop the `encrypted_<field>`, `encrypted_<field>_iv`, and `encrypted_<field>_salt` columns](https://docs.gitlab.com/ee/development/database/avoiding_downtime_in_migrations.html#dropping-the-column-release-m1)
- [Remove `ignore_column :tmp_<field> ...`](https://docs.gitlab.com/ee/development/database/avoiding_downtime_in_migrations.html#remove-the-ignore-rule-release-m1)
- In release M+3:
- [Remove `ignore_columns %i[encrypted_<field> encrypted_<field>_iv encrypted_<field>_salt] ...`](https://docs.gitlab.com/ee/development/database/avoiding_downtime_in_migrations.html#removing-the-ignore-rule-release-m2)
## Resource
- https://pagertree.com/blog/migrate-attr_encrypted-to-rails-7-active-record-encrypts
## Estimate
Given we have 104 attributes to migrate, each attributes requires 3 days of work, it's 312 days of work.
This is a long project that isn't a blocker for Cells 1.0, but would be better to be done for Cells 1.5.
## Attributes to migrate
### Per-group summary
| Group | Count | Example Models |
| --- | --- | --- |
| Cells Infrastructure | 32 | ApplicationSetting |
| Import and Integrate | 16 | Integration, WebHooks::Hook, Atlassian::Identity |
| Package Registry | 8 | DependencyProxy::Packages::Setting, Packages::Debian::ProjectDistributionKey |
| Compliance | 8 | ComplianceManagement::ComplianceFramework::ComplianceRequirementsControl, AuditEvents::Instance::ExternalStreamingDestination |
| Environments | 7 | Clusters::Providers::Gcp, Clusters::Platforms::Kubernetes |
| Pipeline Authoring | 6 | Ci::JobVariable, Ci::GroupVariable, Ci::Variable |
| Authentication | 4 | SystemAccess::MicrosoftGraphAccessToken, SystemAccess::MicrosoftApplication |
| Source Code | 4 | RemoteMirror, Snippet, ProjectSnippet |
| Service Desk | 3 | ServiceDesk::CustomEmailVerification, ServiceDesk::CustomEmailCredential |
| Project Management | 3 | JiraConnectInstallation, ProjectSetting |
| Incident Management | 2 | StatusPage::ProjectSetting, IncidentManagement::ProjectIncidentManagementSetting |
| Observability | 2 | ErrorTracking::ProjectErrorTrackingSetting, GrafanaIntegration |
| Platform Insights | 2 | Alerting::ProjectAlertingSetting, AlertManagement::HttpIntegration |
| Pages | 2 | PagesDomainAcmeOrder, PagesDomain |
| Cloud Connector | 1 | CloudConnector::ServiceAccessToken |
| Notifications | 1 | ChatName |
| Custom Models | 1 | Ai::SelfHostedModel |
| Code Review | 1 | MergeRequests::ExternalStatusCheck |
| Remote Development | 1 | RemoteDevelopment::WorkspaceVariable |
| Geo | 1 | GeoNode |
| User Management | 1 | User |
| Dynamic Analysis | 1 | Dast::SiteProfileSecretVariable |
| Pipeline Security | 1 | Ci::Trigger |
### Exhaustive list of attributes per group
<details><summary>Click to expand</summary>
| Group | Model | Attribute | Table Size |
| ----- | ----- | --------- | ---------- |
| Authentication | SystemAccess::GroupMicrosoftApplication | client_secret | small |
| Authentication | SystemAccess::GroupMicrosoftGraphAccessToken | token | small |
| Authentication | SystemAccess::MicrosoftApplication | client_secret | small |
| Authentication | SystemAccess::MicrosoftGraphAccessToken | token | small |
| Cells Infrastructure | ApplicationSetting | akismet_api_key | small |
| Cells Infrastructure | ApplicationSetting | arkose_labs_client_secret | small |
| Cells Infrastructure | ApplicationSetting | arkose_labs_client_xid | small |
| Cells Infrastructure | ApplicationSetting | arkose_labs_data_exchange_key | small |
| Cells Infrastructure | ApplicationSetting | arkose_labs_private_api_key | small |
| Cells Infrastructure | ApplicationSetting | arkose_labs_public_api_key | small |
| Cells Infrastructure | ApplicationSetting | asset_proxy_secret_key | small |
| Cells Infrastructure | ApplicationSetting | ci_job_token_signing_key | small |
| Cells Infrastructure | ApplicationSetting | ci_jwt_signing_key | small |
| Cells Infrastructure | ApplicationSetting | cloud_license_auth_token | small |
| Cells Infrastructure | ApplicationSetting | cube_api_key | small |
| Cells Infrastructure | ApplicationSetting | customers_dot_jwt_signing_key | small |
| Cells Infrastructure | ApplicationSetting | database_grafana_api_key | small |
| Cells Infrastructure | ApplicationSetting | eks_secret_access_key | small |
| Cells Infrastructure | ApplicationSetting | elasticsearch_aws_secret_access_key | small |
| Cells Infrastructure | ApplicationSetting | elasticsearch_password | small |
| Cells Infrastructure | ApplicationSetting | external_auth_client_key | small |
| Cells Infrastructure | ApplicationSetting | external_auth_client_key_pass | small |
| Cells Infrastructure | ApplicationSetting | external_pipeline_validation_service_token | small |
| Cells Infrastructure | ApplicationSetting | lets_encrypt_private_key | small |
| Cells Infrastructure | ApplicationSetting | mailgun_signing_key | small |
| Cells Infrastructure | ApplicationSetting | product_analytics_configurator_connection_string | small |
| Cells Infrastructure | ApplicationSetting | recaptcha_private_key | small |
| Cells Infrastructure | ApplicationSetting | recaptcha_site_key | small |
| Cells Infrastructure | ApplicationSetting | secret_detection_service_auth_token | small |
| Cells Infrastructure | ApplicationSetting | secret_detection_token_revocation_token | small |
| Cells Infrastructure | ApplicationSetting | slack_app_secret | small |
| Cells Infrastructure | ApplicationSetting | slack_app_signing_secret | small |
| Cells Infrastructure | ApplicationSetting | slack_app_verification_token | small |
| Cells Infrastructure | ApplicationSetting | spam_check_api_key | small |
| Cells Infrastructure | ApplicationSetting | telesign_api_key | small |
| Cells Infrastructure | ApplicationSetting | telesign_customer_xid | small |
| Cloud Connector | CloudConnector::ServiceAccessToken | token | small |
| Code Review | MergeRequests::ExternalStatusCheck | shared_secret | small |
| Compliance | AuditEvents::AmazonS3Configuration | secret_access_key | small |
| Compliance | AuditEvents::GoogleCloudLoggingConfiguration | private_key | small |
| Compliance | AuditEvents::Group::ExternalStreamingDestination | secret_token | small |
| Compliance | AuditEvents::Instance::AmazonS3Configuration | secret_access_key | small |
| Compliance | AuditEvents::Instance::ExternalStreamingDestination | secret_token | small |
| Compliance | AuditEvents::Instance::GoogleCloudLoggingConfiguration | private_key | small |
| Compliance | AuditEvents::InstanceExternalAuditEventDestination | verification_token | small |
| Compliance | ComplianceManagement::ComplianceFramework::ComplianceRequirementsControl | secret_token | small |
| Custom Models | Ai::SelfHostedModel | api_token | small |
| Dynamic Analysis | Dast::SiteProfileSecretVariable | value | small |
| Environments | Clusters::Agents::UrlConfiguration | private_key | small |
| Environments | Clusters::Integrations::Prometheus | alert_manager_token | small |
| Environments | Clusters::KubernetesNamespace | service_account_token | small |
| Environments | Clusters::Platforms::Kubernetes | password | small |
| Environments | Clusters::Platforms::Kubernetes | token | small |
| Environments | Clusters::Providers::Aws | secret_access_key | small |
| Environments | Clusters::Providers::Gcp | access_token | small |
| Geo | GeoNode | secret_access_key | small |
| Import and Integrate | Atlassian::Identity | refresh_token | small |
| Import and Integrate | Atlassian::Identity | token | small |
| Import and Integrate | BulkImports::Configuration | access_token | small |
| Import and Integrate | BulkImports::Configuration | url | small |
| Import and Integrate | Integration | properties | small |
| Import and Integrate | Integrations::AmazonQ | properties | small |
| Import and Integrate | Integrations::AppleAppStore | properties | small |
| Import and Integrate | Integrations::Asana | properties | small |
| Import and Integrate | Integrations::Assembla | properties | small |
| Import and Integrate | Integrations::Bamboo | properties | small |
| Import and Integrate | Integrations::BeyondIdentity | properties | small |
| Import and Integrate | Integrations::Bugzilla | properties | small |
| Import and Integrate | Integrations::Buildkite | properties | small |
| Import and Integrate | Integrations::Campfire | properties | small |
| Import and Integrate | Integrations::Clickup | properties | small |
| Import and Integrate | Integrations::Confluence | properties | small |
| Import and Integrate | Integrations::CustomIssueTracker | properties | small |
| Import and Integrate | Integrations::Datadog | properties | small |
| Import and Integrate | Integrations::DiffblueCover | properties | small |
| Import and Integrate | Integrations::Discord | properties | small |
| Import and Integrate | Integrations::DroneCi | properties | small |
| Import and Integrate | Integrations::EmailsOnPush | properties | small |
| Import and Integrate | Integrations::ExternalWiki | properties | small |
| Import and Integrate | Integrations::Ewm | properties | small |
| Import and Integrate | Integrations::GitGuardian | properties | small |
| Import and Integrate | Integrations::Github | properties | small |
| Import and Integrate | Integrations::GitlabSlackApplication | properties | small |
| Import and Integrate | Integrations::GoogleCloudPlatform::ArtifactRegistry | properties | small |
| Import and Integrate | Integrations::GoogleCloudPlatform::WorkloadIdentityFederation | properties | small |
| Import and Integrate | Integrations::GooglePlay | properties | small |
| Import and Integrate | Integrations::HangoutsChat | properties | small |
| Import and Integrate | Integrations::Harbor | properties | small |
| Import and Integrate | Integrations::Instance::AmazonQ | properties | small |
| Import and Integrate | Integrations::Instance::Asana | properties | small |
| Import and Integrate | Integrations::Instance::Assembla | properties | small |
| Import and Integrate | Integrations::Instance::Bamboo | properties | small |
| Import and Integrate | Integrations::Instance::BeyondIdentity | properties | small |
| Import and Integrate | Integrations::Instance::Bugzilla | properties | small |
| Import and Integrate | Integrations::Instance::Buildkite | properties | small |
| Import and Integrate | Integrations::Instance::Clickup | properties | small |
| Import and Integrate | Integrations::Instance::Confluence | properties | small |
| Import and Integrate | Integrations::Instance::CustomIssueTracker | properties | small |
| Import and Integrate | Integrations::Instance::Datadog | properties | small |
| Import and Integrate | Integrations::Instance::DiffblueCover | properties | small |
| Import and Integrate | Integrations::Instance::Discord | properties | small |
| Import and Integrate | Integrations::Instance::DroneCi | properties | small |
| Import and Integrate | Integrations::Instance::EmailsOnPush | properties | small |
| Import and Integrate | Integrations::Instance::Ewm | properties | small |
| Import and Integrate | Integrations::Instance::ExternalWiki | properties | small |
| Import and Integrate | Integrations::Instance::GitGuardian | properties | small |
| Import and Integrate | Integrations::Instance::HangoutsChat | properties | small |
| Import and Integrate | Integrations::Instance::Harbor | properties | small |
| Import and Integrate | Integrations::Instance::Integration | properties | small |
| Import and Integrate | Integrations::Instance::Irker | properties | small |
| Import and Integrate | Integrations::Instance::Jira | properties | small |
| Import and Integrate | Integrations::Instance::Mattermost | properties | small |
| Import and Integrate | Integrations::Instance::MattermostSlashCommands | properties | small |
| Import and Integrate | Integrations::Instance::Matrix | properties | small |
| Import and Integrate | Integrations::Instance::MicrosoftTeams | properties | small |
| Import and Integrate | Integrations::Instance::MockCi | properties | small |
| Import and Integrate | Integrations::Instance::MockMonitoring | properties | small |
| Import and Integrate | Integrations::Instance::Packagist | properties | small |
| Import and Integrate | Integrations::Instance::Phorge | properties | small |
| Import and Integrate | Integrations::Instance::PipelinesEmail | properties | small |
| Import and Integrate | Integrations::Instance::Pivotaltracker | properties | small |
| Import and Integrate | Integrations::Instance::Pumble | properties | small |
| Import and Integrate | Integrations::Instance::Pushover | properties | small |
| Import and Integrate | Integrations::Instance::Redmine | properties | small |
| Import and Integrate | Integrations::Instance::Slack | properties | small |
| Import and Integrate | Integrations::Instance::SlackSlashCommands | properties | small |
| Import and Integrate | Integrations::Instance::SquashTm | properties | small |
| Import and Integrate | Integrations::Instance::Teamcity | properties | small |
| Import and Integrate | Integrations::Instance::Telegram | properties | small |
| Import and Integrate | Integrations::Instance::UnifyCircuit | properties | small |
| Import and Integrate | Integrations::Instance::WebexTeams | properties | small |
| Import and Integrate | Integrations::Instance::Youtrack | properties | small |
| Import and Integrate | Integrations::Instance::Zentao | properties | small |
| Import and Integrate | Integrations::Irker | properties | small |
| Import and Integrate | Integrations::IssueTrackerData | issues_url | small |
| Import and Integrate | Integrations::IssueTrackerData | new_issue_url | small |
| Import and Integrate | Integrations::IssueTrackerData | project_url | small |
| Import and Integrate | Integrations::Jenkins | properties | small |
| Import and Integrate | Integrations::Jira | properties | small |
| Import and Integrate | Integrations::JiraCloudApp | properties | small |
| Import and Integrate | Integrations::JiraTrackerData | api_url | small |
| Import and Integrate | Integrations::JiraTrackerData | password | small |
| Import and Integrate | Integrations::JiraTrackerData | url | small |
| Import and Integrate | Integrations::JiraTrackerData | username | small |
| Import and Integrate | Integrations::Matrix | properties | small |
| Import and Integrate | Integrations::Mattermost | properties | small |
| Import and Integrate | Integrations::MattermostSlashCommands | properties | small |
| Import and Integrate | Integrations::MicrosoftTeams | properties | small |
| Import and Integrate | Integrations::MockCi | properties | small |
| Import and Integrate | Integrations::MockMonitoring | properties | small |
| Import and Integrate | Integrations::Packagist | properties | small |
| Import and Integrate | Integrations::Phorge | properties | small |
| Import and Integrate | Integrations::PipelinesEmail | properties | small |
| Import and Integrate | Integrations::Pivotaltracker | properties | small |
| Import and Integrate | Integrations::Prometheus | properties | small |
| Import and Integrate | Integrations::Pumble | properties | small |
| Import and Integrate | Integrations::Pushover | properties | small |
| Import and Integrate | Integrations::Redmine | properties | small |
| Import and Integrate | Integrations::Slack | properties | small |
| Import and Integrate | Integrations::SlackSlashCommands | properties | small |
| Import and Integrate | Integrations::SquashTm | properties | small |
| Import and Integrate | Integrations::Teamcity | properties | small |
| Import and Integrate | Integrations::Telegram | properties | small |
| Import and Integrate | Integrations::UnifyCircuit | properties | small |
| Import and Integrate | Integrations::WebexTeams | properties | small |
| Import and Integrate | Integrations::Youtrack | properties | small |
| Import and Integrate | Integrations::Zentao | properties | small |
| Import and Integrate | Integrations::ZentaoTrackerData | api_token | small |
| Import and Integrate | Integrations::ZentaoTrackerData | api_url | small |
| Import and Integrate | Integrations::ZentaoTrackerData | url | small |
| Import and Integrate | Integrations::ZentaoTrackerData | zentao_product_xid | small |
| Import and Integrate | ProjectImportData | credentials | small |
| Import and Integrate | SlackIntegration | bot_access_token | small |
| Incident Management | IncidentManagement::ProjectIncidentManagementSetting | pagerduty_token | small |
| Incident Management | StatusPage::ProjectSetting | aws_secret_key | small |
| Notifications | ChatName | token | small |
| Observability | ErrorTracking::ProjectErrorTrackingSetting | token | small |
| Observability | GrafanaIntegration | token | small |
| Package Registry | DependencyProxy::Packages::Setting | maven_external_registry_password | small |
| Package Registry | DependencyProxy::Packages::Setting | maven_external_registry_username | small |
| Package Registry | DependencyProxy::Packages::Setting | npm_external_registry_auth_token | small |
| Package Registry | DependencyProxy::Packages::Setting | npm_external_registry_basic_auth | small |
| Package Registry | Packages::Debian::GroupDistributionKey | passphrase | small |
| Package Registry | Packages::Debian::GroupDistributionKey | private_key | small |
| Package Registry | Packages::Debian::ProjectDistributionKey | passphrase | small |
| Package Registry | Packages::Debian::ProjectDistributionKey | private_key | small |
| Pages | PagesDomain | key | small |
| Pages | PagesDomainAcmeOrder | private_key | small |
| Pipeline Authoring | Ci::GroupVariable | value | small |
| Pipeline Authoring | Ci::InstanceVariable | value | small |
| Pipeline Authoring | Ci::JobVariable | value | over_limit |
| Pipeline Authoring | Ci::PipelineScheduleVariable | value | small |
| Pipeline Authoring | Ci::PipelineVariable | value | small |
| Pipeline Authoring | Ci::Variable | value | small |
| Pipeline Security | Ci::Trigger | encrypted_token_tmp | small |
| Platform Insights | AlertManagement::HttpIntegration | token | small |
| Platform Insights | Alerting::ProjectAlertingSetting | token | small |
| Project Management | JiraConnectInstallation | shared_secret | small |
| Project Management | ProjectSetting | cube_api_key | small |
| Project Management | ProjectSetting | product_analytics_configurator_connection_string | small |
| Remote Development | RemoteDevelopment::WorkspaceVariable | value | small |
| Service Desk | ServiceDesk::CustomEmailCredential | smtp_password | small |
| Service Desk | ServiceDesk::CustomEmailCredential | smtp_username | small |
| Service Desk | ServiceDesk::CustomEmailVerification | token | small |
| Source Code | PersonalSnippet | secret_token | small |
| Source Code | ProjectSnippet | secret_token | small |
| Source Code | RemoteMirror | credentials | small |
| Source Code | Snippet | secret_token | small |
| User Management | User | otp_secret | medium |
| Import and Integrate | WebHooks::Hook | custom_headers | small |
| Import and Integrate | WebHooks::Hook | token | small |
| Import and Integrate | WebHooks::Hook | url | small |
| Import and Integrate | WebHooks::Hook | url_variables | small |
</details>
### Exhaustive JSON of attributes per group
<details><summary>Click to expand</summary>
```json
[
{
"model": "DependencyProxy::Packages::Setting",
"attribute": "maven_external_registry_username",
"table_size_categorization": "small",
"group_name": "Package Registry",
"group_key": "package_registry"
},
{
"model": "DependencyProxy::Packages::Setting",
"attribute": "maven_external_registry_password",
"table_size_categorization": "small",
"group_name": "Package Registry",
"group_key": "package_registry"
},
{
"model": "DependencyProxy::Packages::Setting",
"attribute": "npm_external_registry_basic_auth",
"table_size_categorization": "small",
"group_name": "Package Registry",
"group_key": "package_registry"
},
{
"model": "DependencyProxy::Packages::Setting",
"attribute": "npm_external_registry_auth_token",
"table_size_categorization": "small",
"group_name": "Package Registry",
"group_key": "package_registry"
},
{
"model": "SystemAccess::MicrosoftGraphAccessToken",
"attribute": "token",
"table_size_categorization": "small",
"group_name": "Authentication",
"group_key": "authentication"
},
{
"model": "SystemAccess::MicrosoftApplication",
"attribute": "client_secret",
"table_size_categorization": "small",
"group_name": "Authentication",
"group_key": "authentication"
},
{
"model": "SystemAccess::GroupMicrosoftGraphAccessToken",
"attribute": "token",
"table_size_categorization": "small",
"group_name": "Authentication",
"group_key": "authentication"
},
{
"model": "SystemAccess::GroupMicrosoftApplication",
"attribute": "client_secret",
"table_size_categorization": "small",
"group_name": "Authentication",
"group_key": "authentication"
},
{
"model": "StatusPage::ProjectSetting",
"attribute": "aws_secret_key",
"table_size_categorization": "small",
"group_name": "Incident Management",
"group_key": "incident_management"
},
{
"model": "Packages::Debian::ProjectDistributionKey",
"attribute": "private_key",
"table_size_categorization": "small",
"group_name": "Package Registry",
"group_key": "package_registry"
},
{
"model": "Packages::Debian::ProjectDistributionKey",
"attribute": "passphrase",
"table_size_categorization": "small",
"group_name": "Package Registry",
"group_key": "package_registry"
},
{
"model": "Packages::Debian::GroupDistributionKey",
"attribute": "private_key",
"table_size_categorization": "small",
"group_name": "Package Registry",
"group_key": "package_registry"
},
{
"model": "Packages::Debian::GroupDistributionKey",
"attribute": "passphrase",
"table_size_categorization": "small",
"group_name": "Package Registry",
"group_key": "package_registry"
},
{
"model": "Clusters::Providers::Gcp",
"attribute": "access_token",
"table_size_categorization": "small",
"group_name": "Environments",
"group_key": "environments"
},
{
"model": "Clusters::Providers::Aws",
"attribute": "secret_access_key",
"table_size_categorization": "small",
"group_name": "Environments",
"group_key": "environments"
},
{
"model": "Clusters::Integrations::Prometheus",
"attribute": "alert_manager_token",
"table_size_categorization": "small",
"group_name": "Environments",
"group_key": "environments"
},
{
"model": "ServiceDesk::CustomEmailVerification",
"attribute": "token",
"table_size_categorization": "small",
"group_name": "Service Desk",
"group_key": "service_desk"
},
{
"model": "ServiceDesk::CustomEmailCredential",
"attribute": "smtp_username",
"table_size_categorization": "small",
"group_name": "Service Desk",
"group_key": "service_desk"
},
{
"model": "ServiceDesk::CustomEmailCredential",
"attribute": "smtp_password",
"table_size_categorization": "small",
"group_name": "Service Desk",
"group_key": "service_desk"
},
{
"model": "Integrations::ZentaoTrackerData",
"attribute": "url",
"table_size_categorization": "small",
"group_name": "Import and Integrate",
"group_key": "import_and_integrate"
},
{
"model": "Integrations::ZentaoTrackerData",
"attribute": "api_url",
"table_size_categorization": "small",
"group_name": "Import and Integrate",
"group_key": "import_and_integrate"
},
{
"model": "Integrations::ZentaoTrackerData",
"attribute": "zentao_product_xid",
"table_size_categorization": "small",
"group_name": "Import and Integrate",
"group_key": "import_and_integrate"
},
{
"model": "Integrations::ZentaoTrackerData",
"attribute": "api_token",
"table_size_categorization": "small",
"group_name": "Import and Integrate",
"group_key": "import_and_integrate"
},
{
"model": "Integrations::JiraTrackerData",
"attribute": "url",
"table_size_categorization": "small",
"group_name": "Import and Integrate",
"group_key": "import_and_integrate"
},
{
"model": "Integrations::JiraTrackerData",
"attribute": "api_url",
"table_size_categorization": "small",
"group_name": "Import and Integrate",
"group_key": "import_and_integrate"
},
{
"model": "Integrations::JiraTrackerData",
"attribute": "username",
"table_size_categorization": "small",
"group_name": "Import and Integrate",
"group_key": "import_and_integrate"
},
{
"model": "Integrations::JiraTrackerData",
"attribute": "password",
"table_size_categorization": "small",
"group_name": "Import and Integrate",
"group_key": "import_and_integrate"
},
{
"model": "Integrations::IssueTrackerData",
"attribute": "project_url",
"table_size_categorization": "small",
"group_name": "Import and Integrate",
"group_key": "import_and_integrate"
},
{
"model": "Integrations::IssueTrackerData",
"attribute": "issues_url",
"table_size_categorization": "small",
"group_name": "Import and Integrate",
"group_key": "import_and_integrate"
},
{
"model": "Integrations::IssueTrackerData",
"attribute": "new_issue_url",
"table_size_categorization": "small",
"group_name": "Import and Integrate",
"group_key": "import_and_integrate"
},
{
"model": "IncidentManagement::ProjectIncidentManagementSetting",
"attribute": "pagerduty_token",
"table_size_categorization": "small",
"group_name": "Incident Management",
"group_key": "incident_management"
},
{
"model": "ErrorTracking::ProjectErrorTrackingSetting",
"attribute": "token",
"table_size_categorization": "small",
"group_name": "Observability",
"group_key": "observability"
},
{
"model": "Clusters::KubernetesNamespace",
"attribute": "service_account_token",
"table_size_categorization": "small",
"group_name": "Environments",
"group_key": "environments"
},
{
"model": "CloudConnector::ServiceAccessToken",
"attribute": "token",
"table_size_categorization": "small",
"group_name": "Cloud Connector",
"group_key": "cloud_connector"
},
{
"model": "BulkImports::Configuration",
"attribute": "url",
"table_size_categorization": "small",
"group_name": "Import and Integrate",
"group_key": "importers"
},
{
"model": "BulkImports::Configuration",
"attribute": "access_token",
"table_size_categorization": "small",
"group_name": "Import and Integrate",
"group_key": "importers"
},
{
"model": "Atlassian::Identity",
"attribute": "token",
"table_size_categorization": "small",
"group_name": "Import and Integrate",
"group_key": "import_and_integrate"
},
{
"model": "Atlassian::Identity",
"attribute": "refresh_token",
"table_size_categorization": "small",
"group_name": "Import and Integrate",
"group_key": "import_and_integrate"
},
{
"model": "Alerting::ProjectAlertingSetting",
"attribute": "token",
"table_size_categorization": "small",
"group_name": "Platform Insights",
"group_key": "platform_insights"
},
{
"model": "SlackIntegration",
"attribute": "bot_access_token",
"table_size_categorization": "small",
"group_name": "Import and Integrate",
"group_key": "import_and_integrate"
},
{
"model": "RemoteMirror",
"attribute": "credentials",
"table_size_categorization": "small",
"group_name": "Source Code",
"group_key": "source_code"
},
{
"model": "ProjectSetting",
"attribute": "cube_api_key",
"table_size_categorization": "small",
"group_name": "Project Management",
"group_key": "project_management"
},
{
"model": "ProjectSetting",
"attribute": "product_analytics_configurator_connection_string",
"table_size_categorization": "small",
"group_name": "Project Management",
"group_key": "project_management"
},
{
"model": "PagesDomainAcmeOrder",
"attribute": "private_key",
"table_size_categorization": "small",
"group_name": "Pages",
"group_key": "pages"
},
{
"model": "PagesDomain",
"attribute": "key",
"table_size_categorization": "small",
"group_name": "Pages",
"group_key": "pages"
},
{
"model": "JiraConnectInstallation",
"attribute": "shared_secret",
"table_size_categorization": "small",
"group_name": "Project Management",
"group_key": "project_management"
},
{
"model": "GrafanaIntegration",
"attribute": "token",
"table_size_categorization": "small",
"group_name": "Observability",
"group_key": "observability"
},
{
"model": "ChatName",
"attribute": "token",
"table_size_categorization": "small",
"group_name": "Notifications",
"group_key": "notifications"
},
{
"model": "ComplianceManagement::ComplianceFramework::ComplianceRequirementsControl",
"attribute": "secret_token",
"table_size_categorization": "small",
"group_name": "Compliance",
"group_key": "compliance"
},
{
"model": "AuditEvents::Instance::ExternalStreamingDestination",
"attribute": "secret_token",
"table_size_categorization": "small",
"group_name": "Compliance",
"group_key": "compliance"
},
{
"model": "AuditEvents::Group::ExternalStreamingDestination",
"attribute": "secret_token",
"table_size_categorization": "small",
"group_name": "Compliance",
"group_key": "compliance"
},
{
"model": "AuditEvents::Instance::GoogleCloudLoggingConfiguration",
"attribute": "private_key",
"table_size_categorization": "small",
"group_name": "Compliance",
"group_key": "compliance"
},
{
"model": "AuditEvents::Instance::AmazonS3Configuration",
"attribute": "secret_access_key",
"table_size_categorization": "small",
"group_name": "Compliance",
"group_key": "compliance"
},
{
"model": "AuditEvents::AmazonS3Configuration",
"attribute": "secret_access_key",
"table_size_categorization": "small",
"group_name": "Compliance",
"group_key": "compliance"
},
{
"model": "AuditEvents::GoogleCloudLoggingConfiguration",
"attribute": "private_key",
"table_size_categorization": "small",
"group_name": "Compliance",
"group_key": "compliance"
},
{
"model": "AuditEvents::InstanceExternalAuditEventDestination",
"attribute": "verification_token",
"table_size_categorization": "small",
"group_name": "Compliance",
"group_key": "compliance"
},
{
"model": "Ai::SelfHostedModel",
"attribute": "api_token",
"table_size_categorization": "small",
"group_name": "Custom Models",
"group_key": "custom_models"
},
{
"model": "MergeRequests::ExternalStatusCheck",
"attribute": "shared_secret",
"table_size_categorization": "small",
"group_name": "Code Review",
"group_key": "code_review"
},
{
"model": "RemoteDevelopment::WorkspaceVariable",
"attribute": "value",
"table_size_categorization": "small",
"group_name": "Remote Development",
"group_key": "remote_development"
},
{
"model": "Clusters::Agents::UrlConfiguration",
"attribute": "private_key",
"table_size_categorization": "small",
"group_name": "Environments",
"group_key": "environments"
},
{
"model": "AlertManagement::HttpIntegration",
"attribute": "token",
"table_size_categorization": "small",
"group_name": "Platform Insights",
"group_key": "platform_insights"
},
{
"model": "WebHooks::Hook",
"attribute": "token",
"table_size_categorization": "small",
"group_name": "Import and Integrate",
"group_key": "import_and_integrate"
},
{
"model": "WebHooks::Hook",
"attribute": "url",
"table_size_categorization": "small",
"group_name": "Import and Integrate",
"group_key": "import_and_integrate"
},
{
"model": "WebHooks::Hook",
"attribute": "url_variables",
"table_size_categorization": "small",
"group_name": "Import and Integrate",
"group_key": "import_and_integrate"
},
{
"model": "WebHooks::Hook",
"attribute": "custom_headers",
"table_size_categorization": "small",
"group_name": "Import and Integrate",
"group_key": "import_and_integrate"
},
{
"model": "Integration",
"attribute": "properties",
"table_size_categorization": "small",
"group_name": "Import and Integrate",
"group_key": "import_and_integrate"
},
{
"model": "ProjectImportData",
"attribute": "credentials",
"table_size_categorization": "small",
"group_name": "Import and Integrate",
"group_key": "importers"
},
{
"model": "Snippet",
"attribute": "secret_token",
"table_size_categorization": "small",
"group_name": "Source Code",
"group_key": "source_code"
},
{
"model": "Clusters::Platforms::Kubernetes",
"attribute": "password",
"table_size_categorization": "small",
"group_name": "Environments",
"group_key": "environments"
},
{
"model": "Clusters::Platforms::Kubernetes",
"attribute": "token",
"table_size_categorization": "small",
"group_name": "Environments",
"group_key": "environments"
},
{
"model": "GeoNode",
"attribute": "secret_access_key",
"table_size_categorization": "small",
"group_name": "Geo",
"group_key": "geo"
},
{
"model": "User",
"attribute": "otp_secret",
"table_size_categorization": "medium",
"group_name": "User Management",
"group_key": "user_management"
},
{
"model": "ApplicationSetting",
"attribute": "asset_proxy_secret_key",
"table_size_categorization": "small",
"group_name": "Cells Infrastructure",
"group_key": "cells_infrastructure"
},
{
"model": "ApplicationSetting",
"attribute": "external_auth_client_key",
"table_size_categorization": "small",
"group_name": "Cells Infrastructure",
"group_key": "cells_infrastructure"
},
{
"model": "ApplicationSetting",
"attribute": "external_auth_client_key_pass",
"table_size_categorization": "small",
"group_name": "Cells Infrastructure",
"group_key": "cells_infrastructure"
},
{
"model": "ApplicationSetting",
"attribute": "lets_encrypt_private_key",
"table_size_categorization": "small",
"group_name": "Cells Infrastructure",
"group_key": "cells_infrastructure"
},
{
"model": "ApplicationSetting",
"attribute": "eks_secret_access_key",
"table_size_categorization": "small",
"group_name": "Cells Infrastructure",
"group_key": "cells_infrastructure"
},
{
"model": "ApplicationSetting",
"attribute": "akismet_api_key",
"table_size_categorization": "small",
"group_name": "Cells Infrastructure",
"group_key": "cells_infrastructure"
},
{
"model": "ApplicationSetting",
"attribute": "spam_check_api_key",
"table_size_categorization": "small",
"group_name": "Cells Infrastructure",
"group_key": "cells_infrastructure"
},
{
"model": "ApplicationSetting",
"attribute": "elasticsearch_aws_secret_access_key",
"table_size_categorization": "small",
"group_name": "Cells Infrastructure",
"group_key": "cells_infrastructure"
},
{
"model": "ApplicationSetting",
"attribute": "elasticsearch_password",
"table_size_categorization": "small",
"group_name": "Cells Infrastructure",
"group_key": "cells_infrastructure"
},
{
"model": "ApplicationSetting",
"attribute": "recaptcha_private_key",
"table_size_categorization": "small",
"group_name": "Cells Infrastructure",
"group_key": "cells_infrastructure"
},
{
"model": "ApplicationSetting",
"attribute": "recaptcha_site_key",
"table_size_categorization": "small",
"group_name": "Cells Infrastructure",
"group_key": "cells_infrastructure"
},
{
"model": "ApplicationSetting",
"attribute": "slack_app_secret",
"table_size_categorization": "small",
"group_name": "Cells Infrastructure",
"group_key": "cells_infrastructure"
},
{
"model": "ApplicationSetting",
"attribute": "slack_app_signing_secret",
"table_size_categorization": "small",
"group_name": "Cells Infrastructure",
"group_key": "cells_infrastructure"
},
{
"model": "ApplicationSetting",
"attribute": "slack_app_verification_token",
"table_size_categorization": "small",
"group_name": "Cells Infrastructure",
"group_key": "cells_infrastructure"
},
{
"model": "ApplicationSetting",
"attribute": "ci_jwt_signing_key",
"table_size_categorization": "small",
"group_name": "Cells Infrastructure",
"group_key": "cells_infrastructure"
},
{
"model": "ApplicationSetting",
"attribute": "ci_job_token_signing_key",
"table_size_categorization": "small",
"group_name": "Cells Infrastructure",
"group_key": "cells_infrastructure"
},
{
"model": "ApplicationSetting",
"attribute": "customers_dot_jwt_signing_key",
"table_size_categorization": "small",
"group_name": "Cells Infrastructure",
"group_key": "cells_infrastructure"
},
{
"model": "ApplicationSetting",
"attribute": "secret_detection_token_revocation_token",
"table_size_categorization": "small",
"group_name": "Cells Infrastructure",
"group_key": "cells_infrastructure"
},
{
"model": "ApplicationSetting",
"attribute": "cloud_license_auth_token",
"table_size_categorization": "small",
"group_name": "Cells Infrastructure",
"group_key": "cells_infrastructure"
},
{
"model": "ApplicationSetting",
"attribute": "external_pipeline_validation_service_token",
"table_size_categorization": "small",
"group_name": "Cells Infrastructure",
"group_key": "cells_infrastructure"
},
{
"model": "ApplicationSetting",
"attribute": "mailgun_signing_key",
"table_size_categorization": "small",
"group_name": "Cells Infrastructure",
"group_key": "cells_infrastructure"
},
{
"model": "ApplicationSetting",
"attribute": "database_grafana_api_key",
"table_size_categorization": "small",
"group_name": "Cells Infrastructure",
"group_key": "cells_infrastructure"
},
{
"model": "ApplicationSetting",
"attribute": "arkose_labs_client_xid",
"table_size_categorization": "small",
"group_name": "Cells Infrastructure",
"group_key": "cells_infrastructure"
},
{
"model": "ApplicationSetting",
"attribute": "arkose_labs_client_secret",
"table_size_categorization": "small",
"group_name": "Cells Infrastructure",
"group_key": "cells_infrastructure"
},
{
"model": "ApplicationSetting",
"attribute": "arkose_labs_public_api_key",
"table_size_categorization": "small",
"group_name": "Cells Infrastructure",
"group_key": "cells_infrastructure"
},
{
"model": "ApplicationSetting",
"attribute": "arkose_labs_private_api_key",
"table_size_categorization": "small",
"group_name": "Cells Infrastructure",
"group_key": "cells_infrastructure"
},
{
"model": "ApplicationSetting",
"attribute": "arkose_labs_data_exchange_key",
"table_size_categorization": "small",
"group_name": "Cells Infrastructure",
"group_key": "cells_infrastructure"
},
{
"model": "ApplicationSetting",
"attribute": "cube_api_key",
"table_size_categorization": "small",
"group_name": "Cells Infrastructure",
"group_key": "cells_infrastructure"
},
{
"model": "ApplicationSetting",
"attribute": "telesign_customer_xid",
"table_size_categorization": "small",
"group_name": "Cells Infrastructure",
"group_key": "cells_infrastructure"
},
{
"model": "ApplicationSetting",
"attribute": "telesign_api_key",
"table_size_categorization": "small",
"group_name": "Cells Infrastructure",
"group_key": "cells_infrastructure"
},
{
"model": "ApplicationSetting",
"attribute": "product_analytics_configurator_connection_string",
"table_size_categorization": "small",
"group_name": "Cells Infrastructure",
"group_key": "cells_infrastructure"
},
{
"model": "ApplicationSetting",
"attribute": "secret_detection_service_auth_token",
"table_size_categorization": "small",
"group_name": "Cells Infrastructure",
"group_key": "cells_infrastructure"
},
{
"model": "ProjectSnippet",
"attribute": "secret_token",
"table_size_categorization": "small",
"group_name": "Source Code",
"group_key": "source_code"
},
{
"model": "PersonalSnippet",
"attribute": "secret_token",
"table_size_categorization": "small",
"group_name": "Source Code",
"group_key": "source_code"
},
{
"model": "Dast::SiteProfileSecretVariable",
"attribute": "value",
"table_size_categorization": "small",
"group_name": "Dynamic Analysis",
"group_key": "dynamic_analysis"
},
{
"model": "Ci::JobVariable",
"attribute": "value",
"table_size_categorization": "over_limit",
"group_name": "Pipeline Authoring",
"group_key": "pipeline_authoring"
},
{
"model": "Ci::Trigger",
"attribute": "encrypted_token_tmp",
"table_size_categorization": "small",
"group_name": "Pipeline Security",
"group_key": "pipeline_security"
},
{
"model": "Ci::GroupVariable",
"attribute": "value",
"table_size_categorization": "small",
"group_name": "Pipeline Authoring",
"group_key": "pipeline_authoring"
},
{
"model": "Ci::Variable",
"attribute": "value",
"table_size_categorization": "small",
"group_name": "Pipeline Authoring",
"group_key": "pipeline_authoring"
},
{
"model": "Ci::PipelineScheduleVariable",
"attribute": "value",
"table_size_categorization": "small",
"group_name": "Pipeline Authoring",
"group_key": "pipeline_authoring"
},
{
"model": "Ci::InstanceVariable",
"attribute": "value",
"table_size_categorization": "small",
"group_name": "Pipeline Authoring",
"group_key": "pipeline_authoring"
},
{
"model": "Ci::PipelineVariable",
"attribute": "value",
"table_size_categorization": "small",
"group_name": "Pipeline Authoring",
"group_key": "pipeline_authoring"
}
```
</details>
epic