1.15k likes | 1.44k Views
Programación Segura. Gustavo A. Isaza Echeverry Seguridad Informática – Programa de Ingeniería de Sistemas y Computación Universidad de Caldas. Agenda. Conceptos generales APIS y Arquitecturas de Seguridad en Lenguajes de Programación Seguridad en Java Seguridad .Net
E N D
Programación Segura Gustavo A. Isaza Echeverry Seguridad Informática – Programa de Ingeniería de Sistemas y Computación Universidad de Caldas
Agenda • Conceptos generales • APIS y Arquitecturas de Seguridad en Lenguajes de Programación • Seguridad en Java • Seguridad .Net • Seguridad en Apache, PHP, BD Seguras • Seguridad CORBA • Conclusiones
Ideas Previas • La Seguridad es una medida NO un característica • Costo • Usabilidad • Parte de un diseño
Problemas? • No hay conciencia y las estadísticas de incidentes no mejoran!!! • Falta de competencias • “El problema es del Admor Red / Oficial de Seguridad Informático” • Desconocimiento de las arquitecturas, API’S, frameworks….. Seguros.…
Problemas de seguridad • Ausencia infraestructura seguridad • Errores administrador/usuario • Exploits • Programar bien !!! • entender cómo funcionan las cosas • aprender buenas políticas • aprender trampas habituales
Desbordamientos • Es extremadamente sencillo equivocarse • Mal diseño del lenguaje • Malas prácticas de programación • Hay lenguajes inmunes, pero no siempre podremos usarlos • En C, cuidado con: strcpy, strcat,sprintf, gets, scanf
El Desbordamiento del Buffer: Buffer OverFlow Los desbordamientos de buffer se basan en introducir el código en el espacio reservado para las variables locales (los argumentos de un método / función) y después modificar la dirección de retorno/regreso (RET), donde regresa la información, para que apunte a un offset en donde hemos introducido nuestro código fuente. Este código puede ser - por ejemplo - una ShellCode, : bash, sh, entre otros.
Desbordamientos: defensa • • Programación defensiva. Cuidado con: • strcpy() strcat() sprintf() scanf() • sscanf() fscanf() vfscanf() vsprintf • vscanf() vsscanf() streadd() • strecpy() strtrns() • • Evitarlas siempre que sea posible, casi todas tienen alternativas razonables.
Desbordamientos: más con las entradas • gets() getchar(), fgetc(), getc(), • read() • Consejo, comprobar: • • Siempre los límites! • • Longitud de los datos antes de almacenarlos • • No pasar datos excesivamente grandes a otras funciones
Seguridad en Java • Seguridad General • Arquitectura de la Seguridad • Arquitectura de la Criptografía • Política de permisos • API para bloqueos de privilegios • Certificados X.509 y listas de certificados revocados
Seguridad en Java JVM • Tres niveles de seguridad: • Cargador de clases • Verificador • Gestores de seguridad
Seguridad en Java • El cargador de clases (Class Loader), que determina como y cuando pueden cargar código los programas y garantiza que los componentes del sistema no han sido reemplazados. • El verificador de archivos de clases (Class file verifier), que garantiza que el código tiene el formato correcto, que el bytecode no viola las restriciones de seguridad de tipos de la JVM, que las pilas internas no puedan desbordarse ni por arriba ni por abajo y que las instucciones en bytecode tengan parámetos de tipos correctos. • El gestor de seguridad (Security Manager), que controla el acceso a los recursos en tiempo de ejecución. Los recursos sobre los que tiene control son multiples: E/S de red y ficheros, creación de cargadores de clases, manipulación de hilos de ejecución, ejecución de programas externos (del SO), detener la JVM, cargar código nativo en la máquina virtual, realizar determinadas operaciones en el entorno de ventanas o cargar ciertos tipos de clases.
Usando el Security Manager Class MySecurityManager extends SecurityManager { . . . . . } try { System.setSecurityManager(new MySecurityManager(”java.policy")); } catch (SecurityException se) { System.out.println("SecurityManager already set!"); } • public boolean canRead() { • SecurityManager security = System.getSecurityManager(); • if (security != null) { • security.checkRead(path); • } • return fs.checkAccess(this, false); • }
Security Manager • • Identity - Bases para las decisiones de seguridad • • Origin – Desde donde proviene el código • • Signature – A qué código corresponde? • java.security.CodeSource • • Permission – Encapsula el acceso a una operación particular • • Incluye un objetivo y una acción • p = new SocketPermission(“www.utp.edu.co”, “connect”); • p = new FilePermission(“/tmp/file1”, “*”);
Seguridad en Java • Arquitectura criptográfica • Desde el punto de vista de la seguridad, el conjunto de clases de seguridad distribuidas con el Java 2 SDK pueden dividirse en dos subconjuntos: • Clases relacionadas con el control de acceso y la gestión de permisos. • Clases relacionadas con la Criptografía. Arquitectura Criptográfica de Java (JCA) y la Extension Criptográfica de Java (JCE).
Seguridad en Java • Certification Path • Java Authentication and Authorization Service (JAAS) • Java Generic Security Services (Java GSS-API) • Java Cryptography Extension (JCE) • Java Secure Socket Extension (JSSE) • Simple Authentication and Security Layer (SASL)
Arquitectura de la Criptografía • Java Cryptography Architecture (JCA) • Introducción • JDK 1.1 • Resúmenes de mensajes • Firmas digitales • Java 2 SDK • resúmenes de mensajes • X.509 • Arquitectura para grano fino, flexible, extensible y control de acceso altamente configurable.
Arquitectura de la Criptografía • Proveedores de servicios criptográficos • Firma digital (DSA) • MD5 y SHA-1 • Generador de Claves DSA • Certificados X.509 • KeyStore
JCE • Java Cryptography Extension (JCE) • Introducción • Marco de trabajo y de implementación para el cifrado. • Generación y comprobación de claves • Algoritmos de autenticación de mensajes (MAC)
JCE • Introducción • Ayuda para el cifrado simétrico • Ayuda para el cifrado asimétrico • Ayuda para el cifrado en bloque • Cifradores en flujo • Flujos seguros • Objetos sellados
JCE • API JCE • Cifrado simétrico en bloque DES, RC2 e IDEA • Cifrado simétrico en flujo RC4 • Encriptación asimétrica RSA • Comprobación de claves
JCE • API JCE • Cifrado Password-Based(PBE) • Algoritmo de autentificación de claves (MAC) • Proveedor de Servicios SunJCE • Una implementación del DES (FIPS PUB 46-1), Triple DES, y algoritmos de encriptación Blowfish en el Electronic Code Book (ECB), Cipher Block Chaining (CBC), Cipher Feedback (CFB), Output Feedback (OFB), y modos Propagating Cipher Block Chaining (PCBC). • Un generador de par de claves Diffie-Hellman para generar un par de valores públicos y privados convenientes para el algoritmo de Diffie-Hellman.
JCE • Proveedor de Servicios SunJCE • Una implementación de HMAC-MD5 y algoritmos keyed-hashing HMAC-SHA1 definido en RFC 2104. • Una implementación del esquema de relleno descrito en PKCS #5. • Una implementación del keystore para el tipo propietario del keystore llamando "JCEKS".
Ejemplos • HMAC-MD5 import java.security.*;import javax.crypto.*;public class initMac { public static void main(String[] args) throws Exception { KeyGenerator kg = KeyGenerator.getInstance("HmacMD5"); SecretKey sk = kg.generateKey(); Mac mac = Mac.getInstance("HmacMD5"); mac.init(sk); byte[] result = mac.doFinal("Hi There".getBytes()); }}
Seguridad en Java • Control de acceso – Granularidad • Tools (jar, keytool, jarsigner, policytool) • Modelo de Permisos • Java.security.permission • Políticas de Seguridad • PolicyTool • Gestor de Seguridad: java.security.manager
Clase JCA 1.2 Función java.security.MessageDigest Genera resumen de mensajes (hash). java.security.Signature Firmado de datos y verificación firmas. java.security.KeyPairGenerator Generar pares de claves (pública y privada) para un algoritmo. java.security.KeyFactory Convertir claves de formato criptográfico a especificaciones de claves y vice versa java.security.certificate.CertificateFactory Crear certificados de clave pública y listas de revocación(CRLs). java.security.KeyStore Crear y gestionar un almacen de claves (keystore). java.security.AlgorithmParameters Gestionar los parámetros de un algoritmo, incluyendocodificación y descodificación. java.security.AlgorithmParameterGenerator Generar un conjunto de parámetros para un algoritmo. java.security.SecureRandom Generar números aleatrorios o pseudo aleatrorios Motor JCA
Clase JCE 1.2 Función java.crypto.Cipher Proporciona encriptación y desencriptación. java.crypto.KeyAgreement Proporciona un protocolo de intercambio de claves. java.crypto.KeyGenerator Proporciona un generador de claves simétricas. java.crypto.Mac Proporciona un algoritmo de autentificación de mensajes. java.crypto.SecretKeyFactory Representa una factoría de claves secretas. Motor JCE
Seguridad en Java • JCA & JCE (Java Crypto Architecture, Java Crypto Extensions) • Javax.crypto.interfaces • DHKey • DHPrivateKey • DHPublicKey • Sockets Seguros (JSSE) • Java.security.Cert • X509Certificate, X509CRL • X509Extension
Seguridad en Java • El paquete java.security • El paquete java.security consiste básicamente en clases abstractas e interfaces que encapsulan conceptos de seguridad como certificados, claves, resumenes de mensajes y firmas digitales. • En el JCA los proveedores pueden implementar tres clases: • KeyPairGenerator. Se emplea para crear claves públicas y privadas. • MessageDigest. Prorciona la funcionalidad de algoritmos de resumen de mensajes como el MD5 y el SHA. • Signature. Se emplea para el firmado digital de mensajes. • KeyPairGenerator kpg = KeyPairGenerator.getInstance ("DSA");
Seguridad en Java • El paquete java.security.cert • Añade soporte para generar y usar certificados, incluye clases e interfaces específicas para soportar certificados X.509. • CertificateFactory. Se emplea para generar certificados y listas de revocación (CRL). • Certificate. Es una clase para agrupar certificados de diferentes formatos pero usos comunes importantes • CRL. Clase abstracta para gestionar distintos tipos de listas de revocación de certificados. • X509Certificate. Clase abstracta para representar certificados X.509. • X509CRL. Clase abstracta para una lista de revocación de certificados X.509. • X509CRLEntry. Es una clase abstracta para las entradas de las listas de revocación
Seguridad en Java • Ejemplos: • Perm = new java.io.FilePermission(“/tmp/abc”,”read”) //AWT Permission, NetPermission • MessageDigest m = MessageDiggest.getInstance(“MD5”) • Java.security.MessageDiggest • Java.security.signature • Java.security.KeyPairGenerator
Seguridad en Java • Extensión de Sockets Seguros de Java (JSSE) • http://java.sun.com/products/jsse/ • Servicio de Autentificación y Autorización de Java (JAAS) • http://java.sun.com/products/jaas/
ACCESO SEGURO A DATOS EN .NET • Acceso a BD de datos mediante ADO.NET • Formas seguras de acceder a la BD • Almacenamiento seguro de secretos • AUTENTICACIÓN MEDIANTE FORMULARIOS EN .NET • Autenticación mediante formularios básica • Autenticación mediante formularios y XML • Autenticación mediante formularios y base de datos • Autenticación mediante formularios y tickets personalizados • Autenticación mediante formularios sin cookies • AUTENTICACIÓN MEDIANTE WINDOWS EN .NET • Autenticación básica • Autenticación mediante resúmenes • Autenticación integrada de Windows • Protección de directorios y documentos • Representación de usuario • AUTENTICACIÓN MEDIANTE CERTIFICADOS EN .NET • Introducción a los certificados digitales • Criptografía con .NET • Autoridades de certificación • Canales seguros con SSL • Autenticación mediante certificados digitales • Acceso a la información de los certificados desde ASP.NET • SEGURIDAD EN SQL SERVER • SEGURIDAD EN SERVICIOS WEB XML DESARROLLADOS CON .NET Seguridad en .NET
Seguridad 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
Seguridad 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
Seguridad 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
Seguridad de códigoPermisos (II) • Acceso al entorno, registro y metadatos • EnvironmentPermission • RegistryPermission • ReflectionPermission • DNSPermission • EventLogPermission • ServiceControllerPermission
Seguridad de códigoPermisos (III) • Protección de datos • DirectoryServicesPermission • IsolatedStorageFilePermission • OleDbPermission • SqlClientPermission • MessageQueuePermission • PerformanceCounterPermission • Autenticación • PrincipalPermission
Seguridad 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
Seguridad 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
Seguridad basada en rolesAutorización de Principals • If (MyPrincipal.IsInRole(…)) • De forma imperativa con PrincipalPermission • p = new PrincipalPermission(“DOMAIN\\Usuario”…)p.Demand() • De forma declarativa con PrincipalPermissionAttribute • [PrincipalPermissionAttribute(SecurityAction.Demand, Name = “DOMAIN\\Usuario”,…] • Válido para cualquier tipo de Principal • Sin necesidad de cambios
Consideraciones • Quién tiene acceso físico? • Quién tiene acceso shell? • Apache escribe en los filesystem? • Limitar los post/get, cookies, sesiones?
Recomendaciones básicas • Deshabilitar los servicios no usados, actualizar el servidor, usar los archivos de configuración recomendados • Habilitar logwatch y logcheck y actualizar los reportes • Habilitar una herramienta de verificación de integridad de archivos • configurar iptables – Ports 22, 80, 443 tomcat?
Configurando Apache • Deshabilitar servicios no indispensables • Verificar los bugtracks y actualizar • Proteger los directorios /var/www/ • Crear un directorio personalizado /var/www/error • Habilitar los .htaccess y proteger los archivos de users y password del http