<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Alexander Vik</title>
  <subtitle>Information protection &amp; compliance · Microsoft 365</subtitle>
  <link href="https://alexandervik.net/feed.xml" rel="self" type="application/atom+xml"/>
  <link href="https://alexandervik.net/" rel="alternate" type="text/html"/>
  <updated>2026-09-21T07:00:00+00:00</updated>
  <id>https://alexandervik.net/</id>
  <author>
    <name>Alexander Vik</name>
  </author>
  <entry>
    <title>Microsoft Purview guards your data. Who guards your Purview?</title>
    <link href="https://alexandervik.net/posts/make-purview-tell-you-when-it-changes/" rel="alternate" type="text/html"/>
    <id>https://alexandervik.net/posts/make-purview-tell-you-when-it-changes/</id>
    <published>2026-09-21T07:00:00+00:00</published>
    <updated>2026-09-21T07:00:00+00:00</updated>
    <summary type="text">A DLP rule switched off. A label&apos;s permissions widened. A threshold moved from 10 to 15. Nothing alerts you — and the audit log never says what the value used to be.</summary>
    <content type="html">&lt;p&gt;Microsoft Purview is very good at telling you about your data.&lt;/p&gt;

&lt;p&gt;Where sensitive information lives. Who opened what. Which email was blocked, which file was labelled, which user tried to share a customer register externally. Content Explorer and Activity Explorer answer those questions well, and most organisations running Purview use them.&lt;/p&gt;

&lt;p&gt;What Purview will not tell you is anything about itself.&lt;/p&gt;

&lt;p&gt;If a DLP rule is switched off, you are not notified. If a sensitivity label’s permissions are narrowed, or widened, nothing alerts you. If a threshold is changed from ten to fifteen, the product carries on quietly enforcing fifteen.&lt;/p&gt;

&lt;p&gt;There is an audit log entry, somewhere, recording that a policy was modified. It will not tell you what the setting was before, whether anyone approved it, or whether the protection just became weaker.&lt;/p&gt;

&lt;p&gt;This article describes how to make Purview report on its own configuration — so that when something changes, you find out, and you can see exactly what changed from what.&lt;/p&gt;

&lt;p&gt;The approach is not new. Software engineering solved this problem decades ago. It has simply not been applied to compliance controls very often, and that is what I want to walk through.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;the-idea-in-one-paragraph&quot;&gt;The idea, in one paragraph&lt;/h2&gt;

&lt;p&gt;You write down what your configuration is supposed to be. You keep that description somewhere it cannot be quietly edited. On a schedule, something reads what the configuration actually is and compares the two.&lt;/p&gt;

&lt;p&gt;If they match, you get a record saying so. If they do not, you get a report saying exactly what differs.&lt;/p&gt;

&lt;p&gt;That is the entire mechanism. Everything below is about doing each part in a way you can rely on.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;part-one-turn-the-configuration-into-a-file&quot;&gt;Part one: turn the configuration into a file&lt;/h2&gt;

&lt;p&gt;The first step sounds strange if you have only ever managed Purview through the portal.&lt;/p&gt;

&lt;p&gt;Your policies, rules, labels and label policies can be read out of the tenant and expressed as a structured text file. Every DLP rule, every threshold, every permission on every label, every scope on every policy — written down as readable text.&lt;/p&gt;

