<?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>authorization &#8211; Noise</title>
	<atom:link href="https://noise.getoto.net/tag/authorization/feed/" rel="self" type="application/rss+xml" />
	<link>https://noise.getoto.net</link>
	<description>The collective thoughts of the interwebz</description>
	<lastBuildDate>Tue, 17 Jun 2025 16:08:15 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.2</generator>
	<item>
		<title>Secure your Express application APIs in minutes with Amazon Verified Permissions</title>
		<link>https://noise.getoto.net/2025/06/17/secure-your-express-application-apis-in-minutes-with-amazon-verified-permissions/</link>
		
		<dc:creator><![CDATA[Trevor Schiavone]]></dc:creator>
		<pubDate>Tue, 17 Jun 2025 16:08:15 +0000</pubDate>
				<category><![CDATA[Advanced (300)]]></category>
		<category><![CDATA[Amazon Verified Permissions]]></category>
		<category><![CDATA[authorization]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[Security Blog]]></category>
		<category><![CDATA[Security, Identity & Compliance]]></category>
		<guid isPermaLink="false">http://noise.getoto.net/?guid=6c84ada385d66cd7723af38930bc2aa8</guid>

					<description><![CDATA[Today, Amazon Verified Permissions announced the release of @verifiedpermissions/authorization-clients-js, an open source package that developers can use to implement external fine-grained authorization for Express.js web application APIs in minutes when using Verified Permissions. Express is a minimal and flexible Node.js web application framework that provides a robust set of features for web and mobile applications. […]]]></description>
		
		
		<enclosure url="" length="0" type="" />

			</item>
		<item>
		<title>Connect your on-premises Kubernetes cluster to AWS APIs using IAM Roles Anywhere</title>
		<link>https://noise.getoto.net/2025/02/24/connect-your-on-premises-kubernetes-cluster-to-aws-apis-using-iam-roles-anywhere/</link>
		
		<dc:creator><![CDATA[Varun Sharma]]></dc:creator>
		<pubDate>Mon, 24 Feb 2025 16:25:01 +0000</pubDate>
				<category><![CDATA[Advanced (300)]]></category>
		<category><![CDATA[authentication]]></category>
		<category><![CDATA[authorization]]></category>
		<category><![CDATA[EKS]]></category>
		<category><![CDATA[IAM]]></category>
		<category><![CDATA[IAM Roles Anywhere]]></category>
		<category><![CDATA[Identity]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[Security Blog]]></category>
		<category><![CDATA[Security token service]]></category>
		<category><![CDATA[Security, Identity & Compliance]]></category>
		<category><![CDATA[Technical How-to]]></category>
		<category><![CDATA[X.509 certificate]]></category>
		<guid isPermaLink="false">http://noise.getoto.net/?guid=13538fb61a99518e62926adb5496f817</guid>

					<description><![CDATA[Many customers want to seamlessly integrate their on-premises Kubernetes workloads with AWS services, implement hybrid workloads, or migrate to AWS. Previously, a common approach involved creating long-term access keys, which posed security risks and is no longer recommended. While solutions such as Kubernetes secrets vault and third-party options exist, they fail to address the underlying […]]]></description>
		
		
		<enclosure url="" length="0" type="" />

			</item>
		<item>
		<title>Device Code Phishing</title>
		<link>https://noise.getoto.net/2025/02/19/device-code-phishing/</link>
		
		<dc:creator><![CDATA[Bruce Schneier]]></dc:creator>
		<pubDate>Wed, 19 Feb 2025 15:07:50 +0000</pubDate>
				<category><![CDATA[authentication]]></category>
		<category><![CDATA[authorization]]></category>
		<category><![CDATA[Phishing]]></category>
		<category><![CDATA[russia]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://www.schneier.com/?p=69948</guid>

					<description><![CDATA[<p>This isn’t new, but it’s <a href="https://arstechnica.com/information-technology/2025/02/russian-spies-use-device-code-phishing-to-hijack-microsoft-accounts/">increasingly popular</a>:</p>
<blockquote><p>The technique is known as device code phishing. It exploits “device code flow,” a form of authentication formalized in the industry-wide <a href="https://datatracker.ietf.org/doc/html/draft-ietf-oauth-device-flow-07#section-3.4">OAuth standard</a>. Authentication through device code flow is designed for logging printers, smart TVs, and similar devices into accounts. These devices typically don’t support browsers, making it difficult to sign in using more standard forms of authentication, such as entering user names, passwords, and two-factor mechanisms.</p>
<p>Rather than authenticating the user directly, the input-constrained device displays an alphabetic or alphanumeric device code along with a link associated with the user account. The user opens the link on a computer or other device that’s easier to sign in with and enters the code. The remote server then sends a token to the input-constrained device that logs it into the account...</p></blockquote>]]></description>
		
		
		<enclosure url="" length="0" type="" />

			</item>
		<item>
		<title>Enhancing data privacy with layered authorization for Amazon Bedrock Agents</title>
		<link>https://noise.getoto.net/2024/10/02/enhancing-data-privacy-with-layered-authorization-for-amazon-bedrock-agents/</link>
		
		<dc:creator><![CDATA[Jeremy Ware]]></dc:creator>
		<pubDate>Wed, 02 Oct 2024 14:23:18 +0000</pubDate>
				<category><![CDATA[Advanced (300)]]></category>
		<category><![CDATA[Amazon Bedrock]]></category>
		<category><![CDATA[Amazon Verified Permissions]]></category>
		<category><![CDATA[authentication]]></category>
		<category><![CDATA[authorization]]></category>
		<category><![CDATA[Best practices]]></category>
		<category><![CDATA[generative AI]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[Security Blog]]></category>
		<category><![CDATA[Security, Identity & Compliance]]></category>
		<guid isPermaLink="false">http://noise.getoto.net/?guid=8038eee1b93f1d391d3f5ebb3a166d05</guid>

					<description><![CDATA[Customers are finding several advantages to using generative AI within their applications. However, using generative AI adds new considerations when reviewing the threat model of an application, whether you’re using it to improve the customer experience for operational efficiency, to generate more tailored or specific results, or for other reasons. Generative AI models are inherently […]]]></description>
		
		
		<enclosure url="" length="0" type="" />

			</item>
		<item>
		<title>Network perimeter security protections for generative AI</title>
		<link>https://noise.getoto.net/2024/08/07/network-perimeter-security-protections-for-generative-ai/</link>
		
		<dc:creator><![CDATA[Riggs Goodman III]]></dc:creator>
		<pubDate>Wed, 07 Aug 2024 13:38:37 +0000</pubDate>
				<category><![CDATA[Amazon Bedrock]]></category>
		<category><![CDATA[authorization]]></category>
		<category><![CDATA[AWS Shield]]></category>
		<category><![CDATA[AWS WAF]]></category>
		<category><![CDATA[Best practices]]></category>
		<category><![CDATA[generative AI]]></category>
		<category><![CDATA[Intermediate (200)]]></category>
		<category><![CDATA[Security Blog]]></category>
		<category><![CDATA[Security, Identity & Compliance]]></category>
		<guid isPermaLink="false">http://noise.getoto.net/?guid=685ff4da5662a99d9314a5b4988a6dc9</guid>

					<description><![CDATA[Generative AI–based applications have grown in popularity in the last couple of years. Applications built with large language models (LLMs) have the potential to increase the value companies bring to their customers. In this blog post, we dive deep into network perimeter protection for generative AI applications. We’ll walk through the different areas of network […]]]></description>
		
		
		<enclosure url="" length="0" type="" />

			</item>
		<item>
		<title>AWS recognized as an Overall Leader in 2024 KuppingerCole Leadership Compass for Policy Based Access Management</title>
		<link>https://noise.getoto.net/2024/02/27/aws-recognized-as-an-overall-leader-in-2024-kuppingercole-leadership-compass-for-policy-based-access-management/</link>
		
		<dc:creator><![CDATA[Julian Lovelock]]></dc:creator>
		<pubDate>Tue, 27 Feb 2024 14:07:14 +0000</pubDate>
				<category><![CDATA[Amazon Verified Permissions]]></category>
		<category><![CDATA[announcements]]></category>
		<category><![CDATA[authorization]]></category>
		<category><![CDATA[Foundational (100)]]></category>
		<category><![CDATA[Security Blog]]></category>
		<category><![CDATA[Security, Identity & Compliance]]></category>
		<guid isPermaLink="false">http://noise.getoto.net/?guid=f6209715ceea4cae2d24a331ce234988</guid>

					<description><![CDATA[Amazon Web Services (AWS) was recognized by KuppingerCole Analysts AG as an Overall Leader in the firm’s Leadership Compass report for Policy Based Access Management. The Leadership Compass report reveals Amazon Verified Permissions as an Overall Leader (as shown in Figure 1), a Product Leader for functional strength, and an Innovation Leader for open source […]]]></description>
		
		
		<enclosure url="" length="0" type="" />

			</item>
		<item>
		<title>How to implement cryptographic modules to secure private keys used with IAM Roles Anywhere</title>
		<link>https://noise.getoto.net/2023/09/20/how-to-implement-cryptographic-modules-to-secure-private-keys-used-with-iam-roles-anywhere/</link>
		
		<dc:creator><![CDATA[Edouard Kachelmann]]></dc:creator>
		<pubDate>Wed, 20 Sep 2023 19:55:17 +0000</pubDate>
				<category><![CDATA[Advanced (300)]]></category>
		<category><![CDATA[authentication]]></category>
		<category><![CDATA[authorization]]></category>
		<category><![CDATA[AWS Identity and Access Management (IAM)]]></category>
		<category><![CDATA[Cryptographic library]]></category>
		<category><![CDATA[Hardware security modules]]></category>
		<category><![CDATA[IAM Roles Anywhere]]></category>
		<category><![CDATA[Identity]]></category>
		<category><![CDATA[PKCS#11]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[Security Blog]]></category>
		<category><![CDATA[Security, Identity & Compliance]]></category>
		<category><![CDATA[Technical How-to]]></category>
		<category><![CDATA[X.509 certificate]]></category>
		<category><![CDATA[YubiKey]]></category>
		<guid isPermaLink="false">http://noise.getoto.net/?guid=1d7699bb596f154a24033002b191c972</guid>

					<description><![CDATA[AWS Identity and Access Management (IAM) Roles Anywhere enables workloads that run outside of Amazon Web Services (AWS), such as servers, containers, and applications, to use X.509 digital certificates to obtain temporary AWS credentials and access AWS resources, the same way that you use IAM roles for workloads on AWS. Now, IAM Roles Anywhere allows […]]]></description>
		
		
		<enclosure url="" length="0" type="" />

			</item>
		<item>
		<title>How to Grant Another SES Account or User Permission To Send Emails</title>
		<link>https://noise.getoto.net/2023/06/30/how-to-grant-another-ses-account-or-user-permission-to-send-emails/</link>
		
		<dc:creator><![CDATA[bajavani]]></dc:creator>
		<pubDate>Fri, 30 Jun 2023 19:40:17 +0000</pubDate>
				<category><![CDATA[Amazon Simple Email Service]]></category>
		<category><![CDATA[Amazon Simple Email Service (SES)]]></category>
		<category><![CDATA[authorization]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[email best practices]]></category>
		<category><![CDATA[outbound email]]></category>
		<category><![CDATA[Technical How-to]]></category>
		<guid isPermaLink="false">http://noise.getoto.net/?guid=c77356e279585a593008efdf71f205c7</guid>

					<description><![CDATA[Amazon Simple Email Service (Amazon SES) is a bulk and transactional email sending service for businesses and developers. To send emails from a particular email address through SES, users have to verify ownership of the email address, the domain used by the email address, or a parent domain of the domain used by the email […]]]></description>
		
		
		<enclosure url="" length="0" type="" />

			</item>
		<item>
		<title>ABAC on SpiceDB: Enabling Netflix’s Complex Identity Types</title>
		<link>https://noise.getoto.net/2023/05/19/abac-on-spicedb-enabling-netflixs-complex-identity-types/</link>
		
		<dc:creator><![CDATA[Netflix Technology Blog]]></dc:creator>
		<pubDate>Fri, 19 May 2023 12:01:47 +0000</pubDate>
				<category><![CDATA[authorization]]></category>
		<category><![CDATA[distributed-systems]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[software-architecture]]></category>
		<guid isPermaLink="false">https://medium.com/p/c118f374fa89</guid>

					<description><![CDATA[<p>By <a href="https://www.linkedin.com/in/chris-w-0a884022/">Chris Wolfe</a>, <a href="https://www.linkedin.com/in/joseph-s-4324904/">Joey Schorr</a>, and <a href="https://www.linkedin.com/in/vroldanbet/">Victor Roldán Betancort</a></p><h3>Introduction</h3><p>The authorization team at Netflix recently sponsored work to add Attribute Based Access Control (ABAC) support to AuthZed’s <a href="https://github.com/authzed/spicedb">open source Google Zanzibar inspired</a> authorization system, <a href="https://authzed.com/products/spicedb">SpiceDB</a>. Netflix required attribute support in SpiceDB to support core Netflix application identity constructs. This post discusses why Netflix wanted ABAC support in SpiceDB, how Netflix collaborated with AuthZed, the end result–<a href="https://authzed.com/docs/reference/caveats">SpiceDB Caveats</a>, and how Netflix may leverage this new feature.</p><p>Netflix is always looking for security, ergonomic, or efficiency improvements, and this extends to authorization tools. <a href="https://authzed.com/blog/what-is-google-zanzibar">Google Zanzibar</a> is exciting to Netflix as it makes it easier to produce authorization decision objects and reverse indexes for resources a principal can access.</p><p>Last year, while experimenting with Zanzibar approaches to authorization, Netflix found SpiceDB, the <a href="https://github.com/authzed/spicedb">open source Google Zanzibar inspired permission system</a>, and built a prototype to experiment with modeling. The prototype uncovered trade-offs required to implement Attribute Based Access Control in SpiceDB, which made it poorly suited to Netflix’s core requirements for application identities.</p><h3>Why did Netflix Want Caveated Relationships?</h3><p>Netflix application identities are fundamentally attribute based: e.g. an instance of the Data Processor runs in eu-west-1 in the test environment with a public shard.</p><p>Authorizing these identities is done not only by application name, but by specifying specific attributes on which to match. An application owner might want to craft a policy like “Application members of the EU data processors group can access a PI decryption key”. This is one normal relationship in SpiceDB. But, they might also want to specify a policy for compliance reasons that only allows access to the PI key from data processor instances running in the EU within a sensitive shard. Put another way, an identity should only be considered to have the “is member of the EU-data-processors group” if certain identity attributes (like region==eu) match in addition to the application name. This is a Caveated SpiceDB relationship.</p><h3>Netflix Modeling Challenges Before Caveats</h3><p>SpiceDB, being a Relationship Based Access Control (ReBAC) system, expected authorization checks to be performed against the existence of a specific relationship between objects. Users fit this model — they have a single user ID to describe who they are. As described above, Netflix applications do not fit this model. Their attributes are used to scope permissions to varying degrees.</p><p>Netflix ran into significant difficulties in trying to fit their existing policy model into relations. To do so Netflix’s design required:</p><ul><li>An event based mechanism that could ingest information about application autoscaling groups. An autoscaling group isn’t the lowest level of granularity, but it’s relatively close to the lowest level where we’d typically see authorization policy applied.</li><li>Ingest the attributes describing the autoscaling group and write them as separate relations. That is for the data-processor, Netflix would need to write relations describing the region, environment, account, application name, etc.</li><li>At authZ check time, provide the attributes for the identity to check, e.g. “can app bar in us-west-2 access this document.” SpiceDB is then responsible for figuring out which relations map back to the autoscaling group, e.g. name, environment, region, etc.</li><li>A cleanup process to prune stale relationships from the database.</li></ul><p>What was problematic about this design? Aside from being complicated, there were a few specific things that made Netflix uncomfortable. The most salient being that i<strong>t wasn’t resilient to an absence of relationship data, e.g. if a new autoscaling group started and reporting its presence to SpiceDB had not yet happened, the autoscaling group members would be missing necessary permissions to run</strong>. All this meant that Netflix would have to write and prune the relationship state with significant freshness requirements. This would be a significant departure from its existing policy based system.</p><p>While working through this, Netflix hopped into the SpiceDB Discord to chat about possible solutions and found an open community issue: the <a href="https://github.com/authzed/spicedb/issues/386">caveated relationships proposal</a>.</p><h3>The Beginning of SpiceDB Caveats</h3><p>The SpiceDB community had already explored <a href="https://github.com/authzed/spicedb/issues/158">integrating SpiceDB with Open Policy Agent (OPA)</a> and concluded it strayed too far from Zanzibar’s core promise of global horizontal scalability with strong consistency. With Netflix’s support, the AuthZed team pondered a Zanzibar-native approach to Attribute-Based Access Control.</p><p>The requirements were captured and published as the <a href="https://github.com/authzed/spicedb/issues/386">caveated relationships proposal on GitHub</a> for feedback from the SpiceDB community. The community’s excitement and interest became apparent through comments, reactions, and conversations on the <a href="https://authzed.com/discord">SpiceDB Discord server</a>. Clearly, Netflix wasn’t the only one facing challenges when reconciling SpiceDB with policy-based approaches, so Netflix decided to help! By sponsoring the project, Netflix was able to help AuthZed prioritize engineering effort and accelerate adding Caveats to SpiceDB.</p><h3>Building SpiceDB Caveats</h3><h4>Quick Intro to SpiceDB</h4><p>The <a href="https://authzed.com/docs/reference/schema-lang">SpiceDB Schema Language</a> lays the rules for how to build, traverse, and interpret SpiceDB’s Relationship Graph to make authorization decisions. SpiceDB Relationships, e.g., document:readme writer user:emilia, are stored as relationships that represent a graph within a datastore like CockroachDB or PostgreSQL. SpiceDB walks the graph and decomposes it into subproblems. These subproblems are assigned through <a href="https://authzed.com/blog/consistent-hash-load-balancing-grpc/">consistent hashing</a> and dispatched to a node in a cluster running SpiceDB. Over time, each node caches a subset of subproblems to support a distributed cache, reduce the datastore load, and achieve SpiceDB’s horizontal scalability.</p><h4>SpiceDB Caveats Design</h4><p>The fundamental challenge with policies is that their input arguments can change the authorization result as understood by a centralized relationships datastore. If SpiceDB were to cache subproblems that have been “tainted” with policy variables, the likelihood those are reused for other requests would decrease and thus severely affect the cache hit rate. As you’d suspect, this would jeopardize one of the pillars of the system: its ability to scale.</p><p>Once you accept that adding input arguments to the distributed cache isn’t efficient, you naturally gravitate toward the first question: what if you keep those inputs out of the cached subproblems? They are only known at request-time, so let’s add them as a variable in the subproblem! The cost of propagating those variables, assembling them, and executing the logic pales compared to fetching relationships from the datastore.</p><p>The next question was: how do you integrate the policy decisions into the relationships graph? The SpiceDB Schema Languages’ core concepts are <a href="https://authzed.com/docs/reference/glossary#relation">Relations</a> and <a href="https://authzed.com/docs/reference/glossary#permission">Permissions</a>; these are how a developer defines the shape of their relationships and how to traverse them. Naturally, being a graph, it’s fitting to add policy logic at the edges or the nodes. That leaves at least two obvious options: <strong>policy at the Relation level, or policy at the Permission level.</strong></p><p>After iterating on both options to get a feel for the ergonomics and expressiveness the choice was <strong>policy at the relation level</strong>. After all, SpiceDB is a Relationship Based Access Control (ReBAC) system. Policy at the relation level allows you to parameterize each relationship, which brought about the saying “this relationship exists, but with a Caveat!.” With this approach, SpiceDB could do request-time relationship vetoing like so:</p><pre>definition human {}<br><br>caveat the_answer(received int) {<br>  received == 42<br>}<br>definition the_answer_to_life_the_universe_and_everything {<br>  relation humans: human with the_answer<br>  permission enlightenment = humans</pre><p>Netflix and AuthZed discussed the concept of static versus dynamic Caveats as well. A developer would define static Caveat expressions in the SpiceDB Schema, while dynamic Caveats would have expressions defined at run time. The discussion centered around typed versus dynamic programming languages, but given SpiceDB’s Schema Language was designed for type safety, it seemed coherent with the overall design to continue with static Caveats. To support runtime-provided policies, the choice was to introduce expressions as arguments to a Caveat. Keeping the SpiceDB Schema easy to understand was a key driver for this decision.</p><p>For defining Caveats, the main requirement was to provide an expression language with first-class support for partially-evaluated expressions. <a href="https://github.com/google/cel-spec">Google’s CEL</a> seemed like the obvious choice: a protobuf-native expression language that evaluates in linear time, with first-class support for partial results that can be run at the edge, and is not turing complete. CEL expressions are type-safe, so they wouldn’t cause as many errors at runtime and can be stored in the datastore as a compiled protobuf. Given the near-perfect requirement match, it does make you wonder what Google’s Zanzibar has been up to since the white paper!</p><p>To execute the logic, SpiceDB would have to return a third response CAVEATED, in addition to ALLOW and DENY, to signal that a result of a CheckPermission request depends on computing an unresolved chain of CEL expressions.</p><p>SpiceDB Caveats needed to allow static input variables to be stored before evaluation to represent the multi-dimensional nature of Netflix application identities. Today, this is called “Caveat context,” defined by the values written in a SpiceDB Schema alongside a Relation and those provided by the client. Think of build time variables as an expansion of a templated CEL expression, and those take precedence over request-time arguments. Here is an example:</p><pre>caveat the_answer(received int, expected int) {<br>  received == expected<br>}</pre><p>Lastly, to deal with scenarios where there are multiple Caveated subproblems, the decision was to collect up a final CEL expression tree before evaluating it. The result of the final evaluation can be ALLOW, DENY, or CAVEATED. Things get trickier with wildcards and SpiceDB APIs, but let’s save that for another post! If the response is CAVEATED, the client receives a list of missing variables needed to properly evaluate the expression.</p><p>To sum up! The primary design decisions were:</p><ul><li>Caveats defined at the Relation-level, not the Permission-level</li><li>Keep Caveats in line with SpiceDB Schema’s type-safe nature</li><li>Support well-typed values provided by the caller</li><li>Use Google’s CEL to define Caveat expressions</li><li>Introduce a new result type: CAVEATED</li></ul><h3>How do SpiceDB Caveats Change Authorizing Netflix Identities?</h3><p><a href="https://authzed.com/docs/reference/caveats">SpiceDB Caveats</a> simplify this approach by allowing Netflix to specify authorization policy as they have in the past for applications. Instead of needing to have the entire state of the authorization world persisted as relations, the system can have relations and attributes of the identity used at authorization check time.</p><p>Now Netflix can write a Caveat similar to match_fine , described below, that takes lists of expected attributes, e.g. region, account, etc. This Caveat would allow the specific application named by the relation as long as the context of the authorization check had an observed account, stack, detail, region, and extended attribute values that matched the values in their expected counterparts. This <a href="https://play.authzed.com/s/51q8FOZ1PlzG/assertions">playground</a> has a live version of the schema, relations, etc. with which to experiment.</p><pre>definition app {}<br><br>caveat match_fine(<br>  expected_accounts list&#60;string&#62;,<br>  expected_regions list&#60;string&#62;,<br>  expected_stacks list&#60;string&#62;,<br>  expected_details list&#60;string&#62;,<br>  expected_ext_attrs map&#60;any&#62;,<br>  observed_account string,<br>  observed_region string,<br>  observed_stack string,<br>  observed_detail string,<br>  observed_ext_attrs map&#60;any&#62;<br>) {<br>  observed_account in expected_accounts &#38;&#38;<br>  observed_region in expected_regions &#38;&#38;<br>  observed_stack in expected_stacks &#38;&#38;<br>  observed_detail in expected_details &#38;&#38;<br>  expected_ext_attrs.isSubtreeOf(observed_ext_attrs)<br>}<br><br>definition movie {<br>  relation replicator: app with match_fine<br>  permission replicate = replicator<br>}</pre><p>Using this SpiceDB Schema we can write a relation to restrict access to the replicator application. It should only be allowed to run when</p><ul><li>It is in the highrisk or birdie accounts</li><li>AND in either us-west-1 or us-east-1</li><li>AND it has stack bg</li><li>AND it has detail casser</li><li>AND its extended attributes contain the key-value pair ‘foo: bar’</li></ul><pre>movie:newspecial#replicator@app:mover[match_fine:{"expected_accounts":["highrisk","birdie"],"expected_regions":["us-west-1","us-east-1"],"expected_stacks":["bg"],"expected_details":["casser"],"expected_ext_attrs":{"foo":"bar"}}]</pre><p>With the playground we can also make assertions that can mirror the behavior we’d see from the CheckPermission API. These assertions make it clear that our caveats work as expected.</p><pre>assertTrue:<br>- 'movie:newspecial#replicate@app:mover with {"observed_account": "highrisk", "observed_region": "us-west-1", "observed_stack": "bg", "observed_detail": "casser", "observed_ext_attrs": {"foo": "bar"}}'<br>assertFalse:<br>- 'movie:newspecial#replicate@app:mover with {"observed_account": "lowrisk", "observed_region": "us-west-1", "observed_stack": "bg", "observed_detail": "casser", "observed_ext_attrs": {"foo": "bar"}}'<br>- 'movie:newspecial#replicate@app:purger with {"observed_account": "highrisk", "observed_region": "us-west-1", "observed_stack": "bg", "observed_detail": "casser", "observed_ext_attrs": {"foo": "bar"}}'</pre><h3>Closing</h3><p>Netflix and AuthZed are both excited about the collaboration’s outcome. Netflix has another authorization tool it can employ and SpiceDB users have another option with which to perform rich authorization checks. Bridging the gap between policy based authorization and ReBAC is a powerful paradigm that is already benefiting companies looking to Zanzibar based implementations for modernizing their authorization stack.</p><h3>Acknowledgments</h3><ul><li><a href="https://www.linkedin.com/in/chris-w-0a884022/">Chris Wolfe</a></li><li><a href="https://www.linkedin.com/in/joseph-s-4324904/">Joey Schorr</a></li><li><a href="https://www.linkedin.com/in/vroldanbet/">Victor Roldán Betancort</a></li><li><a href="https://www.linkedin.com/in/chestonlee/">Cheston Lee</a></li></ul><h3>Additional Reading</h3><ul><li><a href="https://authzed.com/blog/what-is-google-zanzibar">What is Google Zanzibar</a></li><li><a href="https://authzed.com/zanzibar">Annotated Google Zanzibar Paper</a></li><li><a href="https://github.com/authzed/spicedb">SpiceDB, an Open Source, Google Zanzibar Inspired Authorization System</a></li><li><a href="https://github.com/google/cel-spec">Google’s CEL</a></li><li>SpiceDB <a href="https://authzed.com/docs/reference/glossary">Glossary</a></li><li><a href="https://authzed.com/blog/top-three-caveat-use-cases/">Top-3 Most Used SpiceDB Caveat Patterns (authzed.com)</a></li><li><a href="https://authzed.com/blog/check-it-out">How Permissions are Answered in SpiceDB</a></li><li><a href="https://play.authzed.com/s/51q8FOZ1PlzG">Netflix Complex Identities Example Schema</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&#38;referrerSource=full_rss&#38;postId=c118f374fa89" width="1" height="1" alt=""><hr><p><a href="https://netflixtechblog.com/abac-on-spicedb-enabling-netflixs-complex-identity-types-c118f374fa89">ABAC on SpiceDB: Enabling Netflix’s Complex Identity Types</a> was originally published in <a href="https://netflixtechblog.com/">Netflix TechBlog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></description>
		
		
		<enclosure url="" length="0" type="" />

			</item>
		<item>
		<title>How to monitor and query IAM resources at scale – Part 2</title>
		<link>https://noise.getoto.net/2023/02/21/how-to-monitor-and-query-iam-resources-at-scale-part-2/</link>
		
		<dc:creator><![CDATA[Michael Chan]]></dc:creator>
		<pubDate>Tue, 21 Feb 2023 20:15:45 +0000</pubDate>
				<category><![CDATA[authorization]]></category>
		<category><![CDATA[AWS Identity and Access Management (IAM)]]></category>
		<category><![CDATA[control plane]]></category>
		<category><![CDATA[data plane]]></category>
		<category><![CDATA[eventual consistency]]></category>
		<category><![CDATA[IAM]]></category>
		<category><![CDATA[Intermediate (200)]]></category>
		<category><![CDATA[Rate-limiting]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[Security Blog]]></category>
		<category><![CDATA[Security, Identity & Compliance]]></category>
		<category><![CDATA[Technical How-to]]></category>
		<category><![CDATA[throttling]]></category>
		<guid isPermaLink="false">http://noise.getoto.net/?guid=b8d21a489702fce848fa415e6f46f32a</guid>

					<description><![CDATA[In this post, we continue with our recommendations for using AWS Identity and Access Management (IAM) APIs. In part 1 of this two-part series, we described how you could create IAM resources and use them soon after for authorization decisions. We also described options for monitoring and responding to IAM resource changes for entire accounts. […]]]></description>
		
		
		<enclosure url="" length="0" type="" />

			</item>
		<item>
		<title>How to monitor and query IAM resources at scale – Part 1</title>
		<link>https://noise.getoto.net/2023/02/21/how-to-monitor-and-query-iam-resources-at-scale-part-1/</link>
		
		<dc:creator><![CDATA[Michael Chan]]></dc:creator>
		<pubDate>Tue, 21 Feb 2023 20:14:33 +0000</pubDate>
				<category><![CDATA[authorization]]></category>
		<category><![CDATA[AWS Identity and Access Management (IAM)]]></category>
		<category><![CDATA[control plane]]></category>
		<category><![CDATA[data plane]]></category>
		<category><![CDATA[eventual consistency]]></category>
		<category><![CDATA[IAM]]></category>
		<category><![CDATA[Intermediate (200)]]></category>
		<category><![CDATA[Rate-limiting]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[Security Blog]]></category>
		<category><![CDATA[Security, Identity & Compliance]]></category>
		<category><![CDATA[Technical How-to]]></category>
		<category><![CDATA[throttling]]></category>
		<guid isPermaLink="false">http://noise.getoto.net/?guid=811f3a8796e583f57efa94b20352cef8</guid>

					<description><![CDATA[In this two-part blog post, we’ll provide recommendations for using AWS Identity and Access Management (IAM) APIs, and we’ll share useful details on how IAM works so that you can use it more effectively. For example, you might be creating new IAM resources such as roles and policies through automation and notice a delay for resource propagations. […]]]></description>
		
		
		<enclosure url="" length="0" type="" />

			</item>
		<item>
		<title>Extend AWS IAM roles to workloads outside of AWS with IAM Roles Anywhere</title>
		<link>https://noise.getoto.net/2022/07/06/extend-aws-iam-roles-to-workloads-outside-of-aws-with-iam-roles-anywhere/</link>
		
		<dc:creator><![CDATA[Faraz Angabini]]></dc:creator>
		<pubDate>Wed, 06 Jul 2022 20:04:19 +0000</pubDate>
				<category><![CDATA[authentication]]></category>
		<category><![CDATA[authorization]]></category>
		<category><![CDATA[IAM]]></category>
		<category><![CDATA[IAM Roles Anywhere]]></category>
		<category><![CDATA[Identity]]></category>
		<category><![CDATA[Intermediate (200)]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[Security Blog]]></category>
		<category><![CDATA[Security token service]]></category>
		<category><![CDATA[Security, Identity & Compliance]]></category>
		<category><![CDATA[X.509 certificate]]></category>
		<guid isPermaLink="false">http://noise.getoto.net/?guid=cff4834bab36c6b70e055100854ff393</guid>

					<description><![CDATA[AWS Identity and Access Management (IAM) has now made it easier for you to use IAM roles for your workloads that are running outside of AWS, with the release of IAM Roles Anywhere. This feature extends the capabilities of IAM roles to workloads outside of AWS. You can use IAM Roles Anywhere to provide a […]]]></description>
		
		
		<enclosure url="" length="0" type="" />

			</item>
		<item>
		<title>Use Amazon Cognito to add claims to an identity token for fine-grained authorization</title>
		<link>https://noise.getoto.net/2022/06/08/use-amazon-cognito-to-add-claims-to-an-identity-token-for-fine-grained-authorization/</link>
		
		<dc:creator><![CDATA[Ajit Ambike]]></dc:creator>
		<pubDate>Wed, 08 Jun 2022 17:55:48 +0000</pubDate>
				<category><![CDATA[Amazon Cognito]]></category>
		<category><![CDATA[authorization]]></category>
		<category><![CDATA[Claims]]></category>
		<category><![CDATA[Expert (400)]]></category>
		<category><![CDATA[Identity Token]]></category>
		<category><![CDATA[Security Blog]]></category>
		<category><![CDATA[Security, Identity & Compliance]]></category>
		<guid isPermaLink="false">http://noise.getoto.net/?guid=d06077377da63024a5fca1c9ef6a44b6</guid>

					<description><![CDATA[With Amazon Cognito, you can quickly add user sign-up, sign-in, and access control to your web and mobile applications. After a user signs in successfully, Cognito generates an identity token for user authorization. The service provides a pre token generation trigger, which you can use to customize identity token claims before token generation. In this […]]]></description>
		
		
		<enclosure url="" length="0" type="" />

			</item>
		<item>
		<title>Forging Australian Driver’s Licenses</title>
		<link>https://noise.getoto.net/2022/05/23/forging-australian-drivers-licenses/</link>
		
		<dc:creator><![CDATA[Bruce Schneier]]></dc:creator>
		<pubDate>Mon, 23 May 2022 11:09:25 +0000</pubDate>
				<category><![CDATA[authorization]]></category>
		<category><![CDATA[cars]]></category>
		<category><![CDATA[encryption]]></category>
		<category><![CDATA[forgery]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://www.schneier.com/?p=65446</guid>

					<description><![CDATA[<p>The New South Wales digital driver’s license has <a href="https://blog.dvuln.com/blogs/servicensw-digital-superbad">multiple implementation flaws</a> that allow for easy forgeries.</p>
<blockquote><p>This file is encrypted using AES-256-CBC encryption combined with Base64 encoding.</p>
<p>A 4-digit application PIN (which gets set during the initial onboarding when a user first instals the application) is the encryption password used to protect or encrypt the licence data.</p>
<p>The problem here is that an attacker who has access to the encrypted licence data (whether that be through accessing a phone backup, direct access to the device or remote compromise) could easily brute-force this 4-digit PIN by using a script that would try all 10,000 combinations…...</p></blockquote>]]></description>
		
		
		<enclosure url="" length="0" type="" />

			</item>
		<item>
		<title>Scaling cross-account AWS KMS–encrypted Amazon S3 bucket access using ABAC</title>
		<link>https://noise.getoto.net/2022/02/23/scaling-cross-account-aws-kms-encrypted-amazon-s3-bucket-access-using-abac/</link>
		
		<dc:creator><![CDATA[Jorg Huser]]></dc:creator>
		<pubDate>Wed, 23 Feb 2022 20:19:34 +0000</pubDate>
				<category><![CDATA[ABAC]]></category>
		<category><![CDATA[Advanced (300)]]></category>
		<category><![CDATA[Amazon EMR]]></category>
		<category><![CDATA[Amazon S3]]></category>
		<category><![CDATA[Attribute-based access control]]></category>
		<category><![CDATA[authorization]]></category>
		<category><![CDATA[AWS Key Management Service (KMS)]]></category>
		<category><![CDATA[AWS Lake Formation]]></category>
		<category><![CDATA[Big Data Platform]]></category>
		<category><![CDATA[Big Data Security Management]]></category>
		<category><![CDATA[cross-account privilege design escalation]]></category>
		<category><![CDATA[Data Lake]]></category>
		<category><![CDATA[Data Protection in Data Lakes]]></category>
		<category><![CDATA[Key management]]></category>
		<category><![CDATA[Key Management for Big Data]]></category>
		<category><![CDATA[PrincipalOrgId]]></category>
		<category><![CDATA[Resource-based policies]]></category>
		<category><![CDATA[Security Blog]]></category>
		<category><![CDATA[Security, Identity & Compliance]]></category>
		<guid isPermaLink="false">http://noise.getoto.net/?guid=4be77477157ab5936b2faa4570cb47cb</guid>

					<description><![CDATA[This blog post shows you how to share encrypted Amazon Simple Storage Service (Amazon S3) buckets across accounts on a multi-tenant data lake. Our objective is to show scalability over a larger volume of accounts that can access the data lake, in a scenario where there is one central account to share from. Most use […]]]></description>
		
		
		<enclosure url="" length="0" type="" />

			</item>
		<item>
		<title>Control access to Amazon Elastic Container Service resources by using ABAC policies</title>
		<link>https://noise.getoto.net/2022/02/17/control-access-to-amazon-elastic-container-service-resources-by-using-abac-policies/</link>
		
		<dc:creator><![CDATA[Kriti Heda]]></dc:creator>
		<pubDate>Thu, 17 Feb 2022 17:58:35 +0000</pubDate>
				<category><![CDATA[ABAC]]></category>
		<category><![CDATA[Amazon ECS]]></category>
		<category><![CDATA[Attribute-based access control]]></category>
		<category><![CDATA[authorization]]></category>
		<category><![CDATA[AWS IAM]]></category>
		<category><![CDATA[Intermediate (200)]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[Security Blog]]></category>
		<category><![CDATA[Security, Identity & Compliance]]></category>
		<category><![CDATA[Tags]]></category>
		<category><![CDATA[TBAC]]></category>
		<guid isPermaLink="false">http://noise.getoto.net/?guid=f9cc292dcc0a48112ebb6b2c9eba54e2</guid>

					<description><![CDATA[As an AWS customer, if you use multiple Amazon Elastic Container Service (Amazon ECS) services/tasks to achieve better isolation, you often have the challenge of how to manage access to these containers. In such cases, using tags can enable you to categorize these services in different ways, such as by owner or environment. This blog […]]]></description>
		
		
		<enclosure url="" length="0" type="" />

			</item>
		<item>
		<title>How to secure API Gateway HTTP endpoints with JWT authorizer</title>
		<link>https://noise.getoto.net/2022/02/14/how-to-secure-api-gateway-http-endpoints-with-jwt-authorizer/</link>
		
		<dc:creator><![CDATA[Siva Rajamani]]></dc:creator>
		<pubDate>Mon, 14 Feb 2022 18:32:19 +0000</pubDate>
				<category><![CDATA[*Learning Levels]]></category>
		<category><![CDATA[API GW]]></category>
		<category><![CDATA[authorization]]></category>
		<category><![CDATA[AWS security]]></category>
		<category><![CDATA[Expert (400)]]></category>
		<category><![CDATA[IAM]]></category>
		<category><![CDATA[JWT authorizer]]></category>
		<category><![CDATA[Lambda Authorizer]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[Security, Identity & Compliance]]></category>
		<category><![CDATA[serverless]]></category>
		<guid isPermaLink="false">http://noise.getoto.net/?guid=78711705addbceb09dddcf35444c2f18</guid>

					<description><![CDATA[This blog post demonstrates how you can secure Amazon API Gateway HTTP endpoints with JSON web token (JWT) authorizers. Amazon API Gateway helps developers create, publish, and maintain secure APIs at any scale, helping manage thousands of API calls. There are no minimum fees, and you only pay for the API calls you receive. Based […]]]></description>
		
		
		<enclosure url="" length="0" type="" />

			</item>
		<item>
		<title>Managing permissions with grants in AWS Key Management Service</title>
		<link>https://noise.getoto.net/2021/11/09/managing-permissions-with-grants-in-aws-key-management-service/</link>
		
		<dc:creator><![CDATA[Rick Yin]]></dc:creator>
		<pubDate>Mon, 08 Nov 2021 22:07:30 +0000</pubDate>
				<category><![CDATA[Advanced (300)]]></category>
		<category><![CDATA[authorization]]></category>
		<category><![CDATA[AWS Key Management Service*]]></category>
		<category><![CDATA[AWS KMS]]></category>
		<category><![CDATA[Grants]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Scaling]]></category>
		<category><![CDATA[Security Blog]]></category>
		<category><![CDATA[Security, Identity & Compliance]]></category>
		<guid isPermaLink="false">http://noise.getoto.net/?guid=80dfdf5adcf1f019b0d1c89bd4f8142e</guid>

					<description><![CDATA[AWS Key Management Service (AWS KMS) helps customers to use encryption to secure their data. When creating a new encrypted Amazon Web Services (AWS) resource, such as an Amazon Relational Database Service (Amazon RDS) database or an Amazon Simple Storage Service (Amazon S3) bucket, all you have to do is provide an AWS KMS key […]]]></description>
		
		
		<enclosure url="" length="0" type="" />

			</item>
		<item>
		<title>Building fine-grained authorization using Amazon Cognito, API Gateway, and IAM</title>
		<link>https://noise.getoto.net/2021/05/21/building-fine-grained-authorization-using-amazon-cognito-api-gateway-and-iam/</link>
		
		<dc:creator><![CDATA[Artem Lovan]]></dc:creator>
		<pubDate>Fri, 21 May 2021 19:22:59 +0000</pubDate>
				<category><![CDATA[Advanced (300)]]></category>
		<category><![CDATA[Amazon API Gateway]]></category>
		<category><![CDATA[Amazon Cognito]]></category>
		<category><![CDATA[Amazon DynamoDB]]></category>
		<category><![CDATA[authorization]]></category>
		<category><![CDATA[AWS IAM]]></category>
		<category><![CDATA[AWS Identity and Access Management (IAM)]]></category>
		<category><![CDATA[custom authorizer]]></category>
		<category><![CDATA[JWT]]></category>
		<category><![CDATA[Oauth]]></category>
		<category><![CDATA[RBAC]]></category>
		<category><![CDATA[SAML]]></category>
		<category><![CDATA[Security Blog]]></category>
		<category><![CDATA[Security, Identity & Compliance]]></category>
		<category><![CDATA[Token]]></category>
		<category><![CDATA[апи]]></category>
		<guid isPermaLink="false">http://noise.getoto.net/?guid=bca00f935848a7b631a841ad8138449b</guid>

					<description><![CDATA[June 5, 2021: We’ve updated Figure 1: User request flow. Authorizing functionality of an application based on group membership is a best practice. If you’re building APIs with Amazon API Gateway and you need fine-grained access control for your users, you can use Amazon Cognito. Amazon Cognito allows you to use groups to create a […]]]></description>
		
		
		<enclosure url="" length="0" type="" />

			</item>
		<item>
		<title>Edge Authentication and Token-Agnostic Identity Propagation</title>
		<link>https://noise.getoto.net/2021/02/09/edge-authentication-and-token-agnostic-identity-propagation/</link>
		
		<dc:creator><![CDATA[Netflix Technology Blog]]></dc:creator>
		<pubDate>Tue, 09 Feb 2021 15:05:24 +0000</pubDate>
				<category><![CDATA[authentication]]></category>
		<category><![CDATA[authorization]]></category>
		<category><![CDATA[identity-management]]></category>
		<category><![CDATA[microservice-architecture]]></category>
		<category><![CDATA[security]]></category>
		<guid isPermaLink="false">https://medium.com/p/514e47e0b602</guid>

					<description><![CDATA[<p><em>by AIM Team Members </em><a href="http://www.linkedin.com/in/kcasella"><em>Karen Casella</em></a>, <a href="https://www.linkedin.com/in/travisnelson/"><em>Travis Nelson</em></a><em>, </em><a href="https://www.linkedin.com/in/singhsunny/"><em>Sunny Singh</em></a><em>; with prior art and contributions by </em><a href="https://www.linkedin.com/in/justin-charles-ryan/"><em>Justin Ryan</em></a><em>, </em><a href="https://www.linkedin.com/in/satyajit-thadeshwar/"><em>Satyajit Thadeshwar</em></a></p><p>As most developers can attest, dealing with security protocols and identity tokens, as well as user and device authentication, can be challenging. Imagine having multiple protocols, multiple tokens, 200M+ users, and thousands of device types, and the problem can explode in scope. A few years ago, we decided to address this complexity by spinning up a new initiative, and eventually a new team, to move the complex handling of user and device authentication, and various security protocols and tokens, to the edge of the network, managed by a set of centralized services, and a single team. In the process, we changed end-to-end identity propagation within the network of services to use a cryptographically-verifiable token-agnostic identity object.</p><p>Read on to learn more about this journey and how we have been able to:</p><ul><li>Reduce complexity for service owners, who no longer need to have knowledge of and responsibility for terminating security protocols and dealing with myriad security tokens,</li><li>Improve security by delegating token management to services and teams with expertise in this area, and</li><li>Improve audit-ability and forensic analysis.</li></ul><h3>How We Got Here</h3><p>Netflix started as a website that allowed members to manage their DVD queue. This website was later enhanced with the capability to stream content. Streaming devices came a bit later, but these initial devices were limited in capability. Over time, devices increased in capability and functions that were once only accessible on the website became accessible through streaming devices. Scale of the Netflix service was growing rapidly, with over 2000 device types supported.</p><p>Services supporting these functions now had an increased burden of being able to understand multiple tokens and security protocols in order to identify the user and device and authorize access to those functions. The whole system was quite complex, and starting to become brittle. Plus, the architecture of the Edge tier was evolving to a PaaS (platform as a service) model, and we had some tough decisions to make about how, and where, to handle identity token handling.</p><h4>Complexity: Multiple Services Handling Auth Tokens</h4><p>To demonstrate the complexity of the system, following is a description of how the user login flow worked prior to the changes described in this article:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*O9jFfeg6KaxBVVTY"></figure><p>At the highest level, the steps involved in this (greatly simplified) flow are as follows:</p><ol><li>User enters their credentials and the Netflix client transmits the credentials, along with the ESN of the device to the Edge gateway, AKA Zuul.</li><li>Zuul redirects the user call to the API /login endpoint.</li><li>The API server orchestrates backend systems to authenticate the user.</li><li>Upon successful authentication of the claims provided, the API server sends a cookie response back upstream, including the customerId (a Long), the ESN (a String) and an expiration directive.</li><li>Zuul sends the Cookies back to the Netflix client.</li></ol><p>This model had some problems, e.g.:</p><ul><li>Externally valid tokens were being minted deep down in the stack and they needed to be propagated all the way upstream, opening possibilities for them to be logged inappropriately or potentially mismanaged.</li><li>Upstream systems had to reopen the tokens to identify the user logging in and potentially manage multiple parallel identity data structures, which could easily get out of sync.</li></ul><h4>Multiple Protocols &#38; Tokens</h4><p>The example above shows one flow, dealing with one protocol (HTTP/S) and one type of token (Cookies). There are several protocols and tokens in use across the Netflix streaming product, as summarized below:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*-yXMM-4BRXqhVE2YryQ_WQ.png"></figure><p>These tokens were consumed by, and potentially mutated by, several systems within the Netflix streaming ecosystem, for example:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*a9jKTS752PcH0izi"></figure><p>To complicate things further, there were multiple methods for transmitting these tokens, or the data contained therein, from system to system. In some cases, tokens were cracked open and identity data elements extracted as simple primitives or strings to be used in API calls, or passed from system to system via request context headers, or even as URL parameters. There were no checks in place to ensure the integrity of the tokens or the data contained therein.</p><h4>At Netflix Scale</h4><p>Meanwhile, the scale at which Netflix operated grew exponentially. At the time of this article, Netflix has 200M+ subscribers, with over a billion devices. We are serving over 2.5 million requests per second, a large percentage of which require some form of authentication. In the old architecture, each of these requests resulted in an API call to authenticate the claims presented with the request, as shown:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*oy79fu9nrTe3Gg7G"></figure><h4>EdgePaas Enters the Picture</h4><p>To further complicate the situation, the Edge Engineering team was in the middle of migrating from an old API server architecture to a new PaaS-based approach. As we migrated to EdgePaaS, front-end services were moved from the Java-based API to a BFF (backend for frontend), aka NodeQuark, as shown:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*IsXFkN1l3jxQqFWK"></figure><p>This model enables front-end engineers to own and operate their services outside of the core API framework. However, this introduced another layer of complexity — how would these NodeQuark services deal with identity tokens? NodeQuark services are written in JavaScript and terminating a protocol as complex as <a href="https://www.infoq.com/news/2014/11/netflix-msl/">MSL</a> would have been difficult and wasteful, as would replicating all of the logic for token management.</p><h4>So, Where Were We Again?</h4><p>To summarize, we found ourselves with a complex and inefficient solution for handling authentication and identity tokens at massive scale. We had multiple types and sources of identity tokens, each requiring special handling, the logic for which was replicated in various systems. Critical identity data was being propagated throughout the server ecosystem in an inconsistent fashion.</p><h3>Edge Authentication to the Rescue</h3><p>We realized that in order to solve this problem, a unified identity model was needed. We would need to process authentication tokens (and protocols) further upstream. We did this by moving authentication and protocol termination to the edge of the network, and created a new integrity-protected token-agnostic identity object to propagate throughout the server ecosystem.</p><h4>Moving Authentication to the Edge</h4><p>Keeping in mind our objectives to improve security and reduce complexity, and ultimately provide a better user experience, we strategized on how to centralize device authentication operations and user identification and authentication token management to the services edge.</p><p>At a high-level, <a href="https://github.com/Netflix/zuul">Zuul</a> (cloud gateway) was to become the termination point for token inspection and payload encryption/decryption. In the case that Zuul would be unable to handle these operations (a small percentage), e.g., if tokens were not present, needed to be renewed, or were otherwise invalid, Zuul would delegate those operations to a new set of Edge Authentication Services to handle cryptographic key exchange and token creation or renewal.</p><h4>Edge Authentication Services</h4><p>Edge Authentication Services (EAS) is both an architectural concept of moving authentication and identification of devices and users higher up on the stack to the cloud edge, as well as a suite of services that have been developed to handle each token type.</p><p>EAS is functionally a series of filters that run in Zuul, which may call out to external services to support their domain, e.g., to a service to handle MSL tokens or another for Cookies. EAS also covers the read-only processing of tokens to create Passports (more on that later).</p><p>The basic pattern for how EAS handles requests is as follows:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*IGOJkwmoXeGcC7lU"></figure><p>For each request coming into the Netflix service, the EAS Inbound Filter in Zuul inspects the tokens provided by the device client and either passes through the request to the Passport Injection Filter, or delegates to one of the Edge Authentication Services to process. The Passport Injection Filter generates a token-agnostic identity to propagate down through the rest of the server ecosystem. On the response path, the EAS Outbound Filter determines, with help from the Edge Authentication Services as needed, generates the tokens needed to send back to the client device.</p><p>The system architecture now takes the form of:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*fk2U_pCkseGSnQCw"></figure><p>Notice that tokens never traverse past the Edge gateway / EAS boundary. The MSL security protocol is terminated at the Edge and all tokens are cracked open and identity data is propagated through the server ecosystem in a token-agnostic manner.</p><h4>A Note on Resilience</h4><p>On the happy path, Zuul is able to process the large percentage of tokens that are valid and not expired, and the Edge Auth Services handle the remainder of the requests.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*DL3OinjVs-h5JNHw"></figure><p>The EAS services are designed to be fault tolerant, e.g., in the case where Zuul identifies that Cookies are valid, but expired, and the renewal call to EAS fails or is latent:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*NDzrSUb3kurzge2f"></figure><p>In this failure scenario, the EAS filter in Zuul will be lenient and allow the resolved identity to be propagated and will indicate that the renewal call should be rescheduled on the next request.</p><h4>Token-Agnostic Identity (Passport)</h4><p>An easily mutable identity structure would not suffice because that would mean passing less trusted identities from service to service. A token-agnostic identity structure was needed.</p><p>We introduced an identity structure called “Passport” which allowed us to propagate the user and device identity information in a uniform way. The Passport is also a kind of token, but there are many benefits to using an internal structure that differs from external tokens. However, downstream systems still need access to the user and device identity.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*4rF336qXmNl0XZ9g"></figure><p>A Passport is a short-lived identity structure created at the Edge for each request, i.e., it is scoped to the life of the request and it is completely internal to the Netflix ecosystem. These are generated in Zuul via a set of Identity Filters. A Passport contains both user &#38; device identity, is in protobuf format, and is integrity protected by HMAC.</p><h4>Passport Structure</h4><p>As noted above, the Passport is modeled as a Protocol Buffer. At the highest level, the definition of the Passport is as follows:</p><pre><strong>message</strong> <strong>Passport</strong> {</pre><pre>   Header <strong>header</strong> = <strong>1;</strong></pre><pre>   UserInfo <strong>user_info</strong> = <strong>2</strong>;</pre><pre>   DeviceInfo <strong>device_info</strong> = <strong>3</strong>;</pre><pre>   Integrity <strong>user_integrity</strong> = <strong>4</strong>;</pre><pre>   Integrity <strong>device_integrity</strong> = <strong>5</strong>;</pre><pre>}</pre><p>The Header element communicates the name of the service that created the Passport. What’s more interesting is what is propagated related to the user and device.</p><h4>User &#38; Device Information</h4><p>The UserInfo element contains all of the information required to identify the user on whose behalf requests are being made, with the DeviceInfo element containing all of the information required for the device on which the user is visiting Netflix:</p><pre><strong>message</strong> <strong>UserInfo</strong> {</pre><pre>    Source <strong>source</strong> = <strong>1</strong>;</pre><pre>    int64 <strong>created</strong> = <strong>2</strong>;</pre><pre>    int64 <strong>expires</strong> = <strong>3</strong>;</pre><pre>    Int64Wrapper <strong>customer_id</strong> = <strong>4</strong>;</pre><pre>        … (some internal stuff) …</pre><pre>    PassportAuthenticationLevel <strong>authentication_level</strong> = <strong>11</strong>;</pre><pre><strong>    repeated</strong> UserAction <strong>actions</strong> = <strong>12</strong>;</pre><pre>}</pre><pre><strong>message</strong> <strong>DeviceInfo</strong> {</pre><pre>    Source <strong>source</strong> = <strong>1</strong>;</pre><pre>    int64 <strong>created</strong> = <strong>2</strong>;</pre><pre>    int64 <strong>expires</strong> = <strong>3</strong>;</pre><pre>    StringValue <strong>esn</strong> = <strong>4</strong>;</pre><pre>    Int32Value <strong>device_type</strong> = <strong>5</strong>;</pre><pre><strong>    repeated</strong> DeviceAction <strong>actions</strong> = <strong>7</strong>;</pre><pre>    PassportAuthenticationLevel <strong>authentication_level</strong> = <strong>8</strong>;</pre><pre>        … (some more internal stuff) …</pre><pre>}</pre><p>Both UserInfo and DeviceInfo carry the Source and PassportAuthenticationLevel for the request. The Source list is a classification of claims, with the protocol being used and the services used to validate the claims. The PassportAuthenticationLevel is the level of trust that we put into the authentication claims.</p><pre><strong>enum Source</strong> {</pre><pre>    NONE = <strong>0</strong>;</pre><pre>    COOKIE = <strong>1</strong>;</pre><pre>    COOKIE_INSECURE = <strong>2;</strong></pre><pre>    MSL = <strong>3</strong>;</pre><pre>    PARTNER_TOKEN = <strong>4</strong>;</pre><pre>        …</pre><pre>}</pre><pre><strong>enum PassportAuthenticationLevel</strong> {</pre><pre>    LOW = <strong>1</strong>; <em>// untrusted transport</em></pre><pre>    HIGH = <strong>2</strong>; <em>// secure tokens over TLS</em></pre><pre>    HIGHEST = <strong>3</strong>; <em>// MSL or user credentials</em></pre><pre>}</pre><p>Downstream applications can use these values to make Authorization and/or user experience decisions.</p><h4>Passport Integrity</h4><p>The integrity of the Passport is protected via an HMAC (hash-based message authentication code), which is a specific type of MAC involving a crytographic hash function and a secret cryptographic key. It may be used to simultaneously verify both the data integrity and authenticity of a message.</p><p>User and device integrity are defined as:</p><pre><strong>message</strong> <strong>Integrity</strong> {</pre><pre><strong>    </strong>int32 <strong>version</strong> = <strong>1</strong>;</pre><pre><strong>    </strong>string <strong>key_name</strong> = <strong>2</strong>;</pre><pre><strong>    </strong>bytes <strong>hmac</strong> = <strong>3</strong>;</pre><pre>}</pre><p>Version 1 of the Integrity element uses SHA-256 for the HMAC, which is encoded as a ByteArray. Future versions of Integrity may use a different has function or encoding. In version 1, the HMAC field contains the 256 bits from MacSpec.SHA_256.</p><p>Integrity protection guarantees that Passport field are not mutated after the Passport is created. Client applications can use the Passport Introspector to check the integrity of the Passport before using any of the values contained therein.</p><h4>Passport Introspector</h4><p>The Passport object itself is opaque; clients can use the Passport Introspector to extract the Passport from the headers and retrieve the contents inside it. The Passport Introspector is a wrapper over the Passport binary data. Clients create an Introspector via a factory and then have access to basic accessor methods:</p><pre><strong>public interface PassportIntrospector {</strong></pre><pre>    Long <strong>getCustomerId</strong>();</pre><pre>    Long <strong>getAccountOwnerId</strong>();</pre><pre>    String <strong>getEsn</strong>();</pre><pre>    Integer <strong>getDeviceTypeId()</strong>;</pre><pre>    String <strong>getPassportAsString</strong>();</pre><pre>    …</pre><pre><strong>}</strong></pre><h4>Passport Actions</h4><p>In the Passport protocol buffer definition shown above, there are Passport Actions defined:</p><pre><strong>message</strong> <strong>UserInfo</strong> {</pre><pre><strong>    repeated</strong> UserAction <strong>actions</strong> = <strong>12</strong>;</pre><pre>        …</pre><pre>}</pre><pre><strong>message</strong> <strong>DeviceInfo</strong> {</pre><pre><strong>    repeated</strong> DeviceAction <strong>actions</strong> = <strong>7</strong>;</pre><pre>        …</pre><pre>}</pre><p>Passport Actions are explicit signals sent by downstream services, when an update to user or device identity has been performed. The signal is used by EAS to either create or update the corresponding type of token.</p><h4>Login Flow, Revisited</h4><p>Let’s wrap up with an example of all of these solutions working together.</p><p>With the movement of authentication and protocol termination to the Edge, and the introduction of Passports as identity, the Login Flow described earlier has morphed into the following:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*zT3m9YWCTZvD0CnC"></figure><ol><li>User enters their credentials and the Netflix client transmits the credentials, along with the ESN of the device to the Edge gateway, AKA Zuul.</li><li>Identity filters running in Zuul generate a device-bound Passport and pass it along to the API /login endpoint.</li><li>The API server propagates the Passport to the mid-tier services responsible for authentication the user.</li><li>Upon successful authentication of the claims provided, these services create a Passport Action and send it, along with the original Passport, back up stream to API and Zuul.</li><li>Zuul makes a call to the Cookie Service to resolve the Passport and Passport Actions and sends the Cookies back to the Netflix client.</li></ol><h3>Key Benefits and Learnings</h3><h4>Simplified Authorization</h4><p>One of the reasons there were external tokens flowing into downstream systems was because authorization decisions often depend on authentication claims in tokens and the trust associated with each token type. In our Passport structure, we have assigned levels to this trust, meaning that systems requiring authorization decisions can write sensible rules around the Passport instead of replicating the trust rules in code across many services.</p><h4>An Explicit and Extensible Identity Model</h4><p>Having a structure that is the canonical identity is very useful. Alternatives where identity primitives are passed around are brittle and hard to debug. If the customer identity changed from service A to service D in a call chain, who changed it? Once the identity structure is passed through all key systems, it is relatively easy to add new external token types, new trust levels, or new ways to represent identity.</p><h4>Operational Concerns and Visibility</h4><p>Having a structure, like Passport, allows you to define the services that can write a Passport and other services can validate it. When the Passport is propagated and when we see it in logs, we can open it up, validate it, and know what the identity is. We also know the provenance of the Passport, and can trace it back to where it entered the system. This makes the debugging of any identity-related anomalies much easier.</p><h4>Reduced Downstream System Complexity &#38; Load</h4><p>Passing a uniform structure to downstream systems means that those systems can easily look up the device and user identity, using an introspection library. Instead of having separate handling for each type of external token, they can use the common structure.</p><p>By offloading token processing from these systems to the central Edge Authentication Services, downstream systems saw significant gains in CPU, request latency, and garbage collection metrics, all of which help reduce cluster footprint and cloud costs. The following examples of these gains are from the primary API service.</p><p>In the prior implementation, it was necessary to incur decryption/termination costs twice per request because we needed the ability to route at the edge but also needed rich termination in the downstream service. Some of the performance improvement is due to consolidation of this — MSL requests now only need to be processed once.</p><h4>CPU to RPS Ratio</h4><p>Offloading token processing resulted in a 30% reduction in CPU cost per request and a 40% reduction in load average. The following graph shows the CPU to RPS ratio, where lower is better:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*5J_fsU019jHqpTAA"></figure><h4>API Response Time</h4><p>Response times for all calls on the API service showed significant improvement, with a 30% reduction in average latency and a 20% drop in 99th percentile latency:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*o1Oe9w62eRcC_ynR"></figure><h4>Garbage Collection</h4><p>The API service also saw a significant reduction in GC pressure and GC pause times, as shown in the Stop The World Garbage Collection metrics:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*NKH1MEwR8gbCyAe3"></figure><h4>Developer Velocity</h4><p>Abstracting these authentication and identity-related concerns away from the developers of microservices means that they can focus on their core domain. Changes in this area are now done once, and in one set of specialized services, versus being distributed across multiple.</p><h3>What’s Next?</h3><h4>Strong(er) Authentication</h4><p>We are currently expanding the Edge Authentication Services to support Multi-Factor Authentication via a new service called “Resistor”. We selectively introduce the second factor for connections that are suspicious, based on machine learning models. As we onboard new flows, we are introducing new factors, e.g., one-time passwords (OTP) sent to email or phone, push notifications to mobile devices, and third-party authenticator applications. We may also explore opt-in Multi-Factor Authentication for users who desire the added security on their accounts.</p><h4>Flexible Authorization</h4><p>Now that we have a verified identity flowing through the system, we can use that as a strong signal for authorization decisions. Last year, we started to explore a new Product Access Strategy (PACS) and are currently working on moving it into production for several new experiences in the Netflix streaming product. PACS recently powered the experience access control for the <a href="https://about.netflix.com/en/news/streamfest-india">Streamfest</a>, a weekend of free Netflix in India.</p><h3>Want More?</h3><p>Team members presented this work at <a href="https://qconsf.com/">QCon San Francisco</a> (and were two of the top three attended talks at the conference!):</p><ul><li><a href="https://www.infoq.com/presentations/netflix-edge-scalability-patterns/">Scaling Patterns for Netflix's Edge</a></li><li><a href="https://www.infoq.com/presentations/netflix-user-identity/">User &#38; Device Identity for Microservices @ Netflix Scale</a></li></ul><p><em>The authors are members of the Netflix </em><a href="https://tiny.cc/aim2021"><em>Access &#38; Identity Management team</em></a><em>. We pride ourselves on being experts at distributed systems development, operations and identity management. And, we’re </em><a href="https://tiny.cc/aim2021"><em>hiring Senior Software Engineers</em></a><em>! Reach out on </em><a href="http://www.linkedin.com/in/kcasella"><em>LinkedIn</em></a><em> if you are interested.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&#38;referrerSource=full_rss&#38;postId=514e47e0b602" width="1" height="1" alt=""><hr><p><a href="https://netflixtechblog.com/edge-authentication-and-token-agnostic-identity-propagation-514e47e0b602">Edge Authentication and Token-Agnostic Identity Propagation</a> was originally published in <a href="https://netflixtechblog.com/">Netflix TechBlog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></description>
		
		
		<enclosure url="" length="0" type="" />

			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/

Object Caching 79/480 objects using Memcached
Page Caching using Disk: Enhanced 
Lazy Loading (feed)
Database Caching using Memcached

Served from: noise.getoto.net @ 2025-12-10 23:33:13 by W3 Total Cache
-->