MS RFC 18:映射文件中的密码加密

日期

2006/05/26

作者

丹尼尔·莫里塞特

联系

在mapgears.com的dmorissette

最后编辑

2006/08/11

状态

完成(2006/08/11)

版本

MAPServer 4.10

概述

此建议提供了一种保护内部使用的数据库连接密码的机制。 mapfiles 通过对它们进行加密而不是将它们包含在纯文本中。

技术解决方案

将对mapserver进行扩展,以允许将加密密码用作以下层类型的连接字符串的一部分:

加密/解密功能将使用http://www.simonshephelad.supanet.com/tea.htm上的微型加密算法(TEA)。

实现细节如下…

加密密钥

为了安全地保护加密信息,该机制需要一个加密密钥。密钥不会存储在映射文件中:它将存储在服务器上的单独文件中,并且应由服务器管理员(尤其是在Web服务器的文档目录之外)保存在安全区域。

加密密钥的位置可以通过两种机制指定,一种是通过设置环境变量ms_encryption_key,另一种是使用config指令:

CONFIG MS_ENCRYPTION_KEY "/path/to/mykey.txt"

新的“msencrypt”命令行实用程序

将提供一个“msencrypt”命令行实用程序来创建一个加密密钥并加密密码(或任何字符串),以便在映射文件中使用。

要创建加密密钥:

msencrypt -keygen /path/to/mykey.txt

要加密密码或任何字符串:

msencrypt -key /path/to/mykey.txt <string_to_encrypt>

如果设置了ms_encryption_key环境变量,则不需要指定-key参数。

加密字符串的编码

由于加密的结果是不适合直接包含在MapServer映射文件中的二进制数据,因此十六进制编码将用于映射文件中加密的字符串以及将加密密钥存储到磁盘。

和字符将用作数据库连接内加密字符串的分隔符。这将允许在映射文件中使用纯文本或加密密码,而不会出现任何向后兼容性问题。

例如

CONNECTIONTYPE ORACLESPATIAL
CONNECTION "user/{MIIBugIBAAKBgQCP0Yj+Seh8==}@service"

连接字符串的任何部分都可以加密,而不仅仅是密码。这将允许在必要时保护其他信息,如登录名、主机名或端口号。

以下是将受影响的层类型的典型连接字符串示例,以供参考:

CONNECTIONTYPE POSTGIS
CONNECTION "host=yourhostname dbname=yourdatabasename user=yourdbusername password=yourdbpassword port=yourpgport"

CONNECTIONTYPE SDE
CONNECTION "sdemachine.iastate.edu,port:5151,sde,username,password"

CONNECTIONTYPE ORACLESPATIAL
CONNECTION "user/pwd@service"

CONNECTIONTYPE OGR
CONNECTION "OCI:user/pwd@service"

对源代码的修改

将创建msdecryptstring()函数,它将以连接字符串作为输入,并解密可能在其中找到的任何加密组件。在打开与数据库的连接之前,各种msxxxlayeropen()方法将调用此函数。

char *msDecryptString(mapObj *map, const char *string)

第一次为给定的mapfile调用msdecryptString()时,它将从该文件中加载加密密钥,并将该密钥存储在mapobj的新私有成员中(char*encryptionu key)。

为了减少在长连接字符串(如ogr vrt数据源)中出现错误匹配的可能性,msdecryptstring()函数将查找一对+,然后在继续解密之前验证块中的所有字符都是有效的十六进制编码字符(0-9,a-f)。

请注意,解密后的字符串永远不会存储在layerobj中,它将保留在打开连接的函数的本地位置,并在函数完成后立即销毁。这是为了防止在错误消息或对mssavemap()的调用中暴露解密的信息。

受影响的文件

map.h
mapfile.c
maporaclespatial.c
mappostgis.c
mappostgresql.c
mapsde.c
mapogr.cpp

向后兼容性问题

没有。

臭虫识别码

1792年:https://github.com/MapServer/MapServer/issues/1792

投票历史

2006/06/01通过。+1:法兰克,丹尼尔,霍华德,叶旺德沃塞纳,史蒂文

审查期间的意见

  • 有人担心使用…分隔符来指示连接中的加密字符串。既然没有更好的选择,我们会坚持下去。

  • 有人建议使用encryption_key mapfile关键字而不是config ms_encryption_key。由于两种方法都没有强有力的论据,我们决定继续配置ms-encryption-key。

  • 有人建议考虑河豚算法(http://www.schneier.com/blowfish.html)而不是茶。与Tea相比,Blowfish的示例实现需要更多的工作来集成,而且由于Tea是公共领域,因此更简单(简单更好!)如果我们发现tea太弱(这似乎不成问题),我们现在就坚持tea,以后再改变底层算法。

  • 是否将加密方法提供给mapscript?目前没有这样做的计划,但稍后可以很容易地添加。

  • 由于运行Web服务器(和MapServer)的用户需要具有读取密钥的权限,因此任何Web服务器进程或具有读取密钥权限的用户都可以使用普通程序解密密码。应该在文档中非常清楚地表明,这只是简单的混淆,决不是安全的,用户不应该在加密或不加密的映射文件中放置有价值的密码。