Nextcloud als OpenID-provider

Zoals het een echte nerd betaamt heb ik meer zelfgehoste websites en applicaties dan je eigenlijk nodig hebt voor een normaal en gelukkig leven. Voor elk van die websites heb je natuurlijk een gebruikersnaam en wachtwoord nodig, en dat wordt op de duur onbeheer(s)baar, zeker wanneer je ook anderen toegang wil geven.

Je wil (of ik toch) dus een centrale gebruikersdatabase, opdat iedereen maar één gebruikersnaam en wachtwoord moet onthouden. De industry standard is natuurlijk een vorm van LDAP, maar zo zot ben ik nu ook weer niet. Een andere oplossing is een vorm van OAuth2 of OpenID. En nu blijkt dat Nextcloud, mijn lokale cloud kan fungeren als zowel OAuth2 als OpenID-provider. Bovendien ondersteunt Nextcloud ook MFA, wat een extra beveiligingslaag geeft aan alle andere applicaties zonder dat die MFA moeten ondersteunen. Tijd om dat verder uit te werken!

OAuth2

Volgens de documentatie ondersteunt Nextcloud OAuth2, dus dat lijkt op het eerste zicht positief. Een korte test met de parameters uit diezelfde documentatie tonen ook dat het werkt. Maar; deze implementatie ondersteunt geen scopes, dus de client-applicatie heeft volledige toegang tot Nextcloud, inclusief alle bestanden. Dit wil je natuurlijk niet, want Evil Engelbert die jouw client hackt zou toegang kunnen hebben tot jouw Nextcloud. En dat is vanzelfsprekend niet de bedoeling.

Exit OAuth2 dus.

OpenID

De volgende uitdaging is dat Nextcloud native geen OpenID ondersteunt, en je dus moet werken met plugins. Nu ben ik van nature daar niet zo’n fan van, omdat je dan sowieso afhangt van nog een derde partij. Maar needs must en een blik op Github-repository van de OIDC Identity Provider leert dat de plugin onderhouden wordt en weinig openstaande issues heeft. Laat ons hem eens uittesten.

Uiteindelijke set-up

De installatie is zonder zorgen of problemen. Alle instellingen staan op het tabblad Beveiliging (je moet beheerder zijn om dit te zien).

Configuratie Wordpress

Wordpress heeft van z’n eigen geen ondersteuning voor OpenID (of OAuth2), maar met een plugin, OAuth Single Sign On – SSO (OAuth Client) (van miniOrange) lukt het wel. De plug-in is goed onderhouden en wordt regelmatig bijgewerkt, belangrijk gezien het toch om een beveiligingssysteem gaat. Er is zowel een gratis als een betalende versie, en hoewel het natuurlijk goed is om te betalen voor een add-on die je in productie wil gebruiken (iedereen moet brood eten), werkt deze opstelling ook met de gratis versie.

Instellingen in Nextcloud

In Nextcloud moet je een client toevoegen; de naam kies je zelf maar de Omleiding URI is de URL van jouw Wordpress- website. Het type is vertrouwelijk; het algoritme mag je op RS256 laten staan.

Client toevoegen

Na het klikken op Toevoegen heb je voor Wordpress de Client identificatie en de Vertrouwelijk (niet alle vertalingen zijn even geslaagd) nodig; de Stromen mag je op Code autorisatiestroom laten staan. Eventueel kan je OpenID voor deze client beperken tot bepaalde groepen; anders is het standaard voor alle gebruikers.

Instellingen in Wordpress

Bij de instellingen van de plug-in, Add new application. Hoewel Nextcloud als applicatie ondersteund wordt, gebruiken we die niet. Deze werkt immers met OAuth, en wij gebruiken OpenID. Je hebt de Custom OpenID Connect App nodig.

