ElasticSearch结合LDAP实现权限、用户管控

项目背景
使用ElasticSearch实现数据宽表,处理热交互数据,需要实现权限管控等功能,权限粒度要求精确到列。
最初考虑使用Es的SearchGuard开源插件,发现SearchGuard的LDAP功能需要使用企业版,收费的,并且权限粒度仅支持到索引和type,并不支持列;
后来采用Es提供的xpack插件,想办法处理下,就不收费了。

Es需要安装xpack插件,配置默认用户,修改elastic用户的密码为elastic,后续使用简单点

注意,本文只记录ElasticSearch结合LDAP和内置角色,实现列级别的权限管控,不管SSL和TLS加密传输

ElasticSearch、Kibana配置
/conf/elasticsearch.yml中这么添加

xpack.security.enabled:  true
xpack:
 security:
    authc:
      realms:
        ldap1:
          type: ldap
          order: 0
          url: "ldap://192.168.13.12"
          bind_dn: "cn=root,dc=intelli706,dc=com" #ldap管理账户dn
          bind_password: 123456 #ldap管理账户密码
          user_search:
            base_dn: "dc=intelli706,dc=com" #在这个目录树里面检索用户信息
            attribute: uid
          group_search:
            base_dn: "dc=intelli706,dc=com" # 在这个目录树里面检索组信息
          files:
            # 下面这个是通过文件方式配置的LDAP用户域和Es内置角色的映射关系
            role_mapping: "D:\\elasticsearch\\es-xpack\\esnew\\elasticsearch-6.8.0\\config\\role_mapping.yml"
          unmapped_groups_as_roles: false

role_mapping.yml,可配置可不配,就放这里参考下,一般通过api配置映射关系

# Role mapping configuration file which has elasticsearch roles as keys
# that map to one or more user or group distinguished names

#roleA:   this is an elasticsearch role
#  - groupA-DN  this is a group distinguished name
#  - groupB-DN
#  - user1-DN   this is the full user distinguished name

#power_user:
#  - "cn=admins,dc=example,dc=com"
#user:
#  - "cn=users,dc=example,dc=com"
#  - "cn=admins,dc=example,dc=com"
#  - "cn=John Doe,cn=other users,dc=example,dc=com"
superuser:
  - "cn=admin,ou=person,dc=intelli706,dc=com"
  - "cn=zhangyan,ou=person,dc=intelli706,dc=com"

/conf/kibana.yml配置,主要添加了es的用户名密码

elasticsearch.username: "elastic"
elasticsearch.password: "elastic"

再启动ES和kibana后,就需要输入用户名密码才能登陆和访问ES中数据了

LDAP
搭建过程省略;

创建dn时,使用的objectClass是inetOrgPerson
rdn设置为cn=admin, sn=admin, uid=admin, userPassword=admin

使用LDAP Admin windows客户端,连接LDAP服务器,添加组(ou),和模拟用户(cn=admin),生成的dn为 cn=admin,ou=person,dc=intelli,dc=com,简单说明下,LDAP采用树形目录存储结构,cn=admin,ou=person,dc=intelli,dc=com就是一个dn(Distinguish Name),也就是一个唯一ID,能看出来这个是一个目录树的路径,所以能唯一标识entry信息(类似数据库里的一条)

验证admin用户,通过admin账户和admin的密码访问ES的/_xpack/security/_authenticate接口,能看到用户的信息

GET /_xpack/security/_authenticate -u admin:admin
返回:
{
  "username": "admin",
  "roles": [], #注意,还没有绑定任何角色,现在角色是空的
  "full_name": null,
  "email": null,
  "metadata": {
    "ldap_dn": "cn=admin,ou=person,dc=intelli706,dc=com", #admin账户的dn
    "ldap_groups": []
  },
  "enabled": true,
  "authentication_realm": {
    "name": "ldap1", #能看到使用ldap方式获取用户了
    "type": "ldap"
  },
  "lookup_realm": {
    "name": "ldap1",
    "type": "ldap"
  }
}

以下操作用elastic:elastic账户管理

