Zo zákulisia brány firewall na ochranu osobných údajov

Poznámka

Úrovne ochrany osobných údajov v súčasnosti nie sú k dispozícii v tokoch údajov Power Platformy, ale produktový tím pracuje na povolení tejto funkcie.

Ak ste už dotaz Power Query používali dlhší čas, pravdepodobne ste sa už stretli s ním. Tam ste, dotazovanie preč, keď sa náhle zobrazí chyba, že žiadne množstvo on-line vyhľadávanie, dotaz ladenie, alebo klávesnica mlátiť môže napraviť. Chyba ako:

Formula.Firewall: Query 'Query1' (step 'Source') references other queries or steps, so it may not directly access a data source. Please rebuild this data combination.

Alebo možno:

Formula.Firewall: Query 'Query1' (step 'Source') is accessing data sources that have privacy levels which cannot be used together. Please rebuild this data combination.

Tieto Formula.Firewall chyby sú výsledkom brány firewall ochrany osobných údajov v Doplnku Power Query (známej aj ako brána firewall), ktorá sa niekedy môže zdať, že existuje len na zmarenie analytikov údajov na celom svete. Verte tomu alebo nie, ale brána firewall slúži na dôležitý účel. V tomto článku sa ponoríme pod kapotou, aby sme lepšie pochopili, ako to funguje. Vyzbrojení väčšie porozumenie, budete snáď môcť lepšie diagnostikovať a riešiť chyby brány firewall v budúcnosti.

Čo je to?

Účelom brány firewall na ochranu osobných údajov je jednoduchý. Existuje na to, aby sa zabránilo neúmyselnému úniku údajov medzi zdrojmi doplnku Power Query.

Prečo je to potrebné? Myslím tým, môžete určite vytvoriť nejaký M, ktorý by odovzdať hodnotu SQL do informačného kanála OData. Ale bol by to zámerný únik údajov. Autor mashup by (alebo aspoň mal) vedieť, že to robia. Prečo potom potreba ochrany pred neúmyselným únikom údajov?

Odpoveď? Skladacie.

Skladacie?

Postupné posúvanie je výraz, ktorý odkazuje na konverziu výrazov v jazyku M (ako sú napríklad filtre, premenovania, spojenia atď.) na operácie nespracovanému zdroju údajov (napríklad SQL, OData atď.). Obrovská časť výkonu doplnku Power Query pochádza zo skutočnosti, že PQ môže konvertovať operácie, ktoré používateľ vykonáva prostredníctvom svojho používateľského rozhrania, do zložitých jazykov serverového zdroja údajov SQL alebo iných serverových zdrojov údajov bez toho, aby používateľ musel poznať uvedené jazyky. Používatelia získajú výhodu výkonu operácií natívneho zdroja údajov s jednoduchým použitím používateľského rozhrania, kde možno všetky zdroje údajov transformovať pomocou bežnej množiny príkazov.

V rámci postupného posúvania môže PQ niekedy určiť, že najúčinnejší spôsob vykonania danej mashup je zobrať údaje z jedného zdroja a odovzdať ich do iného. Ak sa napríklad pripájate k obrovskej tabuľke SQL súboru CSV, pravdepodobne nechcete, aby PQ čítala súbor CSV, čítala celú tabuľku SQL a potom ju spojila v lokálnom počítači. Pravdepodobne budete chcieť, aby PQ vnorenie CSV údajov do príkazu SQL a požiadať SQL databázy vykonať pripojenie.

Takto sa môže stať neúmyselný únik údajov.

Predstavte si, že by ste sa pripájali k údajom SQL, ktoré obsahujú čísla sociálneho zabezpečenia zamestnancov s výsledkami externého informačného kanála OData, a náhle ste zistili, že čísla sociálneho zabezpečenia z SQL boli odoslané do služby OData. Zlé správy, správne?

Toto je typ scenára, v prípade ktorého je brána firewall určená na zabránenie.

Ako to funguje?

