Sin categoría

¡SASL Memcached ya está disponible!

Tras el anuncio por Dustin Sallings que el servidor memcached ahora tiene soporte SASL, (que es una característica en el recién lanzado 1.4.3, anunciado hoy mismo), esta última semana también ha dado lugar a un aluvión de novedades, sobre todo en el ámbito de los clientes

Hace un par de semanas Dustin añadió soporte en spymemcached (Java) y a partir de esta semana, Trond Norbye añadido soporte a libmemcached, ¡ahora es posible aprovechar el soporte del servidor memcached para tus aplicaciones que utilizan memcached! Así que ahora usted probablemente quiere saber: "¿Cómo puedo utilizar estas nuevas características?" Este post intentará responda a esta preguntaasí como explicar la mecánica de memcached y la autenticación SASL para sus aplicaciones.

¿Qué es SASL?

SASL son las siglas de Simple Authentication and Security Layer, que proporciona un medio para añadir soporte de autenticación a los protocolos basados en conexión, como el protocolo binario del cliente memcached en este caso. Funciona a través de una llamada a una función (API) que se añade al cliente y que proporciona una funcionalidad para identificar y autenticar a un usuario determinado. También proporciona los medios para implementar la protección a lo largo de toda la conexión. Una vez identificado y autenticado un usuario, el sistema proporciona una capa de seguridad entre el protocolo cliente y la conexión.

¿Cómo se implementa SASL en Memcached?

Hasta que se añadió el protocolo binario, así como la implementación de SASL, memcached no tenía capa de autenticación alguna. Cualquier cliente podía conectarse a memcached y realizar cualquier operación a voluntad. Dependía del usuario de memcached (normalmente un desarrollador web) asegurarse de que su red estaba bloqueada y de que su aplicación estaba diseñada de forma segura. Después se añadió el protocolo binario a memcached, que permitió una conexión cliente-servidor más eficiente y compacta.

Con el soporte de SASL, se añadieron funciones al servidor que hacían que una conexión de cliente se viera forzada a autenticarse antes de que la conexión completa pudiera continuar. Esto, por supuesto, requería un cliente que enviara la información de autenticación. Al principio, sólo se soportaba el cliente spymemcached (java), pero como ya se mencionó en la introducción, ahora también se soporta libmemcached.

Básicamente, SASL utiliza almacenamiento para las credenciales de usuario - puede ser LDAP o una base de datos SQL. En este ejemplo, las credenciales de usuario se almacenan en un archivo de base de datos en el servidor que memcached se ejecutará. Para que un usuario pueda conectarse, el servidor memcached no permitirá que el usuario se conecte a menos que proporcione sus credenciales, y esas credenciales deben coincidir con las credenciales de usuario almacenadas. Puedes encontrar más información sobre los detalles de la implementación de memcached en aquí.

¿Cómo instalar SASL con Memcached?

Bueno, lo primero que tienes que hacer es obtener la última versión del servidor memcached. Un lugar donde encontrarás esto es el memcached GitHub repositorio o memcached.orgque se explica en el siguiente paso. También necesitarás algunos prerrequisitos en tu servidor, como bibliotecas de desarrollo y utilidades como saslpasswd. En Ubuntu, por ejemplo, los paquetes se instalan como:

sudo apt-get -f install libsasl2-2 sasl2-bin libsasl2-2 libsasl2-dev libsasl2-modules

No hay que olvidar, los requisitos habituales para memcached: libevent Sólo tienes que buscar los paquetes en función del sistema operativo que estés utilizando.

¿Cómo configuro SASL Memcached?

Ahora necesitarás obtener memcached SASL. El código ya está disponible oficialmente en memcached.org wget https://memcached.googlecode.com/files/memcached-1.4.3.tar.gz tar xvzf memcached-1.4.3.tar.gz O, como siempre, a través de Github

git clone git://github.com/memcached/memcached.git

Ahora compila e instala:

cd memcached-1.4.3
./configurar -habilitar-sasl
hacer la prueba
sudo make install

A continuación, configurarás la base de datos y el archivo de configuración de la aplicación memcached. Hay dos maneras de hacer esto: en todo el sistema o para un usuario específico.

Archivo de base de datos de todo el sistema:

Para una configuración en todo el sistema, tendrá que configurar un archivo memcached.conf para que apunte al archivo de base de datos que contiene la información de usuario y contraseña en /usr/lib/sasl2/memcached.conf, nombrados por aplicación. Un ejemplo de esto es:

mech_list: plainlog_level: 5

Nota: en Ubuntu, este archivo de base de datos ya existe. Si tiene que crear uno, asegúrese de que el directorio que especifique para la ubicación de la base de datos sasl existe antes de ejecutar el siguiente comando) Para añadir un usuario al archivo de base de datos:

sudo saslpasswd2 -c -a memcached

Como puede ver, -a especifica la aplicación, 'memcached', que debe coincidir con el nombre que le diste al archivo conf en el paso anterior 'memcached.conf'. Cuando ejecutes este comando saslpasswd2, se te pedirá una contraseña y la verificación de la contraseña como se muestra a continuación:

patg@ishvara:~/code-dev/memcached-dustin$ sudo saslpasswd2 -c -a memcached capttofu Contraseña:Otra vez (para verificación):

Puede comprobar que el usuario que ha creado ya existe. Para ello, ejecute

sudo sasldblistusers2

-o-

sudo sasldblistusers2 -f /etc/sasldb2

Verás una salida como:

patg@ishvara:~/code-dev/memcached-dustin$ sudo sasldblistusers2test1@ishvara: userContraseña

Archivo de base de datos específico del usuario:

Lo primero que tienes que asegurarte es de configurar una variable de entorno muy importante, SASL_CONF_PATH cada vez que ejecutes memcached. En este ejemplo, esta ruta se establecerá en /home/patg/sasl.

export SASL_CONF_PATH=/home/patg/sasl

Asegúrate de crear cualquier ruta de directorio que especifiques. A continuación, configure el archivo memcached.conf (nombrado por aplicación). En este ejemplo, el contenido es:

mech_list: plainlog_level: 5sasldb_path: /home/patg/sasl/sasldb2

A continuación tendrás que crear el archivo de base de datos que acabas de especificar en el paso anterior en tu archivo memcached.conf.

sudo saslpasswd2 -c -a memcached -f /home/patg/sasl/sasldb2 capttofu

Observe que el indicador -a especifica el nombre de la aplicación memcachedque debe coincidir con el nombre del archivo de configuración especificado en el ejemplo anterior, memcached.conf. Observe también que esto difiere del ejemplo para todo el sistema porque en este ejemplo tiene que especificar el archivo de base de datos con el indicador -f. Cuando ejecute saslpasswd2, se le pedirá que introduzca la contraseña y la verificación de contraseña, como se muestra en el siguiente ejemplo:

patg@ishvara:~$ saslpasswd2 -c -a memcached -f /home/patg/sasl/sasldb2 capttofuPassword:Otra vez (para verificar):

Ahora ejecute sasldblistusers2 para verificar que efectivamente ha añadido el usuario. Al igual que con saslpasswd2, tendrá que especificar el archivo de base de datos:

patg@ishvara:~$ sasldblistusers2 -f /home/patg/sasl/sasldb2capttofu@ishvara: userContraseña

Ejecución de Memcached con SASL habilitado

Utilizando un archivo de base de datos de todo el sistema o un archivo de base de datos a nivel de usuario, necesitará iniciar memcached con las banderas apropiadas. Cuando memcached se ejecuta con SASL activado, se utiliza el protocolo binario, el protocolo de texto está desactivado. En este ejemplo, se utiliza un archivo de base de datos a nivel de usuario. Como usuario 'patg', se hizo lo siguiente:

export SASL_CONF_PATH=/home/patg/sasl/usr/local/bin/memcached -S -vvv

Ahora para usar memcached, necesitarás un cliente habilitado, que como se anunció en este post, spymemcached (Java) y libmemcached soportan ahora. Para simplificar (¡al menos para mí!) He hackeado una de las pruebas que vienen con memcached, binary-sasl.t, y la he renombrado patg.t (¡Me recuerda que tengo que añadir soporte a Cache::Memcached!) También he tenido que exportar una variable de entorno que el código del conjunto de pruebas utiliza para indicar que se utiliza un servidor memcached existente en ejecución:

export T_MEMD_USE_DAEMON=localhost:11211

Entonces hice mi prueba:

patg@ishvara:~/code-dev/memcached-dustin$ perl t/patg.t1..20returning handleok 1 - started the serverok 2 - Proper version: 0ok 3 - list_mechs CRAM-MD5 PLAINok 4 - this fails to authenticateok 5 - error code matchesok 6 - this fails to authenticateok 7 - error code matchesok 8 - this fails to authenticateok 9 - error code matchesok 10 - this fails to authenticateok 11 - error code matchesok 12 - bad mechok 13 - bad authok 14 - authenticatedok 15ok 16 - somevalue = somevalueok 17ok 18ok 19 - somevalue = somevalueok 20

