Keycloak – Identity Management dla Enterprise

TL;DR: Keycloak to potężne open source rozwiązanie do zarządzania tożsamością i dostępem (IAM). Oferuje Single Sign-On (SSO), OAuth2, OpenID Connect oraz centralne zarządzanie użytkownikami. Idealny dla aplikacji enterprise wymagających zaawansowanego systemu autoryzacji.

Dlaczego Keycloak to game-changer w enterprise?

Zarządzanie użytkownikami w aplikacjach enterprise to prawdziwy koszmar. Każda aplikacja ma własny system logowania, użytkownicy pamiętają dziesiątki haseł, a administratorzy tracą głowę nad integracją różnych systemów. Keycloak rozwiązuje te problemy jednym uderzeniem – centralnym systemem zarządzania tożsamością.

W 2018 roku coraz więcej firm przechodzi na architekturę mikrousług, gdzie tradycyjne podejście do autoryzacji przestaje działać. Keycloak dostarcza nowoczesne standardy jak OAuth2 i OpenID Connect, które stają się podstawą bezpiecznych aplikacji.

Co się nauczysz:

  • Jak skonfigurować i uruchomić Keycloak server w środowisku developerskim
  • Implementacja Single Sign-On (SSO) między aplikacjami
  • Konfiguracja OAuth2 i OpenID Connect dla aplikacji webowych
  • Zarządzanie użytkownikami, rolami i grupami w Keycloak Admin Console
  • Integracja Keycloak z aplikacjami Spring Boot i Angular
  • Best practices bezpieczeństwa w konfiguracji production
Wymagania wstępne: Znajomość Java, Spring Boot, podstawy REST API. Przydatna znajomość konceptów OAuth2 i JWT tokenów. Doświadczenie z Docker będzie pomocne ale nie wymagane.

Czym jest Keycloak i dlaczego warto go używać?

Keycloak to open source Identity and Access Management (IAM) rozwiązanie stworzone przez Red Hat. W przeciwieństwie do komercyjnych rozwiązań jak Active Directory Federation Services czy Auth0, Keycloak możesz uruchomić we własnej infrastrukturze bez licencyjnych ograniczeń.

Identity and Access Management (IAM) – system zarządzający kim są użytkownicy (Identity) i do czego mają dostęp (Access). Składa się z autentykacji (kto to?) i autoryzacji (co może robić?).

Główne zalety Keycloak:
– **Single Sign-On (SSO)** – jeden login do wszystkich aplikacji
– **Standardy branżowe** – OAuth2, OpenID Connect, SAML 2.0
– **Social Login** – integracja z Google, Facebook, Twitter
– **Federacja tożsamości** – łączenie z LDAP, Active Directory
– **Multi-tenancy** – obsługa wielu organizacji w jednej instancji
– **Admin Console** – webowy interfejs zarządzania

Instalacja i pierwsze uruchomienie

Najszybszy sposób na start z Keycloak to pobranie standalone wersji:

# Pobierz Keycloak 4.5.0 (najnowsza wersja w październiku 2018)
wget https://downloads.jboss.org/keycloak/4.5.0.Final/keycloak-4.5.0.Final.tar.gz

# Rozpakuj
tar -xzf keycloak-4.5.0.Final.tar.gz
cd keycloak-4.5.0.Final

# Uruchom w trybie standalone
./bin/standalone.sh

Po uruchomieniu Keycloak będzie dostępny pod adresem `http://localhost:8080`. Przy pierwszym uruchomieniu musisz utworzyć konto administratora.

Pro tip: W środowisku production używaj trybu domain dla cluster deployments lub skonfiguruj Keycloak z zewnętrzną bazą danych PostgreSQL zamiast domyślnej H2.

Podstawowe koncepty – Realms, Clients i Users

Keycloak organizuje dane w hierarchiczną strukturę:

