Koppla Apache mot Microsoft Azure AD med mod_openidc

På samma sätt som du med en htpasswd/basic auth-lösning kan skydda en webbplats går det även att autentisera användarna mot Microsoft Azure Active Directory. Hela säkerhetslagret implementeras i Apache och behöver alltså inget stöd i webbapplikationen. Typiska användningsområden är gamla osäkra webbappar som behöver extra skydd mot Internet, eller ett Intranät där användaren automatiskt loggas in.

Microsoft har två varianter av Active Directory som man kan autentisera mot. Båda varianterna stödjer protokollet Open Id som modulen openidc använder sig av, men har helt olika användsningsområden:

Microsoft Azure Hosted Active Directory Det här är AD-tjänsten i Azure som man använder som sin vanliga användarhantering om man valt att lägga sin Windows-miljö i Azure. Det är den här typen av AD-tjänst som jag kommer använda som exempel i artikeln.

Microsoft Live AD Det här är ett AD som innehåller hotmail.com, live.com, outlook.com eller vad Microsoft kallar sina ”gratis”-konton för. Det fungerar att autentisera mot den här tjänsten också, men användningsområdet blir annorlunda då det är svårare att styra vem som får logga in eftersom det inte går att ha några AD-grupper här.

När du har ett AD följder du guiden nedan:

Steg 1 – Bestäm domännamn och callback-URL

Jag kommer använda domänen https://openid-app.cloudnet.cloud, med callbackurl https://openid-app.cloudnet.cloud/openid-start-session

Steg 2 – Installera Apache-modulen

På din Ubuntu-server kör du följande kommando för att installera modulen apt-get -y install libapache2-mod-auth-openidc

Aktivera med a2enmod auth_openidc
service apache2 restart

Steg 3 – Ta reda på ditt Active Directory ID

När du är inloggad i Azure-portalen:

  • Välj Azure Active Directory
  • Välj Properties
  • Leta efter Active Directory ID
    Mitt id är e98c0afb-9b00-47a5-b843-2a3e1a36e085. Spara det, du kommer behöva det snart.

Steg 4 – Registrera en app i ditt Azure AD

I Azure-portalen:

  • Välj Azure Active Directory
  • Välj App registrations
  • Välj New application registration
  • Application Type: Web app / API
  • Sign-on URL: Ange din URL. Jag använder https://openid-app.cloudnet.cloud
  • Klicka Create
  • Spara ditt Application ID, det kommer du behöva snart.
    Mitt Appliocation ID är d2e491bc-fa4f-456f-918a-4b14b004e45e
  • Klicka på Settings
  • Klicka på Reply URLs
  • Ändra så att Reply URL är din callback-URL. Jag använder https://openid-app.cloudnet.cloud/openid-start-session
  • Spara ändringen
  • Klicka på Properties
  • Spara App ID URI, du kommer behöva den snart.
    Mitt App ID URI är https://anders1arbast.onmicrosoft.com/8a7bfb34-6e8b-9b9a-9a75-9d4850c07ccd
  • Klicka på Keys
  • Lägg till en nyckel, välj ”Never expires”
  • Spara, Nu ser du lösenordet. Spara det, du behöver det snart. Mitt lösenord är iaaiaalwj2h3HrhYoIp0bHXazGsRIoWEy7+FY/Ys1dY=
  • Gå tillbaka till din nyregistrerade app i AD:t
  • Klicka på Manifest
  • Ändra raden med groupMembershipClaims så den ser ut så här"groupMembershipClaims": "All",Ändringen gör att Azure inkluderar en lista i svaret med vilka grupper användarkontot är medlem i.
  • Klicka Save

Steg 5 – Konfigurera din vhost i Apache

Anpassa inställningarna så de passar din miljö. Följande inställningar är extra viktiga:

OIDCRedirectURI
URL du valde som endpoint tidigare.

OIDCProviderMetadataURL
Den här URL:en måste du konstruera själv med följande komponenter:
https://login.microsoftonline.com/{AD-domännamn}/.well-known/openid-configuration
AD-domännamnet hittar du din App ID URI, i mitt fall https://anders1arbast.onmicrosoft.com/8a7bfb34-6e8b-9b9a-9a75-9d4850c07ccd, då är mitt AD-domännamn anders1arbast.onmicrosoft.com,

OIDCProviderIssuer
Skapas från ditt Active Directory ID, enligt följande mönster:
https://sts.windows.net/{Active Directory ID}/

OIDCClientID
Ditt Application ID som du fick när du registrerade appen.

OIDCClientSecret
Lösenordet som genererades när du registrerade appen.

<virtualhost *:443> 
  ServerName openid-app.cloudnet.cloud
  DocumentRoot /mnt/persist/www/docroot
  SSLEngine on
  SSLCertificateFile /etc/ssl/cloudnet/cert.crt 
  SSLCertificateKeyFile /etc/ssl/cloudnet/cert.key
  SSLCertificateChainFile /etc/ssl/cloudnet/intermediate.ca
  # The URL you have selected as endpoint
  OIDCRedirectURI https://openid-app.cloudnet.cloud/openid-start-session
  # OIDCCryptoPassphrase can be anything 
  OIDCCryptoPassphrase zZZzzZZZaaaa
  # To work with Azure AD
  OIDCResponseType id_token OIDCResponseMode form_post
  # Azure AD connection
  OIDCProviderMetadataURL https://login.microsoftonline.com/anders1arbast.onmicrosoft.com/.well-known/openid-configuration
  OIDCProviderIssuer https://sts.windows.net/e98c0afb-9b00-47a5-b843-2a3e1a36e085/

  # Azure AD app info
  OIDCClientID d2e491bc-fa4f-456f-918a-4b14b004e45e
  OIDCClientSecret "iaaiaalwj2h3HrhYoIp0bHXazGsRIoWEy7+FY/Ys1dY="

  <location "/"> 
    AuthType openid-connect
    Require valid-user
  </location>
</virtualhost> 

Glöm inte starta om apache för att konfigurationen ska börja gälla:

service apache2 restart

Steg 6 – Testa

Öppna webbläsaren och testa så du blir omdirigerad till Microsoft inloggning när du går till din skyddade site.

Överkurs – Kräv att användaren måste vara med i en grupp

Skapa en grupp i ditt active directory. Ta reda på vad gruppen har för ID. Ändra redan Require-direktivet i Localtion-taggen enligt nedan.

Min grupp har ID d49421a2-e1f9-4f7c-a9fc-df52fa85060b

  <location "/">
    AuthType openid-connect
    Require claim "groups~d49421a2-e1f9-4f7c-a9fc-df52fa85060b"
  </location>

Felsökning

Kolla i Apaches error-log för mer information om vad som pågår.

Vid lyckad inloggning finns en del information om kontot tillgängligt som environment-variabler.