De interés y digno de mención, observe la prueba list_mechs. Esta prueba lista los mecanismos de autenticación para los que está configurado su servidor. Lo que me interesa aquí es que veo que mi servidor en ejecución se autentica, ya que inicié la prueba con -vvv. Una autenticación fallida:

<30 0x00 0x00 0x00 0x00authenticated() en cmd 0x21 es true30: pasando de conn_parse_cmd a conn_nreadmech: PLAIN" con 23 bytes de código de resultado datasasl: -13Respuesta sasl desconocida: -13>30 Escribiendo un error: Fallo de autenticación.

Una autenticación correcta:

authenticated() en cmd 0x21 es true30: pasando de conn_parse_cmd a conn_nreadmech: PLAIN" con 16 bytes de código de resultado datasasl: 0

Un GET exitoso usando autenticación:

authenticated() en cmd 0x00 es true30: pasando de conn_parse_cmd a conn_nread FOUND KEY xL 0 9somevalueofu>30 Escribiendo respuesta bin:

¡El servidor funciona! Ahora a probar memcached SASL usando libmemcached.

Instalación de Libmemcached

Lo primero para instalar libmemcached con la nueva funcionalidad de Trond es clonar su árbol desde Launchpad. Para ello necesitarás el sistema de control de revisiones bazaar. Para Ubuntu, es:

apt-get install bzr

A continuación, clona el árbol:

bzr clone lp:~trond-norbye/libmemcached/sasl_rfe_462250cd sasl_rfe_462250/sh config/bootstrap./configure # nota, no tienes que usar -enable-sasl porque SASL será compilado por defaultmakemake testsudo make install

Esto instala libmemcached. Ahora, ¿cómo se utiliza? Bueno, tendrás que escribir programas para utilizarlo. Para mi disfrute, escribí un simple programa en C que utiliza la información que Trond proporcionó en su post. Lo llamé sasl_test.c que puedes encontrar en las descargas de Northscale. El meollo de lo que contiene se muestra a continuación. Tengo una función principal que contiene estas líneas importantes:

/* inicializar la conexión cliente para usar SASL */ if (sasl_client_init(NULL) != SASL_OK) { fprintf(stderr, "Failed to initialize sasl library!n"); return 1; }

memcached_st *memc = memcached_create(NULL); /* configurar las callbacks sasl para sasl auth */ memcached_set_sasl_callbacks(memc, sasl_callbacks); memcached_server_st *servers = memcached_servers_parse(servers_list); memcached_server_push(memc, servers); memcached_server_list_free(servers);

/* hay que usar protocolo binario para usar SASL */ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, 1);

/* set a value */ rc= memcached_set(memc, key, keylen, value, vallen, 0, 0); if (rc == MEMCACHED_SUCCESS) printf("setting key %s value %sn", key, value); assert(rc == MEMCACHED_SUCCESS);

/* obtener un valor */ retval= memcached_get(memc, key, keylen, &retlen, (uint32_t)0, &rc); if (rc == MEMCACHED_SUCCESS) printf("fetched key %s value %sn", key, retval); assert(rc == MEMCACHED_SUCCESS);

/* liberar la conexión */ memcached_free(memc); sasl_done();

Luego, siguiendo las instrucciones de Trond (sacadas de su página), añadí callbacks, que declaro en otro fichero que tengo sasl_test.h

static int get_username(void *context, int id, const char **result, unsigned int *len);static int get_password(sasl_conn_t *conn, void *context, int id, sasl_secret_t **psecret);

static sasl_callback_t sasl_callbacks[] = {{ SASL_CB_USER, &get_username, NULL}, { SASL_CB_AUTHNAME, &get_username, NULL}, { SASL_CB_PASS, &get_password, NULL}, { SASL_CB_LIST_END, NULL, NULL}};

A continuación, he definido estos en las devoluciones de llamada sasl_test.c (observe que la contraseña se establece de acuerdo con lo que se añadió al archivo sasl db):

static char *username = "capttofu";static char *passwd = "s3kr1t";

static int get_username(void *context, int id, const char **result, unsigned int *len){ if (!result || (id != SASL_CB_USER && id != SASL_CB_AUTHNAME)) { return SASL_BADPARAM; }

*result= nombredeusuario; if (len) { *len= (nombredeusuario = NULL) ? 0 : (unsigned int)strlen(nombredeusuario); }

return SASL_OK;}

