基本的安全和HTTP认证

来源:互联网 发布:珑玲加速器mac远程协助 编辑:程序博客网 时间:2024/05/22 02:13

原文:http://rivuli-development.com/further-reading/sesame-cookbook/basic-security-with-http-authentication/




Sesame框架附带了一个预包装的web服务(通常被称为Sesame server)。这个web服务作为一个在线的RDF数据库服务器,有多个SPARQL查询端点和完整的更新功能,允许Sesame的部署。

对于Sesame server(Sesame服务器)的默认设置,没有一点安全可言:每个人都能够访问所有可用的Sesame repositories(Sesame 存储库),能够查询添加数据,删除数据,甚至可以改变服务器的配置(例如:创建新的数据库或者删除已经存在的数据库)。显然,作为一个公开访问的服务器这不是一个理想的设置。

幸运的是,使用标准的Java web应用程序技术:Deployment Descriptor(部署描述符),可以限制一个Sesame服务器。

在这里,我们将会使用web应用程序的部署描述符,结合基本的HTTP认证来给Sesame服务器设置基本的安全约束。对于这个已经解释的目的,我们假设你已经有一个默认的在Apache Tomcat 6运行的Sesame服务器。


内容目录

1. Sesame HTTP REST协议

2. 部署描述符:web.xml

3. 安全角色

4. 身份认证配置

5. 安全约束

    5.1 定义一个只读访问:test-viewer角色

    5.2 定义一个只写访问:test-editor角色

    5.3 创建存储库:sesame-admin角色

6. 用户账号

7. 结论和进一步的阅读



1. Sesame HTTP REST 协议

Sesame服务器实现了一个HTTP通信的RESTful协议(它是SPARQL协议的超集)。这可以归结为这个协议为在一个存储库中的每一个存储库和每一个操作定义了一个指定的位置,通过一个指定的URL,使用一个指定的HTTP方法(GET、POST等等)来到达。

对于我们的安全这是一个很好的消息,因为它意味着我们能够容易的重用基于HTTP的安全限制:因为每个操作在一个存储库映射到一个指定的URL和一个指定的方法,我们能够相当细粒度的访问控制通过简单的限制访问特定的URL模式和/或HTTP方法。

如果这听起来很模糊,这里有一个例子:假如我们有一个运行在http://localhost:8080/openrdf-sesame的Sesame服务器。在这个服务器上的一个被称为‘test’的存储库中检索语句,在URL(http://localhost:8080/openrdf-sesame/repositories/test/statements)上使用HTTP GET操作。所以如果我们想要限制谁可以查看‘test’存储库中的语句,我们所要做的就是在那个指定的URL的GET请求上定义一个安全约束。

下面是来自Sesame服务器中可用的资源和HTTP方法的一个概览

<SESAME_URL>    /protocol                 : protocol version (GET)    /repositories             : overview of available repositories (GET)        /<REP_ID>             : query evaluation on a repository (GET/POST)            /statements       : repository statements (GET/POST/PUT/DELETE)            /contexts         : context overview (GET)            /size             : #statements in repository (GET)            /namespaces       : overview of namespace definitions (GET/DELETE)                /<PREFIX>     : namespace-prefix definition (GET/PUT/DELETE)


在REST协议规范中,你将会找到更多关于每一个URL和每一个HTTP方法做什么的详细描述,但是现在对于我们来说,知道只读操作总是通过HTTP GET方法和只写操作总是使用POST、PUT或者DELETE方法是很有用的。

就像上面所介绍的,能够使用部署描述符在URLs和HTTP方法上定义一个安全约束。在下一个部分,我们将详细的介绍Sesame部署描述符。


2. 部署描述符:web.xml

Sesame服务器的部署描述符是一个XML文件,被称为web.xml。在一个标准的部署中,这个文件可以再[TOMCAT_DIR]/openrdf-sesame/WEB-INF目录中找到。

顾名思义,部署描述符配置是指Sesame服务器网络应用程序应该怎样部署。它包含几个配置设置(比如从URL模式到servlet的映射),但是我们在这里不会接触到。但它还包含安全约束、身份认证设置和一组适用于应用程序的安全角色。


3. 安全角色

通过Java部署描述符的安全是基于角色的安全:而不是将权限分配一个指定的用户账号,我们定义一个抽象的实体被称为角色,分配权限给这个角色,于是使用户成员有一个特定的角色。典型的角色有‘Viewer’、‘Editor’、‘Admin’等等。

在这里,我们准备添加在部署描述符中添加三个角色:

1)test-viewer——这个角色用户在‘test’存储库中有着只读权限,也就是说,可以进行SPARQL查询,导出语句等等。

2)test-editor——这个角色用户在‘test’存储库中有着只写权限,也就是说,可以更新和删除数据