Brána firewall existuje, aby sa zabránilo neúmyselnému odoslaniu údajov z jedného zdroja do iného zdroja. Jednoduchá dosť.

Tak ako to dosiahne túto misiu?

Urobí to tak, že rozdelí vaše dotazy jazyka M na niečo, čo sa nazýva oblasti, a potom vynucuje nasledujúce pravidlo:

  • Oblasť môže buď pristupovať ku kompatibilným zdrojom údajov alebo odkazovať na iné oblasti, ale nie na oba.

Jednoduché... ešte mätúci. Čo je oblasť? Prečo sú dva zdroje údajov "kompatibilné"? A prečo je brána firewall opatrná, či chce oblasť pristupovať k zdroju údajov a odkazovať na oblasť?

Rozdeľme si to a pozrime sa na vyššie uvedené pravidlo po jednom.

Čo je oblasť?

Na svojej najzákladnejšej úrovni je oblasť len kolekciou jedného alebo viacerých krokov dotazu. Najrozlišnejšia možná oblasť (aspoň v aktuálnej implementácii) je jedným krokom. Najväčšie oblasti môžu niekedy zahŕňať viacero dotazov. (Viac o tom neskôr.)

Ak nie ste oboznámení s krokmi, môžete ich zobraziť na pravej strane okna Editor Power Query po výbere dotazu na table Použité kroky. Kroky, aby ste mali prehľad o všetkom, čo ste urobili, aby sa údaje transformovali do ich konečného tvaru.

Oblasti, ktoré odkazujú na iné oblasti

Keď sa dotaz vyhodnotí so zapnutou bránou firewall, brána firewall rozdelí dotaz a všetky jeho závislosti do oblastí (to znamená skupiny krokov). Kedykoľvek jedna oblasť odkazuje na niečo v inej oblasti, brána firewall nahradí odkaz volaním na špeciálnu funkciu s názvom Value.Firewall. Inými slovami, brána firewall nepovoľuje, aby oblasti mali priamy prístup. Všetky odkazy sa upravia tak, aby išli cez bránu firewall. Bránu firewall si predstavte ako vrátnika. Oblasť, ktorá odkazuje na inú oblasť, musí získať povolenie brány firewall a brána firewall kontroluje, či budú alebo nebudú mať odkazované údaje do oblasti povolené.

To všetko sa môže zdať docela abstraktné, takže sa pozrime na príklad.

Predpokladajme, že máte dotaz s názvom Employees (Zamestnanci), ktorý načíta údaje z sql databázy. Predpokladajme, že máte aj iný dotaz (EmployeesReference), ktorý jednoducho odkazuje na zamestnancov.

shared Employees = let
    Source = Sql.Database(…),
    EmployeesTable = …
in
    EmployeesTable;

shared EmployeesReference = let
    Source = Employees
in
    Source;

Tieto dotazy sa rozdelia na dve oblasti: jeden pre dotaz Employees (Zamestnanci) a jeden pre dotaz EmployeesReference (ktorý odkazuje na oblasť Zamestnanci). Pri vyhodnocovaní pomocou brány firewall sa tieto dotazy prepíšu takto:

shared Employees = let
    Source = Sql.Database(…),
    EmployeesTable = …
in
    EmployeesTable;

shared EmployeesReference = let
    Source = Value.Firewall("Section1/Employees")
in
    Source;

Všimnite si, že jednoduchý odkaz na dotaz Employees (Zamestnanci) bol nahradený volaním Value.Firewallfunkcie , ktorá poskytuje celé meno dotazu Employees (Zamestnanci).

Pri vyhodnocovaní funkcie EmployeesReference je volanie Value.Firewall("Section1/Employees") zachytené bránou firewall, ktorá má teraz možnosť kontrolovať, či sa požadované údaje (a ako) tečie do oblasti EmployeesReference. Môže vykonávať ľubovoľný počet vecí: zamietnuť požiadavku, uložiť požadované údaje do medzipamäte (čím sa zabráni ďalšiemu postupnému posúvaniu do pôvodného zdroja údajov) atď.

