elasticsearch,django-haystack,Django,Amazon Web Services,Heroku,elasticsearch,Django Haystack" /> elasticsearch,django-haystack,Django,Amazon Web Services,Heroku,elasticsearch,Django Haystack" />

Django Haystack使用Amazon Elasticsearch托管和IAM凭据

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授权,我在下面的问题中发

我希望使用亚马逊的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,
        }
    },
}