Changeset 3942


Ignore:
Timestamp:
23/05/08 13:45:28 (11 years ago)
Author:
pjkersha
Message:

New release for deployment as egg version 0.9.1:

  • OpenID support in beta stage - this merely authenticates users and doesn't link them to any attributes from the Attribute Authority or Session Manager connection.
  • modular security for ows_server
  • HTTP Proxy support to enable WS client calls via HTTP proxy
  • Browse PDP now also logs access requests for public data - means OpenID based user access is logged.
Location:
TI12-security/trunk/python
Files:
49 added
14 edited

Legend:

Unmodified
Added
Removed
  • TI12-security/trunk/python/ndg.security.client/ndg/security/client/ssoclient/ssoclient/lib/base.py

    r3918 r3942  
    5050            session.save() 
    5151             
    52             log.debug('Switching from https to http...') 
    53             returnToURL = g.ndg.security.common.sso.cfg.server + \ 
    54                 self.pathInfo 
     52            log.debug(\ 
     53                'Switch from https to http and remove security query args ...') 
     54            returnToURL = g.ndg.security.common.sso.cfg.server + self.pathInfo 
    5555 
    5656            # Reconstruct the URL removing the security related arguments 
     
    6767            log.debug("Removing security details following logout ...") 
    6868 
    69             returnToURL = g.ndg.security.common.sso.cfg.server + \ 
    70                 self.pathInfo 
     69            returnToURL = g.ndg.security.common.sso.cfg.server + self.pathInfo 
    7170                 
    7271            # Reconstruct the URL removing the logout flag argument 
     
    9190                                                environ['pylons.routes_dict']) 
    9291 
    93         log.debug("_"*80) 
    94         log.debug("environ = %s" % environ) 
    95         log.debug("_"*80) 
    96          
    9792        self.pathInfo = urllib.quote(environ.get('PATH_INFO', ''))  
    9893 
     
    128123                               sid=None) 
    129124            SecuritySession.save() 
    130     
     125 
     126        # Switch from https to http  
     127        # TODO: https transport for OpenID IdP redirect back to SP 
     128#        log.debug("Ensure switch back to http following OpenID login...") 
     129#        returnToURL = g.ndg.security.common.sso.cfg.server + self.pathInfo 
     130#        log.debug("returnToURL=%s" % returnToURL) 
     131#        h.redirect_to(returnToURL) 
     132 
    131133# Include the '_' function in the public names 
    132134__all__ = [__name for __name in locals().keys() if not __name.startswith('_') \ 
  • TI12-security/trunk/python/ndg.security.client/setup.py

    r3805 r3942  
    3333setup( 
    3434    name =                      'ndg_security_client', 
    35     version =                   '0.9.0', 
     35    version =                   '0.9.1', 
    3636    description =               'NERC DataGrid Security Utilities', 
    3737    long_description =          'Software for securing NDG resources', 
  • TI12-security/trunk/python/ndg.security.common/ndg/security/common/AttAuthority/__init__.py

    r3918 r3942  
    315315        Authority's map configuration 
    316316        """ 
     317     
     318        if not self.__srv: 
     319            raise InvalidSessionMgrClientCtx(\ 
     320                                        "Client binding is not initialised") 
    317321 
    318322        try: 
     
    356360        @return: dictionary of host information indexed by hostname derived  
    357361        from the map configuration""" 
     362     
     363        if not self.__srv: 
     364            raise InvalidSessionMgrClientCtx(\ 
     365                                        "Client binding is not initialised") 
    358366             
    359367        try: 
     
    399407        @return: dictionary of host information indexed by hostname derived  
    400408        from the map configuration""" 
     409     
     410        if not self.__srv: 
     411            raise InvalidSessionMgrClientCtx(\ 
     412                                        "Client binding is not initialised") 
    401413 
    402414        hosts = self.__srv.getAllHostsInfo() 
     
    466478        @return attribute certificate for user.  iIf access is refused,  
    467479        AttributeRequestDenied is raised""" 
     480     
     481        if not self.__srv: 
     482            raise InvalidSessionMgrClientCtx(\ 
     483                                        "Client binding is not initialised") 
    468484 
    469485        # Ensure cert is serialized before passing over web service interface 
     
    499515        @rtype: string 
    500516        @return X.509 certificate for Attribute Authority""" 
     517     
     518        if not self.__srv: 
     519            raise InvalidSessionMgrClientCtx(\ 
     520                                        "Client binding is not initialised") 
    501521         
    502522        try: 
  • TI12-security/trunk/python/ndg.security.common/ndg/security/common/SessionMgr/__init__.py

    r3918 r3942  
    5757class InvalidSession(SessionMgrClientError): 
    5858    """Session is invalid""" 
    59    
     59 
     60#_____________________________________________________________________________ 
     61class InvalidAttAuthorityClientCtx(SessionMgrClientError): 
     62    """Attribute Authority ZSI Client is not initialised""" 
     63  
    6064#_____________________________________________________________________________ 
    6165class AttributeRequestDenied(SessionMgrClientError): 
     
    383387        False""" 
    384388     
     389        if not self.__srv: 
     390            raise InvalidAttAuthorityClientCtx(\ 
     391                                        "Client binding is not initialised") 
     392         
    385393        if passphrase is None: 
    386394            try: 
     
    414422        This arg is not needed if the message is signed with the user cert or  
    415423        if userCert keyword is.""" 
     424     
     425        if not self.__srv: 
     426            raise InvalidAttAuthorityClientCtx(\ 
     427                                        "Client binding is not initialised") 
    416428 
    417429        # Make connection 
     
    435447        This arg is not needed if the message is signed with the user cert or  
    436448        if userCert keyword is.""" 
     449     
     450        if not self.__srv: 
     451            raise InvalidAttAuthorityClientCtx(\ 
     452                                        "Client binding is not initialised") 
    437453         
    438454        if sessID and userDN: 
     
    514530        @rtype: ndg.security.common.AttCert.AttCert 
    515531        @return: if successful, an attribute certificate.""" 
     532     
     533        if not self.__srv: 
     534            raise InvalidAttAuthorityClientCtx(\ 
     535                                        "Client binding is not initialised") 
    516536         
    517537        # Make request 
    518538        try: 
    519539            attCert, msg, extAttCertList = self.__srv.getAttCert(userCert, 
    520                                                        sessID,  
    521                                                        attAuthorityURI, 
    522                                                        attAuthorityCert, 
    523                                                        reqRole, 
    524                                                        mapFromTrustedHosts, 
    525                                                        rtnExtAttCertList, 
    526                                                        extAttCertList, 
    527                                                        extTrustedHostList) 
     540                                                           sessID,  
     541                                                           attAuthorityURI, 
     542                                                           attAuthorityCert, 
     543                                                           reqRole, 
     544                                                           mapFromTrustedHosts, 
     545                                                           rtnExtAttCertList, 
     546                                                           extAttCertList, 
     547                                                           extTrustedHostList) 
    528548        except Exception, e: 
    529549            # Try to detect exception type from SOAP fault message 
     
    545565    def getX509Cert(self): 
    546566        """Retrieve the public key of the Session Manager""" 
     567     
     568        if not self.__srv: 
     569            raise InvalidAttAuthorityClientCtx(\ 
     570                                        "Client binding is not initialised") 
    547571        return self.__srv.getX509Cert() 
    548572                             
  • TI12-security/trunk/python/ndg.security.common/ndg/security/common/authz/pdp/browse.py

    r3897 r3942  
    2828from ndg.security.common.authz.pdp import PDPInterface, PDPError, \ 
    2929    PDPUserAccessDenied, PDPUserNotLoggedIn, PDPMissingResourceConstraints, \ 
    30     PDPUnknownResourceType 
     30    PDPUnknownResourceType, PDPUserInsufficientPrivileges 
    3131     
    3232from ndg.security.common.SessionMgr import SessionMgrClient, SessionNotFound,\ 
     
    126126        self.smURI = None 
    127127        self.userSessID = None 
     128        self.username = None 
    128129         
    129130        # Set from config file 
     
    159160         
    160161        if self.resrcURI.schema == 'DIF': 
    161             log.info('BrowsePDP: DIF record found - no security applied') 
     162            log.info('DIF record found - no security applied') 
    162163            return None, None # no access control 
    163164         
    164165        elif self.resrcURI.schema == 'NDG-B0': 
    165166            log.info(\ 
    166             'BrowsePDP: Checking for constraints for MOLES B0 document ...') 
     167            'Checking for constraints for MOLES B0 document ...') 
    167168 
    168169            roleXPth = '%s/{%s}%s' % (BrowsePDP.b0SimpleConditionXPth,  
     
    177178            # MOLES B1 is dynamically generated from B0 and has no schema 
    178179            log.info(\ 
    179             'BrowsePDP: Checking for constraints for MOLES B1 document ...') 
     180            'Checking for constraints for MOLES B1 document ...') 
    180181 
    181182            roleXPth = '%s/%s' % (BrowsePDP.b1SimpleConditionXPth, 
     
    187188        elif self.resrcURI.schema == 'NDG-A0': 
    188189            log.info(\ 
    189                 'BrowsePDP: Checking for constraints for CSML document ...') 
     190                'Checking for constraints for CSML document ...') 
    190191         
    191192            roleXPth = '%s/{%s}%s' % (BrowsePDP.a0SimpleConditionXPth,  
     
    197198                                    BrowsePDP.aaElemName)             
    198199        else: 
    199             log.error('BrowsePDP: unknown schema type "%s"' % \ 
     200            log.error('unknown schema type "%s"' % \ 
    200201                      self.resrcURI.schema) 
    201202            raise PDPUnknownResourceType() 
     
    282283         
    283284        if accessType is not None: 
    284             log.warning("BrowsePDP an accessType = [%s] " % accessType + \ 
     285            log.warning("An accessType = [%s] " % accessType + \ 
    285286                        "was set Browse assumes all access type is based " + \ 
    286287                        "on the role attribute associated with the data") 
    287              
    288         # Resource handle contains URI and ElementTree resource security  
    289         # element 
    290         try: 
    291             self.resrcURI = resrcHandle['uri'] 
    292             self.resrcDoc = resrcHandle['doc']  
    293         except KeyError, e: 
    294             log.error("Resource handle missing key %s" % e) 
    295             raise PDPMissingResourceConstraints() 
    296  
    297         # First query the document for a security constraint 
    298         role, aaURI = self._getSecurityConstraints() 
    299         if not role: 
    300             # No security set 
    301             log.info("BrowsePDP: no security role constraint found for [%s]" %\ 
    302                      self.resrcURI.schema + \ 
    303                      " type document [%s]: GRANTING ANONYMOUS ACCESS" % \ 
    304                      self.resrcURI) 
    305             return 
    306288                 
    307289        # Check that the user is logged in.  - The User handle contains  
     
    310292            self.smURI = userHandle['h'] 
    311293            self.userSessID = userHandle['sid'] 
     294            self.username = userHandle['u'] 
     295             
    312296        except KeyError, e: 
    313297            log.error("User handle missing key %s" % e) 
    314298            raise PDPUserNotLoggedIn() 
    315299         
     300        except TypeError, e: 
     301            log.error("Invalid User handle: %s" % e) 
     302            raise PDPUserNotLoggedIn() 
     303             
     304        # Resource handle contains URI and ElementTree resource security  
     305        # element 
     306        try: 
     307            self.resrcURI = resrcHandle['uri'] 
     308            self.resrcDoc = resrcHandle['doc']  
     309             
     310        except KeyError, e: 
     311            log.error("Resource handle missing key %s" % e) 
     312            raise PDPMissingResourceConstraints() 
     313         
     314        except TypeError, e: 
     315            log.error("Invalid Resource handle: %s" % e) 
     316            raise PDPMissingResourceConstraints() 
     317 
     318        # First query the document for a security constraint 
     319        role, aaURI = self._getSecurityConstraints() 
     320        if not role: 
     321            # No security set 
     322            log.info("No security role constraint found for [%s]" %\ 
     323                     self.resrcURI.schema + \ 
     324                     " type document [%s]: GRANTING ACCESS for user %s" % \ 
     325                     (self.resrcURI, self.username)) 
     326            return 
     327         
     328        # TODO: OpenID users have no session with the Session Manager 
     329        if not self.userSessID: 
     330            log.error("User [%s] has no session ID allocated " % \ 
     331                      self.username + \ 
     332                      "for connection to the Session Manager: raising " + \ 
     333                      "PDPUserInsufficientPrivileges exception...")             
     334            raise PDPUserInsufficientPrivileges() 
     335             
    316336        # Sanity check on Attribute Authority URI retrieved from the data 
    317337        if aaURI:             
     
    324344                # the data invalid or none was set.  In this situation verify 
    325345                # against the Attribute Authority set in the config    
    326                 log.warning('BrowsePDP: security constraint ' + \ 
    327                             'Attribute Authority address is invalid - ' + \ 
    328                             'defaulting to config file setting: %s; ' % \ 
    329                             self.aaURI + \ 
    330                             'error message is: %s' % e) 
     346                log.warning('security constraint ' + \ 
     347                            'Attribute Authority address is invalid: "%s"' % \ 
     348                            e + \ 
     349                            ' - defaulting to config file setting: [%s]' % \ 
     350                            self.aaURI) 
    331351                aaURI = self.aaURI 
    332352        else: 
    333             log.warning("BrowsePDP: Attribute Authority element not " + \ 
     353            log.warning("Attribute Authority element not " + \ 
    334354                        "set in MOLES security constraints - defaulting " + \ 
    335                         "to config file setting: %s" % self.aaURI) 
     355                        "to config file setting: [%s]" % self.aaURI) 
    336356            aaURI = self.aaURI 
    337357    
    338         # Retrieve Attirbute Certificate from user's session held by 
     358        # Retrieve Attribute Certificate from user's session held by 
    339359        # Session Manager 
    340360        attCert = self._pullUserSessionAttCert(aaURI, role) 
     
    343363        self._checkAttCert(attCert) 
    344364                    
    345         log.info('BrowsePDP: ACCESS GRANTED for user "%s" ' % \ 
     365        log.info('ACCESS GRANTED for user "%s" ' % \ 
    346366                 attCert.userId + \ 
    347367                 'to "%s" secured with role "%s" ' % \ 
     
    362382        @param role: role controlling access to the secured resource""" 
    363383         
     384        if not self.smURI: 
     385            log.error("No Session Manager URI set.") 
     386            raise InitSessionCtxError() 
     387             
    364388        try: 
    365389            # Create Session Manager client - if a file path was set, setting 
     
    367391            # PDP config object 
    368392            self.smClnt = SessionMgrClient(uri=self.smURI, 
    369                                     cfg=self.wssCfgFilePath or self._cfg, 
    370                                     cfgFileSection=self.wssCfgSection, 
    371                                     **self.wssCfg) 
     393                                        cfg=self.wssCfgFilePath or self._cfg, 
     394                                        cfgFileSection=self.wssCfgSection, 
     395                                        **self.wssCfg) 
    372396        except Exception, e: 
    373             log.error("BrowsePDP: creating Session Manager client: %s" % e) 
     397            log.error("Creating Session Manager client: %s" % e) 
    374398            raise InitSessionCtxError() 
    375399         
     
    383407         
    384408        except AttributeRequestDenied, e: 
    385             log.info(\ 
    386             "PDP -request for attribute certificate denied: %s" % e) 
     409            log.info("Request for attribute certificate denied: %s" % e) 
    387410            raise PDPUserAccessDenied() 
    388411         
    389412        except SessionNotFound, e: 
    390             log.info("PDP -no session found: %s" % e) 
     413            log.info("No session found: %s" % e) 
    391414            raise PDPUserNotLoggedIn() 
    392415 
    393416        except SessionExpired, e: 
    394             log.info("PDP -session expired: %s" % e) 
     417            log.info("Session expired: %s" % e) 
    395418            raise InvalidSessionMsg() 
    396419 
    397420        except SessionCertTimeError, e: 
    398             log.info("PDP -session cert. time error: %s" % e) 
     421            log.info("Session cert. time error: %s" % e) 
    399422            raise InvalidSessionMsg() 
    400423             
    401424        except InvalidSession, e: 
    402             log.info("PDP -invalid user session: %s" % e) 
     425            log.info("Invalid user session: %s" % e) 
    403426            raise InvalidSessionMsg() 
    404427 
    405428        except Exception, e: 
    406             log.error("PDP request for attribute certificate: %s" % e) 
     429            log.error("Request for attribute certificate: %s" % e) 
    407430            raise AttributeCertificateRequestError() 
    408431         
     
    424447        acIssuerDN = X500DN(self.acIssuer) 
    425448        if attCert.issuerDN != acIssuerDN: 
    426             log.info('PDP -access denied: Attribute Certificate ' + \ 
     449            log.info('access denied: Attribute Certificate ' + \ 
    427450                'issuer DN, "%s" ' % attCert.issuerDN + \ 
    428451                'must match this data provider\'s Attribute Authority ' + \ 
     
    445468               urllib2.urlopen(url) 
    446469           except (urllib2.HTTPError, urllib2.URLError, 
    447                    socket.error, socket.sslerror, AttributeError): 
     470                   socket.error, socket.sslerror, AttributeError), e: 
    448471               if raiseExcep: 
    449                    raise URLCannotBeOpened() 
     472                   raise URLCannotBeOpened(str(e)) 
    450473            
    451474           found = True 
  • TI12-security/trunk/python/ndg.security.common/ndg/security/common/pylons/security_util.py

    r3918 r3942  
    3535        '''Initialize security dict key in session object''' 
    3636        if SecuritySession.key not in session: 
    37             session[SecuritySession.key] = {}.fromkeys(SecuritySession.subKeys) 
    38              
    39         session[SecuritySession.key]['roles'] = [] 
     37            session[SecuritySession.key] = {}.fromkeys(SecuritySession.subKeys)             
     38            session[SecuritySession.key]['roles'] = [] 
    4039            
    4140    def set(self, **subKeys): 
  • TI12-security/trunk/python/ndg.security.common/setup.py

    r3802 r3942  
    6161setup( 
    6262    name =                      'ndg_security_common', 
    63     version =                   '0.9.0', 
     63    version =                   '0.9.1', 
    6464    description = \ 
    6565'''NERC DataGrid Security virtual package containing common utilities used 
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/sso/sso/lib/openid_util.py

    r3918 r3942  
    6868    # Set encoded return to address - ensure login can return to an address  
    6969    # over https to preserve confidentiality of credentials 
    70     if state.returnToURL and cfg.server in state.returnToURL: 
    71         state.returnToURL = state.returnToURL.replace(cfg.server,  
    72                                                       cfg.sslServer) 
    73         log.debug("make_template: switched return to address to https = %s" % \ 
    74                                                             state.returnToURL) 
     70    # TODO: revisit - at the moment a redirect back from https -> http at the 
     71    # client to the IdP is rejected 
     72#    if state.returnToURL and cfg.server in state.returnToURL: 
     73#        state.returnToURL = state.returnToURL.replace(cfg.server,  
     74#                                                      cfg.sslServer) 
     75#        log.debug("make_template: switched return to address to https = %s" % \ 
     76#                                                            state.returnToURL) 
    7577 
    7678    state.b64encReturnToURL = base64.urlsafe_b64encode(str(state.returnToURL))         
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/sso/sso/templates/ndg/security/ndgPage.kid

    r3918 r3942  
    8080    <!-- Login and out buttons -->     
    8181    <span py:def="logOut()" class="logOut"> 
     82        <?python 
     83        from base64 import urlsafe_b64encode 
     84         
     85        # Base 64 encode to enable passing around in 'r' argument of query 
     86        # string for use with login/logout 
     87        g.ndg.security.common.sso.state.returnToURL = str(c.requestURL) 
     88        g.ndg.security.common.sso.state.b64encReturnToURL = urlsafe_b64encode(c.requestURL) 
     89        ?> 
    8290        <form action="$g.ndg.security.server.sso.cfg.logoutURI"> 
    8391            <input type="hidden" name="r" value="${g.ndg.security.common.sso.b64encReturnToURL}"/> 
     
    92100        # Base 64 encode to enable passing around in 'r' argument of query 
    93101        # string for use with login/logout 
    94         g.ndg.security.common.sso.returnToURL = c.requestURL 
    95         g.ndg.security.common.sso.b64encReturnToURL = urlsafe_b64encode(c.requestURL) 
     102        g.ndg.security.common.sso.state.returnToURL = str(c.requestURL) 
     103        g.ndg.security.common.sso.state.b64encReturnToURL = urlsafe_b64encode(c.requestURL) 
    96104        ?> 
    97105        <form action="$g.ndg.security.server.sso.cfg.wayfuri"> 
    98             <input type="hidden" name="r" value="${g.ndg.security.common.sso.b64encReturnToURL}"/> 
     106            <input type="hidden" name="r" value="${g.ndg.security.common.sso.state.b64encReturnToURL}"/> 
    99107            <input type="submit" value="Login"/> 
    100108        </form> 
  • TI12-security/trunk/python/ndg.security.server/setup.py

    r3802 r3942  
    4141setup( 
    4242    name =                      'ndg_security_server', 
    43     version =                   '0.9.0', 
     43    version =                   '0.9.1', 
    4444    description =               'NERC DataGrid Security Services', 
    4545    long_description =          'Server side component for securing NDG resources', 
  • TI12-security/trunk/python/ndg.security.test/ndg/security/test/attAuthority/attAuthorityClientTest.cfg

    r3652 r3942  
    1111# ! SiteBMapConfig.xml trusted site A aaURI setting must agree with this  
    1212# setting for test6GetMappedAttCert 
    13 uri = http://localhost:5000/AttributeAuthority 
     13uri = http://localhost:5010/AttributeAuthority 
    1414#uri = https://localhost:5000/AttributeAuthority 
    1515 
     
    129129cacertfilepathlist = $NDGSEC_AACLNT_UNITTEST_DIR/ca/ndg-test-ca.crt 
    130130 
    131 uri = http://localhost:5100/AttributeAuthority 
     131uri = http://localhost:5010/AttributeAuthority 
    132132# Heath Data Server 
    133133#uri = http://glue.badc.rl.ac.uk/DEWS/HealthDataServer/AttributeAuthority 
     
    176176cacertfilepathlist = $NDGSEC_AACLNT_UNITTEST_DIR/ca/ndg-test-ca.crt 
    177177 
    178 uri = http://localhost:5000/AttributeAuthority 
     178uri = http://localhost:5010/AttributeAuthority 
    179179userAttCertFilePathList = $NDGSEC_AACLNT_UNITTEST_DIR/ac-clnt.xml 
    180180 
  • TI12-security/trunk/python/ndg.security.test/setup.py

    r3802 r3942  
    9999setup( 
    100100    name =                      'ndg_security_test', 
    101     version =                   '0.9.0', 
     101    version =                   '0.9.1', 
    102102    description =               'NERC DataGrid Security Unit tests', 
    103103    long_description =          'Unit tests client - server side', 
  • TI12-security/trunk/python/setup.py

    r3802 r3942  
    2525setup( 
    2626    name =                      'ndg_security', 
    27     version =                   '0.9.0', 
     27    version =                   '0.9.1', 
    2828    description =               'NERC DataGrid Security Utilities', 
    2929    long_description =          'Software for securing NDG resources', 
Note: See TracChangeset for help on using the changeset viewer.