为搜索引擎配置Apache

本主题讨论使用传输层安全性(TLS)加密和HTTP基本身份验证的组合来保护Web服务器和搜索引擎(Elasticsearch或OpenSearch)之间通信的示例。 您也可以选择配置其他类型的身份验证;我们会提供该信息的参考。

(旧称安全套接字层(SSL)经常与TLS互换使用。 在此主题中,我们称为​ TLS。)

WARNING
除非另有说明,否则此主题中的所有命令都必须以具有root权限的用户身份输入。

Recommendations

我们建议执行以下操作:

  • 您的Web服务器使用TLS。

    TLS超出了本主题的范围;但是,我们强烈建议您在生产中使用真正的证书,而不是自签名证书。

  • 您的搜索引擎与Web服务器在同一主机上运行。 在不同主机上运行搜索引擎和Web服务器超出了本主题的范围。

    将搜索引擎和Web服务器放在同一台主机上的优点是,它使得拦截加密通信变得不可能。 搜索引擎Web服务器不必与Adobe Commerce Web服务器相同;例如,Adobe Commerce可以运行Apache,而Elasticsearch/OpenSearch可以运行nginx。

    如果搜索引擎向公共Web公开,则应当配置身份验证。 如果您的搜索引擎实例在网络内受到保护,则可能没有必要。 与您的托管提供商合作,确定您应当实施哪些安全措施来保护实例。

有关TLS的更多信息

请参阅以下资源之一:

设置代理

NOTE
2.4.4中添加了OpenSearch支持。OpenSearch是兼容的Elasticsearch分支。 有关详细信息,请参阅将Elasticsearch迁移到OpenSearch

本节讨论如何将Apache配置为​ 不安全 ​代理,以便Adobe Commerce能够使用在此服务器上运行的搜索引擎。 本节不讨论设置HTTP基本身份验证;这将在与Apache的安全通信中讨论。

NOTE
在此示例中,代理不受保护的原因是它更容易设置和验证。 可以将TLS与此代理一起使用。 如果要这样做,请确保将代理信息添加到安全虚拟主机配置中。

为Apache 2.4设置代理

本节讨论如何使用虚拟主机配置代理。

  1. 按如下方式启用mod_proxy

    code language-bash
    a2enmod proxy_http
    
  2. 使用文本编辑器打开/etc/apache2/sites-available/000-default.conf

  3. 在文件的顶部添加以下指令:

    code language-conf
    Listen 8080
    
  4. 在文件底部添加以下内容:

    code language-conf
    <VirtualHost *:8080>
        ProxyPass "/" "http://localhost:9200/"
        ProxyPassReverse "/" "http://localhost:9200/"
    </VirtualHost>
    
  5. 重新启动Apache:

    code language-bash
    service apache2 restart
    
  6. 通过输入以下命令验证代理是否正常工作:

    code language-bash
    curl -i http://localhost:<proxy port>/_cluster/health
    

    例如,如果您使用Elasticsearch,而您的代理使用的是端口8080:

    code language-bash
    curl -i http://localhost:8080/_cluster/health
    

    类似于以下内容的消息显示成功:

    code language-none
    HTTP/1.1 200 OK
    Date: Tue, 23 Feb 2019 20:38:03 GMT
    Content-Type: application/json; charset=UTF-8
    Content-Length: 389
    Connection: keep-alive
    
    {"cluster_name":"elasticsearch","status":"yellow","timed_out":false,"number_of_nodes":1,"number_of_data_nodes":1,"active_primary_shards":5,"active_shards":5,"relocating_shards":0,"initializing_shards":0,"unassigned_shards":5,"delayed_unassigned_shards":0,"number_of_pending_tasks":0,"number_of_in_flight_fetch":0,"task_max_waiting_in_queue_millis":0,"active_shards_percent_as_number":50.0}
    

与Apache的安全通信

本节讨论如何使用Apache的HTTP Basic身份验证来保护Apache和搜索引擎之间的通信。 有关更多选项,请参阅以下资源之一:

请参阅以下部分之一:

创建密码

出于安全原因,您可以在Web服务器docroot以外的任何位置查找密码文件。 在本例中,我们将说明如何将密码文件存储在新目录中。

安装htpasswd(如有必要)

首先,查看您是否按如下方式安装了Apache htpasswd实用程序:

  1. 输入以下命令以确定是否已安装htpasswd

    code language-bash
    which htpasswd
    

    如果显示路径,则表明已安装;如果命令未返回任何输出,则表明未安装htpasswd

  2. 如有必要,请安装htpasswd

    • Ubuntu: apt-get -y install apache2-utils
    • CentOS: yum -y install httpd-tools

创建密码文件

以具有root权限的用户身份输入以下命令:

mkdir -p /usr/local/apache/password
htpasswd -c /usr/local/apache/password/.<password file name> <username>