Realm – izolowana przestrzeń zarządzania użytkownikami. Każda organizacja lub środowisko (dev/staging/prod) ma własny realm.
Client – aplikacja która korzysta z Keycloak do autoryzacji. Może to być aplikacja webowa, mobilna lub API.
User – osoba która loguje się do aplikacji. Każdy user należy do konkretnego realm.

### Tworzenie nowego Realm

{
  "realm": "company-portal",
  "displayName": "Company Portal",
  "enabled": true,
  "sslRequired": "external",
  "registrationAllowed": false,
  "loginWithEmailAllowed": true,
  "duplicateEmailsAllowed": false,
  "resetPasswordAllowed": true,
  "editUsernameAllowed": false,
  "bruteForceProtected": true
}

Ta konfiguracja tworzy realm `company-portal` z podstawowymi ustawieniami bezpieczeństwa. W Admin Console możesz importować ten JSON lub skonfigurować wszystko przez interfejs graficzny.

Konfiguracja pierwszego Client – Spring Boot App

Załóżmy że mamy aplikację Spring Boot która ma być zabezpieczona przez Keycloak. Tworzymy nowego Client:

Client ID: spring-boot-app
Client Protocol: openid-connect
Access Type: confidential (aplikacja może bezpiecznie przechować client secret)

Konfiguracja Client w Keycloak:

{
  "clientId": "spring-boot-app",
  "enabled": true,
  "clientAuthenticatorType": "client-secret",
  "redirectUris": [
    "http://localhost:8081/*"
  ],
  "webOrigins": [
    "http://localhost:8081"
  ],
  "protocol": "openid-connect",
  "publicClient": false,
  "frontchannelLogout": true,
  "fullScopeAllowed": true
}
Uwaga: W production nigdy nie używaj wildcard (*) w redirectUris. Zawsze podawaj pełne, konkretne URL-e dla bezpieczeństwa.

Integracja z aplikacją Spring Boot

Dodaj Keycloak adapter do swojej aplikacji Spring Boot:



    org.keycloak
    keycloak-spring-boot-starter
    4.5.0.Final


    org.keycloak
    keycloak-spring-security-adapter
    4.5.0.Final

Konfiguracja w `application.yml`:

keycloak:
  auth-server-url: http://localhost:8080/auth
  realm: company-portal
  resource: spring-boot-app
  credentials:
    secret: your-client-secret-from-keycloak
  use-resource-role-mappings: true
  
server:
  port: 8081

Security Configuration:

@Configuration
@EnableWebSecurity
@ComponentScan(basePackageClasses = KeycloakSecurityComponents.class)
public class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter {

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) {
        auth.authenticationProvider(keycloakAuthenticationProvider());
    }

    @Bean
    @Override
    protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
        return new RegisterSessionAuthenticationStrategy(
            new SessionRegistryImpl());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        super.configure(http);
        http.authorizeRequests()
            .antMatchers("/public/**").permitAll()
            .antMatchers("/admin/**").hasRole("ADMIN")
            .anyRequest().authenticated();
    }
}
Pro tip: Używaj `@EnableGlobalMethodSecurity(prePostEnabled = true)` żeby móc stosować `@PreAuthorize` na poziomie metod dla fine-grained authorization.

Zarządzanie użytkownikami i rolami

Keycloak oferuje elastyczny system ról i grup:

### Tworzenie ról
1. **Realm Roles** – role globalne w ramach realm
2. **Client Roles** – role specyficzne dla konkretnej aplikacji
3. **Composite Roles** – role składające się z innych ról

@RestController
public class UserController {
    
    @GetMapping("/profile")
    @PreAuthorize("hasRole('USER')")
    public ResponseEntity getUserProfile(Principal principal) {
        KeycloakPrincipal keycloakPrincipal = (KeycloakPrincipal) principal;
        KeycloakSecurityContext context = keycloakPrincipal.getKeycloakSecurityContext();
        
        AccessToken token = context.getToken();
        
        UserProfile profile = UserProfile.builder()
            .username(token.getPreferredUsername())
            .email(token.getEmail())
            .firstName(token.getGivenName())
            .lastName(token.getFamilyName())
            .roles(token.getRealmAccess().getRoles())
            .build();
            
        return ResponseEntity.ok(profile);
    }
    
