Bloque 3: Parte servidora (backend)

Transcripción

Bloque 3: Parte servidora (backend)
DISEÑODEAPLICACIONESWEB
Bloque 3: Parte servidora
(backend)
TEMA3.4:SEGURIDADCONSPRINGSECURITY
JesúsMontes
jmontes@fi.upm.es
SEGURIDADCONSPRINGSECURITY
Disclaimer
• Estematerialestábasadoenunmaterial
originalde:
§ 
BoniGarcía([email protected])
2
SEGURIDADCONSPRINGSECURITY
Índice de contenidos
1.  Seguridadenredesdedatos
2.  Autenticaciónyautorización
3.  Confidencialidad
3
SEGURIDADCONSPRINGSECURITY
Índice de contenidos
1.  Seguridadenredesdedatos
§ 
Serviciosdeseguridad
TLS
§ 
HTTPS
§ 
2.  Autenticaciónyautorización
3.  Confidencialidad
4
SEGURIDADCONSPRINGSECURITY
1.
Seguridad en redes de
datos
Serviciosdeseguridad
•  Unserviciodeseguridadprotegelascomunicacionesdelos
usuariosantedeterminadosataques.Losprincipalesson:
§ 
§ 
§ 
§ 
Confidencialidad:Proporcionaprotecciónparaevitarquelos
datosseanreveladosaunusuarionoautorizado.
Autenticaciónyautorización:Sirveparagarantizarqueuna
entidad(personaomáquina)esquiendiceser,ydeterminaraqué
recursostieneacceso.
Integridad:Garantizaalreceptordelmensajequelosdatos
recibidoscoincidenexactamenteconlosenviadosporelemisor.
Norepudio:Impidequeunemisor/receptornieguehaberestado
involucradoenunacomunicación.
5
SEGURIDADCONSPRINGSECURITY
1.
Seguridad en redes de
datos
Seguridadenredesdedatos
•  Laconfidencialidadseconsiguetípicamenteusando
técnicascriptográficas(cifradodemensajes).Tipos
desistemascriptográficos:
§ 
§ 
Criptosistemasdeclavesecreta.Enellos,laclavede
cifradoydedescifradoeslamisma:esunaclave
secretaquecompartenelemisoryelreceptordel
mensaje.Debidoaestacaracterísticasondenominados
tambiéncriptosistemassimétricos
Criptosistemasdeclavepública.Sedistinguenporque
cadausuarioosistemafinaldisponededosclaves:una
privada,quedebemantenersecreta,yunapública,que
debeserconocidaportodaslasrestantesentidades
quevanacomunicarconella.Selosconocetambién
comocriptosistemasasimétricos
6
SEGURIDADCONSPRINGSECURITY
1. Seguridad en redes de datos
Seguridadenredesdedatos
•  Elcifradoasimétricoesmenosvulnerablequeel
simétrico,peroescomputacionalmentemuchomas
costoso.
•  Elmodelohíbridoesunmecanismopararealizar
comunicacionessegurasquecombinacifrado
asimétricoysimétrico.
§ 
§ 
Usandocifradoasimétrico,serealizaunintercambiode
clavespúblicas.
Usandolasclavespúblicasseintercambiaunaclavede
sesión,simétrica,queseusaparaelrestode
comunicaciones.
7
SEGURIDADCONSPRINGSECURITY
Seguridad en redes de datos
1.
Clave pública del receptor
Clave de sesión
8
SEGURIDADCONSPRINGSECURITY
1.
Seguridad en redes de
datos
Seguridadenredesdedatos
•  Laautenticaciónyautorizaciónseconsiguenmediante:
§ 
Algoquesabes.Porejemplo,unascredencialeslogin-password.
§ 
Algoquetienes.Porejemplo,unatarjetadeacceso.
§ 
Algoqueeres.Porejemplo,cualidadesbiométricas(huelladigital…).
•  LaintegridadseconsiguetípicamenteconfuncionesHash(resumen)
§ 
Sonfuncionescomputablesmedianteunalgoritmoqueconvierteunaentrada
binaria(típicamenteunficheroounmensajedigital)aunrangodesalidafinito
(típicamenteunacadenasalfanumérica)
•  Elnorepudioseconsiguemedianteregistrosprotegidosdelaactividadde
losusuarios,siempreycuandosegaranticesuautenticaciónylaintegridad
delproceso.
9
SEGURIDADCONSPRINGSECURITY
1.
Seguridad en redes de
datos
Serviciosdeseguridad
•  Firmadigital:
§ 
§ 
Unafunciónhashsepuedeusarparacalcularun“resumen”deun
mensaje(checksum).
Paraprotegerelresumen,secifrautilizandounaclaveprivada.
10
SEGURIDADCONSPRINGSECURITY
1.
Seguridad en redes de
datos
Serviciosdeseguridad
•  Enloscriptosistemasdeclavepública,uncertificadodigital
esundocumentoelectrónicoqueasociaelnombredeuna
entidadconsuclavepúblicaduranteundeterminado
periododevalidez.
•  ElcertificadodigitalesemitidoporunaAutoridadde
Certificación(CA),osea,la“TerceraPartede
Confianza”(TTP,TrustedThirdParty)
•  Loscertificadosusadosenaplicacioneswebasocianun
dominiowebasuclavepública.
•  Tipodecertificadomásutilizado:X.509(estándardelITU-T).
11
SEGURIDADCONSPRINGSECURITY
1.
Seguridad en redes de
datos
12
SEGURIDADCONSPRINGSECURITY
1.
Seguridad en redes de
datos
Serviciosdeseguridad
•  Ejemplosdealgoritmos:
Criptosistemas asimétricos
Criptosistemas simétricos
§  RSA (Rivest, Shamir y Adleman)
§  Diffie-Hellman
§  ElGamal
§  Criptografía de curva elíptica
§  AES (Advanced Encryption Standard)
§  ES (Data Encryption Standard)
§  IDEA (International Data Encryption
Algorithm)
§  3DES
§  RC2, RC4, RC5
§  Blowfish
Funciones hash
§  SHA (Secure Hash Algorithm)
§  MD5 (Message-Digest Algorithm 5)
§  DSA (Digital Signature Algorithm)
13
SEGURIDADCONSPRINGSECURITY
1.
Seguridad en redes de
datos
TLS
•  TLS(TransportLayerSecurity)esunprotocolocriptográficodenivelde
transportequesigueunmodelodecifradohíbrido(asimétrico+simétrico)y
queproporcionacomunicacionessegurassobreTCP.
§ 
§ 
EslaversiónevolucionadadeSSL(SecureSocketsLayer).
Enoctubrede2014sedescubrióunavulnerabilidadcríticaenSSL3.0quehace
quesuusoestédesaconsejado.
•  LosserviciosdeseguridadofrecidosporSSL/TLSson:
§ 
§ 
§ 
Confidencialidad:secifraelintercambiodedatosanivelTCP.
Autenticación:entidadespuedenconfirmarsuidentidad.Enunprotocolo
cliente-servidorsóloelservidoresautenticado(esdecir,segarantizasu
identidad)mientrasqueelclientesemantienesinautenticar
Integridad:seusaunafunciónhashparagarantizarlaintegridaddedatos
14
SEGURIDADCONSPRINGSECURITY
1.
Seguridad en redes de
datos
TLS
•  Paraestableceruncanalsegurocifrado,lasentidadestienenquellegaraun
acuerdo(handshake)
•  Elhandshaketienevariasfases:
1. 
Establecimientodecaracterísticasseguridad(algoritmocifrado,etc).
2. 
Elservidorenvíasucertificadodigital.
3. 
Elclienteestablecelaclavemaestra(MS,MasterSecret)
–  Opcionalmenteelclientepuedemandarsucertificadoenestafase.
–  Enaplicacionesweb(HTTPS),elservidoreselúnicoautenticado,esdecir,sóloel
servidorenvíauncertificadoalcliente.
4. 
Finalizacióndelhandshakeeiniciodecomunicaciónsegura.
•  Despuésdelhandshakeelintercambiodetráficoseproducemediante
cifradodeltráficobasadoencifradosimétrico.
15
SEGURIDADCONSPRINGSECURITY
1.
Seguridad en redes de
TLS
•  Handshake:
datos
servidor
cliente
ClientHello
ServerHello
Certificate
ServerHelloDone
ClientKeyExchange
ChangeCipherSpec
Finished
ChangeCipherSpec
Finished
Fase 1. Inicio
Fase 2. El servidor manda el
certificado
Fase 3. Establecimiento de clave
maestra (MS, Master Secret)
Fase 4. Finalización
Intercambio de datos en canal
seguro mediante cifrado
simétrico
16
SEGURIDADCONSPRINGSECURITY
1.
Seguridad en redes de
TLS
•  Handshake:
El cliente genera una
clave maestra MS que
será usada para cifrar
todos los datos de la
sesión segura. Esta
clave se envía cifrada
con la clave pública
del servidor, obtenida
a partir del certificado
datos
servidor
cliente
ClientHello
ServerHello
Certificate
ServerHelloDone
ClientKeyExchange
ChangeCipherSpec
Finished
ChangeCipherSpec
Finished
Al enviar el certificado el
servidor está mandando su
clave pública al cliente
El servidor obtiene la clave
maestra MS descifrando el
mensaje enviado por el
cliente, usando para ello
su clave privada
17
SEGURIDADCONSPRINGSECURITY
1.
Seguridad en redes de
datos
HTTPS
•  HypertextTransferProtocolSecure.VersiónseguradeHTTP.
•  HTTPSnoesmásqueHTTPsobreTLS/SSL.
•  ConHTTPSseconsiguequelainformaciónsensible(claves,etc)nopueda
serinterceptadaporunatacante,yaqueloúnicoqueobtendráseráunflujo
dedatoscifradosqueleresultaráimposiblededescifrar.
•  PuertoTCPpordefectoenservidoresHTTPS:443
HTTPS
TLS
TCP
IP
18
SEGURIDADCONSPRINGSECURITY
1.
Seguridad en redes de
datos
HTTPS
•  LosnavegadorestienenunalistadeCAsconocidas.
•  Alrecibiruncertificadonovalidomuestraunaalertadeseguridadal
usuario.Estoocurrecuando:
§ 
§ 
ElcertificadofirmadoporunaCAnoconocida(porejemplo,un
certificadoautofirmado).
Elcertificadohacaducado.
19
SEGURIDADCONSPRINGSECURITY
Índice de contenidos
1.  Seguridadenredesdedatos
2.  Autenticaciónyautorización
§ 
§ 
§ 
EjemploAAsencillo
EjemploAAmedio
EjemploAAavanzado
3.  Confidencialidad
20
SEGURIDADCONSPRINGSECURITY
2.
Autenticación y autorización
•  Vamosavercomoimplementarlosserviciosde
seguridaddeautenticaciónyautorizaciónenSpring
(Boot+Security)estudiandotresejemplos:
1. 
Sencillo(proyectospring-security-aa-simple)
–  Usuariosenmemoria,rolúnico.
2. 
Medio(proyectospring-security-aa-medium)
–  Usuariosenmemoria,variosroles.
3. 
Avanzado(proyectospring-security-aaadvanced)
–  Usuariosenbasededatos,variosroles.
21
SEGURIDADCONSPRINGSECURITY
2.
Autenticación y autorización
EjemploAAsencillo:proyectospring-security-aa-simple
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.2.7.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
</dependencies>
22
SEGURIDADCONSPRINGSECURITY
2.
Autenticación y autorización
EjemploAAsencillo:proyectospring-security-aa-simple
@Controller
public class SecurityController {
@RequestMapping("/")
public ModelAndView index() {
return new ModelAndView("index");
}
Controlador muy
sencillo: sólo asocia
URLs con vistas
@RequestMapping("/login")
public ModelAndView login() {
return new ModelAndView("login");
}
@RequestMapping("/home")
public ModelAndView home() {
return new ModelAndView("home");
}
}
23
SEGURIDADCONSPRINGSECURITY
2.
Autenticación y autorización
EjemploAAsencillo:proyectospring-security-aa-simple
Index.html
login.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<body>
Access to protected pages clicking
<a th:href="@{/home}">here</a>!
</body>
</html>
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Login form</title>
</head>
<body>
<p th:if="${param.error}">Invalid credentials</p>
<p th:if="${param.logout}">Logged out</p>
home.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Home</title>
</head>
<body>
<h1>Hello Spring Security!</h1>
<form th:action="@{/logout}" method="post">
<input type="submit" value="Sign Out”/>
</form>
</body>
</html>
<form th:action="@{/login}" method="post”>
<label>User Name:</label>
<input type="text" name="username” />
<br />
<label>Password:</label>
<input type="password" name="password” />
<br />
<input type="submit" value="Sign In" />
<br />
</form>
</body>
</html>
24
SEGURIDADCONSPRINGSECURITY
2.
Autenticación y autorización
EjemploAAsencillo:proyectospring-security-aa-simple
@Configuration
@EnableGlobalMethodSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().antMatchers("/").permitAll();
http.authorizeRequests().anyRequest().authenticated();
http.formLogin().loginPage("/login").usernameParameter("username")
.passwordParameter("password").defaultSuccessUrl("/home")
.failureUrl("/login?error").permitAll();
http.logout().logoutUrl("/logout").logoutSuccessUrl("/login?logout")
.permitAll();
}
@Override
protected void configure(AuthenticationManagerBuilder auth)
throws Exception {
auth.inMemoryAuthentication().withUser("user").password("p1")
.roles("USER");
}
El path “/” tendrá
acceso permitido. El
resto necesitará
autenticación
Autenticación
basada en formulario
Página para la
desconexión
Un único usuario (en
memoría)
}
25
SEGURIDADCONSPRINGSECURITY
2.
Autenticación y autorización
EjemploAAsencillo:proyectospring-security-aa-simple
/home es un recurso
protegido, así que se
redirige la navegación
al formulario de login
logout
Con las
credenciales
correctas
vamos a /
home
26
SEGURIDADCONSPRINGSECURITY
2.
Autenticación y autorización
EjemploAAsencillo:proyectospring-security-aa-simple
•  Todaslasvistasincorporanunamedidadeseguridadautomática:un
tokenautomáticoCSRF(CrossSiteRequestForgery).
•  Estetokenlogeneraelservidorparacadapeticiónyesrequerido
parapoderrecibirdatosdelcliente.
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Home</title>
</head>
<body>
<h1>Hello Spring Security!</h1>
<form th:action="@{/logout}" method="post">
<input type="submit" value="Sign Out" />
</form>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<title>Home</title>
</head>
<body>
<h1>Hello Spring Security!</h1>
<form method="post" action="/logout">
<input type="submit" value="Sign Out" />
<input type="hidden" name="_csrf"
value="c54a70a7-1586-4dc3-8e64-4fac09625ce2" /></
form>
</body>
</html>
27
SEGURIDADCONSPRINGSECURITY
2.
Autenticación y autorización
EjemploAAmedio:proyectospring-security-aa-medium
Proyecto con la
misma estructura
salvo que tiene una
vista más
28
SEGURIDADCONSPRINGSECURITY
2.
Autenticación y autorización
EjemploAAmedio:proyectospring-security-aa-medium
Cambiamos la anotación que define el método de
seguridad para poder restringir la autorización de los
métodos controladores a ciertos roles de usuario
@Configuration
@EnableGlobalMethodSecurity(securedEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
// Same authentication schema than example before
@Override
protected void configure(AuthenticationManagerBuilder auth)
throws Exception {
// Authorization
auth.inMemoryAuthentication().withUser("user").password("p1")
.roles("USER");
auth.inMemoryAuthentication().withUser("root").password("p2")
.roles("USER", "ADMIN");
}
Dos usuarios
en memoria de
diferente tipo
(rol)
}
29
SEGURIDADCONSPRINGSECURITY
2.
Autenticación y autorización
EjemploAAmedio:proyectospring-security-aa-medium
@Controller
public class SecurityController {
@Secured({ "ROLE_USER", "ROLE_ADMIN" })
@RequestMapping("/home")
public ModelAndView home() {
Authentication auth = SecurityContextHolder
.getContext().getAuthentication();
String name = auth.getName();
ModelAndView model = new ModelAndView("home")
.addObject("name", name);
@RequestMapping("/")
public ModelAndView index() {
return new ModelAndView("index");
}
@RequestMapping("/login")
public ModelAndView login() {
return new ModelAndView("login");
}
Los métodos protegidos se anotan
con @Secured y el nombre del rol
(con prefijo ROLE_)
return model;
}
@Secured("ROLE_ADMIN")
@RequestMapping("/root")
public ModelAndView root() {
return new ModelAndView("root");
}
}
30
SEGURIDADCONSPRINGSECURITY
2.
Autenticación y autorización
EjemploAAavanzado:proyectospring-security-aa-advanced
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
</dependencies>
31
SEGURIDADCONSPRINGSECURITY
2.
Autenticación y autorización
EjemploAAavanzado:proyectospring-security-aa-advanced
@Component
public class DatabaseLoader {
@Autowired
private UserRepository userRepository;
Componente usado
para popular la base
de datos (se
ejecutará al iniciar la
aplicación)
@PostConstruct
private void initDatabase() {
// User #1: "user", with password "p1" and role "USER"
GrantedAuthority[] userRoles = { new SimpleGrantedAuthority("ROLE_USER") };
userRepository.save(new User("user", "p1", Arrays.asList(userRoles)));
// User #2: "root", with password "p2" and roles "USER" and "ADMIN"
GrantedAuthority[] adminRoles = { new SimpleGrantedAuthority("ROLE_USER"),
new SimpleGrantedAuthority("ROLE_ADMIN") };
userRepository.save(new User("root", "p2", Arrays.asList(adminRoles)));
}
}
32
SEGURIDADCONSPRINGSECURITY
2.
Autenticación y autorización
EjemploAAavanzado:proyectospring-security-aa-advanced
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
Entidad persistente
que almacenará las
credenciales de
usuario y sus roles
private String user;
private String password;
@ElementCollection(fetch = FetchType.EAGER)
private List<GrantedAuthority> roles;
public User() {
}
public User(String user, String password, List<GrantedAuthority> roles) {
this.user = user;
this.password = new BCryptPasswordEncoder().encode(password);
Las contraseñas nunca
this.roles = roles;
se deben almacenar en
}
// getters, setters
}
claro (hay que usar
cifrado o función
hash)
33
SEGURIDADCONSPRINGSECURITY
2.
Autenticación y autorización
EjemploAAavanzado:proyectospring-security-aa-advanced
public interface UserRepository extends CrudRepository<User, Long> {
User findByUser(String user);
}
Repositorio de
usuarios
@Configuration
@EnableGlobalMethodSecurity(securedEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
public CustomAuthenticationProvider authenticationProvider;
// Same authentication schema than examples before
@Override
protected void configure(AuthenticationManagerBuilder auth)
throws Exception {
// Database authentication provider
auth.authenticationProvider(authenticationProvider);
}
}
El gestor de
autenticación ya no
son credenciales en
memoria
34
SEGURIDADCONSPRINGSECURITY
2.
Autenticación y autorización
EjemploAAavanzado:proyectospring-security-aa-advanced
@Component
public class CustomAuthenticationProvider implements AuthenticationProvider {
@Autowired
private UserRepository userRepository;
Se inyecta repositorio
de usuario
@Override
public Authentication authenticate(Authentication authentication)
throws AuthenticationException {
Lectura de credenciales
String username = authentication.getName();
del formulario
String password = (String) authentication.getCredentials();
User user = userRepository.findByUser(username);
if (user == null) {
Se comprueba usuario y
throw new BadCredentialsException("User not found");
contraseña
}
if (!new BCryptPasswordEncoder().matches(password, user.getPasswordHash())) {
throw new BadCredentialsException("Wrong password");
}
Lectura de lista de roles
List<GrantedAuthority> roles = user.getRoles();
return new UsernamePasswordAuthenticationToken(username, password, roles);
}
}
35
SEGURIDADCONSPRINGSECURITY
Índice de contenidos
1.  Seguridadenredesdedatos
2.  Autenticaciónyautorización
3.  Confidencialidad
36
SEGURIDADCONSPRINGSECURITY
3.
Confidencialidad
Ejemplo:proyectospring-security-https
•  Exactamenteigualqueproyectospringsecurity-aa-simpleexcepto:
§ 
application.properties:
server.port=8443
server.ssl.key-store=classpath:keystore.jks
server.ssl.key-store-password=password
server.ssl.key-password=secret
§ 
keystore.jks:RepositoriodecertificadosJava
37
SEGURIDADCONSPRINGSECURITY
3.
Confidencialidad
Ejemplo:proyectospring-security-https
•  keystore.jkssecreaconherramientakeytool(incorporadaenJRE)
$ $JAVA_HOME/bin/keytool -genkey -keyalg RSA -alias selfsigned -keystore keystore.jks storepass password -validity 365 -keysize 2048
¿Cuáles son su nombre y su apellido?
[Unknown]: Jesus Montes
¿Cuál es el nombre de su unidad de organización?
[Unknown]: Programacion Web
¿Cuál es el nombre de su organización?
[Unknown]: UPM
¿Cuál es el nombre de su ciudad o localidad?
[Unknown]: Madrid
¿Cuál es el nombre de su estado o provincia?
[Unknown]: Madrid
¿Cuál es el código de país de dos letras de la unidad?
[Unknown]: ES
¿Es correcto CN=Jesus Montes, OU=Programacion Web, O=UPM, L=Madrid, ST=Madrid,
C=ES?
[no]: si
Introduzca la contraseña de clave para <selfsigned>
(INTRO si es la misma contraseña que la del almacén de claves): secret
Volver a escribir la contraseña nueva: secret
38

Documentos relacionados