Skip to content

DORA: Row level security

Even Kronen Johansen edited this page Feb 3, 2022 · 6 revisions

I Dora så brukes Row-Level-Security for å dele inn hvem som får se hva på Quicksight. Arkitekturen i dette fordeler seg på tre sentrale deler:

  1. Liste over brukere og deres gruppetilhørlighet
  2. Liste over grupper og deres partisjonstilganger(Dette vil si hvilke Github repo sine data de har tilgang til)
  3. Koblingen mellom datasettet og RLS

Hvordan fungerer RLS.

Row-level-security fungerer, som navnet tilsier, med å styre tilgangen for en bruker til en rad i en tabell. Dette gjennomføres i Quicksight ved at vi sammenligner informasjonen i tabellen med en CSV som lister brukere/grupper og et felt i datatabellen de skal ha tilgang til. Dette illustreres best i et eksempel. En av kolonnene i datatabellen heter partition_1. I denne er noen av verdiene "Dataplattform" og "Knowit". I tabellen under ser vi oppføringen i RLS. Den sier at for gruppemedlemmer av Group1 så skal de få lov å se all data som har "Dataplattform" i kolonnen "partition_1". Og det samme for Gruppe2 og verdien "Knowit".

Group partition_1
Group1 Dataplattform
Group2 Knowit

Et viktig faktum for at dette fungerer er at så fort RLS brukes på et datasett så er vanlig oppførsel fra quicksight at den ikke viser noe data. Altså den vil kun vise noe hvis man eksplisitt har bedt den om å vise den datoen til denne gruppen.

Liste over brukere og deres gruppetilhørlighet

Filen dora-users.csv lastes opp gjennom upload_dora_files.py scriptet og er den eneste som i utgangspunktet skal behandles manuelt. Det er her vi som dataplattform-team styrer hvilke brukere som skal være en del av de forskjellige gruppene. Gruppene opprettes automatisk basert på partition_1 verdien. Denne verdien settes basert på navnet på repoet.

Her vil man da ha en fil som består av navn på brukere og hvilke grupper de er medlem av. Det er per nå ikke implementert en god måte å oppdatere filen annet enn å laste opp en ny fil.

Oppsettet på dora_users.csv er på følgende format i en csv fil: UserName,Email,GroupName

Kobling mellom brukere og RLS

Basert på brukerne i dora-users.csv så opprettes det brukere og gruppemedlemskap i quicksight. Dette gjøres i scriptet dora_register_users_lambda.py. Disse medlemskapene kobles så til RLS gjennom filen quicksight_role_bindings.csv. Denne filen autogenereres av lamdaen dora_create_quicksight_groups.py. Denne kjører hver gang glue kjører. Det sjekkes om det er blitt opprettet en ny partisjon. Hvis det har blitt opprettet så skaper det en ny group i quicksight for den nye partisjonen. Den oppdater også den nevnte filen quicksight_role_bindings.csv med nye grupper og partisjoner. Denne filen skal altså i teorien ikke manuelt røres.

Kobling mellom RLS-filen og Quicksight.

I DORA er denne sammenkoblingen satt manuelt. Dette er gjort via en manifest.json fil som opprettes i upload_dora_files.py. Denne brukes for å skape en sammenkobling mellom quicksight og manifest filen som legges på s3. Dette skjer via to serverless ressurser.

Først opprettes det en Data Source som baseres på manifest.json fila.

S3DataSource:<br/>
    Type: AWS::QuickSight::DataSource  
    Properties:  
      AwsAccountId: !Sub ${AWS::AccountId}
      Name: DoraWorkGroup-S3DataSource
      Type: S3
      DataSourceId: S3Source
      DataSourceParameters: 
        S3Parameters:
          ManifestFileLocation:
            Bucket: !Sub ${self:custom.stage}-datalake-bucket-${AWS::AccountId}
            Key: data/level-3/dora/manifest.json
      Permissions:
        - Principal: ${ssm:/dev/dora/quicksight_principal}
          Actions:
            - quicksight:UpdateDataSourcePermissions
            - quicksight:DescribeDataSource
            - quicksight:DescribeDataSourcePermissions
            - quicksight:PassDataSource
            - quicksight:UpdateDataSource
            - quicksight:DeleteDataSource

Basert på denne data sourcen så opprettes det et dataset som inneholder rollebindingen.

  Rolebindings:
    Type: AWS::QuickSight::DataSet
    Properties:
      AwsAccountId: !Sub ${AWS::AccountId}
      DataSetId: Rolebinding
      Name: Rolebinding
      ImportMode: SPICE
      PhysicalTableMap:
        s3PhysicalTable:
          S3Source:
            DataSourceArn: !GetAtt S3DataSource.Arn
            InputColumns: 
              - Name: partition_1
                Type: STRING
              - Name: GroupName
                Type: STRING
            UploadSettings:
              Format: CSV
              StartFromRow: 1
              ContainsHeader: True
              Delimiter: ',`

Til slutt så settes denne rollebindingen på data set resourcen som vi ønsker å beskytte:

RowLevelPermissionDataSet:
        Arn: !GetAtt Rolebindings.Arn
        FormatVersion: VERSION_1
        PermissionPolicy: GRANT_ACCESS
Clone this wiki locally