Takto si brána firewall udržiava kontrolu nad tokom údajov medzi oblasťami.

Oblasti, ktoré priamo pristupujú k zdrojom údajov

Povedzme, že definujete dotaz Query1 s jedným krokom (všimnite si, že tento dotaz s jedným krokom zodpovedá jednej oblasti brány firewall) a že tento jeden krok pristupuje k dvom zdrojom údajov: tabuľke databázy SQL a súboru CSV. Ako sa firewall vysporiadať s tým, pretože neexistuje žiadny odkaz na oblasť, a tak žiadny hovor na Value.Firewall to zachytiť? Pozrime sa na pravidlo uvedené vyššie:

  • Oblasť môže buď pristupovať ku kompatibilným zdrojom údajov alebo odkazovať na iné oblasti, ale nie na oba.

Ak chcete povoliť spustenie vášho dotazu s dvomi zdrojmi údajov typu "single-partition-but-two-data-sources", musia byť tieto dva zdroje údajov "kompatibilné". Inými slovami, je potrebné v poriadku, aby sa údaje medzi nimi zdieľali obojsmerne. To znamená, že úrovne ochrany osobných údajov oboch zdrojov musia byť verejné alebo obe musia byť organizačné, pretože ide o jediné dve kombinácie, ktoré umožňujú zdieľanie v oboch smeroch. Ak sú oba zdroje označené ako Súkromné alebo jeden je označený ako Verejný a jeden je označený ako Organizačné, alebo sú označené pomocou inej kombinácie úrovní ochrany osobných údajov, potom obojsmerné zdieľanie nie je povolené a z tohto dôvodu nie je bezpečné, aby sa obe vyhodnotili v tej istej oblasti. To by znamenalo, že by mohlo dôjsť k nebezpečnému úniku údajov (z dôvodu postupného posúvania) a brána firewall by nemala spôsob, ako tomu zabrániť.

Čo sa stane, ak sa pokúsite získať prístup k nekompatibilných zdrojom údajov v rovnakej oblasti?

Formula.Firewall: Query 'Query1' (step 'Source') is accessing data sources that have privacy levels which cannot be used together. Please rebuild this data combination.

Dúfame, že ste teraz lepšie pochopili jedno z chybových hlásení uvedených na začiatku tohto článku.

Upozorňujeme, že táto požiadavka na kompatibilitu sa vzťahuje len v rámci danej oblasti. Ak oblasť odkazuje na iné oblasti, zdroje údajov z odkazovaných oblastí nemusia byť navzájom kompatibilné. Je to spôsobené tým, že brána firewall môže do medzipamäte načítať údaje, čo zabráni ďalšiemu skladania údajov v pôvodnom zdroji údajov. Údaje sa načítajú do pamäte a budú sa s nimi zaobchádzať, akoby prišli z ničoho.

Prečo neobsadá?

Povedzme, že definujete dotaz s jedným krokom (ktorý bude opäť zodpovedať jednej oblasti), ktorá pristupuje k ďalším dvom dotazom (teda k ďalším dvom oblastim). Čo ak ste v tom istom kroku chceli mať aj priamy prístup k databáze SQL? Prečo nemôže oblasť odkazovať na iné oblasti a priamo pristupovať ku kompatibilným zdrojom údajov?

Ako ste videli skôr, keď jeden oddiel odkazuje na inú oblasť, brána firewall funguje ako vrátnik pre všetky údaje, ktoré prúdia do oblasti. Ak to chcete urobiť, musí mať možnosť kontrolovať, v akých údajoch je to povolené. Ak sa v oblasti pristupujú k zdrojom údajov a údaje prúdiace z iných oblastí stratia schopnosť byť vrátnikom, pretože údaje, ktoré prúdia do, by mohli unikať do jedného z interne prístupných zdrojov údajov bez toho, aby o tom vedel. Brána firewall preto zabraňuje tomu, aby bola oblasť, ktorá pristupuje k iným oblastiam, povolená priamemu prístupu k ľubovoľným zdrojom údajov.

