lunes, 2 de octubre de 2017

Troubleshooting owncloud external storage with Azure CIFS/SMB















This post tries to be a tips and tricks or a little troubleshooting guide in external storage owncloud config to Azure. If you haven't read the previous post I really encourage you to do it because it gives you a background of the problems with CIFS and in concrect CIFS and Azure.

Requirements

These are the packages you'll need to config the external storage in Owncloud (wikipedia):
  • smbclient
  • libsmbclient-dev
  • php-smbclient
Test if you are able to connect via smbclient and the previous post if you can it's a good signal.

Config (more or less)

Here you'll find the manual for smb external storage in Owncloud. This is not some I'm going to explain, just follow the manual.


Troubleshooting

If you get problems configuring and accessing the external storage you can use this code extracted from https://github.com/eduardok/libsmbclient-php with some personal customizations (little). It's a PoC for connecting to a samba (SMB) share from PHP:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php

print "smbclient version:" . smbclient_version() . PHP_EOL;
print "samba version:" . smbclient_library_version() . PHP_EOL;

// Create new state:
$state = smbclient_state_new();

// Initialize the state with workgroup, username and password:
smbclient_state_init($state, 'AZURE', '<user_name>', '****');
print "$state" . PHP_EOL;

// Open a directory:
$dir = smbclient_opendir($state, 'smb://<azure_URL>/<share>');
print "$dir" . PHP_EOL;
exit;
// Loop over the directory contents, print each node:
while (($entry = smbclient_readdir($state, $dir)) !== false) {
 echo "{$entry['name']} : {$entry['type']}\n";
}
// Close the directory handle:
smbclient_closedir($state, $dir);

// Free the state:
smbclient_state_free($state);
print "$dir" . PHP_EOL;

// Loop over the directory contents, print each node:
while (($entry = smbclient_readdir($state, $dir)) !== false) {
 echo "{$entry['name']} : {$entry['type']}\n";
}
// Close the directory handle:
smbclient_closedir($state, $dir);

// Free the state:
smbclient_state_free($state);
?>


Attention to "exit;" command in line 16!!



Here are the results in the case of error:
smbclient version:0.9.0
samba version:4.2.14-Debian
Resource id #4
NTLMSSP packet check failed due to short signature (0 bytes)!
NTLMSSP NTLM2 packet check failed due to invalid signature!
PHP Warning:  Couldn't open SMB directory smb://<SMB share>: Workgroup not found in libsmb01.php on line 14


And here, in the case of success:
smbclient version:0.9.0
samba version:4.5.8-Debian
Resource id #4
Resource id #5



Conclusion

I got no more knowledge that in last post, just that version cares, used it with caution ... ;)


Mount an Azure Share from Linux


Some times we need to make things we don't like, just because a customer needs it. and you have to do some tests. That was my case, I needed to make a test mounting a CIFS/smb share from Microsoft Windows server from Linux (as you can imagine I have no Windows Server to make such a test) so, we got a Windows Server in Azure and we succeded to share a directory to the world.


Requirements

You need these packages:

I rather use a credential file to don't write user and passwd every time (i.e.: ~/.smbclient.conf) with this content:

username=<domain>/<user>
password=<passwd>


First test to connect from a Debian 9 Stretch GNU/Linux with :

smbclient //<azureURLServer>/<shareName> -A ~/.smbclient.conf

And we got this answer:
WARNING: The "syslog" option is deprecated
protocol negotiation failed: NT_STATUS_CONNECTION_DISCONNECTED


This line have been working well for some server I had connected to, but not for Azure? ...


