SFS(Self-Certifying File System)是设计一整套互联网共用的文件系统,全球的SFS系统都在同一个命名空间下。在SFS中,分享文件会变得十分简单,只需要提供文件名就行了。
要实现一个全球共享的文件系统,最大的一个障碍莫过于如何让服务端为客户端提供认证。
一个最简单的思路,所有服务器都生成一对公钥和私钥,然后让每个客户端用公开的公钥来验证服务器的安全,但是如何让所有客户端都能获得服务器的公钥呢?
SFS使用一种新的解决思路,将公钥信息嵌入到文件名中,这种命名为“自验证文件名”。这样就没必要在文件系统内部实现密钥管理了。秘钥管理的功能就加入到用户对文件命名的规则中。用户可以根据自己需要选择加密方式。
1
SFS核心思想有如下几点:
1
SFS文件系统具备自验证路径名称,不需要在文件系统内部实现密钥管理。
2
在SFS上易于假设各种秘钥管理机制,包括各类组织机制。
3
SFS将密钥撤销与秘钥分发分离开,防止影响密钥的恢复。
4
实现全球范围的文件系统。
2
一、SFS设计
在一个加密指定的全局命名空间中,这是可变的。IPFS的方案如下:
NodeID = hash(node.PubKey)
给每个用户分配一个可变的命名空间,在此路径下: /ipns/
一个用户可以在此路径下发布一个用自己私钥签名的对象,比如: /ipns/XLF2ipQ4jD3UdeX5xp1KBgeHRhemUtaA8Vm/
其他用户获取对象时,他们可检测签名是否与公钥和NodeID匹配,验证用户发布对象的真实性,达到了可变状态的获取。
1、安全性
对于SFS系统,安全性由两部分定义:
文件系统本身的安全性;
秘钥管理的安全性。
简单理解,安全性意味着攻击者未经许可不能读取或者修改文件系统,对用户的请求,文件系统一定会返回给用户正确的文件。
文件系统本身的安全性:SFS除非明确指明允许匿名访问,用户如果需要读取,修改、删除或者对文件进行篡改,都需要提供正确的密钥。也就是需要证明这个文件属于你才能进行一系列修改删除操作。客户端和服务器始终在加密的安全通道进行通信,通道需要确保双方的身份、数据完整性和实时性。(避免攻击者截获数据包,并将其重新发送,欺骗系统,这就是重放攻击)。
密钥管理的安全性:用户的个性化需求就需要密钥管理来实现更高级别的安全性。用户可使用预先设置的私钥,或者多重加密,再或者第三方公司提供的文件系统来访问经过认证的文件服务器。用户可从中灵活、轻松构建各种密钥管理机制。
2、可扩展性
无论是用户希望以密码认证读取到个人文件,还是了浏览公共服务器上的内容,SFS都能很好兼容。在SFS系统中,任何在Internet网络内拥有域名或地址的服务器,都能部署成SFS服务器,且十分简单,无需请求注册权限。SFS通过三个属性来实现扩展性能:全网共享的命令空间,用于实现密钥管理的原语集,以及模块化设计。
1
全局命名空间:客户端登录的SFS都有相同的命名空间。每个人都能添加新的服务器到这个命令空间里,但不能控制整个全局的命名空间。
2
密钥管理的原语集:SFS允许用户在文件名解析期间使用任意算法来查找和验证公钥。不同的用户可以采用不同的技术认证相同的服务器,SFS允许他们安全地共享文件缓存。
3
模块化设计:程序间大多使用设计好的接口进行通信,更新新的特性将非常简单。
2
二、自验证文件路径
SFS就是通过自我证明身份的路径名来实现加密控制权限。SFS路径中包含了构成与服务器连接的全部需要的信息,例如网络地址和公钥。SFS文件路径包含三部分:
1
服务器位置:可以是IP地址或者是DNS主机名。
2
HostID:告知SFS如何与服务器构建安全的连接通道。每个SFS客户端都有一个公钥,而HostID,通常设置为主机名与公钥的哈希,采用SHA-1哈数。
3
远程服务器上文件的地址:前面两个信息为了找到目标服务器并构建安全通道,最后只需要告诉文件的位置就可以了。整个自验证文件路径的形式如下:
Location HostID path: /sfs/sfs.lcs.mit.edu:vefvsvSwd4hz9isc3rb2x648ish742h/pub/links/sfscvs
SFS系统,给定一个Internet地址或域名作为位置,给定一个公钥和私钥对,确定相应的HostID,运行SFS服务器软件,任何一个服务器都能通过客户端,将自己加入到SFS中,而无需进行任何的注册过程。
3
三、用户验证
自验证的路径名,能帮助用户验证服务器的身份,而用户验证模块则是帮助服务器验证哪些用户是合法的。SFS把用户身份验证与文件系统分开,外部软件可以根据服务器的需求来设计协议验证用户。
在客户端,Agent负责用户认证工作,当用户第一次访问SFS文件系统时,客户端会加载访问并向Agent通知这一事件。然后,Agent会向远程服务器认证这个用户。从服务器角度上看,这部分功能从服务器搬到一个外部认证的通道。
Agent和认证服务器之间通过SFS传递信息。实现添加新的用户验证信息却不需要修改实际的真实文件系统。如果用户在文件服务器上没有注册过,Agent在尝试一定次数以后拒绝用户的身份验证,并将用户授权匿名权限访问文件系统。
4
四、密钥撤销机制
如果服务器的私钥泄漏了,原有的自验证文件路径错误地定位到恶意攻击者设置的服务器。为了避免这种情况,SFS提供了两种机制来控制:密钥撤销指令和HostID阻塞。密钥撤销指令只能由文件服务器的拥有者发送,它的发送目标是全部的用户。
这一指令本身是自验证的。而HostID阻塞是由其他节点发送,可能与文件服务器拥有者冲突,每一个验证的Agent可以选择服从或者不服从HostID阻塞的指令。如果选择服从,对应的HostID将会不能被访问了。
密钥撤销指令:
在这里“PathRevoke”字段是一个常量,Location是需要撤销密钥的自验证路径名称,NULL是为了保持转发指针指令的统一性,在这里将转发指征指向一个空路径,意味着原有指针实效。Public_Key是实效前的公钥,Secret_Key是私钥。这一条信息能确保撤销指令是服务器所有者签发的。
SFS客户端看到吊销证书时,任何要求访问撤销地址的请求都会被禁止。服务端会通过两种方式获取密钥撤销指令:
1
SFS连接到服务器的时候,访问到已经撤销的地址或路径,也会收到由服务器返回的密钥撤销指令。
2
用户初次进行自认证路径名时,客户端会要求Agent检查是否已经被撤销,Agent会返回相应的结果。
作者:建怀,区块链技术工程师,Spark架构师,大数据+AI开发者,IPFS星系云矿机技术工程师。
版权所有,任何形式的转载都请获得授权后并注明出处。
关注IPFS星系云矿机
领取专属 10元无门槛券
私享最新 技术干货