Title: Seguridad en 'NET
1Seguridad en .NET
- David Carmona
- Premier Support for Developers
- Microsoft Ibérica
2Agenda
- Seguridad en .NET
- Servicios criptográficos
- Despliegue seguro de aplicaciones
- Seguridad de tipos y verificación de código
- Seguridad de código
- Seguridad basada en roles
- Almacenamiento aislado
3Seguridad en .NET
- Servicios criptográficos
- Cifrado
- Firma digital
- Aplicación en el despliegue seguro
- No más DLL Hell
- Seguridad de tipos y verificación
- Permite la ejecución de código poco fiable con
garantías
4Seguridad en .NET
- Seguridad basada en la identidad del código
- Disminución de los permisos del usuario en código
poco fiable - Seguridad basada en roles
- Sistema genérico de usuarios
- Almacenamiento aislado
- Acceso a disco estanco y controlado
5Agenda
- Seguridad en .NET
- Servicios criptográficos
- Despliegue seguro de aplicaciones
- Seguridad de tipos y verificación de código
- Seguridad de código
- Seguridad basada en roles
- Almacenamiento aislado
6Servicios criptográficosClases
- Localizadas en System.Security.Cryptography
- Algunas clases exponiendo funcionalidad Windows
- Wrapper de Crypto API
- Otras implementadas en IL
- Permiten ser usadas como Streams
- Interfaz ICryptoTransform
- Clase CryptoStream
7Servicios criptográficosHash
- Algoritmos que calculan un valor unívoco a partir
de un conjunto de bytes.
Datosoriginales
Algoritmo
HASH
8Servicios criptográficosHash
- El más sencillo Checksum
- El más utilizado SHA1
- Utilizado por defecto en .NET
- Hash de 160 bits
- Implementados en .NET
- SHA1, SHA256, SHA384, SHA512
- MD5
- Con clave HMACSHA1, MACTripleDES
9Servicios criptográficosAlgoritmos simétricos (I)
- Cifrado de datos con clave única
Datosoriginales
Algoritmo
Datoscifrados
Clave
10Servicios criptográficos Algoritmos simétricos
(II)
11Servicios criptográficos Algoritmos simétricos
(II)
U
K
C
Q
X
S
N
Y
U
Q
12Servicios criptográficos Algoritmos simétricos
(III)
- El más sencillo XOR
- El más utilizado DES
- Longitud de clave 56 bits
- Enigma 19.683 posibilidades
- DES 72.057.594.037.927.936 posibilidades
- Implementados en .NET
- DES (56), TripleDES (112 - 168), RC2 (40 - 128),
Rijndael (128 - 256)
13Servicios criptográficosAlgoritmos asimétricos
(I)
- Cifrado de datos con clave pública y privada
Clave Privada
Datosoriginales
Datoscifrados
Clave Pública
14Servicios criptográficosAlgoritmos asimétricos
(II)
- El más utilizado RSA
- Clave desde 384 hasta 16384 bits
- Utilizado internamente en .NET con 1024 bits de
clave - Eje de toda la criptografía
- Multitud de aplicaciones
15Servicios criptográficosAlgoritmos asimétricos
(III)
- Aplicaciones
- Comunicación segura
Cliente
Servidor
Dato
Clave privada
Clave pública
Datocifrado
Dato
16Servicios criptográficosAlgoritmos asimétricos
(IV)
- Aplicaciones
- Firma de datos
Cliente
Servidor
Clave pública
Hash
Clave privada
Firma
0111001001 1110011100 0011101011 1000111010
Hash
17Servicios criptográficosAlgoritmos asimétricos
(V)
- Aplicaciones
- Certificados
CA
Usuario1
Clave privada
Firma
Nombre Email Teléfono Clave pública
Nombre Email Teléfono Clave pública Firma
HASH
18Servicios criptográficosAlgoritmos asimétricos
(VI)
- Aplicaciones
- Certificados
Usuario2
Usuario1
CA Nombre Email Teléfono Clave pública
Nombre Email Teléfono Clave pública Firma
Firma
Hash
Hash
19Servicios criptográficosAlgoritmos asimétricos
(VI)
Usuario2
Servidor
Clave Privada
Clave DES
Nombre Email Teléfono Clave pública Firma
Clave DES
Clave DES
Clave DES cifrada
Clave Pública
20Servicios criptográficosAlgoritmos asimétricos
(VII)
- Clases auxiliares
- DSACryptoServiceProvider
- Unión hash algoritmo asimétrico
- AsymmetricSignatureFormatter
- X509Certificate
- SignedXML
21Agenda
- Seguridad en .NET
- Servicios criptográficos
- Despliegue seguro de aplicaciones
- Seguridad de tipos y verificación de código
- Seguridad de código
- Seguridad basada en roles
- Almacenamiento aislado
22Despliegue seguroProblemas con DLL y COM
- DLL Hell
- Aplicaciones compiladas con una DLL no funcionan
con DLLs nuevas - Aplicaciones de terceros sobrescriben nuestras
DLLs - COM
- Mecanismo sencillo de versionado
- No se utiliza
- No es fiable
23Despliegue seguroTipos de assemblies
- Weak name
- Única información presente en el assembly Nombre
y versión (sólo informativa) - Cargados desde el directorio de la aplicación
- Strong name
- Información presente en el assembly Nombre,
versión, cultura y token público - Cargados desde el directorio de la aplicación o
la GAC - El strong name debe ser idéntico en la referencia
y en el assembly (si no hay políticas que
apliquen)
24Despliegue seguroFirma de código
- Los assemblies con strong name siempre están
firmados - La firma es comprobada al instalar o al cargar
- El hash de la clave pública se utiliza como token
público del strong name - Garantiza que sólo el poseedor de la clave
privada pueda modificar un assembly
25Despliegue seguroFirma de código (II)
Clave Privada
Clave Pública
HASH
PE Header
CLR Header
Strong Name Signature
Signature
Manifiesto
Versión
Public key
Metadata
IL 00111001010100010101111100001011010001110000111
0101010100010101010100010101011110000101001
StrongNameLib.dll
26Despliegue seguroVerificación de firma
HASH
PE Header
PE Header
CLR Header
Signature
Strong Name Signature
Manifiesto
AssemblyRef
Manifiesto
StrongNameLib.dll
Versión
Versión
Signature
Public key
Public key token
Public key
Metadata
Metadata
IL 00111001010100010101111100001011010001110000111
0101010100010101010100010101011110000101001
IL 00111001010100010101111100001011010001110000111
0101010100010
StrongNameLib.dll
StrongName.exe
27Despliegue seguroFirma de código con certificado
- Además del strong name, los assemblies pueden
estar certificados - Firma digital sobre el fichero
- Permite identificar al creador del assembly
- Puede recuperarse en tiempo de ejecución
- Clase X509Certificate
- Puede establecerse seguridad de código y enlazado
sobre el certificado
28Agenda
- Seguridad en .NET
- Servicios criptográficos
- Despliegue seguro de aplicaciones
- Seguridad de tipos y verificación de código
- Seguridad de código
- Seguridad basada en roles
- Almacenamiento aislado
29Seguridad de tiposCódigo Type-Safe y verificación
- Un código es type-safe si
- Accede a posiciones de memoria válidas
- Accede sólo a miembros expuestos de las clases
- Utiliza referencias verdaderas
- Proceso de verificación
- Examina el código IL y los metadatos
- Efectuado durante el JIT
- Si el código no es verificable se lanza una
excepción
30Seguridad de tiposAplicaciones de código
type-safe
- Garantiza la seguridad en los tipos
- Evita el acceso a posiciones de memoria no
válidas (GPFs) - Añade un nivel de aislamiento a los procesos del
sistema operativo - Sólo si restringimos también llamadas a
unmanaged. - Permite la aparición de los Application Domains
31Seguridad de tiposApplications Domains
- Proceso virtual dentro de un proceso físico del
sistema
Proceso Nativo 2
Proceso Nativo 1
Application Domain 3
Application Domain 1
Application Domain 2
32Agenda
- Seguridad en .NET
- Servicios criptográficos
- Despliegue seguro de aplicaciones
- Seguridad de tipos y verificación de código
- Seguridad de código
- Seguridad basada en roles
- Almacenamiento aislado
33Seguridad de códigoSeguridad en Windows
- Autenticación de usuarios
- Logon interactivo
- Autenticación en red
- Control de acceso basado en objetos
- Permite limitar los recursos al usuario
autenticado - Limitación con aplicaciones no confiadas por el
usuario - Mecanismo Todo - Nada
34Seguridad de códigoSolución .NET
- Desarrollada sobre la seguridad Windows
- Nunca podremos tener mayores privilegios
- Centrada en el código, no en el usuario
- Identificación del código por evidencias
- Permite distintos niveles de seguridad
- Muy granular
- Conjunto estándar de permisos ampliable
- Fácil de administrar
- Distintos niveles de administración
35Seguridad de códigoEvidencias
- Identifica características del código
- Normalmente quién y dónde
- Recuperadas por el CLR en runtime para la
asignación de permisos
Directorio de Aplicación
URL
Hash criptográfico
Zona
Nombre de fichero
Strong Name
Directorio de red
Firma con certificado
Web site
Personalizable
36Seguridad de códigoGrupos de código
- Formado por
- Condición de pertenencia al grupo
- Conjunto de permisos nombrado
- Si el código cumple la condición, toma los
permisos asociados
Condición Publisher David Carmona
LowTrust
Security Permission Execute
Permission Set LowTrust
Environment Permission Read Variable OS
Grupo de código
37Seguridad de códigoPolíticas
- Conjunto de reglas que gobiernan los permisos
- Organizadas jerárquicamente
- Enterprise
- Machine
- User
- Application
- Permisos efectivos intersección de políticas
38Seguridad de códigoGrupos de código (II)
- Pertenencia a varios grupos
- Unión de permisos
- Ej. Aplicación http//vacaciones
- P1 U P4 U P7
All code
P1
Zone Internet
Site freeware.com
Publisher David Carmona
Zone Local Intranet
P4
P5
P3
P2
Strong Name App1, v1,
Hash C2 FA 32 5B
Site CompanyWeb
Publisher My Company
P6
P7
P7
P8
Enterprise Policy
39Seguridad de códigoGrupos de código (III)
- Ej. Aplicación http//vacaciones
- Enterprise policy P1 U P4 U P7
- Machine Policy P1 U P2
- User Policy P1 U P2
- Efectivos (P1 U P4 U P7) n (P1 U P2) n (P1 U
P2)
All code
All code
P1
P1
Zone Internet
Zone Intranet
Strong Name Vacac, v1,
Site vacaciones
P2
P3
P2
P3
Machine Policy
User Policy
40Seguridad de códigoAtributos en grupos de código
- Exclusive
- El grupo actual establece los permisos finales de
la política - LevelFinal
- La política actual es la última en consultarse
- Orden Enterprise, Machine, User
41Seguridad de códigoPermisos
- Protección de recursos y operaciones
- SecurityPermission
- SocketPermission
- WebPermission
- PrintingPermission
- Acceso al interfaz de usuario
- UIPermission
- Protección de ficheros y directorios
- FileIOPermission
- FileDialogPermission
42Seguridad de códigoPermisos (II)
- Acceso al entorno, registro y metadatos
- EnvironmentPermission
- RegistryPermission
- ReflectionPermission
- DNSPermission
- EventLogPermission
- ServiceControllerPermission
43Seguridad de códigoPermisos (III)
- Protección de datos
- DirectoryServicesPermission
- IsolatedStorageFilePermission
- OleDbPermission
- SqlClientPermission
- MessageQueuePermission
- PerformanceCounterPermission
- Autenticación
- PrincipalPermission
44Seguridad de códigoPermisos (IV)
- Identidad
- PublisherIdentityPermission
- SiteIdentityPermission
- StrongNameIdentityPermission
- ZoneIdentityPermission
- URLIdentityPermission
- Permisos personalizables
45Seguridad de códigoPermisos nombrados por defecto
Full Trust
Everything
Local
Internet
Execution
Nothing
Acceso sin límite a todos los recursos
Acceso sin límite excepto skip verification
DNSEnviroment USERNAME, TEMP Eventlog Instrumen
t FileDialog FileIO Read IsolatedStorage
Assembly By User Printing Default Reflection
ReflectionEmit Security Execution, Assertion,
RemotingConf UIPermission Web Connect
FileDialog Open IsolatedStorage Domain By User
(10240) Printing SafePrinting Security
Execution UIPermission SafeTopLevel,
OwnClipboard Web Connect (origin)
Sólo ejecución
Sin acceso
46Seguridad de códigoGrupos de código por defecto
Grupo de código
My computer Zone
Local Intranet
Trusted zone
Internet, Restricted
Permission Set
Full trust
Local Intranet
Internet
Nothing
47Seguridad de códigoComprobación de permisos
- Demanda de permisos
- Cada permiso tiene una clase en
System.Security.Permissions - Método Demand Comprueba que todos los llamantes
tienen el permiso actual - Para ello .NET mantiene una pila de permisos por
cada flujo de ejecución
Assembly A1
G1
Assembly A2
G2
Assembly A3
G3
A4 demanda permiso P P.Demand()
Assembly A4
G4
48Seguridad de códigoOperaciones con permisos
- Denegación de permisos
- Método Deny Deniega el permiso actual a todos
los assemblies siguientes de la pila - PermitOnly Sólo otorga el permiso actual a los
assemblies siguiente de la pila - Operaciones entre permisos
- Union
- Intersect
- IsSubsetOf
49Seguridad de códigoImposición de permisos
- Método Assert
- Permite realizar operaciones no permitidas en los
llamantes. Cuidado! - Escenarios
- Cuando se utiliza un recurso de forma
completamente controlada - Cuando se encapsula código no manejado
Assembly A1
G1
A2 llama a P.Assert()
Assembly A2
G2
As2
Assembly A3
G3
A4 demanda permiso P P.Demand()
Assembly A4
G4
50Seguridad de códigoImplementación declarativa
- Visibles con PermView.exe
- Cada permiso tiene un atributo asociado
- FileIOPermission FileIOPermissionAttribute
- Afecta al objeto sobre el que se aplica
- Assembly
- Clase
- Método
- El constructor del atributo siempre toma una
enumeración SecurityAction como parámetro - FileIOPermissionAttribute (SecurityAction action)
- Los campos del atributo representan su
configuración - FileIOPermissionAttribute.Read / Write / Append
51Seguridad de códigoImplementación declarativa
(II)
- SecurityAction permite realizar las mismas
operaciones que la implementación imperativa - SecurityAction.Demand
- SecurityAction.Deny
- SecurityAction.Assert
- SecurityAction.PermitOnly
- Añade nuevas operaciones
- LinkDemand El llamante debe soportar el permiso
especificado - InheritanceDemand Las clases heredadas deben
soportar el permiso especificado
52Seguridad de códigoImplementación declarativa
(III)
- Acciones sólo a nivel de assembly
- SecurityAction.RequestMinimum Mínimo conjunto de
permisos para que la aplicación funcione - SecurityAction.RequestOptional Conjunto de
permisos opcionales para acceder a toda la
funcionalidad - SecurityAction.RequestRefuse Permisos no
requeridos por el assembly - PermissionSetAttribute
- Permite demandar conjuntos nombrados de permisos
53Seguridad de códigoBest practices
- Identificar los permisos mínimos y opcionales de
cada assembly - Facilita la administración
- Mejora la seguridad
- Tratar las excepciones SecurityException
- Especialmente en los permisos opcionales
- Probar la aplicación en el Permission Set donde
se espera que funcionen - Minimizar los Asserts
- Aislarlos en assemblies separados
- Conocer el funcionamiento de los permisos en las
clases que utilizamos
54Agenda
- Seguridad en .NET
- Servicios criptográficos
- Despliegue seguro de aplicaciones
- Seguridad de tipos y verificación de código
- Seguridad de código
- Seguridad basada en roles
- Almacenamiento aislado
55Seguridad basada en rolesAutenticación y
autorización
- Autenticación
- Proceso que verifica la identidad del usuario
- Autorización
- Proceso que determina si el usuario puede
realizar una operación determinada - Autenticación .NET
- Windows
- Personalizable
- Sólo en ASP.NET
- Forms
- Passport
- Autorización .NET
- Personalizable con demanda de permisos
56Seguridad basada en rolesIdentities, principals
- Identity
- Encapsula información sobre un usuario
- Principal
- Representa el contexto de seguridad sobre el que
corre la aplicación - Incluye
- Usuario actual
- Roles del usuario actual
- Tres tipos
- Windows
- Generic
- Custom
57Seguridad basada en rolesWindows Principal
- Seguridad integrada con Windows
- Establecida a nivel de Application Domain
- AppDomain.CurrentDomain.SetPrincipalPolicy
- Cada hilo tiene su propio contexto Windows
- Thread.CurrentPrincipal
- Permite impersonación
58Seguridad basada en rolesGeneric Principal,
Custom Principal
- Permite implementar nuestro propio sistema de
autenticación - Ej. Base de datos
- Establecida a nivel de Application Domain
- AppDomain.CurrentDomain.SetPrincipalPolicy
- Get / set a nivel de hilo
- Thread.CurrentPrincipal
- Para establecer el CurrentPrincipal es necesario
el permiso ControlPrincipal de SecurityPermission
59Seguridad basada en rolesAutorización de
Principals
- Programáticamente
- If (MyPrincipal.IsInRole())
- De forma imperativa con PrincipalPermission
- p new PrincipalPermission(DOMAIN\\Usuario)p.
Demand() - De forma declarativa con PrincipalPermissionAttrib
ute - PrincipalPermissionAttribute(SecurityAction.Deman
d, Name DOMAIN\\Usuario, - Válido para cualquier tipo de Principal
- Sin necesidad de cambios
60Agenda
- Seguridad en .NET
- Servicios criptográficos
- Despliegue seguro de aplicaciones
- Seguridad de tipos y verificación de código
- Seguridad de código
- Seguridad basada en roles
- Almacenamiento aislado
61Almacenamiento aisladoObjetivo
- Almacenamiento de datos en disco
- El assembly no necesita especificar un nombre de
fichero - El assembly no necesita permisos de escritura en
disco - Almacenado en un lugar conocido por el usuario
- Roaming con el usuario
- Establecimiento de cuotas
62Almacenamiento aisladoTipos
- Por ámbito
- Usuario Assembly
- Usuario Assembly Domain
- Por roaming
- Roaming habilitado
- Roaming deshabilitado
- Por operación
- Lectura / escritura
- Administración
63Almacenamiento aisladoPermisos
- IsolatedStorageFilePermission
- Contiene campos que permiten establecer los tipos
de almacenamientos aislados permitidos - Permite establecer una cuota
- Por defecto
- Permission Set InternetUsuario assembly
dominioCuota 10240 bytesLectura / escritura - Permission Set LocalIntranetUsuario
assemblySin cuotaLectura / Escritura - Permission Set EverythingSin límite de uso o
cuota
64Almacenamiento aisladoUtilización
- Recuperar el almacenamiento deseado
- IsolatedStorageFile.GetUserStoreForAssembly()
- IsolatedStorageFile.GetUserStoreForDomain()
- Crear ficheros
- new IsolatedStorageFileStream(file.txt,
FileMode.Create, store) - Abrir un fichero existente
- new IsolatedStorageFileStream(file.txt,
FileMode.Open, store) - Otras operaciones
- Crear y borrar directorios
- Obtener la cuota disponible
- Enumerar ficheros y directorios
65Más información
- MSDN
- Securing Applicationshttp//msdn.microsoft.com/li
brary/en-us/cpguide/html/cpconsecuringyourapplicat
ion.asp - System.Securityhttp//msdn.microsoft.com/library/
en-us/cpref/html/frlrfsystemsecurity.asp - Ejemplo Public Keyhttp//msdn.microsoft.com/libra
ry/en-us/cpsamples/html/public_key_cryptography_sa
mple.asp - Libros
- .NET Security Programminghttp//www.amazon.co.uk/
exec/obidos/ASIN/0471222852/qid1019389011/sr1-5/
refsr_1_0_5/202-9812972-3725429 - .NET Framework Security http//www.amazon.co.uk/
exec/obidos/ASIN/067232184X/qid1019389011/sr1-6/
refsr_1_0_6/202-9812972-3725429
66Más información
- Applied Microsoft .NET Framework
Programminghttp//www.microsoft.com/mspress/books
/5353.asp - Artículos
- Secure Coding Guidelines for the .NET
Frameworkhttp//msdn.microsoft.com/library/en-us/
dnnetsec/html/seccodeguide.asp - An Overview of Security in the .NET Framework
http//msdn.microsoft.com/library/en-us/dnnetsec/
html/netframesecover.asp - .NET Framework Enterprise Security Policy
Administration and Deploymenthttp//msdn.microsof
t.com/library/en-us/dnnetsec/html/entsecpoladmin.a
sp - Code Access Security and Distribution Features in
.NET Enhance Client-Side Appshttp//msdn.microsof
t.com/msdnmag/issues/02/06/rich/TOC.ASP
67Más información
- Security in .NET Enforce Code Access Rights with
the Common Language Runtime http//msdn.microsoft
.com/msdnmag/issues/01/02/cas/toc.asp - The Security Infrastructure of the CLR Provides
Evidence, Policy, Permissions, and Enforcement
Serviceshttp//msdn.microsoft.com/msdnmag/issues/
02/09/SecurityinNET/TOC.ASP - Protect Private Data with the Cryptography
Namespaces of the .NET Frameworkhttp//msdn.micro
soft.com/msdnmag/issues/02/06/crypto/toc.asp - Unify the Role-Based Security Models for
Enterprise and Application Domains with
.NEThttp//msdn.microsoft.com/msdnmag/issues/02/0
5/rolesec/toc.asp - Microsoft Official Curriculum
- Securing and Deploying Microsoft .NET Assemblies
(Prerelease)http//www.microsoft.com/traincert/sy
llabi/2350AFINAL.ASP
68(No Transcript)