After a while googling I got some interesting info: How to force Linux cifs mount to default to smb3? (https://superuser.com/questions/1226973/how-to-force-linux-cifs-mount-to-default-to-smb3/1228011)

Maybe Azure is only publishing SMB shares in SMB3 because of security concerns? So make the change in /etc/samba/smb.conf:
[global]
client min protocol = SMB2
client max protocol = SMB3


These changes made it work:
WARNING: The "syslog" option is deprecated
Domain=[X] OS=[] Server=[]
smb: \>


Some other tests

I also tested this working config with other Linux flavors and library versions:
  • Oldstable version of Debian 8 GNU/Linux (Jessie): Not working
  • Ubuntu 16.04.2 LTS (Xenial Xerus): Not working
  • Amazon AWS AMI: Not woking 


Conclusion

All tests made with the others distros were using older versions of samba libraries, so the hypothesis is:

Azure is sharing using the last version of SMB protocol (3.0.2 or 3.1.1 maybe) and the only libraries supporting this version are the one with Debian 9 Stretch.

I hope it helps someone ...








martes, 31 de mayo de 2016

For system admins: Know where 'they' can write ...


Have you ever feel anguished allowing untrusted users access to terminal emulation in your systems?

I was in that situation with some Docker ssh containers I shared, so I decided to know which are my writables directories in my systems for an user. I share with you my python script to report that:

https://github.com/jvillaraco/sys/blob/master/testRights.py

 Any suggestion will be welcome!

jueves, 26 de mayo de 2016

Instalación de Docker sobre Debian con personalización del interfaz docker0

De la serie manos a la obra ...

Intro

Últimamente he tenido que dar solución a una situación compleja y, de las alternativas, la mejor posicionada era el contenedor del tipo Docker. A pesar de que los servidores de explotación los tenemos sobre RHEL, utilizo algún Debian para hacer pruebas de concepto (creo que un día documentaré las razones para mantener una Debian para este tipo de pruebas por su facilidad) ...


Problema

En principio una instalación que parecía que iba a ser del tipo 'siguiente, siguiente' (si eso es realmente aplicable al mundo de la consola), se complicó (solo un poco) ya que el segmento de red donde Docker asigna la IP de las máquinas/aplicaciones que levanta COINCIDÍA con el segmento que usamos en la oficina para los PC de trabajo de la red interna, la 172.17.0.0/16 (Un post explicativo). Ya os imagináis, cuando le levanta el servicio docker se deja de ver el servidor a nivel de IP. Si le añadimos al hecho del cambio de Debian al Systemd (no sin ruido ...), hace que todas las soluciones en doc. existente no funcionara. Ahí están expuestas las razones para escribir el artículo.


Instalación

Se puede seguir la documentación del fabricante para la instalación sobre Debian:
https://docs.docker.com/engine/installation/linux/debian/

(La verdad es que hasta aquí es trivial)


Configuración

La solución pasa por modificar la red docker0 para que no sea la 172.17.0.0/16. Para ello (se ejecuta como root o mediante sudo):

Se edita el fichero /lib/systemd/system/docker.service

Se modifica la linea siguiente:
  ExecStart=/usr/bin/docker daemon -H fd://

Por la siguiente:
  ExecStart=/usr/bin/docker daemon -H fd:// --bip=192.168.133.1/24

systemctl daemon-reload

systemctl show docker --property ExecStart
  (se verifica que aparezca la opción añadida)

systemctl restart docker

docker run hello-world



Se explican los comandos utilizados:
  • La linea ExecStart del fichero /lib/systemd/system/docker.service: Como se puede deducir, corresponde a la linea executada por el Systemd en el momento de arrancar el servicio configurado.
  • El parámetro --bip de la linea ExecStart: Asigna la IP del Ethernet Bridge docker0 creado por el servicio Docker. Se puede ampliar la documentación de esta operación en el doc.: https://docs.docker.com/engine/userguide/networking/default_network/custom-docker0/.
  • systemctl daemon-reload: Recarga el system con las nuevas unidades o las modificaciones de las existentes
  • systemctl show docker --property ExecStart: Verifica la propiedad ExecStart de la unidad docker.
  • systemctl restart docker: Rearranca el servicio docker
  • docker run hello-world: Arranca un contenedor de la imagen hello-word. En el siguiente enlace encontraréis más información sobre esta imagen: https://hub.docker.com/_/hello-world/










domingo, 22 de septiembre de 2013

Codificando en Python peticiones POST de http

De la serie bocaditos de código ...

Hola, iniciamos una pequeña serie de programación python sobre la red.

En este caso os presento un pequeño procedimiento para realizar una petición POST de http e imprimir el resultado. No os voy a complicar con parseado (¿existe este palabro?) de la respuesta, ni los parámetros de llamada al programa de ejemplo, centrémonos en la rutina de la llamada.

Un requisito: para validar el funcionamiento podríamos preparar una maqueta con servidor web, cgi o equivalente. Pero casualmente, he encontrado un servicio publicado por Henry Cipolla que nos permite validar la llamada y el paso de parámetros via post, podeis encontrarlo en  http://www.posttestserver.com/ asi como su manual de instrucciones que permite verificar a posteriori los datos de las variables de entorno y los parámetros enviados al servidor.

Aquí va el código:


#!/usr/bin/python
# postExample.py Version: 1.0
#
# Execucion: python postExample.py

import urllib
import urllib2

# Constants
ADRECA = "http://www.posttestserver.com/post.php"

def requestData(par1, par2, timeout):
    query_args = {'p1':par1, 'p2':par2}
    print query_args
    encoded_args = urllib.urlencode(query_args)
    r = urllib2.urlopen(ADRECA, encoded_args, timeout)
    return r.read()

if __name__ == '__main__':
	print "Output: %s" %requestData(11, 22, 10)

lunes, 31 de diciembre de 2012

libre ERP: Use case (2nd part)


From the serie: Get down to the job

Previous part of this article: New series: libre ERP for small companies (Part 1)

We agree this the client (in fact a friend) the use case for the analysis of the libre ERP (free software). These are:
  • Party management (customers and providers)
  • Product inventory management (detailed and massive introduction)
  • Product de-activation (no removing)
  • Product retail (POS)
  • Provider purchase
  • Product reporting (screen and printing)
  • Invoice reporting (screen and printing)
  • Receipt printing

ERP libres: Casos de uso (2a Parte)

De la serie: Manos a la obra

Siguiente parte del artículo: Nueva serie: ERP libres para pequeñas empresas (1a parte)

Se han pactado con el cliente (en realidad amigo) los casos de uso sobre los que se va a realizar el análisis de los productos ERP libres. Estos van a ser los siguientes:
  • Alta/Baja de terceros (clientes y proveedores)
  • Entrada de producto en inventario (al detalle y masiva)
  • Venta de producto (TPV)
  • Baja de producto (marcado de no activo)
  • Gestión de compras de proveedores
  • Listado de todos los productos (pantalla e impresora)
  • Listado de ventas diarias (pantalla e impresora)
  • Impresión de facturas
  • Impresión de tickets de caja o recibos