Huvudsättet att få en administrativ session eller resurslösare i AEM var att använda SlingRepository.loginAdministrative()
och ResourceResolverFactory.getAdministrativeResourceResolver()
metoder från Sling.
Ingen av dessa metoder har dock utformats runt princip om minst privilegium och gör det för enkelt för en utvecklare att inte planera för en lämplig struktur och motsvarande åtkomstkontrollnivåer (ACL) för sitt innehåll tidigt. Om det finns en säkerhetslucka i en sådan tjänst leder det ofta till eskalering av behörigheter till admin
-användare, även om själva koden inte behöver administratörsbehörighet för att fungera.
Det kan finnas fall där adminsessionen inte används eller där funktionen är helt inaktiverad. Om så är fallet med implementeringen, se till att du tar bort funktionen helt eller passar in den med NOP-kod.
När det är möjligt kan du ändra funktionen så att den angivna autentiserade begärandesessionen kan användas för att läsa eller skriva innehåll. Om detta inte är möjligt kan det ofta uppnås genom att man tillämpar de prioriteringar som anges nedan.
Många problem kan lösas genom att innehållet struktureras om. Tänk på följande enkla regler när du omstrukturerar:
Ändra åtkomstkontroll
Förfina innehållsstruktur
Reaktera koden så att den fungerar som den ska
Se även till att alla nya funktioner du utvecklar följer dessa principer:
Säkerhetskrav bör leda till innehållsstrukturen
Använd nodtyper
Respektera sekretessinställningar
/profile
nod.Vare sig du tillämpar åtkomstkontroll vid innehållsomstrukturering eller när du gör det för en ny användare måste du tillämpa striktaste åtkomstkontrollistor. Använd alla möjliga hjälpmedel för åtkomstkontroll:
I stället för att använda jcr:read
på /apps
, använd det bara på /apps/*/components/*/analytics
Använd begränsningar
Använd åtkomstkontrollistor för nodtyper
Begränsa behörigheter
jcr:write
behörighet, använda jcr:modifyProperties
i ställetOm ovanstående misslyckas erbjuder Sling 7 en tjänst för Mappning av tjänstanvändare, som gör det möjligt att konfigurera en mappning från paket till användare och två motsvarande API-metoder:
Metoderna returnerar en session-/resurslösare med endast behörighet för en konfigurerad användare. Dessa metoder har följande egenskaper:
De tillåter att användare mappar tjänster
De gör det möjligt att definiera undertjänstanvändare
Den centrala konfigurationspunkten är: org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl
service-id
= service-name
[":" subservice-namn]
service-id
mappas till en resurslösare och/eller JCR-databasens användar-ID för autentisering
service-name
är det symboliska namnet på det paket som tillhandahåller tjänsten
En tjänstanvändare är en JCR-användare utan lösenord och med en minimiuppsättning behörigheter som krävs för att utföra en viss uppgift. Om du inte anger något lösenord går det inte att logga in med en tjänstanvändare.
Ett sätt att ersätta en administrativ session är att ersätta den med tjänstanvändarsessioner. Den kan också ersättas av flera undertjänstanvändare vid behov.
Om du vill ersätta administratörssessionen med en tjänstanvändare utför du följande steg:
Identifiera de behörigheter som krävs för tjänsten, med tanke på principen om minsta behörighet.
Kontrollera om det redan finns en användare med exakt den behörighetsinställning du behöver. Skapa en systemtjänstanvändare om ingen befintlig användare matchar dina behov. RTC krävs för att skapa en tjänstanvändare. Ibland kan det vara bra att skapa flera undertjänstanvändare (t.ex. en för att skriva och en för att läsa) för att dela upp åtkomsten ännu mer.
Konfigurera och testa ACE:n för din användare.
Lägg till en service-user
mappning för din tjänst och för user/sub-users
Gör tjänsteanvändarens säljfunktion tillgänglig för ditt paket: uppdatera till den senaste versionen av org.apache.sling.api
.
Ersätt admin-session
i koden med loginService
eller getServiceResourceResolver
API.
När du har verifierat att ingen användare i listan över AEM användare kan användas för ditt användningsfall och att motsvarande RTC-problem har godkänts, kan du lägga till den nya användaren i standardinnehållet.
Rekommenderad metod är att skapa en tjänstanvändare som ska använda databasutforskaren på https://<server>:<port>/crx/explorer/index.jsp
Målet är att få en giltig jcr:uuid
-egenskap som är obligatorisk för att skapa användaren via en installation av innehållspaket.
Du kan skapa tjänstanvändare genom att:
Gå till databasutforskaren på https://<server>:<port>/crx/explorer/index.jsp
Logga in som administratör genom att trycka på Logga in i skärmens övre vänstra hörn.
Skapa och namnge sedan systemanvändaren. Om du vill skapa användaren som ett system anger du den mellanliggande sökvägen som system
och lägg till valfria undermappar efter behov:
Kontrollera att din systemanvändarnod ser ut så här:
Det finns inga blandningstyper som är associerade med tjänstanvändare. Det innebär att det inte finns några åtkomstkontrollprinciper för systemanvändare.
När du lägger till motsvarande .content.xml i innehållet i ditt paket måste du se till att du har ställt in rep:authorizableId
och att den primära typen är rep:SystemUser
. Det borde se ut så här:
<?xml version="1.0" encoding="UTF-8"?>
<jcr:root xmlns:jcr="https://www.jcp.org/jcr/1.0" xmlns:rep="internal"
jcr:primaryType="rep:SystemUser"
jcr:uuid="4917dd68-a0c1-3021-b5b7-435d0044b0dd"
rep:principalName="authentication-service"
rep:authorizableId="authentication-service"/>
Om du vill lägga till en mappning från tjänsten till motsvarande systemanvändare skapar du en fabrikskonfiguration för ServiceUserMapper
service. För att behålla denna modulära konfiguration kan sådan konfiguration tillhandahållas med Ändringsmekanism för Sling. Det rekommenderade sättet att installera sådana konfigurationer med ditt paket är att använda Inläsning av första innehåll vid försäljning:
Skapa en undermapp SLING-INF/innehåll under mappen src/main/resources i paketet
I den här mappen skapar du en fil med namnet org.apache.sling.servicusermapping.impl.ServiceUserMapperImpl.changed-<some unique="" name="" for="" your="" factory="" configuration="">.xml med innehållet i din fabrikskonfiguration (inklusive alla användarmappningar för undertjänster). Exempel:
Skapa en SLING-INF/content
mappen nedanför src/main/resources
mapp i ditt paket;
Skapa en fil i den här mappen named org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended-<a unique name for your factory configuration>.xml
med innehållet i fabrikskonfigurationen, inklusive alla användarmappningar för undertjänster.
I illustrationssyfte tar du filen med namnet org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended-com.adobe.granite.auth.saml.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<node>
<primaryNodeType>sling:OsgiConfig</primaryNodeType>
<property>
<name>user.default</name>
<value></value>
</property>
<property>
<name>user.mapping</name>
<values>
<value>com.adobe.granite.auth.saml=authentication-service</value>
</values>
</property>
</node>
Referera det inledande Sling-innehållet i konfigurationen av maven-bundle-plugin
i pom.xml
av ditt paket. Exempel:
<Sling-Initial-Content>
SLING-INF/content;path:=/libs/system/config;overwrite:=true;
</Sling-Initial-Content>
Installera paketet och kontrollera att fabrikskonfigurationen är installerad. Du kan göra detta genom att:
Samtal till loginAdministrative()
visas ofta tillsammans med delade sessioner. Dessa sessioner hämtas vid aktivering av tjänsten och loggas bara ut när tjänsten har stoppats. Även om detta är vanligt leder det till två problem:
Den mest uppenbara lösningen för säkerhetsrisken är att helt enkelt ersätta loginAdministrative()
ring med loginService()
en till en användare med begränsad behörighet. Detta påverkar dock inte eventuella prestandaförsämringar. En möjlighet att begränsa detta är att kapsla in all begärd information i ett objekt som inte har någon koppling till sessionen. Skapa sedan (eller förstör) sessionen på begäran.
Rekommenderad metod är att ändra funktionens API för att ge anroparen kontroll över skapandet/destruktionen av sessionen.
JSP:er kan inte använda loginService()
, eftersom det inte finns någon associerad tjänst. Administrativa sessioner i JSP:er är dock vanligtvis ett tecken på överträdelse av MVC-paradigmen.
Detta kan åtgärdas på två sätt:
Den första metoden är den önskade.
När händelser eller jobb bearbetas, och ibland arbetsflöden, går motsvarande session som utlöste händelsen förlorad. Detta leder till händelsehanterare och jobbbehandlare som ofta använder administrativa sessioner för att utföra sitt arbete. Det finns olika möjliga strategier för att lösa detta problem, vart och ett med sina för- och nackdelar:
Skicka user-id
i händelsens nyttolast och använd personifiering.
Fördelar: Lätt att använda.
Nackdelar: Använder fortfarande loginAdministrative()
. Den autentiserar en begäran som redan har autentiserats.
Skapa eller återanvänd en tjänstanvändare som har åtkomst till data.
Fördelar: Enhetlig med den aktuella designen. Behöver minimala förändringar.
Nackdelar: Behöver kraftfulla tjänstanvändare vara flexibla, vilket enkelt kan leda till eskalering av behörigheter. Omvandlar säkerhetsmodellen.
Skicka en serialisering av Subject
i händelsens nyttolast och skapa en ResourceResolver
baserat på det motivet. Ett exempel är JAAS doAsPrivileged
i ResourceResolverFactory
.
Fördelar: Ren implementering ur säkerhetssynpunkt. Det undviker återautentisering och fungerar med de ursprungliga behörigheterna. Kod som är relevant för säkerheten är transparent för händelsens konsument.
Nackdelar: behöver omfaktorisering. Det faktum att den säkerhetsrelaterade koden som är genomskinlig för händelsekonsumenten också kan leda till problem.
Den tredje metoden är att föredra framför behandlingsteknik.
I implementeringar av arbetsflödesprocesser förloras motsvarande användarsession som utlöste arbetsflödet. Detta leder till arbetsflödesprocesser som ofta använder administrativa sessioner för att utföra sitt arbete.
För att åtgärda dessa problem rekommenderar vi att samma metoder som anges i Bearbetningshändelser, replikeringsförprocessorer och jobb användas.
Det finns några administrativa sessioner som används för att skicka POST-processorimplementeringar. Vanligtvis används administrativa sessioner för att komma åt noder som väntar på att tas bort inom den POST som bearbetas. De är därför inte längre tillgängliga via begärandesessionen. En nod som väntar på att tas bort kan nås för att visa metadata som annars inte ska vara tillgängliga.