Skip to main content

Konfigurace mod_auth_openidc

Modul pro Apache webserver který nám umožní zabezpečit stránky či server který proháníme skrz proxy pomocí OIDC kompatibilní brány jako je třeba Entra ID, Keycloak, Authelia, Okta apod..

Instalace

ℹ️ Tento postup je aplikovatelný pro Debian Linux

  • Nainstalovat balíčky:

    apt -yq update
    apt -yq install apache2 libapache2-mod-auth-openidc certbot python3-certbot-apache
    
  • Aktivovat SSL modul (budeme potřebovat HTTPS)

    a2enmod ssl
    
  • Vytvořit si konfiguraci pro přesměrování HTTP na HTTPS viz stránku na WiKi

  • Zažádat si o HTTPS certifikát:

    certbot certonly --apache --non-interactive --no-redirect --agree-tos -m <MAIL_SPRAVCE> -d <FQDN_SERVERU>
    
  • Vytvořit konfiguraci např. 001-EntraID-login.conf, kde nastavíme

    • <SERVER_FQDN> => Veřejná adresa serveru (jako wiki.cvut.it).
    • ServerAdmin => Kontaktní email administrátora serveru.
    • OIDCProviderMetadataURL => Do adresy stačí doplnit ID tenantu (<TENANT_ID>).

      💡 V EntraID lze tohle najít v Overview > Endpoints u aplikace.

    • OIDCRedirectURI => Tady nastavit libovolnou URI na webserveru. Ta později bude zkopírována do Entry.
    • OIDCClientID => Zde vyplnit AppID aplikace

      💡 V EntraID lze tohle najít v Overview > Application (client) ID

    • OIDCClientSecret => Vyplnit aplikační heslo (secret) vytvořený v Certificates & secrets.
    • OIDCCryptoPassphrase => Vygenerovat si zde náhodný string, třeba M4T7CPFqdCUg20qLJYHlDm.
    • OIDCScope => Tady není potřeba nic měnit, pokud chceme mít přístupný i refresh_token je potřeba mít offline_access scope.
    LoadModule auth_openidc_module modules/mod_auth_openidc.so
    
    <VirtualHost *:443>
    
          ### Base settings
          ServerAdmin webmaster@localhost
          DocumentRoot /var/www/html
    
          ## SSL
          ServerName <SERVER_FQDN>
          SSLCertificateFile /etc/letsencrypt/live/<SERVER_FQDN>/fullchain.pem
          SSLCertificateKeyFile /etc/letsencrypt/live/<SERVER_FQDN>/privkey.pem
          Include /etc/letsencrypt/options-ssl-apache.conf
    
          ## Log
          # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
          # error, crit, alert, emerg.
          # It is also possible to configure the loglevel for particular
          # modules, e.g.
          #LogLevel info ssl:warn
          ErrorLog ${APACHE_LOG_DIR}/error.log
          CustomLog ${APACHE_LOG_DIR}/access.log combined
    
          ### EntraID Login
          # https://github.com/OpenIDC/mod_auth_openidc/wiki/Single-Page-Applications#refresh-access-token-ahead-of-expiry
          OIDCInfoHook iat id_token access_token access_token_expires refresh_token exp timeout remote_user
    
          OIDCProviderMetadataURL https://login.microsoftonline.com/<TENANT_ID>/v2.0/.well-known/openid-configuration
          OIDCRedirectURI https://<SERVER_FQDN>/login/entra
    
          OIDCClientID [app_id]
          OIDCClientSecret [app_password]
          OIDCCryptoPassphrase [some_custom_passphrase]
    
          OIDCScope "openid profile offline_access"
          OIDCRemoteUserClaim email
    
          ### Location settings
          # allow .htaccess
          <Directory /var/www>
            AllowOverride All
          </Directory>
    
          ### Location settings
          <Location />
            SSLRequireSSL
            SSLOptions +StdEnvVars
    
            Options Indexes Includes FollowSymLinks
            AllowOverride AuthConfig Limit
            Order allow,deny
            Allow from all
          </Location>
    
          <LocationMatch (/info|/login/entra)>
            AuthType openid-connect
            Require valid-user
          </LocationMatch>
    
          # to limit access to groups
          #<Location /secure>
          #  Require claim groups:<ENTRA_ID_GROUP>
          #</Location>
    
          # to limit access to users
          #<Location /secure>
          #  <RequireAny>
          #        Require claim upn:stepatch@cvut.it
          #        Require claim upn:bali@cvut.it
          #  </RequireAny>
          #</Location>
    </VirtualHost>
    

💡 Apache Require => https://httpd.apache.org/docs/2.4/howto/access.html

Entra ID

🗒️ Oficiální návod je k dispozici ZDE

Jak nastavíme přihlášení pomocí vlastní Entra ID ?

  • EntraID
    • Vytvořit App registration.

    • Authentication => [ + Add a platform ] => Web => Nastavit Redirect URI na https://<SERVER_FQDN>/login/entra

      ℹ️ Redirect URI lze nastavit libovolně, jen je nutné v konfiguraci Apache mít to stejné.

    • Certificates & secrets

      • [ + New client secret ] => < Pojmenovat si klíč a nastavit platnost (volil bych nejdelší - 24 měsíců) > => [Add]. Zkopírovat HODNOTU (Value), nikoliv Secret ID a uložit si jej někam (v konfiguraci apache je bude nutné zadat)
    • API permissions

      • [ + Add a permission ] => Microsoft Graph => Delegated permissions => Zde vyplnit stejné scopes jaké požadujeme v apache konfiguraci, zpravidla openid profile offline_access.
    • Token configuration

      • [ + Add optional claim ] => ID => ÙPN (An identifier for the user that can be used with the username_hint parameter; ...)

      💡 Pro čtení skupin je potřeba přidat ještě claim groups pomocí [ + Add groups claim ]
      Zde bych doporučil jen Security groups případně Groups assigned to the application jestli je web řízen na základě skupin.

.htaccess soubory

Pomocí těchto souborů lze kromě oprávnění i nastavovat tzv. rewrite pravidla. Těmito pravidly si lze udělat jednoduché zkratky pro logout nebo info endpoint na serveru:

RewriteEngine on
RewriteRule ^info "/login/entra?info=json" [R]
RewriteRule ^logout "/login/entra?logout=https://wiki.cvut.it" [R]