Api方式查询ES中的角色
Kibana界面中其实可以在Management界面中管控角色和内置用户,这里使用Api方式,方便代码调用

GET /_xpack/security/role

注意,使用使用http方式请求时,需要制定Basic Auth的用户名和密码分别为elastic,现在加权限了,请求不带用户名和密码该驳回了。

创建角色
创建一个角色,并给这个角色一个索引权限,能读取索引中的一部分列

POST / _xpack / security / role / <rolename>

POST / _xpack / security / role /xsjc
{
  "cluster": ["all"],
  "indices": [
    {
      "names": [ "tyyw*"],
      "privileges": ["read"],
      "field_security" : {
        "grant" : [ "TYYW_2001_AJ__CBDW_MC", "TYYW_2001_AJ__CBDW_MC.keyword" ]
      }
    }
  ]
}
返回:
{
  "role": {
    "created": true
  }
}

查询角色

GET /_xpack/security/role #查询所有角色
GET /_xpack/security/role/xsjc #查询指定角色

返回

{
  "xsjc": {
    "cluster": [
      "all"
    ],
    "indices": [
      {
        "names": [
          "tyyw*"
        ],
        "privileges": [
          "read"
        ],
        "field_security": {
          "grant": [
            "TYYW_2001_AJ__CBDW_MC",
            "TYYW_2001_AJ__CBDW_MC.keyword" #注意,这个角色只给这两列的read权限
          ]
        },
        "allow_restricted_indices": false
      }
    ],
    "applications": [],
    "run_as": [],
    "metadata": {},
    "transient_metadata": {
      "enabled": true
    }
  }
}

给用户绑定角色
本质上是创建一个用户和角色的映射关系,<user_role_map_name>就是这个角色和映射关系的名称

POST /_xpack/security/role_mapping/<user_role_map_name>

POST /_xpack/security/role_mapping/zhangyan_role
{
    "enabled": true,
    "roles": "xsjc",
    "rules": {
        "field": {
            "dn": "cn=zhangyan,ou=person,dc=intelli706,dc=com"
        }
    }
}
返回:
{
  "role_mapping": {
    "created": true
  }
}

查询用户_角色绑定映射关系

GET /_xpack/security/role_mapping #查询所有的用户_角色映射关系

GET /_xpack/security/role_mapping/zhangyan_role #查询指定的用户_角色映射关系
返回:
{
  "zhangyan_role": {
    "enabled": true,
    "roles": [
      "xsjc"
    ],
    "rules": {
      "field": {
        "dn": "cn=zhangyan,ou=person,dc=intelli706,dc=com"
      }
    },
    "metadata": {}
  }
}

查询用户信息

 GET /_xpack/security/_authenticate -u zhangyan:zhangyan
返回:
{
  "username": "zhangyan",
  "roles": [
    "xsjc" # 可以看到已经有权限了
  ],
  "full_name": null,
  "email": null,
  "metadata": {
    "ldap_dn": "cn=zhangyan,ou=person,dc=intelli706,dc=com",
    "ldap_groups": []
  },
  "enabled": true,
  "authentication_realm": {
    "name": "ldap1",
    "type": "ldap"
  },
  "lookup_realm": {
    "name": "ldap1",
    "type": "ldap"
  }
}

使用zhangyan账户,查询es
可以留意下,返回的数据source中只有TYYW_2001_AJ__CBDW_MC列

