jueves, 9 de mayo de 2013

Un problema real que debemos tener en cuenta cuando aseguramos las comunicaciones encriptando el canal de comunicación es que en los puntos inicial y final de ese canal la información está desprotegida. O sea, cuando se envía un información desde el cliente al servidor, al llegar al servidor esta llega completamente en texto plano. En el caso de las herramientas de la suite de WSO2, un pedido constante era poder autenticarse en las herramientas usando las credenciales de un dominio empresarial. El problema con esta petición es que si usamos nuestro user/pass del dominio para por ejemplo en un escenario de seguridad donde se envía tanto el usuario como la contraseña, ambos elementos serán visibles en el servidor, usando la funcionalidad SOAP TRACER de las herramientas, como pueden ver a continuación en este mensaje que llega al servidor:
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:wsa="http://www.w3.org/2005/08/addressing">
   <s:Header>
      <wsa:To>https://192.168.0.247:9445/services/HelloService.HelloServiceHttpsSoap12Endpoint/</wsa:To>
      <wsa:ReplyTo>
                         <wsa:Address>http://www.w3.org/2005/08/addressing/anonymous</wsa:Address>
      </wsa:ReplyTo>
      <wsa:MessageID>http://identifiers.wso2.com/messageid/1337556301686/4284633972</wsa:MessageID>
      <wsa:Action>urn:greet</wsa:Action>
      <o:Security xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" s:mustUnderstand="1">
         <u:Timestamp u:Id="uuid-c3cdb38b-e4aa-4467-9d0e-dd30f081e08d-5">
            <u:Created>2012-05-20T23:25:01.686Z</u:Created>
            <u:Expires>2012-05-20T23:30:01.686Z</u:Expires>
         </u:Timestamp>
        <o:UsernameToken u:Id="Me">
            <o:Username>admin</o:Username>
            <o:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">admin</o:Password>
         </o:UsernameToken>
      </o:Security>
   </s:Header>
   <s:Body>
      <p:greet xmlns:p="http://www.wso2.org/types">
         <!--0 to 1 occurrence-->
            <name>Jorge Infante Osorio</name>
         </p:greet>
      </s:Body>
   </s:Envelope>
Si se fijan podrán ver el Username y el Password, ambos en texto plano. Nuestra primera solución es eliminar el plugin SOAP TRACER así que ya no se podrán ver los mensajes, pero un administrador del sistema puede instalarlo otra vez violando la seguridad. Para solucionar este problema hemos diseñado una política que encripta toda esta parte del Header con lo que garantizamos no solo la protección durante su viaje por la red, si no también cuando llegue al servidor, ya que se verá algo como lo siguiente:

