Todas las entradas de: Todavia no se

Trabajar con elasticsearch mediante docker

Trabajar con elasticsearch, sobre todo para entornos de pruebas, es mucho más fácil con el contenedor Docker que Elasticseacrh nos facilita.

Las ventajas del uso de contenedores es evidente, fácil portabilidad, bajo uso de recursos, etc. Por ello, muchas de las grandes empresas de software están creando este tipo de contenedores para facilitar la implementación de sus productos.

Descarga del contendor de Elasticsearch

En el caso de Elasticsearch, podemos obtener este contenedor fácilmente desde el propio hub de Docker. Para descargarlo en nuestra máquina solo tendremos que ejecutar el siguiente comando.

docker pull docker.elastic.co/elasticsearch/elasticsearch:X.XX.X

Sustituiremos X.XX.X por el número de versión que deseemos instalar.

Podemos ver las versiones disponibles en está página de Elasticsearch (https://www.docker.elastic.co/r/elasticsearch). Tambien podes ver las versiones disponibles, desde la propia página del hub de docker (https://hub.docker.com/_/elasticsearch?tab=tags)

Para descargar la ultima versión disponible en el momento de escribir este post, tendríamos que ejecutar el siguiente comando.

docker pull docker.elastic.co/elasticsearch/elasticsearch:7.13.4

Una vez que ha concluido la descarga y la instalación

$ sudo docker pull docker.elastic.co/elasticsearch/elasticsearch:7.13.4
7.13.4: Pulling from elasticsearch/elasticsearch
ddf49b9115d7: Pull complete
67831602c5f6: Pull complete
e9244a58c58a: Pull complete
02513d648eec: Pull complete
2a31f6c80f77: Pull complete
9022d53d3571: Pull complete
3fc2a72e96e7: Pull complete
Digest: sha256:70e5f2454148f16385ffbc1b1fb71f3a171a8ef8665c8b482235656678b7df93
Status: Downloaded newer image for docker.elastic.co/elasticsearch/elasticsearch:7.13.4
docker.elastic.co/elasticsearch/elasticsearch:7.13.4

Ejecución del contenedor de Elasticsearch

Lanzaremos la ejecución del contenedor, para ello ejecutaremos el siguiente comando.

docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.13.4

El comando configurara la ejecución, activando el enrutado de los puertos 9200 y 9300 desde nuestra máquina, al contenedor. Además, establece el servidor de elasticsearch en modo autónomo.

En la pantalla nos aparece la salida del log de elasticsearch.

Si queremos pararla, solo tendremos que pulsar la combinación de teclas Ctrl-C. Puede que a la primera no responda, pulsaremos varias veces hasta que se pare. También, lo podremos parar, abriendo otra terminal, y ejecutando el siguiente comando

$ sudo docker stop <nombre_imagen>

Para saber como se llama nuestro contenedor podemos lanzar el siguiente comando para ver las imágenes que tenemos en ejecución

$ docker ps

Una vez que lo hemos parado, no tenemos que volver a ejecutar el comando «docker run», simplemente con iniciar nuestro contenedor, sera  suficiente. Esto lo podemos hacer con el siguiente comando.

$ sudo docker start <nombre_imagen>

Podemos personalizar el nombre de nuestra imagen agregando el siguiente argumento al comando «docker run»

--name <nombre_imagen>

El comando «docker run» nos quedaría de la siguiente forma.

$ sudo docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" --name elastic_prueba docker.elastic.co/elasticsearch/elasticsearch:7.13.4

Prueba de funcionamiento de Elasticsearch

Para probar que nuestro servidor de elasticsearch está funcionado, y responde correctamente, podemos lanzar el siguiente comando.

$ curl -X GET "localhost:9200/?pretty"

Y si todo es correcto, y nuestro contenedor está funcionado correctamente, obtendremos una respuesta parecida a la siguiente.

{
"name" : "1c1a4c8db052",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "lg2UQNHASCGozGjkaAV12g",
"version" : {
"number" : "7.13.4",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "c5f60e894ca0c61cdbae4f5a686d9f08bcefc942",
"build_date" : "2021-07-14T18:33:36.673943207Z",
"build_snapshot" : false,
"lucene_version" : "8.8.2",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}

Problemas de consumo de memória de Elastic

El consumo de la memoria de Elaticsearch puede ser muy grande, dejando a la máquina host casi sin recursos. Para evitar este escenario, podemos establece un limite de uso de memoria para el elastic dentro del contenedor.

Para establecer este límite, tendremos que establecer unas variables de entrono dentro de nuestro contenedor. Esto se realiza añadiendo el siguiente argumento al comando «docker run».

-e «ES_JAVA_OPTS=-Xms<Xg> -Xmx<Xg>»

Quedando nuestro comando de la siguiente forma para una configuración de uso de 3g de memoria para nuestro elasticsearch.

sudo docker run -p 9200:9200 -p 9300:9300 -e «discovery.type=single-node» -e «ES_JAVA_OPTS=-Xms3g -Xmx3g» –name elastic_prueba docker.elastic.co/elasticsearch/elasticsearch:7.13.4

Tambien podemos establecer este valor en megas, para ello solo tendremos que cambia la «g» del final por una m. Por ejemplo para establecer los mismos 3 gigas anteriores en megas, el comando quedaría de la siguiente forma:

sudo docker run -p 9200:9200 -p 9300:9300 -e «discovery.type=single-node» -e «ES_JAVA_OPTS=-Xms3072m -Xmx3072m» –name elastic_prueba docker.elastic.co/elasticsearch/elasticsearch:7.13.4

El valor recomendable para estos paŕámetros, son el 50% de la memoria de la que disponga la máquina host.

 

 

 

Ocultar comunicaciones de miradas indiscretas

Ocultar las comunicaciones con codificación en Base64
Ocultar las comunicaciones con codificación en Base64

Para ocultar nuestras comunicaciones de nuestros dispositivos IOT, no es necesario utilizar complejos métodos de encriptación. En la actualidad se dispone de diversos métodos de codificación para que las comunicaciones entre nuestros dispositivos IOT, ya sean creados con arduino o con el ESP32, y los sistemas centrales, no tengan que hacerse en texto plano.

Una de las premisas que suelen usar los ciberdelincuentes es la de, esfuerzo/recompensa.

Si están intentando vulnerar un sistema bancario, el esfuerzo que les puede llevar sera muy grande, pero la recompensa también lo es.

Pero si lo que están vulnerando es el sistema de riego de mi jardín, la recompensa es muy baja. Con lo que aumentando el grado de esfuerzo necesario para la vulneración, podemos eliminar una gran mayoría de amenazas.

Recordatorio: Esto no es un sistema para asegurar las comunicaciones de la Nasa o del FBI. Solo es un sistema para darle una capa más de seguridad a nuestros pequeños proyectos.

Teniendo en cuenta esta premisa, para ocultar nuestras comunicaciones no hace falta desplegar un gran sistema criptográfico para hacer que los crackers desistan con el ataque a nuestro sistema.

Para ello solo tenemos que utilizar los métodos de codificación que tenemos a nuestro alcance, como puede ser la codificación en Base64.

Un poco de teoría

La codificación base64 se define como:

Base64 es un grupo de esquemas de codificación de binario a texto que representa los datos binarios mediante una cadena ASCII, traduciéndolos en una representación radix-64. El término Base64 se origina de un sistema de codificación de transmisión de contenido MIME específico.

https://developer.mozilla.org/es/docs/Web/API/WindowBase64/Base64_codificando_y_decodificando

Este tipo de codificación la tenemos disponible en cualquier lenguaje de programación. Lo que la hace muy fácil de usar.

Una de las formas más fáciles de identificar que una cadena esta codificada en base64, es, si la cadena termina en uno o dos símbolos de igual. Esto se debe a que base64 usa 6 bits de los 8 de los normales. Para cubrir ese hueco el algoritmo de base64 lo rellena con 1 o con dos símbolos de igual.

Otra forma que se puede usar para identificar la codificación, es que la cadena solo está compuesta por letras de la «a» a la «z», tanto en mayúsculas, como en minúsculas, números del 0 al 9 y los símbolos, normalmente, «+» y «/». Ya que la suma de letras y número es 62, y se usan eso dos símbolos para completar los 64.

¿Pero solo con eso puedo ocultar mis comunicaciones?

Pero, ¿si base64, está implementado en todos los lenguajes?, ¿es fácil de identificar?, el esfuerzo de un malo, más bien es poco ¿no?. Pues si, pero ya tenemos la base de nuestro sistema.

Si ya sabemos los puntos débiles del sistema, podemos detectarlos y reforzarlos.

Por ejemplo, sabemos que base64, nos pone en ocasiones, símbolos de igual si la cadena no tiene la longitud deseada. Pues vamos a controlar que la cadena tenga la longitud necesaria para que no incluya los símbolos de igual.

Esto es fácil, solo tenemos que controlar que el tamaño sea múltiplo de 3. Si no es múltiplo añadiremos tantos caracteres como sean necesarios.

Para el tema de los caracteres usados, es más compleja su solución. Pero podemos aplicar un método fácil para dificultar la codificación. Para ello solo tenemos que invertir la cadena en base64, por ejemplo, antes de su envió. Podría ser una forma de ofuscar. Se podrían aplicar otras.

Código, que es lo que mola

Un código de ejemplo que nos permite ocultar nuestras comunicaciones de lo explicado anteriormente en python sería el siguiente.

#!/usr/bin/env python

"""
    Encode base64
"""
import base64

def encode(encode):
    # Calculamos si la cadena es múmtiplo de 3
    rest_message = len(encode.encode('utf-8')) % 3
    if rest_message == 0:
        temp_message = encode
    else:
        # Si no es múltiplo de 3, le añadimos tantos caracteres
        # como necesitemos    
        temp_message = encode + (" " * (3 - rest_message))
    # Lo codificamos en utf-8
    message_byte = temp_message.encode('utf-8')
    # Lo codificamos en base64
    codec_base64 = base64.b64encode(message_byte)
    # Decodificamos el utf-8e invertimos la cadena
    string_codec_base64 = codec_base64.decode('utf-8')[::-1]

    print(f'encode: {string_codec_base64}')

if __name__ == "__main__":
    string_encode = "Esto es una prueba más"
    encode(encode=string_encode)

Para calcular si la cadena es múltiplo de 3 usamos la siguiente linea

rest_message = len(encode.encode('utf-8')) % 3

Si el resto es cero, la longitud de la cadena es múltiplo de 3, por lo que no tenemos que añadir nada. Si fuera distinto de 0, es decir 1 o 2. El valor nos valdría para calcular cuantos caracteres nos hacen faltan.

if rest_message == 0:
    temp_message = encode
else:
    # Si no es múltiplo de 3, le añadimos tantos caracteres
    # como necesitemos    
    temp_message = encode + (" " * (3 - rest_message))

Una vez que ya tenemos ajustado el tamaño solo nos queda codificarla en base64

# Lo codificamos en utf-8
message_byte = temp_message.encode('utf-8')
# Lo codificamos en base64
codec_base64 = base64.b64encode(message_byte)

Para darle la vuelta solo tenemos que añadir [::-1] a la cadena con la codificación en base64

string_codec_base64 = codec_base64.decode('utf-8')[::-1]

Y con esto ya tenemos un sistema fácil de implementar, todos los lenguajes tiene librerías para trabajar con ello. Y que a los malos no le resulte tan fácil.

Vuelta el recordatorio: Esto no es un sistema para proteger información delicada, si no, un método para darle una capa mayor de seguridad a nuestros pequemos proyectos.

Como ocultar nuestra conexión mediante una VPN

En determinadas ocasiones tenemos que proteger nuestra conexión de miradas indiscretas, ya sea porque estamos conectados en una WiFi publica, un hotel, etc.

Normalmente para esto se suele recomendar el uso de una VPN. Pero si el servidor de vpn no esta bajo nuestro control podemos no tener esa seguridad deseada.

Proton servidor de VPN anónima

La empresa Proton, famosa por su servidor de correo gratuito y anónimo, a puesto en marcha un servicio de VPN. Esta nos garantiza que nuestra información no sera compartida con ningún gobierno/empresa, y que no habrá ningún log con nuestros datos.

Proton pone a nuestra disposición varios planes de conexión. Varios de pago con diferentes velocidades de conexión, país de donde saldrá nuestra conexión. navegación a través de TOR, numero de dispositivos, etc.

Pero también tiene un plan gratuito. Esta cuenta esta limitado al uso de un solo dispositivos, elección de solo 3 países de salida y velocidad baja, pero suficiente para un uso normal.

Crear una cuenta en ProtonVPN

Lo primero que tenemos que hacer es entrar en la pagina de ProtonVPN y seleccionar el plan que deseamos. Para esta prueba seleccionamos el «FREE».

Registro en ProtonVPN
Registro en ProtonVPN

El siguiente paso para poder usar el servicio, no es más que una pagina de registro. Como en cualquier pagina de registro, metemos nuestro nombre se usuario, contraseña, cuenta de correo de verificación y poco más.

Registro en ProtonVPN
Registro en ProtonVPN

En el siguiente paso Proton nos enviara a nuestro correo un código de verificación, introducimos el código en la casilla y seguimos.

Obtener archivo de configuración de servidor VPN

Una vez registrados tenemos acceso al escritorio  de nuestra cuenta en ProtonVPN, en el tenemos un menú con varias opciones, acceso al escritorio (Dashboard), aquí no mostrara nuestro username (para entrar en la pagina de Proton), si tenemos cuenta de correo de ProtonMail y nuestro plan y si queremos registrarnos a otro.

La siguiente opción es la de «Cuenta» (Account), en esta opción nos mostrara nuestro VPN Login y VPN Password, estos son los datos de identificación cuando creemos nuestra conexión vpn en nuestro dispositivo.

Descarga de ProtonVPN
Descarga de ProtonVPN

En la opción de «Descargas» (Download), podremos descargar tanto el cliente de vpn, como los ficheros de configuración. En mi caso lo he instalado en un Ubuntu, al pulsar sobre el icono de Linux, se nos abre una nueva ventana con los pasos que deberemos de seguir para instalar el cliente de OpenVPN.

Configuración de ProtonVPN
Configuración de ProtonVPN

Una vez que tenemos el cliente de OpenVPN instalado. Nos desplazamos un poco hacia abajo y no aparecerá las opciones para seleccionar la plataforma en la que estamos corriendo, el protocolo que queremos usar, el protocolo recomendado es el de UDP, pero si nuestra navegación es muy lenta podemos elegir el de TCP.

La ultima opción que tenemos que elegir es el país por el que deseamos salir. En la versión «FREE» solo tenemos 3 países donde elegir, Japón, Holanda y EEUU. Pulsamos la opción de «Server Configs» y vamos a uno de esos países. Elegimos el servidor «XX-FREE#X» y descargamos el fichero.

Servidores ProtonVPN
Servidores ProtonVPN

También tenemos la opción de descargarlos todos. Nos desplazamos hasta el final de la pagina y pulsamos sobre «Download all configurations». Nos descargara un fichero «zip» con todos los ficheros.

Crear conexión VPN en nuestro dispositivo

Para crear una conexión en Ubuntu, hay varias maneras, por entorno gráfico o por consola.

Cliente red Ubuntu
Cliente red Ubuntu

Para crear la conexión en entorno gráfico, vamos a opciones de red, Configuración de vpn. Agregar una vpn y seleccionamos la opción de «importar desde archivo». Se nos abrirá una ventana donde seleccionaremos el archivo que nos hemos descargado.

Importar configuración ProtonVPN
Importar configuración ProtonVPN

Con esto ya tendremos nuestra conexión configurada, con su certificado y demás configuración. Solo falta para terminar la configuración, indicar nuestro OpenVPN Username y OpenVPN Password. Lo introducimos en las casillas de «Nombre de usuario» y «Contraseña» respectivamente.

Configuración cliente VPN
Configuración cliente VPN

Listo ya tenemos nuestra conexión de vpn con un servidor realmente anónimo y seguro creada. Para comprobarla solo tenemos que activarla, abrir la pagina de www.cualesmiip.com y comprobar cual es nuestra ip publica.