Čo sa teda stane, ak sa oblasť pokúsi odkazovať na iné oblasti a tiež priamo získať prístup k zdrojom údajov?

Formula.Firewall: Query 'Query1' (step 'Source') references other queries or steps, so it may not directly access a data source. Please rebuild this data combination.

Dúfame, že teraz lepšie porozumiete tomu ďalšiemu chybovému hláseniu, ktoré bolo uvedené na začiatku tohto článku.

Podrobné oblasti

Ako môžete asi uhádnuť z vyššie uvedených informácií, ako dotazy sú rozdelených končí je neuveriteľne dôležité. Ak máte kroky, ktoré odkazujú na iné dotazy a iné kroky na prístup k zdrojom údajov, dúfame, že teraz zistíte, že kreslenie hraníc oblasti na určitých miestach spôsobí chyby brány firewall a ich kreslenie na iných miestach umožní vášmu dotazu fungovať bez problémov.

Ako presne sa teda dotazy rozdelia?

Táto časť je pravdepodobne najdôležitejšia na pochopenie toho, prečo sa zobrazujú chyby brány firewall, a pochopenie ich riešenia (ak je to možné).

Tu je súhrn logiky rozdelenia na vysokej úrovni.

  • Počiatočné rozdelenie
    • Vytvorí oblasť pre každý krok v každom dotaze
  • Statická fáza
    • Táto fáza nezávisí od výsledkov hodnotenia. Namiesto toho sa opiera o štruktúru dotazov.
      • Orezanie parametrov
        • Trims parameter-esquí oblasti, to znamená, že niektorý z nich:
          • Neodkazuje na žiadne iné oblasti
          • Neobsahuje žiadne vyvolania funkcie
          • Nie je cyklická (t. j. neodkazuje na seba)
        • Všimnite si, že "odstránenie" oblasti ju efektívne zahŕňa do akýchkoľvek iných oblastí, ktoré naň odkazujú.
        • Orezanie oblastí parametrov umožňuje odkazy na parametre používané v rámci volaní funkcie zdroja údajov (napríklad ) namiesto toho, Web.Contents(myUrl)aby hádzali chyby "oblasť nemôže odkazovať na zdroje údajov a iné kroky".
      • Zoskupenie (statické)
        • Oblasti sa zlúčia v poradí závislostí v dolnej časti nahor. Vo výsledných zlúčených oblastí budú oddelené nasledujúce oblasti:
          • Oblasti v rôznych dotazoch
          • Oblasti, ktoré neodkazujú na iné oblasti (a majú teda povolené prístup k zdroju údajov)
          • Oblasti, ktoré odkazujú na iné oblasti (a preto majú zákaz pristupovať k zdroju údajov)
  • Dynamická fáza
    • Táto fáza závisí od výsledkov hodnotenia vrátane informácií o zdrojoch údajov, ku ktorým sa pristupuje prostredníctvom rôznych oblastí.
    • Orezávanie
      • Trims oblastí, ktoré spĺňajú všetky nasledujúce požiadavky:
        • Nepristupuje k žiadnym zdrojom údajov
        • Neodkazuje na žiadne oblasti, ktoré pristupujú k zdrojom údajov
        • Nie je cyklická
    • Zoskupenie (dynamické)
      • Teraz, keď sú nepotrebné oblasti orezané, skúste vytvoriť čo možno najväčšiu zdrojovú oblasť. Vykoná sa to zlúčením oblastí pomocou rovnakých pravidiel, ktoré sú popísané vo vyššie uvedenej fáze statického zoskupenia.

Čo to všetko znamená?

Pozrime sa na príklad, ktorý znázorňuje, ako funguje zložitá logika uvedená vyššie.

Tu je ukážkový scenár. Ide o pomerne jednoduché zlúčenie textového súboru (Contacts) s databázou SQL (Employees), kde SQL server je parameter (DbServer).

Tri dotazy

Tu je kód jazyka M pre tri dotazy použité v tomto príklade.

