David Handermann created NIP-39:
-----------------------------------
Summary: Replace Fine-Grained Component Authorization with
Controller-Level Authorization
Key: NIP-39
URL: https://issues.apache.org/jira/browse/NIP-39
Project: NiFi Improvement Proposal
Issue Type: Improvement
Reporter: David Handermann
h2. Motivation
The current framework authorization model supports configuring Access Policies
that can be applied to individual object instances, including Processors,
Controller Services, and Parameter Providers. Introduced in early versions of
the project, this authorization structure was intended to support fine-grained
authorization to enable multi-tenant deployments.
The problem with the fine-grained authorization model is that it provides a
configurable security boundary which the framework cannot enforce. Processors
and other extensions have full access to the shared Java Virtual Machine,
including the operating system as the user running the Java process. This fact
motivated the deprecation of the Restricted annotation for components.
To provide a consistent and enforceable security boundary, the framework should
deprecate and remove support for configuring fine-grained component
authorization.
h2. Scope
Simplifying flow authorization requires changes to framework REST API
implementation classes, as well as the Authorizer interface and supporting
components.
The primary scope involves eventual removal of fine-grained authorization in
REST API Resource classes that check authorized component access. This should
also extend to Parameter Contexts and Parameter Providers.
The framework interfaces, including the Access Policy Provider, may require
implementation adjustments to deprecate and remove writing and reading
authorized actions for individual components, based on identifiers. These
authorization methods will be adjusted to write and read allowed actions based
on Resource Type, including the Controller Type, which should indicate complete
access to create, modify, and delete Process Groups with any child components.
Authorization for other Resource Types, such as Provenance, Data Content
Viewing, Tenants, and Policies, should be unchanged.
These changes do not require any modifications or additions to the public NiFi
API.
h2. Description
The simplified authorization strategy involves locating editing of extension
components under a single Resource Type of Flow. Process Groups and all child
components will be authorized under a single policy declaration. The current
enumeration of Resource Types includes both Flow and Controller, so the
simplified strategy should merge these Resource Types into a single Resource
Type for authorization purposes. The Controller Resource Type appears to be the
best option for this purpose as it aligns the authorization policy with the
enforceable security boundary. The same function could be achieved using System
as the shared Resource Type boundary. Read on the Controller continues to mean
limiting actions to viewing without modification.
The current Authorizer interface in the framework-api defines a generic
authorize method with the AuthorizationRequest object. This interface
definition can remain unchanged. The Resource interface, included in the
AuthorizationRequest, should be extended to have a Resource Type included for
simplified authorization evaluation.
h2. Compatibility
Initial deprecation will have no functional impact when upgrading existing
deployments, continuing to enforce existing policies.
Subsequent implementation will provide an automatic migration for existing
Access Policies defined in the serialized XML authorization configuration. The
specific mapping of existing authorizations is subject to implementation review.
The basic strategy for migration will involve translating existing write
permissions on one or more Process Groups and translating that to write access
at the Controller level. This migration approach adjusts the declared policy
implementation with the enforceable boundary.
When upgrading, the migration process will write a new serialized XML
authorization that removes authorization policies defined for individual
components. The migration process will create a backup copy of the original XML
authorizations prior to writing a new version.
For other implementations of the Authorizer, the transitional approach will map
authorized actions at a nested level to the corresponding action for the
Resource Type, such as a Process Group.
For final removal in a major version, the Authorizer and Access Policy Provider
interfaces will remove any methods deprecated as part of the transitional
implementation.
h2. Verification
Deprecation of features through standard deprecation logging, and migration
capabilities, will be reviewed as part of the standard pull request process.
Existing unit tests and system tests for authorization will be adjusted to
consider applicable Resource Types instead of individual components. New unit
tests for the migration should also be implemented.
h2. Alternatives
Retaining authorization at the Process Group level may appear to be a less
impactful strategy that would still reduce the complexity associated with
fine-grained authorization for components. However, supporting different
authorization for different Process Groups remains subject to the fundamental
problems with security boundaries that cannot be enforced.
Retaining separate authorization for Flow Configuration versus Controller
Configuration also has the appearance of a reasonable boundary, but the ability
of configurable components to access system resources breaks the enforcement
strategy.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)