The Shibboleth V1 software has reached its End of Life and is no longer supported. This documentation is available for historical purposes only.

ShibXACML

Shibboleth: XACML-ARPs

This page provides a patch that is extending Shibboleth by a new ARP-architecture, i.e.:

  • using XACML as policy language
  • using openLDAP for decentral storage of ARPs

After a short introduction, all required steps are explained to get the extension running.

Introduction

The task of identity management is organization-internal and central administration of data about coworkers, customers, partners
and guests as well as their access to local resources and services. This traditional solution of identity management covers
neither the rising necessity for the access to organization-external services and resources nor the efficient user
administration of partner enterprises (e.g. in B2B). Thus the question is, how organization-internal as well as -external
information systems and their users can be integrated and administered in domain-exceeding networks. Exactly hereby the
federated identity management (FIM) comes to cover those needs and requirements.

In federated identity management systems user-data, needed for authentication and authorization, has to be exchanged
between different instances (e.g. between two organizations, if a user of an organization wants to use services of another
organization). In order to run the exchange of user information within a controlled framework, attributes release
policies (ARPs) are used. With the help of the ARPs, guidelines can be set up, that restrict the transmission of data. By
regulating the release of data, the important aspect of data security can be guaranteed.

Regarding Shibboleth, yet the expressiveness of the Shibboleth-ARPs is only sufficient for relative simple scenarios.

Within the scope of a diploma thesis at "Ludwig Maximilian Universitaet" and "Leibniz-Rechenzentrum" in Munich,
Shibboleth 1.3c IdP has been prototypically extended by a new ARP architecture using the powerful policy language 'XACML' (see XACML Specification).

Structure of the thesis:

After an introduction and description of Shibboleth, the thesis describes scenarios within the range of FIM.
From these scenarios criteria are derived, which an ARP system must provide. In respect to these criteria,
well-known policy languages are examined regarding the suitability for ARPs. The best suitable policy language is
selected for the new architecture and its use is described in detail. On basis of the selected policy
language a new policy based privacy management architecture for Shibboleth is developed and imlpemented prototypically
in Java. The implementation uses an already existing policy decision point of Sun. Additionally a new priority-based
Policy-Combining-Algorithm is implemented. Examples, describing the configuration and the use of the new architecture, conclude the work.

New architecture:

The new architecture is using XACML as policy language to describe ARPs. In the new architecture can be expressed:

  • attributes to release
  • complex conditions (i.e. the use of several nested functions over more than one attribute is supported)
  • purposes
  • actions
  • obligations
  • subjects (Service Provider)
  • roles
  • combining algorithms for rules/policies
  • groupings of information
  • policies depending on external information like date or time
  • users or groups for which an ARP is valid

To see the complete work go to
Diploma Thesis
(diploma thesis is written in German).

For a quick start see the following section.

Set up the new architecture

For detailed information about how to make Shibboleth 1.3c using the new architecture, see the diploma thesis as
stated above. The points below are only summing up the steps to get Shibboleth using our investigated XACML-ARPs:

1) Apply Patch-file

Apply the attached patch-file 'shibPatch' to the source code of Shibboleth 1.3.c to achieve the new class files of shibboleth

  • change directory to '.../shibboleth/src/'
  • copy the patch-file to this directory
  • type in the linux-command 'patch -p1 < shibPatch'
  • compile the new source code
  • replace all class files in your working shibboleth IdP with the new ones
2) Configure openLDAP

Configure the ldap Server (for infos about using openLDAP see openLDAP) for enabling the storage of XACML-ARPs and usergroups

  • set up one (or more) ldap-server(s) (e.g. located at your IdP)
  • configure the Arp Repository in idp.xml like this:
    <ReleasePolicyEngine>
     <ArpRepository implementation="edu.internet2.middleware.
      shibboleth.aa.arp.provider.LdapArpRepository">
    	  <Path>ldap://ecample.com:389/dc=example,dc=com
    	  </Path>
    	  <Path>
    	  ...more LDAP-servers...
    	  </Path>
     </ArpRepository>
    </ReleasePolicyEngine>
    
  • include the following two schemes in ldap, for describing usergroups and ARPs:
	
