
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/">
    <channel>
        <title><![CDATA[ The Cloudflare Blog ]]></title>
        <description><![CDATA[ Get the latest news on how products at Cloudflare are built, technologies used, and join the teams helping to build a better Internet. ]]></description>
        <link>https://blog.cloudflare.com</link>
        <atom:link href="https://blog.cloudflare.com/" rel="self" type="application/rss+xml"/>
        <language>en-us</language>
        <image>
            <url>https://blog.cloudflare.com/favicon.png</url>
            <title>The Cloudflare Blog</title>
            <link>https://blog.cloudflare.com</link>
        </image>
        <lastBuildDate>Wed, 15 Apr 2026 19:40:07 GMT</lastBuildDate>
        <item>
            <title><![CDATA[Helping keep customers safe with leaked password notification]]></title>
            <link>https://blog.cloudflare.com/helping-keep-customers-safe-with-leaked-password-notification/</link>
            <pubDate>Mon, 24 Jun 2024 17:06:42 GMT</pubDate>
            <description><![CDATA[ To help protect against account compromise via credential stuffing attacks, Cloudflare will notify dashboard users when we detect that a password was found in an external data breach ]]></description>
            <content:encoded><![CDATA[ <p></p><p>Password reuse is a real problem. When people use the same password across multiple services, it creates a risk that a breach of one service will give attackers access to a different, apparently unrelated, service. Attackers know people reuse passwords and build giant lists of known passwords and known usernames or email addresses.</p><p>If you got to the end of that paragraph and realized you’ve reused the same password multiple places, stop reading and go change those passwords. We’ll wait.</p><p>To help protect Cloudflare customers who have used a password attackers know about, we are releasing a feature to improve the security of the Cloudflare dashboard for all our customers by automatically checking whether their Cloudflare user password has appeared in an attacker's list. Cloudflare will securely check a customer’s password against threat intelligence sources that monitor data breaches in other services.</p><p>If a customer logs in to Cloudflare with a password that was leaked in a breach elsewhere on the Internet, Cloudflare will alert them and ask them to choose a new password.</p><p>For some customers, the news that their password was known to hackers will come as a surprise – no one wants to intentionally use passwords that they know have been leaked elsewhere. To help customers avoid being locked out when they urgently need to use their Cloudflare dashboard, the leaked password check will provide a warning to the customer for the first three login attempts. After those three attempts, Cloudflare will require that the customer reset their password.</p><p>Resetting a leaked password is just the first step in Internet account security. The best way to protect your Cloudflare account, or any account, is to add two-factor authentication, such as using a hardware security key or an authenticator application, or to rely on a single sign-on integration. Cloudflare makes it easy for any user to <a href="https://developers.cloudflare.com/fundamentals/setup/account/account-security/2fa/#enable-two-factor-authentication-for-your-cloudflare-account">add two-factor authentication security to their account</a> through app-based codes, hardware keys, or passkeys. Cloudflare account Super Administrators can also require that all members enable two-factor authentication.</p><p>Whether or not a user has been impacted in a data breach, we encourage everyone to add two-factor authentication security to their Cloudflare account.</p>
    <div>
      <h3>How do credentials leak?</h3>
      <a href="#how-do-credentials-leak">
        
      </a>
    </div>
    <p>Each time you authenticate to a service on the Internet with a username and password, that service can take a range of steps to protect your credentials.</p><p>More secure providers will hash the passwords. <a href="https://www.authgear.com/post/password-hashing-salting#hashing">Hashing</a> uses a cryptographic algorithm to convert the password into a random string of characters. Some platforms will layer on additional safeguards like a <a href="https://www.authgear.com/post/password-hashing-salting#salting">salt</a> mechanism that introduces a random value to each password before the hashing process to ensure that two identical passwords do not have identical hashes.</p><p>These protections, combined with rate limits on login attempts, prevent brute force attacks. However, even for providers that adopt these best practices, users can still become victims of determined attackers when bad actors gain access to breached password databases. Attackers can collect compromised email password pairs to gain access to user accounts elsewhere as part of targeted attacks.</p><p>When vendors discover these kinds of compromised accounts, in many cases they will quickly force a password reset. However, resetting a leaked password in one application can still leave you vulnerable in other applications if you reused that password in other places and do not change your credentials everywhere.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/410DAKcAIJaJmKI71DfN3L/71c68701609b8ead70dbdea2f37215fd/image3-13.png" />
            
            </figure><p>That kind of password reuse means that an attacker can steal your credentials from one Internet service and try them against dozens of other popular destinations to see where you reuse the same password.</p><p>These so-called <a href="https://www.cloudflare.com/learning/bots/what-is-credential-stuffing/">credential stuffing attacks</a> have become more prevalent as breaches pile up. Attackers can sit on large troves of credentials for months or years, waiting to sell them to another bad actor or to use them in targeted attacks. For customers who want to protect themselves from these and other attacks that can compromise their end customer’s accounts, Cloudflare has solutions like <a href="/account-takeover-protection/">bot management, exposed credential checks, and rate limiting</a> available to help defend against these kinds of attacks</p>
    <div>
      <h3>How can customers protect against the impact of leaked credentials?</h3>
      <a href="#how-can-customers-protect-against-the-impact-of-leaked-credentials">
        
      </a>
    </div>
    <p>If every password you use is unique, then a data breach in one vendor will be limited to just that particular system. For that reason, we encourage users to adopt a password manager that can create and remember unique passwords for each service that you use. Thankfully, the most popular operating systems now include password managers by default, and multiplatform third party options also make it easy for users to adopt this practice.</p><p>However, unique passwords are still vulnerable to phishing attacks. The best way to protect any Internet account is to add two-factor authentication (2FA). Two-factor authentication provides a comprehensive defense against credential stuffing attacks. When using two-factor authentication to log in, you must use your password and, for example, a one-time code from an app or a tap on a physical hardware key. The password alone is not enough to access your account.</p><p>Adoption of two-factor authentication, specifically hardware keys, has been <a href="https://www.microsoft.com/en-us/security/blog/2019/08/20/one-simple-action-you-can-take-to-prevent-99-9-percent-of-account-attacks/">shown to be able to eliminate 99.9% of account takeovers</a>, since the attacker must also get access to your second factor in addition to your password. In the case of hardware keys, they need to physically obtain the key.</p>
    <div>
      <h3>How does Cloudflare check for leaked credentials?</h3>
      <a href="#how-does-cloudflare-check-for-leaked-credentials">
        
      </a>
    </div>
    <p>When a user attempts to log into Cloudflare, we will check if the password used has been leaked in a known data breach of another service or application on the Internet. We maintain data on breaches of Internet services that we can use to search against. Because we use password hashes, scrambled versions of the original password that can’t be easily reversed, we compare a hash of the password to hashes of compromised passwords found in these lists from other attacks. An additional benefit, beside the security of hashes, is the ability to perform fast lookups, much faster than plaintext searches. This means that we can perform these checks without adding significant latency to the login process for users.</p><p>Because of the potential impact of a Cloudflare account being compromised, we opt for a more secure approach of disallowing leaked credentials regardless of whether they were associated with the specific user’s email or not. Unfortunately, data breaches are likely to continue to happen. Therefore, being proactive helps reduce the risk of new breaches that contain the email and password pair allowing for an account to be compromised before the data is available to us.</p><p>If we detect a match, the user will be prompted with the following warning. We will also send an email notification with instructions on what to do and a unique link in order to reset the password.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/bCm8LmZVjuGn70hDdjVT2/7c554325a98559d54ae2f5683f75090a/Screenshot-2024-06-24-at-10.16.02-AM.png" />
            
            </figure><p>At this point, the user will still be able to log in to their Cloudflare account. We strongly encourage users to reset their password immediately. However, we know that in some cases you need to reach the Cloudflare dashboard immediately or do not have convenient access to the email used for the account. Cloudflare will allow two additional login attempts to succeed with the same compromised password before forcing the user to reset their password.</p><p>To reset a password in Cloudflare Dashboard, navigate to the <a href="https://dash.cloudflare.com/profile/authentication"><b>Authentication</b> page</a> in <b>My Profile</b>. From here, select <b>Change Password</b> and enter both the current password to authenticate and a new, non-compromised password. Alternatively, for those whose password was leaked, upon login an email will be sent with a unique link to reset the password.</p>
    <div>
      <h3>What’s next?</h3>
      <a href="#whats-next">
        
      </a>
    </div>
    <p>Forcing users to reset compromised credentials helps prevent attacks from spreading on the Internet, but it’s just a small piece of improved account security. We know that adding the next step, second factor authentication, can be cumbersome. We have committed to <a href="https://www.cisa.gov/securebydesign">CISA’s Secure by Design Pledge</a>, which includes working to increase 2FA adoption across the industry. We will share our plans on how we will be implementing the pledge by mid-2025.</p><p>Adding multifactor authentication to every one of your accounts on the Internet can still be a chore, no matter how much the experience is improved. It’s much easier if you can just do it with one account and use that account to authenticate into other services and applications – a single-sign on (SSO) flow. Right now, our SSO feature is limited to enterprise accounts, and we plan to change that. We will allow users to access Cloudflare through other providers like Google, GitHub, and more. Allowing users to reduce how many unique password and 2FA combinations they have to keep track of helps to reduce the likelihood of being impacted by future password breaches.</p> ]]></content:encoded>
            <category><![CDATA[Passwords]]></category>
            <category><![CDATA[Security]]></category>
            <guid isPermaLink="false">OEX1mcgZrCSgEplJZHr1h</guid>
            <dc:creator>Garrett Galow</dc:creator>
        </item>
        <item>
            <title><![CDATA[Quickly see differences between Zone Versions with Version Comparisons]]></title>
            <link>https://blog.cloudflare.com/quickly-see-differences-between-zone-versions-with-version-comparisons/</link>
            <pubDate>Fri, 14 Jul 2023 13:00:50 GMT</pubDate>
            <description><![CDATA[ Quickly compare changes between two Zone Versions with Version Comparisons available now ]]></description>
            <content:encoded><![CDATA[ <p></p><p>On the week of July 10, 2023, we launched a new capability for Zone Versioning - Version Comparisons. With Version Comparisons, you can quickly get a side by side glance of what changes were made between two versions. This makes it easier to evaluate that a new version of your zone’s configuration is correct before deploying to production.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/i7vy9tF8vCaeOru3zTeqq/b69247636de42b4ffcfc24c7b6a5c81b/Screenshot-2023-07-11-at-10.09.10-PM.png" />
            
            </figure>
    <div>
      <h3>A quick recap about Zone Versioning</h3>
      <a href="#a-quick-recap-about-zone-versioning">
        
      </a>
    </div>
    <p><a href="https://developers.cloudflare.com/version-management/">Zone Versioning</a> was launched at the start of 2023 to all <a href="https://www.cloudflare.com/plans/enterprise/">Cloudflare Enterprise</a> customers and allows you to create and manage independent versions of your zone configuration. This enables you to safely configure a set of configuration changes and progressively roll out those changes together to predefined environments of traffic. Having the ability to carefully test changes in a test or staging environment before deploying them to production, can help catch configuration issues before they can have a large impact on your zone’s traffic. See the <a href="/zone-versioning-ga/">general availability announcement blog</a> for a deeper dive on the overall capability.</p>
    <div>
      <h3>Why we built Version Comparisons</h3>
      <a href="#why-we-built-version-comparisons">
        
      </a>
    </div>
    <p><a href="https://en.wikipedia.org/wiki/Diff">Diff</a> is a well known and often used tool by many software developers to quickly understand the difference between two files. While originally just a command line utility it is now ubiquitous across the software world. Most commonly used in code reviews, software developers use ‘diffs’ to ensure they can validate the set of changes they intend to make to a codebase and to allow others to easily review their code by focusing on what changed. One of the drawbacks of graphical user interfaces (GUIs) for managing configurations is since they aren’t ‘files’, tools like diff don’t work for them. This was true with Zone Versioning, as to try and understand what had changed between two versions you would need to manually inspect each version and the various sections of the dashboard across both versions. This is quite tedious and error-prone, so it can reduce the safety that versioning can provide.</p><p>With Version Comparisons, we are bringing the same capabilities of diff but without the need for using a command line to allow customers to compare two versions side by side. This makes the process of understanding which configurations of your zone changed between two versions easy, quick and painless. By pointing out which config has changed, you can have greater confidence that deploying a new version of your configuration will not create any surprises. Let’s now look at how to use Version Comparisons in the Cloudflare Dashboard.</p>
    <div>
      <h3>Using Version Comparisons</h3>
      <a href="#using-version-comparisons">
        
      </a>
    </div>
    <p>After navigating to a zone that has Zone Versioning enabled, select ‘Version Management’ in the left-hand navigation. For help getting started with Zone Versioning, see our <a href="https://developers.cloudflare.com/version-management/">dev docs</a>.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2i0UTodLyaEcbory4jxubb/405aa7cfb3ce2632228366866b9d4ac2/Screenshot-2023-07-11-at-10.06.53-PM.png" />
            
            </figure><p>After selecting the ‘Version Management’ tab you will notice a third option - ‘Comparisons’. Selecting that will prompt you to select two versions to compare. Select the two version you want to compare and then select ‘Compare’</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2r8paybExefZR7Pz7aqwfW/3eeecebcae00d9ed4e63d0f0ee9bc422/Screenshot-2023-07-11-at-10.10.26-PM.png" />
            
            </figure><p>After a few seconds, the page will update automatically with a comparison on a per-product basis. The lower numbered version will always be presented on the left and the top will show you which environments the versions are assigned to so that you can ensure you are comparing the right versions. A common use case would be to compare the versions in staging and production to verify the changes before promoting the staging version to production.</p><p>Any products with changes will have ‘changes detected’ noted next to them. Selecting one will open up the diff of that product across both versions.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4Jy2bxZ1wGvE5MHsbjW4J2/390afaf13edd9f983dd5b32b83b50d0c/Screenshot-2023-07-11-at-10.09.10-PM--1-.png" />
            
            </figure><p>Changes will be highlighted for new additions and removals for that service. Based on the comparison, you can then decide if more changes are necessary or if that new version is ready to be rolled out.</p>
    <div>
      <h3>Try out Version Comparisons today</h3>
      <a href="#try-out-version-comparisons-today">
        
      </a>
    </div>
    <p>Versions comparisons are available to all customers using Zone Versioning! If you are a Cloudflare Enterprise customer, to get started using Zone Versioning and Version Comparisons, check out our <a href="https://developers.cloudflare.com/version-management/">dev docs</a>.</p> ]]></content:encoded>
            <category><![CDATA[Zone Versioning]]></category>
            <category><![CDATA[Product News]]></category>
            <guid isPermaLink="false">4h1B0dkcKzKgFEsE3PBfSQ</guid>
            <dc:creator>Garrett Galow</dc:creator>
        </item>
        <item>
            <title><![CDATA[Protect your domain with Zone Holds]]></title>
            <link>https://blog.cloudflare.com/protect-your-domain-with-zone-holds/</link>
            <pubDate>Thu, 06 Apr 2023 16:00:00 GMT</pubDate>
            <description><![CDATA[ Protect against accidental additions of your domain, subdomain, or custom hostnames in other accounts with Zone Holds. Available by default for all enterprise customers ]]></description>
            <content:encoded><![CDATA[ <p></p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/473c1btS6iVaePEPi8kIwW/a409b87106e4a2d6d2143704514c221c/Protect-your-domain-with-Zone-Holds-1.png" />
            
            </figure><p>Today, we are announcing Zone Holds, a new capability for enterprise customers that gives them control of if and when someone else can add the same zone to another Cloudflare account. When multiple teams at a company want to use Cloudflare, one team might accidentally step on another’s toes and try to manage the same zone in two accounts. Zone Holds ensure that this cannot happen by enforcing that only one account can contain a given domain, optionally inclusive of subdomains or custom hostnames, unless explicit permission is granted by the account owner of the zone.</p>
    <div>
      <h3>What can go wrong today</h3>
      <a href="#what-can-go-wrong-today">
        
      </a>
    </div>
    <p>Cloudflare already requires zones to be authenticated via DNS before traffic is proxied through our global network. This ensures that only domain owners can authorize traffic to be sent through and controlled with Cloudflare. However, many of our customers are large organizations with many teams all trying to protect and accelerate their web properties. In these cases, one team may not realize that a given domain is already being <a href="https://www.cloudflare.com/application-services/solutions/domain-protection-services/">protected with Cloudflare</a>. If they activate a second instance of the same domain in Cloudflare, they end up replacing the original zone that another team was already managing with Cloudflare. This can create downtime or security issues until the original zone can be re-activated. If these two teams had only known about each other and communicated, then in most cases any issue could be avoided via one of many options - subdomains, custom hostnames, etc. How can we ensure that these teams are aware of potential risk before making these mistakes?</p>
    <div>
      <h3>How Zone Holds protect customers</h3>
      <a href="#how-zone-holds-protect-customers">
        
      </a>
    </div>
    <p>With Zone Holds, any attempt to add a domain that is being held will return an error letting the person know that they need to contact the domain owner first. Zone Holds are enabled by default for all enterprise zones. The holds can be managed from the Zone Overview screen. Optionally, the hold can be extended to apply to subdomains and custom hostnames. When disabling a hold, you can set the hold to re-enable after a set amount of time. This ensures you don’t accidentally leave a hold perpetually disabled. Let’s dig into an example to understand how Zone Holds help customers.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/53LWcBYYwA88TNpSzqAsrp/125314c04d1e876edf2e6d3530b4b8ef/image2-5.png" />
            
            </figure><p>An active zone hold not including protection of subdomains</p>
    <div>
      <h3>Example Corp - before Zone Holds</h3>
      <a href="#example-corp-before-zone-holds">
        
      </a>
    </div>
    <p>Example Corp is a large Cloudflare customer. Specifically, their infrastructure team uses Cloudflare to protect all traffic at example.com. This includes their marketing site at <a href="http://www.example.com">www.example.com</a> and their customer facing API at api.example.com. When they onboarded to Cloudflare they had their IT department, who manages all DNS at the company, setup DNS records at their <a href="https://www.cloudflare.com/learning/dns/glossary/what-is-a-domain-name-registrar/">registrar</a> such that all traffic for example.com routed through Cloudflare.</p><p>Fast forward a year later, their marketing department wants to adopt Cloudflare’s <a href="https://developers.cloudflare.com/bots/">Bot Management solution</a> for traffic on <a href="http://www.example.com">www.example.com</a>. They sign up example.com and reach out to their IT department to set the provided NS records at the registrar. The IT department does not realize that Cloudflare is already in use so they do not catch that this will impact the existing zone managed by the infrastructure team. The new zone is activated and an incident occurs because traffic to not only <a href="http://www.example.com">www.example.com</a> but also api.example.com is impacted. With Zone Holds this incident would have been avoided. Let’s see how.</p>
    <div>
      <h3>Example Corp - now with Zone Holds</h3>
      <a href="#example-corp-now-with-zone-holds">
        
      </a>
    </div>
    <p>Example Corp signs up for Cloudflare and adds example.com to their account as an ENT zone. Automatically a Zone Hold is enabled on the domain which will prevent any other Cloudflare account from adding example.com. They also enable a hold on any subdomains or custom hostnames under the domain of example.com.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5vOx5b4qJtcGshW7ZuLVOk/c3bf36c35bde72044367a3a484f448e2/image3-3.png" />
            
            </figure><p>Later ACME’s marketing department wants to start using Cloudflare for <a href="http://www.example.com">www.example.com</a>. When they attempt to add that domain to Cloudflare they get an error informing them that they need to reach out to the domain owner.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1zs5qEaFPmWuyyXoMQEx1j/0b2d4cac2f0ee8ed6353225bec8b17fb/image4-3.png" />
            
            </figure><p>ACME’s marketing department reaches out internally and learns that the infrastructure team manages this domain and that activating this zone would have caused an incident! Instead, both teams decide that the marketing team should add the subdomain of <a href="http://www.example.com">www.example.com</a> so they can control the marketing site. The infrastructure team lifts the subdomain hold on acme.com and the marketing team adds <a href="http://www.example.com">www.example.com</a> to their own account.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2fWD0fdAJzRFIVWweFvBsb/d999ee91da29e18410bbf04af30034f8/image1-7.png" />
            
            </figure><p>Once set up and activated they can now begin to leverage bot management to protect their marketing site and no unexpected impact occurs.</p>
    <div>
      <h3>Getting started with Zone Holds</h3>
      <a href="#getting-started-with-zone-holds">
        
      </a>
    </div>
    <p>Zone Holds are now available to all enterprise zones and are enabled by default at the domain level. You can manage Zone Holds from the Zone Overview screen of any enterprise zone. Optionally, the hold can be extended to apply to subdomains and custom hostnames. When disabling a hold, you can set the hold to re-enable after a set amount of time. This ensures you don’t accidentally leave a hold perpetually disabled.</p> ]]></content:encoded>
            <category><![CDATA[Dashboard]]></category>
            <category><![CDATA[Product News]]></category>
            <guid isPermaLink="false">41MXsIADru3HtjvPvsqN0i</guid>
            <dc:creator>Garrett Galow</dc:creator>
        </item>
        <item>
            <title><![CDATA[Zone Versioning is now generally available]]></title>
            <link>https://blog.cloudflare.com/zone-versioning-ga/</link>
            <pubDate>Thu, 12 Jan 2023 14:00:00 GMT</pubDate>
            <description><![CDATA[ Safely configure and deploy updates to zone configuration with Zone Versioning now Generally Available for Enterprise customers ]]></description>
            <content:encoded><![CDATA[ 
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1lgNVy6zV5VsmAkYjvZM57/0a5bcbfb683be5623e2d740da6b60f6c/image3-21.png" />
            
            </figure><p>Today we are announcing the general availability of Zone Versioning for enterprise customers. Zone Versioning allows you to safely manage zone configuration by versioning changes and choosing how and when to deploy those changes to defined environments of traffic. Previously announced as <a href="/version-and-stage-configuration-changes-with-http-applications/">HTTP Applications</a>, we have redesigned the experience based on testing and feedback to provide a seamless experience for customers looking to safely rollout configuration changes.</p>
    <div>
      <h3>Problems with making configuration changes</h3>
      <a href="#problems-with-making-configuration-changes">
        
      </a>
    </div>
    <p>There are two problems we have heard from customers that Zone Versioning aims to solve:</p><ol><li><p>How do I test changes to my zone safely?</p></li><li><p>If I do end up making a change that impacts my traffic negatively, how can I quickly revert that change?</p></li></ol><p>Customers have worked out various ways of solving these problems. For problem #1, customers will create staging zones that live on a different hostname, often taking the form <i>staging.example.com</i>, that they make changes on first to ensure that those changes will work when deployed to their production zone. When making more than one change this can become troublesome as they now need to keep track of all the changes made to make the exact same set of changes on the production zone. Also, it is possible that something tested in staging never makes it to production, but yet is not rolled back, so now the two environments differ in configuration.</p><p>For problem #2, customers often keep track of what changes were made and when they were deployed in a ticketing system like JIRA, such that in case of an incident an on-call engineer can more easily find the changes they may need to roll back by manually modifying the configuration of the zone. This requires the on-call to be able to easily get to the list of what changes were made.</p><p>Altogether, this means customers are more reluctant to make changes to configuration or turn on new features that may benefit them because they do not feel confident in the ability to validate the changes safely.</p>
    <div>
      <h3>How Zone Versioning solves those problems</h3>
      <a href="#how-zone-versioning-solves-those-problems">
        
      </a>
    </div>
    <p>Zone Versioning provides two new fundamental aspects to managing configuration that allow a customer to safely test, deploy and rollback configuration changes: Versions and Environments.</p><p>Versions are independent sets of zone configuration. They can be created anytime from a previous version or the initial configuration of the zone and changes to one version will not affect another version. Initially, a version affects none of a zone’s traffic, so any changes made are safe by definition. When first enabling zone versioning, we create Version 1 that is based on the current configuration of the zone (referred to as the baseline configuration).</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/01RMiRjNi47AeFK64CZoy3/7ba82f9681a67178659a2c26f8c77a29/Screenshot-2022-12-22-at-10.25.13-AM.png" />
            
            </figure><p>From there any changes that you make to Version 1 will be safely stored and propagated to our global network, but will not affect any traffic. Making changes to a version is no different from before, just select the version to edit and modify the configuration of that feature as normal. Once you have made the set of changes desired for a given version, to deploy that version on live traffic in your zone, you will need to deploy the version to an Environment.</p><p>Environments are a way of mapping segments of your zone’s traffic to versions of configuration. Powered by our <a href="https://developers.cloudflare.com/ruleset-engine/">Ruleset Engine</a>, that powers the likes of <a href="https://developers.cloudflare.com/waf/custom-rules/create-dashboard/">Custom WAF Rules</a> and <a href="https://developers.cloudflare.com/cache/about/cache-rules/">Cache Rules</a>, Environments give you the ability to create filters based on a wide range of parameters such as hostname, client IP, location, or cookie. When a version is applied to an Environment, any traffic matching the filter will use that version’s configuration.</p><div></div>
<p></p><p>By default, we create three environments to get started with:</p><ul><li><p>Development - Applies to traffic sent with a specific cookie for development</p></li><li><p>Staging - Applies to traffic sent to Cloudflare’s staging IPs</p></li><li><p>Production - Applies to all traffic on the zone</p></li></ul><p>You can create additional environments or modify the pre-defined environments except for Production. Any newly created environment will begin in an unassigned state meaning traffic will fall back to the baseline configuration of the zone. In the above image, we have deployed Version 2 to both the Development and Staging environments. Once we have tested Version 2 in staging, then we can ‘Promote’ Version 2 to Production which means all traffic on the zone will receive the configuration in Version 2 except for Development and Staging traffic. If something goes wrong after deploying to Production, then we can use the ‘Rollback’ action to revert to the configuration of Version 1.</p>
    <div>
      <h3>How promotion and rollbacks work</h3>
      <a href="#how-promotion-and-rollbacks-work">
        
      </a>
    </div>
    <p>It is worth going into a bit more detail about how configuration changes, promotions, and rollbacks are realized in our global network. Whenever a configuration change is made to a version, we store that change in our system of record for the service and push that change to our global network so that it is available to be used at any time.</p><p>Importantly and unlike how changes to zones automatically take effect, that change will not be used until the version is deployed to an environment that is receiving traffic. The same is true for when a version is promoted or rolled back between environments. Because all the configuration we need for a given version is already available in our global network, we only need to push a single, atomic change to tell our network that traffic matching the filter for a given environment should now use the newly defined configuration version.</p><p>This means that promotions and more importantly rollbacks occur as quickly as you are used to with any configuration change in Cloudflare. No need to wait five or ten minutes for us to roll back a bad deployment, if something goes wrong you can return to a last known good configuration in seconds. Slow rollbacks can make ongoing incidents drag on leading to extended customer impact, so the ability to quickly execute a rollback was a critical capability.</p>
    <div>
      <h3>Get started with Zone Versioning today</h3>
      <a href="#get-started-with-zone-versioning-today">
        
      </a>
    </div>
    <p>Enterprise Customers can get started with Zone Versioning today for their zones on the Cloudflare dashboard. Customers will need to be using the <a href="https://support.cloudflare.com/hc/en-us/articles/5995821690637-Migrating-from-WAF-managed-rules-to-WAF-Managed-Rulesets">new Managed WAF rules</a> in order to enable Zone Versioning. You can find more information about <a href="https://developers.cloudflare.com/version-management">Zone Versioning in our Developer Docs</a>.</p><p>Happy versioning!</p> ]]></content:encoded>
            <category><![CDATA[Product News]]></category>
            <category><![CDATA[CIO Week]]></category>
            <category><![CDATA[Zone Versioning]]></category>
            <guid isPermaLink="false">7q9tPSKP9VU4n56zwDT1n2</guid>
            <dc:creator>Garrett Galow</dc:creator>
        </item>
        <item>
            <title><![CDATA[The Cloudflare API now uses OpenAPI schemas]]></title>
            <link>https://blog.cloudflare.com/open-api-transition/</link>
            <pubDate>Wed, 16 Nov 2022 14:00:00 GMT</pubDate>
            <description><![CDATA[ Cloudflare now has OpenAPI Schemas available for the API. Users can use these schemas in any open source OpenAPI Tooling. ]]></description>
            <content:encoded><![CDATA[ 
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2yxy5Dmp3sT7mMhoPFwyMs/43ad3be6028c91ab4cee6ce72eea508e/image1-44.png" />
            
            </figure><p>Today, we are announcing the general availability of <a href="https://github.com/cloudflare/api-schemas">OpenAPI Schemas for the Cloudflare API</a>. These are published via GitHub and will be updated regularly as Cloudflare adds and updates APIs. OpenAPI is the widely adopted standard for defining APIs in a machine-readable format. OpenAPI Schemas allow for the ability to plug our API into a wide breadth of tooling to accelerate development for ourselves and customers. Internally, it will make it easier for us to maintain and update our APIs. Before getting into those benefits, let’s start with the basics.</p>
    <div>
      <h2>What is OpenAPI?</h2>
      <a href="#what-is-openapi">
        
      </a>
    </div>
    <p>Much of the Internet is built upon <a href="https://www.cloudflare.com/learning/security/api/what-is-an-api/">APIs (Application Programming Interfaces)</a> or provides them as services to clients all around the world. This allows computers to talk to each other in a standardized fashion. OpenAPI is a widely adopted standard for how to define APIs. This allows other machines to reliably parse those definitions and use them in interesting ways. Cloudflare’s own <a href="https://developers.cloudflare.com/api-shield/security/schema-validation/">API Shield product</a> uses OpenAPI schemas to provide schema validation to ensure only well-formed API requests are sent to your origin.</p><p>Cloudflare itself has an API that customers can use to interface with our security and performance products from other places on the Internet. How do we define our own APIs? In the past we used a standard called <a href="https://github.com/json-schema-org/json-hyperschema-spec">JSON Hyper-Schema</a>. That had served us well, but as time went on we wanted to adopt more tooling that could both benefit ourselves internally and make our customer’s lives easier. The OpenAPI community has flourished over the past few years providing many capabilities as we will discuss that were unavailable while we used JSON Hyper-Schema. As of today we now use OpenAPI.</p><p>You can learn more about OpenAPI itself <a href="https://oai.github.io/Documentation/start-here.html">here</a>. Having an open, well-understood standard for defining our APIs allows for shared tooling and infrastructure to be used that can read these standard definitions. Let’s take a look at a few examples.</p>
    <div>
      <h2>Uses of Cloudflare’s OpenAPI schemas</h2>
      <a href="#uses-of-cloudflares-openapi-schemas">
        
      </a>
    </div>
    <p>Most customers won’t need to use the schemas themselves to see value. The first system leveraging OpenAPI schemas is our <a href="https://developers.cloudflare.com/api/">new API Docs</a> that were <a href="/building-a-better-developer-experience-through-api-documentation/">announced today</a>. Because we now have OpenAPI schemas, we leverage the open source tool <a href="https://stoplight.io/open-source/elements">Stoplight Elements</a> to aid in generating this new doc site. This allowed us to retire our previously custom-built site that was hard to maintain. Additionally, many engineers at Cloudflare are familiar with OpenAPI, so we gain teams can write new schemas more quickly and are less likely to make mistakes by using a standard that teams understand when defining new APIs.</p><p>There are ways to leverage the schemas directly, however. The OpenAPI community has a huge number of tools that only require a set of schemas to be able to use. Two such examples are mocking APIs and library generation.</p>
    <div>
      <h3>Mocking Cloudflare’s API</h3>
      <a href="#mocking-cloudflares-api">
        
      </a>
    </div>
    <p>Say you have code that calls Cloudflare’s API and you want to be able to easily run unit tests locally or integration tests in your <a href="https://www.cloudflare.com/learning/serverless/glossary/what-is-ci-cd/">CI/CD pipeline</a>. While you could just call Cloudflare’s API in each run, you may not want to for a few reasons. First, you may want to run tests frequently enough that managing the creation and tear down of resources becomes a pain. Also, in many of these tests you aren’t trying to validate logic in Cloudflare necessarily, but your own system’s behavior. In this case, mocking Cloudflare’s API would be ideal since you can gain confidence that you aren’t violating Cloudflare’s API contract, but without needing to worry about specifics of managing real resources. Additionally, mocking allows you to simulate different scenarios, like being rate limited or receiving 500 errors. This allows you to test your code for typically rare circumstances that can end up having a serious impact.</p><p>As an example, <a href="https://docs.stoplight.io/docs/prism/83dbbd75532cf-http-mocking">Stoplight Prism</a> could be used to mock Cloudflare’s API for testing purposes. With a local copy of Cloudflare’s API Schemas you can run the following command to spin up a local mock server:</p>
            <pre><code>$ docker run --init --rm \
  -v /home/user/git/api-schemas/openapi.yaml:/tmp/openapi.yaml \
  -p 4010:4010 stoplight/prism:4 \
  mock -h 0.0.0.0 /tmp/openapi.yaml</code></pre>
            <p>Then you can send requests to the mock server in order to validate that your use of Cloudflare’s API doesn’t violate the API contract locally:</p>
            <pre><code>$ curl -sX PUT localhost:4010/zones/f00/activation_check \
  -Hx-auth-email:foo@bar.com -Hx-auth-key:foobarbaz | jq
{
  "success": true,
  "errors": [],
  "messages": [],
  "result": {
    "id": "023e105f4ecef8ad9ca31a8372d0c353"
  }
}</code></pre>
            <p>This means faster development and shorter test runs while still catching API contract issues early before they get merged or deployed.</p>
    <div>
      <h3>Library generation</h3>
      <a href="#library-generation">
        
      </a>
    </div>
    <p>Cloudflare has libraries in many programming languages like <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest">Terraform</a> and <a href="https://github.com/cloudflare/cloudflare-go">Go</a>, but we don’t support every possible programming language. Fortunately, using a tool like <a href="https://github.com/OpenAPITools/openapi-generator">openapi generator</a>, you can feed in Cloudflare’s API schemas and generate a library in a wide range of languages to then use in your code to talk to Cloudflare’s API. For example, you could generate a Java library using the following commands:</p>
            <pre><code>git clone https://github.com/openapitools/openapi-generator
cd openapi-generator
mvn clean package
java -jar modules/openapi-generator-cli/target/openapi-generator-cli.jar generate \
   -i https://raw.githubusercontent.com/cloudflare/api-schemas/main/openapi.yaml \
   -g java \
   -o /var/tmp/java_api_client</code></pre>
            <p>And then start using that client in your Java code to talk to Cloudflare’s API.</p>
    <div>
      <h2>How Cloudflare transitioned to OpenAPI</h2>
      <a href="#how-cloudflare-transitioned-to-openapi">
        
      </a>
    </div>
    <p>As mentioned earlier, we previously used JSON Hyper-Schema to define our APIs. We have roughly 600 endpoints that were already defined in the schemas. Here is a snippet of what one endpoint looks like in JSON Hyper-Schema:</p>
            <pre><code>{
      "title": "List Zones",
      "description": "List, search, sort, and filter your zones.",
      "rel": "collection",
      "href": "zones",
      "method": "GET",
      "schema": {
        "$ref": "definitions/zone.json#/definitions/collection_query"
      },
      "targetSchema": {
        "$ref": "#/definitions/response_collection"
      },
      "cfOwnership": "www",
      "cfPlanAvailability": {
        "free": true,
        "pro": true,
        "business": true,
        "enterprise": true
      },
      "cfPermissionsRequired": {
        "enum": [
          "#zone:read"
        ]
      }
    }</code></pre>
            <p>Let’s look at the same endpoint in OpenAPI:</p>
            <pre><code>/zones:
    get:
      description: List, search, sort, and filter your zones.
      operationId: zone-list-zones
      responses:
        4xx:
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/components-schemas-response_collection'
                - $ref: '#/components/schemas/api-response-common-failure'
          description: List Zones response failure
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/components-schemas-response_collection'
          description: List Zones response
      security:
      - api_email: []
        api_key: []
      summary: List Zones
      tags:
      - Zone
      x-cfPermissionsRequired:
        enum:
        - '#zone:read'
      x-cfPlanAvailability:
        business: true
        enterprise: true
        free: true
        pro: true</code></pre>
            <p>You can see that the two look fairly similar and for the most part the same information is contained in each including method type, a description, and request and response definitions (although those are linked in $refs). The value of migrating from one to the other isn’t the change in how we define the schemas themselves, but in what we can do with these schemas. Numerous tools can parse the latter, the OpenAPI, while much fewer can parse the former, the JSON Hyper-Schema.</p><p>If this one API was all that made up the Cloudflare API, it would be easy to just convert the JSON Hyper-Schema into the OpenAPI Schema by hand and call it a day. Doing this 600 times, however, was going to be a huge undertaking. When considering that teams are constantly adding new endpoints, it would be impossible to keep up. It was also the case that our existing API docs used the existing JSON Hyper-Schema, so that meant that we would need to keep both schemas up to date during any transition period. There had to be a better way.</p>
    <div>
      <h3>Auto conversion</h3>
      <a href="#auto-conversion">
        
      </a>
    </div>
    <p>Given both JSON Hyper-Schema and OpenAPI are standards, it reasons that it should be possible to take a file in one format and convert to the other, right? Luckily the answer is yes! We built a tool that took all existing JSON Hyper-Schema and output fully compliant OpenAPI schemas. This of course didn’t happen overnight, but because of existing OpenAPI tooling, we could iteratively improve the auto convertor and run OpenAPI validation tooling over the output schemas to see what issues the conversion tool still had.</p><p>After many iterations and improvements to the conversion tool, we finally had fully compliant OpenAPI Spec schemas being auto-generated from our existing JSON Hyper-Schema. While we were building this tool, teams kept adding and updating the existing schemas and our Product Content team was also updating text in the schemas to make our API docs easier to use. The benefit of this process is we didn’t have to slow any of that work down since anything that changed in the old schemas was automatically reflected in the new schemas!</p><p>Once the tool was ready, the remaining step was to decide when and how we would stop making updates to the JSON Hyper-Schemas and move all teams to the OpenAPI Schemas. The (now old) API docs were the biggest concern, given they only understood JSON Hyper-Schema. Thanks to the help of our Developer Experience and Product Content teams, we were able to launch the new API docs today and can officially cut over to OpenAPI today as well!</p>
    <div>
      <h2>What’s next?</h2>
      <a href="#whats-next">
        
      </a>
    </div>
    <p>Now that we have fully moved over to OpenAPI, more opportunities become available. Internally, we will be investigating what tooling we can adopt in order to help reduce the effort of individual teams and speed up API development. One idea we are exploring is automatically creating openAPI schemas from code notations. Externally, we now have the foundational tools necessary to begin exploring how to auto generate and support more programming language libraries for customers to use. We are also excited to see what you may do with the schemas yourself, so if you do something cool or have ideas, don’t hesitate to share them with us!</p> ]]></content:encoded>
            <category><![CDATA[Developer Week]]></category>
            <category><![CDATA[Deep Dive]]></category>
            <category><![CDATA[API]]></category>
            <guid isPermaLink="false">2W25ZXGCTx02W7CmYfX6FS</guid>
            <dc:creator>Garrett Galow</dc:creator>
        </item>
        <item>
            <title><![CDATA[How we built config staging and versioning with HTTP applications]]></title>
            <link>https://blog.cloudflare.com/version-and-stage-configuration-changes-with-http-applications/</link>
            <pubDate>Thu, 12 May 2022 12:58:56 GMT</pubDate>
            <description><![CDATA[ Learn how we built config versioning and staging for L7 configuration with HTTP Applications ]]></description>
            <content:encoded><![CDATA[ <p></p><p>Last December, we <a href="/version-and-stage-configuration-changes-with-http-applications-in-beta/">announced</a> a closed beta of a new product, HTTP Applications, giving customers the ability to better control their L7 Cloudflare configuration with versioning and staging capabilities. Today, we are expanding this beta to all enterprise customers who want to participate. In this post, I will talk about some of the improvements that have landed and go into more detail about how this product works.</p>
    <div>
      <h3>HTTP Applications</h3>
      <a href="#http-applications">
        
      </a>
    </div>
    <p>A quick recap of what HTTP Applications are and what they can do. For a deeper dive on how to use them see the <a href="/version-and-stage-configuration-changes-with-http-applications-in-beta/">previous blog post</a>.</p><p>As previously mentioned: HTTP Applications are a way to manage configuration by use case, rather than by hostname. Each HTTP Application has a purpose, whether that is handling the configuration of your marketing website or an internal application. Each HTTP Application consists of a set of versions where each represents a snapshot of settings for managing traffic — Page Rules, Firewall Rules, cache settings, etc.  Each version of configuration inside the HTTP Application is independent of the others, and when a new version is created, it is initialized as a copy of the version that preceded it.</p><p>An HTTP Application can be represented with the following diagram:</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3YUr9K9DtZn6SmLo2jg8Tp/8253840807293310fe227d67ca24a7f6/unnamed.png" />
            
            </figure><p>Each HTTP Application is sourced from an existing zone. That zone’s current configuration will be copied to instantiate the first version of the HTTP Application. After that any changes made to the zone or version 1 will be independent of the other. Versions themselves don’t affect any traffic for a zone until they are deployed via the use of Routing Rules.</p>
    <div>
      <h3>Routing Rules</h3>
      <a href="#routing-rules">
        
      </a>
    </div>
    <p>Unlike zones, each version of an HTTP Application is independent of any specific hostname. So if versions are not tied to a hostname, like zones, then how do you decide which version of an HTTP Application will affect a specific set of traffic? The answer is Routing Rules. With Routing Rules, you get to decide which version of an HTTP Application is applied to traffic. Routing Rules are powered by Cloudflare’s <a href="https://developers.cloudflare.com/ruleset-engine/">Ruleset Engine</a> and rely on the use of conditional “if, then” rules to map hostnames controlled in your Cloudflare account to a version of configuration. As an example, a rule could be:</p>
            <pre><code>If zone.name = `example.com`
Then use configuration of HTTP Application id: xyz, version 2</code></pre>
            <p>When this rule executes on our global network, instead of applying the regular zone configuration of <code>example.com</code>, we will instead use the configuration defined in version 2 of the HTTP Application.</p><p>Expanding the previous diagram we get the following:</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6DVFJUw8iPKJFzUcsNdWYX/6e6a419f80625200e480f807351059b3/unnamed--1-.png" />
            
            </figure><p>The combination of Routing Rules and HTTP Applications means you can ‘stage’ a set of changes, via a version, without requiring a separate staging zone as has been required in the past. Cloudflare will provide you with specific IPs that can be used to test the configuration before rolling it out to production. This means you can catch misconfigurations in rules or other settings before it impacts your customers.</p>
    <div>
      <h3>How HTTP Applications and Routing Rules work</h3>
      <a href="#how-http-applications-and-routing-rules-work">
        
      </a>
    </div>
    <p>Let’s break down how this all works behind the scenes and gives you a safe way to test changes to your configuration. In all of Cloudflare’s data centers around the world, every request is first inspected and associated with an account/config pair so that we know what configuration settings we should apply to this request. If you have the zone ‘example.com’, with an id of 123, in your account, with an id of 777, then when a request for example.com/cat.jpg arrives at the Cloudflare network, the ownership lookup will return a value like 777:123 which then denotes the account and config settings we should use to process that request.</p><p>When HTTP Applications and Routing Rules are being used, the ownership lookup occurs as normal, but instead of loading configuration based on the zone for the account:config pair, Cloudflare does one additional lookup to see if any routing rules are in place that would change which configuration should be used. If a rule exists like before:</p>
            <pre><code>If zone.name = `example.com`
Then use configuration of HTTP Application id: xyz, version 2</code></pre>
            <p>Then when ownership is evaluated, instead of loading configuration for account:config 777:123, Cloudflare will load the configuration of the version of that HTTP Application, let’s say that version 2 from the rule has a config id of 456. Then the lookup value for loading configuration will instead be 777:456.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4hhe8bllxcQL20E1npIO5K/8ee6d0ebd2611b8577c3b94ae1874892/HTTP-Apps-1.png" />
            
            </figure><p>Because Routing Rules are implemented with the <a href="https://developers.cloudflare.com/ruleset-engine/">Ruleset Engine</a>, we can implement a special type of rule to allow a version to be staged such that it is only executed for requests when the request is sent to IPs reserved for testing. The resulting diagram is almost the same, but because the request is being sent to staging IPs, Cloudflare’s network will route that request to a different version of the HTTP Application that has a set of changes not yet deployed for all other traffic.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/7mNuQRHVRs5ZzR5nIESQgZ/857180f18ae90769a6feb4ce30fdff8a/HTTP-Apps-2.png" />
            
            </figure><p>This is what enables you to safely test a set of changes and then simultaneously deploy the exact same configuration to all traffic. If anything goes wrong when testing in staging or rolling out to production, you can simply roll back the configuration to the previous version that was deployed. No need to try and hunt down what settings may have changed. That investigation can be done after the issue has been resolved through a quick, one-click rollback.</p>
    <div>
      <h3>Now available for Enterprise Customers</h3>
      <a href="#now-available-for-enterprise-customers">
        
      </a>
    </div>
    <p>HTTP Applications and Routing Rules put power and safety in customer’s hands so that configuration changes can be made more easily. When issues do arise they can be resolved quickly through rollbacks. We will continue to be expanding the capabilities offered throughout the year, but if you are interested in trying it out now and are an enterprise customer, talk to your account manager to get access!</p> ]]></content:encoded>
            <category><![CDATA[Platform Week]]></category>
            <guid isPermaLink="false">4GiHxfcCUVZZLZmkOCTqbw</guid>
            <dc:creator>Garrett Galow</dc:creator>
        </item>
        <item>
            <title><![CDATA[Domain Scoped Roles - Early Access]]></title>
            <link>https://blog.cloudflare.com/domain-scoped-roles-early-access/</link>
            <pubDate>Fri, 18 Mar 2022 21:04:00 GMT</pubDate>
            <description><![CDATA[ Cloudflare is making it easier for enterprise account owners to manage their team’s access to Cloudflare by allowing user access to be scoped to sets of domains. ]]></description>
            <content:encoded><![CDATA[ <p></p><p>Today, Cloudflare is making it easier for enterprise account owners to manage their team’s access to Cloudflare by allowing user access to be scoped to sets of domains. Ensuring users have exactly the access they need and no more is critical, and Domain Scoped Roles provide a significant step forward. Additionally, with the introduction of Domain Groups, account owners can grant users access to domains by group instead of individually. Domains can be added or removed from these groups to automatically update the access of those who have access to the group. This reduces toil in managing user access.</p><p>One of the most common uses we have seen for Domain Scoped Roles is to limit access to production domains to a small set of team members, while still allowing development and pre-production domains to be open to the rest of the team. That way, someone can’t make changes to a production domain unless they are given access.</p>
    <div>
      <h3>How to use Domain Scoped Roles</h3>
      <a href="#how-to-use-domain-scoped-roles">
        
      </a>
    </div>
    <p>If you are an enterprise customer please talk with your CSM to get you and your team enrolled. Note that you must have Super Administrator privileges to be able to modify account memberships.</p><p>Once the beta has been enabled for you, here is how to start using it:</p><ul><li><p>Log in to <a href="https://dash.cloudflare.com">dash.cloudflare.com</a>, select your account, and navigate to the <a href="https://dash.cloudflare.com/?account=members">members page</a>.</p><ul><li><p>From here, you can either invite a new member with a Domain Scoped Role or modify an existing user’s permissions. In this case, we will invite a new user.</p></li></ul></li></ul>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/7Itam7ImZp41fEhXudxach/f8d6cd2b2abb65df9a5da682b85bace0/image1-72.png" />
            
            </figure><ul><li><p>When inviting new members there are three things to provide:</p><ul><li><p>Which users to invite.</p></li><li><p>The scope of which resource they will have access to:</p><ul><li><p>Selecting “All Domains” will allow you to select legacy roles.</p></li></ul></li><li><p>The role(s) which will decide what permissions are granted.</p></li></ul></li></ul>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3757BL7vZiIxEgMqLjUNfm/c98526807c5d1b8cfa5e44e02e3ec26b/1a.png" />
            
            </figure><ul><li><p>Before sending the invite, you will be able to confirm the users, scope, and roles.</p></li></ul>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1SJEopWHA0ryzEZ84AMkyJ/18c83dfa4518c3bb836779bfaca29bcf/1b.png" />
            
            </figure>
    <div>
      <h3>Domain Groups</h3>
      <a href="#domain-groups">
        
      </a>
    </div>
    <p>In addition to manually creating inclusion or exclusion lists per user, account owners can also create Domain Groups to allow granting one or more users to a group of domains. Domain Groups can be created from the member invite flow or directly from Account Configurations → <a href="https://dash.cloudflare.com/?account=configurations/lists">Lists</a>. When creating a domain group, the user selects the domains to include and, from that point on, the group can be used when inviting a user to the account.</p>
    <div>
      <h4>Domain Group Creation Screen</h4>
      <a href="#domain-group-creation-screen">
        
      </a>
    </div>
    
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/ZnFUgFHbOn3lqT1oUldtZ/4d4659b882a230af98f51714e337c4da/image4-13.png" />
            
            </figure>
    <div>
      <h4>Domain Group selection during member invite</h4>
      <a href="#domain-group-selection-during-member-invite">
        
      </a>
    </div>
    
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2Wkzbiwso2hdps1g9hj1ff/26b5e13441ba317361b2a61314b266df/image6-4.png" />
            
            </figure>
    <div>
      <h3>Introducing Bach</h3>
      <a href="#introducing-bach">
        
      </a>
    </div>
    <p>Domain Scoped Roles is possible because of a new permission system called Bach. Bach provides a policy based system for defining authorization to Cloudflare’s control plane. Authorization defines what someone can do in a system. Bach has been powering API Tokens, but going forward all authorization will use Bach. This gives customers the ability to define more granular permissions and resource scoping. Resources can be any object a user interacts with whether that be accounts, zones, worker environments, or DNS records to name a few.. Whereas before Cloudflare’s <a href="/domain-scoped-roles-early-access/edit">RBAC system</a> relied on assigning a set of roles in which each role defined broad permissions that applied to an entire account, Bach’s policies allow for deeper permission grants that can be scoped to sets of resources.</p><p>Let’s take a look at the legacy system and how it compares to what Bach supports. Typically, user’s permissions are defined by the ‘roles’ that they are assigned to. These included: ‘Super Administrator’, ‘Administrator’, ‘Cloudflare for Teams’, and ‘Cloudflare Workers Admin’ to name a few. In the legacy system, each of these maps to an explicit set of simple permissions like ‘workers:read’, ‘workers:edit’ or ‘zones:edit’. When requests get made either via the Cloudflare API or the Cloudflare dashboard, Cloudflare’s API Gateway would check to see if, for the endpoint requested, an actor had the correct permissions to perform the action. In order to change a zone setting, the actor would need to have the ‘zone:edit’ permission – which could be granted from one of many roles. Below is what a user with only ‘DNS’ permissions is granted in the legacy system:</p>
    <div>
      <h4>Legacy DNS User Role Permissions</h4>
      <a href="#legacy-dns-user-role-permissions">
        
      </a>
    </div>
    <table><tr><td><p><b>Permission</b></p></td><td><p><b>Edit</b></p></td><td><p><b>Read</b></p></td></tr><tr><td><p>dns_records</p></td><td><p>✔</p></td><td><p>✔</p></td></tr><tr><td><p>legal</p></td><td><p></p></td><td><p>✔</p></td></tr><tr><td><p>account</p></td><td><p></p></td><td><p>✔</p></td></tr><tr><td><p>subscription</p></td><td><p></p></td><td><p>✔</p></td></tr><tr><td><p>zone</p></td><td><p></p></td><td><p>✔</p></td></tr><tr><td><p>zone_settings</p></td><td><p></p></td><td><p>✔</p></td></tr></table><p>While straightforward, this had many drawbacks. First, this meant the inability to define limits on the resources the permissions applied to, whether that be a set of resources or attributes of resources. Second, permissions for a given ‘resource’ were simply read or edit, where edit included creating and deleting. These don’t fully capture the needs that may exist – for example, limiting deletions while allowing edits.</p><p>With Bach, we have an expanded capability to define granular permissions for authorization. An example policy defining the aforementioned ‘DNS’ member’s access would look like this:</p>
    <div>
      <h3>Bach DNS User Role Policy</h3>
      <a href="#bach-dns-user-role-policy">
        
      </a>
    </div>
    <p>(slightly modified for readability)</p>
            <pre><code>#Legacy DNS Role - applies to all zones
  policies:
  - id: 186f95f3bda1443c986aeb78b05eb60b
    permission_groups:
    - id: 49ce85367bae433b9f0717ed4fea5c74
      name: DNS
      meta:
        description: Can edit DNS records.
        editable: 'false'
        label: dns_admin
        scopes: com.cloudflare.api.account
      permissions:
      - key: com.cloudflare.registrar.domain.read
      - key: com.cloudflare.registrar.domain.list
      - key: com.cloudflare.registrar.contact.read
      - key: com.cloudflare.registrar.contact.list
      - key: com.cloudflare.api.account.secondary-dns.update
      - key: com.cloudflare.api.account.secondary-dns.read
      - key: com.cloudflare.api.account.secondary-dns.delete
      - key: com.cloudflare.api.account.secondary-dns.create
      - key: com.cloudflare.api.account.zone.secondary-dns.update
      - key: com.cloudflare.api.account.zone.secondary-dns.read
      - key: com.cloudflare.api.account.zone.secondary-dns.delete
      - key: com.cloudflare.api.account.zone.secondary-dns.create
      - key: com.cloudflare.api.account.notification.*
      - key: com.cloudflare.api.account.custom-ns.update
      - key: com.cloudflare.api.account.custom-ns.list
      - key: com.cloudflare.api.account.custom-ns.*
      - key: com.cloudflare.edge.spectrum.app.list
      - key: com.cloudflare.edge.spectrum.app.read
      - key: com.cloudflare.api.account.zone.custom-page.read
      - key: com.cloudflare.api.account.zone.custom-page.list
      - key: com.cloudflare.api.account.zone.setting.read
      - key: com.cloudflare.api.account.zone.setting.list
      - key: com.cloudflare.api.account.zone.dnssec.update
      - key: com.cloudflare.api.account.zone.dnssec.read
      - key: com.cloudflare.api.account.dns-firewall.cluster.delete
      - key: com.cloudflare.api.account.dns-firewall.cluster.update
      - key: com.cloudflare.api.account.dns-firewall.cluster.read
      - key: com.cloudflare.api.account.dns-firewall.cluster.create
      - key: com.cloudflare.api.account.dns-firewall.cluster.list
      - key: com.cloudflare.api.account.zone.dns-record.delete
      - key: com.cloudflare.api.account.zone.dns-record.update
      - key: com.cloudflare.api.account.zone.dns-record.read
      - key: com.cloudflare.api.account.zone.dns-record.create
      - key: com.cloudflare.api.account.zone.dns-record.list
      - key: com.cloudflare.api.account.zone.page-rule.read
      - key: com.cloudflare.api.account.zone.page-rule.list
      - key: com.cloudflare.api.account.zone.railgun-connection.read
      - key: com.cloudflare.api.account.zone.railgun-connection.list
      - key: com.cloudflare.api.account.zone.subscription.read
      - key: com.cloudflare.api.account.zone.aml.read
      - key: com.cloudflare.api.account.zone.read
      - key: com.cloudflare.api.account.zone.list
      - key: com.cloudflare.api.account.audit-log.read
      - key: com.cloudflare.api.account.custom-page.read
      - key: com.cloudflare.api.account.custom-page.list
      - key: com.cloudflare.api.account.railgun.read
      - key: com.cloudflare.api.account.railgun.list
      - key: com.cloudflare.api.account.dpa.read
      - key: com.cloudflare.api.account.subscription.read
      - key: com.cloudflare.api.account.subscription.list
      - key: com.cloudflare.api.account.read
      - key: com.cloudflare.api.account.list
    resource_groups:
    - id: 2fe938e0a5824128bdc8c42f9339b127
      name: com.cloudflare.api.account.a67e14daa5f8dceeb91fe5449ba496eb
      meta:
        editable: 'false'
      scope:
        key: com.cloudflare.api.account.a67e14daa5f8dceeb91fe5449ba496eb
        objects:
        - key: "*"
    access: allow</code></pre>
            <p>You can see a greater granularity in the permissions that are defined. In both cases, the user can perform the same actions, but the granularity means we are more explicit about what can be done. Here for DNS records (under com.cloudflare.api.account.zone.dns-record) there are explicit create, read, update, delete and list permissions. In the resource group section, we can see that the scope section defines an account. Any objects like domains in that account will match to the “*” value under ‘objects’. This means that these permissions apply throughout the entire account. Now, let’s modify this user’s permissions to be scoped to a single domain and see how the policy changes.</p>
    <div>
      <h3>Bach DNS User Role with Domain Scoping Policy</h3>
      <a href="#bach-dns-user-role-with-domain-scoping-policy">
        
      </a>
    </div>
    <p>(slightly modified for readability)</p>
            <pre><code># Zone Scoped DNS role - scoped to 1 zone
policies:
- id: 80b25dd735b040708155c85d0ed8a508
  permission_groups:
  - id: 132c52e7e6654b999c183cfcbafd37d7
    name: Zone DNS
    meta:
      description: Grants access to edit DNS settings for zones in an account.
      editable: 'false'
      label: zone_dns_admin
      scopes: com.cloudflare.api.account.zone
    permissions:
    - key: com.cloudflare.api.account.zone.secondary-dns.*
    - key: com.cloudflare.api.account.zone.dnssec.*
    - key: com.cloudflare.api.account.zone.dns-record.*
    - key: com.cloudflare.api.account.zone.analytics.dns-report.*
    - key: com.cloudflare.api.account.zone.analytics.dns-bytime.*
    - key: com.cloudflare.api.account.zone.setting.read
    - key: com.cloudflare.api.account.zone.setting.list
    - key: com.cloudflare.api.account.zone.rate-plan.read
    - key: com.cloudflare.api.account.zone.subscription.read
    - key: com.cloudflare.api.account.zone.read
    - key: com.cloudflare.api.account.subscription.read
    - key: com.cloudflare.api.account.subscription.list
    - key: com.cloudflare.api.account.read
  resource_groups:
  - scope:
      key: com.cloudflare.api.account.a67e14daa5f8dceeb91fe5449ba496eb
      objects:
      - key: com.cloudflare.api.account.zone.b1fbb152bbde3bd28919a7f4bdca841f
  access: allow</code></pre>
            <p>Once we scope the user’s permissions to only include one explicit zone, we see two main differences. First, there is a large reduction in permissions. This is because we do not grant the user access to read or list many account level resources that the legacy account scoped roles grant. The only account level permissions granted are <i>account.read</i>, <i>subscriptions.read</i>, and <i>subscriptions.list</i>. These permissions are necessary for a user to be able to use the dashboard.  When viewing the account in the dashboard the only account level product that will be shown is domains. Other products like Cloudflare Workers, Zero Trust, etc will be hidden.</p><p>Second, in the resource groups scope section, we see an explicit mention of a zone (line X: <code>com.cloudflare.api.account.zone.b1fbb152bbde3bd28919a7f4bdca841f</code>). This means that the zone permissions outlined in the policy only apply to that specific zone. Any attempt to access other features of that zone or to modify DNS for any other zones will be rejected by Cloudflare.</p>
    <div>
      <h2>What’s next</h2>
      <a href="#whats-next">
        
      </a>
    </div>
    <p>If you are an enterprise customer and interested in getting started with Domain Scoped Roles, please contact your CSM to get enabled for the Early Access period. This announcement represents a significant milestone in our migration to Bach, an authorization system built for Cloudflare’s scale. This will allow us to expand these same capabilities to more products in the future and to create an authorization system that puts customers more in control of their team’s access across all of Cloudflare’s services. Stay tuned as we are just getting started!</p> ]]></content:encoded>
            <category><![CDATA[Security Week]]></category>
            <category><![CDATA[Security]]></category>
            <category><![CDATA[Product News]]></category>
            <category><![CDATA[Domain Scoped Roles]]></category>
            <guid isPermaLink="false">nnIShKnEqkpAlu4MDhYcr</guid>
            <dc:creator>Garrett Galow</dc:creator>
        </item>
        <item>
            <title><![CDATA[Version and Stage Configuration Changes with HTTP Applications in Beta]]></title>
            <link>https://blog.cloudflare.com/version-and-stage-configuration-changes-with-http-applications-in-beta/</link>
            <pubDate>Sat, 11 Dec 2021 13:59:21 GMT</pubDate>
            <description><![CDATA[ Today, we are announcing a closed beta of HTTP Applications: a new way to safely test and deploy changes to your HTTP traffic ]]></description>
            <content:encoded><![CDATA[ 
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/uHwCFeawx2DxDeztCqngJ/0dbc28566b8a3900228c4a0561bba4c1/image7-9.png" />
            
            </figure><p>Today, we are announcing a closed beta of HTTP Applications: a new way to safely test and deploy changes to your HTTP traffic. HTTP Applications introduce versioning of configuration and the ability to control when changes rollout to HTTP traffic on Cloudflare’s global edge network. Enterprise customers looking for greater control should reach out to their Customer Success Manager to get access.</p>
    <div>
      <h3>Issues Encountered in Managing Configurations</h3>
      <a href="#issues-encountered-in-managing-configurations">
        
      </a>
    </div>
    <p>Since the very first days of Cloudflare, management of websites and web applications has been done through what we called a Zone, which comes from the concept of a <a href="https://www.cloudflare.com/learning/dns/glossary/dns-zone/">DNS Zone</a>. While this model has served customers well over the years, it does create difficulties in managing edge configuration, namely:</p><ol><li><p>Manual effort is required by customers to setup a staging environment.</p></li><li><p>Risk of drift in configuration between production and staging.</p></li></ol><p>In software development, you want to test changes in a safe environment to validate them before they go to production or affect live traffic. In many common software development lifecycles, this means deploying changes to a staging or pre-production environment for testing and validation. The most common way customers do this today on Cloudflare is through the use of two Zones denoted by the hostnames of those zones, for example: one for staging named <code><i>staging.example.com</i></code> and one for production named <code><i>example.com</i></code>. This solves the core problem, as it provides insulation of changes. Errors in the staging zone will not affect production traffic.</p><p>However, in order to apply to production, changes that have been successfully verified in staging, the customer must manually copy those changes — or build an automation through the use of Cloudflare’s <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs">Terraform Provider</a>. For many, this follows a manual ‘change request’ process in which a ticket is logged with the changes to be made. Then, someone (often a different person) picks up the ticket and must accurately reproduce the same changes based on manually provided instructions. This is an error-prone process; and an error in this process can lead to an outage, depending on the change involved. Additionally, a drift in the configuration between staging and production configurations could lead to further complications.</p><p>We want to provide customers with safety and reliability in managing their services on Cloudflare. In order to solve the aforementioned problems, we are announcing HTTP Applications along with Routing Rules.</p>
    <div>
      <h3>HTTP Applications</h3>
      <a href="#http-applications">
        
      </a>
    </div>
    <p>HTTP Applications are a way to manage edge configuration by use case, rather than by hostname. Each HTTP Application has a purpose, whether that is handling the configuration of your marketing website or an internal application. Each HTTP Application consists of versions of configurations where each version represents a snapshot of settings for managing traffic — page rules, firewall rules, cache settings, etc.  Each version of configuration inside of the HTTP Application is independent of the others, but when a new version is created, it is initialized as a copy of the version that preceded it.</p>
    <div>
      <h3>Routing Rules</h3>
      <a href="#routing-rules">
        
      </a>
    </div>
    <p>Unlike zones, each version of an HTTP Application is independent of any specific hostname. So if versions are not tied to a hostname, like zones, then how do you decide which version of an HTTP Application will affect a specific set of traffic? The answer is Routing Rules. With Routing Rules, you get to decide which version of an HTTP Application is applied to which traffic, aka hostnames. Routing Rules are powered by Cloudflare’s <a href="https://developers.cloudflare.com/ruleset-engine/">Ruleset Engine</a> and rely on the use of conditional “if then” rules to map hostnames controlled in your Cloudflare account to a version of configuration. As an example, if a request’s hostname matches `<a href="http://www.example.com`">www.example.com`</a>, then apply version 2 of my Marketing HTTP Application. When this rule executes at our edge, instead of applying the regular zone configuration of <a href="http://www.example.com"><code>www.example.com</code></a>, the edge will instead use the configuration defined in version 2 of the HTTP Application.</p><p>Routing Rules supports two kinds of rules — staging rules and production rules. Both take a list of hostnames, as described, but when creating a staging rule, we additionally apply a filter such that the rule will only execute when traffic is sent to specific IPs at our edge. This means that you can safely test changes by sending traffic to <a href="http://www.example.com"><code>www.example.com</code></a> at the staging IPs while customers are unaffected. Even better, once you have validated your changes with the creation of a production routing rule, the <b>exact same</b> configuration will be applied in production for all your customers.</p><p>But that’s enough talk — let’s see it in action!</p>
    <div>
      <h3>Using HTTP Applications to safely test and deploy a change</h3>
      <a href="#using-http-applications-to-safely-test-and-deploy-a-change">
        
      </a>
    </div>
    <p>For this walkthrough, I am going to play the role of an existing customer. I have an existing zone serving customers and I want to make some changes to transform rules such that I can rewrite my assets location. However, I am not very good with regex and making a mistake will likely break the site for all of my customers! Instead of making the change directly in the zone, we are going to use HTTP Applications and Routing Rules to make, test and roll out the change.</p><p>First, I log into the Cloudflare Dashboard. After selecting my account, I see HTTP Applications available in the sidebar. Upon selecting that, I am given the option to create my first HTTP Application.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2Nd7yCSBQjOJ8m1GJKxeBi/ea7cd4f48ef2625a0047fead77758146/image9-2.png" />
            
            </figure><p>The Cloudflare Dashboard showing the empty state page for HTTP Applications</p><p>To create my first HTTP Application, I need to give it a name and select a pre-existing zone, in this case example.com. Cloudflare will use that zone to initialize the configuration of the HTTP Application’s first version. By copying over the existing settings from the zone, I have a safe copy to work from, and I don’t need to rebuild the configuration manually.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4XyZ5d6ChNq8iErjbLMY09/7acc911cec6786070783734f64f2c4dc/image4-26.png" />
            
            </figure><p>The “Create an Application” screen showing that an HTTP Application will be created named “Example Application” and initialized from example.com.</p><p>After selecting create, I have my first HTTP Application! Now, the first version is in the process of being created. Behind the scenes, Cloudflare will take the existing configuration of example.com and copy it to Version 1 of this HTTP Application. Once successfully copied, I can begin making edits to the configuration.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4WFILRdVat2nT78zgcMd5F/47f17f72a8c6acb502a441f4e3b947f5/image6-15.png" />
            
            </figure><p>The Version list of the Example Application, showing Version 1 being created.</p><p>I can make edits to this version, just like I would with any zone. There are two important distinctions, however. First: any change I make right now will not affect any live traffic at Cloudflare’s edge, because we have not yet created any routing rules to send traffic to this version’s configuration. Second: we don’t allow everything associated with a zone to be controlled via an HTTP Application, namely: DNS records, <a href="https://www.cloudflare.com/application-services/products/ssl/">SSL Certificates</a>, Spectrum, or Load Balancing.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4BRn4GFKdQK8mIXZ6YPeSa/c87dc956111f59181770998c2dea6747/image8-8.png" />
            
            </figure><p>Transform rules of Version 1 showing no rules have been created.</p><p>In the Rules section under <a href="/introducing-transform-rules-with-url-rewriting-at-the-edge/">Transform Rules</a>, I create a new rule to rewrite the path of assets to their correct location. For any request to <code>example.com/assets/*</code>, we will rewrite the path to be <code>example.com/internal/files/assets/*</code>.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2IOkrSZpo2qzsaJGQgx6FX/54036e3f872ea97d65555784111e87e1/image13.png" />
            
            </figure><p>Creating a transform rule for Version 1 named “Rewrite Assets”. This rule replaces the path for requests starting with “/assets/*” with “internal/files/assets/*”.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3bSyIcAlnKfZgYrxUqToMp/6c56883f7b7025311b622608f5c38589/image8-10.png" />
            
            </figure><p>Transform rules of Version 1 showing a new rule named “Rewrite Assets” has been created.</p><p>At this point, I have made my change, but now I want to test it. To do that, I can leave the version editing section and head over to Routing Rules for this HTTP Application. Here I can create rules that will allow my existing traffic to be routed through this version’s configuration.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/68azYVx9EQe6VLE65dNZPu/26577b088b21188c3f8e7c448e8a5cf0/image12-3.png" />
            
            </figure><p>An empty list of Routing Rules for the Example Application.</p><p>I will create a staging rule, as I want to be the only one testing these changes without affecting any customers. Note, that when creating a staging rule, the IPs that can be used to test this version will be shown in the rule creation screen.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6tRvch04hvhXofPwAkArEF/73a8ed140d068076a677007e934fc2a8/image5-15.png" />
            
            </figure><p>Creating a staging Routing Rule that will match when requests match example.com and the edge IP is 192.168.1.1 or 192.168.2.2 and apply the configuration of Version 1</p><p>After creating the rule, I can configure my computer to send requests to those IPs for example.com. Rackspace has a <a href="https://docs.rackspace.com/support/how-to/modify-your-hosts-file/">comprehensive guide</a> for how to change your local machine’s host file to do this. Now, when I visit example.com, the new transform rule is executed, but for everyone else visiting the site, nothing has changed.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6MtOYdPSjloi85alwvPYIo/0b7c69d1c844de0febf006fa38050592/image10-3.png" />
            
            </figure><p>Routing Rules for the Example Application showing one rule for staging has been created.</p><p>Once I’m confident that my changes work, I can create a production Routing Rule that will apply these changes for all traffic to example.com — and I am done!</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6Mm3VFMhazKLwRXoDkyZC0/de0d34b90121b249fa27e16c7ce7f4a3/image3-30.png" />
            
            </figure><p>Routing Rule creation screen showing the creation of a production rule that will apply Version 1 when requests match example.com</p><p>Once updated, the path to assets for my site will be rewritten for all requests to <code><i>example.com</i></code>.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/25SLXGcLHJdpAEv72gdtsy/71cabaeea463164f387375d91b91dbb9/image1-61.png" />
            
            </figure><p>Routing Rules for the Example Application showing both a staging and production rule for Version 1.</p><p>What happens next? When I am ready to make another set of changes, I can go to my HTTP Application and clone Version 1 to create Version 2. Initially, Version 2 will exactly match the configuration of Version 1 but since it has no matching Routing Rules, it won’t be applied to any traffic.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1LAzLL9J0HlpOEED5SCkYw/18a45edb600b3fc7ab597935b7a4f82a/image11-3.png" />
            
            </figure><p>The list of versions for the Example Application showing Version 1 being applied to staging and production, and Version 2 ready to edit, but not being used anywhere.</p><p>I can now safely edit Version 2, like I did previously with Version 1. This time I want to make some changes to firewall rules, so that I can prevent some potentially malicious traffic from accessing my site. Making the changes in Version 2 will not modify any traffic at the edge until I update my staging Routing Rule to use Version 2. This allows me to make changes with confidence, and then safely test them.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4Fn5gR3WRYZCtxAFdqCtvE/26253d3f18921f4dc7078652929738ef/image2-46.png" />
            
            </figure><p>The list of routing rules for the Example Application showing Version 2 being used for staging, while Version 1 is still used in production.</p><p>After validating this new set of changes, I can push Version 2 to all traffic by updating the production Routing Rule to use Version 2. The same process can be done for each subsequent set of changes I want to make.</p>
    <div>
      <h3>HTTP Applications Now Available in Closed Beta</h3>
      <a href="#http-applications-now-available-in-closed-beta">
        
      </a>
    </div>
    <p>With the power of HTTP Applications and Routing Rules, customers now have greater control over how and when configuration changes are made. This alleviates the concern of making a bad change that might break your site. This capability is available in a closed beta for enterprise customers, but if you are interested, reach out to your Cloudflare account team to learn about how to get access!</p> ]]></content:encoded>
            <category><![CDATA[CIO Week]]></category>
            <guid isPermaLink="false">1C3SWV3Jt9wFolL8ZNBlkC</guid>
            <dc:creator>Garrett Galow</dc:creator>
        </item>
        <item>
            <title><![CDATA[All the Platform Improvements We’ve Made in 2021 to Make CIOs Lives Easier]]></title>
            <link>https://blog.cloudflare.com/platform-improvements-in-2021-to-make-cio-lives-easier/</link>
            <pubDate>Sat, 11 Dec 2021 13:59:10 GMT</pubDate>
            <description><![CDATA[ While over time best practices and technologies change, we aim to ensure our platform meets the security needs and depth of control that our customers require. In that spirit, we have been busy over the past year delivering important updates to many of our platform services. ]]></description>
            <content:encoded><![CDATA[ 
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2LRi9MnyfHjmj1fohS4RwS/25b6ca9388baa69ea1525478cb96c446/image1-67.png" />
            
            </figure><p>CIO week has been packed with new product innovations to give CIOs the tools they need to secure, protect, and speed up their networks. At Cloudflare, we know that many of the things that matter to CIOs are not just new product announcements — but the improvements to the security and usability of the platform itself. They’re much less visible, but no less important to ensuring our customers can reliably use the growing set of services we provide in a standard and secure manner. While over time best practices and technologies change, we aim to ensure our platform meets the security needs and depth of control that our customers require. In that spirit, we have been busy over the past year delivering important updates to many of our platform services.</p>
    <div>
      <h3>Improved SSO Onboarding</h3>
      <a href="#improved-sso-onboarding">
        
      </a>
    </div>
    <p>Customers need SSO to ensure they can securely control which applications employees can access. Our original iteration of SSO was manual and could be time consuming or error prone for customers to set up. We have <a href="https://developers.cloudflare.com/cloudflare-one/applications/configure-apps/dash-sso-apps">streamlined the setup process</a> by leveraging SaaS Applications in Cloudflare Access to allow customers to manage their SSO setup inside the <a href="https://dash.teams.cloudflare.com/">Cloudflare for Teams dashboard</a>. If you are an enterprise customer and are not yet getting the benefits of SSO, reach out to your account team so we can get you set up. Look forward to us further deepening control of user management when using SSO next year.</p>
    <div>
      <h3>Zone Scoped Roles Beta</h3>
      <a href="#zone-scoped-roles-beta">
        
      </a>
    </div>
    <p>Many customers keep both production and testing/staging zones in one account. This provides benefits for managing configuration given everything is in the scope of one account. A common issue that customers would run into though was that they wanted to handle access to critical production zones differently than their other zones. We now have a beta program available for customers to try out setting up zone scoped roles for members in this account. With Zone Scoped Roles, users can be granted access to a subset of the zones in an account. This means edit access to production zones can be limited to only those who truly need it. At the same time, everyone else can retain read only access, so they are not blocked from investigations. Again, for customers who want to try Zone Scoped Roles out, reach out to your account team for getting access to the beta.</p>
    <div>
      <h3>Terraform Improvements</h3>
      <a href="#terraform-improvements">
        
      </a>
    </div>
    <p>Customers continue to invest in automation in order to streamline management of Cloudflare and other providers. For many, Terraform is their go to solution to give them a single way to manage the multiple services they use every day. Cloudflare continues to invest in Terraform support for our services to ensure customers’ success.</p><ul><li><p>In 2021, we added 10 new resources, growing the list to <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs">51 resources</a>.</p></li><li><p>This included major additions to the platform like our <a href="https://developers.cloudflare.com/ruleset-engine/">ruleset engine</a> which powers features like <a href="https://developers.cloudflare.com/rules/transform">Transform Rules</a>, <a href="https://developers.cloudflare.com/waf/managed-rulesets">Managed WAF Rulesets</a>, and <a href="https://developers.cloudflare.com/ddos-protection/managed-rulesets">Managed DDoS Rulesets</a></p></li><li><p>We released a <a href="/cloudflares-partnership-with-hashicorp-and-bootstrapping-terraform-with-cf-terraforming/">major update</a> to <a href="https://github.com/cloudflare/cf-terraforming">cf-terraforming</a>, our library for quickly generating Terraform configuration and state for existing Cloudflare customers getting started with Terraform</p></li><li><p>More resources are now supported and we re-worked the interface for easier use.</p></li></ul>
    <div>
      <h3>Notifications and Alerts</h3>
      <a href="#notifications-and-alerts">
        
      </a>
    </div>
    <p>Cloudflare continues to invest heavily in giving customers the ability to know exactly what's happening as soon as it happens for their services behind Cloudflare. We have a great write up <a href="/p/994d43fd-0267-4d17-a0e9-dc9ddcb356b2/blog.cloudflare.com/whats-new-with-notifications/">today</a> on the improvements, but here is a quick list of the improvements:</p><ul><li><p>New Notification Types</p></li><li><p>DDoS Alerts</p></li><li><p>Firewall Alerts</p></li><li><p>Workers CPU</p></li><li><p>Origin 5XX Errors</p></li><li><p>New Webhook Destinations</p></li><li><p>DataDog, Discord, OpsGenie, and Splunk</p></li><li><p>This is in addition to Slack, Microsoft Teams, Google Chat, and custom destinations.</p></li><li><p><a href="https://api.cloudflare.com/#notification-history-properties">Alert History</a> is now available via API and with UI support coming soon.</p></li></ul><p>Again, if you’d like to see all the details of the improvements we’ve made, jump over <a href="/p/994d43fd-0267-4d17-a0e9-dc9ddcb356b2/blog.cloudflare.com/whats-new-with-notifications/">here</a>!</p>
    <div>
      <h3>Data Protection and Locality</h3>
      <a href="#data-protection-and-locality">
        
      </a>
    </div>
    <p>It’s been increasingly important for our customers to address requirements around data locality. We’ve built out capabilities that give customers control over where their data is processed and stored through the <a href="/introducing-the-cloudflare-data-localization-suite/">Data Localization Suite</a>.</p><p>In the EU, the recent “Schrems II” decision resulted in additional requirements for companies that transfer personal data outside the EU. And a number of highly regulated industries require that specific types of personal data stay within the EU’s borders.</p><p>Cloudflare is committed to helping our customers keep personal data in the EU. This week, <a href="/introducing-the-customer-metadata-boundary/">we introduced the Customer Metadata Boundary</a>, which expands the Data Localisation Suite to ensure that a customer’s end user traffic metadata stays in the EU.</p>
    <div>
      <h3>Logs</h3>
      <a href="#logs">
        
      </a>
    </div>
    <p>Cloudflare’s logs provide our customers with visibility into their network. This past year, we’ve expanded logging for more of our products, and given customers more control over where they can send their logs.</p><p>Recept expansions to logs include Firewall Events, Gateway, Spectrum. The most recent is Audit logs.</p><p>We’ve added the option for customers to store their logs on any platform with an S3-compatible API and partnered with major analytics providers to create integrations. This opened the doors for a lot of our customers to directly integrate with their log destinations of choice. Read more about the new products and destinations we support <a href="/logpush-ui-update/">here</a>. This week we announced that we’re building support for another log storage destination - <a href="/store-your-cloudflare-logs-on-r2/">R2</a>!</p>
    <div>
      <h3>The Dogfood Advantage</h3>
      <a href="#the-dogfood-advantage">
        
      </a>
    </div>
    <p>Whenever the opportunity arises, any products that we create for our customers, we’re first in line to use ourselves. It keeps us honest — if there are gaps in our solution, we’re going to have our own CIO, CISO, or engineering teams breathing down our neck!</p><p>Our public facing sites (including the blog that you’re reading this on) are secured with Cloudflare. We’re just as excited about the additional security provided by Zone Scoped Roles, as our customers are! Our security and IT organizations have adopted Terraform in order to manage the security and access control of our internal applications at scale, while giving developers the ability to self-serve request changes. Cloudflare’s security team also uses logs from our services behind Cloudflare to monitor and detect malicious behavior.</p><p>By doing things just like our customers do, we build empathy for the same kinds of problems our customers may face using our services. We continue to focus on not only innovating to solve unique problems for our customers, but also taking steps to build products that make our platform a better overall experience to use.</p> ]]></content:encoded>
            <category><![CDATA[CIO Week]]></category>
            <guid isPermaLink="false">6Dsg4Shdnvkd4X6nwMT10e</guid>
            <dc:creator>Garrett Galow</dc:creator>
            <dc:creator>Tanushree Sharma</dc:creator>
        </item>
        <item>
            <title><![CDATA[Dark Mode for the Cloudflare Dashboard]]></title>
            <link>https://blog.cloudflare.com/dark-mode/</link>
            <pubDate>Wed, 29 Sep 2021 12:59:34 GMT</pubDate>
            <description><![CDATA[ Dark mode is now available for the Cloudflare Dashboard in beta! From your user profile, you can configure the Cloudflare Dashboard in light mode, dark mode, or match it to your system settings. ]]></description>
            <content:encoded><![CDATA[ 
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/61QiOeplrC8eEpodCYr3Vm/db254c79029a092fa9e18903825f65f1/image1-42.png" />
            
            </figure><p>Today, dark mode is available for the Cloudflare Dashboard in beta! From your <a href="https://dash.cloudflare.com/profile">user profile</a>, you can configure the Cloudflare Dashboard in light mode, dark mode, or match it to your system settings.</p><p>For those unfamiliar, dark mode, or light on dark color schemes, uses light text on dark backgrounds instead of the typical dark text on light (usually white) backgrounds. In low-light environments, this can help reduce eyestrain and actually reduce power consumption on OLED screens. For many though, dark mode is simply a preference supported widely by applications and devices.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/58dMu82Wo7DpdqOHsoh66s/15cc1b33d43d29b2d5579751676b81a6/image13-6.png" />
            
            </figure><p>Side by side comparing the Cloudflare dashboard in dark mode and in light mode</p>
    <div>
      <h3>How to enable dark mode</h3>
      <a href="#how-to-enable-dark-mode">
        
      </a>
    </div>
    <ol><li><p>Log into Cloudflare.</p></li><li><p>Go to your <a href="https://dash.cloudflare.com/profile">user profile</a>.</p></li><li><p>Under <b>Appearance</b>, select an option: <i>Light</i>, <i>Dark</i>, or <i>Use system setting</i>. For the time being, your choice is saved into local storage.</p></li></ol>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1k9oNOhJL3UoE6f9bBgilf/04cbb0f7e715ad2fd5d21f659f839c55/image11-6.png" />
            
            </figure><p>The appearance card in the dashboard for modifying color themes</p><p>There are many primers and how-tos on implementing dark mode, and you can find articles talking about the general complications of implementing a dark mode including <a href="https://www.reddit.com/r/explainlikeimfive/comments/hq2s0z/eli5_why_did_it_take_so_much_time_to_introduce/">this straightforward explanation</a>. Instead, we will talk about what enabled us to be able to implement dark mode in only a matter of weeks.</p>
    <div>
      <h3>Cloudflare’s Design System - Our Secret Weapon</h3>
      <a href="#cloudflares-design-system-our-secret-weapon">
        
      </a>
    </div>
    <p>Before getting into the specifics of how we implemented dark mode, it helps to understand the system that underpins all product design and UI work at Cloudflare - the Cloudflare Design System.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2o0p4aO6GndFww4DkORffk/ff5c862d0f14a57b2c8e33d6e7ab8022/image6-22.png" />
            
            </figure><p>The six pillars of the design system: logo, typography, color, layout, icons, videos</p><p>Cloudflare’s Design System defines and documents the interface elements and patterns used to build products at Cloudflare. The system can be used to efficiently build consistent experiences for Cloudflare customers. In practice, the Design System defines primitives like typography, color, layout, and icons in a clear and standard fashion. What this means is that anytime a new interface is designed, or new UI code is written, an easily referenceable, highly detailed set of documentation is available to ensure that the work matches previous work. This increases productivity, especially for new employees, and prevents repetitious discussions about style choices and interaction design.</p><p>Built on top of these design primitives, we also have our own component library. This is a set of ready to use components that designers and engineers can combine to form the products our customers use every day. They adhere to the design system, are battle tested in terms of code quality, and enhance the user experience by providing consistent implementations of common UI components. Any button, table, or chart you see looks and works the same because it <i>is</i> the same underlying code with the relevant data changed for the specific use case.</p><p>So, what does all of this have to do with dark mode? Everything, it turns out. Due to the widespread adoption of the design system across the dashboard, changing a set of variables like background color and text color in a specific way and seeing the change applied nearly everywhere at once becomes much easier. Let’s take a closer look at how we did that.</p>
    <div>
      <h3>Turning Out the Lights</h3>
      <a href="#turning-out-the-lights">
        
      </a>
    </div>
    <p>The use of color at Cloudflare has a well documented history. When we originally set out to build our color system, the <a href="https://color.cloudflare.design">tools we built</a> and the extensive <a href="/thinking-about-color/">research we performed</a> resulted in a ten-hue, ten-luminosity set of colors that can be used to build digital products. These colors were built to be accessible — not just in terms of internal use, but for our customers. Take our blue hue scale, for example.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3PGzm1z3tMdVi7DymNP7uP/1e38bb546fd274bc4349d946466e7e77/image10-6.png" />
            
            </figure><p>Our blue color scale, as used on the Cloudflare Dashboard. This shows color-contrast accessible text and background pairings for each step in the scale.</p><p>Each hue in our color scale contains ten colors, ordered by luminosity in ten increasing increments from low luminosity to high luminosity. This color scale allows us to filter down the choice of color from the 16,777,216 hex codes available on the web to a much simpler choice of just hue and brightness. As a result, we now have a methodology where designers know the first five steps in a scale have sufficient color contrast with white or lighter text, and the last five steps in a scale have sufficient contrast with black or darker text.</p><p>Color scales also allow us to make changes while designing in a far more fluid fashion. If a piece of text is too bright relative to its surroundings, drop down a step on the scale. If an element is too visually heavy, take a step-up. With the Design System and these color scales in place, we’ve been able to design and ship products at a rapid rate.</p><p>So, with this color system in place, how do we begin to ship a dark mode? It turns out there’s a simple solution to this, and it’s built into the JS standard library. We call <code>reverse()</code> and flip the luminosity scales.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/GUZ9MW5PKQYsaTCDWrL8n/d893975cdc0d3783366ae5ec8cc1f7ae/image12-8.png" />
            
            </figure><p>Our blue color scale after calling reverse on it. High luminosity colors are now at the start of the scale, making them contrast accessible with darker backgrounds (and vice-versa).</p><p>By performing this small change within our dashboard’s React codebase and shipping a production preview deploy, we were able to see the Cloudflare Dashboard in dark mode with a whole new set of colors in a matter of minutes.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3n0vUwjdzCS1IWjvK0487K/83aae923cb84ec67ce50ef45779e2c20/image7-9.png" />
            
            </figure><p>An early preview of the Cloudflare Dashboard after flipping our color scales.</p><p>While not perfect, this brief prototype gave us an incredibly solid baseline and validated the approach with a number of benefits.</p><p>Every product built using the Cloudflare Design System now had a dark mode theme built in for free, with no additional work required by teams.</p><p>Our color contrast principles remain sound — just as the first five colors in a scale would be accessible with light text, when flipped, the first five colors in the scale are accessible with dark text. Our scales aren’t perfectly symmetrical, but when using white and black, the principle still holds.</p><p>In a traditional approach of “inverting” colors, we face the issue of a color’s hue being changed too. When a color is broken down into its constituent hue, saturation, and luminosity values, inverting it would mean a vibrant light blue would become a dull dark orange. Our approach of just inverting the luminosity of a color means that we retain the saturation and hue of a color, meaning we retain Cloudflare’s brand aesthetic and the associated meaning of each hue (blue buttons as calls-to-action, and so on).</p><p>Of course, shipping a dark mode for a product as complex as the Cloudflare Dashboard can’t just be done in a matter of minutes.</p>
    <div>
      <h3>Not Quite Just Turning the Lights Off</h3>
      <a href="#not-quite-just-turning-the-lights-off">
        
      </a>
    </div>
    <p>Although our prototype did meet our initial requirements of facilitating the dashboard in a dark theme, some details just weren’t quite right. The data visualization and mapping libraries we use, our icons, text, and various button and link states all had to be audited and required further iterations. One of the most obvious and prominent examples was the page background color. Our prototype had simply changed the background color from white (#FFFFFF) to black (#000000). It quickly became apparent that black wasn’t appropriate. We received feedback that it was “too intense” and “harsh.” We instead opted for off black, specifically what we refer to as “gray.0” or #1D1D1D. The difference may not seem noticeable, but at larger dimensions, the gray background is much less distracting.</p><p>Here is what it looks like in our design system:</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/53o6OTIT1cBmThMDNR0aXP/43f973ef4ab2ebbe615ec3e86b0bc7f0/image9-7.png" />
            
            </figure><p>Black background color contrast for white text</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3083uB7mi7KPoGzbGldGJY/ba3a68d98618794e1117428f2c9aee7d/image8-8.png" />
            
            </figure><p>Gray background color contrast for white text</p><p>And here is a more realistic example:</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/S5q4EXp6VFsU65wupcmwG/ba61887437a4a331b18d3a7a7afb6df7/image4-27.png" />
            
            </figure><p>lorem ipsum sample text on black background and on gray background</p><p>The numbers at the end of each row represent the contrast of the text color on the background. According to the Web Content Accessibility Guidelines (<a href="https://www.w3.org/WAI/standards-guidelines/wcag/">WCAG</a>), the <a href="https://www.w3.org/WAI/WCAG21/Understanding/contrast-minimum.html">standard contrast ratio for text</a> should be at least 4.5:1. In our case, while both of the above examples exceed the standard, the gray background ends up being less harsh to use across an entire application. This is not the case with light mode as dark text on white (#FFFFFF) background works well.</p><p>Our technique during the prototyping stage involved flipping our color scale; however, we additionally created a tool to let us replace any color within the scale arbitrarily. As the dashboard is made up of charts, icons, links, shadows, buttons and certainly other components, we needed to be able to see how they reacted in their various possible states. Importantly, we also wanted to improve the accessibility of these components and pay particular attention to color contrast.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/7DN7Nzw7yW5WKtQXWpfej9/fabb6d2b18a3ac4aa438a5048a765b75/image5-24.png" />
            
            </figure><p>Color picker tool screenshot showing a color scale</p><p>For example, a button is made up of four distinct states:</p><ol><li><p>Default</p></li><li><p>Focus</p></li><li><p>Hover</p></li><li><p>Active</p></li></ol>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3JApmRD2XeF5fhAzjaGCdn/ef0764d345c51fbfea035f637317eb02/image2-44.png" />
            
            </figure><p>Example showing the various colors for states of buttons in light and dark mode</p><p>We wanted to ensure that each of these states would be at least compliant with the AA accessibility standards according to the WCAG. Using a combination of our design systems documentation and a prioritized list of components and pages based on occurrence and visits, we meticulously reviewed each state of our components to ensure their compliance.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1SoATB16O1z2em0u7nfoUq/94a29e459c22bf049d53dfb370a7f730/image3-34.png" />
            
            </figure><p>Side by side comparison of the navbar in light and dark modes</p><p>The navigation bar used to select between the different applications was a component we wanted to treat differently compared to light mode. In light mode, the app icons are a solid blue with an outline of the icon; it’s a distinct look and certainly one that grabs your attention. However, for dark mode, the consensus was that it was too bright and distracting for the overall desired experience. We wanted the overall aesthetic of dark mode to be subtle, but it’s important to not conflate aesthetic with poor usability. With that in mind, we made the decision for the navigation bar to use outlines around each icon, instead of being filled in. Only the selected application has a filled state. By using outlines, we are able to create sufficient contrast between the current active application and the rest. Additionally, this provided a visually distinct way to present hover states, by displaying a filled state.</p><p>After applying the same methodology as described to other components like charts, icons, and links, we end up with a nicely tailored experience without requiring a substantial overhaul of our codebase. For any new UI that teams at Cloudflare build going forward, they will not have to worry about extra work to support dark mode. This means we get an improved customer experience without any impact to our long term ability to keep delivering amazing new capabilities — that’s a win-win!</p>
    <div>
      <h3>Welcome to the Dark Side</h3>
      <a href="#welcome-to-the-dark-side">
        
      </a>
    </div>
    <p>We know many of you have been asking for this, and we are excited to bring dark mode to all. Without the investment into our design system by many folks at Cloudflare, dark mode would not have seen the light of day. You can enable dark mode on the <b>Appearance</b> card in your <a href="https://dash.cloudflare.com/profile">user profile</a>. You can give feedback to shape the future of the dark theme with the feedback form in the card.</p><p>If you find these types of problems interesting, come help us tackle them! We are hiring across <a href="https://boards.greenhouse.io/cloudflare/jobs/3120477?gh_jid=3120477">product</a>, <a href="https://boards.greenhouse.io/cloudflare/jobs/3421232?gh_jid=3421232`">design</a>, and <a href="https://boards.greenhouse.io/cloudflare/jobs/3192227?gh_jid=3192227">engineering</a>!</p> ]]></content:encoded>
            <category><![CDATA[Product News]]></category>
            <category><![CDATA[Birthday Week]]></category>
            <category><![CDATA[Dashboard]]></category>
            <guid isPermaLink="false">4uk8qSO6sWdJa2f9qzpwki</guid>
            <dc:creator>Garrett Galow</dc:creator>
            <dc:creator>Syeef Karim</dc:creator>
            <dc:creator>Harley Turan</dc:creator>
        </item>
        <item>
            <title><![CDATA[Cloudflare’s Partnership with HashiCorp and Bootstrapping Terraform with Cf-Terraforming]]></title>
            <link>https://blog.cloudflare.com/cloudflares-partnership-with-hashicorp-and-bootstrapping-terraform-with-cf-terraforming/</link>
            <pubDate>Sat, 17 Apr 2021 13:00:00 GMT</pubDate>
            <description><![CDATA[ Learn more about Cloudflare and Hashicorp’s partnership and about our new release for our Terraform bootstrapping tool - cf-terraforming. ]]></description>
            <content:encoded><![CDATA[ <p></p><p>Cloudflare and HashiCorp have been technology partners since 2018, and in that time Cloudflare’s integration with HashiCorp’s technology has deepened, especially with <a href="https://www.terraform.io/">Terraform</a>, HashiCorp’s infrastructure-as-code product. Today we are announcing a major update to our Terraform bootstrapping tool, <a href="https://github.com/cloudflare/cf-terraforming">cf-terraforming</a>. In this blog, I recap the history of our partnership, the <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs?utm_source=WEBSITE&amp;utm_medium=CLOUDFLARE&amp;utm_offer=ARTICLE_PAGE&amp;utm_content=BLOG">HashiCorp Terraform Verified Provider for Cloudflare</a>, and how getting started with Terraform for Cloudflare developers is easier than ever before with the new version of cf-terraforming.</p>
    <div>
      <h2>Cloudflare and HashiCorp</h2>
      <a href="#cloudflare-and-hashicorp">
        
      </a>
    </div>
    <p>Members of the open source community wrote and supported the first version of Cloudflare's Terraform provider. Eventually our customers began to bring up Terraform in conversations more often. Because of customer demand, we started supporting and developing the Terraform provider ourselves. You can read the initial v1.0 announcement for the provider <a href="/getting-started-with-terraform-and-cloudflare-part-1/">here</a>. Soon after, Cloudflare’s Terraform provider became ‘verified’ and we began working with HashiCorp to provide a high quality experience for developers.</p><p>HashiCorp Terraform allows developers to control their infrastructure-as-code through a standard configuration language, HashiCorp Configuration Language (HCL). It works across a myriad of different types of infrastructure including cloud service providers, containers, virtual machines, bare metal, etc. Terraform makes it easy for developers to follow best practices when interacting with SaaS, PaaS, and other service provider APIs that set up infrastructure. Like developers already do with software code, they can store infrastructure configuration as code in git, manage changes through code reviews, and track versions and commit history over time. Terraform also makes it easier to roll back changes if developers discover issues after a deployment.</p><blockquote><p><i>Our developers love the power of Cloudflare + Terraform for infrastructure provisioning. IT operations teams want a platform that provides complete visibility and control. IT teams want a platform that is easy to use, does not have a steep learning curve, and provides levers to control resources much better. Cloudflare + Terraform platform provides just that.</i><b>– Dmitry Zadorojnii, Chief Technology Officer, Autodoc GmbH</b></p></blockquote><p>Since the 1.0 release of Cloudflare’s Terraform provider, Cloudflare has continued to build out the capabilities exposed in the provider while HashiCorp has expanded its ecosystem by developing additional features like the <a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs">Terraform Registry</a>. This helps developers find documentation on Cloudflare’s Terraform provider or any others. Terraform itself has also matured greatly–Terraform’s v0.12 release had many changes, outlined <a href="https://www.hashicorp.com/resources/a-2nd-tour-of-terraform-0-12">here</a>.</p><blockquote><p><i>“Leveraging the power of Terraform, you can codify your Cloudflare configuration. Codification enables version control and automation, increasing productivity and reducing human error. We are pleased to have Cloudflare as a technology partner and look forward to our ongoing collaboration.”</i><b>– Asvin Ramesh, Director, Technology Alliances, HashiCorp</b></p></blockquote>
    <div>
      <h3>Getting started with Cloudflare’s Terraform Provider</h3>
      <a href="#getting-started-with-cloudflares-terraform-provider">
        
      </a>
    </div>
    <p>Here are some great resources for developers looking to better understand how to get started using Terraform with Cloudflare:</p><ul><li><p><a href="https://developers.cloudflare.com/terraform/">Cloudflare’s Developer Docs for Terraform</a></p></li><li><p><a href="https://learn.hashicorp.com/tutorials/terraform/cloudflare-static-website?utm_source=WEBSITE&amp;utm_medium=CLOUDFLARE&amp;utm_offer=ARTICLE_PAGE&amp;utm_content=BLOG">HashiCorp Tutorial: Host a Static Website with S3 and Cloudflare</a></p></li><li><p><a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs?utm_source=WEBSITE&amp;utm_medium=CLOUDFLARE&amp;utm_offer=ARTICLE_PAGE&amp;utm_content=BLOG">Cloudflare Terraform Provider Documentation</a></p></li><li><p><a href="https://github.com/cloudflare/terraform-provider-cloudflare">Github repo for Cloudflare’s Terraform Provider</a></p></li></ul>
    <div>
      <h3>Bootstrapping Terraform configuration with Cf-Terraforming</h3>
      <a href="#bootstrapping-terraform-configuration-with-cf-terraforming">
        
      </a>
    </div>
    <p>We released the first version of <a href="https://github.com/cloudflare/cf-terraforming">cf-terraforming</a> in early 2019 in this <a href="/introducing-cf-terraform/">blog post</a>. Since then we learned a few lessons about building and maintaining such a tool. In this section I’ll recap why we built such a tool in the first place, lessons learned over the last two years, and what is new and improved with the version we are launching today.</p>
    <div>
      <h3>Why <code>terraform-ing</code> and why would a developer need this tool?</h3>
      <a href="#why-terraform-ing-and-why-would-a-developer-need-this-tool">
        
      </a>
    </div>
    <p>The name for the cf-terraforming library comes from another tool created by dtan4 on github: <a href="https://github.com/dtan4/terraforming">https://github.com/dtan4/terraforming</a>. The original tool allowed users to generate <a href="https://www.terraform.io/docs/language/files/index.html">tfconfig</a> and <a href="https://www.terraform.io/docs/language/state/index.html">tfstate</a> files for existing AWS resources. This made it much easier for existing AWS customers to begin using Terraform. Terraform generally expects to be authoritative about the configuration it manages. Effectively, it expects that you only make changes to that config through Terraform and not anywhere else, like an <a href="https://www.cloudflare.com/learning/security/api/what-is-an-api/">API</a> or a dashboard. If you were an existing customer of AWS (or Cloudflare) and already had everything configured via API or a UI, this posed a challenge: How do I quickly and correctly get all of my existing config into Terraform so that it can be the authoritative source of truth? For AWS resources, before dtan4’s terraforming you had to manually write the tfconfig for every object and the run import commands to generate the corresponding tfstate. For sizable deployments, this could be nigh impossible.</p><p>cf-terraforming served to solve the same problem for Cloudflare services. I had many conversations with customers who had been using Cloudflare for years and who were interested in migrating control of their Cloudflare configuration to Terraform. Cf-terraforming gave them a way to quickly convert all of their existing Cloudflare usage into tfconfig and tfstate.</p><blockquote><p><a href="/introducing-cf-terraform/"><i>cf-terraforming</i></a><i> was one of the enabling technologies that we used to bootstrap Cloudflare into our Terraform Git-ops workflow. We had thousands of records to port, import, and manage, and doing this by hand would have been an arduous and error-prone task. Using cf-terraforming to generate our initial set of resources allowed our engineers to submit Cloudflare changes, enabling our product engineers to be infrastructure operators.</i>– <b>Sean Chittenden, Infrastructure, DoorDash</b></p></blockquote>
    <div>
      <h3>What we have learned</h3>
      <a href="#what-we-have-learned">
        
      </a>
    </div>
    <p>After having cf-terraforming available for some time, we’ve learned quite a bit about the challenges in managing such a tool.</p>
    <div>
      <h4>Duplication of effort when resources change</h4>
      <a href="#duplication-of-effort-when-resources-change">
        
      </a>
    </div>
    <p>When Cloudflare releases new services or features today, that typically means new or incremental changes to Cloudflare’s APIs. This in turns means updates to our Terraform provider. Since Terraform is a golang program, before we can update our provider we have to first update the <a href="https://github.com/cloudflare/cloudflare-go">cloudflare-go</a> library. Depending on the change, this can be a couple lines in each repo or extensive changes to both. Once we launched cf-terraforming, we now had a third library that needed synchronous changes alongside the provider and go library. Missing a change meant that if someone tried to use cf-terraforming, they may have incomplete config or state, which would not work.</p>
    <div>
      <h4>Impact of changes to Terraform for the tool</h4>
      <a href="#impact-of-changes-to-terraform-for-the-tool">
        
      </a>
    </div>
    <p>Not only did our own API changes create additional work, but changes to Terraform itself could mean changes for cf-terraforming. The Terraform 0.12 update was a massive update that required a lot of careful testing and coordination with our provider. It also meant changes in HCL and in provider interactions that cf-terraforming had to account for. Such a massive one-time hit was very difficult to account for, and we’ve struggled to ensure compatibility.</p>
    <div>
      <h4>TF State management</h4>
      <a href="#tf-state-management">
        
      </a>
    </div>
    <p>The ability to have cf-terraforming generate a tfstate file was both incredibly important and also experimental. In general a developer never really needs to concern themselves with what is in the tfstate file but needs to know it contains the actual state of those resources such that references in the config can be resolved and managed correctly. We opened up that black box, which meant that we were involved in state file implementation details that we ultimately shouldn’t be.</p><p>Given these lessons, we looked at how we could update cf-terraforming to alleviate these problems and provide a better tool for both customers and ourselves. After some prototyping to validate our ideas, we came up with a new model that has been productized and is now available for customers.</p>
    <div>
      <h3>What’s new in cf-terraforming</h3>
      <a href="#whats-new-in-cf-terraforming">
        
      </a>
    </div>
    <p>Today we are launching a new version of cf-terraforming that improves upon our previous work. This new version makes it easier for us to support new resources or changes to existing resources and simplifies the workflow for developers looking to bootstrap their Cloudflare Terraform configuration.</p>
    <div>
      <h3>Simplified management</h3>
      <a href="#simplified-management">
        
      </a>
    </div>
    <p>Instead of hand crafting how to generate both the tfconfig and tfstate for each of the 48 or so resources supported in the Terraform provider, we now leverage Terraform’s capabilities to do more auto generation of what’s needed for similar resource types. HashiCorp has a great CLI tool called <a href="https://github.com/hashicorp/terraform-exec">terraform-exec</a> that provides powerful out-of-the-box capabilities we can take advantage of. Using terraform-exec we get access to `terraform providers schema -json`, which gives us the json schema of our provider. We use this to auto generate the fields we need to populate from the API. In many cases the API response fields map one to one with the json schema, which allows us to automatically populate the tfconfig. In other cases some small tweaks are necessary, which still saves a lot of time to initially support the resource and lowers the burden for future changes. Through this method, if the terraform provider changes for any reason, we can build new versions of cf-terraforming that will fetch the new schema from terraform-exec versus us having to make a lot of manual code changes to the config generation.</p><p>For tfstate, we simplify our approach by outputting the full set of <a href="https://www.terraform.io/docs/cli/import/index.html">terraform import</a> calls that would need to be run for those resources instead of attempting to generate the tfstate definition itself. This removes virtually any need for future library changes since the import commands do not change if Cloudflare’s API or provider changes.</p>
    <div>
      <h3>How to use the new cf-terraforming</h3>
      <a href="#how-to-use-the-new-cf-terraforming">
        
      </a>
    </div>
    <p>With that, let’s look at the new cf-terraforming in action. For this walkthrough let’s assume we have an existing zone on Cloudflare with DNS records and firewall rules configured. We want to start managing this zone in Terraform, but we don’t want to have to define all of our configuration by hand.</p><p>Our goal is to have a ".tf" file with the DNS records resources and firewall rules along with filter resources AND for Terraform to be aware of the equivalent state for those resources. Our inputs are the zone we already have created in Cloudflare, and our tool is the cf-terraforming library. If you are following along at home, you will need <a href="https://learn.hashicorp.com/tutorials/terraform/install-cli">terraform installed</a> and at least <a href="https://golang.org/doc/install">Go v1.12.x installed</a>.</p>
    <div>
      <h4>Getting the environment setup</h4>
      <a href="#getting-the-environment-setup">
        
      </a>
    </div>
    <p>Before we can use cf-terraforming or the provider, we need an API token. I’ll briefly go through the steps here, but for a more in-depth walkthrough see the <a href="https://developers.cloudflare.com/api/tokens/create">API developer docs</a>. On the Cloudflare dashboard we generate an API token <a href="https://dash.cloudflare.com/profile/api-tokens">here</a> with the following setup:</p><p><b>Permissions</b>Zone:DNS:ReadZone:Firewall Services:Read</p><p><b>Zone Resources:</b>garrettgalow.party (my zone, but this should be your own)</p><p><b>TTL</b>Valid until: 2021-03-30 00:00:00Z</p><p>Note: I set an expiration date on the token so that when I inevitably forget about this token, it will expire and reduce the risk of exposure in the future. This is optional, but it’s a good practice when creating tokens you only need for a short period of time especially if they have edit access.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/QhxR9kePwOQ8nKV4XmBBS/d30c2ea051f799f4fbb38467aa6da00c/cf-tf_token_border-1.png" />
            
            </figure><p>API Token summary from the Cloudflare Dashboard</p><p>Now we set the API Token we created as an environment variable so that both Terraform and cf-terraforming can access it for any commands (and so I don’t have to remove it from code examples).</p>
            <pre><code>$export CLOUDFLARE_API_TOKEN=&lt;token_secret&gt;</code></pre>
            <p>Terraform requires us to have a folder to hold our Terraform configuration and state. For that we create a folder for our use case and create a <code>cloudflare.tf</code> config file with a provider definition for Cloudflare so Terraform knows we will be using the Cloudflare provider.</p>
            <pre><code>mkdir terraforming_test
cd terraforming_test
cat &gt; cloudflare.tf &lt;&lt;'EOF'
terraform {
    required_providers {
        cloudflare = {
            source = "cloudflare/cloudflare"
        }	
    }
}

provider "cloudflare" {
# api_token  = ""  ## Commented out as we are using an environment var
}
EOF</code></pre>
            <p>Here is the content of our <code>cloudflare.tf</code> file if you would rather copy and paste it into your text editor of choice:</p>
            <pre><code>terraform {
    required_providers {
        cloudflare = {
            source = "cloudflare/cloudflare"
        }	
    }
}

provider "cloudflare" {
# api_token  = ""  ## Commented out as we are using an environment var
}</code></pre>
            <p>We call <code>terraform init</code> to ensure Terraform is fully initialized and has the Cloudflare provider installed. At the time of writing this blog post, this is what <code>terraform -v</code> gives me for version info. We recommend that you use the latest versions of both Terraform and the Cloudflare provider.</p>
            <pre><code>$ terraform -v
Terraform v0.14.10
+ provider registry.terraform.io/cloudflare/cloudflare v2.19.2</code></pre>
            <p>And finally we install cf-terraforming with the following command:</p>
            <pre><code>$ GO111MODULE=on go get -u github.com/cloudflare/cf-terraforming/...</code></pre>
            <p>If you’re using <a href="https://brew.sh/">Homebrew</a> on MacOS, this can be simplified to:</p>
            <pre><code>$ brew tap cloudflare/cloudflare
$ brew install --cask cloudflare/cloudflare/cf-terraforming</code></pre>
            
    <div>
      <h4>Using cf-terraforming to generate Terraform configuration</h4>
      <a href="#using-cf-terraforming-to-generate-terraform-configuration">
        
      </a>
    </div>
    <p>We are now ready to start generating a Terraform config. To begin, we run cf-terraforming to generate the first blocks of config for the DNS record resources and append it to the <code>cloudflare.tf</code> file we previously created.</p>
            <pre><code>cf-terraforming generate --resource-type cloudflare_record --zone &lt;zone_id&gt; &gt;&gt; cloudflare.tf</code></pre>
            <p>Breaking this command down:</p><p><code>generate</code> is the command that will produce a valid HCL config of resources</p><p><code>--resource-type</code> specifies the Terraform resource name that we want to generate an HCL config for. You can only generate configuration for one resource at a time. In this example we are using <code>cloudflare_record</code></p><p><code>--zone</code> specifies the Cloudflare zone ID we wish to fetch all the DNS records for so cf-terraforming can create the appropriate API calls</p><p>Example:</p>
            <pre><code>$ cf-terraforming generate --resource-type cloudflare_record --zone 9c2f972575d986b99fa03c7bbfaab414 &gt;&gt; cloudflare.tf
$</code></pre>
            <p>Success will return with no output to console. If you want to see the output before adding it to the config file, run the command without <code>&gt;&gt; cloudflare.tf</code> and it will output to console.</p><p>Here is the partial output in my case, if it is not appended to the config file:</p>
            <pre><code>$ cf-terraforming generate --resource-type cloudflare_record --zone 9c2f972575d986b99fa03c7bbfaab414
resource "cloudflare_record" "terraform_managed_resource_db185030f44e358e1c2162a9ecda7253" {
name = "api"
proxied = true
ttl = 1
type = "A"
value = "x.x.x.x"
zone_id = "9c2f972575d986b99fa03c7bbfaab414"
}
resource "cloudflare_record" "terraform_managed_resource_e908d014ebef5011d5981b3ba961a011" {
...</code></pre>
            <p>The output resources are given standardized names of “terraform_managed_resource_&lt;resource_id&gt;”. Because the resource id is included in the name, the object names between the config we just exported and the state we will import will always be consistent. This is necessary to ensure Terraform knows which config belongs to which state.</p><p>After generating the DNS record resources, we now do the same for both firewall rules and filters.</p>
            <pre><code>cf-terraforming generate --resource-type cloudflare_firewall_rule --zone &lt;zone_id&gt; &gt;&gt; cloudflare.tf
cf-terraforming generate --resource-type cloudflare_filter --zone &lt;zone_id&gt; &gt;&gt; cloudflare.tf</code></pre>
            <p>Example:</p>
            <pre><code>$ cf-terraforming generate --resource-type cloudflare_firewall_rule --zone 9c2f972575d986b99fa03c7bbfaab414 &gt;&gt; cloudflare.tf
$ cf-terraforming generate --resource-type cloudflare_filter --zone 9c2f972575d986b99fa03c7bbfaab414 &gt;&gt; cloudflare.tf
$</code></pre>
            
    <div>
      <h4>Using cf-terraforming to import Terraform state</h4>
      <a href="#using-cf-terraforming-to-import-terraform-state">
        
      </a>
    </div>
    <p>Before we can ask Terraform to verify the config, we need to import the state so that Terraform does not attempt to create new objects but instead reuses the existing objects we already have in Cloudflare.</p><p>Similar to what we did with the generate command, we use the import command to generate <code>terraform import</code> commands.</p>
            <pre><code>cf-terraforming import --resource-type cloudflare_record --zone &lt;zone_id&gt;</code></pre>
            <p>Breaking this command down:</p><p><code>import</code> is the command that will produce a valid <code>terraform import</code> command that we can then run<code>--resource-type</code> (same as the generate command) specifies the Terraform resource name that we want to create import commands for. You can only use one resource at a time. In this example we are using <code>cloudflare_record</code><code>--zone</code> (same as the generate command) specifies the Cloudflare zone ID we wish to fetch all the DNS records for so cf-terraforming can populate the commands with the appropriate API calls</p><p>And an example with output:</p>
            <pre><code>$ cf-terraforming import --resource-type cloudflare_record --zone 9c2f972575d986b99fa03c7bbfaab414
terraform import cloudflare_record.terraform_managed_resource_db185030f44e358e1c2162a9ecda7253 9c2f972575d986b99fa03c7bbfaab414/db185030f44e358e1c2162a9ecda7253
terraform import cloudflare_record.terraform_managed_resource_e908d014ebef5011d5981b3ba961a011 9c2f972575d986b99fa03c7bbfaab414/e908d014ebef5011d5981b3ba961a011
terraform import cloudflare_record.terraform_managed_resource_3f62e6950a5e0889a14cf5b913e87699 9c2f972575d986b99fa03c7bbfaab414/3f62e6950a5e0889a14cf5b913e87699
terraform import cloudflare_record.terraform_managed_resource_47581f47852ad2ba61df90b15933903d 9c2f972575d986b99fa03c7bbfaab414/47581f47852ad2ba61df90b15933903d$</code></pre>
            <p>The output of this will be ready to use <code>terraform import</code> commands. Running the generated <code>terraform import</code> command will leverage existing Cloudflare Terraform provider functionality to import the resource state into Terraform’s <code>terraform.tfstate</code> file. This removes the tedium of pulling all the appropriate resource IDs from Cloudflare’s API and then formatting these commands one by one. The order of operations of the config then state is important as Terraform expects there to be configuration in the <code>.tf</code> file for these resources before importing the state.</p><p>Note: Be careful when you actually import these resources, though, as from that point on any subsequent Terraform actions like plan or apply will expect this resource to be there. Removing the state is possible but requires manually editing the <code>terraform.tfstate</code> file. Terraform does keep a backup locally in case you make a mistake though.</p><p>Now we actually run these <code>terraform import</code> commands to import the state. Below shows what that looks like for a single resource.</p>
            <pre><code>$ terraform import cloudflare_record.terraform_managed_resource_47581f47852ad2ba61df90b15933903d 9c2f972575d986b99fa03c7bbfaab414/47581f47852ad2ba61df90b15933903d
cloudflare_record.terraform_managed_resource_47581f47852ad2ba61df90b15933903d: Importing from ID "9c2f972575d986b99fa03c7bbfaab414/47581f47852ad2ba61df90b15933903d"...
cloudflare_record.terraform_managed_resource_47581f47852ad2ba61df90b15933903d: Import prepared!
Prepared cloudflare_record for import
cloudflare_record.terraform_managed_resource_47581f47852ad2ba61df90b15933903d: Refreshing state... [id=47581f47852ad2ba61df90b15933903d]
Import successful!
The resources that were imported are shown above. These resources are now in
your Terraform state and will henceforth be managed by Terraform.</code></pre>
            <p>With <code>cloudflare_record</code> imported, now we do the same for the firewall_rules and filters.</p>
            <pre><code>cf-terraforming import --resource-type cloudflare_firewall_rule --zone &lt;zone_id&gt;
cf-terraforming import --resource-type cloudflare_filter --zone &lt;zone_id&gt;</code></pre>
            <p>Shown with output:</p>
            <pre><code>$ cf-terraforming import --resource-type cloudflare_firewall_rule --zone 9c2f972575d986b99fa03c7bbfaab414
terraform import cloudflare_firewall_rule.terraform_managed_resource_0de909f3229341a2b8214737903f2caf 9c2f972575d986b99fa03c7bbfaab414/0de909f3229341a2b8214737903f2caf
terraform import cloudflare_firewall_rule.terraform_managed_resource_0c722eb85e1c47dcac83b5824bad4a7c 9c2f972575d986b99fa03c7bbfaab414/0c722eb85e1c47dcac83b5824bad4a7c
$ cf-terraforming import --resource-type cloudflare_filter --zone 9c2f972575d986b99fa03c7bbfaab414
terraform import cloudflare_filter.terraform_managed_resource_ee048570bb874972bbb6557f7529e094 9c2f972575d986b99fa03c7bbfaab414/ee048570bb874972bbb6557f7529e094
terraform import cloudflare_filter.terraform_managed_resource_1bb6cd50e2534a64a9ec698fd841ffc5 9c2f972575d986b99fa03c7bbfaab414/1bb6cd50e2534a64a9ec698fd841ffc5
$</code></pre>
            <p>As with <code>cloudflare_record</code>, we run these <code>terraform import</code> commands to ensure all the state is successfully imported.</p>
    <div>
      <h4>Verifying everything is correct</h4>
      <a href="#verifying-everything-is-correct">
        
      </a>
    </div>
    <p>Now that we have both the configuration and state in place, we call <code>terraform plan</code> to see if Terraform can verify everything is in place. If all goes well then you will be greeted with the following “nothing to do” message:</p>
            <pre><code>No changes. Infrastructure is up-to-date.
This means that Terraform did not detect any differences between your
configuration and real physical resources that exist. As a result, no
actions need to be performed.</code></pre>
            <p>You now can begin managing these resources in Terraform. If you want to add more resources into Terraform, follow these steps for other resources. You can find which resources are supported in the <a href="https://github.com/cloudflare/cf-terraforming">README</a>. We will add additional resources over time, but if there are specific ones you are looking for, please create GitHub issues or upvote any existing ones.</p>
    <div>
      <h3>It has never been easier to get started with Cloudflare + Terraform</h3>
      <a href="#it-has-never-been-easier-to-get-started-with-cloudflare-terraform">
        
      </a>
    </div>
    <p>Whether you are an existing Cloudflare customer and have been curious about Terraform or you are looking to expand your infrastructure-as-code to include Cloudflare’s services, you have everything you need to get building with Terraform, the Cloudflare provider, and cf-terraforming. For questions, comments, or feature requests for either the <a href="https://github.com/cloudflare/terraform-provider-cloudflare">provider</a> or <a href="https://github.com/cloudflare/cf-terraforming">cf-terraforming</a>, see the respective github repos.</p> ]]></content:encoded>
            <category><![CDATA[Developer Week]]></category>
            <category><![CDATA[Developers]]></category>
            <category><![CDATA[HashiCorp]]></category>
            <category><![CDATA[Terraform]]></category>
            <guid isPermaLink="false">te8kR7mJGYwAQ5oZ6HoyE</guid>
            <dc:creator>Garrett Galow</dc:creator>
        </item>
        <item>
            <title><![CDATA[Introducing Automatic Platform Optimization, starting with WordPress]]></title>
            <link>https://blog.cloudflare.com/automatic-platform-optimizations-starting-with-wordpress/</link>
            <pubDate>Fri, 02 Oct 2020 13:00:00 GMT</pubDate>
            <description><![CDATA[ Today, we are announcing a new service to serve more than just the static content of your website with the Automatic Platform Optimization (APO) service. With this launch, we're supporting WordPress. ]]></description>
            <content:encoded><![CDATA[ 
          <figure>
          <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/7pBDoI1dESTWbQFz0Vcsa6/76dfc80f250f0dec6cfd442c2a0dae7d/Birthday-Week-OG-images_WordPress_Optimization.png" />
          </figure><p>Today, we are announcing a new service to serve more than just the static content of your website with the <a href="https://www.cloudflare.com/application-services/products/automatic-platform-optimization/">Automatic Platform Optimization (APO)</a> service. With this launch, we are supporting WordPress, the most popular website hosting solution serving 38% of all websites. Our testing, as detailed below, showed a 72% reduction in Time to First Byte (TTFB), 23% reduction to <a href="https://web.dev/fcp/">First Contentful Paint</a>, and 13% reduction in <a href="https://web.dev/speed-index/">Speed Index</a> for desktop users at the 90th percentile, by serving nearly all of your website’s content from Cloudflare’s network. This means visitors to your website see not only the first content sooner but all content more quickly.</p><p>With Automatic Platform Optimization for WordPress, your customers won’t suffer any slowness caused by common issues like shared hosting congestion, slow database lookups, or misbehaving plugins. This service is now available for anyone using WordPress.</p>
    <div>
      <h3>Automatic Platform Optimization Pricing</h3>
      <a href="#automatic-platform-optimization-pricing">
        
      </a>
    </div>
    <p>APO for WordPress costs $5/month for customers on our Free plan and is included, at no additional cost, in our Professional, Business, and Enterprise <a href="https://www.cloudflare.com/plans/">plans</a>. No usage fees, no surprises, <i>just speed</i>.</p>
    <div>
      <h3>How to get started</h3>
      <a href="#how-to-get-started">
        
      </a>
    </div>
    <p>The easiest way to get started with APO is from your WordPress admin console.</p><p><b>1</b>. First, install the <a href="https://wordpress.org/plugins/cloudflare/">Cloudflare WordPress plugin</a> on your WordPress website or update to the latest version (3.8.2 or higher).
<b>2</b>. Authenticate the plugin (<a href="https://wordpress.org/plugins/cloudflare/#installation">steps here</a>) to talk to Cloudflare if you have not already done that.
<b>3</b>. From the Home screen of the Cloudflare section, turn on Automatic Platform Optimization.

Free customers will first be directed to the <a href="https://dash.cloudflare.com/?to=/:account/:zone/speed/optimization">Cloudflare Dashboard</a> to purchase the service.</p>
    <div>
      <h3>Why We Built This</h3>
      <a href="#why-we-built-this">
        
      </a>
    </div>
    <p>At Cloudflare, we jump at the opportunity to make hard problems for our customers disappear with the click of a button. Running a consistently fast website is challenging. Many businesses don’t have the time nor money to spend on complicated and expensive performance solutions for their site. Even if they do, it can be extremely costly to pay for specialized attention to ensure you get the best performance possible. Having a fast website doesn’t have to be complicated, though. <b>The closer your content is to your customers, the better your site will perform.</b> Static content caching does this for files like images, CSS and JavaScript, but that is only part of the equation. Dynamic content is still fetched from the origin incurring costly round trips and additional processing time. For more info on dynamic versus static content, see our <a href="https://www.cloudflare.com/learning/cdn/caching-static-and-dynamic-content/">learning center</a>.</p><p>WordPress is one of the most open platforms in the world, but that means you are always at risk of incurring performance penalties because of plugins or other sources that, while necessary, may be hard to pinpoint and resolve. With the Automatic Platform Optimization service, we put your website into our network that is within 10 milliseconds of 99% of the Internet-connected population in the developed world, all without having to change your existing <a href="https://www.cloudflare.com/developer-platform/solutions/hosting/">hosting</a> provider. This means that for most requests your customers won’t even need to go to your origin, reducing many costly round trips and server processing time. These optimizations run on our edge network, so they also will not impact render or interactivity since no additional JavaScript is run on the client.</p>
    <div>
      <h3>How We Measure Web Performance</h3>
      <a href="#how-we-measure-web-performance">
        
      </a>
    </div>
    <p>Evaluating performance of a website is difficult. There are many different metrics you can track and it is not always obvious which metrics most meaningfully represent a user’s experience. As discussed when we <a href="https://blog.cloudflare.com/new-speed-page/">blogged</a> about our new <a href="https://dash.cloudflare.com/?to=/:account/:zone/speed">Speed page</a>, we aim to simplify this for customers by automating tests using the infrastructure of webpagetest.org, and summarizing both the results visually and numerically in one place.</p>
          <figure>
          <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1NWhWuNJ3uph9V9GZVw1aW/be579629678a74e01792f6c6c6f56330/image4-2.png" />
          </figure><p>The visualization gives you a clear idea of what customers are going to see when they come to your site, and the <i>Critical Loading Times</i> provide the most important metrics to judge your performance. On top of seeing your site’s performance, we provide a list of recommendations for ways to even further increase your performance. If you are using WordPress, then we will test your site with Automatic Platform Optimizations to estimate the benefit you will get with the service.</p>
    <div>
      <h3>The Benefits of Automatic Platform Optimization</h3>
      <a href="#the-benefits-of-automatic-platform-optimization">
        
      </a>
    </div>
    <p>We tested APO on over 500 Cloudflare customer websites that run on WordPress to understand what the performance improvements would be. The results speak for themselves:</p><p><b>Test Results</b></p>
<table><thead>
  <tr>
    <th><span>Metric</span></th>
    <th><span>Percentiles</span></th>
    <th><span>Baseline Cloudflare</span></th>
    <th><span>APO Enabled</span></th>
    <th><span>Improvement (%)</span></th>
  </tr></thead>
<tbody>
  <tr>
    <td><span>Time to First Byte (TTFB)</span></td>
    <td>90th</td>
    <td>1252 ms</td>
    <td>351 ms</td>
    <td>71.96%</td>
  </tr>
  <tr>
    <td>10th</td>
    <td>254 ms</td>
    <td>261 ms</td>
    <td>-2.76%</td>
  </tr>
  <tr>
    <td><a href="http://web.archive.org/web/20210503002739/https://web.dev/fcp/"><span>First Contentful Paint</span></a><br /><span>(FCP)</span></td>
    <td><span>90th</span></td>
    <td>2655 ms</td>
    <td>2056 ms</td>
    <td>22.55%</td>
  </tr>
  <tr>
    <td><span>10th</span></td>
    <td>894 ms</td>
    <td>783 ms</td>
    <td>12.46%</td>
  </tr>
  <tr>
    <td><a href="http://web.archive.org/web/20210503002739/https://web.dev/speed-index/"><span>Speed Index</span></a><br /><span>(SI)</span></td>
    <td><span>90th</span></td>
    <td>6428</td>
    <td>5586</td>
    <td>13.11%</td>
  </tr>
  <tr>
    <td><span>10th</span></td>
    <td>1301</td>
    <td>1242</td>
    <td>4.52%</td>
  </tr>
</tbody></table><p>Note: Results are based on test results of 505 randomly selected websites that are cached by Cloudflare. Tests were run using WebPageTest from South Carolina, USA and the following environment: Chrome, Cable connection speed.</p><p>Most importantly, with APO, a site’s TTFB is made both fast and consistent. Because we now serve the HTML from Cloudflare’s edge with 0 origin processing time, getting the first byte to the eyeball is consistently fast. Under heavy load, a WordPress origin can suffer delays in building the HTML and returning it to visitors. APO removes the variance due to load resulting in consistent TTFB &lt;400 ms.</p><p>Additionally, between faster TTFB and additional caching of third party fonts, we see performance improvements in both FCP and SI for both the fastest and slowest of the sites we tested. Some of this comes naturally from reducing the TTFB, since every millisecond you shave off of TTFB is a potential millisecond gain for other metrics. Caching additional third party fonts allows us to reduce the time it takes to fetch that content. Given fonts can often block paints due to text rendering, this improves the rate at which the page paints, and improves the Speed Index.</p><p>We asked the folks at <a href="https://kinsta.com/">Kinsta</a> to try out APO, given their expertise on WordPress, and tell us what they think. <a href="https://brianli.com/">Brian Li</a>, a Website Content Manager at Kinsta, ran a set of tests from around the world on a website hosted in Tokyo. I’ll let him explain what they did and the results:</p><blockquote><p>At Kinsta, <a href="https://kinsta.com/blog/fastest-wordpress-hosting/">WordPress performance</a> is something that’s near and dear to our hearts. So, when Cloudflare reached out about testing their new Automatic Platform Optimization (APO) service for WordPress, we were all ears.
 
This is what we did to test out the new service:</p></blockquote><ol><li><p>We set up a test site in Tokyo, Japan – one of the 24 high-performance <a href="https://kinsta.com/knowledgebase/google-cloud-data-center-locations/">data center locations</a> available for Kinsta customers.</p></li><li><p>We ran several speed tests from six different locations around the world with and without Cloudflare’s APO.</p></li></ol><blockquote><p>The results were incredible!
 
By caching <a href="https://kinsta.com/blog/wordpress-vs-static-html/">static HTML</a> on Cloudflare’s edge network, we saw a 70-300% performance increase. As expected, the testing locations furthest away from Tokyo saw the biggest reduction in <a href="https://kinsta.com/blog/ttfb/">load time</a>.
 
If your WordPress site uses a traditional <a href="https://www.cloudflare.com/learning/cdn/what-is-a-cdn/">CDN</a> that only caches CSS, JS, and images, upgrading to Cloudflare’s WordPress APO is a no-brainer and will help you stay competitive with modern Jamstack and static sites that live on the edge by default.</p></blockquote><p>Brian’s test results are summarized in this image:</p>
          <figure>
          <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6gDzHYWY75hKTwwHOoi6Xz/17e3e423683f032d12d22407bccf74a2/image1-7.png" />
          </figure><p><sub>Page Load Speeds for loading a website hosted in Tokyo from 6 locations worldwide - comparing Kinsta, Kinsta with KeyCDN, and Kinsta with Cloudflare APO.</sub></p><p>One of the clear benefits, from Kinsta’s testing of APO, is the consistency of performance for serving your site no matter where your visitors are in the world. The consistent sub-second performance shown with APO versus two or three second load times in other setups makes it clear that if you have a global customer base, APO delivers an improved experience for all visitors.</p>
    <div>
      <h3>How Automatic Platform Optimization Works</h3>
      <a href="#how-automatic-platform-optimization-works">
        
      </a>
    </div>
    <p>Automatic Platform Optimization is the result of being able to use the power of <a href="https://www.cloudflare.com/developer-platform/workers/">Cloudflare Workers</a> to intelligently cache dynamic content. By caching dynamic content, we can serve the entire website from our edge network. Think ‘static site’ but without any of the work of having to build or maintain a static site. Customers can keep managing and updating content on their website in the same way and leave the hard work for performance to us. Serving both static and dynamic content from our network results, generally, in no origin requests or origin processing time. This means all the communication occurs between the user’s device and our edge. Reducing the multitude of round trips typically required from our edge to the origin for dynamic content is what makes this service so effective. Let’s first see what it normally looks like to load a WordPress site for a visitor.</p>
          <figure>
          <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/nNaWWkM0X15Pp0jwnO0Hc/3c3b17b0325638bdb93e844654f2b92b/image3-3.png" />
          </figure><p><sub>A sequence diagram for a typical user visiting a site‌‌</sub></p><p>In a regular request flow, Cloudflare is able to cache some of the content like images, CSS, or JS, while other requests go to either the origin or a third party service in order to fetch the content. Most importantly the first request to fetch the HTML for the site needs to go to the origin which is a typical cause of long TTFB, since no other requests get made until the client can receive the HTML and parse it to make subsequent requests.</p>
          <figure>
          <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/rbLsPASTNRFCNN5E1ySpm/edc2cc24486bc03730ebf0980654c834/image2-2.png" />
          </figure><p><sub>The same site visit but with APO enabled.</sub></p><p>Once APO is enabled, all those trips to the origin are removed. TTFB benefits greatly because the first hop starts and ends at Cloudflare’s network. This also means the browser starts working on fetching and painting the webpage sooner meaning each paint event occurs earlier. Last by caching third party fonts, we remove additional requests that would need to leave Cloudflare’s network and extend the time to display text to the user. Often, websites use fonts hosted on third-party domains. While this saves bandwidth costs that would be incurred from hosting it on the origin, depending on where those fonts are hosted, it can still be a costly operation to fetch them. By rehosting the fonts and serving them from our cache, we can reduce one of the remaining costly round trips.</p><p>With APO for WordPress, you can say bye bye to database congestion or unwieldy plugins slowing down your customers’ experience. These benefits are stacked on top of our already fast <a href="https://www.cloudflare.com/learning/ssl/transport-layer-security-tls/">TLS connection times</a> and industry leading protocol support like HTTP/2 that ensure we are using the most efficient and the fastest way to connect and deliver your website to your customers.</p><p>For customers with WordPress sites that support authenticated sessions, you do not have to worry about us caching content from authenticated users and serving it to others. We bypass the cache on standard WordPress and WooCommerce cookies for authenticated users. This ensures customized content for a specific user is only visible to that user. While this has been available to customers with our Business-level service, it is now available for any WordPress customer that enables APO.</p><p>You might be wondering: “This all sounds great, but what about when I change content on my site?” Because this service works in tandem with our <a href="https://www.cloudflare.com/integrations/wordpress/">WordPress plugin</a>, we are able to understand when you make changes and ensure we quickly purge the content in Cloudflare’s edge and refresh it with the new content. With the plugin installed, we detect content changes and update our edge network worldwide with automatic cache purges. As part of this release, we have updated our WordPress plugin, so whether you use APO, you should upgrade to the latest version today. If you do not or cannot use our WordPress plugin, then APO will still provide the same performance benefits, but may serve stale content for up to 30 minutes and when the content is requested again.</p><p>This service was built on the prototype work originally blogged about <a href="https://blog.cloudflare.com/improving-html-time-to-first-byte/">here</a> and <a href="https://blog.cloudflare.com/fast-google-fonts-with-cloudflare-workers/">here</a>. For a more in depth look at the technical side of the service and how Cloudflare Workers allowed us to build the Automatic Platform Optimization service, see the <a href="https://blog.cloudflare.com/building-automatic-platform-optimization-for-wordpress-using-cloudflare-workers/">accompanying blog post</a>.</p>
    <div>
      <h3>WordPress Today, Other Platforms Coming Soon</h3>
      <a href="#wordpress-today-other-platforms-coming-soon">
        
      </a>
    </div>
    <p>While today’s announcement is focused on supporting WordPress, this is just the start. We plan to bring these same capabilities to other popular platforms used for web hosting. If you operate a platform and are interested in how we may be able to work together to improve things for all your customers, <a href="https://www.cloudflare.com/partners/">please get in touch</a>. If you are running a website, let us know what platform you want to see us bring Automatic Platform Optimization to next.</p> ]]></content:encoded>
            <category><![CDATA[Birthday Week]]></category>
            <category><![CDATA[WordPress]]></category>
            <category><![CDATA[Product News]]></category>
            <category><![CDATA[Speed & Reliability]]></category>
            <category><![CDATA[TTFB]]></category>
            <category><![CDATA[Automatic Platform Optimization]]></category>
            <guid isPermaLink="false">wrkP5f4p5fxKa7hQACHv6</guid>
            <dc:creator>Garrett Galow</dc:creator>
        </item>
        <item>
            <title><![CDATA[Announcing the General Availability of API Tokens]]></title>
            <link>https://blog.cloudflare.com/api-tokens-general-availability/</link>
            <pubDate>Fri, 30 Aug 2019 13:00:00 GMT</pubDate>
            <description><![CDATA[ Today we are announcing the general availability of API Tokens - a scalable and more secure way to interact with the Cloudflare API. As part of making a better internet, Cloudflare strives to simplify manageability of a customer’s presence at the edge.  ]]></description>
            <content:encoded><![CDATA[ <p></p>
    <div>
      <h2>APIs at Cloudflare</h2>
      <a href="#apis-at-cloudflare">
        
      </a>
    </div>
    <p>Today we are announcing the general availability of API Tokens - a scalable and more secure way to interact with the Cloudflare API. As part of making a better Internet, Cloudflare strives to simplify manageability of a customer’s presence at the edge. Part of the way we do this is by ensuring that all of our products and services are configurable by API. Customers ranging from partners to enterprises to developers want to automate management of Cloudflare. Sometimes that is done via our <a href="https://api.cloudflare.com">API directly</a>, and other times it is done via open source software we help maintain like our <a href="https://www.terraform.io/docs/providers/cloudflare/">Terraform provider</a> or <a href="https://github.com/cloudflare/cloudflare-go">Cloudflare-Go library</a>. It is critical that customers who are automating management of Cloudflare can keep their Cloudflare services as secure as possible.</p>
    <div>
      <h2>Least Privilege and Why it Matters</h2>
      <a href="#least-privilege-and-why-it-matters">
        
      </a>
    </div>
    <p>Securing software systems is hard. Limiting what a piece of software can do is a good defense to prevent mistakes or malicious actions from having greater impact than they could. The <a href="https://en.wikipedia.org/wiki/Principle_of_least_privilege">principle of least privilege</a> helps guide how much access a given system should have to perform actions. Originally formulated by Jerome Saltzer, “Every program and every privileged user of the system should operate using the least amount of privilege necessary to complete the job.” In the case of Cloudflare, many customers have various domains routing traffic leveraging many different services. If a bad actor gets unauthorized access to a system they can use whatever access that system has to cause further damage or steal additional information.</p><p>Let’s see how the capabilities of API Tokens fit into the principle of least privilege.</p>
    <div>
      <h2>About API Tokens</h2>
      <a href="#about-api-tokens">
        
      </a>
    </div>
    <p>API Tokens provide three main capabilities:</p><ol><li><p>Scoping API Tokens by Cloudflare resource</p></li><li><p>Scoping API Tokens by permission</p></li><li><p>The ability to provision multiple API Tokens</p></li></ol><p>Let’s break down each of these capabilities.</p>
    <div>
      <h3>Scoping API Tokens by Cloudflare Resource</h3>
      <a href="#scoping-api-tokens-by-cloudflare-resource">
        
      </a>
    </div>
    <p>Cloudflare separates service configuration by zone which typically equates to a domain. Additionally, some customers have multiple accounts each with many zones. It is important that when granting API access to a service it only has access to the accounts resources and zones that are pertinent for the job at hand. API Tokens can be scoped to only cover specific accounts and specific zones. One common use case is if you have a staging zone and a production zone, then an API Token can be limited to only be able to affect the staging zone and not have access to the production zone.</p>
    <div>
      <h3>Scoping API Tokens by Permission</h3>
      <a href="#scoping-api-tokens-by-permission">
        
      </a>
    </div>
    <p>Being able to scope an API Token to a specific zone is great, but in one zone there are many different services that can be configured: firewall rules, page rules, and load balancers just to name a few. If a customer has a service that should only be able to create new firewall rules in response to traffic patterns, then also allowing that service to change DNS records is a violation of least privilege. API Tokens allow you to scope each token to specific permission. Multiple permissions can be combined to create custom tokens to fit specific use cases.</p>
    <div>
      <h3>Multiple API Tokens</h3>
      <a href="#multiple-api-tokens">
        
      </a>
    </div>
    <p>If you use Cloudflare to protect and accelerate multiple services, then may be making API changes to Cloudflare from multiple locations - different servers, VMs, containers, or workers. Being able to create an API Token per service means each service is insulated to changes from another. If one API Token is leaked or needs to be rolled, there won’t be any impact to the other services’ API Tokens. Also the capabilities mentioned previously mean that each service can be scoped to exactly what actions and resources necessary. This allows customers to better realize the practice of least privilege for accessing Cloudflare by API.</p><p>Now let’s walk through how to create an API Token and use it.</p>
    <div>
      <h2>Using API Tokens</h2>
      <a href="#using-api-tokens">
        
      </a>
    </div>
    <p>To create your first API Token go to the ‘API Tokens’ section of your user profile which can be found here: <a href="https://dash.cloudflare.com/profile/api-tokens">dash.cloudflare.com/profile/api-tokens</a></p><p>1. On this page, you will find both a list of all of your API Tokens in addition to your Global API Key and Origin CA Key.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4Ip6l7IfVsHAPpEkDrCOSn/da917dc6ce86920110900fa6bb51e337/api_1_delay.gif" />
            
            </figure><p>API Tokens Getting Started - Create Token</p><p>To create your first API Token, select ‘Create Token’.</p><hr /><p>2. On the create screen there are two ways to create your token. You can create it from scratch through the ‘Custom’ option or you can start with a predefined template by selecting ‘Start with a template’.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4sx3vyxojBQ3q7nUkJKJLd/3a4ca4d900b48a9d5934c4fa2c3de503/api_2_delay.gif" />
            
            </figure><p>API Token Template Selection</p><p>For this case, we will use the ‘Edit zone DNS’ template to create an API Token that can edit a single zone’s DNS records.</p><hr /><p>3. Once the template is selected, we need to pick a zone for the API Token to be scoped to. Notice that the DNS Edit permission was already pre-selected.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1ag2dyKa9pUVFyrZfiGxDb/37e6e20b2fa2ef60ac66e6642e3f1f7c/api_3_delay.gif" />
            
            </figure><p>Specifying the zone for which the token will be able to control DNS</p><p>In this case, ‘garrettgalow.com’ is selected as the Cloudflare zone that the API Token will be able to edit DNS records for.</p><hr /><p>4. Once I select continue to summary, I’m given a chance to review my selection. In this case the resources and permissions are quite simple, but this gives you a change to make sure you are giving the API Token exactly the correct amount of privilege before creating it.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/178xLB2ZX5R9UW6M9DQMh9/430626b7538c33d71e436fb545030332/api_4_delay.gif" />
            
            </figure><p>Token Summary - confirmation</p><hr /><p>5. Once created, we are presented with the API Token. This screen is the only time you will be presented with the secret so be sure to put the secret in a safe place! Anyone with this secret can perform the granted actions on the resources specified so protect it like a password. In the below screenshot I have black boxed the secret for obvious reasons. If you happen to lose the secret, you can always regenerate it from the API Tokens table so you don’t have to configure all the permissions again.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4DDTeuB91lvnn76B4fDl19/a4b56390f88cf36fc0b98b418d61234c/api_5_success.png" />
            
            </figure><p>Token creation completion screen with the token secret</p><p>In addition to the secret itself this screen provides an example curl request that can be used to verify that the token was successfully created. It also provides an example of how the token should be used for any direct HTTP requests. With API Tokens we now follow the <a href="https://tools.ietf.org/html/rfc6750#section-2.1">RFC Authorization Bearer standard</a>. Calling that API we see a successful response telling us that the token is valid and active</p>
            <pre><code>~$ curl -X GET "https://api.cloudflare.com/client/v4/user/tokens/verify" \
&gt;      -H "Authorization: Bearer vh9awGupxxxxxxxxxxxxxxxxxxx" \
&gt;      -H "Content-Type:application/json" | jq

{
  "result": {
    "id": "ad599f2b67cdccf24a160f5dcd7bc57b",
    "status": "active"
  },
  "success": true,
  "errors": [],
  "messages": [
    {
      "code": 10000,
      "message": "This API Token is valid and active",
      "type": null
    }
  ]
}</code></pre>
            
    <div>
      <h2>What’s coming next</h2>
      <a href="#whats-coming-next">
        
      </a>
    </div>
    <p>For anyone using the Cloudflare API, we recommend moving to using API Tokens over their predecessor API Keys going forward. With this announcement, our <a href="https://www.terraform.io/docs/providers/cloudflare/">Terraform provider</a>, <a href="https://github.com/cloudflare/cloudflare-go">Cloudflare-Go library</a>, and <a href="https://github.com/cloudflare/Cloudflare-WordPress">WordPress plugin</a> are all updated for API Token compatibility. Other libraries will receive updates soon. Both API Tokens and API Keys will be supported for the time being for customers to be able to safely migrate. We have more planned capabilities for API Tokens to further safeguard how and when tokens are used, so stay tuned for future announcements!</p><p>Let us know what you think and what you'd like to see next regarding API security on the <a href="https://community.cloudflare.com">Cloudflare Community</a>.</p> ]]></content:encoded>
            <category><![CDATA[API]]></category>
            <category><![CDATA[Security]]></category>
            <category><![CDATA[Product News]]></category>
            <guid isPermaLink="false">6WUGghCqToenYBJOHUBVRS</guid>
            <dc:creator>Garrett Galow</dc:creator>
        </item>
        <item>
            <title><![CDATA[Announcing the New Cloudflare Partner Platform]]></title>
            <link>https://blog.cloudflare.com/announcing-the-new-cloudflare-partner-platform/</link>
            <pubDate>Thu, 06 Jun 2019 13:00:00 GMT</pubDate>
            <description><![CDATA[ When I first started at Cloudflare over two years ago, one of the first things I was tasked with was to help evolve our partner platform to support the changes in our service and the expanding needs of our partners and customers.  ]]></description>
            <content:encoded><![CDATA[ <p></p><p>When I first started at Cloudflare over two years ago, one of the first things I was tasked with was to help evolve our partner platform to support the changes in our service and the expanding needs of our partners and customers. Cloudflare’s existing partner platform was released in 2010. It is a testament to those who built it, that it was, and still is, in use today—but it was also clear that the landscape had substantially changed.</p><p>Since the launch of the existing partner platform, we had <a href="/introducing-multi-user-organizations-share-an-account-without-sharing-a-login/">built</a> and <a href="/expanding-multi-user-access/">expanded</a> multi-user access, and launched many new products: Argo, Load Balancing, and Cloudflare Workers, to name a few. Retrofitting the existing offering was not practical. Cloudflare needed a new partner platform that could meet the needs of partners and their customers.</p><p>As the team started to develop a new solution, we needed to find a partner who could keep us on the right path. The number of hypotheticals were infinite and we needed a first customer to ground ourselves. Lo and behold, not long after I had begun putting pen to paper, we found the perfect partner for the new platform.</p>
    <div>
      <h3>The IBM Partnership</h3>
      <a href="#the-ibm-partnership">
        
      </a>
    </div>
    <p>IBM was looking for a partner to bring various edge services to market quickly, and our suite of capabilities was what they were looking for. If you are not familiar with our partnership with IBM, you can learn a bit more about it in our <a href="/ibm-cloud-and-cloudflare/">blog post</a> and on the <a href="https://www.ibm.com/cloud/cloud-internet-services">IBM Cloud Internet Services landing page</a>. We signed the contract in November 2017, and we had to be ready to launch by IBM Think the following February. Given that IBM’s engineering team needed time to integrate with us, we were on a tight timeline to deliver.</p><p>A number of team members and I jumped on a plane and flew to Austin, Texas (Hook ‘em!) to work with IBM and determine the minimum viable product (MVP). Over kolaches (for the Czech readers at home: <a href="https://en.wikipedia.org/wiki/Klob%C3%A1sn%C3%ADk">Klobásník</a>), IBM and Cloudflare nailed down the MVP requirements. Briefly, they were as follows:</p><p>

<ol>
	<li>Full API integration to provision the building blocks of using Cloudflare.
	<ul>
    	<li>This included:
		<ol>
          	<li>Accounts: The container of resources - typically zones
			</li><li>Users: The way in which we partition access to accounts
        </li></ol>   
	</li></ul>
	</li><li>The ability to sell and provision Cloudflare’s paid services and package them in a way that made sense for IBM’s customers.
	<ul>
		<li>Our existing partner platform only supported zone plans and none of our newer offerings, such as Argo or load balancing.
		</li><li>IBM had specific requirements around how they could package and sell to customers, so our solution needed to be flexible enough to support that.
    </li></ul>
	</li><li>Ensure that what we built was re-usable.
	<ul>
        <li>Cloudflare makes it a point to solve problems for scale. While we were focused on ensuring our first partner would be successful, we knew that long term we would need to be able to scale this solution to additional partners. Nothing we built could prevent us from doing that.
    </li></ul>
</li></ol>

</p><p>Over the next couple of months, many teams at Cloudflare came together to deliver this solution at breakneck speed. Given that the midpoint of this effort happened over the holiday season, I’m personally proud of our company not sacrificing employee’s time with their friends and families in order to deliver. Even when it feels like a sprint, it is still a marathon.</p><p>During this time, the engineering team we were working with at IBM felt like another team at Cloudflare. Their ability to move quickly, integrate, and validate our work was critical to the success of the project. At THINK in February 2018, we were able to announce the Beta of IBM CIS (Cloud Internet Services) powered by Cloudflare!</p><p>Following the initial release, we continued to add functionality to further enrich the IBM CIS offering, while behind the scenes we continued our work to redefine Cloudflare’s partner platform.</p>
    <div>
      <h3>The New Partner Platform</h3>
      <a href="#the-new-partner-platform">
        
      </a>
    </div>
    <p>Over the past year we have expanded the capabilities and completed the necessary work to enable more partners to be able to use what we initially built for the IBM partnership. Out of that comes our new partner platform we are announcing today. The new partner platform allows partners of Cloudflare to sell and provision Cloudflare for their customers in a scalable fashion.</p><p>Our new partner platform is the combination of two systems designed to fulfill specific needs:</p><p>
1. Tenants: an abstraction on top of our existing accounts and users for easier management<br />
2. Subscriptions: a new way of packaging and provisioning services<br />
</p>
    <div>
      <h4>Tenants</h4>
      <a href="#tenants">
        
      </a>
    </div>
    <p>An absolute necessity for partners is the ability to provision accounts for each of their customers. Normally the only way to get a Cloudflare account is to sign up on the dashboard. We needed a way for partners to be able to create end customer accounts at their discretion to support their specific onboarding needs. This also ensures proper separation of ownership between customers and allows end customers to access the Cloudflare dashboard directly.</p><p>With the introduction of tenants, our data model now looks like the following:</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/783znc5TVg0EHBWjTKYFRS/5f686f3722f0543ec819b42de8e7a999/Screen-Shot-2019-06-05-at-3.58.15-PM-1.png" />
            
            </figure><p>Cloudflare Resource Data Model</p><p>Tenants provide partners the ability to create and manage the accounts for their customers. Each account created is a separate container of resources (zones, workers, etc) for each of customer. Users can be invited to each account as necessary for self service management, while the partner retains control of the capabilities enabled for each account. How a partner manages those capabilities brings us to the second major system that makes up the new partner platform.</p>
    <div>
      <h4>Subscriptions</h4>
      <a href="#subscriptions">
        
      </a>
    </div>
    <p>While not as obvious as the need for account provisioning, the ability to package and provision services is critical to providing differentiated offerings for partners of Cloudflare. One drawback of our old partner platform was the difficulty in ensuring new products and services were available to those partners. As Cloudflare grew, it reached the point where new paid services could not be added into the existing partner platform.</p><p>With subscriptions, this is no longer the case. What started as just a way to provision services for IBM, has now grown into the standard of how all customer services are provisioned at Cloudflare. Whether you purchase services through IBM CIS or buy Cloudflare Workers in our dashboard, behind the scenes, Subscriptions is what ensures you get exactly the right services enabled.</p><p>Enough talk, let’s show things in action!</p>
    <div>
      <h3>The Partner Platform in Action</h3>
      <a href="#the-partner-platform-in-action">
        
      </a>
    </div>
    <p>The full details of using the new partner platform can be found in our <a href="https://developers.cloudflare.com/tenant/">Provisioning API docs</a>, but here we provide a walkthrough of a typical use case.</p><p>Using the new partner platform involves 4 steps:</p><ol><li><p>Provisioning Customer Accounts</p></li><li><p>Granting Customer Access</p></li><li><p>Enabling Services</p></li><li><p>Service Configuration</p></li></ol>
    <div>
      <h4>1) Provisioning Customer Accounts</h4>
      <a href="#1-provisioning-customer-accounts">
        
      </a>
    </div>
    <p>When onboarding customers, you want each to have their own Cloudflare account. This ensures one customer can not affect any resources belonging to another. By making a `POST /accounts` request, you can create an account for an individual customer.</p><p>Request:</p>
            <pre><code>curl -X POST \
    https://api.cloudflare.com/client/v4/accounts \
    -H 'Content-Type: application/json' \
    -H 'x-auth-email: &lt;x-auth-email&gt;' \
    -H 'x-auth-key: &lt;x-auth-key&gt;' \
    -d '{ "name": "Customer Account", 
          "type": "standard" 
        }'</code></pre>
            <p>Response:</p>
            <pre><code>{
    "result": {
        "id": "2bab6ace8c72ed3f09b9eca6db1396bb",
        "name": "Customer Account",
        "type": "standard",
        "settings": {
            "enforce_twofactor": false
        }
    },
    "success": true,
    "errors": [],
    "messages": []
}</code></pre>
            <p>This new account is owned by the partner. It can be managed by API, or in the UI by the partner or any additional administrators that are invited.</p>
    <div>
      <h4>2) Granting Customer Access</h4>
      <a href="#2-granting-customer-access">
        
      </a>
    </div>
    <p>Now that the customer’s account is created, let’s give them access to it. This step uses existing APIs and if you have shared access to a Cloudflare account before, then you have already done this.</p><p>Request:</p>
            <pre><code>curl -X POST \
    'https://api.cloudflare.com/client/v4/accounts/2bab6ace8c72ed3f09b9eca6db1396bb/members' \
    -H 'Content-Type: application/json' \
    -H 'x-auth-email: &lt;x-auth-email&gt;' \
    -H 'x-auth-key: &lt;x-auth-key&gt;' \
    -d '{ "email": "mycustomer@theircompany.com",
          "roles": ["05784afa30c1afe1440e79d9351c7430"],
          "status": "accepted" 
        }'</code></pre>
            <p>Response:</p>
            <pre><code>{
    "result": {
        "id": "47bd8083af8516a20c410090d2f53655",
        "user": {
            "id": "fccad3c46f26dc2d6ba47ad19f639707",
            "first_name": null,
            "last_name": null,
            "email": "mycustomer@theircompany.com",
            "two_factor_authentication_enabled": false
        },
        "status": "pending",
        "roles": [
            {
                "id": "05784afa30c1afe1440e79d9351c7430",
                "name": "Administrator",
                "description": "Can access the full account, except for membership management and billing.",
                "permissions": {
                    "organization": {
                        "read": true,
                        "edit": true
                    },
                    "zone": {
                        "read": true,
                        "edit": true
                    },
                    truncated...
                }
            }
        ]
    },
    "success": true,
    "errors": [],
    "messages": []
}</code></pre>
            <p>Alternatively, you can do this in the UI, from the <a href="https://dash.cloudflare.com/?account=members">Members section</a> for the newly created account.</p>
    <div>
      <h4>3) Enabling Services</h4>
      <a href="#3-enabling-services">
        
      </a>
    </div>
    <p>Now the fun part! With the ability to provision subscriptions, you can enable paid services for your customers. Before we do that though, we will create a zone so we can attach a zone subscription to it.</p><p>Adding a zone as a partner is no different than adding a zone as a regular customer. It can also be done by the customer.</p><p>Request:</p>
            <pre><code>curl -X POST \
    https://api.cloudflare.com/client/v4/zones \
    -H 'Content-Type: application/json' \
    -H 'x-auth-email: &lt;x-auth-email&gt;' \
    -H 'x-auth-key: &lt;x-auth-key&gt;' \
    -d '{ "name": "theircompany.com",
            "account": { "id": "2bab6ace8c72ed3f09b9eca6db1396bb" }
        }'</code></pre>
            <p>Response:</p>
            <pre><code>{
    "result": {
        "id": "cae181e41197e2eb875d9bcb9396abe7",
        "name": "theircompany.com",
        "status": "pending",
        "paused": false,
        "type": "full",
        "development_mode": 0,
        "name_servers": [
            "lana.ns.cloudflare.com",
            "lynn.ns.cloudflare.com"
        ],
        "original_name_servers": null,
        "original_registrar": "cloudflare, inc.",
        "original_dnshost": null,
        "modified_on": "2019-05-30T17:51:08.510558Z",
        "created_on": "2019-05-30T17:51:08.510558Z",
        "activated_on": null,
        "meta": {
            "step": 4,
            "wildcard_proxiable": false,
            "custom_certificate_quota": 0,
            "page_rule_quota": 3,
            "phishing_detected": false,
            "multiple_railguns_allowed": false
        },
        "owner": {
            "id": null,
            "type": "user",
            "email": null
        },
        "account": {
            "id": "2bab6ace8c72ed3f09b9eca6db1396bb",
            "name": "Customer Account"
        },
        "permissions": [
            "#access:edit",
            "#access:read",
            ...truncated
        ],
        "plan": {
            "id": "0feeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
            "name": "Free Website",
            "price": 0,
            "currency": "USD",
            "frequency": "",
            "is_subscribed": true,
            "can_subscribe": false,
            "legacy_id": "free",
            "legacy_discount": false,
            "externally_managed": false
        }
    },
    "success": true,
    "errors": [],
    "messages": []
}</code></pre>
            <p>For this customer we will provision a Pro plan for the newly created zone. If you are not familiar with our zone plans, then you can read about them <a href="https://www.cloudflare.com/plans/">here</a>. For this, we make a call to the subscriptions service.</p><p>Request:</p>
            <pre><code>curl -X POST \
    https://api.cloudflare.com/client/v4/zones/cae181e41197e2eb875d9bcb9396abe7/subscription \
  -H 'Content-Type: application/json' \
  -H 'X-Auth-Email: &lt;x-auth-email&gt;' \
  -H 'X-Auth-Key: &lt;x-auth-key&gt;' \
  -d '{"rate_plan": {
          "id": "PARTNERS_PRO"}
      }'</code></pre>
            <p>Response:</p>
            <pre><code>{
    "success": true,
    "result": {
        "id": "ff563a93e11c46e7b278be46f49cdd2f",
        "product": {
            "name": "partners_cloudflare_zones",
            "period": "",
            "billing": "",
            "public_name": "CloudFlare Services",
            "duration": 0
        },
        "rate_plan": {
            "id": "partners_pro",
            "public_name": "Partners Professional Plan",
            "currency": "USD",
            "scope": "zone",
            "externally_managed": false,
            "sets": [
                "zone",
                "partner"
            ],
            "is_contract": true
        },
        "component_values": [
            {
                "name": "dedicated_certificates",
                "value": 0,
                "price": 0
            },
            {
                "name": "dedicated_certificates_custom",
                "value": 0,
                "price": 0
            },
            {
                "name": "page_rules",
                "value": 20,
                "default": 20,
                "price": 0
            },
            {
                "name": "zones",
                "value": 1,
                "default": 1,
                "price": 0
            }
        ],
        "zone": {
            "id": "cae181e41197e2eb875d9bcb9396abe7",
            "name": "theircompany.com"
        },
        "frequency": "monthly",
        "currency": "USD",
        "app": {
            "install_id": null
        },
        "entitled": true
    },
    "messages": null,
    "api_version": "2.0.0"
}</code></pre>
            <p>Now that the customer is set up with an account, zone, and zone subscription, the only thing left is configuring the resources appropriately.</p>
    <div>
      <h4>4) Service Configuration</h4>
      <a href="#4-service-configuration">
        
      </a>
    </div>
    <p>Service configuration can be done by either you, the partner, or the end customer. Most commonly, DNS records need to be added, security settings verified and updated, and customizations made. These can all be done either through our <a href="https://api.cloudflare.com">Client v4 APIs</a> or the <a href="https://dash.cloudflare.com">Cloudflare Dashboard</a>.</p><p>Once that is done, the customer is all set!</p>
    <div>
      <h3>This is just the beginning</h3>
      <a href="#this-is-just-the-beginning">
        
      </a>
    </div>
    <p>With our announcement today, partners can protect and accelerate their customer’s internet services with Cloudflare’s partner platform. We have battled tested the underlying systems over the last year and are excited to partner with others to help make a better internet. We are not done yet though. We will be continually investing in the tenant and subscription services to expand their capabilities and simplify usage.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/8KbwSuW9vmyX0BMvavbdy/0f95fecda92654c313bd21d33179ad99/Screen-Shot-2019-06-05-at-10.27.26-AM.png" />
            
            </figure><p>Some of the latest partners using the new partner platform</p><p>If you are interested in partnering with Cloudflare, then reach out to <a href="#">partners@cloudflare.com</a>. If building the future of how Cloudflare’s partners and customers use our service sounds interesting then take a look at our <a href="https://www.cloudflare.com/careers/departments/">career page</a>.</p><hr /><p>For more information, see the following resources:</p><ul><li><p><a href="http://cloudflare.com/partners">Partner Program Website</a></p></li><li><p><a href="http://cloudflare.com/partners/services">Partner Services Website</a></p></li><li><p>Announcing the new Cloudflare Partner Platform (you are here)</p></li><li><p><a href="/helping-cloudflare-build-its-partnerships-worldwide/">Building Partnerships Worldwide</a></p></li><li><p><a href="/cloudflare-partners-a-new-program-with-new-partners/">The New Partner Program</a></p></li></ul> ]]></content:encoded>
            <category><![CDATA[Partners]]></category>
            <category><![CDATA[API]]></category>
            <category><![CDATA[Developers]]></category>
            <guid isPermaLink="false">3kL4Sqna39TF0gcr0mZUur</guid>
            <dc:creator>Garrett Galow</dc:creator>
        </item>
        <item>
            <title><![CDATA[Introducing Single Sign-On for the Cloudflare Dashboard]]></title>
            <link>https://blog.cloudflare.com/introducing-single-sign-on-for-the-cloudflare-dashboard/</link>
            <pubDate>Wed, 10 Oct 2018 17:00:00 GMT</pubDate>
            <description><![CDATA[ As the  number of SaaS services people use everyday grows, it has become more challenging to juggle the number of password and multi-factor authentication combinations users have to keep track of to get online.  ]]></description>
            <content:encoded><![CDATA[ <img src="https://lh3.googleusercontent.com/1bH8yWBrrK65LHHelPvXaOyGbIZ5HD5CutVT2tHDubyZmJrUM7hYABags2vJhGSoERbt5KKDUSOilB-HmhVlKThYBdOx5LA27nhvJgOYLbHTWp6_I1IMKFU-0VMM_KUFzCwvwqc" />
    <div>
      <h3>The Challenge of Managing User Access to SaaS Applications</h3>
      <a href="#the-challenge-of-managing-user-access-to-saas-applications">
        
      </a>
    </div>
    <p>As the  number of SaaS services people use everyday grows, it has become more challenging to juggle the number of password and multi-factor authentication combinations users have to keep track of to get online.</p><p>Adopting identity services have allowed companies to centralize employee authentication. With <a href="https://www.cloudflare.com/products/cloudflare-access/">Cloudflare Access</a>, companies can ensure employees use a company managed identity provider when accessing websites behind Cloudflare. Last week, Sam <a href="/cloudflare-access-sharing-our-single-sign-on-plugin-for-atlassian/">published a blog</a> on how Cloudflare has made it easier to connect Cloudflare Access to the Atlassian suite of tools.</p><p>Since Cloudflare has simplified access control for corporate applications, many enterprise customers have commonly asked for the ability to extend the same ease of access and control to the Cloudflare dashboard itself.</p>
    <div>
      <h3>Single Sign-On for the Cloudflare Dashboard</h3>
      <a href="#single-sign-on-for-the-cloudflare-dashboard">
        
      </a>
    </div>
    <p>Today, we are announcing support for enterprise customers to use single sign-on (SSO) through their identity provider to access the Cloudflare dashboard.</p><p>Cloudflare is a critical piece of infrastructure for customers, and SSO ensures that customers can apply the same authentication policies to access the Cloudflare dashboard as other critical resources.</p><p>Once onboarded for SSO, all company user logins to the Cloudflare dashboard redirect to the customer’s identity provider. Once all required authentication checks complete successfully, the user is seamlessly redirected back to <a href="https://dash.cloudflare.com/">dash.cloudflare.com</a> and logged in.</p>
    <div>
      <h3>Leveraging Access &amp; Workers to Build SSO</h3>
      <a href="#leveraging-access-workers-to-build-sso">
        
      </a>
    </div>
    <p>At Cloudflare, we  dogfood our own services as both a way to make them better for our customers and to make developing new services more efficient and robust. With SSO, this is no different. Authentication configurations are managed through Access, which allows us to launch with support for the same <a href="https://developers.cloudflare.com/access/configuring-identity-providers/">identity providers</a> available in Access today, including SAML.</p><p><a href="/cloudflare-turns-8/">Cloudflare is 8 years old</a> and we built our user authentication system way before Cloudflare Access existed. In order to connect Access to our existing authentication system, we built a Cloudflare Worker that converts Access authentication tokens to our own authentication tokens. This greatly simplified the code changes required in our system, and results in faster SSO logins because the Worker runs at the network edge and reduces the number of round trips required to authenticate users.</p><p>In addition to leveraging Cloudflare services to build Single Sign-On, we are moving all Cloudflare employees to use SSO through our existing G Suite setup. This ensures Cloudflare can uniformly enforce multi-factor authentication policies for the services we protect with Cloudflare itself.</p>
    <div>
      <h3>How to Start using SSO for the Cloudflare Dashboard</h3>
      <a href="#how-to-start-using-sso-for-the-cloudflare-dashboard">
        
      </a>
    </div>
    <p><a href="https://www.cloudflare.com/plans/enterprise/">Cloudflare Enterprise</a> customers can reach out to their Customer Success Manager to learn how to start using SSO to log-in to the Cloudflare dashboard. If you are interested in using SSO yourself and becoming a Cloudflare Enterprise customer, then please <a href="https://www.cloudflare.com/plans/enterprise/contact/">get in touch</a>.</p> ]]></content:encoded>
            <category><![CDATA[Product News]]></category>
            <category><![CDATA[SaaS]]></category>
            <category><![CDATA[Dashboard]]></category>
            <category><![CDATA[Single Sign On (SSO)]]></category>
            <guid isPermaLink="false">70Gv0KF9h3csXNvUTuzs5i</guid>
            <dc:creator>Garrett Galow</dc:creator>
        </item>
        <item>
            <title><![CDATA[Expanding Multi-User Access on dash.cloudflare.com]]></title>
            <link>https://blog.cloudflare.com/expanding-multi-user-access/</link>
            <pubDate>Wed, 02 May 2018 15:00:00 GMT</pubDate>
            <description><![CDATA[ One of the most common feature requests we get is to allow customers to share access to their account. This has been supported at our Enterprise level of service, but is now expanding to all customers.  ]]></description>
            <content:encoded><![CDATA[ <p>One of the most common <a href="https://community.cloudflare.com/t/expanded-availability-of-multi-user-access/64">feature requests</a> we get is to allow customers to share account access. This has been <a href="/introducing-multi-user-organizations-share-an-account-without-sharing-a-login/">supported at our Enterprise level</a> of service, but is now being extended to all customers. Starting today, users can go to the new home of Cloudflare’s Dashboard at <a href="https://dash.cloudflare.com">dash.cloudflare.com</a>. Upon login, users will see the redesigned account experience. Now users can manage all of their account level settings and features in a more streamlined UI.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5zeWNzUjpyY7LBIkrk4oSb/71d1b4056424a1620fe9dfcfc4277b53/orange_keyboard.jpg" />
            
            </figure><p><a href="https://creativecommons.org/licenses/by/2.0/">CC BY 2.0</a> <a href="https://www.flickr.com/photos/157270154@N05/38470144796/">image</a> by <a href="https://www.flickr.com/photos/157270154@N05/">Mike Lawrence</a></p><p>All customers now have the ability to invite others to manage their account as Administrators. They can do this from the ‘Members’ tab in the new Account area on the Cloudflare dashboard. Invited Administrators have full control over the account except for managing members and changing billing information.</p><p>For Customers who belong to multiple accounts (previously known as organizations), the first thing they will see is an account selector. This allows easy searching and selection between accounts. Additionally, there is a zone selector for searching through zones across all accounts. Enterprise customers still have access to the same roles as before with the addition of the Administrator and Billing Roles.</p>
    <div>
      <h3>The New Dashboard @ dash.cloudflare.com</h3>
      <a href="#the-new-dashboard-dash-cloudflare-com">
        
      </a>
    </div>
    
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/MqpswjSxwPTbFa6vfeCSe/730c47285384b1a4fae96db76274cc12/Screen-Shot-2018-04-30-at-9.21.49-AM.png" />
            
            </figure><p>As previously announced in our <a href="/deprecating-old-tls-versions-on-cloudflare-dashboard-and-api/">blog post about deprecating old TLS versions</a>, we are migrating the dashboard from <a href="https://www.cloudflare.com/a">www.cloudflare.com/a</a> to <a href="https://dash.cloudflare.com">dash.cloudflare.com</a>. The new dashboard will only support TLS versions 1.2 and greater in order for us to comply with <a href="https://www.cloudflare.com/learning/privacy/what-is-pci-dss-compliance/">PCI</a> and NIST guidelines. If you are connecting to the existing dashboard with a TLS version older than 1.2, you will see a banner warning you of this.</p><p>Starting May 22, 2018, all customers visiting the dashboard at its current location, <a href="http://www.cloudflare.com/a">www.cloudflare.com/a</a> will be redirected to <a href="https://dash.cloudflare.com">dash.cloudflare.com</a>.</p>
    <div>
      <h3>Behind the Scenes</h3>
      <a href="#behind-the-scenes">
        
      </a>
    </div>
    <p>This change is not just a UI update with some new functionality. Behind the scenes, two major changes were implemented. First, much of the dashboard has been rewritten from Backbone to React. This improves our developer velocity as the number of front-end developers building the dashboard grows. Second, We have overhauled the mobile browsing experience, so you can easily manage your zones on the go.</p><p>On the backend, we have overhauled our data model for account and user management. Whereas before accounts, users and the resources they owned were very tightly coupled, now they are distinct, decoupled objects. This major change is what enabled us to expand multi-user access to all of our customers. Segregating users from accounts also allows us to clean up our architecture for our distributed development teams. The systems that power our products can now be explicit in what they need access to (users vs accounts), and we can limit their access to that data appropriately.</p>
    <div>
      <h3>What’s Next?</h3>
      <a href="#whats-next">
        
      </a>
    </div>
    <p>This is just the first step in bringing a better user management story to all customers. We have many improvements planned for how customers authenticate, manage access and permissions, and organize their zones in Cloudflare. If you have feedback on the new experience or what you’d like to see us build next, visit the dashboard section of the Cloudflare Community, and let us know!</p> ]]></content:encoded>
            <category><![CDATA[Product News]]></category>
            <category><![CDATA[Multi-User]]></category>
            <category><![CDATA[Dashboard]]></category>
            <category><![CDATA[Security]]></category>
            <guid isPermaLink="false">7dDQtDDyegIurkQ4eRgymL</guid>
            <dc:creator>Garrett Galow</dc:creator>
        </item>
    </channel>
</rss>