3)sesame-admin——这个角色用户有着管理员的权限,也就是说,用户可以创建新的存储库,更改配置和删除旧的存储库

当然,这仅仅只是为了说明这个目的的一个例子:就是说,需要根据你自己需求为你的应用程序定义用户角色。你可以有访问一个或者更多的指定存储库的角色,一个访问所有存储库的角色,一个只读或者只写的角色等等。由你决定为你的应用程序找出最优的配置。

回到我们刚刚所说的:添加这些角色,将下面的代码片段添加到web.xml文件中(最好是在web.xml中的servlet-mapping元素之后添加这段代码):

<security-role>    <description>        The role that is required for read access to the test repository    </description>    <role-name>test-viewer</role-name></security-role>    <description>        The role that is required for write access to the test repository    </description>    <role-name>test-editor</role-name></security-role><security-role>    <description>        The role that is required to change the Sesame server configuration    </description>    <role-name>sesame-admin</role-name></security-role>

顺便说一下,为了避免你无法工作:不要在Tomcat还在运行的时候编辑web.xml,而且确保你已经在某个地方有一个你改变的备份,以防文件会不小心覆盖默认的部署描述符(不太可能,但也不是不可能)。


4. 身份认证配置

为了保证Sesame服务器基本的HTTP身份认证,我们添加以下的代码到我们的部署描述符中:

<login-config>    <auth-method>BASIC</auth-method>    <realm-name>Sesame</realm-name></login-config>

当我们设置了这个之后,我们可以开始为我们的Sesame服务器定义一个安全约束。


5. 安全约束

一个安全约束最少包含一个web资源集合(定义的URL模式和HTTP方法)和一个授权约束(访问资源集合的角色名)。

因此,让我们一起来看看我们需要做些什么来限制访问。我们已经首先定义了一个‘test-viewer’角色,该用户在test存储库中有只读访问。只读访问意味着访问的操作有SPARQL查询、导出语句、阅读名字空间、环境等等。

5.1 定义只读访问:test-viewer角色

首先,让我们定义一个安全约束,能够让观察者们进行SPARQL查询。如果我们再一次的查看Sesame REST协议规范的总结,我们可以看到查询存储库我们总是通过在url模式repositories/[REP_ID]使用不是GET就是POST方法。因为我们正在为一个id为‘test’的存储库定义一个限制,这个安全约束如下:

<security-constraint>    <web-resource-collection>        <web-resource-name>Sesame test repository: SPARQL query access</web-resource-name>        <url-pattern>/repositories/test</url-pattern>        <http-method>GET</http-method>        <http-method>POST</http-method>    </web-resource-collection>    <auth-constraint>        <role-name>test-viewer</role-name>        <role-name>test-editor</role-name>    </auth-constraint></security-constraint>

就像你所看到的,这个安全约束由两个部分组成:一个是web-resource-collection,它定义URLs和HTTP方法的约束应用;另一个是auth-constraint,它分配约束给一个或者多个角色。