attributetype (1.1.1.1.1
 NAME 'XACMLgroupName'
 DESC 'name of the group'
 EQUALITY caseIgnoreMatch
 SUBSTR caseIgnoreSubstringsMatch
 SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE)
attributetype (1.1.1.1.2
 NAME 'XACMLmembers'
 DESC 'multi-valued: members of the group'
 EQUALITY caseIgnoreMatch
 SUBSTR caseIgnoreSubstringsMatch
 SYNTAX '1.3.6.1.4.1.1466.115.121.1.15')
objectclass (1.1.1.2.1
 NAME 'XACMLgroup'
 STRUCTURAL
 MUST (XACMLgroupName \$ XACMLmembers))


attributetype (2.1.1.1.0
 NAME 'XACMLpolicyId'
 DESC 'name of policy'
 EQUALITY caseIgnoreMatch
 SUBSTR caseIgnoreSubstringsMatch
 SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' SINGLE-VALUE)
attributetype (2.1.1.1.1
 NAME 'XACMLpolicy'
 DESC 'contains the policy'
 EQUALITY caseIgnoreMatch
 SUBSTR caseIgnoreSubstringsMatch
 SYNTAX '1.3.6.1.4.1.1466.115.121.1.15')
attributetype (2.1.1.1.2
 NAME 'XACMLusers'
 DESC 'multi-valued: for whom policies are applied'
 EQUALITY caseIgnoreMatch
 SUBSTR caseIgnoreSubstringsMatch
 SYNTAX '1.3.6.1.4.1.1466.115.121.1.15')
attributetype (2.1.1.1.3
 NAME 'XACMLgroupNames'
 DESC 'multi-valued: groups for which users policies are applied'
 EQUALITY caseIgnoreMatch
 SUBSTR caseIgnoreSubstringsMatch
 SYNTAX '1.3.6.1.4.1.1466.115.121.1.15')
attributetype (2.1.1.1.4
 NAME 'XACMLtargets'
 DESC 'multi-valued: targets of policy'
 EQUALITY caseIgnoreMatch
 SUBSTR caseIgnoreSubstringsMatch
 SYNTAX '1.3.6.1.4.1.1466.115.121.1.15')
attributetype (2.1.1.1.5
 NAME 'XACMLroles'
 DESC 'multi-valued: roles for which the policy is'
 EQUALITY caseIgnoreMatch
 SUBSTR caseIgnoreSubstringsMatch
 SYNTAX '1.3.6.1.4.1.1466.115.121.1.15')
objectclass (2.1.1.2.1
 NAME 'XACMLpolicy'
 STRUCTURAL
 MUST (XACMLpolicyId \$ XACMLpolicy)
 MAY (XACMLusers \$ XACMLgroupNames \$ XACMLtargets \$ XACMLroles))
3) Create ARPs

Now you can create usergroups and XACML-ARPs, e.g.:

Entry for describing a group (stored under subtree 'ou=groups'):

dn:                     XACMLgroupName=testGroup,
                        ou=groups,
                        dc=example,
                        dc=com
objectclass:            XACMLgroup
XACMLgroupName:         testGroup
XACMLmembers:           user1
XACMLmembers:           user2

Entry for describing a policy, valid for the group stated above (stored under subtree 'ou=sitearps,ou=policies'):

dn:                     XACMLpolicyId=exampleArp,
                        ou=sitearps,
                        ou=policies,
                        dc=example,
                        dc=com
objectclass:            XACMLpolicy
XACMLpolicyId:          exampleArp
XACMLpolicy:            <Policy> 
 ...see Example ARP... 
 </Policy> 
XACMLgroupNames:        testGroup
XACMLroles:             defaultrole

Example ARP

