Den Active Directory Account für die Verbindung zur DB (SAP HANA) verwenden - why not?

Intro

Painpoints

  • Die DBA’s lassen uns keine DB-User erstellen. D.h. wir müssen für jeden neuen User, ein Ticket erstellen, so dass der DBA uns einen neuen User erstellt.
  • Aktuelle User haben ein eigenes Passwort für ihren DB-User.

Vorteile

  • zentrales Login
    • die Logins werden zentral erstellt
    • die Logins werden zentral deaktiviert
    • die Permissions werden zentral verwaltet
  • automatische User Erstellung
    • Für neue User, kann alles vorbereitet werden. Der User wird erstellt, sobald sich der User das erste Mal anmeldet. –> Dieses Problem könnte auch via Permissions oder mit einem custom Package behoben werden.

Nachteile

  • DB Login wird meist plaintext oder sehr einfach verschlüsselt gespeichert (Scripts, DB Tools), wenn das dem AD Account entspricht, kann dieses so rausgefunden werden.
  • Bei dem regelmässigen Passwort-Wechsel, kann es dazu kommen, dass der User sicher selbst aussperrt (Lockout).
  • Bei einem Lockout wird das gesamte Windows gesperrt.

Outcome

Wir verwenden das AD-Login auf Grund dieser Nachteilen nicht.

How to

So würde es funktionieren:

  • Names definieren
    • AD_HANA_SERVICE_USER: AD Service User der für LDAP verwendet werden soll.
    • AD_PERMISSION_GROUP_ALLOW_CONNECT: wie oben erwähnt pro Umgebung
    • Berechtigungsgruppen nach Bedarf:
      • Beispiel: AD_P_DB_Consumer
  • AD Gruppen definieren
    • Versch. Umgebungen verwalten (Dev, Test, Prod)
      • eigene Gruppe pro Umgebung
    • AD Gruppen verwalten lassen
      • wenn nötig eigene AD Gruppe erstellen, welche die User den Business Gruppen zuweisen darf.
  • LDAP Root Zertifkate laden
  • SQL
    • LDAP Provider erstellen
    • Gruppen mappen
    • Permissions für neue Gruppen setzen
    • User mit LDAP erstellen
    • Existierende Users migrieren

LDAP Syntax Beispiele

# Search for user
(cn=*<USERNAME>*)

# list all effective groups of a specific user:
(member:1.2.840.113556.1.4.1941:=CN=<USERNAME>,OU=Admin,OU=Users,OU=myOu,DC=ms,DC=company,DC=com)

# list all direct groups of a specific user:
(member:CN=<USERNAME>,OU=Admin,OU=Users,OU=myOu,DC=ms,DC=company,DC=com)

SQL

-- create the ldap provider
-- doc: https://help.sap.com/docs/SAP_HANA_PLATFORM/4fe29514fd584807ac9f2a04f6754767/ae9ba28ddefc4b29809d5b926d6ee02d.html
ALTER LDAP PROVIDER my_ldap
    CREDENTIAL TYPE 'PASSWORD' USING 'user=CN=<AD_HANA_SERVICE_USER>,OU=Service,OU=Users,OU=myOu,DC=ms,DC=company,DC=com;password=xx'

    -- which users are allowed for user creation -> * will be replaced with username
    USER LOOKUP URL 'ldaps://ad.ms.company.com/OU=myOu,DC=ms,DC=xxx,DC=ch??sub?(&(objectClass=user)(memberOf:1.2.840.113556.1.4.1941:=CN=<AD_PERMISSION_GROUP_ALLOW_CONNECT>,OU=Permission,OU=Groups,OU=myOu,DC=ms,DC=company,DC=com)(sAMAccountName=*))'

    -- use all groups from this "myOu"
    NESTED GROUP LOOKUP URL 'ldaps://ad.ms.company.com/OU=myOu,DC=ms,DC=xxx,DC=ch??sub?(&(objectClass=group)(memberOf:1.2.840.113556.1.4.1941:=OU=Permission,OU=Groups,OU=myOu,DC=ms,DC=company,DC=com)(member:1.2.840.113556.1.4.1941:=*))'

    ATTRIBUTE DN 'distinguishedName'
    
    -- not needed if "NESTED GROUP LOOKUP URL" is set
    -- ATTRIBUTE MEMBER_OF 'memberOf'
    
    -- we use ldaps, so ssl should be disabled
    SSL OFF
    
    -- use this as the default provider -> useful in combination with user creation below
    DEFAULT ON

    -- enable it
    ENABLE PROVIDER

    -- allow user creation for users while first login
    ENABLE USER CREATION FOR LDAP USER TYPE STANDARD
;

-- validate user and password query
VALIDATE LDAP PROVIDER my_ldap;
VALIDATE LDAP PROVIDER my_ldap CHECK USER <AD_USER>;
VALIDATE LDAP PROVIDER my_ldap CHECK USER <AD_USER> PASSWORD <AD_USER_PASSWORD>;


-- create roles (groups in hana) accordingly
-- create the 1:1 role according to the AD-group
CREATE ROLE cdwh.AD_P_DB_Consumer
    LDAP GROUP 'CN=AD_P_DB_Consumer,OU=Permission,OU=Groups,OU=groupsOU,DC=ms,DC=company,DC=com';

-- create an abstract role, to also support non-AD users
create role cdwh.CONSUMER;
-- give the AD-role the consumer grants
grant cdwh.CONSUMER to cdwh.AD_P_DB_Consumer;


-- grant now all permission on
grant select, select metadata on schema xy to cdwh.CONSUMER;


-- create new users with ldap provideer
CREATE USER <USERNAME> AUTHORIZATION LDAP;


-- or migrate existing local user to ldap provider
ALTER USER <USERNAME> DISABLE PASSWORD
ALTER USER <USERNAME> ENABLE LDAP;
ALTER USER <USERNAME> AUTHORIZATION LDAP;

-- or to revert to the original password before
ALTER USER <USERNAME> DISABLE LDAP;
ALTER USER <USERNAME> ENABLE PASSWORD;
ALTER USER <USERNAME> AUTHORIZATION LOCAL;


-- debug: special permissions like reading masked fields can be cached if testing AD, clean cache
ALTER SYSTEM CLEAR SQL PLAN CACHE;
ALTER SYSTEM CLEAR CACHE ( <cache_id> [, <cache_id> [] ] [ SYNC ] );

HANA System Tables

  • sys.users
  • sys.ldap_providers
  • sys.granted_roles
  • sys.granted_privileges

Weitere Infos