S/Kademlia:实现安全Key路由的可行方法
摘要
安全性是完全分散式P2P系统中的常见问题。 尽管关于如何创建一个安全的基于Key的路由协议存在几点建议,但一个可行的方法仍然无人参与。 在本文中,我们介绍一种基于Kademlia的安全Key路由协议,该协议通过在多条不相交的路径上使用并行查找来抵抗常见攻击,用隐式密码来限制自由节点ID生成,并引入可靠的兄弟广播。 后者需要以安全复制的方式存储数据。 我们分析评估了我们提出的Kademlia协议扩展的安全性,并模拟了对抗节点影响下多个不相交路径对查找成功的影响。
1介绍
长期以来,像Chord [18]或Pastry [14]这样的结构化P2P网络只引起了研究界的兴趣,但并未广泛应用于实际网络。 现在,随着分布式文件共享应用程序的成功,Internet的情况发生了显著的变化。 而且大型多人在线游戏的新兴领域也引起了人们对使用结构化P2P网络构建可扩展存储和通信服务的兴趣。
完全分散的P2P系统的一个主要问题是安全问题。 已经发现了几起针对结构化P2P网络的常见攻击[3,16,17]。 虽然理论上存在很多如何处理此类攻击的建议,但在构建切实可行的安全P2P网络方面几乎没有实践。
目前在互联网上使用的所有广泛部署的结构化覆盖网络(即BitTorrent,OverNet和eMule)都基于Kademlia [11]协议,容易受到多种攻击[5]的影响。 在本文中,我们分析了对Kademlia网络的攻击并提出了几种可行的对策。
本文的其余部分组织如下:在第2节中,我们提供了一些关于结构化P2P网络的背景知识,并介绍了Kademlia协议。 在第3节中,我们将概述对Kademlia的常见攻击。 我们的Kademlia安全扩展的详细设计在第4节中介绍。在第5节中,我们通过模拟来评估我们的设计。 最后,第6节涵盖相关工作,第7节结束。
2背景
在本节中,我们将提供关于结构化P2P系统的一些背景信息,并描述Kademlia协议的一些属性。所有结构化的P2P网络提供的通用服务是基于Key的路由层(KBR)[6]。该层为来自大标识符空间(称为Key的标识符)提供有效路由(典型地,n比特整数模 ,n = 128或160)。叠加层中的每个参与节点都从相同的id空间中选择唯一的nodeId,并在覆盖拓扑中维护具有nodeIds和邻居IP地址的路由表。根据覆盖协议,拓扑结构类似于环,超立方体或Bruijn图。每个节点都负责标识符空间的特定范围,通常用于ID空间中接近其nodeId的所有键。通过这种方式,通过将消息连续转发到具有更接近目的Key的节点ID的覆盖邻居,KBR可用于有效地将消息路由到任意key。这个KBR层可以用作分布式存储服务等更复杂任务的构建块。
尽管像Chord,Pastry或Kademlia这样的结构化P2P系统提供了类似的KBR服务,但它们在路由表大小和平均查找路径长度等属性方面有所不同。 在下文中,我们将重点放在Kademlia [11]协议上,因为它已经不易受几种常见攻击的影响,同时易于实现。
图1. Kademlia中的路由表,其中nodeId前缀为0011的节点
2.1. Kademlia
Kademlia [11]是一个结构化的点对点系统,与Chord [18]这样的协议相比,它具有几个优点,作为在标识符空间中使用新的XOR度量标准点间距的结果。 由于XOR是一种对称操作,Kademlia节点接收来自同样在本地路由表中的同一节点的查找查询。 这对于节点能从查找查询中学习有用的路由信息并更新其路由表很重要。 相比之下,由于覆盖拓扑的不对称特性,Chord需要专用的稳定协议。XOR度量也是单向的:对于任何常数x,存在恰好一个y,其距离为d(x,y)。 这确保了对相同Key的查找沿着相同的路径收敛,而不依赖于始发,这是缓存机制的重要属性。
在Kademlia中,每个节点选择一个随机的160位nodeId并维护一个由多达160个k-buckets组成的路由表。 每个k-buckets最多包含k个其他节点的三元组。 参数k是一个冗余因子,通过跨越覆盖节点之间的几条不相交路径,使路由更加健壮。 存储区按二叉树排列,根据节点标识符的最短唯一前缀将节点分配给存储区。 一个nodeId前缀为0011的节点的示例路由表如图1所示。最初,一个节点的路由表由一个覆盖整个ID空间的bucket组成。 当节点U得知新的联系人C时,节点U根据C的nodeId的前缀将C插入适当的bucket中。 如果这个bucket已经包含k个节点并且bucket的范围包括U自己的nodeId,则buckets被分成两个新的buckets。 否则,新联系人将被丢弃。
如果节点ID不均匀分布,则会出现问题。 在这种情况下,标准bucket拆分算法会导致节点不知道它们的完整k邻域。 图2给出了一个例子。该图显示了nodeId前缀为00的节点U的路由表。根据上面给出的拆分规则,对于前缀01,只有一个存储bucket有k个条目, 不会再分裂。 在这种情况下,与节点U最接近的节点前缀为010的节点可能会丢失,导致邻域不完整。 为了避免这种情况,Kademlia的作者在这些情况下提出也将节点U的nodeId不包含在内的分裂bucket分裂,导致U的nodeIdbucket旁边出现不规则的子树。 bucket分裂算法的这个例外使协议更加复杂,因此我们在4.2节中提出了一种替代方法。
图2.高度不平衡树中Kademlia路由表的不规则性
3. 攻击Kademlia
在这一节中,我们描述了对Kademlia的基于Key的路由和数据存储的可能攻击的分类。此外,我们提出了一个理论估计的查询成功率在一个Kademlia网络与对手节点的一小部分。
3.1. 攻击底层网络
我们假设底层网络层不为覆盖层提供任何安全属性。 因此攻击者可能能够偷听或修改任意数据包。此外,我们假设节点可以欺骗IP地址,并且底层中没有数据包的认证。 因此,对底层的攻击可能会导致对覆盖层的拒绝服务攻击。
3.2.攻击覆盖路由
除了底层攻击之外,还有许多攻击会影响覆盖层路由。 本节总结了目前已知的覆盖稳定性攻击。
日蚀攻击:这种攻击尝试在网络中放置敌对节点,从而将一个或多个节点与其隔离,即所有消息都通过至少一个敌对节点进行路由。 这使攻击者可以控制覆盖网络的一部分。 因此,日蚀攻击可以从覆盖网络“隐藏”一些节点。 首先,如果一个节点不能自由选择其节点ID,其次,当它很难影响其他节点的路由表时,可以避免这种情况。 由于Kademlia青睐K-BUCKETS中的长生命节点,并且只添加节点,如果一个bucket尚未满,只要网络启动,后者就很容易实现。
女巫攻击:在完全分散的系统中,不存在控制攻击者可以获取的nodeIds数量的实例。 因此,攻击者可以用大量nodeIds加入网络,直到他控制网络中所有节点的一小部分为止。Douceur [8]证明,这种攻击是无法预防的,但只能阻止。 在集中式系统中,可以让节点用金钱支付来加入网络,并将该节点绑定到特定的自然人。 在完全分散的系统中,节点只能通过系统资源(带宽,CPU功率等)进行授权才能“付费”。
客户流失攻击:如果攻击者拥有一些节点,他可能会在网络中引发高流失,直到网络稳定失败。 由于建议Kademlia节点在其路由表中保留长期联系人,因此这种攻击对Kademlia覆盖拓扑没有太大影响。
敌对路由:当路由表既不响应路由信息也不路由任何分组时,简单地从路由表中删除节点,影响网络路由的唯一方式是返回敌对路由信息。 例如,敌对节点可能只是返回更接近查询Key的其他协作节点。 这样一种敌对节点将数据包路由到其协作者的子网中,并且查找到的和给定Key的最近节点都不会被找到。 这可以通过使用考虑多个不相交路径的查找算法来防止。 当一条路径没有敌对节点时,查找成功。 因此,假设m是对抗节点的分数,d是不相交路径的数量,(hi)路径长度分布,则查找成功的概率由下式给出:
这表明,特别是对于中等数量的敌对节点,查找算法可以显着受益于不相交路径以及低平均路径长度。
3.3. 其他攻击
拒绝服务:敌对方可能试图欺骗受害者以消耗其所有资源,即内存,带宽,计算能力。