Utredning av AD-synk for UiO

Dette dokumentet utreder hvordan Cerebrums synkronisering mot AD-miljøet fungerer pr 01.10.2015, for å kartlegge eventuelle endringsbehov for AD2-synkroniseringen med hensyn til både utviklere og KIA.

1   Synk-jobber

AD-sync for UiO består av:

  • AD2 quicksync for passord.

    Synkronisering av «hendelser» – endring av passord og manuelle ad-attributter leses fra changelog, og synkroniseres til AD.

    Merk at denne jobben benytter en annen konfigurasjon (adconf), ettersom den er basert på AD2-synkroniseringen.

    Cerebrum/contrib/ad/sync.py --quick adpassword \
                                --type AD_account \
                                --logger-name ad_passwordsync
    

    Jobben kjøres hvert 5. minutt.

  • Egen AD bruker-sync for UiO

    Cerebrum/contrib/no/uio/ad_fullsync.py --user-sync \
                                           --logger-name ad_usersync
    

    Jobben kjøres hvert 10. minutt, og starter gruppe-sync. Ny jobb startes ikke før gruppe-sync er fullført, og jobben startes ikke mens process_students kjører.

  • Egen AD gruppe-sync for UiO

    Cerebrum/contrib/no/uio/ad_fullsync.py --group-sync \
                                           --sendDN_boost \
                                           --delete \
                                           --logger-name ad_usersync
    

    Jobben startes av bruker-sync, og jobben startes ikke mens process_students kjører.

1.1   Felles flyt i sync

AD-sync av brukere og grupper har en felles flyt:

  1. Samle objekter i Cerebrum. De må ha spread som er definert i AD_ACCOUNT_SPREAD eller AD_GROUP_SPREAD.
  2. Samle data om objekter fra AD. Cerebrum henter alle attributter fra AD som er definert i AD_ATTRIBUTES, AD_GROUP_ATTRIBUTES og AD_ACCOUNT_CONTROL.
  3. Vurdere om objekter er låst for endring. Dette gjøres ved å sjekke om minst en streng fra AD_DO_NOT_TOUCH er plassert i AD-objektet sin DN.
  4. Slette objekter som ikke finnes i Cerebrum (--delete). Brukere disables og flyttes til AD_LOST_AND_FOUND.
  5. Flytte objekter som ikke ligger i forventet OU. Riktig OU er definert i AD_ACCOUNT_OU og AD_GROUP_OU.
  6. Endre objekter som har ulike attributt-verdier. Cerebrum oppdaterer bare attributter som er definert i AD_ATTRIBUTES.
  7. Opprette objekter som finnes i Cerebrum med riktig spread, men som ikke finnes i AD.
Sletting

Opsjonen --delete avgjør om objekter skal slettes eller ikke i AD. Uten dette flagget i:

  • …brukersync vil brukere flyttes til AD_LOST_AND_FOUND og markeres med ACCOUNTDISABLE.
  • …gruppesync vil gruppen fortsatt være tilgjengelig.

2   Synkronisering av brukere

Utplukk:

<spreads> oppgies til scriptet i --user_spread-opsjon eller ved å sette AD_ACCOUNT_SPREAD i cereconf.

  1. Brukere

    Brukere som skal vurderes for synk hentes fra databasen med ac.search(spread=<spreads>).

  2. QuarantineHandler

    • should_skip fjerner bruker fra utplukk
    • is_locked låser (disabler) bruker i AD

Ved oppretting av en bruker vil ikke alle attributter bli satt på brukerkontoen i AD dersom Cerebrum ikke får satt passord på brukeren. Om Cerebrum ikke har noe passord for en bruker, settes et tilfeldig passord.

2.1   Attributter

givenName
Settes til name_first fra system_cached. Verdien transformeres med string.strip(). Dersom verdien ikke finnes, settes attributtet til en tom streng.
sn
name_last fra system_cached. Verdien transformeres med string.strip(). Dersom verdien ikke finnes, settes attributtet til en tom streng.
displayName
Settes til <givenName> <sn>. Dersom <givenName> eller <sn> er tomme, vil mellomrommet beholdes.
userPrincipalName
Settes til <brukernavn>@uio.no.
homeDrive
Settes til M:
mail
Attributtet mail populeres med informasjon fra Account.getdict_uname2mailaddr(filter_expired=True, primary_only=True), som er brukeren sin primære e-postadresse.

Dersom man ikke er med i utplukket, vil man ikke få attributtet.

homeDirectory

