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:
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
Ahora compila e instala:
./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:
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:
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:
Puede comprobar que el usuario que ha creado ya existe. Para ello, ejecute
-o-
Verás una salida como:
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.
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:
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.
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:
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:
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:
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:
Entonces hice mi prueba:
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:
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:
PLAIN" con 16 bytes de código de resultado datasasl: 0Un GET exitoso usando autenticación:
¡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:
A continuación, clona el árbol:
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:
Entonces podré hacer la prueba.
Si observo mi servidor memcached habilitado para SASL, veo que la autenticación funciona. Conexión:
Autentificación:
Set, autenticado:
Obtener, autenticado:
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!
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.