onsdag 22 augusti 2018

ERROR NT AUTHORITY\ANONYMOUS LOGON när du autentiserar mot SQL server

Något som jag ser ofta hos kunder är detta problem som har med autentisering att göra när man missat att konfigurera kerberos och trusted for delegation i sin miljö. Tänker varje gång att jag skall dokumentera ner det och nu gör jag slag i saken.

Lite bakgrund
När du sätter upp en SQL miljö och använder en vanlig domänanvändare som service konto så måste man skapa SPN-s manuellt för att kunna använda kerberos autentisering, om inte så är det NTML. (En annan fråga är ju om man skall använda domänkonton som servicekonto numera men det är vanligt att man gör då det tidigare varit rekommenderat.) Använder man sedan andra SQL produkter som Reporting services, Analysis services och kör dessa på egna servrar, vilket man bör göra om det skall vara bets practices, så kommer du troligtvis få autentiserings problem.

Exempel
Låt oss säga att en klient kör Explorer mot en rapport på en Reporting services server som i sin tur har en datasource som autentisera sig mot en SQL server med windows autentisering (”As the user viewing the report” heter det i rapport konfigureringen) där databasen ligger. Du har nu en autentiserings kedja eller en så kallad dubbel hopp. Detta är inte möjligt att göra med vanlig NTML utan det måste vara kerberos.
















Konfigurering
Så hur skall detta konfigureras för att fungera? Först av allt så skall SPN sättas på respektive servicekonto för både SQL servern och Reporting services servern. I mitt fall så har jag två servrar, SQLServer och SQLRSServer med respektive servicekonto SQLService, SQLRSservice. Domainname och domain är domänen som servrarna ligger i.
Följande SPN-er skall då sättas:

SETSPN -s MSSQLSvc/SQLServer.domainname.com:1433 domain\SQLService
SETSPN -s MSSQLSvc/SQLServer.domainname.com domain\SQLService
SETSPN -s http/SQLRSServer.domain.com domain\SQLRSService

Nu är tjänsterna ok för att använda kerberos autentisering. Starta om och verifiera anslutningarna med tex denna query i SQL:

select c.auth_scheme, c.client_net_address, s.program_name from sys.dm_exec_connections c
inner join sys.dm_exec_sessions s
on c.session_id = s.session_id
where c.session_id >50

Men vi måste också konfigurera så Rapportservern kan skicka autentiserings frågan vidare till SQL servern från klienten. Detta görs med det som heter ”trusted for delegation” i Active Directory verktyget. På kontot för Reporting services väljer man enklast “Trust this user to any service”. Eller om man är en säkerhetsnörd så kan man peka ut exakt vilken service som skall får autentisera sig via kontot. Bläddra upp de tidigare SPN registreringarna på kontot för SQL och lägg till dessa. Se den nedre bilden.

















































Mer information från Microsoft kring hur du gör detta för Reporting services. Det är ytterligare justering i configurationsfilen för reporting som måste ändras. Dock nämns inget om trusted for delegation vilket är konstigt.
https://docs.microsoft.com/en-us/sql/reporting-services/report-server/register-a-service-principal-name-spn-for-a-report-server?view=sql-server-2017

Inga kommentarer:

Skicka en kommentar