可能导致互联网崩溃的三个协议(以及我们所知的世界):DNS、PKI 和 BGP

本文讨论了互联网的三个关键协议:DNS、PKI 和 BGP,这些协议中的任何一个出现问题都可能导致互联网瘫痪。

可能让互联网(以及我们所知的生活)崩溃的三个协议:DNS、PKI 和 BGP

在希思罗机场关闭一天后,很多人都在谈论我们关键国家基础设施的弹性,其中最重要的部分之一就是互联网。过去,我们使用专线来增加通信基础设施的弹性,但现在,我们都使用互联网来提供一种可靠且廉价的通信方式。没有它,世界上任何地方都不会有飞机起飞,我们的现代生活将会比 COVID-19 停滞得更严重。事实上,如果不是因为互联网,COVID-19 对世界的影响将会非常巨大。所以想象一下,如果整个互联网瞬间关闭会怎样!

对于一个原本设想为完全分布式的互连机器网络,能够抵御攻击的东西来说,互联网离这个目标还差很远。基本上,它是用 20 世纪 80 年代创建的“旧”协议创建的,那时大型机和小型计算机统治着计算世界。自最初在 RFC(Request for Comments)中起草以来,IP 协议 (RFC 791)、TCP 协议 (RFC 792)、HTTP、DNS 等协议几乎没有改变。事实上,HTTP 协议一直在努力超越 1.0 版本。

因此,网络安全专业人士知道有三个根本性的弱点可能会立即摧毁整个基础设施。它们是 DNS(域名系统)、PKI(公钥基础设施)和 BGP(边界网关协议)。

DNS

因此,我们的互联网协议存在一些需要修复的缺陷。但是,对于提供运行互联网的核心服务:DNS(域名服务)的东西来说,“刚刚好”的安全性是否足够?最大的威胁之一是 DNS 缓存中毒,在这种情况下,恶意主机可以为网络的其余部分播种不正确的域名。DNSSEC 通过拥有一个受保护的区域来克服这个问题,该区域中的所有响应都经过数字签名。然后,DNS 解析可以检查 DNS 信息是否已由受信任的主机之一签名。

摧毁互联网

针对核心 DNS 基础设施的大规模分布式拒绝服务 (DDoS) 攻击将会瘫痪大部分互联网,因为我们非常依赖 DNS 服务器来解析 IP 地址。如果核心无法工作,其余的基础设施将会崩溃。而且,在任何时候,我们的 DNS 基础设施都可能被恶意利用。

DNS 是一个糟糕的协议。它依赖于一台 DNS 服务器告诉其他服务器域名的 IP 解析是什么。但是,你能信任谁来播种这个信息呢?嗯,域名的主要授权机构。我们不必集成主要授权机构,因为域名上的信息将会通过互联网传播。那么,如果一个恶意实体看到了错误的 IP 地址会发生什么?假设一个民族国家——超级大都会——想要接管一个小国——迷你大都会。那么,他们首先可能会专注于毒害世界各地的 DNS 缓存,以便所有迷你大都会的域名都指向超级大都会的站点。

域名系统安全扩展(DNSSEC)

DNS 的问题在于,它实际上没有内置任何真正的安全性,并且可以很容易地设置一个虚假的 DNS 系统,并将用户重定向到不正确的站点。但是,有一个解决方案……域名系统安全扩展DNSSEC)。它提供 DNS 数据的来源身份验证以及数据完整性。它不会阻止某人查看请求和回复中的数据。与 DNS 相关的问题已经存在一段时间了 [here]:

威胁包括:数据包拦截;ID 猜测和查询预测;名称链接;受信任服务器的背叛;拒绝服务;经过身份验证的域名拒绝;和通配符。最大的威胁之一是 DNS 缓存中毒,在这种情况下,恶意主机可以为网络的其余部分播种不正确的域名。DNSSEC 通过拥有一个受保护的区域来克服这个问题,该区域中的所有响应都经过数字签名。然后,DNS 解析可以检查 DNS 信息是否已由受信任的主机之一签名。

DNS 通过创建一个域名记录来工作,该记录定义了一个 SOA(授权起始)。然后,它定义了序列号、刷新时间等等:

在此之中,我们可以定义一个 NS(名称服务器)和 MX(邮件服务器),以及域名中已定义主机的 IP 地址。我们可以使用 nslookup 来查询条目:

应该注意的是,DNSSEC 不提供数据的机密性,也不防御拒绝服务攻击。

