Author: amagyar
Date: Wed Mar 30 08:15:50 2022
New Revision: 1899380
URL: http://svn.apache.org/viewvc?rev=1899380&view=rev
Log:
KNOX-2716 Document KNOX-2707 Virtual Group Mapping Provider
Modified:
knox/trunk/books/1.6.0/config_id_assertion.md
Modified: knox/trunk/books/1.6.0/config_id_assertion.md
URL:
http://svn.apache.org/viewvc/knox/trunk/books/1.6.0/config_id_assertion.md?rev=1899380&r1=1899379&r2=1899380&view=diff
==============================================================================
--- knox/trunk/books/1.6.0/config_id_assertion.md (original)
+++ knox/trunk/books/1.6.0/config_id_assertion.md Wed Mar 30 08:15:50 2022
@@ -24,7 +24,7 @@ The general responsibilities of the iden
2. determine whether it matches any group principal mapping rules and apply
them
3. if it is determined that the principal will be impersonating another
through a principal mapping rule then a Subject.doAS is required so providers
farther downstream can determine the appropriate effective principal name and
groups for the user
-#### Default Identity Assertion Provider ####
+###### Default Identity Assertion Provider ######
The following configuration is required for asserting the users identity to
the Hadoop cluster using Pseudo or Simple "authentication" and for using
Kerberos/SPNEGO for secure clusters.
<provider>
@@ -61,7 +61,7 @@ When a principal mapping is defined that
If there is no mapping to another principal then the authenticated or primary
principal is the effective principal.
-#### Principal Mapping ####
+###### Principal Mapping ######
<param>
<name>principal.mapping</name>
@@ -82,7 +82,7 @@ For multiple mappings:
<value>guest,alice=hdfs;mary=alice2</value>
</param>
-#### Group Principal Mapping ####
+###### Group Principal Mapping ######
<param>
<name>group.principal.mapping</name>
@@ -98,7 +98,256 @@ For instance:
this configuration indicates that all (*) authenticated users are members of
the "users" group and that user "hdfs" is a member of the admin group. Group
principal mapping has been added along with the authorization provider
described in this document.
-#### Concat Identity Assertion Provider ####
+
+###### Group Mapping Based on Predicates ######
+
+ <param>
+ <name>group.mapping.{mappedGroupName}</name>
+ <value>{predicate}</value>
+ </param>
+
+
+The predicate-based group mapping offers more flexibility by allowing the use
of arbitrary logical expressions to define the mappings. The predicate
expression must evaluate to a boolean result, true or false. The syntax is
inspired by the Lisp language, but it is limited to boolean expressions and
comparisons.
+
+For instance:
+
+ <param>
+ <name>group.mapping.admin</name>
+ <value>(or (username 'guest') (member 'analyst'))</value>
+ </param>
+
+This configuration maps the user to the "admin" group if either the
authenticated user is "guest" or the authenticated user is a member of the
"analyst" group.
+
+The syntax of the language is based on parenthesized prefix notation, meaning
that the operators precede their operands.
+
+The language is made up of two basic building blocks: atoms (boolean, string,
number, symbol) and lists. A list is written with its elements separated by
whitespace, and surrounded by parentheses. A list can contain other lists or
atoms.
+
+A function call or an operator is written as a list with the function or
operator's name first, and the arguments following. For instance, a function f
that takes three arguments would be called as (f arg1 arg2 arg3).
+
+
+Lists are of arbitrary length and can be nested to express more complex
conditionals.
+
+ (or
+ (and
+ (member 'admin')
+ (member 'scientist'))
+ (or
+ (username 'tom')
+ (username 'sam')))
+
+Returns:
+
+1. True if the user is either 'tom' or 'sam'
+2. True if the user is both in the 'admin' and the 'scientist' group.
+3. False otherwise.
+
+The following predicate checks if the user is a member of any group:
+
+ (!= (size groups) 0)
+
+ (not (empty groups))
+
+ (match groups '.*')
+
+
+This predicate checks if the username is either "tom" or "sam":
+
+ (match username 'tom|sam')
+
+This checks the username in a case insensitive manner:
+
+ (= (lowercase username) 'bob')
+
+
+##### Supported functions and operators #####
+
+###### or ######
+Evaluates true if one or more of its operands is true. Supports short-circuit
evaluation and variable number of arguments.
+
+Number of arguments: 1..N
+
+ (or bool1 bool2 ... boolN)
+
+Example
+
+ (or true false true)
+
+###### and ######
+Evaluates true if all of its operands are true. Supports short-circuit
evaluation and variable number of arguments.
+
+Number of arguments: 1..N
+
+ (and bool1 bool2 ... boolN)
+
+Example
+
+ (and true false true)
+
+###### not ######
+Negates the operand.
+
+Number of arguments: 1
+
+ (not aBool)
+
+Example
+
+ (not true)
+
+###### = ######
+Evaluates true if the two operands are equal.
+
+Number of arguments: 2
+
+ (= op1 op2)
+
+Example
+
+ (= 'apple' 'orange')
+
+###### != ######
+Evaluates true if the two operands are not equal.
+
+Number of arguments: 2
+
+ (!= op1 op2)
+
+Example
+
+ (!= 'apple' 'orange')
+
+###### member ######
+Evaluates true if the current user is a member of the given group
+
+Number of arguments: 1
+
+ (member aString)
+
+Example
+
+ (member 'analyst')
+
+###### username ######
+Evaluates true if the current user has the given username
+
+Number of arguments: 1
+
+ (username aString)
+
+Example
+
+ (username 'admin')
+
+This is a shorter version of (= username 'admin')
+
+###### size ######
+Gets the size of a list
+
+Number of arguments: 1
+
+ (size alist)
+
+Example
+
+ (size groups)
+
+###### empty ######
+Evaluates to true if the given list is empty
+
+Number of arguments: 1
+
+ (empty alist)
+
+Example
+
+ (empty groups)
+
+###### match ######
+Evaluates true if the given string matches to the given regexp. Or any items
of the given list matches the given regexp.
+
+Number of arguments: 2
+
+ (match aString aRegExpString)
+
+ (match aList aRegExpString)
+
+Example
+
+ (match username 'tom|sam')
+
+This function can also take a list as a first argument. In this case it will
return true if the regexp matches to any of the items in the list.
+
+ (match groups 'analyst|scientist')
+
+This returns true if the user is either in the 'analyst' group or in the
'scientist' group. The same can be expressed by combining 2 member functions
with an or expression.
+
+###### request-header ######
+Returns the value of the specified request header as a String. If the given
key doesn't exist empty string is returned.
+
+Number of arguments: 1
+
+ (request-header aString)
+
+Example
+
+ (request-header 'User-Agent')
+
+###### request-attribute ######
+Returns the value of the specified request attribute as a String. If the given
key doesn't exist empty string is returned.
+
+Number of arguments: 1
+
+ (request-attribute aString)
+
+Example
+
+ (request-attribute 'sourceRequestUrl')
+
+###### session ######
+
+Returns the value of the specified session attribute as a String. If the given
key doesn't exist empty string is returned.
+
+Number of arguments: 1
+
+ (session aString)
+
+Example
+
+ (session 'subject.userRoles')
+
+###### lowercase ######
+Converts the given string to lowercase.
+
+Number of arguments: 1
+
+ (lowercase aString)
+
+Example
+
+ (lowercase 'KNOX')
+
+###### uppercase ######
+Converts the given string to uppercase.
+
+Number of arguments: 1
+
+ (uppercase aString)
+
+Example
+
+ (uppercase 'knox')
+
+
+### Constants ###
+The following constants are populated automatically from the current security
context.
+
+###### username ######
+The username (principal) of the current user, derived from
javax.security.auth.Subject.
+
+###### groups ######
+The groups of the current user (as determined by the authentication provider),
derived from subject.getPrincipals(GroupPrincipal.class).
+
+###### Concat Identity Assertion Provider ######
The Concat identity assertion provider allows for composition of a new user
principal through the concatenation of optionally configured prefix and/or
suffix provider parameters. This is a useful assertion provider for converting
an incoming identity into a disambiguated identity within the Hadoop cluster
based on what topology is used to access Hadoop.
The following configuration would convert the user principal into a value that
represents a domain specific identity where the identities used inside the
Hadoop cluster represent this same separation.
@@ -117,7 +366,7 @@ The above configuration will result in a
In addition to the concat.suffix parameter, the provider supports the setting
of a prefix through a `concat.prefix` parameter.
-#### SwitchCase Identity Assertion Provider ####
+###### SwitchCase Identity Assertion Provider ######
The SwitchCase identity assertion provider solves issues where down stream
ecosystem components require user and group principal names to be a specific
case.
An example of how this provider is enabled and configured within the
`<gateway>` section of a topology file is shown below.
This particular example will switch user principals names to lower case and
group principal names to upper case.
@@ -146,7 +395,7 @@ group.principal.case | The case mapping
If no parameters are provided the full defaults will results in both user and
group principal names being switched to lower case.
A setting of "none" or anything other than "upper" or "lower" leaves the case
of the principal name unchanged.
-#### Regular Expression Identity Assertion Provider ####
+###### Regular Expression Identity Assertion Provider ######
The regular expression identity assertion provider allows incoming identities
to be translated using a regular expression, template and lookup table.
This will probably be most useful in conjunction with the HeaderPreAuth
federation provider.
@@ -215,27 +464,27 @@ The 'hadoop.security.group.mapping' prop
</param>
Some of the valid implementations are as follows:
-#### org.apache.hadoop.security.JniBasedUnixGroupsMappingWithFallback
+###### org.apache.hadoop.security.JniBasedUnixGroupsMappingWithFallback
This is the default implementation and will be picked up if
'hadoop.security.group.mapping' is not specified. This implementation will
determine if the Java Native Interface (JNI) is available. If JNI is available,
the implementation will use the API within Hadoop to resolve a list of groups
for a user. If JNI is not available then the shell implementation,
`org.apache.hadoop.security.ShellBasedUnixGroupsMapping`, is used, which shells
out with the `bash -c id -gn <user> ; id -Gn <user>` command (for a Linux/Unix
environment) or the `groups -F <user>` command (for a Windows environment) to
resolve a list of groups for a user.
-#### org.apache.hadoop.security.JniBasedUnixGroupsNetgroupMappingWithFallback
+###### org.apache.hadoop.security.JniBasedUnixGroupsNetgroupMappingWithFallback
As above, if JNI is available then we get the netgroup membership using Hadoop
native API, else fallback on ShellBasedUnixGroupsNetgroupMapping to resolve
list of groups for a user.
-#### org.apache.hadoop.security.ShellBasedUnixGroupsMapping
+###### org.apache.hadoop.security.ShellBasedUnixGroupsMapping
Uses the `bash -c id -gn <user> ; id -Gn <user>` command (for a Linux/Unix
environment) or the `groups -F <user>` command (for a Windows environment) to
resolve list of groups for a user.
-#### org.apache.hadoop.security.ShellBasedUnixGroupsNetgroupMapping
+###### org.apache.hadoop.security.ShellBasedUnixGroupsNetgroupMapping
Similar to `org.apache.hadoop.security.ShellBasedUnixGroupsMapping` except it
uses `getent netgroup` command to get netgroup membership.
-#### org.apache.hadoop.security.LdapGroupsMapping
+###### org.apache.hadoop.security.LdapGroupsMapping
This implementation connects directly to an LDAP server to resolve the list of
groups. However, this should only be used if the required groups reside
exclusively in LDAP, and are not materialized on the Unix servers.
-#### org.apache.hadoop.security.CompositeGroupsMapping
+###### org.apache.hadoop.security.CompositeGroupsMapping
This implementation asks multiple other group mapping providers for
determining group membership, see [Composite Groups
Mapping](https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/GroupsMapping.html#Composite_Groups_Mapping)
for more details.