天天看點

elasticsearch使用jetty進行簡單的權限控制

預設elasticsearch是使用netty作為http的容器,由于netty并沒有權限子產品,是以預設es沒有任何的權限控制,直接通過http就可以進行任何操作,除非把http禁用。但如果你使用elasticsearch-jetty插件,就可以使用jetty自帶的權限管理進行一些權限的控制,同時也可以支援通過https協定來通路es,還有就是支援gzip壓縮響應資訊。

  插件參數

參數名 描述 預設 哪裡用到

config

設定jetty的配置檔案,可以設定多個jetty的配置檔案

jetty.xml

plugin

server_id

Jetty服務的ID

ESServer

plugin

port

Jetty http請求監聽的端口

http.port

9200-9300

jetty.xml

bind_host

Jetty綁定的位址

http.bind_host

 或

http.host

jetty.xml

publish_host

Jetty對外釋出的位址

http.publish_host

http.host

jetty.xml

ssl_port

Jetty SSL連接配接器監聽的端口

jetty-ssl.xml

 和

jetty-strong-ssl.xml

ssl_bind_host

Jetty SSL連接配接器綁定的位址

jetty-ssl.xml

 和

jetty-strong-ssl.xml

keystore_password

SSL連接配接器的keystore的密碼. 純文字類型的密碼可以使用。經過哈希加密過的密碼不支援。

jetty-ssl.xml

 和

jetty-strong-ssl.xml

1.安裝 該插件位址: https://github.com/sonian/elasticsearch-jetty 由于我試驗是使用0.90.0BETA1版本的es,這個插件目前是支援0.20.2版本的es,新版本的es有些方法名變了,把源碼下下來,把變了名的方法改過來從新編譯打包就行。 打包完後把project home/target/release裡面的壓縮檔案放到es的plugins目錄解壓, 修改es配置檔案elasticsearch.yml,添加  http.type: com.sonian.elasticsearch.http.jetty.JettyHttpServerTransportModule 把項目根目錄下的config檔案夾裡面的檔案(除了elasticsearch.yml和logging.yml)複制到es的config目錄下。 啟動es。   2.驗證插件是否安裝成功 (1) es控制台出現一下字樣: [2013-04-14 08:45:11,658][INFO ][org.eclipse.jetty.server.Server] [Songbird] jet ty-8.1.4.v20120524 [2013-04-14 08:45:11,845][INFO ][org.eclipse.jetty.server.AbstractConnector] [So ngbird] Started [email protected]:9200 (2) 随便發送一個請求,如$ curl -I "http://localhost:9200/" 檢視響應頭,如果包含Server: Jetty(8.1.4.v20120524)就表示安裝成功。 HTTP/1.1 200 OK Content-Type: text/plain;charset=UTF-8 Access-Control-Allow-Origin: * Content-Length: 0 Server: Jetty(8.1.4.v20120524)   3.配置ssl使其支援https請求 配置在原有基礎上加上 sonian.elasticsearch.http.jetty:     config: jetty.xml,jetty-ssl.xml     ssl_port: 9443     keystore_password: "OBF:1nc01vuz1w8f1w1c1rbu1rac1w261w9b1vub1ndq"     4.添加基本權限控制 修改es配置檔案,添加jetty-hash-auth.xml,jetty-restrict-writes.xml兩個檔案到config中 http.type: com.sonian.elasticsearch.http.jetty.JettyHttpServerTransportModule sonian.elasticsearch.http.jetty:     config: jetty.xml,jetty-hash-auth.xml,jetty-restrict-writes.xml 其中jetty-hash-auth.xml檔案裡面引用到realm.properties這個檔案配置的權限資訊。 格式如下: username: password[,rolename ...] 即:使用者名:密碼[,角色1,角色2...] 可以看看例子: superuser: Adm1n,admin,readwrite user: Passw0rd,readwrite 例如第二個就是使用者名為user,密碼為Passw0rd,角色為readwrite,即有讀寫的權限。這個權限角色是在jetty-restrict-writes.xml裡面設定的。 jetty-restrict-writes.xml這個檔案對es叢集的寫操作進行了限制,即要通過鑒權才能進行寫操作。具體設定可以檢視這個檔案。   這時重新啟動es,對es進行寫入或删除删除操作,如果發現報403錯誤,就表示配置成功。 這時就必須在請求頭加上權限驗證,格式如下: 參數名:Authorization  值:Basic + Base64(使用者名:密碼)    即對使用者名和密碼進行Base64加密 如加密後的值為: Basic dXNlcjpQYXNzdzByZA==

curl方式調用

curl -v --user username:password http://localhost:9200

5.日志記錄請求 設定es,把http.type設定成FilterHttpServerTransportModule http.type: com.sonian.elasticsearch.http.filter.FilterHttpServerTransportModule 添加詳細設定,該插件可以自由控制不同請求url的日志級别,如一些不是很重要的的請求(如查詢叢集健康和節點狀态),我們把它設定成trace狀态,如果是搜尋或統計這些重要的查詢,我們可以設定記錄它的請求的body資訊,配置如下。 sonian.elasticsearch.http.filter:     http_filter_chain: ["logging"]     http_filter:         # Request logging filter         logging:             logger: request             format: text             type: com.sonian.elasticsearch.http.filter.logging.LoggingFilterHttpServerAdapter             level: INFO             log_body: false             loggers:                 stats:                     path: ["/_cluster/health", "/_cluster/nodes", "/_cluster/state", "/_cluster/nodes/{node}/stats"]                     method: GET                     level: TRACE                 searches:                     path: ["/_search", "/_search/scroll", "/_search/scroll/{scroll_id}", "/{index}/_search",                             "/{index}/{type}/_search", "/{index}/{type}/{id}/_mlt"]                     method: GET, POST                     log_body: true                 count:                     path: ["/_count", "/{index}/_count", "/{index}/{type}/_count"]                     method: GET, POST                     log_body: true 這樣設定的話日志都是寫進一個檔案裡,如果想每天對檔案進行拆分,可以修改config裡面的logging.yml檔案,添加如下内容: logger:   ........   request: INFO, request_log_file   additivity:   request: false   appender:   .........   request_log_file:       type: dailyRollingFile       file: ${path.logs}/${cluster.name}_requests.log       datePattern: "'.'yyyy-MM-dd"       layout:         type: pattern         conversionPattern: "[%d{ABSOLUTE}] %m%n"   6.開啟GZip壓縮響應資訊 隻需把jetty-gzip.xml加到config參數就行。

繼續閱讀