Verdien av attributtet avgjøres fra utplukket Account.list_account_home(account_spread=<spreads>), samt cereconf.AD_HOMEDIR_HITACHI_DISKS:

  1. Dersom brukeren er med i utplukket, og disk for hjemmeområde
    • …finnes i cereconf.AD_HOMEDIR_HITACHI_DISKS: \\<disk-name>\<basedir(path)>\<username>
    • …ikke finnes i cereconf.AD_HOMEDIR_HITACHI_DISKS: \\<disk-name>\<username>
  2. Dersom brukeren ikke er med i utplukket, settes verdien til en tom streng.
Posix

Krever msSFU30 (UNIX attributes schema) i domenet.

Datautplukk:

Brukere som finnes i PosixUser.list_posix_users(spread=<spreads>) får lagt på Posix-informasjon i AD.

Posix-attibutter:

  • uidNumber
  • gidNumber
  • gecos
  • uid (brukernavn)
  • mssfu30name (brukernavn)
  • msSFU30NisDomain (satt til 'uio'.
  • primaryGroupID (gruppe-id i ad)

primaryGroupID stryres av Cerebrum-GID → Cerebrum-gruppenavn == AD-gruppenavn → AD-SID. Cerebrum-gruppenavn slåes opp med PosixGroup.search(cereconf.AD_GROUP_SPREAD).

Attributtet vil ikke oppdateres dersom:

  • Gruppenavnet ikke finnes i oppslaget. Det kan f.eks. skje om man har valgt et spread med --group_spread som ikke også finnes i cereconf.AD_GROUP_SPREAD.
  • AD allerede har primærgruppe for en bruker, men Cerebrum ikke lenger har informasjon om dette.

POSIX-data ble det et behov for ved innføringen av ny lagringsløsning med Hitachi (HNAS). For mer info, se også Spesifikasjon av løysingsforslag for posixgrupper i AD.

3   Synkronisering av grupper

3.1   Flagg

--store_sid
Om dette flagget er aktivt, vil gruppens SID i AD lagres i Cerebrum som gruppens external_groupsid (knyttet mot system_ad). Brukes ikke i prod pr i dag. Sikkerhetssjef har også sagt at dette ikke lenger er et behov.
--sendDN_boost
Sender FQDN inn til AD istedetfor kun gruppe- eller brukernavn. Hovedsakelig nyttig for å gjøre syncen raskere ettersom dette gjør at AD-serveren slipper å lete etter objektene. Brukes i prod pr i dag.
--full_membersync
Vil oppdatere AD med data fra Cerebrum, uten å sammenligne med data fra AD. Dette gjøres gjennom å generere en liste av medlemmer og kjøre et kall på kommandoen syncMembers med medlemslisten som parameter. Brukes ikke i prod pr i dag

Utplukk:

<spreads> oppgis til scriptet i --group_spread-opsjon eller ved å sette AD_GROUP_SPREAD i cereconf.

  1. Grupper

    Brukere som skal vurderes for synk hentes fra databasen med Group.search(spread=<spreads>).

3.2   Gruppenavn

Gruppenavnet som sendes til AD består av gruppenavnet i Cerebrum, pluss verdien av cereconf.AD_GROUP_POSTFIX.

3.3   Attributter

displayName
Settes til gruppenavn
displayNamePrintable
Settes til gruppenavn
description
Settes til gruppens description i Cerebrum.
Posix

Krever msSFU30 (UNIX attributes schema) i domenet.

Grupper som finnes i PosixUser.list_posix_groups() får lagt på Posix-informasjon i AD.

Posix-attributter:

  • gidNumber
  • msSFU30Name (gruppenavn)
  • msSFU30NisDomain (satt til 'uio')
  • memberUID (se beskrivelse nedenfor)

Attributtet memberUID inneholder en liste av alle brukere fra PosixUser.list_posix_users(filter_expired=True), som har gruppen som sin gid.

3.4   Spreads gruppemedlemmer

Om et personobjekt er medlem av en gruppe: primærbrukeren til denne personen hentes ut, og legges til som medlem i gruppen hvis primærbrukeren har AD-spread. Hvis primærbrukeren ikke har AD-spread, vil brukeren med høyest prioritet som har AD-spread bli lagt til. Brukere (eller personer med brukere) uten AD-spread, vil ikke bli lagt til som gruppemedlemmer i det hele tatt.

3.5   Group flattening

Om en gruppe med AD-spread har medlemmer som er grupper uten AD-spread, vil gruppehierarkiet fra Cerebrum flates ut, og medlemmene i gruppene uten AD-spread vil bli lagt til direkte som medlemmer i foreldregruppen med AD-spread. Dette skjer rekursivt, og brukerne vil havne i "nærmeste" foreldregruppe med AD-spread. Brukere som blir lagt til i på denne måten, blir ikke lagt til i gruppens memberUID-attributt. Uvisst pr akkurat nå om dette er feil, eller om dette er et bevisst valg basert på gode grunner.

For grupper i grupper der undergruppen har AD-spread, gjøres det ikke en utflating, men gruppene og medlemskapene overføres med samme struktur.

3.6   Tomme AD-grupper

Hvis en gruppe i Cerebrum har medlemmer, men AD rapporterer at gruppen er tom, er enten gruppen faktisk tom og skal populeres, eller gruppen har mer enn 1500 medlemmer, som er over maxValRange-grensen, som gjør at AD ikke returnerer noen medlemsliste i det hele tatt. For disse gruppene kjøres det en full-sync av medlemslisten, gjennom å kalle på AD-kommandoen syncMembers på gruppeobjektet i AD, med medlemslisten som parameter.

Det er ikke sikkert at dette alltid fungerer for store grupper. Det er en viss risiko for at noen medlemmer ikke blir meldt ut av slike grupper.

4   Konfigurasjon

AD_SERVER_HOST

Host hvor adserver kjører.

'ceresynk01.uio.no'
AD_SERVER_PORT

Port for å koble opp mot adserver.

8000
AD_DC
'uio'
AD_DOMAIN_ADMIN_USER
'cerebrum_login'
AD_LDAP
'OU=cerebrum,DC=uio,DC=no'
AD_USER_OU

Plassering av Users-objekter. Alle nye Account-objekt vil bli opprettet her. Alle eksisterende Account-objekt som ikke ligger i denne OU-en vil flyttes hit.:

'OU=users,OU=cerebrum,DC=uio,DC=no'
AD_GROUP_OU
'OU=groups,OU=cerebrum,DC=uio,DC=no'
AD_LOST_AND_FOUND

OU for plassering av slettede objekter. AD-brukere slettes ikke, men får ACCOUNTDISABLE og flyttes hit.

'OU=cerebrum-deleted,OU=cerebrum,DC=uio,DC=no'
AD_ACCOUNT_CONTROL

Account control-attributter (og verdier) som skal synkroniseres mot AD.

{'ACCOUNTDISABLE': True,
 'DONT_EXPIRE_PASSWORD': True,
 'PASSWD_NOTREQD': False}

ACCOUNTDISABLE-verdien endres av AD-synken.

AD_ACCOUNT_SPREAD
'AD_account'
AD_GROUP_SPREAD
'AD_group'
AD_DO_NOT_TOUCH

En liste over søkestrenger for objekter som ikke skal røres. Søkestrengen er case-insensitiv, og matches mot distinguishedName.

('Builtin',
 'Computers',
 'Domain Controllers',
 'Foreign Security Principals',
 'cerebrum_dont_touch',
 'adm_accounts', )
AD_ATTRIBUTES

Account-attributter som skal synkroniseres mot AD.

('sn',
 'givenName',
 'displayName',
 'mail',
 'userPrincipalName',
 'homeDrive',
 'homeDirectory',
 'uidNumber',
 'gidNumber',
 'gecos',
 'uid',
 'mssfu30name',
 'msSFU30NisDomain', )
AD_GROUP_POSTFIX

Setter hva grupper skal ha som suffiks.

'-gruppe'
AD_GRP_ATTRIBUTES

Attributter som Cerebrum modererer for grupper.

('displayName',
 'description',
 'displayNamePrintable',
 'member',
 'gidNumber',
 'msSFU30Name',
 'msSFU30NisDomain', )
AD_GROUP_TYPE

Styrer hvilken type og skop grupper skal få ved oppretting. På UiO er dette for tiden Universal Security Group.

-2147483640

Merk at Cerebrum sjekker ikke og endrer ikke skop og type for grupper som allerede eksisterer i AD. Dette styrer AD-administratorer.

AD_HOMEDIR_HITACHI_DISKS

Disker for Hitachi-løsning krever litt særbeandling i path.

('kant',
 'hume', )
GUESTS_USER_SPREADS

Denne innstillingen gjelder for den gamle gjestebruker-ordningen, og bestemmer hvilke spread alle gjestebrukere skal få ved oppretting.

['AD_account',
 'NIS_user@uio',
 'NIS_user@ifi', ]

Ikke i bruk/ikke satt:

AD_HOME_DRIVE
Verdi for homeDrive dersom Cerebrum ikke har denne informasjonen. Vi har hardkodet verdien 'M:' for dette attributtet for UiO.
Publisert 31. okt. 2015 07:35