Apache Accumulo是一个稀疏的、分布式的、有序的以及多维度的键/值存储,提供单元格级别的细粒度访问控制属性。它于2008年由NSA开发,基于Google BigTable的设计,于2011年发布到Apache开源社区,并且现在是顶级Apache项目。它是构建在Hadoop和Zookeeper之上的、高度可扩展的NoSQL数据库。开发它的部分原因是为了解决大数据安全问题。
Accumulo扩展了BigTable的数据模型,但添加了一个元素,以提供单元格级别的、强制的基于属性的访问控制(ABAC)。可以使用可见性控制来标记所有导入到Accumulo中的数据,当数据分析师查询数据时,基于访问控制策略中的可见性控制,他们将仅能看到你期望他们看到的内容。Accumulo的API为你提供的能力包括编写认证用户的客户端,以及与企业级属性服务相集成,并拉取用户的授权凭证以提供某个级别的访问控制。Accumulo还提供将用户和授权信息保存在其自身中的能力。
如图12-2中所示,Accumulo是一个键/值存储,它的键是一个5元组。Accumulo中的键由行ID、列族、列限定符、列可见性和时间戳构成。此5个元素的键与一个值相关联。
图12-2 Accumulo数据模型
该5元组键提供原子性、本地性、唯一性、访问控制和版本化。重要的是要注意键中的时间戳维度包含了基于不同的时间和日期,提供相同数据多个版本的能力。大体来说,Accumulo的数据模型多数借用了BigTable数据模型,但添加了可见性元素来提供面向数据的安全——它将仅返回那些运行查询的用户/应用程序的凭据满足可见性标签的单元格。
Accumulo和HBase中数据级安全性的差异
HBase和Accumulo是类似的——它们都是在Hadoop之上运行BigTable实现的Apache项目。HBase和Accumulo中的安全性提供类似的数据级安全,但方式不同。如第10章中的讨论,HBase可以对数据提供以逐个表或逐个列为基础的访问控制。当前,它还不支持Accumulo可以做到的单元格安全性,但Rhino项目的Intel发行版正在实施这方面的工作,使得HBase不久后可能会支持基于单元格的安全。
HBase可以与Hadoop的安全模型轻易地集成(使用Kerberos),而且此方案与Hadoop生态系统的其余部分一致。而另一方面,Accumulo是一个较新的顶层Apache项目,包含一个内部访问控制数据库,而且它实现安全性的方式与Hadoop生态系统中其他工具不同。
HBase和Accumulo都很流行。基于其单元格级别的访问控制安全特性,Accumulo在高安全环境中是最流行的,并承诺提供与强制访问控制(MAC)和差异性安全相关的解决方案。
大多数较熟悉关系型数据库的开发者通常习惯于看到类似于表12-1的表,它是一个二维的模型。
表12-1 关系数据模型中的示例数据
名 字 | 大 学 | 出生所在州 | 签 名 短 语 |
Billy | UCLA | West Virginia | “Brutal” |
Jeff | UVA | New Jersey | “C’Mon Man” |
在Accumulo的结构中,相同的数据看上去会类似于表12-2,其中使用了较细的粒度来保存数据,包括可见性和能够跟踪数据随时间变化的时间戳。
表12-2 Accumulo数据模型中的数据
行ID | 族 | 限 定 符 | 可 见 性 | 时 间 戳 | 值 |
Billy | School | University | Public | 20130503 | UCLA |
Billy | BirthRecord | State of Birth | Admin | 20120503 | West Virginia |
Billy | Greeting | Signature Phrase | Public | 20120503 | “Brutal” |
Jeff | School | University | Public | 20120503 | UVA |
Jeff | BirthRecord | State of Birth | Admin | 20120503 | New Jersey |
Jeff | Greeting | Signature Phrase | Public | 20120503 | “C’Mon Man” |
注意在表12-2中,可见性被标记了安全标签。可以使用与/或布尔逻辑将这些标签添加到记录中。例如,可以给出类似于表12-3的授权策略,其中可以创建授权凭据并与用户关联,将访问限定为表中的每个单元格。
表12-3 安全策略示例及其安全标签语法
访问某条记录的策略示例 | 安全标签语法 |
必须是共和党人而且是美国公民 | Republican & USCitizen |
必须是警察,或者必须是美国公民且在武装部队中 | Police Officer | (USCitizen & ArmedForces) |
必须是项目管理者而且必须在FGM或White Oak组织中 | ProjectManager & (FGM | White Oak) |
超过17岁或者父母同意 | Over17 | parentalConsent |
在Accumulo的安全模型中,用户向可信的客户端(作为开发人员,可以编写这样的客户端)进行认证,而客户端要负责认证用户并向Accumulo传递适当的授权凭据。你的可选方案为与自己的认证和授权系统相集成,或者使用Accumulo的内部认证/授权组件——可以在其中保存用户和他们的授权凭据。本小节为每种方案都提供了一个示例。
一个简单的示例
让我们考虑一个大学数据库的示例,其中某大学从各个部门和下属组织收集了关于其学生的数据。在此示例中,有来自校园医疗中心、财政中心、大学管理处、体育设施和校园警察的数据。你收集了各种各样的信息,而且整个组织可以查询这些信息。你的需求是保护某些信息,例如如下所述:
● 学生医疗检查记录应该只对医护人员和大学管理处可见。
● 田径学院学生体育相关的记录应该只对他们的教练可见,有时也可对医护人员可见。
● 购买记录、评分以及诸如社会安全号码等敏感信息应该只对大学管理处可见。
● 学生在校园警察处的记录应该只对校园警察或者大学管理处可见。
对于本例,让我们将一些样例数据加载到Accumulo数据库中,如表12-4所示。在这个简单的例子中,有一位名叫Kirk Rest的学生,你有关于他的各种信息,这些信息均是从大学中的大量数据源收集而来的。
表12-4 大学数据示例中的键/值
行ID | 族 | 限 定 符 | 可 见 性 | 时 间 戳 | 值 |
Kirk Rest | SSN | 999999999 | ADMIN | 20050612 |
|
Kirk Rest | Phone | 804-555-0005 | ADMIN | 20050612 |
|
(续表)
行ID | 族 | 限 定 符 | 可 见 性 | 时 间 戳 | 值 |
Kirk Rest | Address | 111 Carson Ave, Richmond VA | ADMIN | 20050612 |
|
Kirk Rest | Weight | 170 | MEDICAL | COACH | 20110711 |
|
Kirk Rest | Running Test | 10K | COACH | 20110812 | 56 |
Kirk Rest | Running Test | 10K | COACH | 20110517 | 58 |
Kirk Rest | Running Test | 5K | COACH | 20110716 | 24 |
Kirk Rest | Running Test | 5K | COACH | 20110612 | 27 |
Kirk Rest | Payment | Semester Payment | ADMIN | 20111223 | 1000 |
Kirk Rest | Medical Test Report | Cholesterol | MEDICAL | 20111222 | 200 |
Kirk Rest | Medical Test Report | Biopsy | MEDICAL | 20111012 | Negative |
Kirk Rest | Grade | Organic Chem | ADMIN | 20111201 | A |
Kirk Rest | Grade | Calculus 1 | ADMIN | 20111201 | B |
Kirk Rest | Grade | Radical Presbyterianism | ADMIN | 20100612 | D |
Kirk Rest | Police Charge | Curfew Violation | ADMIN | POLICE | 20071103 | Pending Hearing |
Kirk Rest | Police Charge | DUI Arrest | ADMIN | POLICE | 20091104 | Guilty |
假定将此信息加载到已经安装在测试Hadoop实例上的Accumulo存储中。为此,应该使用Accumulo shell,它是一个简单的客户端,可以用于创建和修改表,以及创建用户并为这些用户分配授权凭据。由于本章关注的是安全,而非Accumulo的更多细节,因此这里不讨论加载数据的详情。
注意:
由于不同版本的Accumulo需要与不同版本的Hadoop和Zookeeper一起工作,因此这有时是对安装的一个挑战!上手Accumulo的一种简单方法是使用已经配置好的虚拟机(VM)。Sqrrl公司的网站上提供一个独立的亚马逊机器实例(AMI),用于Apache Accumulo的快速入门,并且该公司还提供一个在Oracle VirtualBox上预先配置好的VM。更多详情请参见位于http://www.sqrrl.com/的网站,以及位于http://blog.sqrrl.com/post/40578606670/ quick-accumulo-install/的VM。
Accumulo针对快速获取键对应的值做了优化。为此,开发的Accumulo客户端(在这种情况下,客户端就是Accumulo shell)要创建一个对值进行迭代的扫描器。正如在代码清单12-1中所看到的那样,scan命令允许你在创建的新表——universitydata——中对值进行迭代(以root身份运行,而root对表中的所有内容均有访问权限)。
代码清单12-1:查看数据
- "font-family:Microsoft YaHei;font-size:14px;">root@accumulo universitydata> scan
- Kirk Rest Address:111Carson Ave, Richmond VA [ADMIN]
- Kirk RestGrade:Calculus 1 [ADMIN] B
- Kirk RestGrade:Organic Chem [ADMIN] A
- Kirk RestGrade:Radical Presbyterianism [ADMIN] D
- Kirk Rest MedicalTest Report:Cholesterol [MEDICAL] 200
- Kirk Rest NedicalTest Report:Biopsy [MEDICAL] Negative
- Kirk RestPayment:Semester Payment [ADMIN] 1000
- Kirk RestPhone:8045550005 [ADMIN]
- Kirk Rest PoliceCharge:Curfew Violation [ADMIN|POLICE] Pending Hearing
- Kirk Rest PoliceCharge:DUI Arrest [ADMIN|POLICE] Guilty
- Kirk Rest RunningTest:10K [COACH] 56
- Kirk Rest RunningTest:5K [COACH] 27
- Kirk RestSSN:99999999 [ADMIN]
- Kirk Rest Weight:170 [MEDICAL|COACH]
为演示单元格可见性的示例,需要创建下列用户:
● 医生(drhouse),为其分配MEDICAL角色
● 管理员(denyseAccountant),为其分配ADMIN角色
● 教练(coachTark),为其分配COACH角色
● 警察局长(chiefDoug),为其分配POLICE角色
如代码清单12-2所示,使用shell来为所有这些能够读取表的用户分配访问权限(授予他们每个人Table.READ权限),并使用setauths命令为他们分配用于可见性的适当角色。
代码清单12-2:分配访问权限和用户视图
- "font-family:Microsoft YaHei;font-size:14px;">root@accumulo universitydata> grantTable.READ -t universitydata -u drhouse
- root@accumulouniversitydata> setauths -s MEDICAL -user drhouse
- root@accumulouniversitydata> grant Table.READ -t universitydata -u
- denyseAccountant
- root@accumulouniversitydata> setauths -s ADMIN -user denyseAccountant
- root@accumulo universitydata> grant Table.READ -t universitydata -ucoachTark
- root@accumulouniversitydata> setauths -s COACH -user coachTark
- root@accumulo universitydata> grant Table.READ -t universitydata -uchiefDoug
- root@accumulo universitydata>setauths -s POLICE -user chiefDoug
最后,为展示Accumulo现在将保护对表的访问,以每个用户的身份登录并使用Accumulo shell。对universitydata表进行扫描(或迭代)。代码清单12-3展示了如何以用户coachTark、drHouse、denyseAccountant和chiefDoug的身份登录,并对表进行迭代,而且表基于每个用户的权限提供了访问控制。
代码清单12-3:演示用户的角色和可见性
- "font-family:Microsoft YaHei;font-size:14px;">root@accumulo universitydata> user coachTark
- Enter password foruser coachTark: *********
- coachTark@accumulouniversitydata> scan
- Kirk Rest RunningTest:10K [COACH] 56
- Kirk Rest RunningTest:5K [COACH] 27
- Kirk Rest Weight:170[MEDICAL|COACH]
- root@accumulouniversitydata> user drhouse
- Enter password foruser drhouse: *******
- drhouse@accumulouniversitydata> scan
- Kirk Rest MedicalTest Report:Cholesterol [MEDICAL] 200
- Kirk Rest NedicalTest Report:Biopsy [MEDICAL] Negative
- Kirk Rest Weight:170[MEDICAL|COACH]
- drhouse@accumulouniversitydata> user denyseAccountant
- Enter password foruser denyseAccountant: ******
- denyseAccountant@accumulouniversitydata> scan
- Kirk Rest Address:111Carson [ADMIN]
- Kirk RestGrade:Calculus 1 [ADMIN] B
- Kirk Rest Grade:OrganicChem [ADMIN] A
- Kirk RestGrade:Radical Presbyterianism [ADMIN] D
- Kirk RestPayment:Semester Payment [ADMIN] 1000
- Kirk RestPhone:8045550005 [ADMIN]
- Kirk Rest PoliceCharge:Curfew Violation [ADMIN|POLICE] Pending Hearing
- Kirk Rest PoliceCharge:DUI Arrest [ADMIN|POLICE] Guilty
- Kirk RestSSN:999999999 [ADMIN]
- denyseAccountant@accumulouniversitydata> user chiefDoug
- Enter password foruser chiefDoug: *********
- chiefDoug@accumulouniversitydata> scan
- Kirk Rest PoliceCharge:Curfew Violation [ADMIN|POLICE] Pending Hearing
- Kirk Rest Police Charge:DUI Arrest[ADMIN|POLICE] Guilty
正如从代码清单12-3中看到的那样,Accumulo能够基于每个用户的授权控制来限制访问,你已经通过使用Accumuloshell演示了这一点。现在,让我们用Java构建一个Accumulo客户端,该客户端将为本例演示相同级别的访问控制,并与企业中的身份和访问管理基础设施相集成。
当涉及与企业基础设施集成时,Accumulo有一个灵活的模型。如前面提到的,Accumulo客户端的职责是认证用户和获取用户的授权凭据,并将其展示给Accumulo以供处理之用。只要使用企业属性存储中的相同属性或角色标记了Accumulo表中的数据可见性,它就可以优雅地工作。如果没有标记的话,那么很可能需要对从客户端属性存储中获取的属性进行一些处理,以确保它们是完全相同的角色。
为了演示这一点,让我们浏览一个如何编写简单客户端的示例,该客户端通过自选的认证机制来认证用户,并从自选的属性服务或LDAP目录拉取授权凭据。
代码清单12-4展示了一个编写连接到Accumulo的Java类的示例。为了连接,必须使用Connector类建立一个Accumulo连接。为此,必须首先通过初始化ZookeeperInstance类,连接到跟踪Accumulo的Zookeeper实例,而ZookeeperInstance类将会返回一个连接器。
代码清单12-4:Accumulo客户端代码示例
- "font-family:Microsoft YaHei;font-size:14px;">import java.util.Collection;
- importjava.util.Collections;
- importjava.util.Map.Entry;
- import org.apache.accumulo.core.client.Connector;
- importorg.apache.accumulo.core.client.ZooKeeperInstance;
- importorg.apache.accumulo.core.client.Scanner;
- importorg.apache.accumulo.core.data.Key;
- importorg.apache.accumulo.core.data.Range;
- importorg.apache.accumulo.core.data.Value;
- importorg.apache.accumulo.core.security.Authorizations;
- public classQueryExample
- {
- public static void main(String[] args)throws Exception
- {
- //Simple Example of the name of youraccumulo instance & zookeeper
- ZooKeeperInstanceinst = new ZooKeeperInstance("accumulo", "localhost");
- //Obviously this is just an example
- Connector connector =inst.getConnector("root", "secret");
- //Scan in the username and password forthis simple example
- java.util.Scanner in = newjava.util.Scanner(System.in);
- System.out.println("Username:");
- String username = in.nextLine();
- System.out.println("Password:");
- String password = in.nextLine();
- Authorizations auths = null;
- try
- {
- //An example of how you can interactwith other systems (LDAP,etc)
- CustomAuthenticator authenticator = newCustomAuthenticator();
- authenticator.authenticate(username,password);
- //Retrieve credentials from externalsystem
- auths =authenticator.getAuthorizationInfo(username);
- }
- catch (ExceptionauthenticationException)
- {
- System.out.println("AuthenticationFailure.");
- System.exit(-1);
- }
- // Search our university data example& print out everything
- Scanner scanner =connector.createScanner("universitydata", auths);
- for (Entry entry :scanner) {
- System.out.println( entry.getKey().toString());
- }
- }
- }
一旦建立了连接,就要认证用户。在这种情况下,对于这样一个简单的示例,从命令行抓取用户信息,并将其传递给一个叫做CustomAuthenticator的外部类,编写此类仅是为了展示可以使用Accumulo之外的另一种认证和授权机制。在该类中,将从命令行中扫描到的用户名和密码传入该类的authenticate()方法。如果用户认证成功,那么接着从外部存储拉取用户的授权凭据,并返回Accumulo期望的org.apache.accumulo.core.security. Authorizations类中的值。最后,如之前示例中所示,创建一个扫描器对相同表中的值进行迭代,并简单地打印结果。
代码清单12-5展示了命令行中的结果。在此示例中,设置了一个外部的LDAP目录,其中包含一个叫做joeUser的用户,其角色为ADMIN。
代码清单12-5:Accumulo客户端的结果
- "font-family:Microsoft YaHei;font-size:14px;">Script started on Fri 03 May 2013 12:45:09 AM EDT
- $ java QueryExample
- 13/05/03 00:45:16INFO zookeeper.ZooKeeper:
- Clientenvironment:zookeeper.version=3.4.3--1,
- built on 03/20/2012 16:15 GMT
- 13/05/03 00:45:16INFO zookeeper.ZooKeeper:
- Client environment:host.name=ubuntu
- 13/05/03 00:45:16INFO zookeeper.ZooKeeper:
- Clientenvironment:java.version=1.6.0_27
- 13/05/03 00:45:16INFO zookeeper.ZooKeeper:
- Client environment:java.vendor=SunMicrosystems Inc.
- 13/05/03 00:45:16INFO zookeeper.ZooKeeper:
- Clientenvironment:java.home=/usr/lib/jvm/java-6-openjdk-amd64/jre
- 13/05/03 00:45:16INFO zookeeper.ZooKeeper:
- Client environment:java.class.path=.
- 13/05/03 00:45:16 INFO zookeeper.ZooKeeper:
- Clientenvironment:java.library.path=/usr/lib/jvm/java-6-openjdkamd64/
- jre/lib/amd64/server:/usr/lib/jvm/java-6-openjdkamd64/
- jre/lib/amd64:/usr/lib/jvm/java-6-openjdkamd64/
- jre/../lib/amd64:/usr/java/packages/lib/amd64:/usr/lib/x86_64-linuxgnu/
- jni:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linuxgnu:/
- usr/lib/jni:/lib:/usr/lib
- 13/05/03 00:45:16 INFO zookeeper.ZooKeeper:
- Client environment:java.io.tmpdir=/tmp
- 13/05/03 00:45:16 INFO zookeeper.ZooKeeper:
- Client environment:java.compiler=
- 13/05/03 00:45:16 INFO zookeeper.ZooKeeper:Client environment:os.name=Linux
- 13/05/03 00:45:16 INFO zookeeper.ZooKeeper:Client environment:os.arch=amd64
- 13/05/03 00:45:16 INFO zookeeper.ZooKeeper:
- Client environment:os.version=3.2.0-29-generic
- 13/05/03 00:45:16 INFO zookeeper.ZooKeeper:
- Client environment:user.name=accumulo
- 13/05/03 00:45:16 INFO zookeeper.ZooKeeper:
- Client environment:user.home=/usr/lib/accumulo
- 13/05/03 00:45:16 INFO zookeeper.ZooKeeper:
- Client environment:user.dir=/usr/lib/accumulo/classes
- 13/05/03 00:45:16 INFO zookeeper.ZooKeeper:Initiating client connection,
- connectString=localhost sessionTimeout=30000
- watcher=org.apache.accumulo.core.zookeeper
- .ZooSession$AccumuloWatcher@6791d8c1
- 13/05/03 00:45:16 INFO zookeeper.ClientCnxn:
- Opening socket connection to server /127.0.0.1:2181
- 13/05/03 00:45:16 INFOclient.ZooKeeperSaslClient:
- Client will not SASL-authenticate because the defaultJAAS
- configuration section 'Client' could not be found. If youare not
- using SASL, you may ignore this. On the other hand,
- if you expected SASL to work, please fix your JAASconfiguration.
- 13/05/03 00:45:16 INFO zookeeper.ClientCnxn:
- Socket connection established tolocalhost/127.0.0.1:2181,
- initiating session
- 13/05/03 00:45:16 INFO zookeeper.ClientCnxn:
- Session establishment complete on serverlocalhost/127.0.0.1:2181,
- sessionid = 0x13e6757677611f1, negotiated timeout = 30000
- Username:
- joeAdmin
- Password:
- ******
- Kirk Rest Address:111 Carson [ADMIN] 20050612false
- Kirk Rest Grade:Calculus 1 [ADMIN] 20111201false
- Kirk Rest Grade:Organic Chem [ADMIN] 20111201false
- Kirk Rest Grade:Radical Presbyterianism[ADMIN] 20100612 false
- Kirk Rest Payment:Semester Payment [ADMIN]20111223 false
- Kirk Rest Phone:804 [ADMIN] 20050612 false
- Kirk Rest Police Charge:Curfew Violation[ADMIN|POLICE] 20071103 false
- Kirk Rest Police Charge:DUI Arrest[ADMIN|POLICE] 20091104 false
- Kirk Rest SSN:99 [ADMIN] 20050612 false
在此示例中进行认证的用户——joeAdmin,与之前示例中的用户不同,该用户并没有保存在Accumulo中。如这里所示,可以编写一个Java客户端来认证用户,从企业存储拉取授权凭据,并查询Accumulo。
还有更多关于Apache Accumulo的内容,比此小节中所涵盖的要多得多。然而,重要的是要意识到对于为了数据安全而使用Accumulo的组织来说,Accumulo仅是企业安全解决方案的一个方面。企业级安全需要防御纵深,并且必须覆盖整个数据生命周期的安全——而不是仅当数据在Hadoop中保存时。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29754888/viewspace-1258743/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29754888/viewspace-1258743/