shared DbServer = "montegoref6" meta [IsParameterQuery=true, Type="Text", IsParameterQueryRequired=true];
shared Contacts = let

    Source = Csv.Document(File.Contents("C:\contacts.txt"),[Delimiter="   ", Columns=15, Encoding=1252, QuoteStyle=QuoteStyle.None]),

    #"Promoted Headers" = Table.PromoteHeaders(Source, [PromoteAllScalars=true]),

    #"Changed Type" = Table.TransformColumnTypes(#"Promoted Headers",{{"ContactID", Int64.Type}, {"NameStyle", type logical}, {"Title", type text}, {"FirstName", type text}, {"MiddleName", type text}, {"LastName", type text}, {"Suffix", type text}, {"EmailAddress", type text}, {"EmailPromotion", Int64.Type}, {"Phone", type text}, {"PasswordHash", type text}, {"PasswordSalt", type text}, {"AdditionalContactInfo", type text}, {"rowguid", type text}, {"ModifiedDate", type datetime}})

in

    #"Changed Type";
shared Employees = let

    Source = Sql.Databases(DbServer),

    AdventureWorks = Source{[Name="AdventureWorks"]}[Data],

    HumanResources_Employee = AdventureWorks{[Schema="HumanResources",Item="Employee"]}[Data],

    #"Removed Columns" = Table.RemoveColumns(HumanResources_Employee,{"HumanResources.Employee(EmployeeID)", "HumanResources.Employee(ManagerID)", "HumanResources.EmployeeAddress", "HumanResources.EmployeeDepartmentHistory", "HumanResources.EmployeePayHistory", "HumanResources.JobCandidate", "Person.Contact", "Purchasing.PurchaseOrderHeader", "Sales.SalesPerson"}),

    #"Merged Queries" = Table.NestedJoin(#"Removed Columns",{"ContactID"},Contacts,{"ContactID"},"Contacts",JoinKind.LeftOuter),

    #"Expanded Contacts" = Table.ExpandTableColumn(#"Merged Queries", "Contacts", {"EmailAddress"}, {"EmailAddress"})

in

    #"Expanded Contacts";

Tu je zobrazenie na vyššej úrovni zobrazujúce závislosti.

Dialógové okno Závislosti dotazov.

Poďme rozdeliť

Priblížime si trochu viac a zahrnieme kroky na obrázku a začnime prechádzať logikou rozdelenia. Tu je diagram troch dotazov, ktorý zobrazuje počiatočné oblasti brány firewall zelenou farbou. Všimnite si, že každý krok sa začína vo vlastnej oblasti.

Počiatočné oblasti brány firewall.

Ďalej orezameme oblasti parametrov. Znamená to, že DbServer sa implicitne zahrnie do oblasti Zdroj.

Zdobené oblasti brány firewall.

Teraz vykonáme statické zoskupenie. Tým sa zabezpečuje rozdelenie medzi oblasťami v samostatných dotazoch (všimnite si napríklad, že posledné dva kroky stĺpca Zamestnanci sa nezoskupujú podľa krokov z kontaktov) a medzi oblasťami, ktoré odkazujú na iné oblasti (napríklad posledné dva kroky zamestnancov), a oblasťami, ktoré túto oblasť nemajú (napríklad prvé tri kroky zamestnancov).

Uverejňovať oblasti brány firewall na statické zoskupenie.

Teraz vstupujeme do dynamickej fázy. V tejto fáze sa vyhodnocujú vyššie uvedené statické oblasti. Oblasti, ktoré nepristupujú k žiadnym zdrojom údajov, sa oreezajú. Oblasti sa potom zoskupia a vytvoria sa zdrojové oblasti, ktoré sú čo možno najviac veľké. V tomto ukážkovom scenári však všetky zostávajúce oblasti získavajú prístup k zdrojom údajov a nie je možné vykonať žiadne ďalšie zoskupenia. Oblasti v našej vzorke sa preto počas tejto fázy nezmenia.

Predstierajme si, že

