记录每一次的分享与讨论,
为了下一次的碰撞而准备。

Elasticsearch 安全组件

不要依赖代理来保证ES的安全

每当谈到ES安全时,大部分人或者公司第一个能想到的策略就是隔离。
把整个ES集群放在内网(私有网络)或者 在ES集群前置一个代理层。
这样做是否足够安全? 该如何选择合适的策略来保证ES的安全?

隔离、代理等策略是无法防御来自于内部(VPN、跳板机)的流量窃取、
流量篡改、非法数据清除等攻击手段。对于企业级应用、数据来讲,
虽然代理可以在一定程度上提升防御能力, 但是它无法满足企业对于安全的
高要求。

当前现状

裸跑

  • 不支持 TLS/SSL 加密功能
  • 不支持 Http 基本用户验证、LDAP/AD、Kerberos、客户端证书
    等身份认证功能
  • 不支持 集群、索引、节点的读写操作权限控制功能
   1. 不信任节点可以随意加入集群
   2. 集群节点间数据通过Transport 层交互,未加密,可能被嗅探、篡改。
   3. 通过集群连接信息,任何人可以在集群上为所欲为。
   4. 无论线上、线下都能操作集群。

隔离、代理、Linux iptables

  • 不支持 TLS/SSL 加密功能
  • 不支持 Http 基本用户验证、LDAP/AD、Kerberos、客户端证书
    等身份认证功能
  • 不支持 集群、索引、节点的读写操作权限控制功能
   1. 不信任节点可以随意加入集群
   2. 集群节点间数据通过Transport 层交互,未加密,可能被嗅探、篡改。
   3. 通过集群连接信息,任何人可以在集群上为所欲为。
   4. 只有拥有线上权限(拥有隔离环境权限)才能操作线上集群

TLS/SSL 、 HTTP 加密

  • 支持 TLS/SSL 加密功能
  • 支持 Http 基本用户验证、LDAP/AD、Kerberos、客户端证书
    等身份认证功能
  • 支持 集群、索引、节点的读写操作权限控制功能
   1. 只有信任的节点才能加入集群(信任节点由证书标识)
   2. 针对Transport 层加密  集未,防止节点流量交互时被嗅探、篡改。
   3. 任何操作集群的动作,都会进行身份验证、权限验证。
   4. 只能通过可信证书(客户端证书 or 用户/密码)方式操作集群。

选择安全组件

  • X-PACK x-pack
    收费插件(申请可免费使用一年),TLS、HTTP安全加固,有钱就上它吧,
    省心,注册、授权方便,Elastic官方技术支撑。可以解决上述的安全问题。
  • Search Guard search-guard
    SearchGuard®是Elasticsearch的开放源代码安全套件,也是提供加密,认证,授权,审核日志
    和多租户的整个ELK技术栈。

对于上述两个安全组件都能完美的解决当前存在的安全问题,我选择search-guard的原因如下:
1. search-guard 免费开源(社区版本)
2. 因为开源,可以基于search-guard 进行二次开发。

Search Guard 如何确保集群安全

无论是Elasticsearch Transport 层 还是Elasticsearch REST 层加密,Search Guard 都依赖于 TLS
(Transport Layer Security, 安全传输层协议)。

在Elasticsearch Transport 层, 也就是在使用Transport 客户端时,必须使用集群认可的证书
并且有API的访问权限才正式的访问集群。

而在Elasticsearch REST 层, 也就是在使用REST 客户端时,证书则是可选的,可以通过配置
来指定使用证书还是使用HTTP 基本验证(用户/密码)来访问集群。

为什么要使用 TLS

  • 可以防止其它人窃取数据
  • 可以防止其它人篡改数据
  • 只有可信的节点可以加入集群

TLS(也称为SSLv3)是一种加密协议,用于保护计算机通过网络交互的数据不被窃取、篡改。
TLS 采用对称加密的方式加密传输数据,并在建立连接时,能通过公钥来认证参与资格。
TLS 通过证书来加密数据,并TLS会话过程中进行身份识别和身份认证。

证书的作用

证书可用于签发和签署其他证书,在证书之间建立信任层次结构。
在建立TLS会话时,层次结构中的所有证书都将被验证,直到根证书,只要有一个验证失败,
TLS会话则建立失败。

  • 根证书
    根证书,由根证书颁发机构颁发,是该层次结构的根。
    主要作用是通过根证书(root certificate)颁发节点证书和客户端证书
  • 节点证书
    主要用于Elasticsearch 节点间Transport层数据加密、节点的身份验证等功能。
  • 客户端证书
    主要用于客户端与集群间Transport层数据加密、客户端身份验证等功能。

