Professional Documents
Culture Documents
el plugin ReadonlyREST
1. Introducción
Cuando estamos trabajando con Elasticsearch nos puede resultar útil securizar las
peticiones realizadas a los diferentes índices que tengamos creados y tener algún
control sobre el acceso a los mismos.
Aunque puede resultar conveniente el pago de esta licencia, puede haber proyectos
que no requieran tantas funciones y en los que resulte más viable el uso de alguna
tecnología open source como el plugin para Elasticsearch ReadonlyREST.
2. Caso de prueba
Para nuestro caso, vamos a suponer que tenemos que controlar el acceso a
Elasticsearch para distintos usuarios que se autenticarán con su contraseña de
LDAP. Para ello, vamos a montar un entorno con docker que contenga OpenLDAP,
Elasticsearch y el plugin ReadonlyREST adecuado a nuestra versión de Elastic.
Para hacer las peticiones HTTP utilizaremos Postman.
3.1. Instalación
Una vez que tenemos el código descargado, hay que descomprimir el fichero (si os
bajásteis un ZIP) y ejecutar en un terminal (dentro de la carpeta docker):
Shell
1docker-compose up -d
Shell
3.2. Explicación
Vamos a pasar a explicar un poco lo que acabamos de hacer repasando el
fichero docker-compose.yml que tenemos en la carpeta docker:
LDAP
Shell
1 # adictosaltrabajo.com
2 dn: dc=adictosaltrabajo,dc=com
3 objectClass: top
4 objectClass: dcObject
5 objectClass: organization
6 o: autentia
7 dc: adictosaltrabajo
8
9 # admin, adictosaltrabajo.com
10 dn: cn=admin,dc=adictosaltrabajo,dc=com
11 objectClass: simpleSecurityObject
12 objectClass: organizationalRole
13 cn: admin
14 description: LDAP administrator
15 userPassword::
16e1NTSEF9SU9tUHI1OTNDMG1NdmV2bmNoRkhEUWQ5clk0U3Y3eWc=
17
18 # Usuarios, adictosaltrabajo.com
19 dn: ou=Usuarios,dc=adictosaltrabajo,dc=com
20 objectClass: organizationalUnit
21 ou: Usuarios
22
23 # usuario1, Usuarios, adictosaltrabajo.com
24 dn: uid=usuario1,ou=Usuarios,dc=adictosaltrabajo,dc=com
25 objectClass: inetOrgPerson
26 uid: usuario1
27 sn: Usuario1
28 cn: Mi Usuario1
29 userPassword::
30e1NTSEF9OEc4SkhrTTM2aDVkYUNTRUZNSGVTZ3BoM3lVcUpZRXo=
31
32 # usuario2, Usuarios, adictosaltrabajo.com
33 dn: uid=usuario2,ou=Usuarios,dc=adictosaltrabajo,dc=com
34 objectClass: inetOrgPerson
35 uid: usuario2
36 sn: Usuario2
37 cn: Mi Usuario2
38 userPassword::
39e1NTSEF9RzBKK3JXLzN2Ny83VXJ5MWhVdTdqS0dIUjJqbU9VaVo=
40
41 # usuario3, Usuarios, adictosaltrabajo.com
42 dn: uid=usuario3,ou=Usuarios,dc=adictosaltrabajo,dc=com
43 objectClass: inetOrgPerson
44 uid: usuario3
45 sn: Usuario3
46 cn: Mi Usuario3
47 userPassword::
48e1NTSEF9MjRObm42aXhleTJOUlZSM1IrblV2WDl4bDJVM2tiRUg=
49
50 # Grupos, adictosaltrabajo.com
51 dn: ou=Grupos,dc=adictosaltrabajo,dc=com
52 objectClass: organizationalUnit
53 ou: Grupos
54 description: generic groups branch
55
56 # grupo1, Grupos, adictosaltrabajo.com
57 dn: cn=grupo1,ou=Grupos,dc=adictosaltrabajo,dc=com
58 objectClass: groupOfUniqueNames
59 cn: grupo1
60 uniqueMember: uid=usuario1,ou=Usuarios,dc=adictosaltrabajo,dc=com
61
62 # grupo2, Grupos, adictosaltrabajo.com
63 dn: cn=grupo2,ou=Grupos,dc=adictosaltrabajo,dc=com
64 objectClass: groupOfUniqueNames
65 cn: grupo2
66 uniqueMember: uid=usuario2,ou=Usuarios,dc=adictosaltrabajo,dc=com
67
68 # grupo3, Grupos, adictosaltrabajo.com
dn: cn=grupo3,ou=Grupos,dc=adictosaltrabajo,dc=com
objectClass: groupOfUniqueNames
cn: grupo3
uniqueMember: uid=usuario3,ou=Usuarios,dc=adictosaltrabajo,dc=com
Elasticsearch
ReadonlyREST
Lo primero que hemos hecho es activar la propiedad audit_collector para que los
errores de acceso se guarden en un índice de Elasticsearch. El nombre por defecto
del índice es readonlyrest_audit-YYYY-MM-DD.
Shell
1 access_control_rules:
2 - name: 'Create and Bulk index access to all indices my_index* from
3users belong to grupo1'
4 ldap_authentication: 'my_ldap'
5 ldap_authorization:
6 name: 'my_ldap' # ldap name from 'ldaps' section
7 groups: ['grupo1'] # group within
8'ou=Grupos,dc=adictosaltrabajo,dc=com'
9 indices: ['my_index*']
10 actions: ['indices:admin/create', 'indices:data/write/bulk']
11
12 - name: 'Read access to all indices my_index* from users belong
13to grupo2'
14 ldap_authentication: 'my_ldap'
15 ldap_authorization:
16 name: 'my_ldap' # ldap name from 'ldaps' section
17 groups: ['grupo2'] # group within
18'ou=Grupos,dc=adictosaltrabajo,dc=com'
19 indices: ['my_index*']
20 actions: ['indices:data/read/*']
21
22 - name: 'Cluster access from users belong to grupo3'
23 ldap_authentication: 'my_ldap'
24 ldap_authorization:
25 name: 'my_ldap' # ldap name from 'ldaps' section
26 groups: ['grupo3'] # group within
27'ou=Grupos,dc=adictosaltrabajo,dc=com'
28 actions: ['cluster:*']
Shell
Vamos con nuestra primera prueba donde crearemos el índice ‘my_index1’ con
el usuario1, que tiene permisos para crear un índice con este nombre. Para ello
lanzamos el siguiente PUT:
Shell
1https://localhost:9200/my_index1
Shell
1https://localhost:9200/_bulk
Para consultar los datos del índice, debemos utilizar el usuario2 que tiene permisos
de lectura sobre este índice. Lanzamos el siguiente GET:
Shell
1https://localhost:9200/my_index1/_search
Shell
1https://localhost:9200/_cluster/state
Shell
1https://localhost:9200/readonlyrest_audit-*/_search
4. Conclusiones
En este tutorial hemos visto que tenemos alternativas open source para proteger el
acceso a nuestro índices, más allá de la herramienta oficial X-Pack y sin necesidad
de configurar ningún proxy.
Por medio del plugin ReadonlyREST para Elasticsearch hemos sido capaces de
securizar nuestro Elasticsearch conectándolo a un LDAP de manera sencilla, pero
ofrece más opciones como autenticación interna básica, delegar en un proxy,
autenticación externa básica, JWT. También existen versiones de pago de
ReadonlyREST que ofrecen más características.
5. Referencias
https://github.com/sscarduzio/elasticsearch-readonlyrest-plugin
https://github.com/beshu-tech/readonlyrest-docs/blob/master/elasticsearch
.md
https://readonlyrest.com/
https://www.elastic.co/