<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope" xmlns:xenc="http://www.w3.org/2001/04/xmlenc#">
   <soapenv:Header>
      <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" soapenv:mustUnderstand="true">
         <wsu:Timestamp xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="Timestamp-1">
            <wsu:Created>2012-05-20T22:29:51.959Z</wsu:Created>
            <wsu:Expires>2012-05-20T22:34:51.959Z</wsu:Expires>
         </wsu:Timestamp>
         <xenc:EncryptedKey Id="EncKeyId-1CC54EC6DFFC9D597313375529921542">
            <xenc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p" />
            <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
               <wsse:SecurityTokenReference>
                  <wsse:KeyIdentifier EncodingType= "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary"ValueType="http://docs.oasis-open.org/wss/oasis-wss-soap-message-security-1.1#ThumbprintSHA1">a/jhNus21KVuoFx65LmkW2O/l10=</wsse:KeyIdentifier>
               </wsse:SecurityTokenReference>
            </ds:KeyInfo>
            <xenc:CipherData>
               <xenc:CipherValue>FcR0SVZmCGUpeqMBe+rI/eq/R3teITOFmWpWXbxTkdNL4euIrNEJfY0UZqGKFsui+22/AKvc5I2tWeqozKXXNMSqIEvcoKuoxn1iL6ehI4qFjIlkBHhUhUQ0m6WDQDP1M0sn0jS9xTUaWNNXkeRZlPbIxVl+FjjzrCHG5OzVxaY=</xenc:CipherValue>
            </xenc:CipherData>
         </xenc:EncryptedKey>
         <xenc:ReferenceList>
            <xenc:DataReference URI="#EncDataId-4" />
         </xenc:ReferenceList>
        <xenc:EncryptedData Id="EncDataId-4" Type="http://www.w3.org/2001/04/xmlenc#Element">
            <xenc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc" />
            <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
               <wsse:SecurityTokenReference>
                  <wsse:Reference URI="#EncKeyId-1CC54EC6DFFC9D597313375529921542" />
               </wsse:SecurityTokenReference>
            </ds:KeyInfo>
            <xenc:CipherData>
               <xenc:CipherValue>Ub10LNwm6Meaw/QblOLByMpullS2I23aet1rY4eWXCYKUtMgtWJj3q2Ib8rYa71hXzq4/bq2P1Y2GW5iFWt6dS/Z2r0x9UvhW0IhSXJLkh6olAXWpy5seOrW3Uy9PDyqUc1RQ0hpcxtUIKisxQ/aSEtFypoW9dChjdl92HmSy2iSP2TOmcHB1xWLfssyzYnQeTGYqd1s4Wzlv3vIl2RUtzLTQ9jczcxI6ygFE/36vQFbGsfVBdekYHDx3VhNAJjdLgQEuxZEgBOqJP4Qp0mKgtJh4aAEjvpuGjl3ekp48yTNgZ7tClCakS7X2sIZ/GEnQiNxo7FaH2ApUsUWfg6trHZgXwlHdYY2Q50sJLpKYqPk0G0AA2cj+ver+QTGFYL9554fS4Yeba+Lol7gupUcfaltyZEVGgS8lmGIn6qje+HW7KjtQkmhOMsi2t7RRvfXr53mfJt5VSRLfmYg0dO5oGQhdVB30vHnF1CC0y3XA0W8GvJm7OfR+RmMGMCK/dxOdhqyRxZ4j1zUfFaqKL7Vu8+x9mNmqtPAac6dy1RWzKZasbPOOaAFtOCFaC+DHkCegjj5ZDFt6R12AQAQMsNHjXrrs363+kR67zbF6/JkLOXboYAeWkbXTWievo+Bb8mt030gw3DUxlk+xU65bKGnCnRAvdWAwnXo5qmqkOltJ838AYFd+bQvtSnLup+04dDCCgx7g2a20MJ/OyehjtLm4aOAWdauA5jM0QolVwQmQCc=</xenc:CipherValue>
            </xenc:CipherData>
         </xenc:EncryptedData>
         <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="Signature-3">
            <ds:SignedInfo>
               <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
               <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#hmac-sha1" />
               <ds:Reference URI="#Timestamp-1">
                  <ds:Transforms>
                     <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
                  </ds:Transforms>
                  <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
                  <ds:DigestValue>y4ELOvBsDE18NDrEI0fSf+bThJw=</ds:DigestValue>
               </ds:Reference>
               <ds:Reference URI="#UsernameToken-2">
                  <ds:Transforms>
                     <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
                  </ds:Transforms>
                  <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
                  <ds:DigestValue>d/j2dlFN+yFvdSCmvoZ1p0fJFzE=</ds:DigestValue>
               </ds:Reference>
            </ds:SignedInfo>
            <ds:SignatureValue>Lg++XtBfdh5BkAQml51/b7bI08M=</ds:SignatureValue>
            <ds:KeyInfo Id="KeyId-1CC54EC6DFFC9D597313375529921923">
               <wsse:SecurityTokenReference xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="STRId-1CC54EC6DFFC9D597313375529921924">
                  <wsse:Reference URI="#EncKeyId-1CC54EC6DFFC9D597313375529921542" ValueType="http://docs.oasis-open.org/wss/oasis-wss-soap-message-security-1.1#EncryptedKey" />
               </wsse:SecurityTokenReference>
            </ds:KeyInfo>
         </ds:Signature>
      </wsse:Security>
   </soapenv:Header>
   <soapenv:Body>
      <ns2:echoString xmlns:ns2="http://echo.services.core.carbon.wso2.org">
         <in>jorge infante osorio</in>
      </ns2:echoString>
   </soapenv:Body>
</soapenv:Envelope>
Lo malo es que el tamaño del mensaje crece, así como su complejidad, pero como estamos haciendo una encriptación asimétrica, el rendimiento no se afecta significativamente. Lo bueno es que podemos proteger de esa manera información sensible. Ejemplificando el efecto de este cambio en el rendimiento, una prueba sencilla con SOAPUI nos muestra lo siguiente:
El payload del mensaje, o sea su carga útil era de 10.5kb mientras que el mensaje completo pesaba 13.5kb, pueden dividir los bytes entre cnt, o sea la parte de firma y encriptación agregaba 3kb a la carga útil. El máximo tiempo de respuesta no superó 1s y el promedio rondó los 145ms. Basándonos en esto y en un primer momento, creemos que esta solución es válida para proteger las credenciales de los usuarios cuando esto sea requerido por los clientes.

0 comentarios:

Publicar un comentario