利用Accumulo的访问控制保护

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:查看数据


[java]  view plain copy
  1. "font-family:Microsoft YaHei;font-size:14px;">root@accumulo universitydata> scan  
  2.    
  3. Kirk Rest Address:111Carson Ave, Richmond VA [ADMIN]  
  4. Kirk RestGrade:Calculus 1 [ADMIN] B  
  5. Kirk RestGrade:Organic Chem [ADMIN] A  
  6. Kirk RestGrade:Radical Presbyterianism [ADMIN] D  
  7. Kirk Rest MedicalTest Report:Cholesterol [MEDICAL] 200  
  8. Kirk Rest NedicalTest Report:Biopsy [MEDICAL] Negative  
  9. Kirk RestPayment:Semester Payment [ADMIN] 1000  
  10. Kirk RestPhone:8045550005 [ADMIN]  
  11. Kirk Rest PoliceCharge:Curfew Violation [ADMIN|POLICE] Pending Hearing  
  12. Kirk Rest PoliceCharge:DUI Arrest [ADMIN|POLICE] Guilty  
  13. Kirk Rest RunningTest:10K [COACH] 56  
  14. Kirk Rest RunningTest:5K [COACH] 27  
  15. Kirk RestSSN:99999999 [ADMIN]  
  16. Kirk Rest Weight:170 [MEDICAL|COACH]  



为演示单元格可见性的示例,需要创建下列用户:

●    医生(drhouse),为其分配MEDICAL角色

●    管理员(denyseAccountant),为其分配ADMIN角色

●    教练(coachTark),为其分配COACH角色

●    警察局长(chiefDoug),为其分配POLICE角色

如代码清单12-2所示,使用shell来为所有这些能够读取表的用户分配访问权限(授予他们每个人Table.READ权限),并使用setauths命令为他们分配用于可见性的适当角色。

代码清单12-2:分配访问权限和用户视图


[java]  view plain copy
  1. "font-family:Microsoft YaHei;font-size:14px;">root@accumulo universitydata> grantTable.READ -t universitydata -u drhouse  
  2. root@accumulouniversitydata> setauths -s MEDICAL -user drhouse  
  3.    
  4. root@accumulouniversitydata> grant Table.READ -t universitydata -u  
  5. denyseAccountant  
  6. root@accumulouniversitydata> setauths -s ADMIN -user denyseAccountant  
  7.    
  8. root@accumulo universitydata> grant Table.READ -t universitydata -ucoachTark  
  9. root@accumulouniversitydata> setauths -s COACH -user coachTark  
  10.    
  11. root@accumulo universitydata> grant Table.READ -t universitydata -uchiefDoug  
  12. root@accumulo universitydata>setauths -s POLICE -user chiefDoug  



最后,为展示Accumulo现在将保护对表的访问,以每个用户的身份登录并使用Accumulo shell。对universitydata表进行扫描(或迭代)。代码清单12-3展示了如何以用户coachTark、drHouse、denyseAccountant和chiefDoug的身份登录,并对表进行迭代,而且表基于每个用户的权限提供了访问控制。

代码清单12-3:演示用户的角色和可见性


[java]  view plain copy
  1. "font-family:Microsoft YaHei;font-size:14px;">root@accumulo universitydata> user coachTark  
  2. Enter password foruser coachTark: *********  
  3.    
  4. coachTark@accumulouniversitydata> scan  
  5. Kirk Rest RunningTest:10K [COACH] 56  
  6. Kirk Rest RunningTest:5K [COACH] 27  
  7. Kirk Rest Weight:170[MEDICAL|COACH]  
  8.    
  9. root@accumulouniversitydata> user drhouse  
  10.    
  11. Enter password foruser drhouse: *******  
  12. drhouse@accumulouniversitydata> scan  
  13.    
  14. Kirk Rest MedicalTest Report:Cholesterol [MEDICAL] 200  
  15. Kirk Rest NedicalTest Report:Biopsy [MEDICAL] Negative  
  16. Kirk Rest Weight:170[MEDICAL|COACH]  
  17.    
  18. drhouse@accumulouniversitydata> user denyseAccountant  
  19.    
  20. Enter password foruser denyseAccountant: ******  
  21. denyseAccountant@accumulouniversitydata> scan  
  22.    
  23. Kirk Rest Address:111Carson [ADMIN]  
  24. Kirk RestGrade:Calculus 1 [ADMIN] B  
  25. Kirk Rest Grade:OrganicChem [ADMIN] A  
  26. Kirk RestGrade:Radical Presbyterianism [ADMIN] D  
  27. Kirk RestPayment:Semester Payment [ADMIN] 1000  
  28. Kirk RestPhone:8045550005 [ADMIN]  
  29. Kirk Rest PoliceCharge:Curfew Violation [ADMIN|POLICE] Pending Hearing  
  30. Kirk Rest PoliceCharge:DUI Arrest [ADMIN|POLICE] Guilty  
  31. Kirk RestSSN:999999999 [ADMIN]  
  32.    
  33. denyseAccountant@accumulouniversitydata> user chiefDoug  
  34. Enter password foruser chiefDoug: *********  
  35. chiefDoug@accumulouniversitydata> scan  
  36.    
  37. Kirk Rest PoliceCharge:Curfew Violation [ADMIN|POLICE] Pending Hearing  
  38. 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客户端代码示例