Optie Waarde
App name Kies een naam voor deze koppeling, bijvoorbeeld Nextcloud.
Callback URL Moet dezelfde zijn als wat je instelde in Nextcloud. Je kan die hier niet wijzigen, dus mocht die verschillen moet je Nextcloud aanpassen.
Client ID Client identificatie uit Nextcloud.
Client Secret Vertrouwelijk uit Nextcloud.
Scopes Ik heb profile, email en groups.
Authorization Endpoint https://${nextcloud}/index.php/apps/oidc/authorize - vervang ${nextcloud} door het domein van jouw Nextcloud-instance. Deze URL is voor wanneer Pretty URL’s niet geactiveerd zijn.
Token Endpoint https://${nextcloud}/index.php/apps/oidc/token

Belangrijk is dat je op het volgende scherm Send client credentials in op Body zet, want de OIDC-app kan niet om met credentials in de header.

Het enige wat ik daarna nog verander is onder Attribute/Role mapping de Username op email zetten; maar dat is een persoonlijke keuze (beide instellingen werken).

Configuratie Mediawiki

Ook Mediawiki ondersteunt niet standaard OpenID, maar ook hier kan je dit met wat plugins fixen. Je moet er twee installeren:

Volg de instructies om beide te installeren; dit levert normaal geen problemen op.

Volg de stappen hierboven om een nieuwe client toe te voegen aan Nextcloud. Belangrijk is dat de Omleiding URI een iets andere vorm heeft:

  • https://${wiki}/wiki/Speciaal:PluggableAuthLogin (vervang ${wiki} door het domein van je wiki). Deze URL werkt wanneer je $wgArticlePath = "/wiki/$1"; gezet hebt en Apache correct geconfigureerd.

De aanpassingen in LocalSettings.php zijn hieronder weergegeven. Belangrijke gegevens om bij de hand te hebben:

  • clientID: Client identificatie uit Nextcloud.
  • clientsecret: Vertrouwelijk uit Nextcloud.
  • providerURL: dit is de URL van je Nextcloud-instance; zonder toevoegingen.
wfLoadExtension('PluggableAuth');
wfLoadExtension('OpenIDConnect');

$wgPluggableAuth_Config[] = [
    'plugin' => 'OpenIDConnect',
    'data' => [
        'providerURL' => 'https:/${nextcloud}',
        'clientID' => '',
        'clientsecret' => '',
        'preferred_username' => 'name'
    ]
];

$wgOpenIDConnect_MigrateUsersByEmail = true;

$wgGroupPermissions['*']['createaccount'] = false;
$wgGroupPermissions['*']['autocreateaccount'] = true;
$wgPluggableAuth_EnableAutoLogin = true; // Now the user doesn't have the 'login'/'logout' button.

Ik heb zelf nog een paar eigen aanpassingen gedaan voor een vlottere werking, maar dit is niet helemaal noodzakelijk.

  • preferred_username is ingesteld op de volledige naam van de gebruiker in Nextcloud.
  • $wgOpenIDConnect_MigrateUsersByEmail is true omdat de meeste van mijn wiki’s al gebruikers hebben en ik ze wil samenvoegen. Zo vermijd ik dubbele gebruikers.
  • Het zijn private wiki’s, dus je kan geen gebruikers aanmaken (createaccount), maar OpenID moet wel gebruikers kunnen aanmaken, dus autocreateaccount is wel true.
  • $wgPluggableAuth_EnableAutoLogin is true, zo ben je automatisch aangemeld.

MFA

MFA (multi-factor authentication) op Nextcloud kan je gebruiken met de Two-Factor TOTP Provider-plugin. Ten zeerste aanbevolen. Zo is meteen ook iedere gekoppelde applicatie meteen beschermd met MFA.

Conclusie

Het doel was om met één gebruikersdatabase in verschillende applicaties te kunnen aanmelden zonder daarvoor een LDAP te moeten opzetten. En dat is mogelijk met Nextcloud. Het is jammer dat het niet kan zonder plugins, maar het werkt wel en de plugins zijn stabiel en betrouwbaar. Zowel Wordpress als Mediawiki (en zeker nog andere) ondersteunen dit; dus er is alleen nog de stap van het migreren. Als bonus kan je ze nu met MFA beschermen zonder dat ze dat zelf moeten ondersteunen.