770 likes | 1.01k Views
COM+ Security. Christof Sprenger Partner Group Microsoft GmbH chrispre@microsoft.com. Agenda. Security Grundlagen Windows Security Architektur COM+ Security Architektur Do’s & Don’ts. Abschnitt 1. Security Grundlagen. „Definition“. Security ist:
E N D
COM+ Security Christof Sprenger Partner Group Microsoft GmbH chrispre@microsoft.com
Agenda • Security Grundlagen • Windows Security Architektur • COM+ Security Architektur • Do’s & Don’ts
Abschnitt 1 Security Grundlagen
„Definition“ • Security ist: „Definieren und Durchsetzen von Grenzen des Vertrauens “ (defining and enforcing boundaries of trust)
„Definition“ • Kurze Definition von Security: • wer (identity Authentifizierung) • tut was (Zweck/Absicht) • mit wem oder was (Privilege Authorisation)
Security Grundlagen: Begriffe • „Principal“ Eine Identität (Sie oder Ihr PC) • „Credentials“ Daten um Identität zu beweisen • „Trust“ Den Credentials vertrauten • „Authority“ Der, der für Principals bürgt • „Privilege“ Das Recht etwas zu tun
Abschnitt 2 Windows Security Architektur
Windows Security Architektur • Authentifizierung • Access Token • Security Identifier • Logon Session • Authorisation • Privileges / User Rights • Access Control List (ACL) • Security Descriptors (SD)
Authentifizierung 1/2 • Die Frage ist: “Wer bist du?” • „Credentials“ werden beim Logon überprüft • Credentials sind: User/Password oder Smartcard • Erfolgreiches Logon erzeugt ein • eine Logon Session und • ein Access-Token • Access Token dient als Zutrittsausweis
Create process With access token CTRL-ALT-DEL Check Credentials(USER/PASS) Validate user Add group info Run Shell (explorer.exe) Create Access token Authentifizierung 2/2 Logging on... Win32 Subsystem (system) Logon Process(winlogon.exe) Security Subsystem (LSA)(lsass.exe) Authentication package Security Account Manager DB(SAM)
Access Token Bestandteile • User SID • Group SIDs • Privileges • Default für neue Objekte (z.B. Dateien, Pipes, Shared Memory ....) • Logon Session ID • ...
Logon-Sessions • 5 Arten von logon-session • SYSTEM • Enthält alle Prozesse, die Teil des OS sind • INTERACTIVE • Für den interaktiv angemeldeten Benutzer • NETWORK • Entsteht durch authentifizierten Zugriff auf den Rechner über das Netzwerk • SERVICE • Für NT Dienste, die mit einem bestimmten Benutzerkonto konfiguriert wurden • BATCH • Für Prozesse die durch die COM Runtime getartet wurden
Bob‘s network logon session Bob‘s Service logon session Alice‘s network logon session Alice‘s network logon session Teds‘s network logon session Logon Sessions Beispiel JoesMachine AlicesMachine Alice‘s interactive logon session TedsMachine Teds‘s interactive logon session
Impersonation • Ein (Server-)Prozess verrichtet oft Arbeit für verschiedene Benutzer • Daher kann jedem Thread eine eigenes Access Token zugeordnet werden • Es gibt also zwei Arten von Access Token • Primary Token (für Prozesse) • Impersonation Token (für Threads)
client.exe Alice Bob client.exe Bob Impersonation im Bild server.exe Joe Alice
Authorization • Frage ist: “Was darfst du tun?” • Auch: Access Check oder Access Control • Wird bestimmt durch: • Art des gewünschten Zugriffs • Access-Token (des aktuellen Threads) • Access Control List (ACL) aus dem Security Descriptor des Objekts
Access Control Lists DACL ACE Everyone Read ACE „chrispre“Full Control ACE SYSTEM Full Control Administrators Full Control ACE
Security Descriptor • Owner SID • Group SID (POSIX) • SACL • DACL • Permitted users • Permissions
Check! Access? SomeObject Process/ThreadOpenSomeObject() SRM(Security-Reference-Monitor) Security-Descriptor Access-Token SD DACL Token User SID„chrispre” Group SIDs Privileges DACL ACE„chrispre“: Full Authorisation im Bild OK!
Netzwerk Authentifizierung • Wie entsteht auf einem entfernten Rechner eine Logon Session, die den Benutzer repräsentiert, der über das Netzwerk zugreift? • Das Kennwort darf nicht einfach über das Netzwerk versendet werden • Die Bits und Bytes, die das Access Token bilden dürfen ebenfalls nicht versendet werden
4. 5. 1. Negotiate 2. Challenge 3. Response NTLM mit Local Accounts Client Server lsass.exe client.exe server.exe
0. NTLM mit Domain Accounts Authority 5. 6. Client Server lsass.exe 4. 7. 1-3 client.exe server.exe
NTLM über Domänengrenzen Domain A Domain B Authority A Authority B Client Server lsass.exe client.exe server.exe
Kerberos Authority 1. 2. Server Client 3.
Abschnitt 3 COM(+) und Security
COM Security Konzepte • Authentifizierung: Wer ist der Client? • RPC und damit COM erlaubt dem Client den Grad der Authentifizierung einzustellen • Access Control: Darf dieser Client dies tun? • Programmatisch vs. Deklarativ • Identity: Welche Identity nimmt der Client an? Mit welcher Identity läuft der Server? • COM erlaubt es dem Client eine Identity auszuwählen • COM startet die Server automatisch und erlaubt es die Identity des Servers auszuwählen
Abschnitt 3.1 Authentifizerung
Auswahl des SSP in COM • Jeder Server-Prozess registriert Security Support Provider (SSP) mit Hilfe von CoInitializeSecurity • Runtime sorgt dafür, daß Proxies automatisch den passenden SSP verwenden • COM ruft CoInitializeSecurity implizit auf falls “vergessen” • Beim ersten Marshal oder Unmarshal • Wählt default SSPs des Rechners • Defaultwerte sagen: Security ist an
CoInitializeSecurity HRESULT CoInitializeSecurity( SECURITY_DESCRIPTOR* pSD, DWORD cAuthSvc, SOLE_AUTHENTICATION_SERVICE* prgAuthSvc, void* pvReserved1, DWORD dwAuthnLevel, DWORD dwImpLevel, void* pvReserved2, DWORD dwCapabilities, void* pvReserved3 );
Authentication Level • Mit CoInitializeSecurity wird ein „Authentication Level“ gewählt • Dies legt fest wann und/oder wie oft Authentifiziert wird und ob die Daten verschlüsselt werden
Authentication Level • Für den Server ist dies die „low watermark“ für eingehende Aufrufe • Unterhalb dieses Levels werden Aufrufe abgelehnt • Alle exportierten Interface Pointer bekommen diese „low watermark“ als Hinweis mit • COM Runtime wählt dann den höchsten von • „low watermark“ des Servers • Level der bei Aufruf von CoInitializeSecurity im Client angegeben wurde
Proxy und Security • CoInitializeSecurity legt nur den „default authentication level“ für jeden Proxy fest • Die Einstellungen können dann für jeden Proxy angepasst werden. • Dies geht bei dem Standard-Proxy über IClientSecurity • IClientSecurity wird vom „proxy manager“ implementiert
ProxyManager IClientSecurity IFoo Object IFoo Proxy IBaz IBaz Proxy Proxy & Stubs (Interceptors) Client Server Stub Stub
IClientSecurity interface IClientSecurity : Iunknown { HRESULT QueryBlanket( IUnknown* pProxy, DWORD* pAuthnSvc,DWORD* pAuthzSvc, OLECHAR** pServerPrincName, DWORD* pAuthnLevel, DWORD* pImpLevel, void** ppAuthInfo, DWORD* pdwCapabilites ); HRESULT SetBlanket( IUnknown* pProxy, DWORD AuthnSvc,DWORD AuthzSvc, OLECHAR* pServerPrincName, DWORD AuthnLevel, DWORD ImpLevel, void* pAuthInfo, DWORD dwCapabilities ); HRESULT CopyProxy( IUnknown* pProxy, IUnknown** ppCopy ); }
Anpassen des Authn Level HRESULT MakePrivateCall( IBank* pib ) { IClientSecurity* pics = 0; pib->QueryInterface( IID_IClientSecurity,(void**)&pics ); DWORD nAuthnSvc, nImpLevel; pics->QueryBlanket( pib, &nAuthnSvc, 0, 0, 0, &nImpLevel, 0, 0 ); pics->SetBlanket( pib, nAuthnSvc, 0, 0, RPC_C_AUTHN_LEVEL_PKT_PRIVACY, nImpLevel, 0, 0 ); pics->Release(); pib->SetCreditCardInfo( g_pszCardNum); pib->Release(); }
Authn Level bei Aktivierung • In COM gibt es einige Aufrufe zur Aktivierung von COM Objekten • CoCreateInstance(Ex) • CoGetClassObject • CoGetInstanceFromFile • Der Default Authn Level wird durch CoInitializeSecurity bestimmt • Wie kann der Client den Authn Level festlegen? (Es gibt noch kein IClientSecurity) • Hierzu dient COSERVERINFO und COAUTHINFO
COAUTHINFO struct COSERVERINFO { DWORD dwReserved1; // mbz WCHAR* pszHostName; COAUTHINFO* pAuthInfo; DWORD dwReserved2; // mbz }; struct COAUTHINFO { DWORD dwAuthnSvc; DWORD dwAuthzSvc; WCHAR* pszServerPrincipalName; DWORD dwAuthnLevel; DWORD dwImpLevel; COAUTHIDENTITY* pAuthIdentityData; DWORD dwCapabilities; };
„Normales“ Vorgehen • Server setzt die „low watermark“ auf CONNECT or NONE (Effizienz) • Ein Servers, der den Client identifizieren muss, setzt mindestens CONNECT • Z.B. muss ein Server, der nur bestimmte Clients zulässt diese auch unterscheiden können • Server, die anonymen Zugriff erlauben müssen NONE verwenden. • Clients setzen den Authn Level für bestimmte Operationen rauf.
Überprüfen des Authn Level • Ein Server fordert manchmal einen höheren Authentication Level als sonst • Z.B. um eine PIN oder Kreditkartennummer zu übetragen • Clients können den Level erhöhen • Server können dies dann überprüfen • IServerSecurity bietet die Möglichkeit den Kontext des Aufrufs nach dem Authn Level zu fragen • Hierzu ist auch CoGetCallContext nötig
IServerSecurity HRESULT CoGetCallContext( REFIID iid, void** ppv ); interface IServerSecurity : IUnknown { HRESULT QueryBlanket( DWORD* pAuthnSvc, DWORD* pAuthzSvc, OLECHAR** pServerPrincName, DWORD* pAuthnLevel, DWORD* pImpLevel, void** pPrivs, DWORD* pCapabilites ); // weitere Methoden ... }
Beispiel QueryBlanket HRESULT CoBank::SetCreditCardInfo( BSTR pszCardNum ) { // verlange PRIVACY DWORD nAuthnLevel HRESULT hr = CoQueryClientBlanket( 0, 0, 0, &nAuthnLevel, 0, 0, 0 ); // nicht authentifiziert if ( FAILED( hr ) ) return E_ACCESSDENIED; if ( nAuthnLevel < RPC_C_AUTHN_LEVEL_PRIVACY ) return E_ACCESSDENIED; //... }
Abschnitt 3.2 Access Control
Zwei Arten von Authorisation • COM bietet zwei Arten von Zugriffskontrolle • Beide arbeiten auf Prozessebene • Access Permissions • Welcher Benutzer darf in den Server Aufrufe absetzen • Launch Permissions • Welcher Benutzer kann den Prozess in Folge eines Aktivierungsaufrufes starten • Es ist möglich, dies feiner abgestuft im Programmcode zu machen
Access Permissions • Werden über CoInitializeSecurity gesetzt • Der erste Parameter kann in verschiedenen Arten verwendet werden. • NULL für unbeschränkten Zugriff • Ein Interface Pointer vom Typ IAccessControl • Ein Security Descriptor • Eine AppID • dwCapabilities (8. Parameter) bestimmt was im Ersten steht
CoInitializeSecurity HRESULT CoInitializeSecurity( SECURITY_DESCRIPTOR* pSD, DWORD cAuthSvc, SOLE_AUTHENTICATION_SERVICE* prgAuthSvc, void* pvReserved1, DWORD dwAuthnLevel, DWORD dwImpLevel, void* pvReserved2, DWORD dwCapabilities, void* pvReserved3 );
Registry • Wenn in CoInitializeSecurity eine AppID verwendet wird, wird die Registry verwendet. • Pro Applikation bzw. AppID • HKCR/AppID/{appid} • AccessPermission=“01 00 04 80 ..." • Falls dieser Key fehlt • HCLM/Software/Microsoft/Ole • DefaultAccessPermission=“01 00 04 80 ..." • DCOMCNFG kann die Einträge setzen
Launch Permissions • Wer darf einen COM Server starten? • CoInitializeSecurity kann nicht verwendet werden, da der Prozess ja noch nicht läuft • Hierfür ist die Registry da • HKCR/AppID/{appid} • LaunchPermission=“01 00 04 80 ...” • Falls dieser Key nicht existiert wird ein Default benutzt • HCLM/Software/Microsoft/Ole • DefaultLaunchPermission=“01 00 04 80 ...” • Mit Hilfe von DCOMCNFG können diese Werte editiert werden
Abschnitt 3.3 Role based security
Access Control in COM ist grob • Launch Permissions pro Applikation • Access Permissions pro Prozess • Was, wenn man es genauer/feiner haben möchte? • Access Control pro Klasse • Access Control pro Interface • Access Control pro Methode • Ist möglich, erfordert jedoch viel Code