[java]  view plain copy
  1. "font-family:Microsoft YaHei;font-size:14px;">import java.util.Collection;  
  2. importjava.util.Collections;  
  3. importjava.util.Map.Entry;  
  4.    
  5. import org.apache.accumulo.core.client.Connector;  
  6. importorg.apache.accumulo.core.client.ZooKeeperInstance;  
  7.    
  8. importorg.apache.accumulo.core.client.Scanner;  
  9. importorg.apache.accumulo.core.data.Key;  
  10. importorg.apache.accumulo.core.data.Range;  
  11. importorg.apache.accumulo.core.data.Value;  
  12. importorg.apache.accumulo.core.security.Authorizations;  
  13.    
  14. public classQueryExample  
  15. {  
  16. public static void main(String[] args)throws Exception  
  17. {  
  18. //Simple Example of the name of youraccumulo instance & zookeeper  
  19. ZooKeeperInstanceinst = new ZooKeeperInstance("accumulo""localhost");  
  20.    
  21. //Obviously this is just an example  
  22. Connector connector =inst.getConnector("root""secret");  
  23.    
  24. //Scan in the username and password forthis simple example  
  25.    
  26. java.util.Scanner in = newjava.util.Scanner(System.in);  
  27. System.out.println("Username:");  
  28. String username = in.nextLine();  
  29. System.out.println("Password:");  
  30. String password = in.nextLine();  
  31.    
  32. Authorizations auths = null;  
  33.    
  34. try  
  35. {  
  36. //An example of how you can interactwith other systems (LDAP,etc)  
  37.    
  38. CustomAuthenticator authenticator = newCustomAuthenticator();  
  39. authenticator.authenticate(username,password);  
  40.    
  41. //Retrieve credentials from externalsystem  
  42. auths =authenticator.getAuthorizationInfo(username);  
  43. }  
  44. catch (ExceptionauthenticationException)  
  45. {  
  46. System.out.println("AuthenticationFailure.");  
  47. System.exit(-1);  
  48. }  
  49.    
  50. // Search our university data example& print out everything  
  51.    
  52. Scanner scanner =connector.createScanner("universitydata", auths);  
  53. for (Entry entry :scanner) {  
  54. System.out.println( entry.getKey().toString());  
  55. }  
  56. }  
  57. }  



一旦建立了连接,就要认证用户。在这种情况下,对于这样一个简单的示例,从命令行抓取用户信息,并将其传递给一个叫做CustomAuthenticator的外部类,编写此类仅是为了展示可以使用Accumulo之外的另一种认证和授权机制。在该类中,将从命令行中扫描到的用户名和密码传入该类的authenticate()方法。如果用户认证成功,那么接着从外部存储拉取用户的授权凭据,并返回Accumulo期望的org.apache.accumulo.core.security. Authorizations类中的值。最后,如之前示例中所示,创建一个扫描器对相同表中的值进行迭代,并简单地打印结果。

代码清单12-5展示了命令行中的结果。在此示例中,设置了一个外部的LDAP目录,其中包含一个叫做joeUser的用户,其角色为ADMIN。

代码清单12-5:Accumulo客户端的结果


