[ 
https://issues.apache.org/jira/browse/KNOX-1740?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Larry McCay updated KNOX-1740:
------------------------------
    Description: 
There are token exchange scenarios where an application may want to acquire a 
KnoxToken on behalf of a user authenticated by the application. We need to 
implement a version of the Hadoop Trusted Proxy/Impersonation pattern for Knox 
at the topology level.

This includes:
 * Principal assertion method (possibilities: doAs query param, path segment 
within an API, HTTP header)

 *  Config within topology for trusted principals, groups that they are allowed 
to impersonate, users that they are allowed to impersonate, ip address from 
which requests are expected
 * Make part of the identity assertion provider since this is the provider that 
determines which identity to assert to the down stream service
 * Config will need to be qualified by service due to the multiple services per 
topology

Example to indicate which type of impersonation mechanism to use for a given 
service/s:
{code:xml}
<param>
  <name>impersonated.principal.path-segment</name>
  <value>KNOXTOKEN;credentials</value>
 </param>
 <param>
  <name>impersonated.principal.header</name>
  <value>*;SM_USER</value>
 </param>
 <param>
  <name>impersonated.principal.query-param</name>
  <value>WEBHDFS,HIVE;doas</value>
 </param>
{code}
 Example to indicate trusted service principals, hosts, groups:
{code:xml}
<param>
  <name>knox.proxyuser.hive.hosts</name>
  <value>10.222.0.0/16,10.113.221.221</value>
</param>
<param>
  <name>knox.proxyuser.hive.users</name>
  <value>user1,user2</value>
</param>
<param>
  <name>knox.proxyuser.hive.groups</name>
  <value>users</value>
</param>
{code}

Putting the above in identity assertion provider - or any providers for that 
matter will potentially impact sharing of provider configs.
However, it is inappropriate to make it global config within gateway-site.xml 
as this would be bad across tenants and clusters - and therefore topologies.

We could possibly extend the dispatch with enforcing the above and that would 
mean making them Service level params rather than identity assertion. We could 
also avoid the need to disambiguate the impersonated.principal mechanism by 
service.

Example:

{code:xml}
<service>
  <role>KNOXTOKEN</role>
  <param>
    <name>impersonated.principal.query-param</name>
    <value>doas</value>
  </param>
  <param>
    <name>knox.proxyuser.hive.hosts</name>
    <value>10.222.0.0/16,10.113.221.221</value>
  </param>
  <param>
    <name>knox.proxyuser.hive.users</name>
    <value>user1,user2</value>
  </param>
  <param>
    <name>knox.proxyuser.hive.groups</name>
    <value>users</value>
  </param>
</service>
{code}

Another possibility is to configure it within the services as described above 
and push the config up at deployment time so that it can be available to 
identity assertion without the config needed to be shared across all topologies 
sharing the provider-config.

This last approach seems like a good approach even though it is leaking service 
config into providers. Currently, identity assertion is where the impersonation 
attempts are being scrubbed to avoid inadvertently allowing impersonation due 
to case sensitivity of query params and things like that. Extending that logic 
to only scrub when impersonation isn't allowed seems appropriate.

Perhaps, this approach can be turned into a generic provider param service 
level override. Then the config is officially in identity assertion so it could 
be shared across topologies by configuring them within the provider and also 
added by services to allow for service level config to drive it and not affect 
other topologies that are sharing the same config.

  was:
There are token exchange scenarios where an application may want to acquire a 
KnoxToken on behalf of a user authenticated by the application. We need to 
implement a version of the Hadoop Trusted Proxy/Impersonation pattern for Knox 
at the topology level.

This includes:
 * Principal assertion method (possibilities: doAs query param, path segment 
within an API, HTTP header)

 *  Config within topology for trusted principals, groups that they are allowed 
to impersonate, users that they are allowed to impersonate, ip address from 
which requests are expected
 * Make part of the identity assertion provider since this is the provider that 
determines which identity to assert to the down stream service
 * Config will need to be qualified by service due to the multiple services per 
topology

Example to indicate which type of impersonation mechanism to use for a given 
service/s:
{code:xml}
<param>
  <name>impersonated.principal.path-segment</name>
  <value>KNOXTOKEN;credentials</value>
 </param>
 <param>
  <name>impersonated.principal.header</name>
  <value>*;SM_USER</value>
 </param>
 <param>
  <name>impersonated.principal.query-param</name>
  <value>WEBHDFS,HIVE;doas</value>
 </param>
{code}
 Example to indicate trusted service principals, hosts, groups:
{code:xml}
<param>
  <name>knox.proxyuser.hive.hosts</name>
  <value>10.222.0.0/16,10.113.221.221</value>
</param>
<param>
  <name>knox.proxyuser.hive.users</name>
  <value>user1,user2</value>
</param>
<param>
  <name>knox.proxyuser.hive.groups</name>
  <value>users</value>
</param>
{code}

Putting the above in identity assertion provider - or any providers for that 
matter will potentially impact sharing of provider configs.
However, it is inappropriate to make it global config within gateway-site.xml 
as this would be bad across tenants and clusters - and therefore topologies.

We could possibly extend the dispatch with enforcing the above and that would 
mean making them Service level params rather than identity assertion. We could 
also avoid the need to disambiguate the impersonated.principal mechanism by 
service.

Example:

{code:xml}
<service>
  <role>KNOXTOKEN</role>
  <param>
    <name>impersonated.principal.query-param</name>
    <value>doas</value>
  </param>
  <param>
    <name>knox.proxyuser.hive.hosts</name>
    <value>10.222.0.0/16,10.113.221.221</value>
  </param>
  <param>
    <name>knox.proxyuser.hive.users</name>
    <value>user1,user2</value>
  </param>
  <param>
    <name>knox.proxyuser.hive.groups</name>
    <value>users</value>
  </param>
</service>
{code}


> Add Trusted Proxy Support to Knox
> ---------------------------------
>
>                 Key: KNOX-1740
>                 URL: https://issues.apache.org/jira/browse/KNOX-1740
>             Project: Apache Knox
>          Issue Type: Improvement
>          Components: Server
>            Reporter: Larry McCay
>            Assignee: Larry McCay
>            Priority: Major
>             Fix For: 1.3.0
>
>
> There are token exchange scenarios where an application may want to acquire a 
> KnoxToken on behalf of a user authenticated by the application. We need to 
> implement a version of the Hadoop Trusted Proxy/Impersonation pattern for 
> Knox at the topology level.
> This includes:
>  * Principal assertion method (possibilities: doAs query param, path segment 
> within an API, HTTP header)
>  *  Config within topology for trusted principals, groups that they are 
> allowed to impersonate, users that they are allowed to impersonate, ip 
> address from which requests are expected
>  * Make part of the identity assertion provider since this is the provider 
> that determines which identity to assert to the down stream service
>  * Config will need to be qualified by service due to the multiple services 
> per topology
> Example to indicate which type of impersonation mechanism to use for a given 
> service/s:
> {code:xml}
> <param>
>   <name>impersonated.principal.path-segment</name>
>   <value>KNOXTOKEN;credentials</value>
>  </param>
>  <param>
>   <name>impersonated.principal.header</name>
>   <value>*;SM_USER</value>
>  </param>
>  <param>
>   <name>impersonated.principal.query-param</name>
>   <value>WEBHDFS,HIVE;doas</value>
>  </param>
> {code}
>  Example to indicate trusted service principals, hosts, groups:
> {code:xml}
> <param>
>   <name>knox.proxyuser.hive.hosts</name>
>   <value>10.222.0.0/16,10.113.221.221</value>
> </param>
> <param>
>   <name>knox.proxyuser.hive.users</name>
>   <value>user1,user2</value>
> </param>
> <param>
>   <name>knox.proxyuser.hive.groups</name>
>   <value>users</value>
> </param>
> {code}
> Putting the above in identity assertion provider - or any providers for that 
> matter will potentially impact sharing of provider configs.
> However, it is inappropriate to make it global config within gateway-site.xml 
> as this would be bad across tenants and clusters - and therefore topologies.
> We could possibly extend the dispatch with enforcing the above and that would 
> mean making them Service level params rather than identity assertion. We 
> could also avoid the need to disambiguate the impersonated.principal 
> mechanism by service.
> Example:
> {code:xml}
> <service>
>   <role>KNOXTOKEN</role>
>   <param>
>     <name>impersonated.principal.query-param</name>
>     <value>doas</value>
>   </param>
>   <param>
>     <name>knox.proxyuser.hive.hosts</name>
>     <value>10.222.0.0/16,10.113.221.221</value>
>   </param>
>   <param>
>     <name>knox.proxyuser.hive.users</name>
>     <value>user1,user2</value>
>   </param>
>   <param>
>     <name>knox.proxyuser.hive.groups</name>
>     <value>users</value>
>   </param>
> </service>
> {code}
> Another possibility is to configure it within the services as described above 
> and push the config up at deployment time so that it can be available to 
> identity assertion without the config needed to be shared across all 
> topologies sharing the provider-config.
> This last approach seems like a good approach even though it is leaking 
> service config into providers. Currently, identity assertion is where the 
> impersonation attempts are being scrubbed to avoid inadvertently allowing 
> impersonation due to case sensitivity of query params and things like that. 
> Extending that logic to only scrub when impersonation isn't allowed seems 
> appropriate.
> Perhaps, this approach can be turned into a generic provider param service 
> level override. Then the config is officially in identity assertion so it 
> could be shared across topologies by configuring them within the provider and 
> also added by services to allow for service level config to drive it and not 
> affect other topologies that are sharing the same config.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to