客户端证书身份验证
在从证书颁发机构 (CA) 获取您自己的证书或使用 OpenSSL 生成您自己的证书后,您可以开始配置 OpenSearch 以使用客户端证书对用户进行身份验证。
客户端证书认证比仅使用基本认证(用户名和密码)提供更多的安全优势。因为客户端证书认证需要客户端证书及其私钥(通常由用户持有),所以它不易受到恶意个人试图猜测用户密码的暴力破解攻击。
客户端证书认证的另一个优点是,您可以将其与基本认证一起使用,提供两层安全保护。
启用客户端证书认证
要启用客户端证书认证,您必须首先在 opensearch.yml
中将 clientauth_mode
设置为 OPTIONAL
或 REQUIRE
。
plugins.security.ssl.http.clientauth_mode: OPTIONAL
接下来,在 config.yml
的 client_auth_domain
部分启用客户端证书认证。
clientcert_auth_domain:
description: "Authenticate via SSL client certificates"
http_enabled: true
transport_enabled: true
order: 1
http_authenticator:
type: clientcert
config:
username_attribute: cn #optional, if omitted DN becomes username
challenge: false
authentication_backend:
type: noop
为证书的通用名称分配角色
您现在可以将证书的通用名称 (CN) 分配给一个角色。此步骤要求您识别证书的 CN 以及要分配给它的角色。要查看所有预定义 OpenSearch 角色的列表,请参阅预定义角色。首先定义一个角色,然后将证书的 CN 映射到该角色。
确定要将哪个角色映射到证书的 CN 后,您可以使用OpenSearch Dashboards、roles_mapping.yml
或 REST API 来映射角色。以下示例使用 REST API
将 CN CLIENT1
映射到角色 readall
。
请求示例
PUT _plugins/_security/api/rolesmapping/readall
{
"backend_roles" : ["sample_role" ],
"hosts" : [ "example.host.com" ],
"users" : [ "CLIENT1" ]
}
示例响应
{
"status": "OK",
"message": "'readall' updated."
}
将角色映射到客户端证书的 CN 后,您就可以使用这些凭据连接到您的集群了。
下面的代码示例使用 Python requests
库连接到本地 OpenSearch 集群,并向 movies
索引发送 GET 请求。
import requests
import json
base_url = 'https://:9200/'
headers = {
'Content-Type': 'application/json'
}
cert_file_path = "/full/path/to/client-cert.pem"
key_file_path = "/full/path/to/client-cert-key.pem"
root_ca_path = "/full/path/to/root-ca.pem"
# Send the request.
path = 'movies/_doc/3'
url = base_url + path
response = requests.get(url, cert = (cert_file_path, key_file_path), verify=root_ca_path)
print(response.text)
在 Docker 中使用证书
虽然我们建议使用 ODFE 的 tarball 安装来测试客户端证书认证配置,但您也可以使用其他任何安装类型。有关使用 Docker 安全功能的说明,请参阅配置基本安全设置。