Len tak sa však pozrime na to, čo by sa stalo, keby dotaz Kontakty namiesto toho, aby pochádzal z textového súboru, bol v M pevne zakódovaný (možno prostredníctvom dialógového okna Zadať údaje ).

V tomto prípade dotaz Kontakty nebude mať prístup k žiadnym zdrojom údajov. Takto by sa počas prvej časti dynamickej fázy orezal.

Oblasť brány firewall po dynamickej fáze orezanie.

Keď by bola oblasť Kontakty odstránená, posledné dva kroky tabuľky Zamestnanci by už odkazovať na žiadne oblasti okrem oblasti obsahujúcej prvé tri kroky v časti Zamestnanci. Týmto spôsobom by sa tieto dve oblasti zoskupili.

Výsledná oblasť by vyzerala takto.

Finálne oblasti brány firewall.

Príklad: Prenesenie údajov z jedného zdroja údajov do iného

Dobre, dostatok abstraktné vysvetlenie. Pozrime sa na bežný scenár, v ktorom sa pravdepodobne vyskytne chyba brány firewall a postup na jej vyriešenie.

Predstavte si, že chcete vyhľadať názov spoločnosti zo služby Northwind OData a potom použiť názov spoločnosti na vykonanie vyhľadávania v Bingu.

Najprv vytvorte dotaz Company (Spoločnosť), ktorý načíta názov spoločnosti.

let
    Source = OData.Feed("https://services.odata.org/V4/Northwind/Northwind.svc/", null, [Implementation="2.0"]),
    Customers_table = Source{[Name="Customers",Signature="table"]}[Data],
    CHOPS = Customers_table{[CustomerID="CHOPS"]}[CompanyName]
in
    CHOPS

Potom vytvorte vyhľadávací dotaz, ktorý odkazuje na spoločnosť a odovzdá ho do Bingu.

let
    Source = Text.FromBinary(Web.Contents("https://www.bing.com/search?q=" & Company))
in
    Source

V tomto bode sa dostanete do problémov. Pri vyhodnocovaní vyhľadávania sa zobrazí chyba brány firewall.

Formula.Firewall: Query 'Search' (step 'Source') references other queries or steps, so it may not directly access a data source. Please rebuild this data combination.

Dôvodom je, že krok Source (Hľadať) v časti Search odkazuje na zdroj údajov (bing.com) a tiež na iný dotaz alebo oblasť (Company). Porušuje pravidlo uvedené vyššie ("oblasť môže buď pristupovať ku kompatibilným zdrojom údajov alebo odkazovať na iné oblasti, ale nie obe").

Čo robiť? Jednou z možností je úplne vypnúť bránu firewall (prostredníctvom možnosti Ochrana osobných údajov s označením Ignorovať úrovne ochrany osobných údajov a potenciálne zvýšiť výkon). Čo však v prípade, ak chcete ponechať bránu firewall povolenú?

Ak chcete vyriešiť chybu bez zakázania brány firewall, môžete skombinovať Company a Search do jedného dotazu, napríklad:

let
    Source = OData.Feed("https://services.odata.org/V4/Northwind/Northwind.svc/", null, [Implementation="2.0"]),
    Customers_table = Source{[Name="Customers",Signature="table"]}[Data],
    CHOPS = Customers_table{[CustomerID="CHOPS"]}[CompanyName],
    Search = Text.FromBinary(Web.Contents("https://www.bing.com/search?q=" & CHOPS))
in
    Search

Všetko sa teraz deje v rámci jednej oblasti. Za predpokladu, že úrovne ochrany osobných údajov pre dva zdroje údajov sú kompatibilné, brána firewall by mala byť teraz šťastná a nebudete sa viac zobrazovať chyba.

To je zalomenie

Aj keď sa toho dá v tejto téme povedať oveľa viac, tento úvodný článok je už dosť dlhý. Dúfame, že vám to pomohlo lepšie porozumieť bráne firewall a pomôže vám pochopiť a opraviť chyby brány firewall, keď sa s nimi v budúcnosti stretnete.