Changeset 7705


Ignore:
Timestamp:
05/11/10 07:59:22 (9 years ago)
Author:
pjkersha
Message:

Working e2e tests with ESGF Group/Role? AttributeValue? integrated into SAML Attribute Queries and XACML Policy - ndg.security.test.wsgi.authz.test_authz unit test.

Location:
TI12-security/trunk/NDGSecurity/python
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • TI12-security/trunk/NDGSecurity/python/ndg_security_server/ndg/security/server/xacml/ctx_handler/saml_ctx_handler.py

    r7698 r7705  
    122122        """Load Policy file, mapping file and extensions function.  In each case 
    123123        load only if they're set 
    124         """ 
     124        """   
     125        # This must be called first before the policy is loaded so that any 
     126        # new custom types are added before a parse is attempted.           
     127        if self.xacmlExtFunc: 
     128            self.xacmlExtFunc() 
     129             
    125130        if self.policyFilePath: 
    126131            self.pdp = PDP.fromPolicySource(self.policyFilePath,  
     
    129134        if self.pip.mappingFilePath: 
    130135            self.pip.readMappingFile() 
    131              
    132         if self.xacmlExtFunc: 
    133             self.xacmlExtFunc() 
    134136         
    135137    @classmethod 
  • TI12-security/trunk/NDGSecurity/python/ndg_security_server/ndg/security/server/xacml/esgf_ext.py

    r7698 r7705  
    5757    __slots__ = ('__group', '__role') 
    5858     
    59     def __init__(self): 
     59    def __init__(self, value=None): 
    6060        """Add additional attributes to AttributeValue base type""" 
    6161        super(ESGFGroupRoleAttributeValue, self).__init__() 
    6262        self.__group = None 
    6363        self.__role = self.__class__.ROLE_DEFAULT_VALUE 
     64         
     65        if value is not None: 
     66            self.value = value 
    6467        
    6568    @property 
     
    109112        """ 
    110113        return self.group, self.role 
    111      
     114 
     115    @value.setter 
     116    def value(self, value): 
     117        if not isinstance(value, (tuple, list)) and len(value) != 2: 
     118            raise TypeError('Expecting a two element tuple or list for group/' 
     119                            'role value; got %r' % type(value)) 
     120             
     121        self.group, self.role = value     
    112122 
    113123class ESGFGroupRoleBag(BagBase): 
  • TI12-security/trunk/NDGSecurity/python/ndg_security_server/ndg/security/server/xacml/pip/saml_pip.py

    r7698 r7705  
    2626 
    2727from ndg.saml.saml2.core import (AttributeQuery as SamlAttributeQuery,  
    28                                  Attribute as SamlAttribute) 
     28                                 Attribute as SamlAttribute, 
     29                                 Assertion as SamlAssertion) 
    2930from ndg.saml.utils import TypedList as SamlTypedList 
    3031from ndg.saml.saml2.binding.soap.client.attributequery import \ 
     
    403404                      'attribute designator related queries') 
    404405            return None 
     406             
     407        attributeFormat = attributeDesignator.dataType 
     408        attributeId = attributeDesignator.attributeId 
    405409         
    406410        if not isinstance(context, XacmlRequestCtx): 
     
    415419             
    416420        attributeAuthorityURI = self.__attributeId2AttributeAuthorityMap.get( 
    417                                             attributeDesignator.attributeId, 
    418                                             None) 
     421                                            attributeId, None) 
    419422        if attributeAuthorityURI is None: 
    420423            log.debug("No matching attribute authority endpoint found in " 
    421424                      "mapping file %r for input attribute ID %r",  
    422                       self.mappingFilePath, 
    423                       attributeDesignator.attributeId) 
    424              
     425                      self.mappingFilePath, attributeId) 
    425426            return None 
    426427         
     
    449450            xacmlCtxSubject = subject 
    450451             
    451         attributeFormat = attributeDesignator.dataType 
    452         attributeId = attributeDesignator.attributeId 
    453              
    454452        # Check for cached attributes for this subject (i.e. user)         
    455453        # If none found send a query to the attribute authority 
    456454        if self.cacheSessions: 
     455            attributeIdFoundInCache = False 
    457456            sessionCache = SessionCache(subjectId, 
    458457                                        data_dir=self.__sessionCacheDataDir, 
    459458                                        timeout=self.__sessionCacheTimeout) 
    460459            assertions = sessionCache.retrieve(attributeAuthorityURI) 
    461         else: 
    462             assertions = None 
    463              
    464         if assertions is None: 
     460            if assertions is not None: 
     461                # Check for attributes matching the requested ID 
     462                for assertion in assertions: 
     463                    for statement in assertion.attributeStatements: 
     464                        for attribute in statement.attributes: 
     465                            if attribute.name == attributeId: 
     466                                attributeIdFoundInCache = True 
     467                                break 
     468        else: 
     469            attributeIdFoundInCache = False 
     470             
     471        if not attributeIdFoundInCache: 
    465472            # No cached assertions are available for this Attribute Authority, 
    466             # make a fresh call  
    467              
    468             # Get the id of the attribute to be queried for and add it to the  
     473            # for the required attribute ID - make a fresh call to the  
     474            # Attribute Authority  
     475             
     476            # Initialise the attribute to be queried for and add it to the  
    469477            # SAML query 
    470              
    471478            samlAttribute = SamlAttribute() 
    472             samlAttribute.name = attributeDesignator.attributeId 
     479            samlAttribute.name = attributeId 
    473480            samlAttribute.nameFormat = attributeFormat 
    474481            self.attributeQueryBinding.query.attributes.append(samlAttribute) 
     
    493500                                                                SamlAttribute) 
    494501         
    495             assertions = response.assertions 
     502            if assertions is None: 
     503                assertions = SamlTypedList(SamlAssertion) 
     504                 
     505            assertions.extend(response.assertions) 
     506             
    496507            if self.cacheSessions: 
    497508                sessionCache.add(assertions, attributeAuthorityURI) 
  • TI12-security/trunk/NDGSecurity/python/ndg_security_test/ndg/security/test/config/authorisationservice/authorisation-service.ini

    r7517 r7705  
    7070authz.ctx_handler.assertionLifetime = 86400 
    7171 
     72# Add Earth System Grid custom types and functions to XACML 
     73authz.ctx_handler.xacmlExtFunc = ndg.security.server.xacml.esgf_ext:addEsgfXacmlSupport 
     74 
    7275# 
    7376# Policy Information Point interface settings 
     
    9194authz.ctx_handler.pip.attributeQuery.issuerFormat = %(authz.ctx_handler.issuerFormat)s 
    9295 
     96# Enable support for ESGF Group/Role Attribute Value in SAML Attribute queries 
     97authz.ctx_handler.pip.attributeQuery.serialise = ndg.saml.xml.etree:AttributeQueryElementTree.toXML 
     98authz.ctx_handler.pip.attributeQuery.deserialise = ndg.security.common.saml_utils.esgf.xml.etree:ESGFResponseElementTree.fromXML 
     99 
    93100# These settings configure SSL mutual authentication for the query to the SAML Attribute Authority 
    94101authz.ctx_handler.pip.attributeQuery.sslCertFilePath = $NDGSEC_TEST_CONFIG_DIR/pki/localhost.crt 
     
    102109 
    103110[handlers] 
    104 keys = console 
     111keys = console, logfile 
    105112 
    106113[formatters] 
     
    123130 
    124131[formatter_generic] 
    125 format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s 
     132format = %(asctime)s.%(msecs)03d %(levelname)-8.8s [%(name)s:%(lineno)d] %(message)s 
    126133datefmt = %Y/%m/%d %H:%M:%S 
     134 
     135[handler_logfile] 
     136class = handlers.RotatingFileHandler 
     137level=NOTSET 
     138formatter=generic 
     139args=(os.path.join('%(here)s', 'service.log'), 'a', 10000, 2) 
  • TI12-security/trunk/NDGSecurity/python/ndg_security_test/ndg/security/test/config/authorisationservice/pip-mapping.txt

    r7330 r7705  
    2020# Entries are whitespace delimited <attribute id> <attribute authority> 
    2121urn:siteA:security:authz:1.0:attr https://localhost:5443/AttributeAuthority 
     22urn:esg:sitea:grouprole https://localhost:5443/AttributeAuthority 
    2223myattributeid https://myattributeauthority.ac.uk/ 
    2324http://someotherattributeid.schema https://another.ac.uk/attributeservice/ 
  • TI12-security/trunk/NDGSecurity/python/ndg_security_test/ndg/security/test/config/authorisationservice/policy.xml

    r7446 r7705  
    33    xmlns="urn:oasis:names:tc:xacml:2.0:policy:schema:cd:04" 
    44    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     5    xmlns:esg="http://www.earthsystemgrid.org/" 
    56    xsi:schemaLocation="urn:oasis:names:tc:xacml:2.0:policy:schema:cd:04 http://docs.oasis-open.org/xacml/access_control-xacml-2.0-policy-schema-cd-04.xsd" 
    67    RuleCombiningAlgId="urn:oasis:names:tc:xacml:1.0:rule-combining-algorithm:permit-overrides"> 
     
    181182        </Target> 
    182183    </Rule> 
     184    <Rule RuleId="Rule using ESGF Group/Role Attribute Values" Effect="Permit"> 
     185        <!--  
     186            Subject must have at least one of a group of ESGF group/role 
     187            attribute values 
     188             
     189            Resource id is a regular expression 
     190        --> 
     191        <Target> 
     192            <Resources> 
     193                <Resource> 
     194                    <!-- Pattern match the request URI --> 
     195                    <ResourceMatch MatchId="urn:oasis:names:tc:xacml:2.0:function:anyURI-regexp-match"> 
     196                        <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#anyURI">^http://localhost/esgf-attribute-value-restricted.*$</AttributeValue> 
     197                        <ResourceAttributeDesignator 
     198                            AttributeId="urn:oasis:names:tc:xacml:1.0:resource:resource-id" 
     199                            DataType="http://www.w3.org/2001/XMLSchema#anyURI"/> 
     200                    </ResourceMatch> 
     201                </Resource> 
     202            </Resources> 
     203        </Target> 
     204         
     205        <!--  
     206            The condition narrows down the constraints layed down in the target to 
     207            something more specific 
     208             
     209            The user must have at least one of the roles set - in this 
     210            case 'staff' 
     211        --> 
     212        <Condition> 
     213            <Apply FunctionId="urn:esg:security:xacml:2.0:function:grouprole-at-least-one-member-of"> 
     214                <SubjectAttributeDesignator  
     215                    AttributeId="urn:esg:sitea:grouprole" 
     216                    DataType="groupRole"/> 
     217                <Apply FunctionId="urn:esg:security:xacml:2.0:function:grouprole-bag"> 
     218                    <AttributeValue DataType="groupRole"> 
     219                        <esg:groupRole> 
     220                            <esg:group>siteagroup</esg:group> 
     221                            <esg:role>default</esg:role> 
     222                        </esg:groupRole> 
     223                    </AttributeValue> 
     224                    <AttributeValue DataType="groupRole"> 
     225                        <esg:groupRole> 
     226                            <esg:group>Staff</esg:group> 
     227                            <esg:role>Administrator</esg:role> 
     228                        </esg:groupRole> 
     229                    </AttributeValue> 
     230                </Apply> 
     231            </Apply> 
     232        </Condition> 
     233    </Rule> 
    183234</Policy> 
  • TI12-security/trunk/NDGSecurity/python/ndg_security_test/ndg/security/test/unit/wsgi/__init__.py

    r7077 r7705  
    99__contact__ = "Philip.Kershaw@stfc.ac.uk" 
    1010__revision__ = '$Id$' 
     11from os import path 
    1112 
    1213import paste.httpserver 
     
    2930         
    3031        if cfgFilePath: 
    31             fileConfig(cfgFilePath) 
     32            fileConfig(cfgFilePath, defaults={'here':path.dirname(cfgFilePath)}) 
    3233            app = loadapp('config:%s' % cfgFilePath) 
    3334             
  • TI12-security/trunk/NDGSecurity/python/ndg_security_test/ndg/security/test/unit/wsgi/authz/test_authz.py

    r7517 r7705  
    172172            status = "200 OK" 
    173173             
     174        elif environ['PATH_INFO'] == '/esgf-attribute-value-restricted': 
     175            status = "200 OK" 
     176             
    174177        elif environ['PATH_INFO'].startswith('/layout'): 
    175178            status = "200 OK" 
     
    323326                                status=200) 
    324327        self.assert_(response.body) 
     328         
     329    def test09ESGFGroupRoleAttributeValueProtectedResource(self): 
     330        # Test a rule in the policy which makes use of ESGF Group/Role 
     331        # Attribute Values 
     332        extra_environ = { 
     333            self.__class__.SESSION_KEYNAME: 
     334                BeakerSessionStub(username=SamlPepFilterTestCase.OPENID_URI), 
     335            'REMOTE_USER': self.__class__.OPENID_URI 
     336        } 
     337         
     338        response = self.app.get('/esgf-attribute-value-restricted', 
     339                                extra_environ=extra_environ, 
     340                                status=200) 
     341        self.assert_(TestAuthZMiddleware.RESPONSE in response) 
     342        print response         
    325343                 
    326344 
Note: See TracChangeset for help on using the changeset viewer.