Fundamentos de Seguridad para Aplicaciones Web

Anuncio
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
}
Descargar