编码

一些 Go 语言的编码 [here]。有了这个,我们将创建一个 2,048 位的 RSA 密钥对(一个公钥和一个私钥),然后使用受信任域的私钥对 SOA 进行签名。然后,其他人可以使用受信任域的公钥来检查签名。SOA 条目像在 DNS 中一样创建,带有域名和 IP 地址的响应标头 (dns.ClassINET):

序列号在 SOA 中很重要,因为它定义了条目的最新版本。在本例中,签名是用 RSA 加密的 SHA-256 哈希创建的。我们还包括签名的到期时间。该签名由密钥中定义的实体签名 (key.Hdr.Name) [here]:

package main
import (
    "crypto"
    "crypto/rsa"
    "github.com/miekg/dns"
    "fmt"
    "os"
)
func main() {
    domain:="asecuritysite.com"
    argCount := len(os.Args[1:])
        if (argCount>0) {domain= string(os.Args[1])}
    domain = domain+"."
    key := new(dns.DNSKEY)
    key.Hdr.Name = domain
    key.Hdr.Rrtype = dns.TypeDNSKEY
    key.Hdr.Class = dns.ClassINET
    key.Hdr.Ttl = 3600
    key.Flags = 256
    key.Protocol = 3
    key.Algorithm = dns.RSASHA256
    priv, _ := key.Generate(2048)
    soa := new(dns.SOA)
    soa.Hdr = dns.RR_Header{domain, dns.TypeSOA,dns.ClassINET, 14400, 0}
    soa.Ns = "ns."+domain
    soa.Mbox = "mail."+domain
    soa.Serial = 1293945905
    soa.Refresh = 14400
    soa.Retry = 3600
    soa.Expire = 604800
    soa.Minttl = 86400
    sig := new(dns.RRSIG)
    sig.Hdr = dns.RR_Header{domain, dns.TypeRRSIG, dns.ClassINET, 14400, 0}
    sig.TypeCovered = dns.TypeSOA
    sig.Algorithm = dns.RSASHA256
    sig.Labels = 2
    sig.Expiration = 1562761057
    sig.Inception = 1562761057
    sig.OrigTtl = soa.Hdr.Ttl
    sig.KeyTag = key.KeyTag()
    sig.SignerName = key.Hdr.Name
    var pr crypto.Signer
    pr,_= newSignerFromKey(priv)
    if err := sig.Sign(pr, []dns.RR{soa}); err != nil {
        fmt.Printf("Failed to sign")
        return
    }
    if err := sig.Verify(key, []dns.RR{soa}); err != nil {
        fmt.Printf("Failed to verify")
    } else {
        fmt.Printf("Signature okay\n\n")
    }
    fmt.Printf("SOA: %s\n\n",soa)
    fmt.Printf("Sig: %s\n\n",sig)
    fmt.Printf("Key: %s\n\n",key)

}
type rsaPrivateKey struct {
    *rsa.PrivateKey
}
func newSignerFromKey(k interface{}) (crypto.Signer, error) {
    var sshKey crypto.Signer
    switch t := k.(type) {
    case *rsa.PrivateKey:
        sshKey = &rsaPrivateKey{t}
    default:
        return nil, fmt.Errorf("ssh: unsupported key type %T", k)
    }
    return sshKey, nil
}

“asecuritysite.com.”消息的示例运行是 [here]:

Signature okay

SOA: asecuritysite.com. 14400   IN  SOA ns.asecuritysite.com. mail.asecuritysite.com. 1293945905 14400 3600 604800 86400

