
<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 17:46:16 GMT</lastBuildDate>
        <item>
            <title><![CDATA[Managed OAuth for Access: make internal apps agent-ready in one click]]></title>
            <link>https://blog.cloudflare.com/managed-oauth-for-access/</link>
            <pubDate>Tue, 14 Apr 2026 13:00:10 GMT</pubDate>
            <description><![CDATA[ Managed OAuth for Cloudflare Access helps AI agents securely navigate internal applications. By adopting RFC 9728, agents can authenticate on behalf of users without using insecure service accounts. ]]></description>
            <content:encoded><![CDATA[ <p>We have thousands of internal apps at Cloudflare. Some are things we’ve built ourselves, others are self-hosted instances of software built by others. They range from business-critical apps nearly every person uses, to side projects and prototypes.</p><p>All of these apps are protected by <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/policies/"><u>Cloudflare Access</u></a>. But when we started using and building agents — particularly for uses beyond writing code — we hit a wall. People could access apps behind Access, but their agents couldn’t.</p><p>Access sits in front of internal apps. You define a policy, and then Access will send unauthenticated users to a login page to choose how to authenticate. </p>
          <figure>
          <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3867rU5n4IkRilnfCAvOLD/8ec5ea3c25dbd6620a8644d231893732/BLOG-3146_2.png" />
          </figure><p><sup><i>Example of a Cloudflare Access login page</i></sup></p><p>This flow worked great for humans. But all agents could see was a redirect to a login page that they couldn’t act on.</p><p>Providing agents with access to internal app data is so vital that we immediately implemented a stopgap for our own internal use. We modified OpenCode’s <a href="https://opencode.ai/docs/tools/#webfetch"><u>web fetch tool</u></a> such that for specific domains, it triggered the <a href="https://developers.cloudflare.com/cloudflare-one/tutorials/cli/"><u>cloudflared</u></a> CLI to open an authorization flow to fetch a <a href="https://www.cloudflare.com/learning/access-management/token-based-authentication/"><u>JWT</u></a> (JSON Web Token). By appending this token to requests, we enabled secure, immediate access to our internal ecosystem.</p><p>While this solution was a temporary answer to our own dilemma, today we’re retiring this workaround and fixing this problem for everyone. Now in open beta, every Access application supports managed OAuth. One click to enable it for an Access app, and agents that speak OAuth 2.0 can easily discover how to authenticate (<a href="https://datatracker.ietf.org/doc/html/rfc9728"><u>RFC 9728</u></a>), send the user through the auth flow, and receive back an authorization token (the same JWT from our initial solution). </p><p>Now, the flow works smoothly for both humans and agents. Cloudflare Access has a generous <a href="https://www.cloudflare.com/plans/zero-trust-services/"><u>free tier</u></a>. And building off our newly-introduced <a href="https://blog.cloudflare.com/organizations-beta/"><u>Organizations beta</u></a>, you’ll soon be able to bridge identity providers across Cloudflare accounts too.</p>
    <div>
      <h2>How managed OAuth works</h2>
      <a href="#how-managed-oauth-works">
        
      </a>
    </div>
    <p>For a given internal app protected by Cloudflare Access, you enable managed OAuth in one click:</p>
          <figure>
          <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/79FSFNeaDbqn9DkSyfKrtz/5f0fd06ce9e127c06474263a529ec284/BLOG-3146_3.png" />
          </figure><p>Once managed OAuth is enabled, Cloudflare Access acts as the authorization server. It returns the <code>www-authenticate</code> header, telling unauthorized agents where to look up information on how to get an authorization token. They find this at <code>https://&lt;your-app-domain&gt;/.well-known/oauth-authorization-server</code>. Equipped with that direction, agents can just follow OAuth standards: </p><ol><li><p>The agent dynamically registers itself as a client (a process known as Dynamic Client Registration — <a href="https://datatracker.ietf.org/doc/html/rfc7591"><u>RFC 7591</u></a>), </p></li><li><p>The agent sends the human through a PKCE (Proof Key for Code Exchange) authorization flow (<a href="https://datatracker.ietf.org/doc/html/rfc7636"><u>RFC 7636</u></a>)</p></li><li><p>The human authorizes access, which grants a token to the agent that it can use to make authenticated requests on behalf of the user</p></li></ol><p>Here’s what the authorization flow looks like:</p>
          <figure>
          <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2LkJMuPCNX1Mu7MfEnFinH/fef5cf3f87e83d93c49ffeadbe6aed4d/BLOG-3146_4.png" />
          </figure><p>If this authorization flow looks familiar, that’s because it’s what the <a href="https://modelcontextprotocol.io/specification/"><u>Model Context Protocol (MCP)</u></a> uses. We originally built support for this into our <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/mcp-portals/"><u>MCP server portals</u></a> product, which proxies and controls access to many MCP servers, to allow the portal to act as the OAuth server. Now, we’re bringing this to all Access apps so agents can access not only MCP servers that require authorization, but also web pages, web apps, and REST APIs.</p>
    <div>
      <h2>Mass upgrading your internal apps to be agent-ready</h2>
      <a href="#mass-upgrading-your-internal-apps-to-be-agent-ready">
        
      </a>
    </div>
    <p>Upgrading the long tail of internal software to work with agents is a daunting task. In principle, in order to be agent-ready, every internal and external app would ideally have discoverable APIs, a CLI, a well-crafted MCP server, and have adopted the many emerging agent standards.</p><p>AI adoption is not something that can wait for everything to be retrofitted. Most organizations have a significant backlog of apps built over many years. And many internal “apps” work great when treated by agents as simple websites. For something like an internal wiki, all you really need is to enable <a href="https://blog.cloudflare.com/markdown-for-agents/"><u>Markdown for Agents</u></a>, turn on managed OAuth, and agents have what they need to read protected content.</p><p>To make the basics work across the widest set of internal applications, we use Managed OAuth. By putting Access in front of your legacy internal apps, you make them agent-ready instantly. No code changes, no retrofitting. Instead, just immediate compatibility.</p>
    <div>
      <h2>It’s the user’s agent. No service accounts and tokens needed</h2>
      <a href="#its-the-users-agent-no-service-accounts-and-tokens-needed">
        
      </a>
    </div>
    <p>Agents need to act on behalf of users inside organizations. One of the biggest anti-patterns we’ve seen is people provisioning service accounts for their agents and MCP servers, authenticated using static credentials. These have their place in simple use cases and quick prototypes, and Cloudflare Access supports <a href="https://developers.cloudflare.com/cloudflare-one/access-controls/service-credentials/service-tokens/"><u>service tokens</u></a> for this purpose.</p><p>But the service account approach quickly shows its limits when fine-grained access controls and audit logs are required. We believe that every action an agent performs must be easily attributable to the human who initiated it, and that an agent must only be able to perform actions that its human operator is likewise authorized to do. Service accounts and static credentials become points at which attribution is lost. Agents that launder all of their actions through a service account are susceptible to <a href="https://en.wikipedia.org/wiki/Confused_deputy_problem"><u>confused deputy problems</u></a> and result in audit logs that appear to originate from the agent itself.</p><p>For security and accountability, agents must use security primitives capable of expressing this user–agent relationship. OAuth is the industry standard protocol for requesting and delegating access to third parties. It gives agents a way to talk to your APIs on behalf of the user, with a token scoped to the user’s identity, so that access controls correctly apply and audit logs correctly attribute actions to the end user.</p>
    <div>
      <h2>Standards for the win: how agents can and should adopt RFC 9728 in their web fetch tools</h2>
      <a href="#standards-for-the-win-how-agents-can-and-should-adopt-rfc-9728-in-their-web-fetch-tools">
        
      </a>
    </div>
    <p><a href="https://datatracker.ietf.org/doc/html/rfc9728"><u>RFC 9728</u></a> is the OAuth standard that makes it possible for agents to discover where and how to authenticate. It standardizes where this information lives and how it’s structured. This RFC became official in April 2025 and was quickly adopted by the Model Context Protocol (MCP), which now <a href="https://modelcontextprotocol.io/specification/2025-11-25/basic/authorization"><u>requires that both MCP servers and clients support it</u></a>.</p><p>But outside of MCP, agents should adopt RFC 9728 for an even more essential use case: making requests to web pages that are protected behind OAuth and making requests to plain old REST APIs.</p><p>Most agents have a tool for making basic HTTP requests to web pages. This is commonly called the <a href="https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-fetch-tool"><u>“web fetch” tool</u></a>. It’s similar to using the <a href="https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API"><u>fetch()</u></a> API in JavaScript, often with some additional post-processing on the response. It’s what lets you paste a URL into your agent and have your agent go look up the content.</p><p>Today, most agents’ web fetch tools won’t do anything with the <code>www-authenticate</code> header that a URL returns. The underlying model might choose to introspect the response headers and figure this out on its own, but the tool itself does not follow <code>www-authenticate</code>, look up <code>/.well-known/oauth-authorization-server</code>, and act as the client in the OAuth flow. But it <i>can</i>, and we strongly believe it <i>should</i>! Agents already do this to act as remote MCP clients.</p><p>To demonstrate this, we’ve put up a draft pull request that <a href="https://github.com/anomalyco/opencode/pull/22096/"><u>adapts the web fetch tool in Opencode</u></a> to show this in action. Before making a request, the adapted tool first checks whether it already has credentials ; if it does, it uses them to make the initial request. If the tool gets back a 401 or a 403 with a <code>www-authenticate</code> header, it asks the user for consent to be sent through the server’s OAuth flow.</p><p>Here’s how that OAuth flow works. If you give the agent a URL that is protected by OAuth and complies with RFC 9728, the agent prompts the human for consent to open the authorization flow:</p>
          <figure>
          <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1vo4hGtVz7ovlNQslTvTal/3d2b1a861b9342842bd6297e1869aed4/BLOG-3146_5.png" />
          </figure><p>…sending the human to the login page:</p>
          <figure>
          <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3867rU5n4IkRilnfCAvOLD/8ec5ea3c25dbd6620a8644d231893732/BLOG-3146_2.png" />
          </figure><p>…and then to a consent dialog that prompts the human to grant access to the agent:</p>
          <figure>
          <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/39I0yjWXKGLNG4mhV5jEPQ/793559a5f18a04e807939b9560118ccb/BLOG-3146_6.png" />
          </figure><p>Once the human grants access to the agent, the agent uses the token it has received to make an authenticated request:</p>
          <figure>
          <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4e0mNkih5xtbAoQpwBrB32/701089e8ea256804890d45af08ef04ca/BLOG-3146_7.png" />
          </figure><p>Any agent from Codex to Claude Code to Goose and beyond can implement this, and there’s nothing bespoke to Cloudflare. It’s all built using OAuth standards.</p><p>We think this flow is powerful, and that supporting RFC 9728 can help agents with more than just making basic web fetch requests. If a REST API supports RFC 9728 (and the agent does too), the agent has everything it needs to start making authenticated requests against that API. If the REST API supports <a href="https://www.rfc-editor.org/rfc/rfc9727"><u>RFC 9727</u></a>, then the client can discover a catalog of REST API endpoints on its own, and do even more without additional documentation, agent skills, MCP servers or CLIs. </p><p>Each of these play important roles with agents — Cloudflare itself provides an <a href="https://blog.cloudflare.com/code-mode-mcp/"><u>MCP server for the Cloudflare API</u></a> (built using <a href="https://blog.cloudflare.com/code-mode/"><u>Code Mode</u></a>), <a href="https://developers.cloudflare.com/workers/wrangler/commands/"><u>Wrangler CLI</u></a>, and <a href="https://github.com/cloudflare/skills"><u>Agent Skills</u></a>, and a <a href="https://x.com/CloudflareDev/status/2037336582815175122"><u>Plugin</u></a>. But supporting RFC 9728 helps ensure that even when none of these are preinstalled, agents have a clear path forward. If the agent has a <a href="https://blog.cloudflare.com/dynamic-workers/"><u>sandbox to execute untrusted code</u></a>, it can just write and execute code that calls the API that the human has granted it access to. We’re working on supporting this for Cloudflare’s own APIs, to help your agents understand how to use Cloudflare.</p>
    <div>
      <h2>Coming soon: share one identity provider (IdP) across many Cloudflare accounts</h2>
      <a href="#coming-soon-share-one-identity-provider-idp-across-many-cloudflare-accounts">
        
      </a>
    </div>
    <p>At Cloudflare our own internal apps are deployed to dozens of different Cloudflare accounts, which are all part of an Organization — a <a href="https://blog.cloudflare.com/organizations-beta/"><u>newly introduced</u></a> way for administrators to manage users, configurations, and view analytics across many Cloudflare accounts. We have had the same challenge as many of our customers: each Cloudflare account has to separately configure an IdP, so Cloudflare Access uses our identity provider. It’s critical that this is consistent across an organization — you don’t want one Cloudflare account to inadvertently allow people to sign in just with a one-time PIN, rather than requiring that they authenticate via single-sign on (SSO).</p><p>To solve this, we’re currently working on making it possible to share an identity provider across Cloudflare accounts, giving organizations a way to designate a single primary IdP for use across every account in their organization.</p><p>As new Cloudflare accounts are created within an organization, administrators will be able to configure a bridge to the primary IdP with a single click, so Access applications across accounts can be protected by one identity provider. This removes the need to manually configure IdPs account by account, which is a process that doesn’t scale for organizations with many teams and individuals each operating their own accounts.</p>
    <div>
      <h2>What’s next</h2>
      <a href="#whats-next">
        
      </a>
    </div>
    <p>Across companies, people in every role and business function are now using agents to build internal apps, and expect their agents to be able to access context from internal apps. We are responding to this step function growth in internal software development by making the <a href="https://workers.cloudflare.com/"><u>Workers Platform</u></a> and <a href="https://developers.cloudflare.com/cloudflare-one/"><u>Cloudflare One</u></a> work better together — so that it is easier to build and secure internal apps on Cloudflare. </p><p>Expect more to come soon, including:</p><ul><li><p>More direct integration between Cloudflare Access and Cloudflare Workers, without the need to validate JWTs or remember which of many routes a particular Worker is exposed on.</p></li><li><p><a href="https://github.com/cloudflare/workers-sdk/pull/13126"><u>wrangler dev --tunnel</u></a> — an easy way to expose your local development server to others when you’re building something new, and want to share it with others before deploying</p></li><li><p>A CLI interface for Cloudflare Access and the <a href="https://blog.cloudflare.com/cf-cli-local-explorer/"><u>entire Cloudflare API</u></a></p></li><li><p>More announcements to come during Agents Week 2026</p></li></ul>
    <div>
      <h2>Enable Managed OAuth for your internal apps behind Cloudflare Access</h2>
      <a href="#enable-managed-oauth-for-your-internal-apps-behind-cloudflare-access">
        
      </a>
    </div>
    <p>Managed OAuth is now available, in open beta, to all Cloudflare customers. Head over to the <a href="https://dash.cloudflare.com/"><u>Cloudflare dashboard</u></a> to enable it for your Access applications. You can use it for any internal app, whether it’s one built on <a href="https://workers.cloudflare.com/"><u>Cloudflare Workers</u></a>, or hosted elsewhere. And if you haven’t built internal apps on the Workers Platform yet — it’s the fastest way for your team to go from zero to deployed (and protected) in production.</p> ]]></content:encoded>
            <category><![CDATA[Agents Week]]></category>
            <category><![CDATA[Agents]]></category>
            <category><![CDATA[Security]]></category>
            <category><![CDATA[Zero Trust]]></category>
            <category><![CDATA[SASE]]></category>
            <category><![CDATA[Cloudflare Access]]></category>
            <category><![CDATA[Cloudflare One]]></category>
            <category><![CDATA[AI]]></category>
            <category><![CDATA[Developers]]></category>
            <category><![CDATA[Developer Platform]]></category>
            <guid isPermaLink="false">6pXy7tbG2SlwZZPQuO14Rq</guid>
            <dc:creator>Eduardo Gomes</dc:creator>
            <dc:creator>James Royal</dc:creator>
            <dc:creator>Ann Ming Samborski</dc:creator>
        </item>
        <item>
            <title><![CDATA[Improved support for private applications and reusable access policies with Cloudflare Access]]></title>
            <link>https://blog.cloudflare.com/improved-support-for-private-applications-and-reusable-access-policies-with-cloudflare-access/</link>
            <pubDate>Thu, 20 Mar 2025 05:00:00 GMT</pubDate>
            <description><![CDATA[ We are excited to introduce support for private hostname and IP address-defined applications as well as reusable access policies.
 ]]></description>
            <content:encoded><![CDATA[ 
    <div>
      <h3>Simplifying secure access for every application</h3>
      <a href="#simplifying-secure-access-for-every-application">
        
      </a>
    </div>
    <p>For years, Cloudflare has helped organizations modernize their access to internal resources by delivering identity-aware access controls through our <a href="https://www.cloudflare.com/learning/access-management/what-is-ztna/"><u>Zero Trust Network Access (ZTNA)</u></a> service, <a href="https://www.cloudflare.com/zero-trust/products/access/"><u>Cloudflare Access</u></a>. Our customers have accelerated their ZTNA implementations for web-based applications in particular, using our intuitive workflows for Access applications tied to public hostnames.</p><p>However, given our architecture design, we have primarily handled private network application access (applications tied to private IP addresses or hostnames) through the network firewall component of our <a href="https://www.cloudflare.com/learning/access-management/what-is-a-secure-web-gateway/"><u>Secure Web Gateway (SWG)</u></a> service, <a href="https://developers.cloudflare.com/cloudflare-one/policies/gateway/"><u>Cloudflare Gateway</u></a>. We provided a small wrapper from Access to connect the two experiences. While this implementation technically got the job done, there were some clear downsides, and our customers have frequently cited the inconsistency.</p><p>Today, we are thrilled to announce that we have redesigned the self-hosted private application administrative experience within Access to match the experience for web-based apps on public hostnames. We are introducing support for private hostname and IP address-defined applications directly within Access, as well as reusable access policies. Together, these updates make ZTNA even easier for our customers to deploy and streamline ongoing policy management.</p><p>In order to better understand how this feature improves the overall functionality of Access, let’s explore what makes up a “private” application, how they are typically accessed, what was possible before this feature, and what the new feature enables. If you are a networking expert or aficionado, you can skip ahead to <a href="#a-look-back-protecting-private-applications-with-cloudflare-zero-trust-before-access-private-ip-address-and-hostname-support"><u>A look back: protecting private applications with Cloudflare Zero Trust before Access Private IP Address and Hostname support</u></a>.</p>
    <div>
      <h3>Private applications</h3>
      <a href="#private-applications">
        
      </a>
    </div>
    <p>A private application in this context, is any application that is only accessible through a private IP address or hostname. </p>
    <div>
      <h4>Private IP addresses</h4>
      <a href="#private-ip-addresses">
        
      </a>
    </div>
    <p>Private IP addresses, often referred to as <a href="https://www.rfc-editor.org/rfc/rfc1918"><u>RFC 1918 IP addresses</u></a>, are scoped to a specific network and can only be reached by users on that network. While public IP addresses must be unique across the entire Internet, private IP addresses can be reused across networks. Any device or virtual machine will have a private IP address. For example, if I run <i>ipconfig</i> on my own Windows machine, I can see an address of 192.168.86.172.</p>
          <figure>
          <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/40guiajv2H8LiUIPj3I80L/392c59c79ae2cd5d1edec8eba485610f/1.png" />
          </figure><p>This is the address that any other machine on my own network can use to reference and communicate with this specific machine. Private IP addresses are useful for applications and ephemeral infrastructure (systems that spin up and down dynamically) because they can be reused and only have to be unique within their specific network. This is much easier to manage than issuing a public IPv4 address to resources – we’ve actually <a href="https://blog.cloudflare.com/cloudflare-research-two-years-in/#case-study-3-ip-address-agility"><u>run out of available public IPv4 address space</u></a>!</p><p>In order to host an application on a machine in my network, I need to make that application available to other machines in the network. Typically, this is done by assigning the application to a specific port. A request to that application might then look something like this: <a href="http://10.128.0.6:443"><u>http://10.128.0.6:443</u></a> which in plain English is saying “Using the hypertext transfer protocol, reach out to the machine at an address of 10.128.0.6 in my network, and connect to port 443.” Connecting to an application can be done in a browser, over <a href="https://www.cloudflare.com/learning/access-management/what-is-ssh/">SSH</a>, over <a href="https://www.cloudflare.com/learning/access-management/what-is-the-remote-desktop-protocol/">RDP</a>, through a thick client application, or many other methods of accessing a resource over an IP address.</p><p>In this case, we have an Apache2 example web server, running at that address and port combination.</p>
          <figure>
          <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/zmLj88okpYkIdg6FmBYow/5a07a43478ede91223f42960a9539251/2.png" />
          </figure><p>If I attempt to access this IP address outside of the same network as this machine running the web server, then I will either get no result, or a completely different application, if I have something else running on that IP address/port combination in that other network.</p>
          <figure>
          <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/46reRgnUQMGTx7BO4yYgYh/f46096a704b24789e6ceba6c400b72a2/3.png" />
          </figure>
    <div>
      <h4>Private hostnames</h4>
      <a href="#private-hostnames">
        
      </a>
    </div>
    <p>We don’t want to remember 10.128.0.6 every time we want to access this application. Just like the Internet, we can use <a href="https://www.cloudflare.com/learning/dns/what-is-dns/">DNS</a> in our private network. While public DNS serves as the phone book for the entire Internet, private DNS is more like a school directory that is only valid for phone numbers within the campus.</p><p>For a private application, I can configure a DNS record, very similar to how I might expose a public website to the world. But instead, I will map my DNS record to a private IP address that is only accessible within my own network. Additionally, private DNS does not require registering a domain with a <a href="https://www.cloudflare.com/learning/dns/glossary/what-is-a-domain-name-registrar/">registrar</a> or adhering to defined top level domains. I can host an application on <i>application.mycompany</i>, and it is a valid internal DNS record. </p><p>In this example, I am running my web server on Google Cloud and will call the application <i>kennyapache.local</i>. In my local DNS, <i>kennyapache.local</i> has an A record mapping it to an IPv4 address within my private network on Google Cloud (GCP).</p>
          <figure>
          <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2OhO8VmCvfQ0H0ks1qUIir/74f5f4f764cef89393abf4989f0203e3/4.png" />
          </figure><p>This means that any machine within my network can use <i>https://kennyapache.local</i> instead of having to remember the explicit IP address.</p>
          <figure>
          <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/43nfcR2QZ6DtIhVGcdxlu4/2e72db9cdea772c15abf6a061926f531/5.png" />
          </figure>
    <div>
      <h3>Accessing private applications outside the private network</h3>
      <a href="#accessing-private-applications-outside-the-private-network">
        
      </a>
    </div>
    <p>Private networks require your machine, or virtual machine, to be connected directly to the same network as the target private IP address or hostname. This is a helpful property to keep unauthorized users from accessing applications, but presents a challenge if the application you want to use is outside your local network. </p><p><a href="https://www.cloudflare.com/learning/access-management/what-is-a-vpn/">Virtual Private Networks (VPNs)</a>, forward proxies, and proxy protocols (aka “<a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Proxy_servers_and_tunneling/Proxy_Auto-Configuration_PAC_file"><u>PAC files</u></a>”) are all methods to enable a machine outside your private network to reach a private IP address/hostname within the private network. These tools work by adding an additional network interface to the machine and specifying that certain requests need to be routed through a remote private network, not the local network the machine is currently connected to, or out to the public Internet.</p><p>When I connect my machine to a forward proxy, in this case Cloudflare’s device client, <a href="https://developers.cloudflare.com/cloudflare-one/connections/connect-devices/warp/"><u>WARP</u></a>, and run <i>ipconfig </i>I can see a new network interface and IP address added to the list:</p>
          <figure>
          <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5ETxtHA0R29eZkPMGXQiKA/3a698067576e625491695ea31f9aae77/6.png" />
          </figure><p>This additional network interface will take control of specific network requests and route those to an external private network instead of the default behavior of my machine, which would be to route to that IP address on my own local network.</p>
    <div>
      <h3>A look back: protecting private applications with Cloudflare Zero Trust <i>before</i> Access Private IP Address and Hostname support</h3>
      <a href="#a-look-back-protecting-private-applications-with-cloudflare-zero-trust-before-access-private-ip-address-and-hostname-support">
        
      </a>
    </div>
    <p>We will continue to use our Apache2 server hosted on a GCP private domain as an example private application. We will briefly touch on how Cloudflare Zero Trust was previously used to protect private applications and why this new feature is a huge step forward. Cloudflare Zero Trust has two primary components used to protect application traffic: Cloudflare Access and Gateway.</p>
    <div>
      <h4>Cloudflare Access</h4>
      <a href="#cloudflare-access">
        
      </a>
    </div>
    <p><a href="https://www.cloudflare.com/zero-trust/products/access/"><u>Cloudflare Access</u></a> is designed to protect internal applications and resources without the need for a traditional VPN. Access allows organizations to authenticate and authorize users through identity providers — such as Okta, Azure AD, or Google Workspace — before granting them entry to internal systems or web-based applications. </p><p>Until now, Access required that an application had to be defined using a public DNS record. This means that a user had to expose their application to the Internet in order to leverage Access and use all of its granular security features. This isn’t quite as scary as it sounds, because Access allows you to enforce strong user, device, and network security controls. In fact, <a href="https://www.nist.gov/"><u>NIST</u></a> and many other major security organizations support this model.</p><p>In practice, an administrator would map their internal IP address or hostname to a public URL using our app connector, <a href="https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/"><u>Cloudflare Tunnel</u></a>. </p>
          <figure>
          <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2A5ipHt6Fle2B0va6u800e/aec1cc48f17d5599ea24259ea2724854/7.png" />
          </figure><p>Then, the administrator would create an Access application corresponding to that public URL. Cloudflare then sends a user through a single sign-on flow for any request made to that application.</p>
          <figure>
          <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3lJup7iAXJn4spQ9c1FdxA/d66d0e2e0139021c4a28c6498cd6e1b4/image2.png" />
          </figure><p>However, this approach does not work for organizations that have strict requirements to never expose an application over public DNS. Additionally, this does not work for applications outside the browser like SSH, RDP, FTP and other thick client applications, which are all options to connect to private applications.</p><p>If I tried to SSH to my Access-protected public hostname, I would get an error message with no way to authenticate, since there is no easy way to do a single sign-on through the browser in conjunction with SSH.</p>
    <div>
      <h4>Access Private Network applications</h4>
      <a href="#access-private-network-applications">
        
      </a>
    </div>
    <p>Until now, because Access operated using public hostnames, we have handled private network access for our customers using the network firewall piece of Cloudflare Gateway. A few years ago, we <a href="https://blog.cloudflare.com/zero-trust-private-networking-rules/"><u>launched</u></a> Access Private Network applications, which automatically generate the required Gateway block policies. However, this was a limited approach that was ultimately just a wrapper in front of two Gateway policies. </p>
          <figure>
          <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3Cyudmxym7VXQ5wLvslHqV/cc6bde76f33bcdddaea69e7f62e69ab0/9.png" />
          </figure>
    <div>
      <h4>Cloudflare Gateway</h4>
      <a href="#cloudflare-gateway">
        
      </a>
    </div>
    <p><a href="https://www.cloudflare.com/zero-trust/products/gateway/"><u>Cloudflare Gateway</u></a> is a secure web gateway that protects users from threats on the public Internet by filtering and securing DNS and web traffic. Gateway acts as a protective layer between end users and online resources by enforcing security controls, like blocking malicious domains, restricting access to risky categories of sites, and preventing <a href="https://www.cloudflare.com/learning/security/what-is-data-exfiltration/"><u>data exfiltration</u></a>. </p><p>Gateway is also used to route user traffic into private networks and acts as a forward proxy. It allows customers to create policies for private IP addresses and hostnames. This is because Gateway relies on traffic being proxied from the user’s machine to the Gateway service itself. This is most commonly done with the Cloudflare WARP client. WARP enables the configuration of which IP addresses and hostnames to send to Gateway for filtering and routing.</p><p>Once connected to a private network, through Gateway, a user can directly connect to private IP addresses and hostnames that are configured for that network.</p><p>I can then configure specific network firewall policies to allow or block traffic destined to private IP addresses.</p>
          <figure>
          <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4EtfhktReyry4NLabqunR/cb81b20c2e916c39fbd388ec3b8cbc8a/10.png" />
          </figure><p>Great! Looks like we’ve solved protecting private applications using Gateway. Not quite, unfortunately, as there are a few components of Gateway that are not an ideal model for an application-focused security model. While not discussed above, a few of the challenges we encountered when using Gateway for application access control included:</p><ul><li><p>Private applications were mixed in with general Gateway network firewall rules, complicating configuration and maintenance</p></li><li><p>Defining and managing private applications was not possible in Terraform</p></li><li><p>Application access logs were buried in general network firewall logs (these logs can contain all Internet traffic for an organization!)</p></li><li><p>Enforcement within Gateway relied on specific WARP client sessions, which lacked granular identity details</p></li><li><p>Administrators couldn’t use Access Rule Groups or other Access features built specifically for managing application access controls</p></li></ul><p>We knew we could do better.</p>
    <div>
      <h3>A unified approach to application access</h3>
      <a href="#a-unified-approach-to-application-access">
        
      </a>
    </div>
    <p>Knowing these limitations, we set out to extend Access to support any application, regardless of whether it is public or private. This principle guided our efforts to create a unified application definition in Cloudflare Access. Any self-hosted application, regardless of whether it is public or privately routable, should be defined in a single application type. The result is quite straightforward: <b>Access Applications now support </b><a href="https://developers.cloudflare.com/cloudflare-one/applications/non-http/self-hosted-private-app/"><b><u>private IP addresses and hostnames</u></b></a>.</p>
          <figure>
          <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6H0E6kyDN9Cm1f5R7OAPBm/c9630a990c52ab553c062deb14c6bd48/11.png" />
          </figure><p>However, the engineering work was not as simple as adding a private IP address and hostname option to Cloudflare Access. Given our platform’s architecture, Access does not have any way to route private requests by itself. We still have to rely on Gateway and the WARP client for that component.</p>
    <div>
      <h4>An application-aware firewall</h4>
      <a href="#an-application-aware-firewall">
        
      </a>
    </div>
    <p>This meant that we needed to add an application-specific phase to Gateway’s <a href="https://www.cloudflare.com/learning/security/what-is-a-firewall/">firewall</a>. The new phase detects whether a user’s traffic matches a defined application, and if so it sends the traffic to Access for authentication and authorization of a user and their session. This required extending Gateway’s network firewall to have knowledge of which private IP addresses and hostnames are defined as applications.</p><p>Thanks to this new firewall phase, now an administrator can configure exactly where they want their private applications to be evaluated in their overall network firewall.</p>
          <figure>
          <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6ruRjFqas4YtimtubJ2JH7/14f3a539536ffda5e7054e7bbff8638c/12.png" />
          </figure>
    <div>
      <h4>Private application sessions</h4>
      <a href="#private-application-sessions">
        
      </a>
    </div>
    <p>The other component we had to solve was per-application session management. In an Access public application, we issue a JSON Web Token (JWT) as a cookie which conveniently has an expiration associated. That acts as a session expiration. For private applications, we do not always have the ability to store a cookie. If the request is not over a browser, there is nowhere to put a <a href="https://www.cloudflare.com/learning/privacy/what-are-cookies/">cookie</a>.</p><p>For browser-based private applications, we follow the exact same pattern as a public application and issue a JWT as a means to track the session. App administrators get the additional benefit of being able to do <a href="https://www.bing.com/ck/a?!&amp;&amp;p=034518a2a9cf39217e3915ed984384030a9abdb4123d9e9e96cf917622fcd122JmltdHM9MTc0MDcwMDgwMA&amp;ptn=3&amp;ver=2&amp;hsh=4&amp;fclid=25d5373c-34a7-676d-2f67-229d35ee66b4&amp;psq=cloudflare+access+jwt+validation&amp;u=a1aHR0cHM6Ly9kZXZlbG9wZXJzLmNsb3VkZmxhcmUuY29tL2Nsb3VkZmxhcmUtb25lL2lkZW50aXR5L2F1dGhvcml6YXRpb24tY29va2llL3ZhbGlkYXRpbmctanNvbi8&amp;ntb=1"><u>JWT validation</u></a> for these apps as well. Non-browser based applications required adding a new per-application session to Gateway’s firewall. These application sessions are bound to a specific device and track the next time a user has to authenticate before accessing the application.</p>
          <figure>
          <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/20A2Xu4A9i66sKBB5JMFcy/c856a90127a540608d92a9d139b67515/13.png" />
          </figure>
    <div>
      <h4>Access private applications</h4>
      <a href="#access-private-applications">
        
      </a>
    </div>
    <p>Once we solved application awareness and session management in Gateway’s firewall, we could extend Access to support private IP address- and hostname-defined applications. Administrators can now directly define Access applications using private IP addresses and hostnames:</p>
          <figure>
          <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1lbk2iY0Nxp83UYPKjqT9r/6a473d16691d49e9fa6c24b7483c9f29/14.png" />
          </figure><p>You can see that private hostname and private IP address are now configuration options when defining an Access application.</p><p>If it is a non-HTTPS application (whether HTTP or non-browser), the user will receive a client pop-up prompting a re-authentication:</p>
          <figure>
          <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5MODs8OeSp1zarNyfSybRs/c0625e682c94be2076769bf45516f443/15.png" />
          </figure><p>HTTPS applications will behave exactly the same as an Access application with a public hostname. The user will be prompted to log in via single sign-on, and then a JWT will be issued to that specific domain.</p>
          <figure>
          <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2JKV68fl0w38N7G3CbIx3S/12c2fb6911938fae28e8dee8cf3518b5/16.png" />
          </figure><p>Then we see a JWT issued to the application itself.</p>
          <figure>
          <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3pjbbZZatyS5vTg9LBxwyA/8ae31cbbff12494508c686fbd2a60f99/17.png" />
          </figure>
    <div>
      <h3>Introducing Reusable Policies</h3>
      <a href="#introducing-reusable-policies">
        
      </a>
    </div>
    <p>As part of this work, we were able to address another long-standing pain point in Access —– managing policies across multiple applications was a time-consuming and error-prone process. Policies were nested objects under individual applications, requiring administrators to either rely heavily on Access Groups or repeat identical configurations for each application. </p>
          <figure>
          <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5VXOFmgC6ckvmnIaGY8kLL/50ce63a57b6f59625f8a0277f59a3153/18.png" />
          </figure><p>With <b>Reusable Policies</b>, administrators can now create standardized policies — such as high, medium, or low risk — and assign them across multiple applications. A single change to a reusable policy will propagate to all associated applications, significantly simplifying management. With this new capability, we anticipate that many of our customers will be able to move from managing hundreds of access policies to a small handful. We’ve also renamed "Access Groups" to "Rule Groups," aligning with their actual function and reducing confusion with identity provider (IdP) groups.</p>
    <div>
      <h3>A redesigned user interface</h3>
      <a href="#a-redesigned-user-interface">
        
      </a>
    </div>
    <p>Alongside these functional updates, we’ve launched a significant UI refresh based on years of user feedback. The new interface offers more information at a glance and provides consistent, intuitive workflows for defining and managing applications. </p>
    <div>
      <h3>Looking ahead</h3>
      <a href="#looking-ahead">
        
      </a>
    </div>
    <p>While today’s release is a major step forward, there’s more to come. Currently, private hostname support is limited to port 443 with TLS inspection enabled. Later in 2025, we plan to extend support to arbitrary private hostnames on any port and protocol, further broadening Access’s capabilities.</p>
    <div>
      <h3>Get started today</h3>
      <a href="#get-started-today">
        
      </a>
    </div>
    <p>These new Access features are live and ready for you to explore. If you haven’t yet started modernizing remote access at your organization, <a href="https://dash.cloudflare.com/sign-up/teams"><u>sign up for a free account</u></a> to test it out. Whether you’re <a href="https://developers.cloudflare.com/cloudflare-one/applications/non-http/self-hosted-private-app/"><u>securing private resources</u></a> or <a href="https://developers.cloudflare.com/cloudflare-one/policies/access/policy-management/"><u>simplifying policy management</u></a>, we’re excited to see how these updates enhance your Zero Trust journey. As always, we’re here to help — reach out to your account team with any questions or feedback.</p>
    <div>
      <h3>Watch on Cloudflare TV</h3>
      <a href="#watch-on-cloudflare-tv">
        
      </a>
    </div>
    <div>
  
</div><p></p> ]]></content:encoded>
            <category><![CDATA[Security Week]]></category>
            <category><![CDATA[Cloudflare Access]]></category>
            <category><![CDATA[Cloudflare One]]></category>
            <category><![CDATA[Cloudflare Zero Trust]]></category>
            <guid isPermaLink="false">53DTUki2fBvLXzudP66p2M</guid>
            <dc:creator>Kenny Johnson</dc:creator>
            <dc:creator>Eduardo Gomes</dc:creator>
        </item>
        <item>
            <title><![CDATA[Introducing SSH command logging]]></title>
            <link>https://blog.cloudflare.com/ssh-command-logging/</link>
            <pubDate>Fri, 18 Mar 2022 13:00:36 GMT</pubDate>
            <description><![CDATA[ We built SSH command logging into Cloudflare Zero Trust to provide SSH visibility at a network layer instead of relying on software on individual machines ]]></description>
            <content:encoded><![CDATA[ <p></p><p><a href="https://www.cloudflare.com/learning/access-management/what-is-ssh/">SSH (Secure Shell Protocol)</a> is an important protocol for managing remote machines. It provides a way for infrastructure teams to remotely and securely manage their fleet of machines. SSH was a step-up in security from other protocols like telnet. It ensures encrypted traffic and enforces per user controls over access to a particular machine. However, it can still introduce a significant security risk. SSH, especially root access, is destructive in the wrong hands (think <code>rm -r *</code>) and can be difficult to track. Logging and securing user actions via SSH typically requires custom development or restrictive software deployments. We’re excited to announce SSH command logging as part of Cloudflare Zero Trust.</p>
    <div>
      <h3>Securing SSH access</h3>
      <a href="#securing-ssh-access">
        
      </a>
    </div>
    <p>Security teams put significant effort into securing SSH across their organization because of the negative impact it can have in the wrong hands. Traditional SSH security consists of strong authentication, like certificate based authentication, and tight controls on who has “root” access. Additionally, VPNs and IP allow lists are used to further protect a machine from being publicly accessible to the Internet. The security challenges that remain are visibility and <a href="https://www.cloudflare.com/learning/security/glossary/what-is-lateral-movement/">potential for lateral movement</a>.</p><p>SSH commands to a remote machine are end-to-end encrypted, which means that it is impossible to see what is being run by a particular user on a specific machine. Typically, logs can only be captured on the machine itself in log files, and a malicious user can delete log files as easily as any other command they’re running to cover their tracks. Solutions exist to send these logs to an external logging service, but this requires installing additional software on every machine that can be accessed using SSH. <a href="https://man.openbsd.org/ssh_config#ProxyJump">ProxyJump</a>, a common way to deploy a JumpHost model, further compounds this problem because a user can easily traverse a local network of machines once they gain access to a machine in the network.</p>
    <div>
      <h3>Introducing SSH command logging</h3>
      <a href="#introducing-ssh-command-logging">
        
      </a>
    </div>
    <p>We built SSH command logging into Cloudflare Zero Trust to provide SSH visibility at a network layer instead of relying on software on individual machines. Our first customer for this capability is the Cloudflare security team. SSH command logging provides a full replay of all commands run during an SSH session, including across multiple jump-hosts or bastions. This allows for a clear picture of what happened in the event of an accident, suspected breach, or attack.</p><p>SSH command logging was built as an extension of Cloudflare’s Secure Web Gateway. The <a href="https://www.cloudflare.com/learning/access-management/what-is-a-secure-web-gateway/">Secure Web Gateway</a> already performs secure TLS inspection of all traffic from a user device. Now, it also supports SSH inspection by bootstrapping a proxy server upon new connections. Administrators are able to configure <i>network policies</i> to allow SSH access and audit the specific commands run.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3hBeFNbgv24vOQOOGmHBoG/8b8547ddb74390c46625a2d7b930c4a6/image1-75.png" />
            
            </figure><p>This then exposes that machine for SSH access and proxies all SSH commands via Cloudflare’s global edge network. All commands are automatically captured without complex logging software installed on the machine and across all hosts. TTY traffic can also be recorded for a later full session replay.</p><p>As an added measure of security, all logs captured by Cloudflare are immediately encrypted via a public key provided by each customer, to ensure that only authorized security users can inspect SSH commands. Furthermore, we are launching this feature with an opt-in FIPS 140-2 mode to support <a href="https://www.cloudflare.com/learning/privacy/what-is-fedramp/">FedRAMP compliant </a>users.</p><p>All user authentication is performed via <a href="https://developers.cloudflare.com/cloudflare-one/identity/users/short-lived-certificates/">Cloudflare Short-Lived Certificates</a>. Once the client certificate is loaded onto a user machine, their SSH setup is complete and secure. This eliminates the need for tedious and tricky SSH key-pair management. This means no more key management on end user devices, all the need is the Cloudflare root CA, and they can access any machine they are entitled to, including using ProxyJump.</p>
    <div>
      <h3>What’s next</h3>
      <a href="#whats-next">
        
      </a>
    </div>
    <p>This is only the beginning for SSH security in Cloudflare Zero Trust. In the future, we will integrate with popular <a href="https://www.cloudflare.com/learning/security/what-is-siem/">SIEM</a> tools and provide alerting for specific commands and risky behavior.</p><p>SSH command logging is in closed beta, and we will be opening this feature up to users in the coming weeks. Stay tuned for more updates when we announce general availability!</p> ]]></content:encoded>
            <category><![CDATA[Security Week]]></category>
            <category><![CDATA[SSH]]></category>
            <category><![CDATA[Product News]]></category>
            <category><![CDATA[Security]]></category>
            <category><![CDATA[Cloudflare Zero Trust]]></category>
            <category><![CDATA[Zero Trust]]></category>
            <guid isPermaLink="false">kYiLR4zOyU5gHh6jMuJOg</guid>
            <dc:creator>Ankur Aggarwal</dc:creator>
            <dc:creator>Eduardo Gomes</dc:creator>
            <dc:creator>Kenny Johnson</dc:creator>
        </item>
    </channel>
</rss>