Here is an example XACML-ARP. For description see the tag 'Description'.

 <Policy 
 xmlns="urn:oasis:names:tc:xacml:1.0:policy" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xmlns:context="urn:oasis:names:tc:xacml:1.0:context" 
 xmlns:condition="urn:mace:dir:attribute-def" 
 PolicyId="exampleArp" 
 RuleCombiningAlgId="urn:oasis:names:tc:xacml:1.0:
 rule-combining-algorithm:ordered-permit-overrides"> 
 <Description>  
 Attribute to release: EduPersonNickname 
 Condition: only release eduPersonNickname, if
 eduPersonPrincipalName has the value of foo.bar
 Purpose: authorization 
 Action: read 
 Target: SP1 or SP2 or SP3
 Obligation: delete data after end of term
 Combination:
 - ARPpriority: combines all found applicable policies based on priority (parameter set in tag 'CombinerParameter')
 - ordered-permit-overrides: combines rules within this policy 
 Role: defaultrole
 </Description>
 <PolicyDefaults>
 <XPathVersion>
 http://www.w3.org/TR/1999/Rec-xpath-19991116
 </XPathVersion>
 </PolicyDefaults>
 <CombinerParameters>
 <CombinerParameter ParameterName="ARPpriority">
 100
 </CombinerParameter>
 </CombinerParameters>
 <Target>
 <Subjects> 
 <Subject> 
 <SubjectMatch 
 MatchId="urn:oasis:names:tc:xacml:1.0:function:regexp-string-match"> 
 <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">
 SP1|SP2|SP3
 </AttributeValue> 
 <SubjectAttributeDesignator 
 DataType="http://www.w3.org/2001/XMLSchema#string" 
 AttributeId="urn:oasis:names:tc:xacml:1.0:subject:service-provider"/> 
 </SubjectMatch> 
 </Subject> 
 </Subjects> 
 <Resources> 
 <Resource> 
 <ResourceMatch 
 MatchId="urn:oasis:names:tc:xacml:2.0:function:anyURI-equal"> 
 <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#anyURI">
 urn:mace:dir:attribute-def:eduPersonNickname
 </AttributeValue> 
 <ResourceAttributeDesignator 
 DataType="http://www.w3.org/2001/XMLSchema#anyURI" 
 AttributeId="urn:oasis:names:tc:xacml:1.0:resource:resource-id"/> 
 </ResourceMatch> 
 </Resource> 
 </Resources> 
 <Actions> 
 <AnyAction/> 
 </Actions> 
 </Target> 
 <Rule RuleId="Rule1" Effect="Permit"> 
 <Target> 
 <Subjects> 
 <AnySubject/> 
 </Subjects> 
 <Resources> 
 <AnyResource/> 
 </Resources> 
 <Actions> 
 <Action> 
 <ActionMatch 
 MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal"> 
 <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">
 read
 </AttributeValue> 
 <ActionAttributeDesignator 
 DataType="http://www.w3.org/2001/XMLSchema#string" 
 AttributeId="urn:oasis:names:tc:xacml:1.0:action:action-id"/> 
 </ActionMatch> 
 <ActionMatch 
 MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal"> 
 <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">
 authorization
 </AttributeValue> 
 <ActionAttributeDesignator 
 DataType="http://www.w3.org/2001/XMLSchema#string" 
 AttributeId="urn:oasis:names:tc:xacml:1.0:action:purpose"/> 
 </ActionMatch> 
 </Action> 
 </Actions> 
 </Target>
 <Condition 
 FunctionId="urn:oasis:names:tc:xacml:1.0:function:any-of-any">
 <Function 
 FunctionId="urn:oasis:names:tc:xacml:1.0:
 function:regexp-string-match"/>
 <Apply 
 FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-bag">
 <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">
 foo.bar
 </AttributeValue>
 </Apply>
 <AttributeSelector 
 RequestContextPath="//context:ResourceContent/
 condition:eduPersonPrincipalName/text()" 
 DataType="http://www.w3.org/2001/XMLSchema#string"/>
 </Condition>
 </Rule> 
 <!-- ... nothing more to release ... --> 
 <Rule RuleId="releaseNothingMore" Effect="Deny"/> 
 <Obligations>
 <Obligation 
 ObligationId="data-has-to-be-deleted-after-end-of-term" 
 FulfillOn="Permit">
 <AttributeAssignment AttributeId="resource" 
 DataType="http://www.w3.org/2001/XMLSchema#anyURI">
 urn:oasis:names:tc:xacml:1.0:resource:resource-id
 </AttributeAssignment>
 </Obligation>
 </Obligations>
 </Policy> 

For errors or additional information see the "shib-error.log" after authentication with Shibboleth.

It is worth mentioning that the new architecture must not be seen as a finished work, in fact there are many
newly-created starting points.

  • Set ALLOWTOPICCHANGE = Main.MatthiasEbert

-- Main.MatthiasEbert - 05 Dec 2006