位置

  • <username>可以是:

    • 设置cron:Web服务器用户或其他用户。

    在本例中,我们使用Web服务器用户,但用户的选择取决于您。

    • 设置Elasticsearch:在此示例中,用户名为magento_elasticsearch
  • <password file name>必须为隐藏文件(以.开头),且应反映用户的名称。 有关详细信息,请参阅此部分后面的示例。

按照屏幕上的提示为用户创建密码。

示例

示例1: cron
您必须为cron仅设置一个用户的身份验证;在本例中,我们使用Web服务器用户。 要为Web服务器用户创建密码文件,请输入以下命令:

mkdir -p /usr/local/apache/password
htpasswd -c /usr/local/apache/password/.htpasswd apache

示例2:Elasticsearch
您必须为两个用户设置身份验证:一个具有对nginx的访问权限,另一个具有对Elasticsearch的访问权限。 要为这些用户创建密码文件,请输入以下命令:

mkdir -p /usr/local/apache/password
htpasswd -c /usr/local/apache/password/.htpasswd_elasticsearch magento_elasticsearch

添加其他用户

要将其他用户添加到密码文件,请以具有root权限的用户身份输入以下命令:

htpasswd /usr/local/apache/password/.htpasswd <username>

与Apache的安全通信

本节讨论如何设置HTTP基本身份验证。 同时使用TLS和HTTP Basic身份验证可防止任何人截获与Elasticsearch、OpenSearch或您的应用程序服务器的通信。

本节将讨论如何指定谁可以访问Apache Server。

  1. 使用文本编辑器将以下内容添加到您的安全虚拟主机。

    • Apache 2.4:编辑/etc/apache2/sites-available/default-ssl.conf
    code language-conf
    <Proxy *>
        Order deny,allow
        Allow from all
    
        AuthType Basic
        AuthName "Elasticsearch Server" # or OpenSearch Server
        AuthBasicProvider file
        AuthUserFile /usr/local/apache/password/.htpasswd_elasticsearch
        Require valid-user
    
      # This allows OPTIONS-requests without authorization
      <LimitExcept OPTIONS>
            Require valid-user
      </LimitExcept>
    </Proxy>
    
  2. 如果将上述添加到安全虚拟主机中,请删除Listen 8080以及之前添加到不安全虚拟主机中的<VirtualHost *:8080>指令。

  3. 保存更改,退出文本编辑器,然后重新启动Apache:

    • CentOS: service httpd restart
    • Ubuntu: service apache2 restart

验证

本节将讨论验证HTTP基本身份验证是否正常工作的两种方法:

  • 使用curl命令验证必须输入用户名和密码才能获取群集状态
  • 在管理员中配置HTTP基本身份验证

使用curl命令验证群集状态

输入以下命令:

curl -i http://<hostname, ip, or localhost>:<proxy port>/_cluster/health

例如,如果在搜索引擎服务器上输入命令,而您的代理使用的是端口8080:

curl -i http://localhost:8080/_cluster/health

将显示以下消息来指示验证失败:

HTTP/1.1 401 Unauthorized
Date: Tue, 23 Feb 2016 20:35:29 GMT
Content-Type: text/html
Content-Length: 194
Connection: keep-alive
WWW-Authenticate: Basic realm="Restricted"
<html>
<head><title>401 Authorization Required</title></head>
<body bgcolor="white">
  <center><h1>401 Authorization Required</h1></center>
</body>
</html>

现在尝试以下命令:

curl -i -u <username>:<password> http://<hostname, ip, or localhost>:<proxy port>/_cluster/health

例如:

curl -i -u magento_elasticsearch:mypassword http://localhost:8080/_cluster/health

此时,该命令会成功,并显示一条类似于以下内容的消息:

HTTP/1.1 200 OK
Date: Tue, 23 Feb 2016 20:38:03 GMT
Content-Type: application/json; charset=UTF-8
Content-Length: 389
Connection: keep-alive
{"cluster_name":"elasticsearch","status":"yellow","timed_out":false,"number_of_nodes":1,"number_of_data_nodes":1,"active_primary_shards":5,"active_shards":5,"relocating_shards":0,"initializing_shards":0,"unassigned_shards":5,"delayed_unassigned_shards":0,"number_of_pending_tasks":0,"number_of_in_flight_fetch":0,"task_max_waiting_in_queue_millis":0,"active_shards_percent_as_number":50.0}

在管理员中配置HTTP基本身份验证

执行搜索引擎配置 中讨论的相同任务,但 ​除外,请单击​ Enable HTTP Auth ​列表中的​ Yes,然后在提供的字段中输入用户名和密码。

单击​ Test Connection ​以确保它正常工作,然后单击​ Save Config

在继续之前,必须刷新缓存并重新索引。

recommendation-more-help
0f8e7db5-0e9c-4002-a5b8-a0088077d995