static int get_password(sasl_conn_t *conn, void *context, int id, sasl_secret_t **psecret){ static sasl_secret_t* x;

if (!conn || ! psecret || id != SASL_CB_PASS) { return SASL_BADPARAM; }

if (passwd == NULL) { *psecret = NULL; return SASL_OK; } size_t len = strlen(passwd); x = realloc(x, sizeof(sasl_secret_t) + len); if (!x) { return SASL_NOMEM; }

x->len = len; strcpy((void *)x->data, passwd);

*psecret = x; return SASL_OK;}

Compilo esto con el siguiente comando:

gcc -g -O0 -I/usr/local/include/libmemcached -lmemcached -lmemcachedutil -o sasl_test sasl_test.c

Entonces podré hacer la prueba.

./sasl_test localhost:11211 testkey testvalue

Si observo mi servidor memcached habilitado para SASL, veo que la autenticación funciona. Conexión:

<30 nueva conexión binaria de cliente.30: pasando de conn_new_cmd a conn_waiting30: pasando de conn_waiting a conn_read30: pasando de conn_read a conn_parse_cmd

Autentificación:

<30 Leer datos binarios del protocolo:<30 0x80 0x20 0x00 0x00 0x00<30 0x00 0x00 0x00<30 0x00 0x00 0x00 0x00 0x00<30 0x00 0x00 0x00<30 0x00 0x00 0x00<30 0x00 0x00 0x00authenticated() en cmd 0x20 es verdadero.

Set, autenticado:

30: pasando de conn_read a conn_parse_cmd<30 Lee datos binarios del protocolo:<30 0x80 0x01 0x00 0x07<30 0x08 0x00 0x00 0x00 0x00 0x00<30 0x00 0x00 0x00 0x18<30 0x00 0x00 0x00 0x00<30 0x00 0x00 0x00 0x00authenticated() en cmd 0x01 es verdadero30: going from conn_parse_cmd to conn_nread FOUND KEY testkey0 0 10test valueofu

Obtener, autenticado:

30: pasando de conn_read a conn_parse_cmd<30 Leer datos binarios de protocolo:<30 0x80 0x0c 0x00 0x07<30 0x00 0x00 0x00 0x00 0x00 0x00 0x00<30 0x00 0x00 0x00<30 0x00 0x00 0x00 0x00<30 0x00 0x00 0x00 0x00authenticated() en cmd 0x0c es verdadero30: pasando de conn_parse_cmd a conn_nread FOUND KEY testkey0 0 9testvaluettofu>30 Escribiendo respuesta bin:

Y funciona. Ahora puedo modificar otros programas basados en libmemcached en consecuencia. Por supuesto, también puedes usar spymemcached.

Resumen

Con este post, deberías tener una mejor comprensión de lo que es SASL, y cómo puedes usarlo con memcached. Ahora deberías ser totalmente capaz de obtener, compilar e instalar tanto el servidor memcached como el cliente, libmemcached con SASL activado, así como ser capaz de empezar a escribir aplicaciones memcached que utilicen libmemcached. ¡Que te diviertas!

Comparte este artículo
Recibe actualizaciones del blog de Couchbase en tu bandeja de entrada
Este campo es obligatorio.

Autor

Publicado por Patrick Galbraith

Patrick Galbraith es Ingeniero de Software en Couchbase. Su trabajo consiste en I+D, creación de prototipos y desarrollo de sistemas de creación de productos Linux y Windows.

1 Comentarios

  1. Hola, ¿puede por favor publicar los pasos sobre cómo configurar SASL habilitado memcached instancia en mac? He instalado memcached versión 1.4.34 utilizando homebew pero cuando uso Spymemcache cliente java para autenticar dice 27 Escribiendo un error: Auth failure. Por favor, ¿puede ayudar en el post paso a paso los comandos a ejecutar para configurar el nombre de usuario y la contraseña que debe ser configurado para un usuario específico. Gracias.

Deja un comentario

¿Listo para empezar con Couchbase Capella?

Empezar a construir

Consulte nuestro portal para desarrolladores para explorar NoSQL, buscar recursos y empezar con tutoriales.

Utilizar Capella gratis

Ponte manos a la obra con Couchbase en unos pocos clics. Capella DBaaS es la forma más fácil y rápida de empezar.

Póngase en contacto

¿Quieres saber más sobre las ofertas de Couchbase? Permítanos ayudarle.