[java]  view plain copy
  1. "font-family:Microsoft YaHei;font-size:14px;">Script started on Fri 03 May 2013 12:45:09 AM EDT  
  2. $ java QueryExample  
  3. 13/05/03 00:45:16INFO zookeeper.ZooKeeper:  
  4. Clientenvironment:zookeeper.version=3.4.3--1,  
  5. built on 03/20/2012 16:15 GMT  
  6. 13/05/03 00:45:16INFO zookeeper.ZooKeeper:  
  7. Client environment:host.name=ubuntu  
  8. 13/05/03 00:45:16INFO zookeeper.ZooKeeper:  
  9. Clientenvironment:java.version=1.6.0_27  
  10. 13/05/03 00:45:16INFO zookeeper.ZooKeeper:  
  11. Client environment:java.vendor=SunMicrosystems Inc.  
  12. 13/05/03 00:45:16INFO zookeeper.ZooKeeper:  
  13. Clientenvironment:java.home=/usr/lib/jvm/java-6-openjdk-amd64/jre  
  14. 13/05/03 00:45:16INFO zookeeper.ZooKeeper:  
  15. Client environment:java.class.path=.  
  16. 13/05/03 00:45:16 INFO zookeeper.ZooKeeper:  
  17. Clientenvironment:java.library.path=/usr/lib/jvm/java-6-openjdkamd64/  
  18. jre/lib/amd64/server:/usr/lib/jvm/java-6-openjdkamd64/  
  19. jre/lib/amd64:/usr/lib/jvm/java-6-openjdkamd64/  
  20. jre/../lib/amd64:/usr/java/packages/lib/amd64:/usr/lib/x86_64-linuxgnu/  
  21. jni:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linuxgnu:/  
  22. usr/lib/jni:/lib:/usr/lib  
  23. 13/05/03 00:45:16 INFO zookeeper.ZooKeeper:  
  24. Client environment:java.io.tmpdir=/tmp  
  25. 13/05/03 00:45:16 INFO zookeeper.ZooKeeper:  
  26. Client environment:java.compiler=  
  27. 13/05/03 00:45:16 INFO zookeeper.ZooKeeper:Client environment:os.name=Linux  
  28. 13/05/03 00:45:16 INFO zookeeper.ZooKeeper:Client environment:os.arch=amd64  
  29. 13/05/03 00:45:16 INFO zookeeper.ZooKeeper:  
  30. Client environment:os.version=3.2.0-29-generic  
  31. 13/05/03 00:45:16 INFO zookeeper.ZooKeeper:  
  32. Client environment:user.name=accumulo  
  33. 13/05/03 00:45:16 INFO zookeeper.ZooKeeper:  
  34. Client environment:user.home=/usr/lib/accumulo  
  35. 13/05/03 00:45:16 INFO zookeeper.ZooKeeper:  
  36. Client environment:user.dir=/usr/lib/accumulo/classes  
  37. 13/05/03 00:45:16 INFO zookeeper.ZooKeeper:Initiating client connection,  
  38. connectString=localhost sessionTimeout=30000  
  39. watcher=org.apache.accumulo.core.zookeeper  
  40. .ZooSession$AccumuloWatcher@6791d8c1  
  41. 13/05/03 00:45:16 INFO zookeeper.ClientCnxn:  
  42. Opening socket connection to server /127.0.0.1:2181  
  43. 13/05/03 00:45:16 INFOclient.ZooKeeperSaslClient:  
  44. Client will not SASL-authenticate because the defaultJAAS  
  45. configuration section 'Client' could not be found. If youare not  
  46. using SASL, you may ignore this. On the other hand,  
  47. if you expected SASL to work, please fix your JAASconfiguration.  
  48. 13/05/03 00:45:16 INFO zookeeper.ClientCnxn:  
  49. Socket connection established tolocalhost/127.0.0.1:2181,  
  50. initiating session  
  51. 13/05/03 00:45:16 INFO zookeeper.ClientCnxn:  
  52. Session establishment complete on serverlocalhost/127.0.0.1:2181,  
  53. sessionid = 0x13e6757677611f1, negotiated timeout = 30000  
  54. Username:  
  55. joeAdmin  
  56. Password:  
  57. ******  
  58. Kirk Rest Address:111 Carson [ADMIN] 20050612false  
  59. Kirk Rest Grade:Calculus 1 [ADMIN] 20111201false  
  60. Kirk Rest Grade:Organic Chem [ADMIN] 20111201false  
  61. Kirk Rest Grade:Radical Presbyterianism[ADMIN] 20100612 false  
  62. Kirk Rest Payment:Semester Payment [ADMIN]20111223 false  
  63. Kirk Rest Phone:804 [ADMIN] 20050612 false  
  64. Kirk Rest Police Charge:Curfew Violation[ADMIN|POLICE] 20071103 false  
  65. Kirk Rest Police Charge:DUI Arrest[ADMIN|POLICE] 20091104 false  
  66. 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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值