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