上述约束指定,任何经过身份认证的用户,‘test-viewer’或者‘test-editor’角色可以在URL(http://localhost:8080/openrdf-sesame/test)执行HTTP GET和POST操作。

等一等,我不是说过读操作总是对应于GET方法吗?那么POST方法在这里做什么呢?这是证实了总所周知的例外规则。实际考虑的例外是必要的:因为一些HTTP服务器限制了GET请求参数的长度,因此为了避免当运行大型的SPARQL查询的时候遇到这种限制,POST方法也是被允许的。

如上面所说的,SPARQL查询不是唯一的读访问。Sesame REST协议在存储库中定义了几个其他的读操作。在上面提到的REST规范中,我们可以看到我们可以使用GET操作在不同的URLs嵌套下面/repositories/test, 如/statements,/size,/contexts等等。然而,我们可以看到几个这种模式,例如/statements,也允许其他的方法,如POST,PUT和DELETE。我们想要我们的viewer角色能够执行只读操作,但是没有只写操作,因此我们需要定义下面的约束:

 

<security-constraint>    <web-resource-collection>        <web-resource-name>Sesame test repository viewer access</web-resource-name>        <url-pattern>/repositories/test/*</url-pattern>        <http-method>GET</http-method>    </web-resource-collection>    <auth-constraint>        <role-name>test-viewer</role-name>        <role-name>test-editor</role-name>    </auth-constraint></security-constraint>
在本例中,我们只限制使用GET方法(捕获所有的读操作),而且正如你所看到的,我们使用一个通配符来捕获所有的资源URL模式。

注意,通过这种方法,我们还没有定义任何的安全约束对于test存储库的写操作。这意味着,现在,每一个人都可以在test存储库中进行写操作。我们将会在下一部分处理这个问题。

5.2 定义写操作:test-editor 角色

下一个安全约束集,应该定义谁有权限对test存储库进行写访问。对于test-editor角色我们已经提到,我们已经授予这个角色相同的读访问权限作为test-viewer角色,但是我们需要特别的限制写访问给这个存储库,因此只有这个角色的用户可以进行写操作。这个限制可以通过下面的约束很容易的获得:

<security-constraint>    <web-resource-collection>        <web-resource-name>Sesame test repository: editor write access</web-resource-name>        <url-pattern>/repositories/test/*</url-pattern>        <http-method>POST</http-method>        <http-method>PUT</http-method>        <http-method>DELETE</http-method>    </web-resource-collection>    <auth-constraint>        <role-name>test-editor</role-name>    </auth-constraint></security-constraint>

正如你所见,test存储库的所有的写访问授予给test-editor,通过简单分配给它所有URL模式repositories/test/下POST,PUT和DELETE方法。我们不需要在这里特指GET方法,因为我们已经在其他的安全约束中特指了那个方法。

5.3 创建存储库:sesame-admin角色

最后,我们也需要开始为管理目标设置特指的权限,即sesame-admin角色。这个角色应该可以再这个服务器中管理存储库:创建新的存储库或者删除旧的存储库:

<security-constraint>    <web-resource-collection>        <web-resource-name>Sesame System Config Restricted access</web-resource-name>        <url-pattern>/repositories/SYSTEM/statements</url-pattern>        <url-pattern>/repositories/SYSTEM/namespaces</url-pattern>        <url-pattern>/repositories/SYSTEM/namespaces/*</url-pattern>        <http-method>POST</http-method>        <http-method>PUT</http-method>        <http-method>DELETE</http-method>    </web-resource-collection>    <auth-constraint>        <role-name>sesame-admin</role-name>    </auth-constraint></security-constraint>
正如你所见,我们没有限制读访问给SYSTEM存储库,只有写访问。这是因为很多的Sesame客户端工具希望能够读取服务器配置,因此他们知道那个存储库是可用的。


6. 用户账号

我们现在已经定义了我们的安全约束和角色。然后,我们还没有分配任何的用户账户给角色。事实上,我们还没有定义了的用户。这种情况是发生在部署描述符之外的,并留给servlet容器的。

对于Apache Tomcat,用户账号和密码管理的配置是通过被称为‘Realm’的文件。我们不会在这里对如何配置这个进行详细的介绍,不过我们建议你参考Apache Tomcat Realms Howto(怎样配置Apache Tomcat Realms)。

然后,在一个Apache Tomcat的默认部署里,一个默认的Realm被称作为UserDatabaseRealm是活动的。这个realm是基本的XML文件,称为tomcat-users.xml,而且在[TOMCAT_DIR]/conf目录中找到。你可以创建用户账户和分配给他们角色通过简单的在这个文件中添加user元素。例如,如果我们想要创建三个用户账号john,paul和ringo。john在test存储库中只有查看访问权限,paul应该被允许编辑test存储库,而且ringo应该不仅可以编辑test存储库而且可以对存储库管理任务。我们可以通过在tomcat-users.xml文件中添加下面的三行代码便可以获得上面所提到的目的:

<user username="john" password="letitbe" roles="test-viewer"/><user username="paul" password="heyjude" roles="test-editor"/><user username="ringo" password="yellowsub" roles="test-editor, sesame-admin"/>

你可以分配一个用户不仅仅一个角色。很显然的,这种特指用户账户的方法不是特别的安全:密码是纯文本定义的。使用默认的UserDatabaseRealm是非常有用的,对于快速的测试和调试你的安全设置,但是对于产品的部署,我强烈的建议看一看Apache Tomcat提供的更多的高级的Realm配置。


7. 结论和进一步的阅读

在这里我已经介绍对于一个Sesame服务器你怎样能够配置基本的基于库的安全。你需要根据你的特定的目的来适应、采纳和提升这个基本的配置:就像你将会需要不同的角色和不同的安全约束。你也许也需要配置一个更安全的管理用户账户而不是这里所展示的配置,而且也许你也需要使用更加安全的配置而不是基本的HTTP身份认证(例如,HTTPS Client-Cert身份认证)。

关于这些主题进一步的阅读的一些有用的链接:

》web.xml Deployment Descriptor elements

》Understanding Web Security using web.xml

》Apache Tomcat Realms HowTo

最后,我需要指出的一个可悲的事实:OpenRDF Workbench,是一个Sesame默认的基于网络的客户端工具,当前已经不支持基于HTTP身份认证。幸运的是,其他的客户端工具,如Sesame控制台和Sesame Windows Client依然支持HTTP身份认证,所以你不需要完全靠你自己。



















                                                                                                               































0 0
原创粉丝点击