diff --git a/.gitlab/CODEOWNERS b/.gitlab/CODEOWNERS
index 069b0a225c6e7cc180cc50a5a8077eaa278a8099..516a61edb629fb8c67b16d4f1417c00deae3387d 100644
--- a/.gitlab/CODEOWNERS
+++ b/.gitlab/CODEOWNERS
@@ -800,29 +800,245 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
 /doc/user/workspace/index.md @fneill
 
 [Authentication and Authorization]
-/app/**/*password* @gitlab-org/manage/authentication-and-authorization
-/ee/app/**/*password* @gitlab-org/manage/authentication-and-authorization
-/config/**/*password* @gitlab-org/manage/authentication-and-authorization
-/ee/config/**/*password* @gitlab-org/manage/authentication-and-authorization
-/lib/**/*password* @gitlab-org/manage/authentication-and-authorization
-/ee/lib/**/*password* @gitlab-org/manage/authentication-and-authorization
-/app/controllers/**/*password* @gitlab-org/manage/authentication-and-authorization
-/ee/app/controllers/**/*password* @gitlab-org/manage/authentication-and-authorization
-
-/app/**/*auth* @gitlab-org/manage/authentication-and-authorization
-/ee/app/**/*auth* @gitlab-org/manage/authentication-and-authorization
-/config/**/*auth* @gitlab-org/manage/authentication-and-authorization
-/ee/config/**/*auth* @gitlab-org/manage/authentication-and-authorization
-/lib/**/*auth* @gitlab-org/manage/authentication-and-authorization
-/ee/lib/**/*auth* @gitlab-org/manage/authentication-and-authorization
-/app/controllers/**/*auth* @gitlab-org/manage/authentication-and-authorization
-/ee/app/controllers/**/*auth* @gitlab-org/manage/authentication-and-authorization
-
-/app/**/*token* @gitlab-org/manage/authentication-and-authorization
-/ee/app/**/*token* @gitlab-org/manage/authentication-and-authorization
-/config/**/*token* @gitlab-org/manage/authentication-and-authorization
-/ee/config/**/*token* @gitlab-org/manage/authentication-and-authorization
-/lib/**/*token* @gitlab-org/manage/authentication-and-authorization
-/ee/lib/**/*token* @gitlab-org/manage/authentication-and-authorization
-/app/controllers/**/*token* @gitlab-org/manage/authentication-and-authorization
-/ee/app/controllers/**/*token* @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/access_tokens @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/alerts_settings/graphql/mutations/reset_http_token.mutation.graphql @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/authentication @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/ide/components/shared/tokened_input.vue @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/invite_members/components/members_token_select.vue @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/logs/components/tokens @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/packages_and_registries/package_registry/components/list/tokens @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/pages/admin/impersonation_tokens @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/pages/groups/settings/access_tokens @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/pages/ldap @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/pages/oauth @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/pages/omniauth_callbacks @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/pages/profiles/password_prompt @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/pages/profiles/personal_access_tokens @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/pages/profiles/two_factor_auths @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/pages/projects/settings/access_tokens @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/pages/sessions/new/oauth_remember_me.js @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/pipelines/components/pipelines_list/tokens/constants.js @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/pipelines/components/pipelines_list/tokens/pipeline_branch_name_token.vue @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/pipelines/components/pipelines_list/tokens/pipeline_source_token.vue @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/pipelines/components/pipelines_list/tokens/pipeline_status_token.vue @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/pipelines/components/pipelines_list/tokens/pipeline_tag_name_token.vue @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/projects/settings/topics/components @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/related_issues/components/issue_token.vue @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/runner/components/registration/registration_token.vue @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/runner/components/registration/registration_token_reset_dropdown_item.vue @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/runner/components/search_tokens @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/static_site_editor/rich_content_editor/services/renderers/build_uneditable_token.js @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/token_access/components @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/token_access/index.js @gitlab-org/manage/authentication-and-authorization
+/app/assets/stylesheets/page_bundles/profile_two_factor_auth.scss @gitlab-org/manage/authentication-and-authorization
+/app/controllers/admin/impersonation_tokens_controller.rb @gitlab-org/manage/authentication-and-authorization
+/app/controllers/concerns/access_tokens_actions.rb @gitlab-org/manage/authentication-and-authorization
+/app/controllers/concerns/authenticates_with_two_factor.rb @gitlab-org/manage/authentication-and-authorization
+/app/controllers/concerns/authenticates_with_two_factor_for_admin_mode.rb @gitlab-org/manage/authentication-and-authorization
+/app/controllers/concerns/enforces_admin_authentication.rb @gitlab-org/manage/authentication-and-authorization
+/app/controllers/concerns/enforces_two_factor_authentication.rb @gitlab-org/manage/authentication-and-authorization
+/app/controllers/concerns/oauth_applications.rb @gitlab-org/manage/authentication-and-authorization
+/app/controllers/concerns/project_unauthorized.rb @gitlab-org/manage/authentication-and-authorization
+/app/controllers/concerns/sessionless_authentication.rb @gitlab-org/manage/authentication-and-authorization
+/app/controllers/concerns/snippet_authorizations.rb @gitlab-org/manage/authentication-and-authorization
+/app/controllers/concerns/workhorse_authorization.rb @gitlab-org/manage/authentication-and-authorization
+/app/controllers/groups/settings/access_tokens_controller.rb @gitlab-org/manage/authentication-and-authorization
+/app/controllers/ldap @gitlab-org/manage/authentication-and-authorization
+/app/controllers/oauth @gitlab-org/manage/authentication-and-authorization
+/app/controllers/omniauth_callbacks_controller.rb @gitlab-org/manage/authentication-and-authorization
+/app/controllers/passwords_controller.rb @gitlab-org/manage/authentication-and-authorization
+/app/controllers/profiles/passwords_controller.rb @gitlab-org/manage/authentication-and-authorization
+/app/controllers/profiles/personal_access_tokens_controller.rb @gitlab-org/manage/authentication-and-authorization
+/app/controllers/profiles/two_factor_auths_controller.rb @gitlab-org/manage/authentication-and-authorization
+/app/controllers/profiles/webauthn_registrations_controller.rb @gitlab-org/manage/authentication-and-authorization
+/app/controllers/projects/settings/access_tokens_controller.rb @gitlab-org/manage/authentication-and-authorization
+/app/finders/groups/projects_requiring_authorizations_refresh @gitlab-org/manage/authentication-and-authorization
+/app/finders/personal_access_tokens_finder.rb @gitlab-org/manage/authentication-and-authorization
+/app/helpers/access_tokens_helper.rb @gitlab-org/manage/authentication-and-authorization
+/app/helpers/auth_helper.rb @gitlab-org/manage/authentication-and-authorization
+/app/models/authentication_event.rb @gitlab-org/manage/authentication-and-authorization
+/app/models/concerns/admin_changed_password_notifier.rb @gitlab-org/manage/authentication-and-authorization
+/app/models/concerns/mirror_authentication.rb @gitlab-org/manage/authentication-and-authorization
+/app/models/concerns/select_for_project_authorization.rb @gitlab-org/manage/authentication-and-authorization
+/app/models/concerns/token_authenticatable.rb @gitlab-org/manage/authentication-and-authorization
+/app/models/concerns/token_authenticatable_strategies @gitlab-org/manage/authentication-and-authorization
+/app/models/oauth_access_grant.rb @gitlab-org/manage/authentication-and-authorization
+/app/models/oauth_access_token.rb @gitlab-org/manage/authentication-and-authorization
+/app/models/personal_access_token.rb @gitlab-org/manage/authentication-and-authorization
+/app/models/project_authorization.rb @gitlab-org/manage/authentication-and-authorization
+/app/models/token_with_iv.rb @gitlab-org/manage/authentication-and-authorization
+/app/models/webauthn_registration.rb @gitlab-org/manage/authentication-and-authorization
+/app/policies/personal_access_token_policy.rb @gitlab-org/manage/authentication-and-authorization
+/app/services/access_token_validation_service.rb @gitlab-org/manage/authentication-and-authorization
+/app/services/auth @gitlab-org/manage/authentication-and-authorization
+/app/services/authorized_project_update @gitlab-org/manage/authentication-and-authorization
+/app/services/chat_names/authorize_user_service.rb @gitlab-org/manage/authentication-and-authorization
+/app/services/personal_access_tokens @gitlab-org/manage/authentication-and-authorization
+/app/services/projects/move_project_authorizations_service.rb @gitlab-org/manage/authentication-and-authorization
+/app/services/resource_access_tokens @gitlab-org/manage/authentication-and-authorization
+/app/services/todos/destroy/unauthorized_features_service.rb @gitlab-org/manage/authentication-and-authorization
+/app/services/users/authorized_build_service.rb @gitlab-org/manage/authentication-and-authorization
+/app/services/users/authorized_create_service.rb @gitlab-org/manage/authentication-and-authorization
+/app/services/users/refresh_authorized_projects_service.rb @gitlab-org/manage/authentication-and-authorization
+/app/services/webauthn @gitlab-org/manage/authentication-and-authorization
+/app/validators/json_schemas/cluster_agent_authorization_configuration.json @gitlab-org/manage/authentication-and-authorization
+/app/views/admin/application_settings/_external_authorization_service_form.html.haml @gitlab-org/manage/authentication-and-authorization
+/app/views/admin/impersonation_tokens @gitlab-org/manage/authentication-and-authorization
+/app/views/authentication @gitlab-org/manage/authentication-and-authorization
+/app/views/ci/token_access @gitlab-org/manage/authentication-and-authorization
+/app/views/dashboard/projects/_zero_authorized_projects.html.haml @gitlab-org/manage/authentication-and-authorization
+/app/views/devise/mailer/password_change.html.haml @gitlab-org/manage/authentication-and-authorization
+/app/views/devise/mailer/password_change.text.erb @gitlab-org/manage/authentication-and-authorization
+/app/views/devise/mailer/password_change_by_admin.html.haml @gitlab-org/manage/authentication-and-authorization
+/app/views/devise/mailer/password_change_by_admin.text.erb @gitlab-org/manage/authentication-and-authorization
+/app/views/devise/mailer/reset_password_instructions.html.haml @gitlab-org/manage/authentication-and-authorization
+/app/views/devise/mailer/reset_password_instructions.text.erb @gitlab-org/manage/authentication-and-authorization
+/app/views/devise/passwords @gitlab-org/manage/authentication-and-authorization
+/app/views/devise/shared/_omniauth_box.html.haml @gitlab-org/manage/authentication-and-authorization
+/app/views/devise/shared/_signup_omniauth_provider_list.haml @gitlab-org/manage/authentication-and-authorization
+/app/views/devise/shared/_signup_omniauth_providers.haml @gitlab-org/manage/authentication-and-authorization
+/app/views/devise/shared/_signup_omniauth_providers_top.haml @gitlab-org/manage/authentication-and-authorization
+/app/views/doorkeeper/authorizations @gitlab-org/manage/authentication-and-authorization
+/app/views/doorkeeper/authorized_applications @gitlab-org/manage/authentication-and-authorization
+/app/views/errors/omniauth_error.html.haml @gitlab-org/manage/authentication-and-authorization
+/app/views/groups/settings/_resource_access_token_creation.html.haml @gitlab-org/manage/authentication-and-authorization
+/app/views/groups/settings/_two_factor_auth.html.haml @gitlab-org/manage/authentication-and-authorization
+/app/views/groups/settings/access_tokens @gitlab-org/manage/authentication-and-authorization
+/app/views/layouts/oauth_error.html.haml @gitlab-org/manage/authentication-and-authorization
+/app/views/notify/access_token_about_to_expire_email.html.haml @gitlab-org/manage/authentication-and-authorization
+/app/views/notify/access_token_about_to_expire_email.text.erb @gitlab-org/manage/authentication-and-authorization
+/app/views/notify/access_token_created_email.html.haml @gitlab-org/manage/authentication-and-authorization
+/app/views/notify/access_token_created_email.text.erb @gitlab-org/manage/authentication-and-authorization
+/app/views/notify/access_token_expired_email.html.haml @gitlab-org/manage/authentication-and-authorization
+/app/views/notify/access_token_expired_email.text.erb @gitlab-org/manage/authentication-and-authorization
+/app/views/profiles/passwords @gitlab-org/manage/authentication-and-authorization
+/app/views/profiles/personal_access_tokens @gitlab-org/manage/authentication-and-authorization
+/app/views/profiles/two_factor_auths @gitlab-org/manage/authentication-and-authorization
+/app/views/projects/mirrors/_authentication_method.html.haml @gitlab-org/manage/authentication-and-authorization
+/app/views/projects/settings/access_tokens @gitlab-org/manage/authentication-and-authorization
+/app/views/shared/_no_password.html.haml @gitlab-org/manage/authentication-and-authorization
+/app/views/shared/_two_factor_auth_recovery_settings_check.html.haml @gitlab-org/manage/authentication-and-authorization
+/app/views/shared/access_tokens @gitlab-org/manage/authentication-and-authorization
+/app/views/shared/members/_two_factor_auth_badge.html.haml @gitlab-org/manage/authentication-and-authorization
+/app/views/shared/tokens @gitlab-org/manage/authentication-and-authorization
+/app/workers/authorized_keys_worker.rb @gitlab-org/manage/authentication-and-authorization
+/app/workers/authorized_project_update @gitlab-org/manage/authentication-and-authorization
+/app/workers/authorized_projects_worker.rb @gitlab-org/manage/authentication-and-authorization
+/app/workers/personal_access_tokens @gitlab-org/manage/authentication-and-authorization
+/config/feature_flags/development/application_settings_tokens_optional_encryption.yml @gitlab-org/manage/authentication-and-authorization
+/config/feature_flags/development/enforce_auth_checks_on_uploads.yml @gitlab-org/manage/authentication-and-authorization
+/config/feature_flags/development/forti_authenticator.yml @gitlab-org/manage/authentication-and-authorization
+/config/feature_flags/development/forti_token_cloud.yml @gitlab-org/manage/authentication-and-authorization
+/config/feature_flags/development/groups_tokens_optional_encryption.yml @gitlab-org/manage/authentication-and-authorization
+/config/feature_flags/development/omniauth_initializer_fullhost_proc.yml @gitlab-org/manage/authentication-and-authorization
+/config/feature_flags/development/omniauth_login_minimal_scopes.yml @gitlab-org/manage/authentication-and-authorization
+/config/feature_flags/development/personal_access_tokens_scoped_to_projects.yml @gitlab-org/manage/authentication-and-authorization
+/config/feature_flags/development/projects_tokens_optional_encryption.yml @gitlab-org/manage/authentication-and-authorization
+/config/feature_flags/development/specialized_worker_for_group_lock_update_auth_recalculation.yml @gitlab-org/manage/authentication-and-authorization
+/config/feature_flags/development/webauthn.yml @gitlab-org/manage/authentication-and-authorization
+/config/feature_flags/ops/block_password_auth_for_saml_users.yml @gitlab-org/manage/authentication-and-authorization
+/config/initializers/01_secret_token.rb @gitlab-org/manage/authentication-and-authorization
+/config/initializers/devise_dynamic_password_length_validation.rb @gitlab-org/manage/authentication-and-authorization
+/config/initializers/devise_password_length.rb.example @gitlab-org/manage/authentication-and-authorization
+/config/initializers/gitlab_shell_secret_token.rb @gitlab-org/manage/authentication-and-authorization
+/config/initializers/omniauth.rb @gitlab-org/manage/authentication-and-authorization
+/config/initializers/rails_host_authorization.rb @gitlab-org/manage/authentication-and-authorization
+/config/initializers/rails_host_authorization_gitpod.rb @gitlab-org/manage/authentication-and-authorization
+/config/initializers/webauthn.rb @gitlab-org/manage/authentication-and-authorization
+/config/initializers_before_autoloader/100_patch_omniauth_oauth2.rb @gitlab-org/manage/authentication-and-authorization
+/config/initializers_before_autoloader/100_patch_omniauth_saml.rb @gitlab-org/manage/authentication-and-authorization
+/ee/app/assets/javascripts/access_tokens @gitlab-org/manage/authentication-and-authorization
+/ee/app/assets/javascripts/audit_events/components/tokens @gitlab-org/manage/authentication-and-authorization
+/ee/app/assets/javascripts/audit_events/token_utils.js @gitlab-org/manage/authentication-and-authorization
+/ee/app/assets/javascripts/groups/settings/components @gitlab-org/manage/authentication-and-authorization
+/ee/app/assets/javascripts/pages/groups/omniauth_callbacks @gitlab-org/manage/authentication-and-authorization
+/ee/app/assets/javascripts/pipelines/components/pipelines_list @gitlab-org/manage/authentication-and-authorization
+/ee/app/assets/javascripts/requirements/components/tokens @gitlab-org/manage/authentication-and-authorization
+/ee/app/assets/javascripts/saml_providers/scim_token_service.js @gitlab-org/manage/authentication-and-authorization
+/ee/app/assets/javascripts/saml_sso/components @gitlab-org/manage/authentication-and-authorization
+/ee/app/assets/javascripts/vue_merge_request_widget/components/approvals/approvals_auth.vue @gitlab-org/manage/authentication-and-authorization
+/ee/app/controllers/concerns/ee/authenticates_with_two_factor.rb @gitlab-org/manage/authentication-and-authorization
+/ee/app/controllers/concerns/ee/enforces_two_factor_authentication.rb @gitlab-org/manage/authentication-and-authorization
+/ee/app/controllers/concerns/saml_authorization.rb @gitlab-org/manage/authentication-and-authorization
+/ee/app/controllers/ee/ldap @gitlab-org/manage/authentication-and-authorization
+/ee/app/controllers/ee/omniauth_callbacks_controller.rb @gitlab-org/manage/authentication-and-authorization
+/ee/app/controllers/ee/passwords_controller.rb @gitlab-org/manage/authentication-and-authorization
+/ee/app/controllers/groups/omniauth_callbacks_controller.rb @gitlab-org/manage/authentication-and-authorization
+/ee/app/controllers/groups/scim_oauth_controller.rb @gitlab-org/manage/authentication-and-authorization
+/ee/app/controllers/oauth @gitlab-org/manage/authentication-and-authorization
+/ee/app/controllers/omniauth_kerberos_spnego_controller.rb @gitlab-org/manage/authentication-and-authorization
+/ee/app/finders/auth @gitlab-org/manage/authentication-and-authorization
+/ee/app/helpers/ee/access_tokens_helper.rb @gitlab-org/manage/authentication-and-authorization
+/ee/app/helpers/ee/auth_helper.rb @gitlab-org/manage/authentication-and-authorization
+/ee/app/helpers/ee/personal_access_tokens_helper.rb @gitlab-org/manage/authentication-and-authorization
+/ee/app/models/ee/personal_access_token.rb @gitlab-org/manage/authentication-and-authorization
+/ee/app/models/ee/project_authorization.rb @gitlab-org/manage/authentication-and-authorization
+/ee/app/models/scim_oauth_access_token.rb @gitlab-org/manage/authentication-and-authorization
+/ee/app/serializers/scim_oauth_access_token_entity.rb @gitlab-org/manage/authentication-and-authorization
+/ee/app/services/ee/auth @gitlab-org/manage/authentication-and-authorization
+/ee/app/services/ee/personal_access_tokens @gitlab-org/manage/authentication-and-authorization
+/ee/app/services/ee/resource_access_tokens @gitlab-org/manage/authentication-and-authorization
+/ee/app/services/personal_access_tokens @gitlab-org/manage/authentication-and-authorization
+/ee/app/services/security/token_revocation_service.rb @gitlab-org/manage/authentication-and-authorization
+/ee/app/views/admin/application_settings/_personal_access_token_expiration_policy.html.haml @gitlab-org/manage/authentication-and-authorization
+/ee/app/views/credentials_inventory_mailer/personal_access_token_revoked_email.html.haml @gitlab-org/manage/authentication-and-authorization
+/ee/app/views/credentials_inventory_mailer/personal_access_token_revoked_email.text.haml @gitlab-org/manage/authentication-and-authorization
+/ee/app/views/groups/_personal_access_token_expiration_policy.html.haml @gitlab-org/manage/authentication-and-authorization
+/ee/app/views/groups/sso/_authorize_pane.html.haml @gitlab-org/manage/authentication-and-authorization
+/ee/app/views/notify/policy_revoked_personal_access_tokens_email.html.haml @gitlab-org/manage/authentication-and-authorization
+/ee/app/views/notify/policy_revoked_personal_access_tokens_email.text.erb @gitlab-org/manage/authentication-and-authorization
+/ee/app/views/oauth @gitlab-org/manage/authentication-and-authorization
+/ee/app/views/shared/credentials_inventory/_personal_access_tokens.html.haml @gitlab-org/manage/authentication-and-authorization
+/ee/app/views/shared/credentials_inventory/_project_access_tokens.html.haml @gitlab-org/manage/authentication-and-authorization
+/ee/app/views/shared/credentials_inventory/personal_access_tokens @gitlab-org/manage/authentication-and-authorization
+/ee/app/views/shared/credentials_inventory/project_access_tokens @gitlab-org/manage/authentication-and-authorization
+/ee/app/workers/personal_access_tokens @gitlab-org/manage/authentication-and-authorization
+/ee/config/routes/oauth.rb @gitlab-org/manage/authentication-and-authorization
+/ee/lib/ee/gitlab/auth @gitlab-org/manage/authentication-and-authorization
+/ee/lib/ee/gitlab/auth.rb @gitlab-org/manage/authentication-and-authorization
+/ee/lib/ee/gitlab/omniauth_initializer.rb @gitlab-org/manage/authentication-and-authorization
+/ee/lib/gitlab/auth @gitlab-org/manage/authentication-and-authorization
+/ee/lib/gitlab/auth_logger.rb @gitlab-org/manage/authentication-and-authorization
+/ee/lib/gitlab/authority_analyzer.rb @gitlab-org/manage/authentication-and-authorization
+/ee/lib/gitlab/geo/oauth @gitlab-org/manage/authentication-and-authorization
+/ee/lib/gitlab/kerberos @gitlab-org/manage/authentication-and-authorization
+/ee/lib/omni_auth @gitlab-org/manage/authentication-and-authorization
+/ee/lib/system_check/geo/authorized_keys_check.rb @gitlab-org/manage/authentication-and-authorization
+/ee/lib/system_check/geo/authorized_keys_flag_check.rb @gitlab-org/manage/authentication-and-authorization
+/lib/api/entities/ci/reset_token_result.rb @gitlab-org/manage/authentication-and-authorization
+/lib/api/entities/impersonation_token.rb @gitlab-org/manage/authentication-and-authorization
+/lib/api/entities/impersonation_token_with_token.rb @gitlab-org/manage/authentication-and-authorization
+/lib/api/entities/personal_access_token.rb @gitlab-org/manage/authentication-and-authorization
+/lib/api/entities/personal_access_token_with_token.rb @gitlab-org/manage/authentication-and-authorization
+/lib/api/entities/resource_access_token.rb @gitlab-org/manage/authentication-and-authorization
+/lib/api/entities/resource_access_token_with_token.rb @gitlab-org/manage/authentication-and-authorization
+/lib/api/helpers/authentication.rb @gitlab-org/manage/authentication-and-authorization
+/lib/api/helpers/packages/basic_auth_helpers.rb @gitlab-org/manage/authentication-and-authorization
+/lib/api/personal_access_tokens.rb @gitlab-org/manage/authentication-and-authorization
+/lib/api/resource_access_tokens.rb @gitlab-org/manage/authentication-and-authorization
+/lib/api/support/token_with_expiration.rb @gitlab-org/manage/authentication-and-authorization
+/lib/gitlab/api_authentication @gitlab-org/manage/authentication-and-authorization
+/lib/gitlab/auth @gitlab-org/manage/authentication-and-authorization
+/lib/gitlab/auth.rb @gitlab-org/manage/authentication-and-authorization
+/lib/gitlab/auth_logger.rb @gitlab-org/manage/authentication-and-authorization
+/lib/gitlab/authorized_keys.rb @gitlab-org/manage/authentication-and-authorization
+/lib/gitlab/background_migration/encrypt_static_object_token.rb @gitlab-org/manage/authentication-and-authorization
+/lib/gitlab/background_migration/migrate_u2f_webauthn.rb @gitlab-org/manage/authentication-and-authorization
+/lib/gitlab/background_migration/update_users_where_two_factor_auth_required_from_group.rb @gitlab-org/manage/authentication-and-authorization
+/lib/gitlab/chat_name_token.rb @gitlab-org/manage/authentication-and-authorization
+/lib/gitlab/ci/pipeline/expression/token.rb @gitlab-org/manage/authentication-and-authorization
+/lib/gitlab/external_authorization @gitlab-org/manage/authentication-and-authorization
+/lib/gitlab/external_authorization.rb @gitlab-org/manage/authentication-and-authorization
+/lib/gitlab/graphql/authorize @gitlab-org/manage/authentication-and-authorization
+/lib/gitlab/jwt_authenticatable.rb @gitlab-org/manage/authentication-and-authorization
+/lib/gitlab/jwt_token.rb @gitlab-org/manage/authentication-and-authorization
+/lib/gitlab/lfs_token.rb @gitlab-org/manage/authentication-and-authorization
+/lib/gitlab/mail_room @gitlab-org/manage/authentication-and-authorization
+/lib/gitlab/omniauth_initializer.rb @gitlab-org/manage/authentication-and-authorization
+/lib/gitlab/project_authorizations.rb @gitlab-org/manage/authentication-and-authorization
+/lib/json_web_token @gitlab-org/manage/authentication-and-authorization
+/lib/omni_auth @gitlab-org/manage/authentication-and-authorization
+/lib/system_check/app/authorized_keys_permission_check.rb @gitlab-org/manage/authentication-and-authorization
+/lib/system_check/incoming_email/imap_authentication_check.rb @gitlab-org/manage/authentication-and-authorization
+/lib/tasks/gitlab/password.rake @gitlab-org/manage/authentication-and-authorization
+/lib/tasks/tokens.rake @gitlab-org/manage/authentication-and-authorization
diff --git a/spec/tooling/fixtures/find_codeowners/dir0/dir1/dir2/file2 b/spec/tooling/fixtures/find_codeowners/dir0/dir1/dir2/file2
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/spec/tooling/fixtures/find_codeowners/dir0/dir1/file1 b/spec/tooling/fixtures/find_codeowners/dir0/dir1/file1
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/spec/tooling/fixtures/find_codeowners/dir0/file0 b/spec/tooling/fixtures/find_codeowners/dir0/file0
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/spec/tooling/fixtures/find_codeowners/file b/spec/tooling/fixtures/find_codeowners/file
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/spec/tooling/lib/tooling/find_codeowners_spec.rb b/spec/tooling/lib/tooling/find_codeowners_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..b29c5f35ec990ca6f3221ade9b977204b92c1f02
--- /dev/null
+++ b/spec/tooling/lib/tooling/find_codeowners_spec.rb
@@ -0,0 +1,199 @@
+# frozen_string_literal: true
+
+require_relative '../../../../tooling/lib/tooling/find_codeowners'
+
+RSpec.describe Tooling::FindCodeowners do
+  let(:subject) { described_class.new }
+  let(:root) { File.expand_path('../../fixtures/find_codeowners', __dir__) }
+
+  describe '#execute' do
+    before do
+      allow(subject).to receive(:load_config).and_return(
+        '[Section name]': {
+          '@group': {
+            allow: {
+              keywords: %w[dir0 file],
+              patterns: ['/%{keyword}/**/*', '/%{keyword}']
+            },
+            deny: {
+              keywords: %w[file0],
+              patterns: ['**/%{keyword}']
+            }
+          }
+        }
+      )
+    end
+
+    it 'prints CODEOWNERS as configured' do
+      expect do
+        Dir.chdir(root) do
+          subject.execute
+        end
+      end.to output(<<~CODEOWNERS).to_stdout
+        [Section name]
+        /dir0/dir1 @group
+        /file @group
+      CODEOWNERS
+    end
+  end
+
+  describe '#load_definitions' do
+    it 'expands the allow and deny list with keywords and patterns' do
+      subject.load_definitions.each do |section, group_defintions|
+        group_defintions.each do |group, definitions|
+          expect(definitions[:allow]).to be_an(Array)
+          expect(definitions[:deny]).to be_an(Array)
+        end
+      end
+    end
+
+    it 'expands the auth group' do
+      auth = subject.load_definitions.dig(
+        :'[Authentication and Authorization]',
+        :'@gitlab-org/manage/authentication-and-authorization')
+
+      expect(auth).to eq(
+        allow: %w[
+          /{,ee/}app/**/*password*{/**/*,}
+          /{,ee/}config/**/*password*{/**/*,}
+          /{,ee/}lib/**/*password*{/**/*,}
+          /{,ee/}app/**/*auth*{/**/*,}
+          /{,ee/}config/**/*auth*{/**/*,}
+          /{,ee/}lib/**/*auth*{/**/*,}
+          /{,ee/}app/**/*token*{/**/*,}
+          /{,ee/}config/**/*token*{/**/*,}
+          /{,ee/}lib/**/*token*{/**/*,}
+        ],
+        deny: %w[
+          **/*author.*{/**/*,}
+          **/*author_*{/**/*,}
+          **/*authored*{/**/*,}
+          **/*authoring*{/**/*,}
+          **/*.png*{/**/*,}
+          **/*.svg*{/**/*,}
+          **/*deploy_token*{/**/*,}
+          **/*runner{,s}_token*{/**/*,}
+          **/*job_token*{/**/*,}
+          **/*autocomplete_tokens*{/**/*,}
+          **/*dast_site_token*{/**/*,}
+          **/*reset_prometheus_token*{/**/*,}
+          **/*reset_registration_token*{/**/*,}
+          **/*runners_registration_token*{/**/*,}
+          **/*terraform_registry_token*{/**/*,}
+          **/*tokenizer*{/**/*,}
+          **/*filtered_search*{/**/*,}
+          **/*/alert_management/*{/**/*,}
+          **/*/analytics/*{/**/*,}
+          **/*/bitbucket/*{/**/*,}
+          **/*/clusters/*{/**/*,}
+          **/*/clusters_list/*{/**/*,}
+          **/*/dast/*{/**/*,}
+          **/*/dast_profiles/*{/**/*,}
+          **/*/dast_site_tokens/*{/**/*,}
+          **/*/dast_site_validation/*{/**/*,}
+          **/*/dependency_proxy/*{/**/*,}
+          **/*/error_tracking/*{/**/*,}
+          **/*/google_api/*{/**/*,}
+          **/*/google_cloud/*{/**/*,}
+          **/*/jira_connect/*{/**/*,}
+          **/*/kubernetes/*{/**/*,}
+          **/*/protected_environments/*{/**/*,}
+          **/*/config/feature_flags/development/jira_connect_*{/**/*,}
+          **/*/config/metrics/*{/**/*,}
+          **/*/app/controllers/groups/dependency_proxy_auth_controller.rb*{/**/*,}
+          **/*/app/finders/ci/auth_job_finder.rb*{/**/*,}
+          **/*/ee/config/metrics/*{/**/*,}
+          **/*/lib/gitlab/conan_token.rb*{/**/*,}
+        ]
+      )
+    end
+  end
+
+  describe '#load_config' do
+    it 'loads the config with symbolized keys' do
+      config = subject.load_config
+
+      expect_hash_keys_to_be_symbols(config)
+    end
+
+    context 'when YAML has safe_load_file' do
+      before do
+        allow(YAML).to receive(:respond_to?).with(:safe_load_file).and_return(true)
+      end
+
+      it 'calls safe_load_file' do
+        expect(YAML).to receive(:safe_load_file)
+
+        subject.load_config
+      end
+    end
+
+    context 'when YAML does not have safe_load_file' do
+      before do
+        allow(YAML).to receive(:respond_to?).with(:safe_load_file).and_return(false)
+      end
+
+      it 'calls load_file' do
+        expect(YAML).to receive(:safe_load)
+
+        subject.load_config
+      end
+    end
+
+    def expect_hash_keys_to_be_symbols(object)
+      if object.is_a?(Hash)
+        object.each do |key, value|
+          expect(key).to be_a(Symbol)
+
+          expect_hash_keys_to_be_symbols(value)
+        end
+      end
+    end
+  end
+
+  describe '#path_matches?' do
+    let(:pattern) { 'pattern' }
+    let(:path) { 'path' }
+
+    it 'passes flags we are expecting to File.fnmatch?' do
+      expected_flags =
+        ::File::FNM_DOTMATCH | ::File::FNM_PATHNAME | ::File::FNM_EXTGLOB
+
+      expect(File).to receive(:fnmatch?).with(pattern, path, expected_flags)
+
+      subject.path_matches?(pattern, path)
+    end
+  end
+
+  describe '#consolidate_paths' do
+    before do
+      allow(subject).to receive(:find_dir_maxdepth_1).and_return(<<~LINES)
+        dir
+        dir/0
+        dir/2
+        dir/3
+        dir/1
+      LINES
+    end
+
+    context 'when the directory has the same number of entries' do
+      let(:input_paths) { %W[dir/0\n dir/1\n dir/2\n dir/3\n] }
+
+      it 'consolidates into the directory' do
+        paths = subject.consolidate_paths(input_paths)
+
+        expect(paths).to eq(["dir\n"])
+      end
+    end
+
+    context 'when the directory has different number of entries' do
+      let(:input_paths) { %W[dir/0\n dir/1\n dir/2\n] }
+
+      it 'returns the original paths' do
+        paths = subject.consolidate_paths(input_paths)
+
+        expect(paths).to eq(input_paths)
+      end
+    end
+  end
+end
diff --git a/tooling/bin/find_codeowners b/tooling/bin/find_codeowners
new file mode 100755
index 0000000000000000000000000000000000000000..2c028b3162e4080b7f2d01a86768cdf62f93d3b7
--- /dev/null
+++ b/tooling/bin/find_codeowners
@@ -0,0 +1,6 @@
+#!/usr/bin/env ruby
+# frozen_string_literal: true
+
+require_relative '../lib/tooling/find_codeowners'
+
+Tooling::FindCodeowners.new.execute
diff --git a/tooling/config/CODEOWNERS.yml b/tooling/config/CODEOWNERS.yml
new file mode 100644
index 0000000000000000000000000000000000000000..d867c8c22fc1ddbc2007abc9bb73ad938b8fb921
--- /dev/null
+++ b/tooling/config/CODEOWNERS.yml
@@ -0,0 +1,58 @@
+# This is supposed to be used with:
+#     tooling/bin/find_codeowners tooling/config/CODEOWNERS.yml
+# And paste the contents into .gitlab/CODEOWNERS
+
+'[Authentication and Authorization]':
+  '@gitlab-org/manage/authentication-and-authorization':
+    allow:
+      keywords:
+        - password
+        - auth
+        - token
+      patterns:
+        - '/{,ee/}app/**/*%{keyword}*{/**/*,}'
+        - '/{,ee/}config/**/*%{keyword}*{/**/*,}'
+        - '/{,ee/}lib/**/*%{keyword}*{/**/*,}'
+    deny:
+      keywords:
+        - author.
+        - author_
+        - authored
+        - authoring
+        - .png
+        - .svg
+        - deploy_token
+        - runner{,s}_token
+        - job_token
+        - autocomplete_tokens
+        - dast_site_token
+        - reset_prometheus_token
+        - reset_registration_token
+        - runners_registration_token
+        - terraform_registry_token
+        - tokenizer
+        - filtered_search
+        - /alert_management/
+        - /analytics/
+        - /bitbucket/
+        - /clusters/
+        - /clusters_list/
+        - /dast/
+        - /dast_profiles/
+        - /dast_site_tokens/
+        - /dast_site_validation/
+        - /dependency_proxy/
+        - /error_tracking/
+        - /google_api/
+        - /google_cloud/
+        - /jira_connect/
+        - /kubernetes/
+        - /protected_environments/
+        - /config/feature_flags/development/jira_connect_
+        - /config/metrics/
+        - /app/controllers/groups/dependency_proxy_auth_controller.rb
+        - /app/finders/ci/auth_job_finder.rb
+        - /ee/config/metrics/
+        - /lib/gitlab/conan_token.rb
+      patterns:
+        - '**/*%{keyword}*{/**/*,}'
diff --git a/tooling/lib/tooling/find_codeowners.rb b/tooling/lib/tooling/find_codeowners.rb
new file mode 100644
index 0000000000000000000000000000000000000000..35d8a9d7461fdc72b5117f9ab9a9eb480ea08cdc
--- /dev/null
+++ b/tooling/lib/tooling/find_codeowners.rb
@@ -0,0 +1,103 @@
+# frozen_string_literal: true
+
+require 'yaml'
+
+module Tooling
+  class FindCodeowners
+    def execute
+      load_definitions.each do |section, group_defintions|
+        puts section
+
+        group_defintions.each do |group, list|
+          matched_files = git_ls_files.each_line.select do |line|
+            list[:allow].find do |pattern|
+              path = "/#{line.chomp}"
+
+              path_matches?(pattern, path) &&
+                list[:deny].none? { |pattern| path_matches?(pattern, path) }
+            end
+          end
+
+          consolidated = consolidate_paths(matched_files)
+          consolidated_again = consolidate_paths(consolidated)
+
+          # Consider the directory structure is a tree structure:
+          # https://en.wikipedia.org/wiki/Tree_(data_structure)
+          # After we consolidated the leaf entries, it could be possible that
+          # we can consolidate further for the new leaves. Repeat this
+          # process until we see no improvements.
+          while consolidated_again.size < consolidated.size
+            consolidated = consolidated_again
+            consolidated_again = consolidate_paths(consolidated)
+          end
+
+          consolidated.each do |file|
+            puts "/#{file.chomp} #{group}"
+          end
+        end
+      end
+    end
+
+    def load_definitions
+      result = load_config
+
+      result.each do |section, group_defintions|
+        group_defintions.each do |group, definitions|
+          definitions.transform_values! do |rules|
+            rules[:keywords].flat_map do |keyword|
+              rules[:patterns].map do |pattern|
+                pattern % { keyword: keyword }
+              end
+            end
+          end
+        end
+      end
+
+      result
+    end
+
+    def load_config
+      config_path = "#{__dir__}/../../config/CODEOWNERS.yml"
+
+      if YAML.respond_to?(:safe_load_file) # Ruby 3.0+
+        YAML.safe_load_file(config_path, symbolize_names: true)
+      else
+        YAML.safe_load(File.read(config_path), symbolize_names: true)
+      end
+    end
+
+    # Copied and modified from ee/lib/gitlab/code_owners/file.rb
+    def path_matches?(pattern, path)
+      # `FNM_DOTMATCH` makes sure we also match files starting with a `.`
+      # `FNM_PATHNAME` makes sure ** matches path separators
+      flags = ::File::FNM_DOTMATCH | ::File::FNM_PATHNAME
+
+      # BEGIN extension
+      flags |= ::File::FNM_EXTGLOB
+      # END extension
+
+      ::File.fnmatch?(pattern, path, flags)
+    end
+
+    def consolidate_paths(matched_files)
+      matched_files.group_by(&File.method(:dirname)).flat_map do |dir, files|
+        # First line is the dir itself
+        if find_dir_maxdepth_1(dir).lines.drop(1).sort == files.sort
+          "#{dir}\n"
+        else
+          files
+        end
+      end.sort
+    end
+
+    private
+
+    def find_dir_maxdepth_1(dir)
+      `find #{dir} -maxdepth 1`
+    end
+
+    def git_ls_files
+      @git_ls_files ||= `git ls-files`
+    end
+  end
+end