Fundamentos de seguridad para aplicaciones Web Jorge Oblitas Microsoft Regional Director www.icuadrado.com www.microsoft.com/rd Agenda del día Fundamentos de Seguridad para aplicaciones Web Seguridad esencial para IIS y ASP.NET Ataques y Modelo de ataques A qué temer y por qué Identificando vulnerabilidades sistemáticamente Defensas y contramedidas Escribiendo código ASP.NET seguro Uniendo todo Aplicación referencial de Microsoft para el OpenHack Agenda de esta sesión Por qué hablamos de seguridad? Seguridad IIS Seguridad ASP.NET Personificación Autenticación ASP.NET Autorización ASP.NET Autenticación y Autorización en acción Por qué hablamos de seguridad? Encuesta 2002 de crimen y seguridad en computadoras. Porcentajes de las compañías participantes Reportaron brechas de seguridad en los últimos 12 meses 90% 80% Tuvieron perdidas financieras como resultado Identificaron la conexión a Internet como fuente frecuente de ataques Reportaron la intrusión a las autoridades i http://www.gocsi.com/press/20020407.html 74% 34% Cómo pasó esto? Vulnerabilidades comunes del software Porcentajes de aplicaciones que tuvieron serias deficienciencias en el diseño en las áreas mostradas en las áreas indicadas 79% Administración de la sesión 73% Manipulación de parámetros 64% Control de accesos 61% Algoritmos criptográficos Manejo de data sensible Controles administrativos Validación del ingreso 41% 36% 32% Manos a la obra software seguro requiere personal dedicado y con conocimiento. El Software no es seguro si la red no lo es. La administración es el lecho de roca de la seguridad. El software seguro reuqiere también desarrolladores dedicados y con conocimiento. Una administración apropiada no significa nada si el código no es seguro. Muchos desarrolladores no se dan cuenta que están escribiendo código inseguro. Esto es código inseguro! <html> <body> <form runat="server"> <asp:TextBox ID="Input" runat="server" /> <asp:Button Text=“Clickeame" OnClick="OnSubmit" runat="server" /> <asp:Label ID="Output" runat="server" /> </form> </body> </html> <script language="C#" runat="server"> void OnSubmit (Object sender, EventArgs e) { Output.Text = "Hola, " + Input.Text; } </script> Forzando campos ocultos Seguridad IIS Protección y Pooling Autorización Permisos de la Metabase de la Web ACL Authenticación Anonymous Basic Digest Certificados X.509 Integrada con Windows Passport (IIS 6) SSL/TLS Restricción IP Dónde debe ejecutarse el código Qué puede hacer el usuario que llama? Quén envió el request? Debe ser encriptado el tráfico? Las llamadas desde esta IP son permitidas? Di g e st N TL M Ke r be r os X .5 09 Ce r ts Pa s spo rt Necesita cuentas Windows? Soporta delegación?* Credenciales en cleartext? Soporta browsers no IE? Pasa a través de firewalls? TRansparente al usuario? Ba s ic Mecanismos de autenticación IIS Y Y Y Y Y N Y N N Y Y N Y N N N N Y Y Y N N N Y N N** N Y Y Y N N N Y Y Y En Windows 2003 Server, la transición y delegación restringida en Kerberos se puede usar * para delegar al margen del mecanismo de autenticación seleccionado. ** Some mapeos de certificados son delegables, pero la mayoría no IIS 5 y ASP.NET ASP.NET worker process Inetinfo.exe HTTP Requests Otras cañerías Aspnet_wp.exe AppDomain Aspnet_isapi AppDomain Named Pipe Las aplicaciones ASP.NET comparten un worker process pero están aisladas en AppDomains* separados. * ASP.NET también soporta Web gardening,que ubica un worker process por CPU IIS 6 y ASP.NET Inetinfo.exe Modo Usuario Application Pool 1 Application Pool 2 W3wp.exe W3wp.exe AppDomain AppDomain AppDomain Aspnet_isapi Aspnet_isapi I/O Completion Ports Modo Kernel HTTP Requests Http.sys Identidad del Worker Process En IIS 5, ASP.NET corre como ASPNET por defecto Cuenta local débil con privilegios limitados. Creado al momento de la instalación. Password autogenerada. En IIS 6, ASP.NET corre como un servicio de red (machine$) por defecto Cuenta local débil con privilegios limitados. Tiene credenciales de red. Construido en Windows 2003 Server Identidad del proceso de cambio IIS 6 Configurable por application pool Las Credenciales son administradas por IIS IIS 5 La Identidad es compartida por todos los WPs en el Web server Las Credenciales se guardan en Machine.config* <processModel userName="MiDominio\MiUsuario" password="..." ... /> * Ver http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetsec/html/ SecNetHT01.asp ara saber como correr ASP.NET usando una cuenta personalizada. Asegurando las credenciales del proceso En IIS 5, usa Aspnet_setreg Sólo en ASP.NET 1.1; hotfix para 1.0 Machine.config <processModel ... userName="registry:HKLM\SOFTWARE\MyApp\Identity\ASPNET_SETREG,usuarioe" password="registry:HKLM\SOFTWARE\MyApp\Identity\ASPNET_SETREG,password" /> Registry i http://support.microsoft.com/default.aspx?scid=kb;en-us;329290 Seguridad ASP.NET Authorización Autorización ACL Autorización URL Impersonalización Autenticación Windows Passport Forms Que tiene permitido hacer el que llama? Usar identidad de proceso o la identidad del que llama De quein vino el request? Impersonalización Por defecto, el código se ejecuta utilizando la identidad del ASP.NET worker process El Acceso es negado si se intenta acceder a un recurso para el cual el worker process no tiene permiso. Si la personificación está habilitada el código se ejecuta bajo la identidad del que llama. El acceso es negado si se intenta acceder a un recurso para el cual el que llama no tiene permiso. Trabaja adjuntando el token de acceso al thread asignado por el request. Habilitando impersonalización Web.config <configuration> <system.web> <authentication mode="Windows" /> <identity impersonate="true" /> </system.web> </configuration> Autenticación ASP.NET Autenticación Windows Usa las cuentas Windows existentes Ideal para aplicaciones Intranet Autenticación Passport Conveniente para los usuarios (un sólo punto para loguearse) Poner las credenciales en las manos de otros. Autenticación por formularios Tipicamente usa páginas de Login al estilo eBay. Ideal para aplicaciones Internet Autenticación Windows El request corre usando la identidad del proceso o la identidad personificada (jorge o IUSR_machinename*) Jorge A IIS IIS crea el token de acceso identificando al caller (Jorge o IUSR_machinename*) A ASP.NET ASP.NET recibe el token de acceso, hace un chequeo ACL al recurso pedido, y hace el token disponible para impersonalización. * Por defecto , IIS usa IUSR_machinename para representar usuarios anónimos Autenticación por formularios Disponible para usuarios anónimos? Si No Cookie de autenticacion valida? Recurso Si Si Está autorizado el que hace el request? No No Accesso denegado cookie Si Página de Login Logueo exitoso? No Especificando el tipo de autenticación Web.config <configuration> <system.web> <!-- mode="Windows|Passport|Forms|None" --> <authentication mode="Windows" /> </system.web> </configuration> Opciones de autenticación por formularios Web.config <configuration> <system.web> <authentication mode="Forms"> <!-forms Attributes: name="[cookie name]" – Nombre de la cookie de autenticación loginUrl="[url]" - URL de la pagina Login protection="[All|None|Encryption|Validation]" timeout="[minutes]" – tiempo de validez de la cookie path="/" – Ruta de la cookie requireSSL="[true|false]" – Restringir la cookie a SSL? (1.1) slidingExpiration="[true|false]" – Renovar la cookie? (1.1) --> <forms loginUrl="/LoginPage.aspx" /> </authentication> </system.web> </configuration> Security Principals Windows representa los security principals con tokens de acceso El .NET Framework representa los security principals con objetos security principal Abstrae el tipo de autenticación Te habilita a escribir (las más de las veces) código genérico para buscar nombres, revisar roles, etc. Los Objetos Principal exponen data útil acerca de los usuarios (especialmente los autenticados) Objetos Security Principal Cada tipo de objeto Identidad expone informaci[on espec[ifica para un tipo de autenticación GenericPrincipal WindowsPrincipal FormsIdentity WindowsIdentity PassportIdentity GenericIdentity IPrincipal A IIdentity El Objeto Identidad encapsula el token de acceso Windows si el tipo de acceso es WindowsIdentity Usando IPrincipal e IIdentity // Viendo si el caller está autenticado if (HttpContext.Current.User.Identity.IsAuthenticated) { // El caller está autenticado } // Obteniendo el usuario del caller autenticado string nombre = HttpContext.Current.User.Identity.Name; // Realiza un chequeo de roles programático if (HttpContext.Current.User.IsInRole (“Administrador") { // El caller es Administrador } // Se obtiene el token de acceso del caller si estamos usando //autenticación Windows if (HttpContext.Current.User.Identity is WindowsIdentity) { IntPtr token = ((WindowsIdentity) HttpContext.Current.User.Identity).Token; ... } Autorización ASP.NET Autorización ACL Se combina típicamente con autenticación Windows. Usa permisos NTFS para controlar el acceso a los recursos basado en la identidad Windows del Caller. No requiere Personificación Autorización URL Se combina típicamente con autenticación por formularios Controla el acceso a los recursos basado en la identidad Windows, Passport, o por formularios Se aplica en el Web.config Autorización ACL El acceso anónimo no está permitido Authentication mode="Windows" ACL A Jorge IIS A IIS crea el token de acceso identificando a Jorge y se lo pasa a las ASP.NET ASP.NET A ASP.NET revisa el ACL en el archiv pedido y hace fallar el request si Jorge no tiene los permisos necesarios ASPX Autorización URL Web.config <!– Niega acceso al usuario anónimo (no autenticado) --> <deny users="?" /> <!– Da acceso a Jorge y a Mary; pero a nadie más --> <allow users=“Jorge, Mary" /> <deny users="*" /> <!– Permite acceso a todos, excepto a Jorge y Mary --> <deny users=“Jorge, Mary" /> <allow users="*" /> <!– Permite el acceso a cualquier Administrador --> <allow roles=“Administrador" /> <deny users="*" /> Escogiendo la combinación correcta Escenario #1: Aplicaciones Intranet La mayoría de los accesos ocurren detrás del firewall Sirve a una pobiación de usuarios definidos por cuentas de usuario Windows Escenario #2: Aplicaciones Internet La mayoría de los accesos ocurre fuera del firewall Sirve a poblaciones de usuarios no definidas por cuentas de usuario Windos (ejemplo: eBay) Aplicaciones Intranet Permisos SQL Roles de DB Autorización URL Servidor Web Jorge Mary Sebastián A A Servidor de bases de datos A IIS A Autenticación Integrada con Windows A ASP. NET Trusted Connection A Autenticación Windows SQL Server IPSec Autenticación Windows Aplicaciones Internet Permisos SQL Roles de DB Autorización ACL Servidor Web Servidor de bases de datos Jorge Firewall Mary Sebastián IIS ASP. NET Trusted Connection SQL Server IPSec Acceso anónimo (no autenticado) Autenticación por Formularios Autenticación Windows Autenticación Windows y Autorización ACL Autenticación por formulariosy autorización URL © 2003-2004 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary. Apéndice SSL/TLS Conversaciones seguras cliente/servidor Privacidad del mensaje: Trafico encriptado usando llaves y negociadas y protocolos Integridad del mensaje: Trafico validado usando mensajes validados con códigos de autenticación de mensaje protegidos con llaves (MACs) “Cómo instalar SSL en un servidor Web" http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetsec/html/SecNetHT01.asp i http://www.ietf.org/rfc/rfc2246.txt IPrincipal e IIdentity IPrincipal interface IPrincipal { IIdentity Identity { get; } // Expone el objeto identidad bool IsInRole (string role); // El usuario pertenece // a un rol específico? } IIdentity interface IIdentity { string AuthenticationType { get; } // Tipo de autenticación? bool IsAuthenticated (); // Esta el usuario autenticado? string Name { get ; } // Nombre del usuario autenticado }