{
  "took": 79,
  "timed_out": false,
  "_shards": {
    "total": 10,
    "successful": 10,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 201,
    "max_score": 1.0,
    "hits": [
      {
        "_index": "tyyw_xsjc_0731",
        "_type": "_doc",
        "_id": "东检刑捕受[2019]770000100176",
        "_score": 1.0,
        "_source": {
          "TYYW_2001_AJ__CBDW_MC": "河北省院"
        }
      },
      {
        "_index": "tyyw_xsjc_0731",
        "_type": "_doc",
        "_id": "市检刑捕受[2019]770000100063",
        "_score": 1.0,
        "_source": {}
      },
      {
        "_index": "tyyw_xsjc_0731",
        "_type": "_doc",
        "_id": "东检刑捕受[2019]770000100184",
        "_score": 1.0,
        "_source": {}
      },
      {
        "_index": "tyyw_xsjc_0731",
        "_type": "_doc",
        "_id": "东检刑捕受[2019]770000100146",
        "_score": 1.0,
        "_source": {
          "TYYW_2001_AJ__CBDW_MC": "广东省院"
        }
      },
      {
        "_index": "tyyw_xsjc_0731",
        "_type": "_doc",
        "_id": "市检刑捕受[2019]770000100092",
        "_score": 1.0,
        "_source": {}
      },
      {
        "_index": "tyyw_xsjc_0731",
        "_type": "_doc",
        "_id": "市检刑捕受[2019]770000100096",
        "_score": 1.0,
        "_source": {}
      },
      {
        "_index": "tyyw_xsjc_0731",
        "_type": "_doc",
        "_id": "央检刑捕受[2019]770000100038",
        "_score": 1.0,
        "_source": {}
      },
      {
        "_index": "tyyw_xsjc_0731",
        "_type": "_doc",
        "_id": "西检刑捕受[2019]770000100005",
        "_score": 1.0,
        "_source": {}
      },
      {
        "_index": "tyyw_xsjc_0731",
        "_type": "_doc",
        "_id": "市检刑捕受[2019]770000100080",
        "_score": 1.0,
        "_source": {}
      },
      {
        "_index": "tyyw_xsjc_0731",
        "_type": "_doc",
        "_id": "东检刑捕受[2019]770000100163",
        "_score": 1.0,
        "_source": {}
      },
      {
        "_index": "tyyw_xsjc_0731",
        "_type": "_doc",
        "_id": "央检刑捕受[2019]770000100040",
        "_score": 1.0,
        "_source": {}
      },
      {
        "_index": "tyyw_xsjc_0731",
        "_type": "_doc",
        "_id": "市检刑捕受[2019]770000100093",
        "_score": 1.0,
        "_source": {}
      },
      {
        "_index": "tyyw_xsjc_0731",
        "_type": "_doc",
        "_id": "东检刑捕受[2019]770000100151",
        "_score": 1.0,
        "_source": {
          "TYYW_2001_AJ__CBDW_MC": "汉东省院"
        }
      },
      {
        "_index": "tyyw_xsjc_0731",
        "_type": "_doc",
        "_id": "东检刑捕受[2019]770000100179",
        "_score": 1.0,
        "_source": {}
      },
      {
        "_index": "tyyw_xsjc_0731",
        "_type": "_doc",
        "_id": "区检刑捕受[2019]770000100108",
        "_score": 1.0,
        "_source": {}
      },
      {
        "_index": "tyyw_xsjc_0731",
        "_type": "_doc",
        "_id": "市检刑捕受[2019]770000100058",
        "_score": 1.0,
        "_source": {}
      },
      {
        "_index": "tyyw_xsjc_0731",
        "_type": "_doc",
        "_id": "东检刑捕受[2019]770000100183",
        "_score": 1.0,
        "_source": {}
      },
      {
        "_index": "tyyw_xsjc_0731",
        "_type": "_doc",
        "_id": "市检刑捕受[2019]770000100091",
        "_score": 1.0,
        "_source": {
          "TYYW_2001_AJ__CBDW_MC": "汉东省院"
        }
      },
      {
        "_index": "tyyw_xsjc_0731",
        "_type": "_doc",
        "_id": "东检刑捕受[2019]770000100189",
        "_score": 1.0,
        "_source": {}
      },
      {
        "_index": "tyyw_xsjc_0731",
        "_type": "_doc",
        "_id": "央检刑捕受[2019]770000100043",
        "_score": 1.0,
        "_source": {}
      }
    ]
  },
  "aggregations": {
    "test": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": []
    }
  }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,923评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,154评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,775评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,960评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,976评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,972评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,893评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,709评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,159评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,400评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,552评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,265评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,876评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,528评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,701评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,552评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,451评论 2 352

推荐阅读更多精彩内容