Sig: asecuritysite.com. 14400   IN  RRSIG   SOA 8 2 14400 20190710121737 20190710121737 42450 asecuritysite.com. NqFhFsl
EHFtETdO1cWFKhMyWydiTDpGkWKQggzgbzVGa9COBQDrFS+NRsVEQEpIee3EMJ/hY6RXpmo75ZxWO7OO4FfIBbl2qgZctewmutFy+HT4GUFA3dJp9rzfr2Jn
0lnCCOkLIW33zHgXgSXmKJobWXPsHTPQoUogjdxmPzbzWFd6S1XXPep4klyi1hbcM9uvnABtFGw5tb/rd7hs6B/hS9spoO5MHZqDczmAKEoW1XKht12G97Qc
Qz3nyyGlRScntbHNXk3xaD3Xzevu9SWhZ4Ro2xFvIWxdFkLWCv2wZkcwHIG9q7zFE5HglZhip+q8EKzfZV1PQn8AOVf16dA==
Key: asecuritysite.com. 3600    IN  DNSKEY  256 3 8 AwEAAdcn7cvHVXBvDQVsh6ge+JHZWTCn4WarBbWzQ1TGKMpk/pT9L386Q2ZU1fvynYdp
eqQi4PKbRpavycjqMFBtJvg9qhHpXq25iSpdx1+aNHL8zyvx/eFFTAWHA8qN3uQuVKc5mm+KQ498poWd1dnYBNHRcNGgZA8epNsq+WSoLzRISIxgiFDs6j+k
ryO4ivj7n8dLOqqcv9C/tQl/7YhU4y3lHSek9FqFOCpYK4DzQb+jJuLKNWjAPobWF19JkrvcN0KeDZ2TZEeApz3UGtjsRMowH4AJ48yKyaT2vnmE52MwIiC1
/yHLtQJK77CMgow3BejXO2T9uytp+rTQyZk8Ens=

PKI(公钥基础设施)

如果 DNS 还不够糟糕,那么对 PKI 的一次调整几乎会摧毁每个系统。有了这个,我们用它的公钥来识别一个实体,并且它将通过用其关联的私钥对一些数据的哈希值进行签名来证明它的身份。但是我们必须确保我们信任我们收到的公钥,因此我们将公钥封装到数字证书中,然后用受信任的授权机构的私钥对其进行签名。如果我们信任该授权机构,那么我们将信任数字证书中的公钥。

为此,我们有根 CA(证书颁发机构)和中间 CA。根 CA 具有允许中间 CA 在给定区域内对证书进行签名的信任,例如用于 TLS 连接、硬件设备和加密磁盘。然后,这些授权机构的公钥存储在计算机上,这是检查证书有效性所必需的。在这种情况下,Bob 让 Trent Jr 为他的公钥签名,然后 Bob 将带有他的公钥的签名证书传递给 Alice。然后,她使用 Trent Jr 的公钥检查这一点,如果验证通过,她就可以信任 Bob 的公钥。然后,他可以为他的身份进行数字签名:

总的来说,这里根本需要根 CA,因为如果 Trent Jr 不受 Trent 信任,那么 Trent Jr 的证书将无效。因此,Internet 的整个纸牌屋可能会倒塌,要么是对根 CA 私钥的重大入侵,要么是对手发送对根 CA 的撤销请求。然后,世界各地的机器将不信任任何证书,并且将无法连接到服务,因为它们无法信任这些证书。

BGP(边界网关协议)

现在,别让我开始说 BGP 这个灾难了。它长期以来一直导致整个域名长时间瘫痪,例如导致 Facebook 离线一整天。但是,我们很幸运,它并没有导致整个域名离线一天,而是可能导致整个互联网长时间离线。没有运输、没有能源供应、没有食物供应等等。

因此,互联网并不是 DARPA 试图创建的大规模分布式网络,它可以承受对任何部分的核打击。它的核心是由路由设备和中心化互联网服务组成的中心化基础设施。它使用的协议基本上就是我们从哑终端连接到大型计算机时起草的协议。总的来说,其核心基础设施中的一个小故障可能会导致整个系统崩溃。然后,如果你无法连接到网络,你通常会很难修复它。有点像试图修理你的车,当你把自己锁在外面,却没有钥匙进去的时候。

由于 BGP 仍然提供互联网核心的很大一部分,因此它的任何问题都会导致大规模中断。最近,由于 BGP 配置错误,Facebook 将自己从互联网上移除,并且多次发生互联网流量被“诱骗”通过在隐私方面没有良好记录的国家的路线。

BGP 在互联网上进行核心路由,并通过定义自治系统 (AS) 来工作。AS 使用 ASN(自治系统号)来标识,并保存路由表,这些路由表允许 AS 在彼此之间传递数据包,从而在它们之间进行路由。因此,Facebook AS 可以向其他 AS 宣告它的存在,并且数据包可以路由到它们。当 Facebook 中断时,Facebook AS 未能宣告其存在。然后,每个 AS 定义了它们可以到达的网络范围。Facebook 的 ASN 是 AS32935,覆盖大约 270,000 个 IP 地址范围 [here]。

什么是 BGP?

