ElasticSearchTransportClient集成SearchGuard插件实现索引级别的权限管控
ElasticSearchTransportClient集成SearchGuard插件實現索引級別的權限管控
由于官方的X-pack收費,所以退而求其次選擇了SearchGuard作為ElasticSearch集群的安全權限管控組件。如果已經按照官網標準為ElasticSearch每個節點都安裝好了SearchGuard插件
集群環境:三臺ElasticSearch節點版本5.4.3;SearchGuard5;本文主要提供一種基于pem證書和key密碼進行TransportClient認證,從而達到和后端用戶實現映射的方法。
我們其實都知道路徑{ElasticSearch路徑}/plugins/search-guard-5/sgconfig 中的各個配置文件的作用,但是并不知道如何將這種純后端形式的user轉換成證書的權限:
這里面涉及到了一個內部后端用戶和證書的映射問題如果是admin證書那將會有所有權限,分配出去權限設置如同虛設,如果是非admin證書,只是普通的客戶端證書操作時會報錯“沒有該用戶”;我們就可以按照這個錯誤去解決問題了,這個用戶其實指的就是內部后端的用戶,用戶名就是最開始使用ssl工具刷新時使用的tlsconfig.yml中的 dn的值
主要是tlsconfig.yml中的client標簽下的配置:
clients:- name: spock dn: CN=spock.zglt.com,OU=Ops,O=Client,DC=example,DC=com admin: true - name: kirk dn: CN=kirk.zglt.com,OU=Ops,O=Client,DC=example,DC=com admin: true - name: client dn: CN=client.zglt.com,OU=Ops,O=Client,DC=example,DC=com這其中的spock和kirk的證書就是admin的用戶證書,可以以admin用戶的權限對集群進行操作;client就是我們預留出來的訪問客戶端證書“CN=client.zglt.com,OU=Ops,O=Client,DC=example,DC=com”就是該證書的用戶名;
注:最開始在設置dn值得時候不要有空格,字數多點沒關系,千萬別有空格
將該用戶設置在后端系統中的sg_internal_users.yml配置文件注冊成用戶,生產散列密碼
散列密碼使用tools文件夾下的hash.sh 執行 sh hash.sh -p ”密碼“ 生成
在sg_roles_mapping.yml中為該用戶分配角色映射:
在sg_roles.yml中配置該角色的權限:
該角色的權限是對授予執行多個請求(如mget,msearch或mtv)的只讀權限但也授予批量寫入權限和所有別名權限,對索引company下的所有type具有READ(授予讀取權限,如獲取,獲取或獲取字段映射以及搜索權限)權限。
下面開始貼代碼:
public class GetClient {public TransportClient transportClient() throws UnknownHostException {// 一定要注意,9300為elasticsearch的tcp端口InetSocketTransportAddress master = new InetSocketTransportAddress(InetAddress.getByName("hop-0"), 9300);InetSocketTransportAddress node1 = new InetSocketTransportAddress(InetAddress.getByName("hop-1"), 9300);InetSocketTransportAddress node2 = new InetSocketTransportAddress(InetAddress.getByName("hop-2"), 9300);// 集群名稱Settings settings = Settings.builder().put(SSLConfigConstants.SEARCHGUARD_SSL_TRANSPORT_PEMKEY_FILEPATH, System.getProperty("user.dir")+"/src/main/resources/ssl/client.key").put(SSLConfigConstants.SEARCHGUARD_SSL_TRANSPORT_PEMCERT_FILEPATH, System.getProperty("user.dir")+"/src/main/resources/ssl/client.pem").put(SSLConfigConstants.SEARCHGUARD_SSL_TRANSPORT_PEMTRUSTEDCAS_FILEPATH, System.getProperty("user.dir")+"/src/main/resources/ssl/root-ca.pem").put(SSLConfigConstants.SEARCHGUARD_SSL_TRANSPORT_PEMKEY_PASSWORD, "dWHPUGUvBtr3") // .put(SSLConfigConstants.SEARCHGUARD_SSL_TRANSPORT_PEMKEY_PASSWORD, "Ne0Vxrj6YZk2").put(SSLConfigConstants.SEARCHGUARD_SSL_TRANSPORT_ENFORCE_HOSTNAME_VERIFICATION, false) // .put(SSLConfigConstants.SEARCHGUARD_SSL_HTTP_ENABLED, true) // .put("searchguard.ssl.transport.enforce_hostname_verification", false).put("client.transport.sniff",false).put("cluster.name","ES-cluster" ).build();TransportClient client = new PreBuiltTransportClient(settings, SearchGuardSSLPlugin.class);// 添加client.addTransportAddresses(master, node1, node2); // client.threadPool().getThreadContext().addResponseHeader("Authorization", "Basic "+ Base64.encodeBase64("admin:admin".getBytes()));return client;}}下面還是代碼…
public class PrintClient {public static void main(String[] args) throws Exception{GetClient getClient = new GetClient();TransportClient transportClient = getClient.transportClient();SearchRequestBuilder srb = transportClient.prepareSearch("logaudit_servicetransfer_real");SearchResponse searchResponse = srb.setQuery(QueryBuilders.matchAllQuery()).execute().actionGet();SearchHits hits=searchResponse.getHits();for(SearchHit hit:hits){System.out.println(hit.getSourceAsString());}} }下面是一些證書的路徑:
到這里就完成了一個權限的簡單配置,使用client的pem和key就只能讀到company索引的數據。至于其他的權限組合配置就要大家自己去探索了。
建議生產中保留兩個admin證書,多生成幾個client證書用于多方操作數據。
總結
以上是生活随笔為你收集整理的ElasticSearchTransportClient集成SearchGuard插件实现索引级别的权限管控的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【电子电路】上拉电阻与下拉电阻的作用
- 下一篇: “太湖论道 数字制造——世界物联网博览会