    @GetMapping("/admin/users")
    @PreAuthorize("hasRole('ADMIN')")
    public ResponseEntity> getUsers() {
        // Admin endpoint
        return ResponseEntity.ok(Arrays.asList("user1", "user2"));
    }
}

Single Sign-On (SSO) między aplikacjami

Prawdziwa siła Keycloak ujawnia się gdy integrujesz wiele aplikacji. SSO pozwala użytkownikowi zalogować się raz i mieć dostęp do wszystkich aplikacji.

SSO to jak przepustka do biurowca – raz pokazujesz identyfikator na recepcji i możesz wchodzić do wszystkich pięter i pokoi bez ponownego uwierzytelniania.

### Konfiguracja drugiej aplikacji (Angular)

Dla frontend aplikacji Angular używamy `keycloak-angular` adaptera:

npm install keycloak-angular@5.1.0 keycloak-js@4.5.0
// app.module.ts
import { KeycloakAngularModule, KeycloakService } from 'keycloak-angular';

function initializeKeycloak(keycloak: KeycloakService) {
  return () =>
    keycloak.init({
      config: {
        url: 'http://localhost:8080/auth',
        realm: 'company-portal',
        clientId: 'angular-app',
      },
      initOptions: {
        onLoad: 'login-required',
        checkLoginIframe: false,
      },
    });
}

@NgModule({
  imports: [KeycloakAngularModule],
  providers: [
    {
      provide: APP_INITIALIZER,
      useFactory: initializeKeycloak,
      multi: true,
      deps: [KeycloakService],
    },
  ],
})
export class AppModule {}
Pułapka: Pamiętaj o dodaniu Angular Client w Keycloak Admin Console z `Access Type: public` – aplikacje JavaScript nie mogą bezpiecznie przechować client secret.

OAuth2 i OpenID Connect w praktyce

Keycloak implementuje pełne wsparcie dla OAuth2 i OpenID Connect. Oto jak wygląda typowy flow autoryzacji:

Authorization Code Flow:
1. User → Application (żądanie dostępu)
2. Application → Keycloak (redirect do login)
3. User → Keycloak (logowanie)
4. Keycloak → Application (authorization code)
5. Application → Keycloak (code exchange za token)
6. Keycloak → Application (access token + ID token)
7. Application → Resource Server (API call z tokenem)

### Testowanie tokenów JWT

Keycloak generuje JWT tokeny które możesz zweryfikować:

@Component
public class JwtTokenValidator {
    
    @Value("${keycloak.auth-server-url}")
    private String authServerUrl;
    
    @Value("${keycloak.realm}")
    private String realm;
    
    public boolean validateToken(String token) {
        try {
            // Pobierz public key z Keycloak
            String jwksUrl = authServerUrl + "/realms/" + realm + "/protocol/openid_connect/certs";
            
            // Walidacja tokenu
            Algorithm algorithm = Algorithm.RSA256(getRSAPublicKey(jwksUrl), null);
            JWTVerifier verifier = JWT.require(algorithm)
                .withIssuer(authServerUrl + "/realms/" + realm)
                .build();
                
            DecodedJWT jwt = verifier.verify(token);
            return true;
        } catch (JWTVerificationException e) {
            return false;
        }
    }
}

Federacja tożsamości – integracja z LDAP

W większości firm użytkownicy już istnieją w Active Directory lub LDAP. Keycloak pozwala na federację – synchronizację użytkowników bez migracji.

Konfiguracja LDAP User Federation:

Vendor: Active Directory
Connection URL: ldap://your-ad-server:389
Users DN: CN=Users,DC=company,DC=com
Username LDAP attribute: sAMAccountName
Import Users: ON (importuj istniejących użytkowników)
Pro tip: Włącz „Sync Registrations” żeby nowi użytkownicy w AD automatycznie pojawiali się w Keycloak. Ustaw sync co 1 godzinę dla optymalnej wydajności.

Monitoring i troubleshooting

Keycloak oferuje szczegółowe logowanie zdarzeń:

# Włączenie debug logs dla authentication
echo 'LOGGER.org.keycloak.authentication.level=DEBUG' >> standalone/configuration/logging.properties

# Monitoring failed logins
tail -f standalone/log/server.log | grep "WARN.*authentication"

Najczęstsze problemy:
– **Invalid redirect URI** – sprawdź konfigurację Client redirectUris
– **CORS errors** – dodaj proper webOrigins w Client settings
– **Token expired** – sprawdź token lifecycle settings w Realm
– **Role mapping issues** – zweryfikuj Client Scope i Role Mappings

Czy Keycloak nadaje się do aplikacji o dużym ruchu?

Tak, Keycloak skaluje się dobrze w cluster mode. Red Hat używa Keycloak wewnętrznie dla tysięcy użytkowników. Kluczowe jest używanie zewnętrznej bazy danych (PostgreSQL) i load balancer dla wielu instancji Keycloak.

Jak Keycloak ma się do rozwiązań komercyjnych?

Keycloak oferuje 90% funkcjonalności komercyjnych rozwiązań za darmo. Brakuje mu niektórych enterprise features jak advanced risk-based authentication czy detailed audit reports, ale dla większości przypadków użycia jest wystarczający.

Czy mogę używać Keycloak z microservices?

Zdecydowanie tak! Keycloak doskonale sprawdza się jako authorization server dla architektury mikrousług. Każdy serwis może walidować JWT tokeny niezależnie bez komunikacji z Keycloak przy każdym request.

Jak długo są ważne tokeny Keycloak?

Domyślnie Access Token jest ważny 5 minut, Refresh Token 30 minut, a SSO Session 10 godzin. Możesz to skonfigurować w Realm Settings → Tokens. W production często używa się krótszych czasów dla większego bezpieczeństwa.

Czy Keycloak może zastąpić Firebase Auth?

Tak, Keycloak oferuje podobną funkcjonalność co Firebase Auth plus znacznie więcej – social login, LDAP federation, SAML, complex role management. Główna różnica to self-hosting vs managed service – Keycloak wymaga własnej infrastruktury.

Jak backup i disaster recovery dla Keycloak?

Backup polega na eksporcie realm configuration (JSON) i backup bazy danych. Dla disaster recovery ustaw cluster Keycloak w różnych data centers z shared database. Red Hat zaleca minimum 2 instancje dla production.

Czy Keycloak wspiera dwuskładnikowe uwierzytelnianie (2FA)?

Tak, Keycloak ma wbudowane wsparcie dla OTP (One-Time Password) przez aplikacje jak Google Authenticator oraz SMS OTP. Możesz wymusić 2FA dla konkretnych użytkowników lub grup.

Przydatne zasoby:

🚀 Zadanie dla Ciebie

Stwórz kompletną implementację SSO używając Keycloak:

  1. Uruchom Keycloak server lokalnie
  2. Stwórz realm „company” z dwoma clients: „web-app” (confidential) i „mobile-app” (public)
  3. Zbuduj prostą aplikację Spring Boot która używa Keycloak do autoryzacji
  4. Dodaj użytkownika z rolą „USER” i „ADMIN”
  5. Stwórz frontend w Angular który korzysta z tego samego realm
  6. Przetestuj SSO – zaloguj się w aplikacji Spring Boot i sprawdź czy Angular automatycznie cię rozpoznaje

Bonus: Skonfiguruj Google Social Login jako Identity Provider!

Zostaw komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Przewijanie do góry