为搜索引擎配置Apache
本主题讨论使用传输层安全性(TLS)加密和HTTP基本身份验证的组合来保护Web服务器和搜索引擎(Elasticsearch或OpenSearch)之间通信的示例。 您也可以选择配置其他类型的身份验证;我们会提供该信息的参考。
(旧称安全套接字层(SSL)经常与TLS互换使用。 在此主题中,我们称为 TLS。)
root
权限的用户身份输入。Recommendations
我们建议执行以下操作:
-
您的Web服务器使用TLS。
TLS超出了本主题的范围;但是,我们强烈建议您在生产中使用真正的证书,而不是自签名证书。
-
您的搜索引擎与Web服务器在同一主机上运行。 在不同主机上运行搜索引擎和Web服务器超出了本主题的范围。
将搜索引擎和Web服务器放在同一台主机上的优点是,它使得拦截加密通信变得不可能。 搜索引擎Web服务器不必与Adobe Commerce Web服务器相同;例如,Adobe Commerce可以运行Apache,而Elasticsearch/OpenSearch可以运行nginx。
如果搜索引擎向公共Web公开,则应当配置身份验证。 如果您的搜索引擎实例在网络内受到保护,则可能没有必要。 与您的托管提供商合作,确定您应当实施哪些安全措施来保护实例。
有关TLS的更多信息
请参阅以下资源之一:
设置代理
本节讨论如何将Apache配置为 不安全 代理,以便Adobe Commerce能够使用在此服务器上运行的搜索引擎。 本节不讨论设置HTTP基本身份验证;这将在与Apache的安全通信中讨论。
为Apache 2.4设置代理
本节讨论如何使用虚拟主机配置代理。
-
按如下方式启用
mod_proxy
:code language-bash a2enmod proxy_http
-
使用文本编辑器打开
/etc/apache2/sites-available/000-default.conf
-
在文件的顶部添加以下指令:
code language-conf Listen 8080
-
在文件底部添加以下内容:
code language-conf <VirtualHost *:8080> ProxyPass "/" "http://localhost:9200/" ProxyPassReverse "/" "http://localhost:9200/" </VirtualHost>
-
重新启动Apache:
code language-bash service apache2 restart
-
通过输入以下命令验证代理是否正常工作:
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
实用程序:
-
输入以下命令以确定是否已安装
htpasswd
:code language-bash which htpasswd
如果显示路径,则表明已安装;如果命令未返回任何输出,则表明未安装
htpasswd
。 -
如有必要,请安装
htpasswd
:- Ubuntu:
apt-get -y install apache2-utils
- CentOS:
yum -y install httpd-tools
- Ubuntu:
创建密码文件
以具有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。
-
使用文本编辑器将以下内容添加到您的安全虚拟主机。
- 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>
- Apache 2.4:编辑
-
如果将上述添加到安全虚拟主机中,请删除
Listen 8080
以及之前添加到不安全虚拟主机中的<VirtualHost *:8080>
指令。 -
保存更改,退出文本编辑器,然后重新启动Apache:
- CentOS:
service httpd restart
- Ubuntu:
service apache2 restart
- CentOS:
验证
本节将讨论验证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。
在继续之前,必须刷新缓存并重新索引。