近代史上两种主要的域间路由协议是 EGP(外部网关协议)和 BGP(边界网关协议)。EGP 存在一些局限性,其主要局限性在于它将互联网视为树状结构,如图 1 所示。这假设互联网的结构由具有单个骨干的父节点和子节点组成。互联网更典型的拓扑结构如图 2 所示。BGP 现在是最广泛接受的外部路由协议之一,并且已在很大程度上取代了 EGP。

图 1:单骨干网 — 树状拓扑

图 2:多骨干网

BGP 是对 EGP 的改进(BGP 的第四个版本被称为 BGP-4),并在 RFC1772 中定义。不幸的是,它比 EGP 更复杂,但不如 OSPF 复杂。BGP 假设互联网由任意互连的节点集组成。然后,它假设互联网连接到许多 AAN(自治连接网络),如图 3 所示,这些网络在组织、互联网服务提供商等周围创建边界。然后,它假设一旦它们进入 AAN,数据包将被正确路由。

图 3:自治连接网络

大多数路由算法尝试找到通过网络的最快方式,而 BGP 尝试找到通过网络的任何路径。因此,主要目标是可达性,而不是到目的地的跳数。因此,找到一个几乎最佳的路径是一个很好的成就。AAN 管理员选择至少一个节点作为 BGP 发言人,以及一个或多个边界网关。这些网关只是将数据包路由到 AAN 和从 AAN 路由。边界网关是数据包到达 AAN 的路由器。

AAN 上的发言人将其可达性信息广播到其 AAN 中的所有网络。此信息仅说明是否可以到达目标 AAN;它没有描述任何其他指标。重要的一点是,BGP 不是距离向量或链路状态协议,因为它传输完整的路由信息而不是部分信息。

BGP 更新数据包还包含有关无法到达的路由(撤回的路由)的信息,并且 BGP-4 更新数据包的内容是:

  • 不可行路由长度(2 个字节)。
  • 撤回的路由(可变长度)。
  • 总路径属性长度(2 个字节)。
  • 路径属性(可变长度)。
  • 网络层可达性信息(可变长度)。这可以包含额外的信息,例如“优先使用 AAN 1 而不是 AAN 2”。

AS 中的路由器共享类似的路由策略,因此作为一个单一的管理单元运行。AS 之外的所有路由器都将 AS 视为一个单一单元。AS 识别号由 Internet Assigned Numbers Authority (IANA) 分配,范围为 1 到 65,535,其中 64,512 到 65,535 保留供私有使用。私有号码仅在私有域中使用,并且在离开域时必须转换为注册号码。

BGP 和路由环路

BGP 使用端口 179 上的 TCP 段来发送路由信息(而 RIP 使用端口 520)。BGP 通过基于在邻居之间交换信息提供的信息构建自治系统图来克服路由环路。因此,它可以构建整个互连 AS 的更广泛的图片。在邻居之间发送保持活动消息,这允许图形保持最新。

单宿主系统

只有一个出口点的 AS 被定义为单宿主系统,并且通常被称为存根网络。这些存根可以使用默认路由来处理所有目标为非本地网络的网络流量。

AS 可以使用三种方法,以便外部世界可以了解 AS 中的地址:

  • 静态配置。为此,互联网接入提供商可以在其自己的路由器中将客户的网络列为静态条目。然后,这些条目将广播到连接到其互联网核心的其他路由器。这种方法也可以与 CIDR 方法一起使用,该方法聚合路由。
  • 在链路上使用内部网关协议(IGP)。为此,互联网接入提供商可以在单个连接上运行 IGP,然后可以使用该协议来广播连接的网络。与静态配置相比,此方法允许更动态的方法。典型的 IGP 是 OSPF。
  • 在链路上使用外部网关协议(EGP)。可以使用 EGP 来广播网络。如果连接的 AS 没有注册的 AS,互联网接入提供商可以从一个私有 AS 号池(64,512 到 65,535)中分配一个号码,然后在将 AS 广播到互联网核心时剥离该号码。

多宿主系统

多宿主系统具有来自 AS 的多个出口点。由于它具有多个出口点,因此它可以支持跨出口点的数据路由。不支持通过 AS 路由数据的系统称为非传输 AS。因此,非传输 AS 将仅向互联网接入提供商广播它们自己的路由,因为它不希望通过它们进行任何路由。如果一个互联网提供商知道通过 AS 的路由是可能的,它们可以强制流量通过 AS。要克服这个问题,AS 将设置过滤来阻止任何这种路由的流量。

