第八章 安全
由于安全问题对大数据系统乃至当前社会的重要性,我们在Laxcus 2.0版本实现了全体系的安全管理策略。同时我们也考虑到系统的不同环节对安全管理的需求是不一样的,所以有选择地做了不同的安全设计和处理。图8是Laxcus安全管理架构,首先使用SHA1签名获得基本确认,然后在FIXP网络层面,数据通信采用RSA加密,后面分别是对称加密、系统安全策略、签名、用户安全策略。SHA1是一种数字签名,可以保证网络间传输的内容正确性,RSA是目前安全度最高的加密手段,对称加密则次之,系统安全策略包含了为不同节点和各种服务设计的安全验证,签名是系统判断每个登录账号的合法性,用户安全策略赋与了用户自定义安全规则的能力,应用于用户自己的分布任务组件和数据存取上,有助于强化数据处理过程中,用户的数据安全。
上述安全管理措施非常繁多,但是其实都是围绕着两个目标进行:防窃取和防篡改。因为考虑到安全管理对数据处理业务的影响(RSA计算就对CPU的占用比率非常高),所以在系统的某些层面,安全管理被设置为可选项,决定权交给集群管理者和用户自己处理。例如在内网通信中,由于内网的安全保障程度比较高,而且内网的数据传输量又非常大,几乎所有网络计算都在内网中进行。在这种情况下,为了给数据处理是腾出基础资源,提高处理效率,可以酌情选择省略掉部分安全管理。
本章将依循Laxcus大数据系统架构,阐述每个层面的安全管理。
图8 Laxcus安全管理架构
8.1 环境安全
在架构设计上,Laxcus被分为彼此隔绝的内外两个网络环境。内部网络的拓扑结构对外保密,网络地址一般是采用TCP/IP协议中的内网地址(10.0.0.0 - 10.255.255.255、172.16.0.0 - 172.31.255.255、192.168.0.0 - 192.168.255.255),它们由专业的集群管理人员来管理和维护,被认为是“安全”的。外网由普通的注册用户来管理,不在集群管理人员的可控制范围内,来源可以是互联网或者VPN的连接,他们属于低可信度用户,被认为是“不安全”的。网关节点位于它们之间,除了起到沟通双方的连接和分解任务压力的作用外,更主要是接受外部网络请求的同时,可以屏蔽内部网络拓扑结构,使内部网络有一个相对安全的运行环境,防范可能遭到的网络攻击。
虽然运行环境提供了这样的安全设计,但是在部署集群时,仍然需要集群的组织管理人员遵守设计规定。集群运行过程中,管理人员也应该具备安全管理常识,这是需要相互配合的工作。在这个的架构安全基础上,还有后续一系列的安全管理措施,使集群被攻击的可能性进一步降低。
8.2 通信安全
节点同时具有客户机/服务器的双重身份。在每一次网络通信开始时,为了确保客户机是可以信任的,服务器会要求客户机出示通信安全凭证。这个凭证将保证双方在安全的状态下通信。
通信安全凭证在FIXP服务器上配置,里面保存了客户机必须出示的信息。安全通信类型分为三种:地址验证、账号验证、地址/账号复合验证。当服务器要求出示安全凭证时,客户机必须遵守这个协定,向服务器出示自己的安全凭证,否则通信将被服务器中止。客户机也可以主动向服务器要求安全校验,每次服务器都会接受的。
通过安全凭证检测后,可以确定网络两端间传输的数据是正确和可信任的,这样就为后续的数据处理提供了一个基本的安全保障。
使用中也有例外,例如上面提到的内网通信。因为内部网络相对公共网络,它的安全度和信任度颇高,而通信安全项除了地址验证外,其他两种都需要执行消耗CPU的计算,这会造成数据处理的延迟,对大规模、高密度的网络计算来说显得得不偿失。所以,一般的建议是,在穿越VPN或者互联网的通信双方,应该启用安全通信;在信任度高的内部网络,这项工作可以选择地址验证,或者忽略。
8.3 节点准入制度
在Laxcus集群里,一个节点若要向另一个节点发起命令请求,必须首先以客户机的身份登录它的服务器节点,客户机发出的每一条命令,都要接受服务器的验证和检查,这就是节点准入制度。
节点准入制度是在安全通信之后,为各节点间的连接和操作定义的一套安全措施。在这个层面上,能够保证各节点之间的连接都是正确的,被传输的命令也在监管范围内。
比如,Aid节点只能连接Top节点,连接Home节点就是非法的。Front节点必须先向Call节点注册,才能得到命令操作许可。Call节点只能向Data节点发出SQL SELECT命令,向任何其它节点发出这道命令都会遭到拒绝。
我们对不同节点的节点准入制度有一套详细的规定,在此就不赘述。由于这个规定准确定义了它们之间的请求、受理范围、命令许可,使得每个节点和每一道命令在运行过程中都接受检查,杜绝了一切可能的非法连接和操作。
8.4 用户账号安全
用户登录使用Front节点。无论用户是以终端的交互方式还是驱动程序的嵌入方式接入Laxcus集群,系统都要求用户提供一个登录账号,确认用户是可信的。Laxcus账号由用户名称和密码组成,每一个账号必须由系统管理员建立,账号的用户名和密码会被计算机计算为SHA1算法的散列码,再通过网络上传到Top节点,保存到数据字典里,供后续使用。
账号的用户名是系统唯一的,一经建立不能修改。当系统管理员建立账号后,会通过其它渠道将账号的明文转交给账号持有人。账号持有人拥有修改账号密码的权利,通常账号持人会修改系统管理员设置的密码。
特别注意,在建立、修改和使用账号登录的过程中,账号的明文只出现在用户的计算机屏幕上或者用户的驱动程序里,不会出现在网络传输的任何环节。Top节点保存的只是账号明文的SHA1算法散列码,由于SHA1算法逆向破解的难度,使得获取账号明文的可能性极小。这样就使得账号在产生和使用过程中拥有极大的安全性。
另外,用户登录除了需要提供登录账号外,还必须持有一个系统管理员颁发的安全许可证书。这是一个经过RSA算法签名的文件,由系统管理员建立和保管。用户登录时首先出示这个证书,服务器会检查证书的有效性,确定证书有效和登录者可信后,再执行账号检查,进一步判断账号的正确性和操作范围,决定是接受还是拒绝。
这样,实际上每一个用户的登录过程都是RSA和SHA1的组合,首先用SHA1对账号进行签名,然后用RSA进行传输和校验。因为这是进入集群的第一阶段,必须保证有足够的安全强度。这种双保险措施保证了每一个登录用户的可信性。
登录成功后,双方进入正式的通信状态。我们通常要求数据经过加密或者签名处理。目前提供的加密和签名算法有:AES、DES、3DES、MD5、SHA1等。这些算法和密码会随着通信过程自动变换,使得窥密者短时间内难以获得明文,这又进一步提高了交互双方的数据安全。
综上所述,用户进入Laxcus集群依次有三道安全门槛:RSA、用户账号、对称加密或者数字签名,前两种保证用户登录时的安全,后一种保证登录后数据内容的安全。
8.5 用户权限管理
用户使用FRONT节点登录,只是拥有了进入集群的权利。若要获得数据处理能力,还需要获得进一步的数据操作权限。
数据操作权限也是由管理员来授权。数据操作权限从高到低分为三级:用户级、数据库级、表级。每一个级别有多个操作选项,部分选项会在多个级别存在,对于这类同质选项,上一级操作权限默认高于下一级操作权限。例如SQL“SELECT”操作权限,用户级“SELECT”高于数据库级”SELECT“,数据库级”SELECT“又高于表级“SELECT”。
由管理员分配的数据操作权限也可以被管理员回收。权限回收后将立即生效,超过权限的数据请求在此之后将被拒绝。
通过用户权限管理,管理员可以把用户的数据处理操作控制在规定的范围内,杜绝用户可能的越权操作。
8.6 私有业务安全
私有业务即是用户的数据业务,这一块的安全管理全权交给用户处理。在这个层面,用户可以自由组织自己的数据内容和数据格式。组织方式分成两种:1.用系统提供的可类化接口,在发送前,把数据按照自己理解的数据格式,用各种方式编排在一起,在接收后,再重新拆解。可类化接口中的“ClassWriter、ClassReader”同时提供加密/解密功能,进一步提高了安全能力。这样在数据传输过程中,由于格式和内容都经过了处理,破解就变得很困难。至于密码,可以放在外界难以窥测到的地方,比如命令自定义参数的某个位置,或者集群的数据字典里。
数据表中的数组数据,在生成时就可以通过系统提供的“Packing“接口加密。这样内容在生成就已经处理过,只是在显示的时候被解开,重新以明文格式出现,中间过程都是以密文的形式存在。在不掌握密码的情况下,外界也是无从窥视。
图8.6.1 可类化接口函数
8.7 分布任务组件安全
分布任务组件的安全由沙箱来保证。沙箱(sandbox)是一种可以限制程序操作范围和处理能力的容器,现在已经集成到Laxcus大数据管理系统里。所有处于运行状态的分布任务组件,都被放置到沙箱里运行。
将分布任务组件置于沙箱里运行的根本原因在于:分布任务组件来源于用户,从保守的安全角度考虑,我们无法预先判断每个分布任务组件都是善意和可以信任的,不会在他们的程序里含有恶意代码,那么从统一处理的原则出发,我们就假定这些分布任务组件都是不安全的,需要在它们运行过程中,对它们进行约束和限制,以防止各种可能危害系统或者其它分布任务组件的事情发生。
在沙箱里运行的分布任务组件,它们的操作权限受到沙箱严格监管,只能“读、写、删除”规定目录下面的文件,或者获取规定的系统属性,其它操作都被排除在外。运行过程中,分布任务组件发出的每个操作请求都会首先传到沙箱进行安全检查,当发现操作超出许可范围时,沙箱将拒绝执行,以保证运行环境安全。
沙箱的安全检查项目被放在安全策略文件中,在系统启动时加载。修改安全策略文件是很容易的,不过这属于集群管理员的职责,普通用户没有这个能力。
图8.7.1 沙箱安全策略选项
8.8 数据块安全
数据块的安全依赖于对数据的签名。当数据块从Cache状态转向Chunk状态过程中,系统会计算这个数据块的数据内容,生成一个256位的Laxcus签名,做为校验码保存到数据块里。产生数据块的签名过程很快,一个64M的数据块签名生成时间,在Pentium4 2.0G的计算机上,通常在10毫秒左右。
当Data节点重新启动,或者数据块被加载到内存,或者通过网络传输到另一个Data节点,系统会重新根据数据内容再次生成一个校验码,与已经存在的校验码进行比较,确认数据的完整性,以保证后续数据处理的数据本身是正确的。
8.9 DSM/NSM安全
数据块从Cache状态转入到Chunk状态过程中,除了生成数据块签名,还会根据数据块的存储模型,针对每一行或者每一列集合,生成它们的CRC32校验码,并且保存在记录的开始位置。
设置行/列集校验码的原因是,因为整块的数据不会被经常调用,而行/列集的数据却总是在网络上大量、频繁传递,这就使得行/列集的数据校验更有实际意义。
然而相较于少量的数据块签名计算,被传输的行/列集因为粒度细、数据量大、校验次数频繁,计算持续时间也会更长,这将消耗大量计算资源,影响到网络计算的处理效率。所以,通常任务请求方在收到计算结果后,会根据数据的来源来选择是否检测。如果是内网数据,由于网络安全度高,这个校验可以被忽略。