
<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>Tue, 07 Apr 2026 08:24:22 GMT</lastBuildDate>
        <item>
            <title><![CDATA[Sad start to the new year in the Democratic Republic of the Congo]]></title>
            <link>https://blog.cloudflare.com/sad-start-to-the-new-year-in-the-congo/</link>
            <pubDate>Wed, 02 Jan 2019 22:11:56 GMT</pubDate>
            <description><![CDATA[ The calendar has barely flipped to 2019 and already we’re seeing Internet disruptions. Today, Cloudflare can quantitatively confirm that Internet access has been shut down in the Democratic Republic of the Congo, information already reported by many press organisations. ]]></description>
            <content:encoded><![CDATA[ <p>The calendar has barely flipped to 2019 and already we’re seeing Internet disruptions.</p><p>Today, Cloudflare can quantitatively confirm that Internet access has been shut down in the Democratic Republic of the Congo, information already reported by <a href="https://www.cnn.com/2019/01/02/africa/congo-internet-shutdown-china-intl/index.html">many</a> <a href="https://www.bbc.co.uk/news/world-africa-46721168">press</a> <a href="https://www.france24.com/en/20190101-western-powers-urge-dr-congo-restore-internet-access">organisations</a>. This shutdown occurred as the presidential election was taking place on December the 30th, and continues as the results are published.</p><p>Sadly, this act is far from unprecedented. We have published many posts about events like this in the past, including a different post about roughly three days of <a href="/large-drop-in-traffic-from-the-democratic-republic-of-congo/">Internet disruption</a> in the Democratic Republic of the Congo less than a year ago. A painfully familiar shape can be seen on our network monitoring platform, showing that the traffic in the country is barely reaching a quarter of its typical level:</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3ROF5FinXvyDAEQ0CCTrUc/5d608c6314bbc0cab32ec43cce860ff4/Typical-Level.png" />
            
            </figure><p>Note that the graph is based on UTC and Democratic Republic of the Congo’s capital Kinshasa has the timezone of GMT+1.</p><p>The drop in bandwidth started just before midday on 31 December 2018 (around 10:30 UTC, 11:30 local time in Kinshasa). This can be clearly seen if we overlay each 24 hour day over each other:</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5V9UIffoCO9JV0X4SEIXjR/365d59c11333a0c2c41bbf4a428bf6a3/Day-over-Day-Comparison-1.png" />
            
            </figure><p>The red line is 31 December, the gray lines the previous eight days. Looking at today’s overlay bandwidth graph, we can confirm this has continued and is an abnormal behaviour.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1vAgqhbZ75w6isa2OnOaHE/8c2da6b8d0158f51110eb473416ed654/Day-over-Day-Comparison-2.png" />
            
            </figure><p>Other actors on the Internet have also been <a href="https://twitter.com/InternetIntel/status/1080465195024158720">reporting similar figures</a>. We hope that we can soon inform our readers the country is normally connected to the Internet again.</p><p>While 85 million people live in the country, very few people have internet access (6.21% according to Wikipedia’s List of countries by number of Internet users <a href="https://en.wikipedia.org/wiki/List_of_countries_by_number_of_Internet_users">page</a>). The country is also very large (2,344,858 square kms or 905,355 sq miles) and the 11th largest country in the world - around a quarter the landmass of the USA and nearly twice as big as South Africa. These facts play together and because of limited fiber deployment within the country; there are many places that still use very limited and expensive satellite Internet access. We can see in our bandwidth kgraphs that traffic to these satellite connected locations was not affected by this shutdown:</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1f6bAOHtQemHykbRToyiSR/2a15a12baa54ed1f34c152406662c690/Bandwidth-Levels.png" />
            
            </figure><p>Note that the bandwidth levels are very low and represent a very small percentage of the overall traffic into Democratic Republic of the Congo.</p><p>Comparing that graph to the one from the largest mobile provider in the country; we clearly see the distinct cutoff.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6eOOOybv6MBPfdeavWoEni/ca929b7122c2427e24eec87cbd75b70c/Distinct-Cutoff.png" />
            
            </figure>
    <div>
      <h3>Repeated across the world</h3>
      <a href="#repeated-across-the-world">
        
      </a>
    </div>
    <p>15 months ago we wrote about an outage in <a href="/the-story-of-two-outages/">Togo</a>, were we noted that this adds Togo to the list of countries like <a href="/syrian-internet-access-appears-partially-rees/">Syria</a> (twice), Iraq, Turkey, Libya, Tunisia, etc that have restricted or revoked Internet access. We have also written about unrest in <a href="/unrest-in-gabon-leads-to-internet-shutdown/">Gabon</a> (in 2016) and <a href="/will-autocrats-ever-learn-the-internet-blackout-in-gambia/">The Gambia</a> (also in 2016). In Gambia’s case, the incumbent president lost the election! In fact we wrote “<i>Rather than clamping down on the opposition by blocking the access to the Internet, it is quite possible that the blackout in Gambia may have infuriated voters and increased the vote against the president.</i>”. Let’s see what happens in Democratic Republic of the Congo.</p><p>We'll update this blog once we see changes to these traffic levels. The Congolese government <a href="https://www.reuters.com/article/us-congo-election/congo-cuts-internet-for-second-day-to-avert-chaos-before-poll-results-idUSKCN1OV1GL">says</a> they will restore internet access after election results are published on January 6th. That’s four days from now.</p>
    <div>
      <h3>Cloudflare’s Project Galileo and Athenian Project</h3>
      <a href="#cloudflares-project-galileo-and-athenian-project">
        
      </a>
    </div>
    <p>At Cloudflare, we’ll continue to do our part to try to ensure that vulnerable voices have access to the Internet. Cloudflare’s <a href="https://www.cloudflare.com/galileo/">Project Galileo</a> and <a href="https://www.cloudflare.com/athenian/">Athenian Project</a> help protect at risk websites -- such as those run by human rights organizations, journalists, and government entities reporting election results -- from being knocked offline by cyber attack.</p><p>We also support the principles for a <a href="https://contractfortheweb.org/">Contract for the Web</a>, which urge governments to commit to keeping all of the Internet available, all of the time, and Access Now’s <a href="https://www.accessnow.org/keepiton/">#KeepitOn campaign</a>. We can only hope that these efforts will yield more positive results in 2019.</p> ]]></content:encoded>
            <category><![CDATA[Freedom of Speech]]></category>
            <category><![CDATA[Africa]]></category>
            <category><![CDATA[Politics]]></category>
            <guid isPermaLink="false">55qoSYSRwORGCKUobTgWdm</guid>
            <dc:creator>Etienne Labaume</dc:creator>
            <dc:creator>Martin J Levy</dc:creator>
        </item>
        <item>
            <title><![CDATA[Additional Record Types Available with Cloudflare DNS]]></title>
            <link>https://blog.cloudflare.com/additional-record-types-available-with-cloudflare-dns/</link>
            <pubDate>Mon, 06 Aug 2018 16:45:17 GMT</pubDate>
            <description><![CDATA[ Cloudflare recently updated the authoritative DNS service to support nine new record types. Since these records are less commonly used than what we previously supported, we thought it would be a good idea to do a brief explanation of each record type and how it is used. ]]></description>
            <content:encoded><![CDATA[ <p></p><p>Photo by <a href="https://unsplash.com/@minkmingle?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit">Mink Mingle</a> / <a href="https://unsplash.com/?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit">Unsplash</a></p><p>Cloudflare recently updated the authoritative DNS service to support nine new record types. Since these records are less commonly used than what we previously supported, we thought it would be a good idea to do a brief explanation of each record type and how it is used.</p>
    <div>
      <h3>DNSKEY and DS</h3>
      <a href="#dnskey-and-ds">
        
      </a>
    </div>
    <p>DNSKEY and DS work together to allow you to enable DNSSEC on a child zone (subdomain) that you have delegated to another Nameserver. DS is useful if you are delegating DNS (through an NS record) for a child to a separate system and want to keep using DNSSEC for that child zone; without a DS entry in the parent, the child data will not be validated. We’ve blogged about the details of <a href="/introducing-universal-dnssec/">Cloudflare’s DNSSEC</a> <a href="/tag/dnssec/">implementation</a> and <a href="/bgp-leaks-and-crypto-currencies/">why it is important</a> in the past, and this new feature allows for more flexible adoption for customers who need to delegate subdomains.</p>
    <div>
      <h3>Certificate Related Record Types</h3>
      <a href="#certificate-related-record-types">
        
      </a>
    </div>
    <p>Today, there is no way to restrict which <a href="https://www.cloudflare.com/application-services/products/ssl/">TLS (SSL) certificates</a> are trusted to be served for a host. For example if an attacker were able to maliciously generate an SSL certificate for a host, they could use a on-path attacker attack to appear as the original site. With SSHFP, TLSA, SMIMEA, and CERT, a website owner can configure the exact certificate public key that is allowed to be used on the domain, stored inside the DNS and secured with DNSSEC, reducing the risk of these kinds of attacks working.</p><p><b>It is critically important that if you rely on these types of records that you enable and configure DNSSEC for your domain.</b></p>
    <div>
      <h4><a href="https://tools.ietf.org/html/rfc4255">SSHFP</a></h4>
      <a href="#">
        
      </a>
    </div>
    <p>This type of record is an answer to the question “When I’m connecting via SSH to this remote machine, it’s authenticating me, but how do I authenticate it?” If you’re the only person connecting to this machine, your <a href="https://www.cloudflare.com/learning/access-management/what-is-ssh/">SSH client</a> will compare the fingerprint of the public host key to the one it kept in the known_hosts file during the first connection. However across multiple machines or multiple users from an organization, you need to verify this information against a common source of trust. In essence, you need the equivalent of the authentication that a certificate authority provides by signing an HTTPS certificate, but for SSH. Although it’s possible to set certificate authorities for SSH and to have them sign public host keys, another way is to publish the fingerprint of the keys in the domain via the SSHFP record type.</p><p><b>Again, for these fingerprints to be trustworthy it is important to enable DNSSEC on your zone.</b></p><p>The SSHFP record type is similar to TLSA record. You are specifying the algorithm type, the signature type, and then the signature itself within the record for a given hostname.</p><p>If the domain and remote server have SSHFP set and you are running an SSH client (such as <a href="https://www.openbsd.org/openssh/txt/release-5.1">OpenSSH 5.1+</a>) that supports it, you can now verify the remote machine upon connection by adding the following parameters to your connection:</p><p><code>❯ ssh -o "VerifyHostKeyDNS=yes" -o "StrictHostKeyChecking=yes" [insertremoteserverhere]</code></p>
    <div>
      <h4>TLSA and SMIMEA</h4>
      <a href="#tlsa-and-smimea">
        
      </a>
    </div>
    <p>TLSA records were designed to specify which keys are allowed to be used for a given domain when connecting via TLS. They were introduced in the <a href="https://tools.ietf.org/html/rfc6698">DANE</a> specification and allow domain owners to announce which certificate can and should be used for specific purposes for the domain. While most major browsers do not support TLSA, it may still be valuable for non browser specific applications and services.</p><p>For example, I’ve set a TLSA record for the domain hasvickygoneonholiday.com for TCP traffic over port 443. There are a number of ways to generate the record, but the easiest is likely through <a href="https://www.huque.com/bin/gen_tlsa">Shumon Huque’s tool</a>.</p><p>For most of the examples in this post we will be using <a href="https://www.knot-dns.cz/docs/2.6/html/man_kdig.html">kdig</a> rather than the ubiquitous dig. Generally preinstalled dig versions can be old and may not handle newer record types well. If your queries do not quite match up, you should either upgrade your version of dig or install knot.</p>
            <pre><code>;; -&gt;&gt;HEADER&lt;&lt;- opcode: QUERY; status: NOERROR; id: 2218
;; Flags: qr rd ra ad; QUERY: 1; ANSWER: 2; AUTHORITY: 0; ADDITIONAL: 1

;; QUESTION SECTION:
;; _443._tcp.hasvickygoneonholiday.com. 	IN	TLSA

;; ANSWER SECTION:
_443._tcp.hasvickygoneonholiday.com. 300	IN	TLSA	3 1 1 4E48ED671DFCDF6CBF55E52DBC8B9C9CC21121BD149BC24849D1398DA56FB242
_443._tcp.hasvickygoneonholiday.com. 300	IN	RRSIG	TLSA 13 4 300 20180803233834 20180801213834 35273 hasvickygoneonholiday.com. JvC9mZLfuAyEHZUZdq4n8kyRbF09vwgx4c1fas24Ag925LILr1armjHbr7ZTp8ycS/Go3y3lgyYCuBeW/vT/3w==

;; Received 232 B
;; Time 2018-08-02 15:38:34 PDT
;; From 192.168.1.1@53(UDP) in 28.5 ms</code></pre>
            <p>From the above request and response, we can see that a) the response for the zone is secured and signed with DNSSEC (Flag: <i><b>ad</b></i>) and that I should be verifying a certificate with the public key (3 <i><b>1</b></i> 1) SHA256 hash (3 1 <i><b>1</b></i>) of 4E48ED671DFCDF6CBF55E52DBC8B9C9CC21121BD149BC24849D1398DA56FB242. We can use openssl (v1.1.x or higher) to verify the results:</p>
            <pre><code>❯ openssl s_client  -connect hasvickygoneonholiday.com:443 -dane_tlsa_domain "hasvickygoneonholiday.com" -dane_tlsa_rrdata "
3 1 1 4e48ed671dfcdf6cbf55e52dbc8b9c9cc21121bd149bc24849d1398da56fb242"
CONNECTED(00000003)
depth=0 C = US, ST = CA, L = San Francisco, O = "CloudFlare, Inc.", CN = hasvickygoneonholiday.com
verify return:1
---
Certificate chain
 0 s:/C=US/ST=CA/L=San Francisco/O=CloudFlare, Inc./CN=hasvickygoneonholiday.com
   i:/C=US/ST=CA/L=San Francisco/O=CloudFlare, Inc./CN=CloudFlare Inc ECC CA-2
 1 s:/C=US/ST=CA/L=San Francisco/O=CloudFlare, Inc./CN=CloudFlare Inc ECC CA-2
   i:/C=IE/O=Baltimore/OU=CyberTrust/CN=Baltimore CyberTrust Root
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIE7jCCBJSgAwIBAgIQB9z9WxnovNf/lt2Lkrfq+DAKBggqhkjOPQQDAjBvMQsw
...
---
SSL handshake has read 2666 bytes and written 295 bytes
Verification: OK
Verified peername: hasvickygoneonholiday.com
DANE TLSA 3 1 1 ...149bc24849d1398da56fb242 matched EE certificate at depth 0</code></pre>
            <p><a href="https://tools.ietf.org/html/rfc8162">SMIMEA</a> records function similar to TLSA but are specific to email addresses. The domain for these records should be prefixed by “_smimecert.” and specific formatting is required to attach a SMIMEA record to an email address. The local-part (username) of the email address must be treated in a specific format and SHA-256 hashed as detailed in the RFC. From the RFC example: “ For example, to request an SMIMEA resource record for a user whose email address is "<a>hugh@example.com</a>", an SMIMEA query would be placed for the following QNAME: <code>c93f1e400f26708f98cb19d936620da35eec8f72e57f9eec01c1afd6._smimecert.example.com</code></p>
    <div>
      <h4><a href="https://tools.ietf.org/html/rfc4398">CERT</a></h4>
      <a href="#">
        
      </a>
    </div>
    <p>CERT records are used for generically storing certificates within DNS and are most commonly used by systems for email encryption. To create a CERT record, you must specify the certificate type, the key tag, the algorithm, and then the certificate, which is either the certificate itself, the CRL, a URL of the certificate, or fingerprint and a URL.</p>
    <div>
      <h3>Other Newly Supported Record Types</h3>
      <a href="#other-newly-supported-record-types">
        
      </a>
    </div>
    
    <div>
      <h4>PTR</h4>
      <a href="#ptr">
        
      </a>
    </div>
    <p>PTR (Pointer) records are pointers to canonical names. They are similar to CNAME in structure, meaning they only contain one FQDN (fully qualified domain name) but the RFC dictates that subsequent lookups are not done for PTR records, the value should just be returned back to the requestor. This is different to a CNAME where a recursive resolver would follow the target of the canonical name. The most common use of a PTR record is in reverse DNS, where you can look up which domains are meant to exist at a given IP address. These are useful for outbound mailservers as well as authoritative DNS servers.</p><p>It is only possible to delegate the authority for IP addresses that you own from your Regional Internet Registry (RIR). Creating reverse zones and PTR records for IPs that you can not (or do not) delegate does not serve any practical purpose.</p><p>For example, looking up the A record for marek.ns.cloudflare.com gives us the IP of 173.245.59.202.</p>
            <pre><code>❯ kdig a marek.ns.cloudflare.com +short
173.245.59.202</code></pre>
            <p>Now imagine we want to know if the owner of this IP ‘authorizes’ <code>marek.ns.cloudflare.com</code> to point to it. Reverse Zones are specifically crafted child zones within <code>in-addr.arpa.</code> (for IPv4) and <code>ip6.arpa.</code> (for IPv6) whom are delegated via the Regional Internet Registries to the owners of the IP address space. That is to say if you own a /24 from ARIN, ARIN will delegate the reverse zone space for your /24 to you to control. The IPv4 address is represented inverted as the subdomain in in-addr.arpa. Since Cloudflare owns the IP, we’ve delegated the reverse zone and created a PTR there.</p>
            <pre><code>❯ kdig -x 173.245.59.202
;; -&gt;&gt;HEADER&lt;&lt;- opcode: QUERY; status: NOERROR; id: 18658
;; Flags: qr rd ra; QUERY: 1; ANSWER: 1; AUTHORITY: 0; ADDITIONAL: 0

;; QUESTION SECTION:
;; 202.59.245.173.in-addr.arpa.		IN	PTR

;; ANSWER SECTION:
202.59.245.173.in-addr.arpa.	1222	IN	PTR	marek.ns.cloudflare.com.</code></pre>
            <p>For completeness, here is the +trace for the 202.59.245.173.in-addr.arpa zone. We can see that the /24 59.245.173.in-addr.arpa has been delegated to Cloudflare from ARIN:</p>
            <pre><code>❯ dig 202.59.245.173.in-addr.arpa +trace

; &lt;&lt;&gt;&gt; DiG 9.8.3-P1 &lt;&lt;&gt;&gt; 202.59.245.173.in-addr.arpa +trace
;; global options: +cmd
.			48419	IN	NS	a.root-servers.net.
.			48419	IN	NS	b.root-servers.net.
.			48419	IN	NS	c.root-servers.net.
.			48419	IN	NS	d.root-servers.net.
.			48419	IN	NS	e.root-servers.net.
.			48419	IN	NS	f.root-servers.net.
.			48419	IN	NS	g.root-servers.net.
.			48419	IN	NS	h.root-servers.net.
.			48419	IN	NS	i.root-servers.net.
.			48419	IN	NS	j.root-servers.net.
.			48419	IN	NS	k.root-servers.net.
.			48419	IN	NS	l.root-servers.net.
.			48419	IN	NS	m.root-servers.net.
;; Received 228 bytes from 2001:4860:4860::8888#53(2001:4860:4860::8888) in 25 ms

in-addr.arpa.		172800	IN	NS	e.in-addr-servers.arpa.
in-addr.arpa.		172800	IN	NS	d.in-addr-servers.arpa.
in-addr.arpa.		172800	IN	NS	b.in-addr-servers.arpa.
in-addr.arpa.		172800	IN	NS	f.in-addr-servers.arpa.
in-addr.arpa.		172800	IN	NS	c.in-addr-servers.arpa.
in-addr.arpa.		172800	IN	NS	a.in-addr-servers.arpa.
;; Received 421 bytes from 192.36.148.17#53(192.36.148.17) in 8 ms

173.in-addr.arpa.	86400	IN	NS	u.arin.net.
173.in-addr.arpa.	86400	IN	NS	arin.authdns.ripe.net.
173.in-addr.arpa.	86400	IN	NS	z.arin.net.
173.in-addr.arpa.	86400	IN	NS	r.arin.net.
173.in-addr.arpa.	86400	IN	NS	x.arin.net.
173.in-addr.arpa.	86400	IN	NS	y.arin.net.
;; Received 165 bytes from 199.180.182.53#53(199.180.182.53) in 300 ms

59.245.173.in-addr.arpa. 86400	IN	NS	ns1.cloudflare.com.
59.245.173.in-addr.arpa. 86400	IN	NS	ns2.cloudflare.com.
;; Received 95 bytes from 2001:500:13::63#53(2001:500:13::63) in 188 ms</code></pre>
            
    <div>
      <h4><a href="https://tools.ietf.org/html/rfc2915">NAPTR</a></h4>
      <a href="#">
        
      </a>
    </div>
    <p>Naming Authority Pointer Records are used in conjunction with SRV records, generally as a part of the SIP protocol. NAPTR records point to domains to specific services, if available for that domain. <a href="http://twitter.com/anders94">Anders Brownworth</a> has an excellent description in detail on his <a href="https://anders.com/cms/264/">blog</a>. The start of his example, with his permission:</p><blockquote><p>Let’s consider a call to <a>2125551212@example.com</a>. Given only this address though, we don't know what IP address, port or protocol to send this call to. We don't even know if example.com supports SIP or some other VoIP protocol like H.323 or IAX2. I'm implying that we're interested in placing a call to this URL but if no VoIP service is supported, we could just as easily fall back to emailing this user instead. To find out, we start with a NAPTR record lookup for the domain we were given:</p></blockquote>
            <pre><code>#host -t NAPTR example.com
example.com NAPTR 10 100 "S" "SIP+D2U" "" _sip._udp.example.com.
example.com NAPTR 20 100 "S" "SIP+D2T" "" _sip._tcp.example.com.
example.com NAPTR 30 100 "S" "E2U+email" "!^.*$!mailto:info@example.com!i" _sip._tcp.example.com.</code></pre>
            <blockquote><p>Here we find that example.com gives us three ways to contact example.com, the first of which is "SIP+D2U" which would imply SIP over UDP at _sip._udp.example.com.</p></blockquote>
    <div>
      <h4><a href="https://tools.ietf.org/html/rfc7553">URI</a></h4>
      <a href="#">
        
      </a>
    </div>
    <p>Uniform Resource Identifier records are commonly used as a compliment to NAPTR records and per the RFC, can be used to replace SRV records. As such, they contain a Weight and Priority field as well as Target, similar to SRV.</p><p>One use case is proposed by this <a href="https://tools.ietf.org/html/draft-mccallum-kitten-krb-service-discovery-03">draft RFC</a> is to replace SRV records with URI records for discovering Kerberos key distribution centers (KDC). It minimizes the number of requests over SRV records and allows the domain owner to specify preference for TCP or UDP.</p><p>In the below example, it specifies that we should use a KDC on TCP at the default port and UDP on port 89 should the primary connection fail.</p>
            <pre><code>❯ kdig URI _kerberos.hasvickygoneonholiday.com
;; -&gt;&gt;HEADER&lt;&lt;- opcode: QUERY; status: NOERROR; id: 8450
;; Flags: qr rd ra; QUERY: 1; ANSWER: 2; AUTHORITY: 0; ADDITIONAL: 0

;; QUESTION SECTION:
;; _kerberos.hasvickygoneonholiday.com. 	IN	URI

;; ANSWER SECTION:
_kerberos.hasvickygoneonholiday.com. 283	IN	URI	1 10 "krb5srv:m:tcp:kdc.hasbickygoneonholiday.com"
_kerberos.hasvickygoneonholiday.com. 283	IN	URI	1 20 "krb5srv:m:udp:kdc.hasbickygoneonholiday.com:89"</code></pre>
            
    <div>
      <h3>Summary</h3>
      <a href="#summary">
        
      </a>
    </div>
    <p>Cloudflare now supports CERT, DNSKEY, DS, NAPTR, PTR, SMIMEA, SSHFP, and TLSA in our authoritative DNS products. We would love to hear if you have any interesting example use cases for the new record types and what other record types we should support in the future.</p><p>Our DNS engineering teams in London and San Francisco are both hiring if you would like to contribute to the fastest authoritative and recursive DNS services in the world.</p><p><a href="https://boards.greenhouse.io/cloudflare/jobs/1213352?gh_jid=1213352">Software Engineer</a></p> ]]></content:encoded>
            <category><![CDATA[Reliability]]></category>
            <category><![CDATA[Speed & Reliability]]></category>
            <category><![CDATA[DNS]]></category>
            <category><![CDATA[DNSSEC]]></category>
            <category><![CDATA[Product News]]></category>
            <guid isPermaLink="false">4hEsGfxkUT0Q2b2B53HPel</guid>
            <dc:creator>Sergi Isasi</dc:creator>
            <dc:creator>Etienne Labaume</dc:creator>
        </item>
        <item>
            <title><![CDATA[Flexible, secure SSH with DNSSEC]]></title>
            <link>https://blog.cloudflare.com/flexible-secure-ssh-with-dnssec/</link>
            <pubDate>Wed, 13 Jan 2016 11:44:21 GMT</pubDate>
            <description><![CDATA[ If you read this blog on a regular basis, you probably use the little tool called SSH, especially its ubiquitous and most popular implementation OpenSSH. ]]></description>
            <content:encoded><![CDATA[ <p><b>UPDATE</b>: Corrected the paragraph about the permissions of the AuthorizedKeys file.</p><hr /><p>If you read this blog on a regular basis, you probably use the little tool called SSH, especially its ubiquitous and most popular implementation <a href="http://www.openssh.com/">OpenSSH</a>.</p><p>Maybe you’re savvy enough to only use it with public/private keys, and therefore protect yourself from dictionary attacks. If you do then you know that in order to configure access to a new host, you need to make a copy of a public key available to that host (usually by writing it to its disk). Managing keys can be painful if you have many hosts, especially when you need to renew one of the keys. What if DNSSEC could help?</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5Ttkx9Cc5tKfk21Xl0kY5j/4fe2e99e246e69b65e01e5462a2f539a/3923470620_d64bde94dd_z_d-1.jpg" />
            
            </figure><p><a href="https://creativecommons.org/licenses/by/2.0/">CC BY 2.0</a> <a href="https://www.flickr.com/photos/wneuheisel/3923470620">image</a> by <a href="https://www.flickr.com/photos/wneuheisel">William Neuheisel</a></p><p>With <a href="http://www.openssh.com/txt/release-6.2">version 6.2</a> of OpenSSH came a feature that allows the remote host to retrieve a public key in a customised way, instead of the typical <code>authorized_keys</code> file in the <code>~/.ssh/</code> directory. For example, you can gather the keys of a group of users that require access to a number of machines on a single server (for example, an <a href="http://serverfault.com/questions/653792/ssh-key-authentication-using-ldap">LDAP server</a>), and have all the hosts query that server when they need the public key of the user attempting to log in. This saves a lot of editing of <code>authorized_keys</code> files on each and every host. The downside is that it's necessary to trust the source these hosts retrieve public keys from. An LDAP server on a private network is probably trustworthy (when looked after properly) but for hosts running in the cloud, that’s not really practical.</p><p>DNSSEC is helpful here. That's right: now that we can verify responses from a DNS server, we can safely store public keys in DNS records!</p><p>So let's say we administer <code>example.com</code> and want to give Alice and Bob access to machines <code>foo</code>, <code>bar</code> and <code>baz</code> in that domain. We'll store their respective public keys in TXT<a href="#fn1">[1]</a> records named <code>alice_pubkey.example.com</code> and <code>bob_pubkey.example.com</code>. To be entirely accurate, it doesn’t really matter which zone these records belong to, but I’ll consider here that we only have one domain. The requirements are:</p><ul><li><p>the machines need to run OpenSSH server version 6.2 or later</p></li><li><p>they also need a DNSSEC validating resolver (we'll use <code>unbound-host</code>)</p></li><li><p>Alice and Bob's keys need to be less than 256 characters long (ECDSA or Ed25519 keys will work)</p></li><li><p>DNSSEC needs to be correctly <a href="https://support.cloudflare.com/hc/en-us/articles/209114378">set up</a> on the domain <code>example.com</code> (surprise!)</p></li></ul><p>Alice and Bob generate keys like this:</p>
            <pre><code>foo:~$ ssh-keygen -t ecdsa</code></pre>
            <p>or like this:</p>
            <pre><code>foo:~$ ssh-keygen -t ed25519</code></pre>
            <p>and then follow the instructions. They will of course <i>provide a non-empty passphrase</i>. Then they send us (or whoever administers the zone file for <code>example.com</code>) the public key file, which may look like this:</p>
            <pre><code>ssh-ed25519 AAAAC3N...VY4A= alice@foo</code></pre>
            <p>We can strip the comment <code>alice@foo</code> out of that file, and use the rest as the value to create a TXT record with the name <code>alice_pubkey</code> in the domain <code>example.com</code>. Then, retrieving the key is as easy as this:</p>
            <pre><code> foo:~$ unbound-host -t TXT alice_pubkey.example.com
 alice_pubkey.example.com has TXT record “ssh-ed25519 AAAAC3N…”</code></pre>
            <p>With <code>-v</code>, unbound-host will show us whether the signature has been verified</p>
            <pre><code>foo:~$ unbound-host -v -t TXT alice_pubkey.example.com
alice_pubkey.example.com has TXT record “ssh-ed25519 AAAAC…” (insecure)</code></pre>
            <p>With <code>-D</code>, it will actually check the signature:</p>
            <pre><code>foo:~$ unbound-host -D -v -t TXT alice_pubkey.example.com
alice_pubkey.example.com has TXT record “ssh-ed25519 AAAAC3N…” (secure)</code></pre>
            <p>If no record exists, it will show this:</p>
            <pre><code>foo:~$ unbound-host -D -v -t TXT charlie_pubkey.example.com
charlie_pubkey.example.com has no TXT record (secure)</code></pre>
            <p>Note that the absence of record is also labelled “secure”, thanks to <a href="https://www.dnssec-tools.org/wiki/index.php/NSEC">NSEC</a>.</p><p>Let’s prepare to parse that output. The <a href="http://www.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man5/sshd_config.5?query=sshd_config">sshd_config man page</a> shows that sshd needs a specific user to run the program that will retrieve public keys. This is following the best practices of privilege separation. Let's call that user <code>pubkeygrab</code> and create an account on <code>foo</code>, <code>bar</code> and <code>baz</code>, giving it just the permissions it needs to work and <i>nothing more</i>:</p>
            <pre><code>foo:~$ useradd -m -d /var/empty -s /sbin/nologin pubkeygrab</code></pre>
            <p>Then create the script <code>pubkeygrab.sh</code>, and store it on each of the machines. Obviously, we'll make sure only root can edit it:</p>
            <pre><code>foo:~$ cat /usr/local/bin/pubkeygrab.sh
#!/bin/sh

USER=$1

/usr/sbin/unbound-host -v -D -t TXT ${USER}_pubkey.example.com \\
     | /usr/bin/grep -v "no TXT record" \\
     | /usr/bin/grep ' (secure)$' \\
     | /usr/bin/sed 's/.* "\(.*\)" (secure)$/\1/'</code></pre>
            <p>Now I'm certain that a lot of readers will have something to say about the style or the efficiency of this shell script, I just wrote it that way to highlight what steps need to be taken:</p><ul><li><p>it retrieves a TXT record, and doesn't output anything if the record doesn't exist</p></li><li><p>if <code>unbound-host</code> has not confirmed that the record was correctly DNSSEC signed, it doesn't output anything</p></li><li><p>if the above is successful, it filters out the text to return only the public key</p></li><li><p>it doesn't try to do anything complex, because complexity is the enemy of security (or at least, that’s a point of view that I share with a few people)</p></li><li><p>it works with multiple records</p></li></ul><p>I'm sure you will write your own program to do the above. Just make sure it works only when you want it to. It is critical to ensure that it <i>doesn't return anything</i> at least when:</p><ul><li><p>a record for the corresponding user doesn't exist</p></li><li><p>the records are not signed or not properly signed</p></li><li><p>the local copy of the root key (<code>/var/unbound/root.key</code>, here) is corrupted.</p></li></ul><p>Bonus points to you if you find more cases.</p><p>Now that you have read the warning above, add the following to <code>/etc/ssh/sshd_config</code> on <code>foo</code>, <code>bar</code> and <code>baz</code>:</p>
            <pre><code>AuthorizedKeysCommand /usr/local/bin/pubkeygrab.sh
AuthorizedKeysCommandUser pubkeygrab</code></pre>
            <p>and restart <code>sshd</code>. Check that the users <code>alice</code> and <code>bob</code> exist on each machine too. Note that the above change will also apply to all existing users. Now you can go to your CloudFlare account, select the domain <code>example.com</code>, and create the TXT records <code>alice_pubkey</code> and <code>bob_pubkey</code>. Paste their respective public keys in the value field. Soon after, Alice and Bob can log in. Ask Charlie to try too. If the above works for Alice and Bob, but fails for Charlie, congratulations, you have turned CloudFlare into a PKI for SSH.</p><p>If you remove the TXT records, Alice and Bob’s access should be revoked, and they should be unable to login, once the TTL of the TXT record is expired. However, note that when the output of <code>pubkeygrab.sh</code> is empty, <code>sshd</code> reverts to the usual <code>AuthorizedKeysFile</code> parameter to find a public key. If Alice and Bob are cheeky and want to keep their access after you removed their TXT records, they just need to copy their public key into that file any time before you ban them. If you don't want that, make sure the <code>AuthorizedKeysFile</code> parameter points to a place Alice and Bob can't write to.</p><p>I hope this is showing how interesting DNSSEC can be, and that we have more news on this topic soon.</p><hr /><ol><li><p>Yes, it would be better to have a dedicated record, instead of overloading TXT records. <a href="#fnref1">↩︎</a></p></li></ol> ]]></content:encoded>
            <category><![CDATA[DNSSEC]]></category>
            <category><![CDATA[DNS]]></category>
            <category><![CDATA[Reliability]]></category>
            <guid isPermaLink="false">57Me2vjBS226E4c3ylZhGL</guid>
            <dc:creator>Etienne Labaume</dc:creator>
        </item>
    </channel>
</rss>