-
Notifications
You must be signed in to change notification settings - Fork 0
DORA: Row level security
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:
- Liste over brukere og deres gruppetilhørlighet
- Liste over grupper og deres partisjonstilganger(Dette vil si hvilke Github repo sine data de har tilgang til)
- Koblingen mellom datasettet og 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.
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
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.
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