Seguridad Informática - Seguridad software II

Anuncio
Seguridad Informática
Seguridad software II
Ramón Hermoso y Matteo Vasirani
Grado en Ingenierı́a Informática
Principios básicos de seguridad software
Diseño
Programación
1
Principios básicos de seguridad software
2
Diseño
3
Programación
4
Modelo de seguridad Java
Modelo de seguridad Java
Principios básicos de seguridad software
Diseño
Programación
1
Principios básicos de seguridad software
2
Diseño
3
Programación
4
Modelo de seguridad Java
Modelo de seguridad Java
Principios básicos de seguridad software
Diseño
Programación
Modelo de seguridad Java
Principios básicos de seguridad software
Dos perspectivas:
Diseño
Definir la arquitectura de seguridad de un sistema
Principios generales para proteger los recursos importantes1
Programación
Programar las funcionalidades con garantı́as de seguridad
Dependiente del lenguaje de programación
1 Saltzer & Schroeder, “The Protection of Information in Computer Systems”
Principios básicos de seguridad software
Diseño
Programación
1
Principios básicos de seguridad software
2
Diseño
3
Programación
4
Modelo de seguridad Java
Modelo de seguridad Java
Principios básicos de seguridad software
Diseño
Programación
Modelo de seguridad Java
Diseño
1
Economı́a del mecanismo
Mantener el diseño lo más simple posible
Muy importante en seguridad ya que los errores de diseño
son difı́ciles de detectar cuando se usa el sistema
normalmente
Ejemplo
El protocolo finger permite preguntar información sobre
los usuarios de un sistema
Una implementación del cliente asume que la respuesta del
servidor está siempre bien formada
Un servidor atacante puede enviar una secuencia infinita de
caracteres
El cliente imprime los caracteres, llenando el disco →
denegación de servicio
Principios básicos de seguridad software
Diseño
Programación
Modelo de seguridad Java
Diseño
2
Exclusión por defecto
Tomar las decisiones de acceso sobre la base de los
permisos y no de denegación de acceso
Para todo evento que no está previsto, se denega el acceso
Ejemplo
Principios básicos de seguridad software
Diseño
Programación
Modelo de seguridad Java
Diseño
2
Exclusión por defecto
Tomar las decisiones de acceso sobre la base de los
permisos y no de denegación de acceso
Para todo evento que no está previsto, se denega el acceso
Ejemplo
int ret = IsAccessAllowed(...);
if (ret == ERROR ACCESS DENIED) {
// Security check failed.
} else {
// Security check OK.
}
Principios básicos de seguridad software
Diseño
Programación
Modelo de seguridad Java
Diseño
2
Exclusión por defecto
Tomar las decisiones de acceso sobre la base de los
permisos y no de denegación de acceso
Para todo evento que no está previsto, se denega el acceso
Ejemplo
int ret = IsAccessAllowed(...);
if (ret == ERROR ACCESS DENIED) {
// Security check failed.
} else {
// Security check OK.
}
¿Qué pasa si el método IsAccessAllowed(...) falla?
Principios básicos de seguridad software
Diseño
Programación
Diseño
2
Exclusión por defecto (continua)
Una mejor implementación serı́a
int ret = IsAccessAllowed(...);
if (ret == NO ERROR) {
// Security check OK.
} else {
// Security check failed.
}
Modelo de seguridad Java
Principios básicos de seguridad software
Diseño
Programación
Modelo de seguridad Java
Diseño
3
Mediación completa
Todo acceso a cualquier objeto tiene que ser autorizado
Es fundamental la autenticación
Comprobar los permisos sólo una vez aumenta las
prestaciones pero pone en peligro la seguridad
Ejemplo
Un DNS almacena una tabla que asocia un nombre
simbólico a una dirección IP
Un atacante consigue cambiar esta tabla asociando otra IP
a un nombre simbólico
El DNS confı́a en la primera comprobación nombre-IP y
enruta todo el tráfico a la máquina con la IP del atacante
Principios básicos de seguridad software
Diseño
Programación
Modelo de seguridad Java
Diseño
4
Diseño abierto
El diseño del sistema no tiene que ser secreto
Asumir que un atacante tiene información sobre cómo
funciona el mecanismo de protección
Desacoplar el mecanismo de protección de las llaves
Obscuridad 6= seguridad
Principios básicos de seguridad software
Diseño
Programación
Modelo de seguridad Java
Diseño
5
Separación de privilegios
El sistema deberı́a dar acceso sólo si se cumplen multiples
condiciones
Una puerta que necesita dos llaves es más robusta que
una que sólo necesita una
Separar el software en varios componentes cuyo acceso se
pueda controlar
Ejemplo
En Unix BSD un usuario puede cambiar al usuario root (su
root) sólo si 1) sabe la contraseña y 2) pertenece al grupo
wheel, cuyo GID es 0
Ambas condiciones son necesarias
Principios básicos de seguridad software
Diseño
Programación
Modelo de seguridad Java
Diseño
6
Menor privilegio posible
Un usuario o un proceso tiene que tener los privilegios
mı́nimos para poder operar
Revocar los privilegios cuanto antes
Ejemplo
La regla need to know del ejército US
Las personas tienen acceso sólo a los documentos
relevantes a sus tareas
Ejemplo:
El programa sendmail necesita los privilegios de root para
abrir el puerto 25
Una vez que se ha establecido en escucha en el puerto 25,
no necesita los privilegios de root
Sin embargo, el programa no se auto-revoca los privilegios
→ buffer overflow → escalada de privilegios
Principios básicos de seguridad software
Diseño
Programación
Modelo de seguridad Java
Diseño
7
Aceptabilidad psicológica
Los mecanismos de seguridad no deben inhibir la
accesibilidad a los recursos
Si un mecanismo de seguridad complica demasiado el
acceso a un recurso, el usuario tendrá la tentación de
desactivar el mecanismo
A ser posible, los mecanismos de seguridad deberı́an ser
transparentes y user-friendly
Ejemplo
El programa ssh permite crear la pareja de claves
pública-privada para poder acceder remotamente a un
ordenador sin contraseña
Ejemplo
Poner una contraseña para leer un fichero
Documento Word del examen: OK
Fichero de configuración: KO
Principios básicos de seguridad software
Diseño
Programación
1
Principios básicos de seguridad software
2
Diseño
3
Programación
4
Modelo de seguridad Java
Modelo de seguridad Java
Principios básicos de seguridad software
Diseño
Programación
Modelo de seguridad Java
Programación
1
Proteger datos y métodos internos
Usar los mecanismos de control de acceso proporcionados
por el lenguaje de programación
Tipos de datos abstractos (abstract), modificadores de
privacidad (private)
Ejemplo
Principios básicos de seguridad software
Diseño
Programación
Modelo de seguridad Java
Programación
1
Proteger datos y métodos internos
Usar los mecanismos de control de acceso proporcionados
por el lenguaje de programación
Tipos de datos abstractos (abstract), modificadores de
privacidad (private)
Ejemplo
public abstract class Animal {
private boolean isHuman = false;
...
}
public class Dog extends Animal {
public void evolve(){
isHuman = true; // Cannot do that
}
}
Principios básicos de seguridad software
Diseño
Programación
Modelo de seguridad Java
Programación
2
Manejar eventos “imposibles”
No asumir que determinados errores no puedan suceder
Introducir excepciones (java.lang.Exception) de
manera explicita
Ejemplo
Principios básicos de seguridad software
Diseño
Programación
Modelo de seguridad Java
Programación
2
Manejar eventos “imposibles”
No asumir que determinados errores no puedan suceder
Introducir excepciones (java.lang.Exception) de
manera explicita
Ejemplo
switch(suit) {
case Suit.CLUBS: // ♣
...
break;
case Suit.DIAMONDS: // ♦
...
break;
case Suit.HEARTS: // ♥
...
break;
case Suit.SPADES: // ♠
...
break;
default:
throw new RuntimeException()
Principios básicos de seguridad software
Diseño
Programación
Modelo de seguridad Java
Programación
3
Usar la criptografı́a con cuidado
Evitar claves predecibles o espacios de claves reducidos
(generador de números aleatorios + semilla)
Gestión de claves, almacenamiento seguro, vaciar la
memoria
Ejemplo
Principios básicos de seguridad software
Diseño
Programación
Modelo de seguridad Java
Programación
3
Usar la criptografı́a con cuidado
Evitar claves predecibles o espacios de claves reducidos
(generador de números aleatorios + semilla)
Gestión de claves, almacenamiento seguro, vaciar la
memoria
Ejemplo
char[] pw = readPassword()
... // use password
java.util.Arrays.fill(pw, ’\0’);
Principios básicos de seguridad software
Diseño
Programación
Modelo de seguridad Java
Programación
4
Programar de manera defensiva
Desconfiar de los datos proporcionados por el usuario
Esperar lo peor (ley de Murphy): atacantes o idiotas
Evitar variables globales (public static final)
Ejemplo
Principios básicos de seguridad software
Diseño
Programación
Modelo de seguridad Java
Programación
4
Programar de manera defensiva
Desconfiar de los datos proporcionados por el usuario
Esperar lo peor (ley de Murphy): atacantes o idiotas
Evitar variables globales (public static final)
Ejemplo
public void setTheMap(Object key, Object value){
map.put(key, value); // Java allows null keys
}
Principios básicos de seguridad software
Diseño
Programación
Modelo de seguridad Java
Programación
4
Programar de manera defensiva
Desconfiar de los datos proporcionados por el usuario
Esperar lo peor (ley de Murphy): atacantes o idiotas
Evitar variables globales (public static final)
Ejemplo
public void setTheMap(Object key, Object value){
map.put(key, value); // Java allows null keys
}
public void setTheMap(Object key, Object value){
if(key == null){
throw new RuntimeException();
} else {
map.put(key, value);
}
}
Principios básicos de seguridad software
Diseño
Programación
Modelo de seguridad Java
Programación
5
Evitar los objetos mutables
Es peligroso que un método devuelva un objeto mutable
Ejemplo
Principios básicos de seguridad software
Diseño
Programación
Modelo de seguridad Java
Programación
5
Evitar los objetos mutables
Es peligroso que un método devuelva un objeto mutable
Ejemplo
public List getTheList(){
return myPreciousList;
}
Principios básicos de seguridad software
Diseño
Programación
Modelo de seguridad Java
Programación
5
Evitar los objetos mutables
Es peligroso que un método devuelva un objeto mutable
Ejemplo
public List getTheList(){
return myPreciousList;
}
La clase que invoca el método getTheList() puede
cambiar el contenido de myPreciousList
Principios básicos de seguridad software
Diseño
Programación
Modelo de seguridad Java
Programación
5
Evitar los objetos mutables
Es peligroso que un método devuelva un objeto mutable
Ejemplo
public List getTheList(){
return myPreciousList;
}
La clase que invoca el método getTheList() puede
cambiar el contenido de myPreciousList
import java.util.Collections;
...
public List getTheList(){
return Collections.unmodifiableList(myPreciousList);
}
Principios básicos de seguridad software
Diseño
Programación
Modelo de seguridad Java
Programación
6
Serialización
Una vez serializados, los objetos están fuera del sistema
de seguridad de la JVM
Poner los datos que no se quieren serializar como
transient
Cifrar los datos sensibles que se quieren serializar
Ejemplo
Principios básicos de seguridad software
Diseño
Programación
Modelo de seguridad Java
Programación
6
Serialización
Una vez serializados, los objetos están fuera del sistema
de seguridad de la JVM
Poner los datos que no se quieren serializar como
transient
Cifrar los datos sensibles que se quieren serializar
Ejemplo
public class UserData{
private transient String password;
private String username;
...
}
Principios básicos de seguridad software
Diseño
Programación
1
Principios básicos de seguridad software
2
Diseño
3
Programación
4
Modelo de seguridad Java
Modelo de seguridad Java
Principios básicos de seguridad software
Diseño
Programación
Modelo de seguridad Java
Seguridad Java
Muchos problemas de seguridad están relacionados con el
acceso a la memoria
El lenguaje Java se diseñó eliminando algunas
caracterı́sticas presentes en otros lenguajes de
programación como C++
Eliminación de la aritmética con punteros
Comprobación de rangos en el acceso a vectores
Definición del comportamiento de las variables sin
inicializar
Eliminación de la liberación de memoria controlada
directamente por el programador
Principios básicos de seguridad software
Diseño
Programación
Modelo de seguridad Java
Seguridad Java
Aplicaciones y applets son sujetas a una polı́tica de
seguridad que delimita la ejecución en un dominio que
especifica un conjunto de permisos para acceder a los
recursos
Principios básicos de seguridad software
Diseño
Programación
Modelo de seguridad Java
Seguridad Java
Applet
Los navegadores instalan automáticamente un
SecurityManager que vigila la ejecución de las applet
El programa se ejecuta en una sandbox que limita el
acceso a los recursos del sistema
Aplicaciones
Una aplicación puede invocar el SecurityManager cuando
arranca con la opción -Djava.security.manager
Cuando el class loader carga un programa, éste es
asociado a un conjunto de permisos por defecto (objetos
java.security.Permission)
Es posible implementar una polı́tica de control de acceso
para conceder/revocar permisos
Principios básicos de seguridad software
Diseño
Programación
Modelo de seguridad Java
Extensiones
Java proporciona extensiones para programar
funcionalidades de seguridad
Java Cryptography Extension (JCE)
Cifrado, claves públicas-privadas, números aleatorios, firmas
digitales, certificados
Basado en una arquitectura de plugin, que permite a
diferentes provedores ofrecer diferentes implementaciones
de los mismos servicios
Java Secure Socket Extension (JSSE)
Creación de socket seguras para comunicación TCP/IP
(SSL)
Java Authentication and Authorization Service (JAAS)
Autenticación de usuarios
Autorización para ejecutar determinadas acciones
Descargar