<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[OneLake Security]]></title><description><![CDATA[OneLake Security]]></description><link>https://overview-about-onelake-security.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Wed, 14 Oct 2026 14:59:12 GMT</lastBuildDate><atom:link href="https://overview-about-onelake-security.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Applying Fabric OneLake Security]]></title><description><![CDATA[1.  Executive Summary
In this blog, I expound more on my previous blog post called ‘Overview about OneLake Security’. In this post, I will provide a detailed demonstration of applying Object Level Security (OLS), Column Level Security (CLS), and Row ...]]></description><link>https://overview-about-onelake-security.hashnode.dev/applying-fabric-onelake-security</link><guid isPermaLink="true">https://overview-about-onelake-security.hashnode.dev/applying-fabric-onelake-security</guid><category><![CDATA[microsoftfabric]]></category><dc:creator><![CDATA[Yash Vardhan Vashistha]]></dc:creator><pubDate>Wed, 14 Jan 2026 21:58:06 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1768429310765/27282843-1729-4096-8ded-ac8006ffafdf.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="heading-1-executive-summary">1.  Executive Summary</h1>
<p>In this blog, I expound more on my previous blog post called <a target="_blank" href="https://overview-about-onelake-security.hashnode.dev/overview-about-onelake-security">‘Overview about OneLake Security’</a>. In this post, I will provide a detailed demonstration of applying Object Level Security (OLS), Column Level Security (CLS), and Row Level Security (RLS) in Fabric OneLake, as well as cover role testing and common errors you might run into.</p>
<p>Remember that OneLake security helps you to apply Role Based Access Controls (RBAC) to the data stored in OneLake. You will need to be either an Admin or a Member of the workspace to be able to create these security roles</p>
<h1 id="heading-2-preparing-the-data">2.  Preparing the Data</h1>
<p>Before I show you how to create the security roles, let us first start by creating a table with data in a Fabric Lakehouse.</p>
<h2 id="heading-21-adding-data-to-a-lakehouse">2.1.        Adding Data to a Lakehouse</h2>
<p>I have an excel file with different sheets containing data. For this demo, I will bring in data from one of the Excel Sheets and store it in a table called ‘Fact2’. I have already created a Lakehouse called LH_01 in a workspace called ‘Practice’. I, then, proceed to save the Excel Workbook in the LH_01 which was saved under the ‘Files’ section of the Lakehouse. I navigate to LH_01 and select Get Data and create a ‘New pipeline’. Follow along with the pictures below to create a new pipeline to get data from one of the sheets in the Excel Workbook and store it in a new table called ‘Fact2’.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768425169438/fc7b0477-0cde-49fd-a7df-d9a042995e74.png" alt class="image--center mx-auto" /></p>
<p>I select the Lakehouse I created previously called LH_01.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768425315258/5cec0790-a7f9-4808-be38-e774c053c8aa.png" alt class="image--center mx-auto" /></p>
<p>I select the option to load the data from the Files section of the Lakehouse and select the Excel Sheet called ‘Sheet1 2020’ to load the data into a new table.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768425372075/6bffc0ec-8fc1-45aa-b555-622191776fd5.png" alt class="image--center mx-auto" /></p>
<p>Before loading in the data to a new table, we also have an option to correctly map the columns with the data type we expect them to store and name the new table created. For instance, I make sure that my Year, Quarter and Month columns are saved as integers, and the table is called ‘Fact2’.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768425424579/648c748b-bb3f-47f4-86f2-069b046b1d75.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768425490270/a9621d37-dae4-41e3-89eb-2766e56858f4.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768425498212/4d0eb0bd-cf55-44a0-a018-9217f7eef765.png" alt class="image--center mx-auto" /></p>
<p>After the pipeline has been created, it will kick off and after waiting for bit, should succeed in pulling in all the data in ‘Fact2’.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768425545855/8b4d5e13-9dc3-4c26-a533-c2bc6cf60087.png" alt class="image--center mx-auto" /></p>
<p>After the pipeline successfully runs, you will notice a new table in LH_01 called ‘Fact2’.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768425588734/43aa3a08-39ea-4627-85e6-222413a99a1a.png" alt class="image--center mx-auto" /></p>
<h1 id="heading-3-creating-roles">3.  Creating Roles</h1>
<p>You can create roles in OneLake by navigating to the Lakehouse (in our case LH_01) and clicking on the ellipsis (3 dots) on the top right of the Home ribbon and selecting ‘Manage OneLake security (preview)’ which will open a sidebar window containing a single role called DefaultReader by default. Click on ‘New’ to create a new role.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768425658714/98464474-5e46-42fc-bed3-ded7aa63dbf9.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-31-creating-object-level-security-ols">3.1.        Creating Object Level Security (OLS)</h2>
<p>OneLake security, which at the time of writing this post is still in preview, provides the ability to create object level security roles which can be used to secure specific tables or folders.</p>
<p>After clicking ‘New’ I get an option to define a new role the details for which you can see below. In the option to add data, I select the Fact2 table we created above.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768425707389/0f63e238-94f2-44f5-8bf9-1091a8ba657f.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768425733506/f518ae38-51ac-4621-a238-c630e05ffddd.png" alt class="image--center mx-auto" /></p>
<p>During the role creation, you can also preview what the user will potentially see using the ‘Data preview’ tab. As you can see, the users belonging this role will only be able to access Fact2. Even though we selected only one table for demonstration, you can select up to 500 individual items. Similarly, if there are certain files you want to secure which may be housed under folders, you can choose to secure those as well.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768425810911/0e7aead1-383a-440c-afdc-b1677baedebb.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-311-testing-ols">3.1.1.             Testing OLS</h3>
<p>Now that we have created a role for OLS which gives the user the ability to read the table ‘Fact2’, I wanted to show you how you can test if the role is working. You can test the roles a couple of different ways, for example, trying to run a query on a Fabric Notebook, using Power BI report, etc. I'll demonstrate how the roles work using a Power BI report, which also lets me view the data at the same time.</p>
<p>In order to test the roles and visualize the data, I create a Fabric Semantic Model called ‘SM_01’ and add Fact2 to the model.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768425875871/14ed3c80-3294-4a7c-9fe5-c3c6af13a5fe.png" alt class="image--center mx-auto" /></p>
<p>Next, I open a blank Power BI report, sign in and connect to SM_01 which shows me only 1 table indicating that the role is working.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768425975373/e55298ef-f79e-426d-a7c9-91d3f006c02a.png" alt class="image--center mx-auto" /></p>
<p>Below is another image where you can see that I am to read all the data from Fact2 in Power BI.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768426056522/663fd5e6-e998-407d-ba3b-529320b3f37a.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-32-creating-column-level-security-cls">3.2.        Creating Column Level Security (CLS)</h2>
<p>CLS allows you to define access to specific columns in a table stored in OneLake instead of providing full access to a table like we saw above. Microsoft, in their official documentation, does highlight an important point where they underscore the importance of using ‘Fabric Engines’ (for example, Lakehouse, Power BI engine, Spark engine, etc.) for the CLS to work. Using CLS with ‘non-Fabric engines’ (for example, third party engines like Hadoop clusters, or custom Python or R scripts) will result in the entire table blocked from being read. Furthermore, CLS rules will be enforced only for users with the ‘Viewer’ role in the workspace.</p>
<p>Next, let us create a CLS role in a similar fashion like OLS where we select ‘New’ and create a new role, in my case I named it CLSFact2 as I want to restrict a few columns from Fact2 table we created earlier.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768426108281/440589cd-5baf-4fca-a183-91656e2f66c0.png" alt class="image--center mx-auto" /></p>
<p>After creating the above role, click on the role details (ellipsis or 3 dots) next to the role we just created and select ‘Column Security’. I decided to restrict two columns from ‘Fact2’.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768426278597/48b23fb2-b928-4c33-8cb0-861894ce7baf.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-321-note-on-sql-analytics-endpoint">3.2.1.             Note on SQL Analytics Endpoint</h3>
<p>Microsoft mentions in their documentation a few extra steps the user will need to take to make sure that users querying data via SQL only see the data they are authorized to access, maintaining compliance and protecting sensitive information. It integrates OneLake’s role-based access controls with the SQL interface, so permissions defined in OneLake apply consistently across all query methods.</p>
<p>When you enable this setting, SQL queries executed through the analytics endpoint will respect OneLake’s security rules (RLS, CLS, etc.).</p>
<p>Here is where you can find clear steps on how to enable OneLake security with SQL analytics endpoint - <a target="_blank" href="https://learn.microsoft.com/en-us/fabric/onelake/security/column-level-security#enable-onelake-security-for-sql-analytics-endpoint">Column-level security - Microsoft Fabric | Microsoft Learn</a></p>
<h3 id="heading-322-testing-cls">3.2.2.             Testing CLS</h3>
<p>In order to test the CLS we created above which restricts the user from querying two specific columns – Offering and S-Ind, similar to OLS, I add the test user called ‘Fabric User’ to the role.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768426470691/de4e129b-7a75-41b0-9b51-4ca73966c117.png" alt class="image--center mx-auto" /></p>
<p>Next, I navigate to my Power BI report and hit ‘Refresh’ on the Home ribbon to make sure that the changes I made to the role reflect in the report. Upon refreshing, I notice that I cannot read the two columns we removed from the role – Offering and S-Ind, see the image below.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768426576816/2834d1d2-c969-4d18-87c1-1ccdf050afb6.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-33-creating-row-level-security-rls">3.3.        Creating Row Level Security (RLS)</h2>
<p>Till now we have covered OLS and CLS which can secure files, tables or columns in your dataset. However, if we wish to restrict only certain rows of data, for example, only allowing employees working in North America to see data for their geography and not for the entire globe, we will need to implement RLS which is a feature of OneLake security that allows defining row level restrictions for ‘tabular’ data where each row corresponds to a single record (e.g., a transaction or an entry), and each column represents a specific attribute or field (e.g., date, amount, region).</p>
<p>Similar to CLS, Microsoft differentiates between Fabric and non-Fabric engines where RLS applies to only ‘Fabric engines’ and will block the entire table for ‘non-Fabric engines’. Similarly, RLS rules will be enforced only for users with the ‘Viewer’ role in the workspace.</p>
<p>Below I create a new role called ‘RLSFact2’ and select Fact2 table as I need to add RLS to that table.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768426655324/f0607c38-a481-4d32-b8af-eeece637c210.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768426761040/52966545-6cc1-4aa1-b1dc-1a83b4fa07df.png" alt class="image--center mx-auto" /></p>
<p>RLS uses SQL syntax to define the security that needs to be applied. It takes the form of a ‘SELECT’ statement with RLS rules defined in the ‘WHERE’ clause of the statement. Since, defining incorrect or unsupported SQL will result in the entire table being restricted, it is a good idea to take a look at the correct way of defining the rules.</p>
<p><strong><em>SELECT \</em> FROM {schema_name}.{table_name} WHERE {column_level_boolean_1}{column_level_boolean_2}...{column_level_boolean_N}*</strong></p>
<p>In our example, I define a simple rule –</p>
<p><strong><em>SELECT \</em> FROM dbo.Fact2 WHERE Month = 7*</strong></p>
<p>The above rule will restrict the user to only query data for July, i.e. where month number equals 7.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768426799028/7f9c1dc7-761f-4817-8bb2-8cc055f7af54.png" alt class="image--center mx-auto" /></p>
<p>It is a good idea to go through all the syntax rules once before creating your first role here - <a target="_blank" href="https://learn.microsoft.com/en-us/fabric/onelake/security/row-level-security#syntax-rules">Row-level security - Microsoft Fabric | Microsoft Learn</a></p>
<h3 id="heading-331-testing-rls">3.3.1.             Testing RLS</h3>
<p>Next, we test the role we created above. The first thing we must do is add our test user to the RLSFact2 role.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768427133060/d9f05b29-bbd5-4443-a90e-32136d73d3cb.png" alt class="image--center mx-auto" /></p>
<p>Next, I refresh my Power BI report again to ensure that the changes we made reflect in Power BI. After refreshing I can see the columns that were removed from the CLSFact2 and can now only read data where Month=7. Look at the image below.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768427208474/4ebc4aaf-99bb-453b-aeff-d00d81f35c78.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-34-combining-rls-and-cls">3.4.        Combining RLS and CLS</h2>
<p>There will be scenarios where you might want to apply both CLS and RLS together to ensure that sensitive columns and out-of-access rows can be restricted for users. Using our test data, I can create a security role to combine both CLS and RLS together where I can restrict two columns – say, ‘Offering’ and ‘S-Ind’ using CLS and also restrict the users from accessing data for Q4 using RLS. I can achieve this by creating a ‘SINGLE’ role that incorporates both these rules together. Note the emphasis on ‘single’ as Microsoft mentions that if you want to restrict access using both CLS and RLS, you shall only use a single role to define both CLS and RLS. This is because “OneLake security doesn't support the combination of two or more roles where one contains RLS rules and another contains CLS rules.”</p>
<p>Below I create a single role called ‘CLSRLSFact’ to secure Fact table that I originally created. After I create the role, I click on more details and start defining CLS and RLS for that role. For CLS, I will remove access to ‘Offering’ and ‘S-Ind’ and for RLS, I will restrict the user from access Q4 data by applying a filter on ‘Quarter’ column.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768427352152/8750e09e-ad95-4f51-9f28-58e47fe38e10.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768427382697/56e94045-28bd-4304-b491-7ab86afe9da8.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-341-testing-cls-and-rls">3.4.1.             Testing CLS and RLS</h3>
<p>Finally, we test how RLS and CLS work together. However, before I test the CLSRLSFact role, which contains both CLS and RLS in a single role, I wanted to highlight how querying data from the table will fail if you create ‘SEPARATE’ roles for CLS and RLS. Since, we have separate roles created for CLS and RLS and have our test user included in both, when I try to visualize data by creating a simple table in Power BI, I receive an error indicating that a combination of CLS and RLS is not supported. I wanted to showcase this special case in case you run into this error and are scratching your head thinking why the roles are not working.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768427575083/9b040ffc-4683-4bc7-ad1f-9bfad6169fbd.png" alt class="image--center mx-auto" /></p>
<p>To correct this error, I remove the test user from both CLS and RLS roles and add them to the new CLSRLSFact role.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768427605686/9ae0bae4-569c-45ac-a0af-8781ce4760e2.png" alt class="image--center mx-auto" /></p>
<p>After I hit refresh on my Power BI report, and test CLS and RLS together, I can now see the table working. Moreover, I can not see the two columns we omitted – Offering and S-Ind and I also cannot see the data for Quarter 4 indicating that our combination of RLS and CLS is working as expected when defined in a single role.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768427701928/d4f69e98-d68a-4089-b022-9bb570803603.png" alt class="image--center mx-auto" /></p>
]]></content:encoded></item><item><title><![CDATA[Overview about OneLake Security]]></title><description><![CDATA[1. Executive Summary
OneLake Security, is a critical component of Microsoft Fabric that enables granular, role-based access control (RBAC) to data stored within OneLake. It allows organizations to define precise permissions for users and groups, ensu...]]></description><link>https://overview-about-onelake-security.hashnode.dev/overview-about-onelake-security</link><guid isPermaLink="true">https://overview-about-onelake-security.hashnode.dev/overview-about-onelake-security</guid><category><![CDATA[microsoftfabric]]></category><dc:creator><![CDATA[Yash Vardhan Vashistha]]></dc:creator><pubDate>Tue, 06 Jan 2026 16:53:47 GMT</pubDate><content:encoded><![CDATA[<h1 id="heading-1-executive-summary">1. Executive Summary</h1>
<p>OneLake Security, is a critical component of Microsoft Fabric that enables granular, role-based access control (RBAC) to data stored within OneLake. It allows organizations to define precise permissions for users and groups, ensuring data confidentiality and integrity across various compute engines. This post outlines the key features of OneLake security, including its hierarchical model, different permission types (Workspace, Item, Compute, and OneLake specific), and detailed explanations of Column-Level Security (CLS), Row-Level Security (RLS), and Table/Folder-Level Security (OLS). It also covers inheritance, traversal, shortcut security, authentication, and current limitations.</p>
<h1 id="heading-2-core-concepts-of-onelake-security">2. Core Concepts of OneLake Security</h1>
<p>OneLake is designed as a hierarchical data lake, similar to ADLS Gen2 or a standard file system. Security can be applied at various levels within this hierarchy, with specific treatment for levels correlating with Fabric concepts.</p>
<h2 id="heading-21-hierarchical-security-model">2.1. Hierarchical Security Model</h2>
<p>The security structure within OneLake can be visualized as:</p>
<ul>
<li><p><strong>Workspace</strong>: "a collaborative environment for creating and managing items."</p>
</li>
<li><p><strong>Item</strong>: "a set of capabilities bundled together into a single component. A data item is a subtype of item that allows data to be stored within it using OneLake."</p>
</li>
<li><p><strong>Folders</strong>: "folders within an item that are used for storing and managing data."</p>
</li>
</ul>
<p>OneLake security inherently controls all access to OneLake data, with permissions potentially inherited from parent items or workspace permissions.</p>
<h2 id="heading-22-permission-types-in-onelake">2.2. Permission Types in OneLake</h2>
<h3 id="heading-221-workspace-permissions">2.2.1. Workspace Permissions</h3>
<p>Workspace permissions provide "coarse-grain" access control to all items within a workspace. There are four roles:</p>
<ul>
<li><p><strong>Admin</strong>: Full control, can add other Admins and Members, write data, create items, and read data.</p>
</li>
<li><p><strong>Member</strong>: Can add Members, write data, create items, and read data.</p>
</li>
<li><p><strong>Contributor</strong>: Can write data, create items, and read data.</p>
</li>
<li><p><strong>Viewer</strong>: Can only read data. By default, Viewers cannot see files in OneLake unless OneLake security is used to grant access.</p>
</li>
</ul>
<p><strong>Important Note</strong>: <strong>"Since Workspace Admin, Member and Contributor roles automatically grant Write permissions to OneLake, they override any OneLake security Read permissions." OneLake security RBAC Read permissions <em>only</em> apply to the Viewer role</strong>.</p>
<h3 id="heading-222-item-permissions">2.2.2. Item Permissions</h3>
<p>Item permissions are granted directly to a user via the sharing feature or an item's "Manage permissions" page, without making them a workspace member. They control access to the specific item and its endpoints. Key item permissions include:</p>
<ul>
<li><p><strong>Read</strong>: See item metadata, but no data in SQL or OneLake.</p>
</li>
<li><p><strong>ReadData</strong>: See data in SQL, but not in OneLake.</p>
</li>
<li><p><strong>ReadAll</strong>: See data in OneLake (with caveats for OneLake security enabled items).</p>
</li>
</ul>
<h3 id="heading-223-compute-permissions">2.2.3. Compute Permissions</h3>
<p>Access can also be granted through the SQL compute engine. This "only applies to users accessing data through SQL, but you can use this security to give more selective access to certain users." SQL supports restricting access to specific tables and schemas, as well as row and column level security.</p>
<p><strong>Crucial Point on Mismatch</strong>: "Users might see different results when they access data through SQL compared to when they access data directly in OneLake, depending on the compute permissions applied. To prevent this mismatch, ensure that a user's item permissions are configured to only grant them access to either the SQL analytics endpoint (using ReadData) or OneLake (using ReadAll or data access roles (preview))."</p>
<h3 id="heading-224-onelake-security-preview">2.2.4. OneLake Security (Preview)</h3>
<p>OneLake security "allows users to define granular role-based security to data stored in OneLake, and enforce that security consistently across all compute engines in Fabric." It's an evolution of the "OneLake data access roles (preview)" feature. Key components of a OneLake security role include:</p>
<ul>
<li><p><strong>Data</strong>: Tables or folders accessible.</p>
</li>
<li><p><strong>Permission</strong>: Actions allowed on the data.</p>
</li>
<li><p><strong>Members</strong>: Users assigned to the role.</p>
</li>
<li><p><strong>Constraints</strong>: Specific rows or columns excluded from access (e.g., RLS, CLS).</p>
</li>
</ul>
<p>"Users that aren't part of a role can't see any data in that lakehouse."</p>
<h1 id="heading-3-granular-data-access-control-features">3. Granular Data Access Control Features</h1>
<p>OneLake Security offers sophisticated controls for defining precise data access.</p>
<h2 id="heading-31-column-level-security-cls">3.1. Column-Level Security (CLS)</h2>
<p>CLS allows users to "have access to selected columns in a table instead of full access to the table." Any columns removed from a user's allowed list are not visible.</p>
<h3 id="heading-311-enforcement">3.1.1. Enforcement:</h3>
<ul>
<li><p><strong>Filtered tables in Fabric engines</strong>: Users only see allowed columns in Spark notebooks, SQL analytics endpoint, and Semantic models.</p>
</li>
<li><p><strong>Blocked access to tables</strong>: Tables with CLS rules cannot be read outside supported Fabric engines.</p>
</li>
<li><p><strong>Scope</strong>: CLS rules are only enforced for Delta parquet tables. For non-Delta tables, CLS rules block access to the entire table.</p>
</li>
</ul>
<h3 id="heading-312-definition">3.1.2. Definition:</h3>
<ul>
<li><p>Defined as part of a OneLake security role for Delta-parquet tables in the <strong>Tables</strong> section of an artifact.</p>
</li>
<li><p>By default, CLS is disabled, granting access to all columns. Users enable CLS and "remove columns from the list to revoke access."</p>
</li>
<li><p><strong>Important</strong>: "Removing access to a column doesn't deny access to that column if another role grants access to it."</p>
</li>
</ul>
<h2 id="heading-32-row-level-security-rls">3.2. Row-Level Security (RLS)</h2>
<p>RLS "allows for defining row-level data restrictions for tabular data stored in OneLake." It enables defining roles with rules for filtering data rows.</p>
<h3 id="heading-321-enforcement">3.2.1. Enforcement:</h3>
<ul>
<li><p><strong>Filtered tables in Fabric engines</strong>: Users only see allowed rows in supported Fabric engines (e.g., Spark notebooks).</p>
</li>
<li><p><strong>Blocked access to tables</strong>: Tables with RLS rules cannot be read outside supported Fabric engines.</p>
</li>
<li><p><strong>Scope</strong>: RLS rules are only enforced for Delta parquet tables. For non-Delta tables, RLS rules block access to the entire table.</p>
</li>
</ul>
<h3 id="heading-322-definition">3.2.2. Definition:</h3>
<ul>
<li><p>RLS rules use SQL syntax within a WHERE clause of a SELECT statement to specify which rows a user can see.</p>
</li>
<li><p>Example: SELECT * FROM Sales WHERE Amount&gt;'50000' AND State='CA'</p>
</li>
<li><p>Maximum RLS rule length: 1000 characters.</p>
</li>
<li><p>Supported operators include =, &lt;&gt;, &gt;, &gt;=, &lt;, &lt;=, IN, NOT, AND, OR, TRUE, FALSE, BLANK, NULL.</p>
</li>
</ul>
<h2 id="heading-33-table-and-folder-security-object-level-security-ols">3.3. Table and Folder Security (Object-Level Security - OLS)</h2>
<p>OLS "allows for granting access to specific tables or folders in a data item." This enables permissions for both structured and unstructured data at the folder level.</p>
<ul>
<li><p>Security can be configured on Delta-parquet tables (which are represented as folders) and schemas.</p>
</li>
<li><p>Users select specific tables or folders to include in a OneLake security role. "You can select up to 500 items per role."</p>
</li>
</ul>
<h2 id="heading-34-combining-rls-and-cls">3.4. Combining RLS and CLS</h2>
<p>RLS and CLS can be used together to restrict user access to a table, but they <strong>must be applied using a single OneLake security role</strong>.</p>
<ul>
<li><p>"OneLake security doesn't support the combination of two or more roles where one contains RLS rules and another contains CLS rules." Users attempting this "receive query errors."</p>
</li>
<li><p><strong>Single Role</strong>: RLS and CLS rules compose as filters on the full schema and data. For example, if a user has access to Table1 with Column1 removed (CLS) and Column2 = "US" (RLS), they will see all columns except Column1 and only rows where Column2 is "US".</p>
</li>
<li><p><strong>Multiple Roles</strong>: For RLS and CLS across multiple roles, "the security combines through a union of each category." This means if one role grants full column access, and another restricts a column, the user gets full access. Similarly, RLS rules combine with an OR between SQL statements, so full table access in one role results in all rows being visible.</p>
</li>
<li><p><strong>Important</strong>: "If two roles combine such that the columns and rows aren't aligned across the queries, access is blocked to ensure that no data is leaked to the end user."</p>
</li>
</ul>
<h1 id="heading-4-inheritance-traversal-and-shortcuts">4. Inheritance, Traversal, and Shortcuts</h1>
<h2 id="heading-41-inheritance-in-onelake-security">4.1. Inheritance in OneLake Security</h2>
<p>"For any given folder, OneLake security permissions always inherit to the entire hierarchy of the folder's files and subfolders." If Role1 grants read permission to folder1, it automatically applies to all files and subfolders within folder1.</p>
<h2 id="heading-42-traversal-and-listing-in-onelake-security">4.2. Traversal and Listing in OneLake Security</h2>
<p>OneLake security "provides automatic traversal of parent items to ensure that data is easy to discover." Granting read permissions to a subfolder (e.g., subfolder11) implicitly grants the ability to list and traverse its parent directory (folder1). This traversal does not extend to other unrelated items, keeping them secure.</p>
<h2 id="heading-43-shortcut-security">4.3. Shortcut Security</h2>
<p>Shortcuts simplify data management in OneLake.</p>
<ul>
<li><p><strong>Internal Shortcuts (within OneLake)</strong>: Permissions always inherit to internal shortcuts where the target folder is defined. Access to data through an internal shortcut is authorized by the calling user's identity against the target path's permissions.</p>
</li>
<li><p><strong>Caveat for Power BI semantic models or T-SQL</strong>: "the calling user's identity isn't passed through to the shortcut target. The calling item owner's identity is passed instead, delegating access to the calling user."</p>
</li>
<li><p>Defining OneLake security permissions <em>directly on</em> an internal shortcut is not allowed; they must be defined on the target folder in the target item (currently only Lakehouse supports this).</p>
</li>
<li><p><strong>External Shortcuts (ADLS, S3, Dataverse)</strong>: OneLake supports defining permissions for these shortcuts. These permissions are applied <em>on top of</em> the delegated authorization model. Both the external connection's authorization (e.g., S3 connection for user1) and OneLake security's authorization (for requesting user2) must grant access for user2 to see the data.</p>
</li>
<li><p>Permissions set on a folder within an external shortcut recursively inherit to all subfolders.</p>
</li>
</ul>
<h1 id="heading-5-authentication-audit-encryption-and-networking">5. Authentication, Audit, Encryption, and Networking</h1>
<h2 id="heading-51-authentication">5.1. Authentication</h2>
<p>OneLake uses <strong>Microsoft Entra ID</strong> for authentication, supporting user identities and service principals. OneLake automatically extracts the user identity from tools using Microsoft Entra authentication and maps it to Fabric portal permissions.</p>
<h2 id="heading-52-audit-logs">5.2. Audit Logs</h2>
<p>OneLake audit logs track user activities, with operation names corresponding to ADLS APIs (e.g., CreateFile, DeleteFile). However, "OneLake audit logs don't include read requests or requests made to OneLake via Fabric workloads."</p>
<h2 id="heading-53-encryption-and-networking">5.3. Encryption and Networking</h2>
<ul>
<li><p><strong>Data at Rest</strong>: Data in OneLake is "encrypted at rest by default using Microsoft-managed keys." This is transparent, rotated appropriately, and FIPS 140-2 compliant. Customer-managed keys are not currently supported.</p>
</li>
<li><p><strong>Data in Transit</strong>: Data moving across the public internet between Microsoft services is "always encrypted with at least TLS 1.2" (preferring TLS 1.3). Traffic between Microsoft services routes over the Microsoft global network. Inbound OneLake communication also enforces TLS 1.2+. Outbound Fabric communication to customer-owned infrastructure prefers secure protocols but may fall back to older, insecure ones.</p>
</li>
<li><p><strong>Private Links</strong>: Supported for configuring private links in Fabric.</p>
</li>
</ul>
<h2 id="heading-54-external-application-access">5.4. External Application Access</h2>
<p>Admins can enable or restrict access to OneLake data from applications outside the Fabric environment through a tenant setting. When enabled, users can access data from sources like custom ADLS APIs or OneLake file explorer. When disabled, users can still access data from internal Fabric apps (Spark, Data Engineering, Data Warehouse) but not external applications.</p>
]]></content:encoded></item></channel></rss>