aboutsummaryrefslogtreecommitdiff
path: root/files/es/mozilla/persona/security_considerations/index.html
diff options
context:
space:
mode:
Diffstat (limited to 'files/es/mozilla/persona/security_considerations/index.html')
-rw-r--r--files/es/mozilla/persona/security_considerations/index.html59
1 files changed, 59 insertions, 0 deletions
diff --git a/files/es/mozilla/persona/security_considerations/index.html b/files/es/mozilla/persona/security_considerations/index.html
new file mode 100644
index 0000000000..023bd98164
--- /dev/null
+++ b/files/es/mozilla/persona/security_considerations/index.html
@@ -0,0 +1,59 @@
+---
+title: Consideraciones de Seguridad
+slug: Mozilla/Persona/Security_Considerations
+tags:
+ - Persona
+translation_of: Archive/Mozilla/Persona/Security_Considerations
+---
+<p>Cuando agregas soporte para Persona en tu sitio web, ella toma tantas medidas de seguridad como puede. Sin embargo, algunas medidas de seguridad solo pueden ser manejadas por tu sitio web. Estas son listadas a continuación.</p>
+<h2 id="Essential_practices" name="Essential_practices">Prácticas Esenciales</h2>
+<h3 id="Verify_assertions_on_your_server" name="Verify_assertions_on_your_server">Verificar la confirmación en tu servidor</h3>
+<p>Cuando utilizas Persona, las declaraciones de identidad son pasadas dentro de la función <code>onlogin</code> a través de</p>
+<p>{{ domxref("navigator.id.watch()") }}</p>
+<p><em>Siempre</em> debes pasar la <span class="short_text" id="result_box" lang="es"><span class="hps">aserción</span></span> a tu servidor para verificarla, y solo tu servidor debe decidir si autoriza al usuario permisos adicionales en base al resultado de la verificación:</p>
+<pre class="brush:js;">// Inside navigator.id.watch({ ...
+onlogin: function(assertion) {
+ // A user wants to log in! Here you need to:
+ // 1. Send the assertion to your backend for verification and to create a session.
+ // 2. Update your UI.
+},
+</pre>
+<p>Si trata de verificar la <span class="short_text" id="result_box" lang="es"><span class="hps">aserción</span></span> usando JavaScript ejecutándose en el navegador del usuario, algún usuario malicioso podría suplantar por otro usuario legítimo de su sitio inyectando código bloqueando tu código JavaScript. Esto es posible debido a que no se tiene control del navegador del usuario, donde se ejecuta el código.</p>
+<p>Como mencionamos lineas arriba, <em>siempre</em> debe pasar la <span class="short_text" id="result_box" lang="es"><span class="hps">aserción</span></span> a su servidor para la verificación. Incluso si está usando la API de verificación remota.</p>
+<h3 id="Explicitly_specify_the_audience_parameter" name="Explicitly_specify_the_audience_parameter">Especifique explícitamente el parámetro <code>audience</code></h3>
+<p>Para verificar la <span class="short_text" id="result_box" lang="es"><span class="hps">aserción</span></span>, debe realizar un pedido <code>POST</code> a<code> https://verifier.login.persona.org/verify</code>. El pedido incluye el parámetro llamado <code>audience</code>:</p>
+<pre><code>assertion=&lt;ASSERTION&gt;&amp;audience=https://mysite.com:443"</code></pre>
+<p>El parámetro <code>audience</code> es requerido. Siempre debe especificar explícitamente audience en el código, o en la configuración del código. Específicamente:</p>
+<ul>
+ <li>No confie en la cabecera o header Host enviado por el navegador del usuario.</li>
+ <li>No confíe en el parámetro explicito enviado por el navegador del usuario, pero generado usando JavaScript, e.g. <code>document.location</code>.</li>
+</ul>
+<p>Si dejas que el navegador del usuario te envíe el parámetro <code>audience</code>, esto deja la posibilidad de que un sitio web malicioso pueda reusar las declaraciones de su sitio web para autenticarse en tu sitio web.</p>
+<h3 id="Verify_SSL_certificates" name="Verify_SSL_certificates">Verifica los certificados SSL</h3>
+<p>Para verificar una <span class="short_text" id="result_box" lang="es"><span class="hps">aserción</span></span>, debes realizar un petición POST a <code>https://verifier.login.persona.org/verify</code>. Debes asegurarte que tu petición HTTPS verifique el certificado enviado desde el servidor contra un certificado raíz confiable. Si no lo haces, un atacante podría presentarse como <code>verifer.login.persona.org</code> y realizar verificaciones falsas.</p>
+<p>Revisa que la libreria que usas para hacer el pedido verifique los certificados correctamente, y que has iniciado esto con un certificado de administrador apropiado.</p>
+<p>Por ejemplo, el <a class="external" href="http://docs.python.org/release/2.7.3/library/urllib2.html#urllib2.urlopen" title="http://docs.python.org/release/2.7.3/library/urllib2.html#urllib2.urlopen">modulo urllib2</a> estándar de Python 2.7 no valida certificados del servidor. En lugar de ello, recomendamos utilizar los módulos "<a class="external" href="http://pypi.python.org/pypi/requests">requests</a>" o "<a class="external" href="http://pypi.python.org/pypi/urllib3" title="http://pypi.python.org/pypi/urllib3">urllib3</a>" en Python 2.x, o la clase estándar <code>http.client.HTTPSConnection</code> en Python 3.x. Para Perl, asegúrate que usas al menos la versión 6.0 de <code>libwww-perl</code>. Dependiendo del lenguaje, librería, y sistema operativo que estés usando, vas a necesitar utilizar algún CA (Certificate Authority) confiable o el CA simple usado por <code>verifier.login.persona.org</code>.</p>
+<h3 id="Implement_CSRF_protection" name="Implement_CSRF_protection">Implementar protección CSRF</h3>
+<p>En un ataque de inicio de sesión por CSRF (Cross-Site Request Forgery), el atacante utiliza CSRF para iniciar la sesión del usuario dentro del sitio web usando las credenciales del atacante.</p>
+<p>Por ejemplo: un usuario visita una web maliciosa que contiene un elemento <code>form</code>. El atributo <code>action</code> del <code>form</code> está configurado para hacer una petición HTTP POST a <a class="external" href="http://www.google.com/login" title="http://www.google.com/login">http://www.google.com/login</a>, dándole el username y password del atacante. Cuando el usuario envía el <code>form</code>, el pedido es enviado a Google, se inicia sesión y el servidor de Google configura una cookie en el navegador del usuario. Ahora el usuario sin saberlo ha iniciado sesión con la cuenta Google del atacante.</p>
+<p>El ataque puede ser usado para reunir información sensible del usuario. Por ejemplo, <a class="link-https" href="https://www.google.com/history/">Web History</a> de Google tiene la característica de registrar todos los términos de búsqueda del usuario. Si el usuario inicia sesión dentro de la cuenta Google del atacante y el atacante tiene la característica Web History activada, el usuario le estará enviando toda su información al atacante.</p>
+<p>Los ataques de inicio de sesión CSRF, y defensas potenciales contra éstos son documentados con mayor detalle en <a class="external" href="http://www.adambarth.com/papers/2008/barth-jackson-mitchell-b.pdf">Robust Defenses for Cross-Site Request Forgery</a> (PDF). Estos ataques no son específicos de Persona: la mayoría de mecanismos de inicio de sesión son potencialmente vulnerables a ellos.</p>
+<p>Existen una variedad de técnicas, las cuales pueden ser usadas para proteger un sitio de ataques de inicio de sesión CSRF, las cuales son documentadas con mayor detalle en el estudio antes mencionado.</p>
+<p>Una propuesta es crear un identificador secreto en el servidor, compartido con el navegador, y requerir al navegador que lo proporcione cuando realice un pedido de inicio de sesión. Por ejemplo:</p>
+<ol>
+ <li>Tan pronto como el usuario visite su sitio, antes de intentar iniciar sesión cree una sesión para él en el servidor. Almacene el ID de la sesión en una cookie del navegador.</li>
+ <li>En el servidor, genere un texto aleatorio de al menos 10 caracteres alfanuméricos. un UUID generado aleatoriamente es una buena opción. Esto es un token CSRF. Almacene esto en la sesión.</li>
+ <li>Envie el CSRF token al navegador a través de JavaScript embebido o HTML como una variable oculta del formulario.</li>
+ <li>Asegurese que el envio AJAX o la petición POST del formulario incluya el token CSRF.</li>
+ <li>En el lado del servidor, antes de aceptar la <span class="short_text" id="result_box" lang="es"><span class="hps">aserción</span></span>, revise que el token CSRF enviado concuerde con el almacenado en la sesión.</li>
+</ol>
+<h2 id="Enhancements" name="Enhancements">Mejoras</h2>
+<h3 id="Content_Security_Policy_(CSP)" name="Content_Security_Policy_(CSP)">Politicas de seguridad del contenido (Content Security Policy o CSP)</h3>
+<p><a href="/en-US/docs/Security/CSP" title="Security/CSP">Content Security Policy</a> (CSP) es una capa extra de seguridad que ayuda a detectar y mitigar ciertos tipos de ataques, incluyendo Cross Site Scripting (XSS) y ataques de inyección de datos. Estos ataques son usados para todo desde robo de datos a desconfiguración del sitio o distribución de malware.</p>
+<p>SI utilizas CSP en tu siitio, es posible que necesites modificar tu politica para permitir Persona. Dependiendo de tu política, puedes necesitar:</p>
+<ul>
+ <li>Eliminar inline <code>javascript:</code> URIs y reemplazarlos con código cargado desde un archivo script adicional. El archivo puede ver elementos basándose en su ID, y luego atacar al elemento configurando {{ domxref("element.onclick", "onclick") }} o llamando a {{ domxref("element.addEventListener()", "addEventListener()") }}.</li>
+ <li>Permitir <code>https://login.persona.org</code> como <code>script-src</code> y <code>frame-src</code> para que el archivo pueda cargar el archivo remoto  <code>include.js</code>  y ese archivo pueda comunicarse con la llamada a la implementación de Persona.</li>
+</ul>
+<p>Un ejemplo de la configuración de Apache puede incluir:</p>
+<pre><span class="diff-content"><span class="idiff">Header set X-Content-Security-Policy: "default-src 'self'; frame-src 'self' https://login.persona.org ; script-src 'self' https://login.persona.org"</span></span></pre>