Django Haystack使用Amazon Elasticsearch托管和IAM凭据
我希望使用亚马逊的Elasticsearch服务器在Django数据库中搜索长文本字段。但是,我也不想将此搜索公开给那些没有登录并且不想通过隐蔽性或某些IP限制策略依赖安全性的人(除非它与部署Django应用的现有heroku应用程序配合使用) Haystack似乎在这方面走了很长的路,但似乎没有一种简单的方法可以将其配置为使用Amazon的IAM凭据访问Elasticsearch服务。此功能确实存在于ElasticPy搜索中,它使用ElasticPy 关于使用HTTP授权,我在下面的问题中发现了这一点 我想知道是否有一种方法可以将这两者结合起来,如下所示(正如预期的那样,这会给出一个错误,因为它不仅仅是一个用户名和密码): 这里的错误是:Django Haystack使用Amazon Elasticsearch托管和IAM凭据,django,amazon-web-services,heroku,
elasticsearch,django-haystack,Django,Amazon Web Services,Heroku,
elasticsearch,Django Haystack,我希望使用亚马逊的Elasticsearch服务器在Django数据库中搜索长文本字段。但是,我也不想将此搜索公开给那些没有登录并且不想通过隐蔽性或某些IP限制策略依赖安全性的人(除非它与部署Django应用的现有heroku应用程序配合使用) Haystack似乎在这方面走了很长的路,但似乎没有一种简单的方法可以将其配置为使用Amazon的IAM凭据访问Elasticsearch服务。此功能确实存在于ElasticPy搜索中,它使用ElasticPy 关于使用HTTP授权,我在下面的问题中发
TypeError at /admin/
must be convertible to a buffer, not AWS4Auth
Request Method: GET
Request URL: http://127.0.0.1:8000/admin/
Django Version: 1.7.7
Exception Type: TypeError
Exception Value:
must be convertible to a buffer, not AWS4Auth
Exception Location: /usr/lib/python2.7/base64.py in b64encode, line 53
关于如何实现这一点,您有什么想法吗?(IAM)允许您管理AWS服务的用户和用户权限,以控制AWS本身的用户可以访问哪些AWS资源
您不能使用IAM凭据通过http_auth在应用程序级别对用户进行授权,因为您似乎正在尝试通过Haystack进行授权。它们是针对不同服务的不同身份验证方案。它们不兼容
在您的安全用例中,您已声明需要1)限制对应用程序的访问,2)保护Elasticsearch服务端口不受开放访问。可使用以下方法满足这两个要求:
限制对应用程序的访问
我也不想把这个搜索暴露给那些没有登录的人
对于前端搜索应用程序,您希望在web服务器上使用服务器级(HTTP auth)配置。这是您希望通过标准http_auth用户名和密码(同样,不是IAM)控制用户对应用程序的登录访问的地方。这将在应用程序级别保护您的应用程序
固定Elasticsearch服务端口
不想通过默默无闻或其他方式依赖安全
知识产权限制策略(除非它能与现有的
heroku应用程序,部署Django应用程序的地方)
IP限制正是在这里起作用的,并且符合AWS安全最佳实践。您希望用作防火墙来控制EC2实例的流量
给定干草堆配置:
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
'URL': 'http://127.0.0.1:9200/',
'INDEX_NAME': 'haystack',
},
}
您需要在该IP和端口127.0.0.1上的安全组和/或ACL级别实施IP限制,以限制仅来自Django主机或其他授权主机的访问。这将在服务级别防止任何未经授权的访问
在您的实现中,URL可能会解析为公共或私有IP,具体取决于您的网络体系结构。您离成功还有一步,请将
connection\u class
添加到KWARGS
,一切都应按预期进行
import elasticsearch
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
'URL': [AWSHOST],
'INDEX_NAME': 'haystack',
'KWARGS': {
'port': 443,
'http_auth': awsauth,
'use_ssl': True,
'verify_certs': True,
'connection_class': elasticsearch.RequestsHttpConnection,
}
},
}
您是否试图使用AWS凭据根据您的私有ElasticSearch实现对用户进行身份验证?我已为该应用程序创建了一个Amazon IAM用户。我希望只有那些能够访问该应用程序的人才能使用它向Elasticsearch服务器提交请求。所以只需要一个AWS证书。谢谢Rodrigo。我不想将这些信息保存在Heroku配置变量中,然后将它们传递给视图,然后将请求发送给Amazon,这有什么原因吗?这似乎可以限制访问,因为我可以要求用户登录才能访问搜索页面。你可以打赌@Serioushouse我100%不认识Heroku,也不确定你的配置变量是如何配置的。我知道它是在AWS上运行的。上述配置是执行这些类型的安全云实现的标准方法。运行搜索应用程序的http服务器类型是什么?你试过http_auth吗?注意,我还没有在我的应用程序中使用Haystack的功能,但它确实解决了我在那个阶段遇到的问题。谢谢
TypeError at /admin/
must be convertible to a buffer, not AWS4Auth
Request Method: GET
Request URL: http://127.0.0.1:8000/admin/
Django Version: 1.7.7
Exception Type: TypeError
Exception Value:
must be convertible to a buffer, not AWS4Auth
Exception Location: /usr/lib/python2.7/base64.py in b64encode, line 53
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
'URL': 'http://127.0.0.1:9200/',
'INDEX_NAME': 'haystack',
},
}
import elasticsearch
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
'URL': [AWSHOST],
'INDEX_NAME': 'haystack',
'KWARGS': {
'port': 443,
'http_auth': awsauth,
'use_ssl': True,
'verify_certs': True,
'connection_class': elasticsearch.RequestsHttpConnection,
}
},
}