建立TLS会话的细节(TLS握手的过程)

在任何一方发送用户数据之前,首先必须建立TLS会话。这个过程称为TLS握手。

  • 客户端发送一个ClientHello消息,其中包含它支持的TLS版本和密码协议的信息。
  • 服务器发送包含所选协议版本和密码套件的ServerHello消息和包含公钥的证书。
  • 客户端根据其安装的根证书列表验证证书和所有中间证书。
    如果客户端无法验证证书,则会中断连接或显示警告,具体取决于客户端和设置。
  • 客户端会发送一个“PreMasterSecret”来计算一个通用秘密,称为“主密钥”。
    此主密码用于加密流量。使用服务器证书的公钥对PreMasterSecret进行加密。
    服务器尝试使用其私钥解密客户端消息。如果失败,握手被认为是失败的。
    如果解密成功,握手完成,所有流量都使用主密钥进行加密。
  • 服务器发送客户端证书请求
  • SSL服务器验证SSL客户端的证书
  • SSL客户端向SSL服务器发送“已完成”消息,该消息使用密钥加密,表示握手的客户端部分已完成。
  • SSL服务器向SSL客户端发送“已完成”消息,该消息使用密钥加密,表示握手的服务器部分已完成。
  • 在SSL会话期间,SSL服务器和SSL客户端现在可以使用共享密钥对称加密数据。

理论很枯燥,下面我们就进行实战吧。

如何安装Search Guard

Search Guard JDK要求

  • OpenJDK 7/8 或者 Oracle JVM 7/8.
  • 不支持 IBM VM

Search Guard ~ ELasticsearch Version matrix

选择相应版本,安装Search guard

$ES_HOME/bin/elasticsearch-plugin install -b com.floragunn:search-guard-5:5.5.2-16

生成根证书、节点证书、客户端证书

  1. 下载Search Guard SSL
  2. 进入 example-pki-scripts目录
    • cd example-pki-scripts
  3. 编写一键生成证书的脚本

    user.list 内容
  4. 把生成的 truststore.jks(根证书)、node-*-keystore.jks(节点证书) 放到配置目录中
    • cp truststore.jks 、node-*-keystore.jks $ES_HOME/config
  5. 在elasticsearch.yml 配置证书
    由于ES暴露的REST API 是使用 Nginx进行负载均衡的,当前的环境里不支持nginx 负载后端的https服务,所以ES REST API没有强制的采取证书认证。
    search guard 通过 searchguard.ssl.http.clientauth_mode 参数来控制客户端认证方式

  6. 配置完成后启动所有节点
    第一次启动时,会从日志里看到以下信息。

    因为search guard 需要把用户、角色、权限等信息通过脚本写入到集群的特定索引中去(企业版本可以用REST API去管理,社区版就用脚本更新吧)

  7. 通过脚本创建用户信息

    • cd $ES_HOME/plugins/search-guard-5/tools
    • sh hash.sh xxx
  8. 新增内置用户
    • vim ../sgconfig/sg_internal_users.yml
  9. 分配权限
    • vim ../sgconfig/sg_roles_mapping.yml
  10. 推送配置到集群上,完成初始化
    • ./sgadmin.sh -cd $ES_HOME/plugins/search-guard-5/sgconfig -ks $ES_CA/ricky-keystore.jks -kspass NR0mK7YCafA3MhLA -ts $ES_HOME/config/truststore.jks -tspass JtCww73Mf5doIkJC -nhnv -nrhn -icl -h 1.1.1.10 -p 9300 --diagnose --accept-red-cluster
      ricky-keystore.jks 为客户端证书,并且,在elasitcsearch.yml配置成admin,具有较高的权限。
  11. 验证集群
    • 访问集群 1.1.1.10:9200
    • 验证当前身份、权限
      curl -XGET '1.1.1.10:9200/_searchguard/authinfo?pretty'

未经允许不得转载:Elasticsearch Club » Elasticsearch 安全组件

分享到:更多 ()
希望每个得到帮助的朋友,能够赞助一波:

    

评论 抢沙发

评论前必须登录!