<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Scoping a role on choudoufu</title><link>https://intentius.io/choudoufu/docs/governance/</link><description>Recent content in Scoping a role on choudoufu</description><generator>Hugo</generator><language>en</language><atom:link href="https://intentius.io/choudoufu/docs/governance/index.xml" rel="self" type="application/rss+xml"/><item><title>How to scope a role to an estate</title><link>https://intentius.io/choudoufu/docs/governance/scope-a-role/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://intentius.io/choudoufu/docs/governance/scope-a-role/</guid><description>&lt;h1 id="how-to-scope-a-role-to-an-estate"&gt;How to scope a role to an estate&lt;a class="anchor" href="#how-to-scope-a-role-to-an-estate"&gt;#&lt;/a&gt;&lt;/h1&gt;&#10;&lt;h2 id="the-whole-estate"&gt;The whole estate&lt;a class="anchor" href="#the-whole-estate"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;Two statements, because creating and mutating are conditioned by different&#10;keys.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;Version&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;2012-10-17&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;Statement&amp;#34;&lt;/span&gt;: [&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;Sid&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;MutateOnlyThisEstate&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;Effect&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Allow&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;Action&amp;#34;&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#34;ec2:CreateTags&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;ec2:DeleteTags&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;ec2:TerminateInstances&amp;#34;&lt;/span&gt;],&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;Resource&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;*&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;Condition&amp;#34;&lt;/span&gt;: {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;StringEquals&amp;#34;&lt;/span&gt;: {&lt;span style="color:#f92672"&gt;&amp;#34;aws:ResourceTag/tofu-estate&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;prod-networking&amp;#34;&lt;/span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;Sid&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;CreateOnlyIntoThisEstate&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;Effect&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Allow&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;Action&amp;#34;&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#34;ec2:RunInstances&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;ec2:CreateTags&amp;#34;&lt;/span&gt;],&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;Resource&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;*&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;Condition&amp;#34;&lt;/span&gt;: {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;StringEquals&amp;#34;&lt;/span&gt;: {&lt;span style="color:#f92672"&gt;&amp;#34;aws:RequestTag/tofu-estate&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;prod-networking&amp;#34;&lt;/span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;aws:ResourceTag&lt;/code&gt; reads a tag off a resource that already exists,&#10;so it governs everything the estate acts on. It cannot govern a create, because&#10;no resource exists yet to carry the tag. What the creating principal supplies is&#10;&lt;code&gt;aws:RequestTag&lt;/code&gt;, and conditioning on that is what makes the second&#10;statement a grant to create into this estate rather than a grant to create&#10;anything.&lt;/p&gt;</description></item><item><title>How to stop a staging role reaching production</title><link>https://intentius.io/choudoufu/docs/governance/blast-radius/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://intentius.io/choudoufu/docs/governance/blast-radius/</guid><description>&lt;h1 id="how-to-stop-a-staging-role-reaching-production"&gt;How to stop a staging role reaching production&lt;a class="anchor" href="#how-to-stop-a-staging-role-reaching-production"&gt;#&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;Pointing a staging configuration at a production account is a familiar outage.&#10;Nothing structurally prevents it today, because it is the same principal making&#10;the same API calls either way. IAM has nothing to tell the two runs apart.&lt;/p&gt;&#10;&lt;p&gt;Markers give it something to tell them apart by.&lt;/p&gt;&#10;&lt;h2 id="the-policy"&gt;The policy&lt;a class="anchor" href="#the-policy"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;Attach this to the role your staging runs use.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;Sid&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;NeverMutateAnotherEstate&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;Effect&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Deny&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;Action&amp;#34;&lt;/span&gt;: [&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;ec2:TerminateInstances&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;ec2:DeleteSubnet&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;ec2:DeleteVpc&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;rds:DeleteDBInstance&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ],&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;Resource&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;*&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;Condition&amp;#34;&lt;/span&gt;: {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;StringNotEquals&amp;#34;&lt;/span&gt;: {&lt;span style="color:#f92672"&gt;&amp;#34;aws:ResourceTag/tofu-estate&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;staging&amp;#34;&lt;/span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A mistake now fails at the cloud rather than at review. The guardrail sits&#10;below the tool, so it holds whatever the tool was pointed at, whatever&#10;directory someone was standing in, and whatever the plan said.&lt;/p&gt;</description></item><item><title>How to cover every team with one policy</title><link>https://intentius.io/choudoufu/docs/governance/abac/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://intentius.io/choudoufu/docs/governance/abac/</guid><description>&lt;h1 id="how-to-cover-every-team-with-one-policy"&gt;How to cover every team with one policy&lt;a class="anchor" href="#how-to-cover-every-team-with-one-policy"&gt;#&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;This is attribute-based access control, ABAC, applied to the resources your&#10;configuration manages.&lt;/p&gt;&#10;&lt;p&gt;A policy per team is a policy set that grows with the org chart and drifts&#10;between its members. ABAC exists to avoid that, and it needs an attribute on&#10;the resource to match against. Markers are one, written on every resource the&#10;estate manages rather than applied by a convention someone has to remember.&lt;/p&gt;</description></item><item><title>How to deny creating anything unowned</title><link>https://intentius.io/choudoufu/docs/governance/unowned/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://intentius.io/choudoufu/docs/governance/unowned/</guid><description>&lt;h1 id="how-to-deny-creating-anything-unowned"&gt;How to deny creating anything unowned&lt;a class="anchor" href="#how-to-deny-creating-anything-unowned"&gt;#&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;Tag compliance is normally retroactive. A scanner finds untagged resources, a&#10;ticket asks someone to explain them, and the backlog never empties because new&#10;ones arrive faster than old ones are resolved.&lt;/p&gt;&#10;&lt;p&gt;Conditioning creation inverts it. Ownership stops being something a resource&#10;acquires later and becomes a precondition of existing.&lt;/p&gt;&#10;&lt;h2 id="the-policy"&gt;The policy&lt;a class="anchor" href="#the-policy"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;As a service control policy, applied to the accounts that hold estates.&lt;/p&gt;</description></item><item><title>Where AWS honours the condition</title><link>https://intentius.io/choudoufu/docs/governance/reach/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://intentius.io/choudoufu/docs/governance/reach/</guid><description>&lt;h1 id="where-aws-honours-the-condition"&gt;Where AWS honours the condition&lt;a class="anchor" href="#where-aws-honours-the-condition"&gt;#&lt;/a&gt;&lt;/h1&gt;&#10;&lt;h2 id="where-the-key-is-confirmed"&gt;Where the key is confirmed&lt;a class="anchor" href="#where-the-key-is-confirmed"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;17 of 180 services in AWS&amp;rsquo;s Service&#10;Authorization Reference name &lt;code&gt;aws:ResourceTag&lt;/code&gt; on their tagging&#10;action. That is a lower bound. The reference is authoritative about what it&#10;names and silent about what it omits, and AWS documents tag-based&#10;authorization for services it says nothing about, Lambda among them.&lt;/p&gt;&#10;&lt;table&gt;&#10;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Service&lt;/th&gt;&lt;th&gt;IAM prefix&lt;/th&gt;&lt;th&gt;Actions naming it&lt;/th&gt;&lt;th&gt;Of total&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&#10;&lt;tbody&gt;&#10;&lt;tr&gt;&lt;td&gt;EC2&lt;/td&gt;&lt;td&gt;&lt;code&gt;ec2&lt;/code&gt;&lt;/td&gt;&lt;td&gt;495&lt;/td&gt;&lt;td&gt;793&lt;/td&gt;&lt;/tr&gt;&#10;&lt;tr&gt;&lt;td&gt;ResilienceHub&lt;/td&gt;&lt;td&gt;&lt;code&gt;resiliencehub&lt;/code&gt;&lt;/td&gt;&lt;td&gt;57&lt;/td&gt;&lt;td&gt;128&lt;/td&gt;&lt;/tr&gt;&#10;&lt;tr&gt;&lt;td&gt;SES&lt;/td&gt;&lt;td&gt;&lt;code&gt;ses&lt;/code&gt;&lt;/td&gt;&lt;td&gt;48&lt;/td&gt;&lt;td&gt;228&lt;/td&gt;&lt;/tr&gt;&#10;&lt;tr&gt;&lt;td&gt;AutoScaling&lt;/td&gt;&lt;td&gt;&lt;code&gt;autoscaling&lt;/code&gt;&lt;/td&gt;&lt;td&gt;42&lt;/td&gt;&lt;td&gt;68&lt;/td&gt;&lt;/tr&gt;&#10;&lt;tr&gt;&lt;td&gt;ECS&lt;/td&gt;&lt;td&gt;&lt;code&gt;ecs&lt;/code&gt;&lt;/td&gt;&lt;td&gt;37&lt;/td&gt;&lt;td&gt;81&lt;/td&gt;&lt;/tr&gt;&#10;&lt;tr&gt;&lt;td&gt;Kinesis&lt;/td&gt;&lt;td&gt;&lt;code&gt;kinesis&lt;/code&gt;&lt;/td&gt;&lt;td&gt;31&lt;/td&gt;&lt;td&gt;40&lt;/td&gt;&lt;/tr&gt;&#10;&lt;tr&gt;&lt;td&gt;CertificateManager&lt;/td&gt;&lt;td&gt;&lt;code&gt;acm&lt;/code&gt;&lt;/td&gt;&lt;td&gt;20&lt;/td&gt;&lt;td&gt;41&lt;/td&gt;&lt;/tr&gt;&#10;&lt;tr&gt;&lt;td&gt;CleanRooms&lt;/td&gt;&lt;td&gt;&lt;code&gt;cleanrooms&lt;/code&gt;&lt;/td&gt;&lt;td&gt;12&lt;/td&gt;&lt;td&gt;107&lt;/td&gt;&lt;/tr&gt;&#10;&lt;tr&gt;&lt;td&gt;ElastiCache&lt;/td&gt;&lt;td&gt;&lt;code&gt;elasticache&lt;/code&gt;&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;77&lt;/td&gt;&lt;/tr&gt;&#10;&lt;tr&gt;&lt;td&gt;CloudWatch&lt;/td&gt;&lt;td&gt;&lt;code&gt;cloudwatch&lt;/code&gt;&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;67&lt;/td&gt;&lt;/tr&gt;&#10;&lt;tr&gt;&lt;td&gt;SageMaker&lt;/td&gt;&lt;td&gt;&lt;code&gt;sagemaker&lt;/code&gt;&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;444&lt;/td&gt;&lt;/tr&gt;&#10;&lt;tr&gt;&lt;td&gt;WorkSpaces&lt;/td&gt;&lt;td&gt;&lt;code&gt;workspaces&lt;/code&gt;&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;101&lt;/td&gt;&lt;/tr&gt;&#10;&lt;tr&gt;&lt;td&gt;KafkaConnect&lt;/td&gt;&lt;td&gt;&lt;code&gt;kafkaconnect&lt;/code&gt;&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;18&lt;/td&gt;&lt;/tr&gt;&#10;&lt;tr&gt;&lt;td&gt;AuditManager&lt;/td&gt;&lt;td&gt;&lt;code&gt;auditmanager&lt;/code&gt;&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;62&lt;/td&gt;&lt;/tr&gt;&#10;&lt;tr&gt;&lt;td&gt;Batch&lt;/td&gt;&lt;td&gt;&lt;code&gt;batch&lt;/code&gt;&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;45&lt;/td&gt;&lt;/tr&gt;&#10;&lt;tr&gt;&lt;td&gt;CUR&lt;/td&gt;&lt;td&gt;&lt;code&gt;cur&lt;/code&gt;&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;12&lt;/td&gt;&lt;/tr&gt;&#10;&lt;tr&gt;&lt;td&gt;SSMQuickSetup&lt;/td&gt;&lt;td&gt;&lt;code&gt;ssm-quicksetup&lt;/code&gt;&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;14&lt;/td&gt;&lt;/tr&gt;&#10;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h3 id="services-with-no-verdict"&gt;Services with no verdict&lt;a class="anchor" href="#services-with-no-verdict"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;The reference states nothing either way for these. Check them against AWS&amp;rsquo;s&#10;own IAM documentation and test the policy. This is not a list of services where&#10;scoping fails.&lt;/p&gt;</description></item></channel></rss>