多宿主传输系统有多个到互联网接入提供商的连接,并且还允许流量通过它进行路由。它将通过在内部运行 BGP 来路由此流量,以便同一 AS 中的多个边界路由器可以共享 BGP 信息。除此之外,路由器可以将 BGP 信息从一个边界路由器转发到另一个边界路由器。在 AS 内部运行的 BGP 称为 Internet BGP (IBGP),而如果它在 AS 外部运行,则称为 External BGP (EBGP)。定义 AS 和互联网接入提供商之间边界的路由器称为边界路由器,而运行内部 BGP 的路由器称为传输路由器。

BGP 规范

边界网关协议(BGP)是一种域间自治系统路由协议(外部路由协议),它建立在 EGP 的基础上。基于 BGP 的系统的主要功能是与其他 BGP 系统通信网络可达性信息。最初,两个系统交换消息以打开和确认连接参数,然后传输整个 BGP 路由表。在此之后,当路由表更改时,会发送增量更新。

每条消息都有一个固定大小的标头,并且可以有也可以没有数据部分。字段是:

  • Marker。包含消息的接收者可以预测的值。它可以用于检测一对 BGP 对等方之间的同步丢失,并用于验证传入的 BGP 消息。16 个字节。
  • Length。指示消息的总长度,以字节为单位,包括标头。它必须始终大于 18 且不大于 4096。2 个字节。
  • Type。指示消息的类型,例如 1 — OPEN、2 — UPDATE、3 — NOTIFICATION 和 4 — KEEPALIVE。

OPEN 消息

OPEN 消息是建立连接后发送的第一条消息。发送一条 KEEPALIVE 消息以确认 OPEN 消息。在此之后,可以交换 UPDATE、KEEPALIVE 和 NOTIFICATION 消息。

图 4 显示了添加到固定大小的 BGP 标头的额外信息。它具有以下字段:

  • Version。指示消息的协议版本号。典型值为 2、3 或 4。1 个字节。
  • My Autonomous System。标识发送方的自治系统号。2 个字节。
  • Hold Time。指示接收连续的 KEEPALIVE 和/或 UPDATE 和/或 NOTIFICATION 消息之间可以经过的最大秒数。2 个字节。
  • Authentication Code。指示正在使用的身份验证机制。这应该定义 Authentication Data 的形式和含义,以及用于计算 Marker 字段的值的算法。
  • Authentication Data。此字段的形式和含义是一个可变长度的字段,它取决于 Authentication Code。

图 4:BGP 消息标头和 BGP OPEN 消息数据

BGP 配置

BGP 配置命令类似于 RIP(路由互联网协议)中使用的命令。要配置路由器以支持 BGP,请使用以下命令:

RouterA # config t
RouterA(config)# router bgp AS-number

对于 IGP(例如 RIP),network 命令定义了在其上发送路由表更新的网络。对于 BGP,使用不同的方法来定义网络之间的关系。这是 [here]:

RouterA # config t
RouterA(config) # router bgp AS-number
Router(config-router)# network network-number [mask network-mask]

其中 network 命令定义了在哪里广播本地学习的网络。这些网络可能已经从其他协议(例如 RIP)中学到。一个可选的掩码可以与 network 命令一起使用来指定单个子网。使用 BGP 协议,邻居必须建立关系,为此使用以下命令:

RouterA # config t
RouterA(config) #router bgp AS-number
Router(config-router)#network network-number [mask network-mask]
Router(config-router)# neighbor ip-address remote-as AS-number

它定义了连接的基于 BGP 的路由器的 IP 地址以及其 AS 号。

结论

在其核心,互联网不是一个分散的基础设施。它是脆弱的,并且容易受到人为错误和对抗性攻击。我们花费太多的时间来使我们的服务正常工作,而很少时间来使它们变得健壮。我们需要花更多的时间来研究方案以及如何缓解这些方案。以前,是 Facebook 将自己下线了;下一次,可能是一个民族国家击垮整个国家……而且很可能产生毁灭性的影响。

现在……我为你设置了更多关于 BGP 的 Cisco 挑战,所以去这里了解更多关于 BGP 配置的信息:

BGP \ \ Back BGP 是对 EGP 的改进(BGP 的第四个版本被称为 BGP-4),并在 RFC1772 中定义。它假设……\ \ asecuritysite.com

或者在这里了解 PKI:

https://asecuritysite.com

  • 原文链接: billatnapier.medium.com/...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
billatnapier
billatnapier
江湖只有他的大名,没有他的介绍。