-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Description
Is your feature request related to a problem? Please describe.
This is an offshoot ticket from #4032. Feast is slowly approaching a state in which all major components can be deployed as remote servers. This enables us to start thinking about a comprehensive security model for access to each of them (registry, online store, offline store)
Describe the solution you'd like
Here's a high-level overview of what I'm expecting from the security model:
-
I'd avoid incorporating user management into feast as much as possible. We should probably have a pluggable authentication module (LDAP, OIDC, etc...) that takes user/password (or token), validates it and spits out the roles that have been assigned to this particular user. Each server will have to integrate with this module separately, http feature server will get user/pass from basic auth, grpc and flight will get them according to their own standard conventions and pass credentials to the module to get the list of assigned roles. (Somewhat inspired by Airflow security model)
-
(Option 1) We enrich Feature Registry to also contain information about the roles available in the system and each feast object should be annotated with permissions. In other words, the user would run
feast applywith something like this
admin_role = FeastUserRole(name='admin')
reader_role = FeastUserRole(name='reader')
FeatureView(
name=...
schema=...
...
permissions={
'read': [role],
'write': [admin_role]
}
)
- (Option 2) Another option is to try to mimic AWS IAM and brush up on our regexes. In this case instead of annotating objects with permissions, you're annotating roles with policies.
risk_role = FeastUserRole(
name='team_risk_role',
permissions=[
FeastPermission(
action='read', //read_online, read_offline, write_online, write_offline
conditions=[{
'name': 'very_important_*',
'team': 'risk'
}]
)
]
)
FeatureView(
name='very_important_fv',
schema=...
...
tags={
'team': 'risk'
}
)
The upside of the second approach is that it's a lot less invasive than the first one. You could potentially end up with a setup where permissions and objects are managed with some level of separation between them. I think I'm more in favor of this.
- Once a server gets ahold of user roles and permission information from the registry, all components will apply the same "rules engine" to authorize the requested action.