Her şeyi Spring Boot Security Starter'ın varsayılan ayarlarına olabildiğince yakın tutarken, bir Açısal ve Yay uygulamasına TOTP yumuşak belirteçleriyle çok faktörlü kimlik doğrulama eklemek istiyorum .
Belirteç doğrulaması, üçüncü taraf API sağlayıcısı olmayan yerel olarak (aerogear-otp-java kitaplığıyla) gerçekleşir.
Bir kullanıcı için belirteçler ayarlamak çalışır, ancak Spring Security Authentication Manager / Providers'dan yararlanarak bunları doğrulamak işe yaramaz.
TL; DR
- Ek bir AuthenticationProvider'ı Spring Boot Security Starter yapılandırılmış bir sisteme entegre etmenin resmi yolu nedir ?
- Tekrar saldırılarını önlemenin önerilen yolları nelerdir?
Uzun versiyon
API, /auth/token
kullanıcı arabirimi ve şifre sağlayarak ön ucun bir JWT jetonu alabileceği bir uç noktaya sahiptir . Yanıt ayrıca AUTHENTICATED veya PRE_AUTHENTICATED_MFA_REQUIRED olabilen bir kimlik doğrulama durumu da içerir .
Kullanıcı MFA gerektiriyorsa, jetona tek bir yetki PRE_AUTHENTICATED_MFA_REQUIRED
ve 5 dakikalık bir sona erme süresi verilir . Bu, kullanıcının /auth/mfa-token
Kimlik Doğrulayıcı uygulamasından TOTP kodunu sağlayabileceği uç noktaya erişmesine ve siteye erişmek için tamamen doğrulanmış jetonu almasına olanak tanır .
Sağlayıcı ve Jeton
MfaAuthenticationProvider
Uygulamamı oluşturdum AuthenticationProvider
:
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
// validate the OTP code
}
@Override
public boolean supports(Class<?> authentication) {
return OneTimePasswordAuthenticationToken.class.isAssignableFrom(authentication);
}
Ve bir kullanıcı adı (imzalı JWT'den alınmıştır) ve OTP kodunu tutmaya OneTimePasswordAuthenticationToken
uzanır AbstractAuthenticationToken
.
Yapılandırma
Benim özel var WebSecurityConfigurerAdapter
benim özel eklemek, AuthenticationProvider
üzeri http.authenticationProvider()
. JavaDoc'a göre, bu doğru yer gibi görünüyor:
Kullanılacak ek bir AuthenticationProvider eklemeye izin verir
Benim ilgili kısımlarım SecurityConfig
böyle görünüyor.
@Configuration
@EnableWebSecurity
@EnableJpaAuditing(auditorAwareRef = "appSecurityAuditorAware")
public class SecurityConfig extends WebSecurityConfigurerAdapter {
private final TokenProvider tokenProvider;
public SecurityConfig(TokenProvider tokenProvider) {
this.tokenProvider = tokenProvider;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authenticationProvider(new MfaAuthenticationProvider());
http.authorizeRequests()
// Public endpoints, HTML, Assets, Error Pages and Login
.antMatchers("/", "favicon.ico", "/asset/**", "/pages/**", "/api/auth/token").permitAll()
// MFA auth endpoint
.antMatchers("/api/auth/mfa-token").hasAuthority(ROLE_PRE_AUTH_MFA_REQUIRED)
// much more config
kontrolör
AuthController
Olan AuthenticationManagerBuilder
enjekte edilir ve hep birlikte çekme edilir.
@RestController
@RequestMapping(AUTH)
public class AuthController {
private final TokenProvider tokenProvider;
private final AuthenticationManagerBuilder authenticationManagerBuilder;
public AuthController(TokenProvider tokenProvider, AuthenticationManagerBuilder authenticationManagerBuilder) {
this.tokenProvider = tokenProvider;
this.authenticationManagerBuilder = authenticationManagerBuilder;
}
@PostMapping("/mfa-token")
public ResponseEntity<Token> mfaToken(@Valid @RequestBody OneTimePassword oneTimePassword) {
var username = SecurityUtils.getCurrentUserLogin().orElse("");
var authenticationToken = new OneTimePasswordAuthenticationToken(username, oneTimePassword.getCode());
var authentication = authenticationManagerBuilder.getObject().authenticate(authenticationToken);
// rest of class
Ancak, karşı /auth/mfa-token
gönderilmek şu hataya yol açar:
"error": "Forbidden",
"message": "Access Denied",
"trace": "org.springframework.security.authentication.ProviderNotFoundException: No AuthenticationProvider found for de.....OneTimePasswordAuthenticationToken
Spring Security neden Kimlik Doğrulama Sağlayıcımı almıyor? Denetleyicinin hata ayıklaması bana bunun DaoAuthenticationProvider
içindeki Tek Kimlik Doğrulama Sağlayıcısı olduğunu gösteriyor AuthenticationProviderManager
.
Eğer benim MfaAuthenticationProvider
fasulye olarak ifşa , kayıtlı tek Sağlayıcı olduğunu, bu yüzden tam tersi olsun:
No AuthenticationProvider found for org.springframework.security.authentication.UsernamePasswordAuthenticationToken.
Peki, ikisini nasıl edinebilirim?
Benim sorum
AuthenticationProvider
Bir eklentiyi Spring Boot Security Starter yapılandırmalı sisteme entegre etmenin önerilen yolu nedir , böylece hem DaoAuthenticationProvider
benim hem de kendi özelim olsun MfaAuthenticationProvider
? Spring Boot Scurity Starter'ın varsayılan değerlerini korumak ve ek olarak kendi Sağlayıcımı kullanmak istiyorum.
Tekrar Saldırının Önlenmesi
OTP algoritmasının kodun geçerli olduğu zaman dilimi içinde tekrar saldırılarına karşı koruma sağlamadığını biliyorum; RFC 6238 bunu açıkça ortaya koyuyor
Doğrulayıcı, ilk OTP için başarılı doğrulama yapıldıktan sonra OTP'nin ikinci denemesini kabul ETMEMELİDİR ZORUNLU, bu sadece OTP'nin tek seferlik kullanılmasını sağlar.
Korumayı uygulamak için önerilen bir yol olup olmadığını merak ediyordum. OTP jetonları zamana dayalı olduğundan, son başarılı girişi kullanıcının modelinde saklamayı ve 30 saniyelik zaman diliminde sadece bir başarılı giriş olduğundan emin olmayı düşünüyorum. Bu elbette kullanıcı modelinde senkronizasyon anlamına gelir. Daha iyi yaklaşımlar var mı?
Teşekkür ederim.
-
Not: Bu güvenlikle ilgili bir soru olduğundan, güvenilir ve / veya resmi kaynaklardan bir cevap çizimi arıyorum. Teşekkür ederim.