&lt;p&gt;Here is roughly what a fragment of one looks like:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;DLPComplianceRule &quot;Low volume - policy tip&quot;
{
    Name     = &quot;Low volume - policy tip&quot;;
    MinCount = &quot;1&quot;;
    MaxCount = &quot;9&quot;;
    Ensure   = &quot;Present&quot;;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You do not need to be a developer to read that. A rule, its name, its instance thresholds, and a statement that it should exist.&lt;/p&gt;

&lt;p&gt;Once your configuration is a file, three things become possible that were not possible before.&lt;/p&gt;

&lt;p&gt;You can &lt;strong&gt;read&lt;/strong&gt; it — the whole of it, in one place, rather than clicking through twenty portal pages.&lt;/p&gt;

&lt;p&gt;You can &lt;strong&gt;compare&lt;/strong&gt; it — two files can be set side by side and every difference shown, line by line.&lt;/p&gt;

&lt;p&gt;And you can &lt;strong&gt;keep&lt;/strong&gt; it — a file can be stored, versioned and retained in a way that a screenshot cannot.&lt;/p&gt;

&lt;p&gt;The tooling that performs this export is open source and maintained with Microsoft engineers. It covers far more than Purview; for this purpose you point it at the compliance-related parts of the tenant only.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;part-two-make-it-the-approved-baseline&quot;&gt;Part two: make it the approved baseline&lt;/h2&gt;

&lt;p&gt;A file on someone’s laptop is not a baseline. It is a snapshot.&lt;/p&gt;

&lt;p&gt;What turns it into a baseline is that someone with authority has &lt;strong&gt;looked at it and agreed it is correct&lt;/strong&gt; — and that this agreement is recorded.&lt;/p&gt;

&lt;p&gt;In practice that means storing the file in a version-controlled repository, the same kind of system software teams use for source code. The important properties are simple:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Every version ever saved is kept. Nothing is overwritten&lt;/li&gt;
  &lt;li&gt;Every change records who made it, when, and a written reason&lt;/li&gt;
  &lt;li&gt;Changes can be required to pass through a review step before they are accepted&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last property is the one that matters for compliance. A written procedure saying &lt;em&gt;“changes are reviewed”&lt;/em&gt; is a claim an auditor has to sample and hope about. A repository that will not accept a change without a named reviewer’s approval is a control — and it records every single instance automatically.&lt;/p&gt;

&lt;div class=&quot;callout&quot;&gt;
  &lt;p&gt;&lt;span class=&quot;callout-title&quot;&gt;One to watch&lt;/span&gt;
&lt;strong&gt;The repository belongs to the customer.&lt;/strong&gt; Not to the consultant, not to the managed service provider. If the engagement ends, the organisation keeps its baseline, its full change history and its evidence. A monitoring arrangement that walks out the door with the supplier has not delivered anything durable.&lt;/p&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;part-three-read-the-live-configuration-on-a-schedule&quot;&gt;Part three: read the live configuration on a schedule&lt;/h2&gt;

&lt;p&gt;Now you need to find out what the configuration actually is — regularly, and without anyone having to remember to do it.&lt;/p&gt;

&lt;p&gt;That means an automated job that runs on a timetable, authenticates to the tenant, and performs the same export you did by hand in part one.&lt;/p&gt;

&lt;p&gt;Two design points here are worth more than the rest put together.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It has to run as a non-human identity.&lt;/strong&gt; A scheduled job at five in the morning has no person present to sign in. So it needs its own identity, with a credential it can use unattended. Get the credential handling wrong and you have created a highly privileged key that can rewrite your compliance configuration, stored somewhere it should not be. The credential belongs in a proper secrets store, fetched at run time and never written into the job itself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It has to read, and only read.&lt;/strong&gt; The identity needs enough access to see the compliance configuration and no more. How much access that actually is, and how it is granted, is less obvious than it should be — there are two separate permission layers involved, only one of which is visible in the place you would expect to find it.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;part-four-compare&quot;&gt;Part four: compare&lt;/h2&gt;

&lt;p&gt;With the approved baseline in one hand and the live export in the other, you compare them.&lt;/p&gt;

&lt;p&gt;The output is a &lt;strong&gt;diff&lt;/strong&gt; — a line-by-line account of what differs. It shows three kinds of change, and they look different from each other:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Something was added.&lt;/strong&gt; A new policy nobody approved:&lt;/p&gt;

&lt;div class=&quot;language-diff highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gi&quot;&gt;+   DLPCompliancePolicy &quot;New policy&quot;
+   {
+       Name = &quot;New policy&quot;;
+       Mode = &quot;Enable&quot;;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Something was modified.&lt;/strong&gt; The same property, with the old value and the new:&lt;/p&gt;

&lt;div class=&quot;language-diff highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gd&quot;&gt;-       MaxCount = &quot;9&quot;;
&lt;/span&gt;&lt;span class=&quot;gi&quot;&gt;+       MaxCount = &quot;5&quot;;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Something was removed.&lt;/strong&gt; A line that is simply gone, with nothing replacing it:&lt;/p&gt;

&lt;div class=&quot;language-diff highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gd&quot;&gt;-       ApplyContentMarkingFooterText = &quot;Internal working material&quot;;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;That third shape deserves attention. Nothing else in your environment will tell you what that footer text used to say. The portal shows the current state. The audit log records that the label was modified. &lt;strong&gt;The diff is the only record, anywhere, of the previous value.&lt;/strong&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;part-five-report&quot;&gt;Part five: report&lt;/h2&gt;

&lt;p&gt;A diff is for engineers. It is precise, fast, and nearly unreadable to anyone else.&lt;/p&gt;

&lt;p&gt;So the last step turns it into something a compliance owner can act on: a readable report of every deviation, what it changed from and to, and — critically — a place for a &lt;strong&gt;decision&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Every deviation should close with one of two outcomes:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Restored&lt;/strong&gt; — the tenant was wrong; the approved configuration was put back&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Adopted&lt;/strong&gt; — the change was legitimate; it is now the new approved state&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both are valid. What matters is that one of them is written down, by a named person, with a reason.&lt;/p&gt;

&lt;div class=&quot;callout&quot;&gt;
  &lt;p&gt;&lt;span class=&quot;callout-title&quot;&gt;One to watch&lt;/span&gt;
&lt;strong&gt;The system detects. It should never remediate on its own.&lt;/strong&gt; Automatically reverting drift sounds appealing and is almost always wrong for compliance controls. A change made for a good reason, silently undone, creates a new incident and a very unhappy administrator. The report goes to a human; the human decides.&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;The report runs every period, whether or not anything changed. The quiet months matter most — a dated record saying &lt;em&gt;compared, no deviations&lt;/em&gt; is evidence of continuous operation. A quiet month with nothing recorded is indistinguishable from a month nobody looked.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;where-this-goes-wrong&quot;&gt;Where this goes wrong&lt;/h2&gt;

&lt;p&gt;Building the mechanism is a fortnight’s work for a competent engineer. Making it trustworthy is most of the rest.&lt;/p&gt;

&lt;p&gt;The failure mode that matters is not a monitoring job that breaks. Broken jobs are obvious.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It is a monitoring job that reports success while checking nothing.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An export that silently misses part of the configuration produces a smaller file. A smaller file compares cleanly against the baseline. A clean comparison produces a clean report. Green light, no findings — and a control that was never actually read.&lt;/p&gt;

&lt;p&gt;There is a mirror-image failure too: a comparison that flags a difference that is not really there, because the same configuration is written out slightly differently from one run to the next. Leave that unexplained and it recurs every month, the report fills with noise, and a genuine change eventually drowns in it.&lt;/p&gt;

&lt;p&gt;I have seen both. Neither announces itself. Designing against them — knowing where the blind spots are and turning silent failures into loud ones — is the part that separates a monitoring service you can rely on from one that produces reassuring documents.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;what-you-end-up-with&quot;&gt;What you end up with&lt;/h2&gt;

&lt;p&gt;Put together, the approach answers the three questions any supervisory authority or auditor asks about a control:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;They ask&lt;/th&gt;
      &lt;th&gt;You show&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;What is the approved configuration?&lt;/td&gt;
      &lt;td&gt;The baseline file, and who approved it&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;What changed, and who approved each change?&lt;/td&gt;
      &lt;td&gt;The repository history — every change, author, date and reason&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Did it operate continuously?&lt;/td&gt;
      &lt;td&gt;A dated record of every scheduled comparison, and what each found&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;The first question is usually answerable today with some effort. The second rarely is. The third almost never is, because nothing was recording the months in which nothing happened.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;where-to-start&quot;&gt;Where to start&lt;/h2&gt;

&lt;p&gt;Not with the technology.&lt;/p&gt;

&lt;p&gt;Start with a decision about what your controls are supposed to be, and a named person accountable for that decision. The export, the repository and the schedule are the easy half.&lt;/p&gt;

&lt;p&gt;If you can say, today, &lt;em&gt;“this is our approved Purview configuration, and this is who signed it off”&lt;/em&gt; — you have a baseline. Everything else is making sure you find out when reality stops matching it.&lt;/p&gt;

&lt;p&gt;If you cannot, that is the first conversation to have.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;em&gt;AV works with information protection and compliance in Microsoft 365, with a focus on Swedish public sector organisations. If you would like to know what your Purview configuration actually looks like today — written down, in full, in one place — that is usually where we start.&lt;/em&gt;&lt;/p&gt;
</content>
    <category term="Purview"/>
    <category term="DLP"/>
    <category term="Compliance"/>
  </entry>
</feed>
