<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ben Bridts, Author at Cloudar</title>
	<atom:link href="https://cloudar.be/author/bbridts/feed/" rel="self" type="application/rss+xml" />
	<link>https://cloudar.be/author/bbridts/</link>
	<description>100% Focus On AWS // 100% Customer Obsession</description>
	<lastBuildDate>Fri, 17 Oct 2025 11:22:55 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<item>
		<title>Sign in with your eID: Using AWS IAM Roles Anywhere with a SmartCard Reader</title>
		<link>https://cloudar.be/awsblog/sign-in-with-your-eid-using-aws-iam-roles-anywhere-with-a-smartcard-reader/</link>
		
		<dc:creator><![CDATA[Ben Bridts]]></dc:creator>
		<pubDate>Thu, 26 Jun 2025 07:53:14 +0000</pubDate>
				<category><![CDATA[Security & Compliance]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[Managed Services]]></category>
		<category><![CDATA[MSP]]></category>
		<guid isPermaLink="false">https://cloudar.be/?p=22584</guid>

					<description><![CDATA[<p>Using temporary credentials to access resources, has long been a best practice and is usually straight-forward if the person or machine that is starting the action is already known in AWS (either by using IAM Identity Center, or because you are running inside the AWS Cloud). However, if you are running on a machine that [&#8230;]</p>
<p>The post <a href="https://cloudar.be/awsblog/sign-in-with-your-eid-using-aws-iam-roles-anywhere-with-a-smartcard-reader/">Sign in with your eID: Using AWS IAM Roles Anywhere with a SmartCard Reader</a> appeared first on <a href="https://cloudar.be">Cloudar</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Using temporary credentials to access resources, <a href="https://docs.aws.amazon.com/wellarchitected/latest/framework/sec_identities_unique.html">has long been a best practice</a> and is usually straight-forward if the person or machine that is starting the action is already known in AWS (either by using IAM Identity Center, or because you are running inside the AWS Cloud). However, if you are running on a machine that exists outside of AWS you will need an extra component like AWS IAM Roles Anywhere to give you temporary credentials.</p>
<p>Interestingly, Roles Anywhere does not completely solve the problem of not needing to create long-lived credentials, instead it moves (and reduces) the problem from credential management (rotation) to certificate management (distribution).</p>
<p>Setting up a Certificate Authority (CA) that can create certificates can be done with AWS Private Certificate Authority, and there are some options out there to manage distribution (usually as part of a bigger Device Management solution), but wouldn&#8217;t it be nice if the government of Belgium would do that for us?</p>
<h1>The Belgian eID</h1>
<p>In Belgium every citizens gets an identity card. The government makes sure that these get distributed and renewed, and since 2005 they contain a chip that holds (among other things) a certificate that can be used for digital authentication. If we can tie this to Roles Anywhere, we don&#8217;t have to worry about certificate management ourselves.</p>
<p>This eID is the size of a bankcard and the chip can be interacted with using off the shelf smart card readers. Most information can be read without any additional authentication &#8211; if you have the correct middleware, but to sign something you need to enter a PIN code.</p>
<h2>The different certificates</h2>
<p>Every eID holds an &#8220;authentication certificate&#8221; that is tied to the owner of the eID and has been signed by the &#8220;Citizens CA&#8221;.  The Citizens CA&#8217;s certificate is in turn signed by the Belgium Root CA . The Root certificate is self-signed. If we trust the Belgium Root CA, we will be able to validate any authentication certificate. More information about this setup can be found at https://repository.eidpki.belgium.be/#/home</p>
<p>The authentication certificate has two pieces of information that are going to be useful to us:</p>
<ul>
<li>The Issuer, showing us that the certificate is indeed issued by the Citizen CA.</li>
<li>The Subject, containing the name and National Number (a number that uniquely points to one person) of the owner.</li>
</ul>
<h1>AWS IAM Roles Anywhere</h1>
<p>Roles Anywhere allows you to use a certificate and its private key to get temporary credentials. You can think of it as an AssumeRole call, but instead of starting from an Access Key, we start from a certificate.</p>
<p>There are a few components we need:</p>
<ul>
<li>Configuration in our AWS Account, to indicate which CA we trust, and which roles can be assumed by different Issuer and/or Subjects. This also includes the creation of IAM Roles.</li>
<li>Software on our computer to interact with the Card Reader so we can prove we have access to the eID and know its PIN.</li>
</ul>
<p>For our use case we are going to trust the Belgium Root CA, and create a Role that can be assumed with any certificate issued by the Citizen CA. We will than limit the permissions of that IAM Role, so it can only write to a unique prefix in S3.</p>
<p>We can do that because every component of the Subject in our certificate gets mapped to a principal tag on the role session. E.g. if the subject is &#8220;C=BE, SN=Doe, GN=John, serialNumber=70010112345, CN=John Doe (Authentication)&#8221;, we have the following principal tags, and we can use principal tags in any policy.</p>
<ul>
<li>x509Subject/C: BE</li>
<li>x509Subject/SN: Doe</li>
<li>x509Subject/GN: John</li>
<li>x509Subject/serialNumber: 70010112345</li>
<li>x509Subject/CN: John Doe (Authentication)</li>
</ul>
<h1>Putting it all together</h1>
<h2>In our AWS Account</h2>
<p>We will create the following resources in our AWS Account:</p>
<ul>
<li>An S3 Bucket</li>
<li>A trust anchor, configured to trust the Belgium Root CA certificate that is publicly available via https://crt.eidpki.belgium.be/eid/brca6.crt.  This way we can use any certificate created by the Root CA of any of its subordinate CAs (like the Citizen CA)</li>
<li>An IAM Role, where we configure the trust policy to only allow usage of the Role if:
<ul>
<li>The principal is the Roles Anywhere service (rolesanywhere.amazonaws.com)</li>
<li>The Issuer is Citizen CA (aws:PrincipalTag/x509Issuer/CN must equal &#8220;Citizen CA&#8221;)</li>
<li>The source is our trust anchor (aws:SourceArn equals the ARN of the Root CA trust anchor)</li>
</ul>
</li>
<li>An IAM Policy on this role that allows PutObject acces to all objects that start with the unique National Number (aws:PrincipalTag/x509Subject/serialNumber)</li>
<li>a (Roles Anywhere) profile that ties the trust anchor to the Role. We could configure more settings here, like a mapping of fields from the certificate or a session policy, but don&#8217;t need to.</li>
</ul>
<p>Of course we do not have to do this by hand, we create a CloudFormation template for this. It can be found in our sample repository: https://github.com/WeAreCloudar/cloudformation-samples/tree/main/templates/roles-anywhere-eid</p>
<h2>On our machine</h2>
<p>On our machine, we will need &#8211; besides the eID and its PIN (at least on macOS, where I tested this):</p>
<ul>
<li>a SmartCard Reader</li>
<li>the Roles Anywhere Credential Helper (<a href="https://docs.aws.amazon.com/rolesanywhere/latest/userguide/credential-helper.html">downloadable from the AWS Website</a>)</li>
<li>The AWS CLI (or any other tool we want to use with our AWS Credentials)</li>
</ul>
<p>We also need a few pieces of information:</p>
<ul>
<li>The ARNs of the trust anchor, profile and role we created</li>
<li>Our own National Number and the name of the bucket (to test our policy)</li>
</ul>
<p>Ideally we&#8217;d be able to configure the credential helper to read any eID we insert, and this is possible if you install the Belgian eID Middleware using the following command.<br />
<code><br />
aws_signing_helper credential-process \<br />
</code><code> --trust-anchor-arn $trust_anchor_arn \<br />
--profile-arn $profile_arn \<br />
--role-arn $role_arn \<br />
--certificate &quot;pkcs11:model=Belgium%20eID;object=Authentication&quot; \<br />
--pkcs11-lib &#039;/Library/Belgium Identity Card/Pkcs11/beid-pkcs11.bundle/Contents/MacOS/libbeidpkcs11.dylib<br />
</code><br />
However <a href="https://github.com/aws/rolesanywhere-credential-helper/issues/58">because of an issue with the helper, this only works on macOS if you build the helper yourself from source</a>. Since we do not want to do that, we can plug in our eID and find and identifier using &#8220;aws_signing_helper read-certificate-data&#8221;. You should get something like<br />
<code><br />
Matching identities<br />
1) bf013dd57aa34f8f9d4e22ab89dd8eb2 &quot;SERIALNUMBER=70010112345,CN=John Doe (Authentication),C=BE,...&quot;<br />
2) 786f7572198a4a8a82ee7ef3f205d7be &quot;SERIALNUMBER=70010112345,CN=John Doe (Signature),C=BE,...&quot;<br />
</code></p>
<p>Copying everything between quotes, allows us to create a new file, selector.json that looks like this:</p>
<p><code><br />
[<br />
{<br />
&quot;Key&quot;: &quot;x509Subject&quot;,<br />
&quot;Value&quot;: &quot;SERIALNUMBER=70010112345,CN=John Doe (Authentication),C=BE,...&quot;<br />
}<br />
]<br />
</code><br />
and use that to select our specific certificate:</p>
<p><code>aws_signing_helper credential-process \<br />
</code><code> --trust-anchor-arn $trust_anchor_arn \<br />
--profile-arn $profile_arn \<br />
--role-arn $role_arn \<br />
--cert-selector file://selector.json</code></p>
<p>Our smart card reader will now prompt us for a PIN. If we enter the right one, we get credentials as output:<br />
<code><br />
{&quot;Version&quot;:1,&quot;AccessKeyId&quot;:&quot;ASIA...&quot;,&quot;SecretAccessKey&quot;:&quot;COA...&quot;,&quot;SessionToken&quot;:&quot;IQoJ...&quot;,&quot;Expiration&quot;:&quot;2025-03-28T14:16:07Z&quot;}<br />
</code></p>
<p>We can put this command in our ~/.aws/config file, so the AWS CLI will execute it for us, but for testing purposes it&#8217;s slightly easier to use the &#8220;serve&#8221; option.  The AWS Documentation has a longer explanation about how you can use the credential-process: https://docs.aws.amazon.com/rolesanywhere/latest/userguide/credential-helper.html#credential-helper-examples</p>
<h2>Testing with s3</h2>
<p>In one terminal we can run a credential / metadata server that can be used by the AWS CLI:</p>
<p><code>~$ aws_signing_helper serve -process \<br />
</code><code> --trust-anchor-arn $trust_anchor_arn \<br />
--profile-arn $profile_arn \<br />
--role-arn $role_arn \<br />
--cert-selector file://selector.json<br />
</code></p>
<p>This gives us<code><br />
2025/03/28 14:28:12 Local server started on port: 9911<br />
2025/03/28 14:28:12 Make it available to the sdk by running:<br />
2025/03/28 14:28:12 export AWS_EC2_METADATA_SERVICE_ENDPOINT=http://127.0.0.1:9911/</code></p>
<p>We can than use a second terminal to run:</p>
<p><code>AWS_EC2_METADATA_SERVICE_ENDPOINT=http://127.0.0.1:9911/ aws s3 cp example_file s3://$bucket/serialNumber/70010112345/example_file</code></p>
<p>and get our file in s3:</p>
<p><code>upload: example_file to s3://.../serialNumber/70010112345/example_file</code></p>
<h1>Conclusion</h1>
<p>This experiment shows that being able to use an external device withIAM Roles, is a very powerful feature, because it can remove a lot of tasks related to certificate and credential management. Being able to do this with something I had in my backpocket made it extra cool.</p>
<p>However, the Belgian eID is probably not the best way to go about this in a real scenario:</p>
<ul>
<li>I just gave everyone living in Belgium access to my S3 Bucket. I could use a more scoped-down trust policy, but I would eventually run into limitations of trust-policy size.</li>
<li>I also didn&#8217;t tackle Certificate Revocation Lists (CRL). Every time someone loses their wallet, I would need to invalidate certain certificates &#8211; this also runs into size limitations</li>
<li>I already have a good way to give users access to AWS Accounts, using Identity Center or Cognito.</li>
<li>The pkcs11 support on macOS seems limited, and I would have to install the middleware everywhere,</li>
</ul>
<p>This does not mean that Roles Anywhere is not a good solution for this kind of cases:</p>
<ul>
<li>If you are already putting certificates on machines (e.g using an MDM solution), AWS IAM Roles Anywhere is a great fit</li>
<li>Instead of relying on the Belgian Government you can buy an hardware key like a yubikey and use it as your certificate source. This is as secure as using the eID (only the machine with the key plugged in will be able to request credentials), and you would be limiting it to the exact serial number(s) in your trust policy anyway &#8211; making CRLs mostly moot.</li>
</ul>
<p>The post <a href="https://cloudar.be/awsblog/sign-in-with-your-eid-using-aws-iam-roles-anywhere-with-a-smartcard-reader/">Sign in with your eID: Using AWS IAM Roles Anywhere with a SmartCard Reader</a> appeared first on <a href="https://cloudar.be">Cloudar</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>There is still space available: Ben’s recommendations for re:Invent 2023</title>
		<link>https://cloudar.be/awsblog/there-is-still-space-available-bens-recommendations-for-reinvent-2023/</link>
		
		<dc:creator><![CDATA[Ben Bridts]]></dc:creator>
		<pubDate>Mon, 06 Nov 2023 13:12:34 +0000</pubDate>
				<category><![CDATA[AWS re:Invent]]></category>
		<guid isPermaLink="false">https://cloudar.be/?p=21898</guid>

					<description><![CDATA[<p>Getting a reserved seat at re:Invent is always a bit of a challenge. Luckily, not all sessions are announced at the same time, and some sessions get repeats announced later. Combining those sessions with a few hidden gems, I was able to create a list of 10 sessions (5 chalk talks and 5 breakout sessions) [&#8230;]</p>
<p>The post <a href="https://cloudar.be/awsblog/there-is-still-space-available-bens-recommendations-for-reinvent-2023/">There is still space available: Ben’s recommendations for re:Invent 2023</a> appeared first on <a href="https://cloudar.be">Cloudar</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Getting a reserved seat at re:Invent is always a bit of a challenge. Luckily, not all sessions are announced at the same time, and some sessions get repeats announced later. Combining those sessions with a few hidden gems, I was able to create a list of 10 sessions (5 chalk talks and 5 breakout sessions) for which &#8211; at the time of writing &#8211; there were still seats available to be reserved (and for all of them, walk-up will be possible too).</p>
<p>You can find them below, with a short explanation of why I think you should consider attending them.</p>
<h1>Breakout sessions</h1>
<h2>SEC209 | Modernize authorization: Lessons from cryptography and authentication</h2>
<p>Speakers: Eric Brandwine, Neha Rungta<br />
Hurry level: There is still space.</p>
<p>You might have heard the phrase &#8220;there is no compressions algorithm for experience&#8221; and with a combined 23 years at AWS/Amazon between Eric Brandwine and Neha Rungta, this is absolutely true here. I have no doubt that they&#8217;ll be able to talk about some of my favorite topics (cryptography, authentication, authorization, the Cedar language, &#8230;) in a way that&#8217;s useful and understandable.</p>
<h2><del>SEC236 | The AWS data-driven perspective on threat landscape trends</del></h2>
<p>Speaker: Paul Bodmer<br />
Hurry level: <del>You&#8217;ll probably have to sit in the front row</del>. There will be a recording</p>
<p>The description mentions “data-driven”, “real-world examples”, and “unique perspective”. <a href="https://aws.amazon.com/blogs/security/how-aws-threat-intelligence-deters-threat-actors/">AWS has been recently more open about the kind of threads they see</a>, and this session will hopefully follow that trend.</p>
<h2><del>SVS323 | I didn’t know Amazon API Gateway did that</del></h2>
<p>Speakers: Eric Johnson<br />
Hurry level: <del>You&#8217;ll probably have to sit in the front row</del>. There will be a recording</p>
<p>I have never regretted seeing a talk by Eric Johnson, and I love this title. Finding interesting ways to use AWS services is very helpful, and allows you to make more informed trade-offs when designing an application.</p>
<h2>DOP209 | Governance and security with infrastructure as code</h2>
<p>Speakers: Damian Silbergleith Cunniff (GoDaddy), Eric Beard, Kevin DeJong<br />
Hurry level: You&#8217;ll probably have to sit in the front row.</p>
<p>I like the way cfn-guard approaches governance a lot, and it&#8217;s integrated in more services than you might expect. I also believe that having guardrails is operationally a better choice than building your own company-specific constructs, so I&#8217;m happy that they&#8217;ll also talk about the CDK.</p>
<h2><del>STG315 | Amazon S3 security and access control best practices</del></h2>
<p>Speakers: Meg Rose, Becky Weiss<br />
Hurry level: <del>You&#8217;ll probably have to sit in the front row</del>. There will be a recording</p>
<p>Meg Rose and Becky Weiss gave one of my favorite sessions of re:Invent 2021 (STG315: Deep dive on Amazon S3 security and access management), and this year they&#8217;re back for another joint session. This will be a great way to get to know all the S3 security features, and how they work together.</p>
<h1>Chalk Talks</h1>
<h2>SEC316-R1 | All things in life are temporary: An IAM credential journey [REPEAT]</h2>
<p>Speakers: Meg Peddada, Alex Waddell<br />
Hurry level: There is still space.</p>
<p>I saw a great chalk talk at re:Inforce about how IAM and STS work. In the meantime, more official documentation about concepts discussed during that talk, like “<a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/access_forward_access_sessions.html">forward access sessions (FAS)</a>”, has appeared. Getting an end-to-end look at what happens when you use an IAM credential will always be interesting, and helpful when writing policies.</p>
<h2>NET316-R1 | Networking ask-me-anything talk [REPEAT]</h2>
<p>Speakers: Jamie Wenzel, Andrew Gray<br />
Hurry level: There is still space.</p>
<p>Doing an &#8220;ask-me-anything&#8221; is always a bit of a risk, but if we bring interesting questions, we should get interesting answers. Networking also lends itself very well to whiteboarding, so I expect a very interactive session, which is where chalk talks shine.</p>
<h2>SUP201 | Get the most out of AWS Support to achieve your business outcomes</h2>
<p>Speakers: Peter Dachnowicz, Donald Quindardo<br />
Hurry level: Don&#8217;t wait too long.</p>
<p>Knowing how to effectively engage AWS Support is one of the &#8220;secrets&#8221; that can make you solve problems a lot faster. The topics listed in the description sound very interesting, but I would also use this opportunity to ask things like &#8220;What is the fastest way to get a quota increase?&#8221;, &#8220;What&#8217;s the smartest way to engage a Technical Account Manager?&#8221;, and &#8220;What kind of artifacts should I include when I open a support case?&#8221;.</p>
<h2>SEC217 | Explore the AWS sovereign-by-design approach</h2>
<p>Speakers: Alex Meek-Holmes, Kathy Liu<br />
Hurry-level: Don&#8217;t wait too long.</p>
<p>By the time this session happens, it will be a little over a month since <a href="https://aws.amazon.com/blogs/security/aws-digital-sovereignty-pledge-announcing-a-new-independent-sovereign-cloud-in-europe/">AWS announced the &#8220;AWS European Sovereign Cloud&#8221;</a>. There are a few details in the announcement post that give us a little insight into how it will work. Hearing things directly from AWS-people, and being able to ask questions should teach us even more about what is coming.</p>
<h2>SVS203-R1 | Thinking serverless [REPEAT]</h2>
<p>Speakers: James Beswick<br />
Hurry-Level: Don&#8217;t wait too long.</p>
<p>Framing serverless as an approach to a business problem is super helpful, and this one has all the things you want in a serverless-related session: different services, customer focus, distributed systems, event-based architecture, &#8230;</p>
<hr />
<p>This blog has been updated:</p>
<ul>
<li>Monday 6 November 2023: SVS323, DOP209, and STG315 have no more reservations available.</li>
<li>Wednesday 8 November 2023: crossed out SEC236, un-crossed DOP209</li>
</ul>
<p>The post <a href="https://cloudar.be/awsblog/there-is-still-space-available-bens-recommendations-for-reinvent-2023/">There is still space available: Ben’s recommendations for re:Invent 2023</a> appeared first on <a href="https://cloudar.be">Cloudar</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Spotted: How we discovered Privilege Escalation, missing CloudTrail data and a race condition in AWS Directory Service</title>
		<link>https://cloudar.be/awsblog/spotted-privilege-escalation-in-aws-directory-service/</link>
		
		<dc:creator><![CDATA[Ben Bridts]]></dc:creator>
		<pubDate>Wed, 07 Jun 2023 10:00:07 +0000</pubDate>
				<category><![CDATA[Security & Compliance]]></category>
		<guid isPermaLink="false">https://cloudar.be/?p=20589</guid>

					<description><![CDATA[<p>It takes a village to spot a bug. Recently, Cloudar discovered a set of bugs in AWS Directory Service. One of them could be used for privilege escalation by an authenticated user with sufficient permissions. We reached out to AWS and they have remediated this issue and published a security bulletin.  No customer action is [&#8230;]</p>
<p>The post <a href="https://cloudar.be/awsblog/spotted-privilege-escalation-in-aws-directory-service/">Spotted: How we discovered Privilege Escalation, missing CloudTrail data and a race condition in AWS Directory Service</a> appeared first on <a href="https://cloudar.be">Cloudar</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>It takes a village to spot a bug. Recently, Cloudar discovered a set of bugs in AWS Directory Service. One of them could be used for privilege escalation by an authenticated user with sufficient permissions. We reached out to AWS and they have remediated this issue and <a href="https://aws.amazon.com/security/security-bulletins/AWS-2023-003/">published a security bulletin</a>.  No customer action is required</p>
<h2><strong>The findings</strong></h2>
<p>When you configure an AWS service to use an IAM role on your behalf, <a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_passrole.html">you need to have the iam:PassRole permission</a> in addition to the permissions required to configure and/or use the service.</p>
<p>Due to the bug we reported, AWS Directory Service didn’t verify the presence of those permissions when <a href="https://docs.aws.amazon.com/directoryservice/latest/admin-guide/assign_role.html">assigning users or groups to an existing IAM role</a>. This allowed users with the  ds:EnableRoleAccess permission to assign users to any role in their account that <a href="https://docs.aws.amazon.com/directoryservice/latest/admin-guide/edit_trust.html">has a trust relationship with AWS Directory service</a>.</p>
<p>Additionally, we found some actions that were not logged to CloudTrail and a validation that’s only done client-side</p>
<h2><strong>The discovery</strong></h2>
<p>Cloudar is an <a href="https://aws.amazon.com/partners/programs/msp/">AWS Managed Service Provider Partner</a>, and as such, we work together with our clients to configure their environments. One of our clients alerted us of a strange behavior in the AWS Console for AWS Directory Service, which prompted us to take a deeper look behind the scenes of how that service works.</p>
<h3>Step 1: Missing CloudTrail Data</h3>
<p>We had configured AWS Directory Service for AWS Management Console access for our client, and it was working properly for them. However, when looking in the console, the feature appeared to be disabled.</p>
<p><img fetchpriority="high" decoding="async" class="aligncenter wp-image-20610 size-full" src="https://cloudar.be/wp-content/uploads/2023/05/Picture-1.png" alt="A screenshot of the AWS Console showing that the &quot;AWS Management Console&quot; feature of AWS Directory Service is disabled." width="902" height="190" srcset="https://cloudar.be/wp-content/uploads/2023/05/Picture-1.png 902w, https://cloudar.be/wp-content/uploads/2023/05/Picture-1-768x162.png 768w" sizes="(max-width: 902px) 100vw, 902px" /></p>
<p>Usually, we would investigate CloudTrail logs to see what disabled this, but at the time, we didn’t see an entry in CloudTrail that showed the enabling or disabling of access. When we tested what happened when changing the status ourselves, we also did not see those actions recorded in CloudTrail.</p>
<p>We’ve reported this to AWS, and enabling or disabling console access does now create events in CloudTrail (note: **OMITTED** is part of the CloudTrail event):</p>
<pre>{
[…]
    "eventSource": "ds.amazonaws.com",
    "requestParameters": {
        "directoryId": "d-123456789a",
        "applicationId": "***OMITTED***",
        "serviceAccountUserName": "***OMITTED***",
        "serviceAccountPassword": "HIDDEN_DUE_TO_SECURITY_REASONS"
    },
    "responseElements": null,
    "readOnly": false,
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "sessionCredentialFromConsole": "true"
}</pre>
<p>&nbsp;</p>
<pre>{
[…]
    "eventSource": "ds.amazonaws.com",
    "eventName": "UnauthorizeApplication",
    "requestParameters": {
        "directoryId": "d-123456789a",
        "applicationId": "***OMITTED***"
    },
    "responseElements": null,
    "readOnly": false,
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "sessionCredentialFromConsole": "true"
}</pre>
<h3>Step 2: Looking at what the console does</h3>
<p>Instead of looking through CloudTrail logs, we opened the development console in our browser. There we saw that it was sending requests to an undocumented API when enabling console access. There is no public API for enabling console access or assigning user to roles within Directory Service, so this wasn’t unexpected.</p>
<p>What <em>was</em> unexpected was that when enabling or disabling console access, there were two calls to the internal API. One to (un)authorize an application called “AWSManagementConsole” and one to (un)authorize an application called “Directory Service console”.</p>
<p>Assuming there was a consistency problem, we investigated what happened if we only unauthorized one of them by sending requests to the undocumented API from the command line.  When we unauthorized the “AWSManagementConsole” and authorized “Directory Service console”, we were able to reproduce our customer’s issue where the console would show “disabled”, but the sign-in would still work.</p>
<p>By the time we sent our report to AWS, the double API call didn’t happen anymore (only “AWSManagementConsole” is used today), so this seemed to have been a temporary issue. We still reported this behavior, indicating that we could no longer reproduce.</p>
<h3>Step 3: Finding a race condition</h3>
<p>Since this wasn’t an easy bug to uncover, we had to read a lot of documentation to deeply understand what Directory Service was doing. While doing that, we noted an interesting sentence: “<a href="https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_management_console_access.html#console_disable">If any IAM roles have been assigned to users or groups in the directory, the Disable button may be unavailable</a>.”</p>
<p>The word “may” seemed very ambiguous, especially after finding an issue where a network disconnection could lead to an unexpected state. We looked a bit further and realized that the expected behavior is that you can’t disable the integration if you still have users and/or groups assigned to roles.</p>
<p><img decoding="async" class="aligncenter size-full wp-image-20611" src="https://cloudar.be/wp-content/uploads/2023/05/cannot-disable.png" alt="A screenshot showing an error message when trying to disable console access while there are still users assigned" width="902" height="354" srcset="https://cloudar.be/wp-content/uploads/2023/05/cannot-disable.png 902w, https://cloudar.be/wp-content/uploads/2023/05/cannot-disable-768x301.png 768w" sizes="(max-width: 902px) 100vw, 902px" /></p>
<p>However, that check is done completely in the browser, and appears to be based on the state when the tab was loaded. This means you can disable the console access while still having users and/or groups assigned. You could do this by calling the same (undocumented) API that the console uses, or in the browser by 1) opening the console while there are no assignments 2) using a second tab to assign users and/or groups to a role 3) using the first tab to disable console access.</p>
<p><img decoding="async" class="aligncenter size-full wp-image-20612" src="https://cloudar.be/wp-content/uploads/2023/05/disabled-with-users.png" alt="A screenshot showing how the &quot;AWS Console Access&quot; feature is disabled while there are still users assigned" width="902" height="314" srcset="https://cloudar.be/wp-content/uploads/2023/05/disabled-with-users.png 902w, https://cloudar.be/wp-content/uploads/2023/05/disabled-with-users-768x267.png 768w" sizes="(max-width: 902px) 100vw, 902px" /></p>
<p>We’ve reported this issue to AWS, but don’t consider it a vulnerability as the assignments are not usable if the Console access is disabled.</p>
<h3>Step 4: Privilege escalation</h3>
<p>Having discovered two APIs that did some part of their logic client-side, and having experimented with the role-assignment, we looked at other validations that should happen when you assign a Role to a user in a directory.  To assign a specific role to a user or group:</p>
<ul>
<li>you should have ds:EnableRoleAccess permission for the Directory Service domain;</li>
<li>the role you want to pass should have a trust policy that allows use in AWS Directory Service;</li>
<li>the role should be in the same AWS account;</li>
<li>you should have iam:PassRole permissions on the role.</li>
</ul>
<p>When we tested these checks, we noticed that we could assign a role (within the same account), even if we didn’t have the right iam:PassRole permission. In certain setups, this could mean privilege escalation.</p>
<ul>
<li>Imagine you have two people, Alice and Bob, managing a domain, and each of them is responsible for assigning users to specific IAM roles. Alice assigns people to Role A and Bob assigns people to Role B. They could abuse the missing iam:PassRole check to assign people to a role they are not responsible for. For example, Alice assigns herself (or someone else) to Role B.</li>
<li>Another possible scenario would be when a user has the required permissions to create and manage a domain in AWS Directory Service, but no IAM permissions (e.g., with the PowerUserAccess managed policy). If there is already a role that has a trust relationship with AWS Directory Service, that user could create their own domain and assume that existing role.</li>
</ul>
<p>This issue has been completely fixed.</p>
<h2>Recommended actions</h2>
<p>Taking advantage of this vulnerability required a specific configuration and a high level of permissions within Directory Service. AWS customers who were relying on iam:PassRole permissions for access control before 2023-05-12 should review their directory for misconfiguration and their CloudTrail logs for unexpected AssumeRole calls.</p>
<h2>Timeline</h2>
<p>2023-04-07: Issue found and reported to AWS.</p>
<p>2023-04-07: Investigation started by AWS.</p>
<p>2023-04-13: Issue confirmed by AWS, and development of a fix in progress.</p>
<p>2023-04-24: Development finished and deployment of the fix in progress.</p>
<p>2023-05-12: Fix deployed globally.</p>
<h2>Acknowledgements</h2>
<p>We would like to thank the AWS teams involved, especially the Security team for their open communication and helpful responses. I’d also like to thank my coworkers for diving deep when they see unexpected things in the AWS console.</p>
<h2>Reach out to us</h2>
<p>I talked on <a href="https://pretalx.com/fwd-cloudsec-2023/talk/7BXVWM/">June 12 at fwd:cloudsec about how this journey showed the universal benefits of security features</a>, and you can <a href="https://www.youtube.com/watch?v=ey3dwohF6BY">watch that talk on youtube</a>.</p>
<p>The post <a href="https://cloudar.be/awsblog/spotted-privilege-escalation-in-aws-directory-service/">Spotted: How we discovered Privilege Escalation, missing CloudTrail data and a race condition in AWS Directory Service</a> appeared first on <a href="https://cloudar.be">Cloudar</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Options for migrating between Amazon Cognito User Pools</title>
		<link>https://cloudar.be/awsblog/options-for-migrating-between-amazon-cognito-user-pools/</link>
		
		<dc:creator><![CDATA[Ben Bridts]]></dc:creator>
		<pubDate>Thu, 18 Aug 2022 09:35:22 +0000</pubDate>
				<category><![CDATA[AWS Blog]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[Security & Compliance]]></category>
		<guid isPermaLink="false">https://cloudar.be/?p=20380</guid>

					<description><![CDATA[<p>Sometimes we run into questions that seem simple, but that have a very complex answer. In this blog post we will explain why &#8220;Can I migrate between two Amazon Cognito User Pools&#8221; is one of those question, and why it usually leads to a new set of questions, like: Where do your users exist (do [&#8230;]</p>
<p>The post <a href="https://cloudar.be/awsblog/options-for-migrating-between-amazon-cognito-user-pools/">Options for migrating between Amazon Cognito User Pools</a> appeared first on <a href="https://cloudar.be">Cloudar</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="answer-body-detail user-formatted-content">
<p>Sometimes we run into questions that seem simple, but that have a very complex answer. In this blog post we will explain why &#8220;Can I migrate between two Amazon Cognito User Pools&#8221; is one of those question, and why it usually leads to a new set of questions, like:</p>
<ul>
<li>Where do your users exist (do they federate from a different Identity Provider (IdP), or are they in the User Pool?)</li>
<li>Are you using MFA in Cognito</li>
<li>Which configuration settings can you change?</li>
<li>Are you okay with a migration process in the application?</li>
<li>Will all users sign in during a certain timeframe?</li>
<li>Do you want to keep your endpoints and identifiers, or are new endpoints okay?</li>
</ul>
<p>Lets look at why we are asking those questions, and which Cognito components are tricky to deal with.</p>
<h1>Configuration</h1>
<p>The configuration of a User Pool can be described by the API, or managed in an Infrastructure as Code tool. This makes it easy to recreate with the same settings. However, besides the new endpoints and ids (see below), <a href="https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-identity-federation.html" target="_blank" rel="noopener">you will have to update the federation settings</a> (of you are using sign in through a third party).</p>
<p>Eg. If you are federating users from Active Directory (AD) using SAML, you will have to set up a new integration on the AD side as well, so that user can sign in via AD/SAML. This is the same process as setting up this IdP for the first time.</p>
<h1>Endpoints and Ids</h1>
<p>If you create a new user pool, it will get a new id. This means that the following things will change. Usually this is not a problem, as these are expected changes (if you migrate to a different product, similar things will change).</p>
<ul>
<li>The User Pool Id</li>
<li>The App Client Ids and Secrets (you also create new App Clients)</li>
<li>The domain used for the hosted UI. Technically you can move it, but this will include downtime. Using a new domain will always be easier (and give you more control about step-by-step updates and rollbacks)</li>
<li>The User Pool Id and App Client Id are also part of the Tokens that Cognito returns. <a href="https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-verifying-a-jwt.html#amazon-cognito-user-pools-using-tokens-step-3">If you&#8217;re verifying them in your application (which you should)</a>, or are using a managed integration between an AWS service and Cognito (eg. Api Gateway), you will have to update these too.</li>
</ul>
<h1>Users and Groups</h1>
<p>This is the difficult part: while there are APIs to list/describe users and groups, there is no way to export the password (hash) or the MFA (seed) of a user. This means that in the worst case scenario you have to disable MFA and all users will have to reset their password before they can log in again. There are a few solutions, but none of them are ideal.</p>
<h2>Problem: You are using MFA in Cognito</h2>
<p>This is the worst case scenario for a migration. There is no way to export or set MFA seeds in Cognito, and usually disabling MFA for everyone is not going to be an option</p>
<h2>Problem: You are using the sub attribute in your application</h2>
<p>The sub attribute is an unique identifier for every user, and migrating users will create a new identifier. To work around this, you could use a different (custom) attribute to safe an identifier in, and update your application to use that. Filling that attribute comes with its own complexities, though.</p>
<h2>Option 1: You are using federation / sign in through a third party</h2>
<p>You&#8217;re in luck! Since the user and their password exist in the other system, you can setup a new federation and users will still be able to sign in (but  make sure you&#8217;ve read the &#8220;Configuration&#8221; section above).</p>
<p>If you want to go this route to make migration (and failover) easier, there are third party IdPs that you can use via SAML/OIDC. Although in some cases it might make more sense to integrate directly with them (either in Cognito Identity Pools or in the application) instead of putting User Pools in between. One reason to keep Cognito, is that you can create multiple App Clients (and thus applications) on one pool (and this can be done with the IaC tool you are already using). Whereas if you integrate directly, you have to configure everything in the external service (and depending on the protocol you are using, this can be hard to debug)</p>
<p>If you are also using groups, you still have to export and recreate those. Take a look at the <a href="https://aws.amazon.com/solutions/implementations/cognito-user-profiles-export-reference-architecture/" target="_blank" rel="noopener">AWS Solution mentioned in option 2</a>,  and its<a href="https://docs.aws.amazon.com/solutions/latest/cognito-user-profiles-export-reference-architecture/solution-components.html#limitations" target="_blank" rel="noopener"> limitations</a> for an example of doing that.</p>
<h2>Option 2: You don&#8217;t mind resetting all passwords.</h2>
<p>This is also doable, you can export all users, import them in the new pool and make them set a new password to sign in (if this is a limited set of internal users, you could also set a password for them, but you&#8217;d want them to pick their own either way)</p>
<p><a href="https://aws.amazon.com/solutions/implementations/cognito-user-profiles-export-reference-architecture/">There is even an AWS solution (read: Open Source software that you have to manage yourself) that can be used to do the export once or on a schedule</a> (eg. to create backups). Make sure to also check the <a href="https://docs.aws.amazon.com/solutions/latest/cognito-user-profiles-export-reference-architecture/solution-components.html#limitations" target="_blank" rel="noopener">limitations</a>.</p>
<h2>Option 3: Migrating on first sign-in</h2>
<p><a href="https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-migrate-user.html">You can add a Lambda Function to the new User Pool (there is example code, but you&#8217;d have to manage this yourself)</a>. This function will get the username and password, and can check the original pool and write the existing password to the new pool if the password is correct. Docs:</p>
<p>This has some downsides:</p>
<ul>
<li>The old User Pool needs to stay around until the migration is complete (you pay for active users, so this does not have to be a cost problem)</li>
<li>This can take a long time, and potential never finish (if you have users that don&#8217;t sign in regularly)</li>
</ul>
</div>
<h1>Conclusion</h1>
<div class="answer-body-detail user-formatted-content">
<p>There is a lot of complexity to deal with, so the short answer to our original question is &#8220;it depends&#8221;.</p>
<p>If you have a workload where this question is relevant, you probably also want to give feedback to AWS (eg. via your Account Manager). If the service would provide a way to export and import Users and Groups, this would be a lot easier. Not being able to export password-hashes and MFA-seeds (even in a way that only Cognito can read them), is currently limiting multiple solutions.</p>
</div>
<p>The post <a href="https://cloudar.be/awsblog/options-for-migrating-between-amazon-cognito-user-pools/">Options for migrating between Amazon Cognito User Pools</a> appeared first on <a href="https://cloudar.be">Cloudar</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>#CloudartotheRescue: DO use AWS CloudFormation (a response)</title>
		<link>https://cloudar.be/awsblog/do-use-aws-cloudformation-a-response/</link>
		
		<dc:creator><![CDATA[Ben Bridts]]></dc:creator>
		<pubDate>Tue, 14 Dec 2021 15:43:04 +0000</pubDate>
				<category><![CDATA[DevOps]]></category>
		<category><![CDATA[Well-Architected]]></category>
		<guid isPermaLink="false">https://www.cloudar.be/?p=19792</guid>

					<description><![CDATA[<p>Over the past few months I’ve seen the article “Do not use AWS CloudFormation” by Greg Swallow make the rounds a couple of times. While there are some valid reasons you could prefer Terraform, I don’t agree with many of the issues Greg has with CloudFormation. Some of the weaknesses he identifies, I’d even count [&#8230;]</p>
<p>The post <a href="https://cloudar.be/awsblog/do-use-aws-cloudformation-a-response/">#CloudartotheRescue: DO use AWS CloudFormation (a response)</a> appeared first on <a href="https://cloudar.be">Cloudar</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><strong>Over the past few months I’ve seen the article “Do not use AWS CloudFormation” by Greg Swallow make the rounds a couple of times. While there are some valid reasons you could prefer Terraform, I don’t agree with many of the issues Greg has with CloudFormation. Some of the weaknesses he identifies, I’d even count as strengths! So here I’m going to go through and counter his points, following the structure of his piece. All quotes (in italics) are from Greg’s blog to provide context.</strong></p>
<h3>Indirection</h3>
<p><em>With Terraform […] no intermediary sits between you and the service you’re controlling. Want an RDS instance? Terraform will make calls directly to the RDS API.</em></p>
<p>First of all, both Terraform and CloudFormation provide some level of indirection. CloudFormation converts a YAML or JSON template to a set of API calls. Terraform does the same, starting from an HCL template.</p>
<p>Having that transformation in the cloud can make it harder to see the underlying API responses, but that’s not because of the conversion between template and API. The same APIs are still getting called, and they will raise the same errors when there is something wrong with the requests. If you look in CloudTrail, you will see these requests together with the entire error message.</p>
<p>The way CloudFormation implements that translation layer (for newer resources) can add a second step after an API call fails. However, it also allows for standardized errors in other cases, like “Resource Already Exists” or “Only configurable when creating a resource”.</p>
<p><em>The prerequisite steps you have to take to use CloudFormation [StackSets] across multiple accounts </em>also <em>must be taken just to have CloudFormation spin up resources in multiple regions </em>within the same account<em>.</em></p>
<p>I’d argue that StackSets (and Service Catalog) are benefits of using CloudFormation. However, if they are too much overhead for a project, you can still deploy to multiple regions by adding a &#8211;region parameter to your deployment command. Although, by not using StackSets, you’d lose some convenience features, like being able to update multiple regions in parallel easily.</p>
<h3>Logic</h3>
<p><em>Terraform offers a rich set of data sources and transforming data with Terraform is a breeze.</em></p>
<p>I agree that CloudFormation could use more intrinsic functions, but that does not mean it’s severely lacking in functionality. In many cases, you can replace the missing functions by being stricter about the acceptable inputs.</p>
<h3>Speed</h3>
<p><em>AWS CloudFormation is S-L-O-W.</em></p>
<p>CloudFormation can seem slow because it tries very hard not to get into a state where your infrastructure is broken. Both CloudFormation and Terraform try to execute as much in parallel as possible (keeping dependencies between resources in mind). However, CloudFormation will not start deleting resources until every creation and update has been completed. On top of that, CloudFormation will validate that all actions (deletes included) finish before it considers the deployment complete.</p>
<h3>Sync vs Async</h3>
<p><em>Wrapping CI/CD tooling around AWS CloudFormation is […] a difficult matter of polling stack updates until the right stack state bubbles up from an aws cloudformation CLI query.</em></p>
<p>Here Greg argues that Terraform is better because polling for changes can be challenging to do. However, if you’re okay with executing a command-line tool (like Terraform), you can AWS CloudFormation deploy, and the AWS CLI will do all that for you.</p>
<p>Even without the CLI, running async comes with some significant advantages:</p>
<ul>
<li>You don’t have to worry about the build tool (or your laptop) crashing or losing internet connectivity</li>
<li>Everyone with access to the AWS account can see when an update is in progress and poll independently for changes</li>
<li>You don’t need a process that keeps running during the change. The deployment will keep running until it’s done.</li>
</ul>
<p>Running 100% as a managed service also includes the following advantages:</p>
<ul>
<li>You don’t need to execute any code on your machine</li>
<li>You don’t need to worry about different tool versions and upgrades between them</li>
<li>You don’t need an access key with full admin permissions</li>
<li>You get state management included by default (instead of having to configure it yourself).</li>
</ul>
<p>That safer approach has the potential of doubling the time it takes to execute a change (assuming that a create/update takes as long as a delete), but having automatic rollbacks is frequently worth the extra time.</p>
<h3>Portability</h3>
<p><em>If you learn AWS CloudFormation, then guess what: you can’t take your skills with you. If you put forth the effort to learn Terraform, then you can take your skills to any other cloud.</em></p>
<p>While the workflow might stay the same, the resources that you create are going to be vastly different between clouds. The primary skill that you should learn (independently from the tool) is how AWS works. This will make your skills transferable between tools instead of between clouds. You wouldn’t expect carpenters to list their experience with a hammer (even if it’s useful for all kinds of projects): instead you want to know what they can build.</p>
<h3>Importing existing resources</h3>
<p><em>I can’t even begin to tell you how to import resources with AWS CloudFormation, and neither can AWS’s engineers.</em></p>
<p>This is pure hyperbole. Importing resources into CloudFormation is documented, and the console has a basic wizard.</p>
<p>If we ignore the exaggeration, there is indeed still room for improvement. While all new resource types should support importing, there is still a long tail of old resources that are not yet supported. “All resources should support resource import” is a valid point. However, CloudFormation was usable before the introduction of this feature. Whether this is a dealbreaker will depend on how frequently you expect to import unsupported resources.</p>
<h3>Service Quotas</h3>
<p><em>The list of quotas for the AWS CloudFormation service is just hilarious.</em></p>
<p>I don’t think that documented limitations are necessarily a bad thing, and I wonder how many of those quotas people actually run into. It’s been a long time since I had to look at that page.</p>
<h3>TL;DR</h3>
<p>CloudFormation makes different trade-offs than Terraform. Looking at its sharp edges without considering the advantages they bring is unfair.</p>
<p>Use the tool that matches your requirements. If you want safe deployments, tight integration within AWS, and minimal operational overhead, CloudFormation will probably fit the bill.</p>
<p>&nbsp;</p>
<p>The post <a href="https://cloudar.be/awsblog/do-use-aws-cloudformation-a-response/">#CloudartotheRescue: DO use AWS CloudFormation (a response)</a> appeared first on <a href="https://cloudar.be">Cloudar</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Finding the Account ID of any public S3 bucket</title>
		<link>https://cloudar.be/awsblog/finding-the-account-id-of-any-public-s3-bucket/</link>
		
		<dc:creator><![CDATA[Ben Bridts]]></dc:creator>
		<pubDate>Thu, 25 Mar 2021 14:14:34 +0000</pubDate>
				<category><![CDATA[AWS Blog]]></category>
		<guid isPermaLink="false">https://www.cloudar.be/?p=18990</guid>

					<description><![CDATA[<p>A few months ago, we created a new Open Source tool to determine the AWS Account of any S3 bucket you can access. It works for public objects and specific permissions. Now let’s dive a bit deeper and look at how this works, and some of the potential consequences. How we do this We can [&#8230;]</p>
<p>The post <a href="https://cloudar.be/awsblog/finding-the-account-id-of-any-public-s3-bucket/">Finding the Account ID of any public S3 bucket</a> appeared first on <a href="https://cloudar.be">Cloudar</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><strong>A few months ago, <a href="https://github.com/WeAreCloudar/s3-account-search">we created a new Open Source tool to determine the AWS Account of any S3 bucket you can access</a>. It works for public objects and specific permissions. Now let’s dive a bit deeper and look at how this works, and some of the potential consequences.</strong></p>
<h1><span data-preserver-spaces="true">How we do this</span></h1>
<p><span data-preserver-spaces="true">We can determine an AWS account by taking advantage of the new S3:ResourceAccount Policy Condition Key. This condition restricts access based on the S3 bucket an account is in (other account-based policies restrict based on the account the requesting principal is in).</span></p>
<p><span data-preserver-spaces="true">If we start with access to an object and write a condition with an &#8220;Allow&#8221; on exactly one account ID, we can determine if this bucket is in this account. We will be able to access the bucket if we get the account ID right, but we will see an access denied if we try the wrong number.</span></p>
<h2><span data-preserver-spaces="true">Reducing the search space</span></h2>
<p><span data-preserver-spaces="true">Finding exactly the right account might seem impractical, with literally one trillion possibilities to try, but we don&#8217;t need to test them all.</span></p>
<p><span data-preserver-spaces="true">Conditions in policies use string matching and support wildcards. We can leverage that to exclude a whole range at a time. For example, to find the first digit, we can test &#8220;1*&#8221;, &#8220;2*&#8221;, &#8220;3*&#8221; etc. Once we gain access, we know our first digit and can do the same for the second, reducing</span><span data-preserver-spaces="true"> the number of requests (in the worst case) from a trillion (10^12) to one hundred and twenty (10*12).</span></p>
<h2><span data-preserver-spaces="true">Making the requests</span></h2>
<p><span data-preserver-spaces="true">Now that we know which policies to test, we need a way to try them.</span></p>
<p><span data-preserver-spaces="true">If the object is public, we have many options since any principal can test these conditions. </span></p>
<p><span data-preserver-spaces="true">If we have to use a specific principal to access the object, we could change that user or role&#8217;s policy. Editing policies isn&#8217;t ideal as these are eventually consistent, and we would have to wait after each change.</span></p>
<p><span data-preserver-spaces="true">If the principal is a role, we can take advantage of an assume-role call&#8217;s extra parameters to get strongly consistent changes:</span></p>
<p><span data-preserver-spaces="true">The default way to create temporary credentials from a role is a command like </span><code>aws sts assume-role --role-arn arn:aws:iam::123456789012:role/name --role-session-name ben</code>. That will give us an access key, secret access key and session token with that role&#8217;s full permissions. If we add the <code>--policy</code> parameter to that command, we also get temporary credentials, but the permissions will be the intersection of the role&#8217;s permission and the supplied policy. This gives us a way to have an additional condition without editing anything in our account. Doing that between 10 and 120 times will eventually reveal the account ID, and that is what the tool does.</p>
<h1><span data-preserver-spaces="true">Is this a problem?</span></h1>
<p><span data-preserver-spaces="true">It’s never a good idea to make discoverable any information that doesn’t need to be. That&#8217;s why we replaced all the account IDs in this blogpost with 123456789012. </span></p>
<p><span data-preserver-spaces="true">However, we don&#8217;t consider the account ID to be secret information either. There can be many reasons to share an account ID with an external party, and there are more ways to find it out anyway. Your protections should assume they&#8217;re public anyway.</span></p>
<h1><span data-preserver-spaces="true">Can I see when someone does this?</span></h1>
<p><span data-preserver-spaces="true">The STS actions all happen in the account of the person trying to find the account ID, which will not be visible to the bucket owner&#8217;s account. </span></p>
<p><span data-preserver-spaces="true">S3 data events (the kind of API calls used to test the policy) are not logged in CloudTrail by default. This can be enabled, but it comes with an extra cost, making it probably unrealistic to do so for buckets that get many requests. Alternatively, you can enable server access logging on each bucket, which is much more economical.</span></p>
<p><span data-preserver-spaces="true">When enabled, you should be able to see multiple denied requests in a short time. However: it&#8217;s trivial to do this over a longer period, and you will only see that the request was denied (not that there was an abnormal condition).</span></p>
<p><span data-preserver-spaces="true">And if you still see it, there is still a chance that it was someone from your organization who didn&#8217;t remember which account a specific bucket was in, which has happened before! </span>With luck, this can help people with that problem!</p>
<p><strong>If you’d like to know more, get in touch with Cloudar today!</strong></p>
<p>&nbsp;</p>
<p>The post <a href="https://cloudar.be/awsblog/finding-the-account-id-of-any-public-s3-bucket/">Finding the Account ID of any public S3 bucket</a> appeared first on <a href="https://cloudar.be">Cloudar</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>AWS CloudFormation Modules: A first look</title>
		<link>https://cloudar.be/awsblog/aws-cloudformation-modules-a-first-look/</link>
		
		<dc:creator><![CDATA[Ben Bridts]]></dc:creator>
		<pubDate>Wed, 25 Nov 2020 00:31:22 +0000</pubDate>
				<category><![CDATA[DevOps]]></category>
		<guid isPermaLink="false">https://www.cloudar.be/?p=18126</guid>

					<description><![CDATA[<p>AWS just released a new feature for CloudFormation, &#8220;CloudFormation Modules&#8220;. Of course, we immediately had to try it out. In this blog post, you can follow along with our exploration. Installation To use this new feature, you need the latest version of the CloudFormation cli. You can install this with pip install cloudformation-cli (tip: you [&#8230;]</p>
<p>The post <a href="https://cloudar.be/awsblog/aws-cloudformation-modules-a-first-look/">AWS CloudFormation Modules: A first look</a> appeared first on <a href="https://cloudar.be">Cloudar</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>AWS just released a new feature for CloudFormation, &#8220;<a href="https://aws.amazon.com/blogs/mt/introducing-aws-cloudformation-modules/">CloudFormation Modules</a>&#8220;. Of course, we immediately had to try it out. In this blog post, you can follow along with our exploration.</p>
<h2>Installation</h2>
<p>To use this new feature, you need the latest version of the CloudFormation cli. You can install this with <code>pip install cloudformation-cli</code> (tip: you can use <a href="https://github.com/pipxproject/pipx">pipx</a> to keep your python environment clean). If you already had an older version installed, run <code>pip install --upgrade cloudformation-cli</code></p>
<h2>Starting a new project</h2>
<p>To create a new module, we follow a similar process as with Resource Providers. For this post, we&#8217;re going to create a module to set up an S3 Bucket and a CloudFront Distribution for static website hosting.</p>
<p>We first create a new directory, after that we run <code>cfn init</code>. This will ask us for input, and we can specify that we want to create a module for our generic static website</p>
<pre>~$ cfn init
Initializing new project
Do you want to develop a new resource(r) or a module(m)?.
&gt;&gt; m
What is the name of your module type?
(&lt;Organization&gt;::&lt;Service&gt;::&lt;Name&gt;::MODULE)
&gt;&gt; Cloudar::Generic::StaticWebsite::MODULE
Directory /cloudar_generic_staticwebsite/fragments Created
Initialized a new project in /cloudar_generic_staticwebsite
</pre>
<h2>Writing our module</h2>
<p>We already had a generic CloudFormation template that was doing a similar thing. So we deleted <code>sample.json</code> and replaced it with our own <code>website.yaml</code>. Officially, only json is supported, but in our test yaml worked fine. Since this is a test, we&#8217;re okay with taking the unsupported path. For use in a production environment, we can use <a href="https://github.com/awslabs/aws-cfn-template-flip">cfn-flip</a> to convert our template to json.</p>
<p>Depending on your template, you might not have to change anything. Going over the resources to make sure they have clear names and running <a href="https://github.com/aws-cloudformation/cfn-python-lint">cfn-lint</a> isn&#8217;t a bad idea though. <a href="https://github.com/WeAreCloudar/cloudformation-samples/tree/master/modules/cloudar_generic_staticwebsite">You can see the template we created on GitHub</a>.</p>
<h2>Deploying our module</h2>
<p>We already had our AWS credentials configured for the AWS cli. Which meant that the only thing we had to do for our deployment was running <code>cfn submit --region us-east-1</code>. If you are submitting multiple times, you can add <code>--set-default</code> to change the default version after submitting it.</p>
<p>You can see the deployed version, with all its properties in the CloudFormation console. This is also a great place to see all the resources our module will create</p>
<h2><img loading="lazy" decoding="async" class="alignnone wp-image-18132 size-medium" src="https://cloudar.be/wp-content/uploads/2020/11/Screenshot-2020-11-24-at-23.44.40-650x433.png" alt="Screenshot of our module in the CloudFormation Console. One of the tabs has a list of resources the module will create." width="650" height="433" srcset="https://cloudar.be/wp-content/uploads/2020/11/Screenshot-2020-11-24-at-23.44.40-650x433.png 650w, https://cloudar.be/wp-content/uploads/2020/11/Screenshot-2020-11-24-at-23.44.40-1300x867.png 1300w, https://cloudar.be/wp-content/uploads/2020/11/Screenshot-2020-11-24-at-23.44.40-325x217.png 325w" sizes="auto, (max-width: 650px) 100vw, 650px" /></h2>
<h2>Using our module</h2>
<p>This is where it gets really interesting, we are going to use the module we created. We made a template with one resource (<a href="https://github.com/WeAreCloudar/cloudformation-samples/blob/master/modules/cloudar_generic_staticwebsite/example-template.yaml">see Github for the full template</a>):</p>
<pre>Resources:
  StaticWebsite:
    Type: "Cloudar::Generic::StaticWebsite::MODULE"
    Properties:
      DomainName: !Ref DomainName
      HostedZoneId: !Ref HostedZoneId

</pre>
<p>CloudFormation will expand that for us, and put every resource that we defined in our module in our processed template.</p>
<p>After waiting for our deployment to finish, we can see all created resources and both our original and the processed template in the CloudFormation console.</p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-18133" src="https://cloudar.be/wp-content/uploads/2020/11/Screenshot-2020-11-24-at-23.52.03-650x433.png" alt="Screenshot of the CloudFormation Console with the processed template visible" width="650" height="433" srcset="https://cloudar.be/wp-content/uploads/2020/11/Screenshot-2020-11-24-at-23.52.03-650x433.png 650w, https://cloudar.be/wp-content/uploads/2020/11/Screenshot-2020-11-24-at-23.52.03-1300x867.png 1300w, https://cloudar.be/wp-content/uploads/2020/11/Screenshot-2020-11-24-at-23.52.03-325x217.png 325w" sizes="auto, (max-width: 650px) 100vw, 650px" /></p>
<h2>Next steps</h2>
<p>We&#8217;re very excited about this new release and are looking forward to seeing where this might lead. We also have a list of things we think might improve this even more (like an AWS::ModuleName pseudo-parameter), and will probably start conversations about that on the <a href="https://github.com/aws-cloudformation/aws-cloudformation-coverage-roadmap">roadmap</a> or <a href="https://github.com/aws-cloudformation/cloudformation-cli/issues">issue tracker</a> soon.</p>
<p>The post <a href="https://cloudar.be/awsblog/aws-cloudformation-modules-a-first-look/">AWS CloudFormation Modules: A first look</a> appeared first on <a href="https://cloudar.be">Cloudar</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Streaming video to AWS. Do you need Elemental Link?</title>
		<link>https://cloudar.be/awsblog/streaming-video-to-aws-do-you-need-elemental-link/</link>
		
		<dc:creator><![CDATA[Ben Bridts]]></dc:creator>
		<pubDate>Thu, 12 Nov 2020 12:59:40 +0000</pubDate>
				<category><![CDATA[AWS Blog]]></category>
		<guid isPermaLink="false">https://www.cloudar.be/?p=18105</guid>

					<description><![CDATA[<p>While Amazon Web Services is well-know for the services they provide (what&#8217;s in a name), they also sell some hardware to get video into the cloud:  Elemental Link 1. But what is it, and when would you use it? In this blog post we will take a high-level view at ingestion (getting data into the [&#8230;]</p>
<p>The post <a href="https://cloudar.be/awsblog/streaming-video-to-aws-do-you-need-elemental-link/">Streaming video to AWS. Do you need Elemental Link?</a> appeared first on <a href="https://cloudar.be">Cloudar</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>While Amazon Web Services is well-know for the services they provide (what&#8217;s in a name), they also sell some hardware to get video into the cloud:  Elemental Link <sup>1</sup>. But what is it, and when would you use it? In this blog post we will take a high-level view at ingestion (getting data into the cloud) to answer that question.</p>
<h1>Interactive Video Service</h1>
<p>The first (and newest) streaming option in AWS is <a class="editor-rtfLink" href="https://aws.amazon.com/ivs/" target="_blank" rel="noopener noreferrer">Interactive Video Service (or IVS</a>), which we can summarise as &#8220;your own Twitch&#8221;<sup>2</sup>. If you use this, you will be using some streaming software (like <a class="editor-rtfLink" href="https://obsproject.com/" target="_blank" rel="noopener noreferrer">OBS</a>) on a machine locally to convert your camera source (or screen share,  movie, &#8230;) and push it to AWS. IVS is interesting to consider as a first option, as the AWS Elemental suite has a lot more options and assumes a bit of a video-production/broadcasting background.</p>
<p>One caveat with software-based solutions is that you need to get the video on a computer. For a webcam, this is easy. For a stand-alone camera, you will need a &#8220;capture card&#8221;. These come in different styles with different prices. The most common inputs are HDMI and SDI<sup>3</sup> (used mainly in professional equipment). You might get this over USB or as a PCIe card. Prices range from ~20 USD (sometimes good quality, sometimes terrible) to ~200 USD (and more if you need more inputs or better quality).</p>
<h1>Elemental MediaLive</h1>
<p>The other significant AWS option is the <a href="https://www.elemental.com/">AWS Elemental</a> suite. We will assume that <a href="https://aws.amazon.com/medialive/">Elemental MediaLive</a> will be our destination. Like IVS, it&#8217;s made for streaming video. MediaLive is more flexible in the sources that it supports. It can get content from software that pushes to AWS or from an endpoint where it will request the data (pull). Note that we&#8217;re still talking about software, not camera&#8217;s at this point. <a class="editor-rtfLink" href="https://docs.aws.amazon.com/medialive/latest/ug/inputs-supported-containers.html" target="_blank" rel="noopener noreferrer">The list of supported formats is here</a>.</p>
<p>If your camera can output one of those options (take a note of whether this should happen in a VPC), you could use MediaLive directly. OBS has an RTMP output option, and MediaLive can accept an RTMP stream as input, so that could be one software solution to try out. You still have the capture card problem at this point (the chance of a non-ip-camera<sup>4</sup> outputting something usable is slim).</p>
<h1>Elemental Link</h1>
<p>You&#8217;ll notice two &#8220;special&#8221; formats/inputs on the list of supported inputs: MediaConnect and Elemental Link. We&#8217;ll skip MediaConnect in this explanation. You use that if you have an &#8220;encoder&#8221; locally.</p>
<p>That brings us finally to <a href="https://aws.amazon.com/medialive/features/link/">AWS Elemental Link</a>. Link is a dedicated hardware device to be the equivalent of the capture card + software (+ place to run the software) in one convenient, silent, package. You connect it to power, network, and HDMI or SDI, and it is preconfigured to stream to MediaLive in your account. It also gives you some control over the device from within the AWS console.</p>
<h1>Conclusion</h1>
<p>As we have seen in this blog post, you do not need Elemental Link to get video into AWS. There are different options for different situations. Sometimes a software solution might be better suited. Other times. the remote management and fanless operation might make AWS Elemental Link a better fit.</p>
<p>&nbsp;</p>
<hr />
<div style="font-size: smaller">
<ol>
<li>There is more AWS hardware sold than I expected. There are other Elemental appliances, Storage Gateway Hardware Appliance and some learning-focused hardware. Like DeepRacer, DeepComposer, IoT Button, &#8230;</li>
<li>That&#8217;s not completly true, but it is &#8220;built on the same live streaming technology that powers Twitch&#8221;</li>
<li>Some people, who I would like to thank for proofreading this, would point out that SDI is the &#8220;Standard Definition&#8221; standard, in a modern setting you would be using HD-SDI, 3G-SDI, or newer. On an unrelated note: many products that we still call &#8220;chalk&#8221; are made from other materials.</li>
<li>IP-cameras, are frequently used as security cameras. Security cameras won&#8217;t look good in most other use cases.</li>
</ol>
</div>
<p>The post <a href="https://cloudar.be/awsblog/streaming-video-to-aws-do-you-need-elemental-link/">Streaming video to AWS. Do you need Elemental Link?</a> appeared first on <a href="https://cloudar.be">Cloudar</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Level up your CloudFormation usage with these 4 tips</title>
		<link>https://cloudar.be/awsblog/level-up-your-cloudformation-usage-with-these-4-tips/</link>
		
		<dc:creator><![CDATA[Ben Bridts]]></dc:creator>
		<pubDate>Mon, 26 Oct 2020 11:22:33 +0000</pubDate>
				<category><![CDATA[AWS Blog]]></category>
		<category><![CDATA[DevOps]]></category>
		<guid isPermaLink="false">https://www.cloudar.be/?p=18087</guid>

					<description><![CDATA[<p>If you have been building on AWS, you are probably familiar with CloudFormation. It can be an extensive service to learn thoroughly, so even when you&#8217;re familiar with writing templates, there might still be some features you didn&#8217;t use yet. This blog post will highlight something you might not know yet in four different domains: [&#8230;]</p>
<p>The post <a href="https://cloudar.be/awsblog/level-up-your-cloudformation-usage-with-these-4-tips/">Level up your CloudFormation usage with these 4 tips</a> appeared first on <a href="https://cloudar.be">Cloudar</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>If you have been building on AWS, you are probably familiar with CloudFormation. It can be an extensive service to learn thoroughly, so even when you&#8217;re familiar with writing templates, there might still be some features you didn&#8217;t use yet.</p>
<p>This blog post will highlight something you might not know yet in four different domains: writing templates, securing deployments, usability, and extensibility. Hopefully, this allows you to do even more with CloudFormation</p>
<h3>CloudFormation Linting</h3>
<p>One of the best ways to increase your CloudFormation productivity is to minimize the time you&#8217;re waiting on a stack that failed to deploy. A great way to do that is to use <a href="https://github.com/aws-cloudformation/cfn-python-lint">cfn-lint</a> to make sure you don&#8217;t start the deploy if there are errors in your template.</p>
<p>Other tools like <a href="https://github.com/stelligent/cfn_nag">cfn-nag</a>, <a href="https://github.com/aws-cloudformation/cloudformation-guard">cfn-guard</a>, or <a href="https://github.com/aws-quickstart/taskcat">taskcat</a> will help you write secure, compliant, and region-independent templates, respectively. Cfn-lint is the one that will save you the most time when authoring templates by flagging misconfigurations, invalid properties, and misformatted templates. It also is easy to integrate into your IDE, <a href="https://pre-commit.com/">pre-commit</a>, or a CI/CD pipeline.</p>
<p>If you&#8217;re already using it, I don&#8217;t need to convince you of its value. I do, however, have some tips for getting the most out of it.</p>
<ul>
<li>You can include experimental rules with <code>--include-experimental</code>.</li>
<li>You can add your own checks (written in python) with <code>--append-rules</code></li>
<li>You can enable more built-in rules with <code>--include-checks I</code>. The I stands for info. One of these informational checks that I find very useful is a warning if a resource that might contain state has no <code>UpdateReplacePolicy</code>/<code>DeletionPolicy</code>.</li>
</ul>
<p>Another cool feature is that the linter can create a resource graph from your template. This is used by the tool to indicate when you write a circular dependency. It&#8217;s just as useful to resolve those circles or create a visual representation of your template.</p>
<h3>IAM Integration</h3>
<p>There are also some features of CloudFormation itself that I want to highlight. The first is how you can leverage its integration with IAM to prevent people from skipping the infrastructure-as-code step without completely locking down the account.</p>
<p>One way to accomplish that is to use a CloudFormation Service Role tied to your stack. This way, you can give minimal permission to your users and more broad permissions to CloudFormation. If you&#8217;re using ServiceCatalog to deploy infrastructure, you&#8217;re probably doing something very similar. This solution comes with some IAM complexity. The person creating the stack needs the <code>iam:PassRole</code> permission, but once set up, everyone who can update the stack will do so with that Role assumed by CloudFormation (whether you want that depends on your use case).</p>
<p>If you do not want to think about the effects of <code>iam:PassRole</code>, you can use the <code>aws:CalledVia</code> IAM condition in the IAM policy of the person using CloudFormation. Being an IAM condition comes with its own set of challenges, but you might be more familiar with those.</p>
<p>You use this method by specifying that certain actions are only allowed if the <code>aws:CalledVia</code> key is present and set to CloudFormation, and IAM will deny every request going directly to the service. <a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-calledvia">The documentation has a helpful diagram</a><br />
.</p>
<h3>Parameter Validation</h3>
<p>When using CloudFormation to deploy infrastructure, you can make it easier to put in the right parameters by using <code>AllowedPattern</code> and <code>AllowedValues</code>. Both of these only consider one parameter at a time. There is a way to validate Parameters that have a relationship with other parameters, though. Because you might want to validate that two parameters are mutually exclusive or that if one parameter is set, another parameter also has to have a value.</p>
<p>This is probably the most hidden CloudFormation feature because it&#8217;s <a href="https://docs.aws.amazon.com/servicecatalog/latest/adminguide/reference-template_constraint_rules.html">documented in the Service Catalog documentation</a>. And even though the Rules section seems to be a Service Catalog feature, you can use it directly in CloudFormation too. <a href="https://cloudar.be/awsblog/undocumented-feature-using-template-constraint-rules-in-cloudformation/">I wrote more about that in a previous blog post</a>.</p>
<h3>Resource Providers</h3>
<p>And this blogpost would not be complete without mentioning resource providers. Giving a full example of writing one would be <a href="https://cloudar.be/awsblog/writing-an-aws-cloudformation-resource-provider-in-python-step-by-step/">its own post</a>. Still, I&#8217;d like to show how this successor to custom resources has a lot of potential.</p>
<p>Resource Providers work similar to Custom Resources, and you will not see a big difference in your templates. They should be easier to manage, though (once they can be deployed with CloudFormation &#8211; <a href="https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-cloudformation">the CloudFormation team is actively working on that</a>). When you write your own Resource Provider, you also implement and expose a Read and List handler. This new approach gives you almost the same capabilities as a native CloudFormation resource.</p>
<p>By creating resource providers, modern features like <a href="https://aws.amazon.com/about-aws/whats-new/2020/10/aws-cloudformation-drift-detection-supports-cloudformation-registry-resource-types/">drift detection</a> and <a href="https://aws.amazon.com/about-aws/whats-new/2020/06/aws-cloudformation-resource-import-supports-cloudformation-registry-types/">resource import</a> work with your own resources – and will work with every new resource that AWS releases support for.</p>
<p>There is also <a href="https://aws.amazon.com/about-aws/whats-new/2020/06/aws-config-integrates-aws-cloudformation-registry/">an integration with AWS Config</a> for your Resource Providers, and AWS is <a href="https://github.com/search?q=topic%3Aaws-resources+org%3Aaws-cloudformation&amp;type=Repositories">developing more and more resource providers in the open</a>.</p>
<h3>Go build</h3>
<p>We looked at 4 different ways to improve your CloudFormation experience, and I&#8217;m looking forward to hearing your favorite tips and tricks. Good luck making things!</p>
<p>The post <a href="https://cloudar.be/awsblog/level-up-your-cloudformation-usage-with-these-4-tips/">Level up your CloudFormation usage with these 4 tips</a> appeared first on <a href="https://cloudar.be">Cloudar</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>The detailed updates to the Well-Architected Framework</title>
		<link>https://cloudar.be/awsblog/the-detailed-updates-to-the-well-architected-framework/</link>
		
		<dc:creator><![CDATA[Ben Bridts]]></dc:creator>
		<pubDate>Mon, 13 Jul 2020 06:54:37 +0000</pubDate>
				<category><![CDATA[AWS Blog]]></category>
		<category><![CDATA[Well-Architected]]></category>
		<guid isPermaLink="false">https://www.cloudar.be/?p=18001</guid>

					<description><![CDATA[<p>If you follow the AWS &#8220;What&#8217;s New&#8221; blog, you might have noticed that there&#8217;s a new version of the Well-Architected Framework. Since we&#8217;ve been doing regular Well-Architected Reviews, we were curious to see what changed. Unfortunately, the blog post did not include a list of changes. Luckily there are other places where you can find [&#8230;]</p>
<p>The post <a href="https://cloudar.be/awsblog/the-detailed-updates-to-the-well-architected-framework/">The detailed updates to the Well-Architected Framework</a> appeared first on <a href="https://cloudar.be">Cloudar</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>If you follow the AWS &#8220;What&#8217;s New&#8221; blog, you might have noticed that <a href="https://aws.amazon.com/about-aws/whats-new/2020/07/updates-aws-well-architected-framework-tool/">there&#8217;s a new version of the Well-Architected Framework</a>. Since we&#8217;ve been doing regular <a href="https://cloudar.be/services-solutions/aws-well-architected-review/">Well-Architected Reviews</a>, we were curious to see what changed.</p>
<p>Unfortunately, the blog post did not include a list of changes. Luckily there are other places where you can find those changes (if you know where to look):</p>
<p>For the quick summary of the changes, you can head over to the AWS Architecture Blog: <a href="https://aws.amazon.com/blogs/architecture/announcing-the-new-version-of-the-well-architected-framework/">Announcing the New Version of the Well-Architected Framework.</a></p>
<p>To find more details, with some additional context about why they changed, you can check out a different blog post for each pillar:</p>
<ul>
<li><a href="https://aws.amazon.com/blogs/architecture/whats-new-in-the-well-architected-operational-excellence-pillar/">What’s New in the Well-Architected Operational Excellence Pillar?</a> on the AWS Architecture Blog</li>
<li><a href="https://aws.amazon.com/blogs/security/updates-to-security-pillar-aws-well-architected-framework/">Updates to the security pillar of the AWS Well-Architected Framework</a> on the AWS Security Blog</li>
<li><a href="https://aws.amazon.com/blogs/architecture/whats-new-in-the-well-architected-reliability-pillar/">What’s New in the Well-Architected Reliability Pillar?</a> on the AWS Architecture Blog</li>
<li><a href="https://aws.amazon.com/blogs/architecture/whats-new-in-the-well-architected-performance-efficiency-pillar/">What’s New in the Well-Architected Performance Efficiency Pillar?</a> on the AWS Architecture Blog</li>
<li><a href="https://aws.amazon.com/blogs/aws-cost-management/launch-aws-well-architected-framework-cost-optimization-pillar/">What’s New in the AWS Well-Architected Cost Optimization Pillar</a> on the AWS Cost Management Blog</li>
</ul>
<p>If you want to see the actual changes, you would have to download both the old and the new PDF and put the questions side by side. And that&#8217;s exactly what we did. There is value in seeing the actual changes &#8211; even though the posts above already give a decent idea of what is different &#8211; but keep the following in mind when you look at the file we compiled:</p>
<ul>
<li>We only looked at the titles of the best practices. These aren&#8217;t the only improvements, there have been a lot of changes in the descriptions, examples, and explanations too.</li>
<li>Since the attached document only shows the changes, it&#8217;s recommended to use it side-by-side with the official pdf.</li>
<li>It&#8217;s not the prettiest looking document, but we hope it&#8217;s useful anyway.</li>
</ul>
<p>That being said, we&#8217;re interested to hear what you think of these changes!</p>
<p><a href="https://cloudar.be/wp-content/uploads/2020/07/well-architected-changes.pdf" target="_blank" rel="noopener noreferrer">Download the list of changes here</a></p>
<p>The post <a href="https://cloudar.be/awsblog/the-detailed-updates-to-the-well-architected-framework/">The detailed updates to the Well-Architected Framework</a> appeared first on <a href="https://cloudar.be">Cloudar</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
