Aunque hace unos diez años escribí sobre como evitar copias no autorizadas de software hecho en Visual Basic – Clipper, no me había visto en la necesidad de evitar de manera compleja que un software php corriera en máquinas virtuales.

Lo tipico en php, para mi, es hacer una verificacion dura sobre la direccion IP Suponiendo sin conceder que tenemos una función llamada md5_Ip, es tan facil como una linea:

if (md5_ip()<>«md5guardado») Die(«Copia no autorizada para este dominio»);

Este enfoque tiene dos problemas. El primero es que una alteración de los archivos hosts puede convencer de que del dominio está en otro lugar y es otra cosa. El segundo problema es que una copia puede dejar de ser autorizada por la acción del simple transcurso del tiempo. En un sistema que hice hace años, recuerdo que tuve que poner la facilidad para desactivar remotamente el acceso de una PC a cierto sitio web, por casos de robo.

Asi que nos enfrentamos a una situación similar . Ayer me pidieron pensar en un mecanismo de protección de copia no autorizada en una MAQUINA VIRTUAL GENERICA, misma que TODOS los clientes de cierto tipo usan. Asi que, la dirección Mac address es la misma, el numero de serie es el mismo, y vamos a suponer que no podemos cambiar con una utilería el numero de serie del disco duro de la maquina virtual, tanto en caso de clientes que no paguen como en el caso de robo de equipos.

Hay otras dos complicaciones. Algunos clientes tienen varias sucursales, aunque cada sucursal tiene una y solo una PC por razon social, algunas sucursales manejan 3 numeros de cliente por sus diferentes razones sociales, y a su vez una razón social puede tener varias sucursales.

Los unicos datos «estables» que se tienen entonces, es el NUMERO de la razon social (que para otros casos practicos podría ser su CURP o su RFC o numero de contrato), pero dicho valor se va a repetir.

Tampoco podemos usar como llave el numero de direccion ip ni la puerta de enlace. Si es una empresa competente con sucursales, probablemente todas las sucrsales tengan su propia red local con el mismo numero de Gateway , y la misma direccion ip.

Ademas el software de las maquinas virtuales, debe conectarse con nuestro server FORZOSAMENTE o no pueden disfrutar de lo que les interesa del servicio.

Entonces, nos encontramos ante un problema extraño. Necesitamos poder bloquear una instalación en casos de SaaS (software as service), para clientes cautivos, y poder cortar el servicio además de copias pirata. Debido a que no hay acceso fisico ni virtual a las PC, excepto en la implementación y actualizaciones prioritarias, nuestro esquema no puede estar basado en candados de hardware, y al ser igual el hardware por ser maquinas virtuales, si no queremos modificar la MAC address o la serie del disco duro, nos quedan pocas alternativas.

a )Cambiar numro de serie disco duro, o Mac Address. Es impractico y no funciona en el caso de varias razones sociales en la misma pc
b ) Numero de serie de activación, por unica vez. No sirve para desactivar de manera inmediata ni previene copias no autorizadas.
c ) Numero de serie de activación, por mes con mes. No sirve para desactivar de manera inmediata, pero limita el daño.
d ) Archivo de configuración en la PC que use validación por palabra viva .

El punto a no es práctico, el b y c no resuelven el problema, así que se necesita una interface de la PC virtual con nuestro server.

Punto 1:
* Instalar Https en el server del dominio. Esto es prioritario para reducir posibilidades de alteración por DNS poisoning ( http://es.wikipedia.org/wiki/DNS_cache_poisoning )
Punto 2: Disminuir todo lo posible que sea el TTL del dominio.Manejando un TTL bajo, u uno alto se evitan ciertos problemas pero no puede coexistir. bajo y alto en TTL (time to live). Mi enfoque sería un TTL Alto http://www.google.com/#hl=es&xhr=t&q=ttl+domain&cp=10&pf=p&sclient=psy&aq=f&aqi=&aql=&oq=ttl+domain&pbx=1&fp=b85a9cc57c1f0455

Punto 3: Utilizar un archivo generado en instalación de Pc Virtual.
El archivo podría llamarse licencia_clavecliente_numeromaquinavirtual.php y debería contener información que identifique esa razon social y esa maquina virtual. Si de entrada ya estamos configurando logotipos y otras cosas cliente por cliente, editar un archivo mas por cliente antes de bajarlo, no tiene problema. Podemos tener equis numero de licencias, y podemos parar una sin problemas.

Punto 4: El archivo en cuestión tiene que usar una clave de hash no reversible y de contenido conocido para evitar modificación. Es decir, aunque hay sitios especializados en calcular colisiones de palabras que den un hash / sha / md5 y encontrar equivalentes, debemos conocer parte de la clave, asi que si tratan de reemplazarlo, debemos poder hacerlo con un valor que solo nosotros conocemos, y esa es la palabra viva.

Idea:
Vamos a suponer que la palabra viva del cliente uno es «silla», del cliente dos es «mesa» y del cliente tres «cuaderno» (en la practica) la palabra viva no debe ser del mismo tipo, por ejemplo que en una sera españa y en otro argentina, nos hace saber que la palabra viva es pais, lo cual no debe ser.

Sabemos entonces por http://md5-hash-online.waraxe.us/ o md5() que estos son los has de la palabra viva:

silla = 86aa0eab194b5fe69e3c1706b4c041d9
mesa = 85770ae9def3473f559e0dbe0609060a
cuaderno = bf1199db079512f58adad8caa049cef1

Asi que nuestro archivo debe guardar una cadena de textos de tres diferentes hash (prefiero independientes porque así deberían romperse tres y no uno )

Entonces un hipotetico licencia.php sería así:

< ?php define("LICENCIA","86aa0eab194b5fe69e3c1706b4c041d9"); // clave silla ?>

Pero el archivo puede llevarse a otras pc.

Para la situación particular ne que me encuentro, estos son los tres factores que usaré.

1 ) Dirección IP de la PC virtual.
2 ) Numero de cliente mas numero de contrato con nosotros, formato cadena.
3 ) Palabra viva.
La palabra viva se genera al generar el archivo.
Así que, suponiendo que la ip de silla sea: 127.0.0.1, y el cliente mas contrato 008_95,

Calcularemos Hash de dos factores:
1 ) hash de «silla127.0.0.1» = 8fc0ba017f02eaf1b12022798162cc87
2 ) hash de «silla008_95» = d661c0239340663258ced49954b50879

Asi que mi archivo de licencia, que se instalaría al generar la pc virtual numero 17 del cliente 15 es :

licencia_15_17.php
< ? Define ("licencia","8fc0ba017f02eaf1b12022798162cc87d661c0239340663258ced49954b50879"); ?>

Y la verificación de la cadena se puede hacer llamando al servidor por un

function validalicencia(){
$status=file_get_contents(«http://example.com/validate.php?mv=15_17&licencia=8fc0ba017f02eaf1b12022798162cc87d661c0239340663258ced49954b50879»);
return $status;
}

El archivo puede entonces ver base de datos, y si la licencia cambia con la palabra viva, solamente necesitas verificar así:

if ($validalicencia<>«OK») Die («Licencia expirada»);

Asi que , cambiando la palabra viva en nuestro validate.php del servidor, efectivamente deshabilitamos cliente de SaaS, por razón social especifica, sucursal especifica, dejando activas otras.

En la practica yo usaría un hash5 del numero de serie del disco duro o de la fecha de instalación de /home o C:windows, pero al ser PC virtual no se puede.

En 1997 mas o menos, al tratar de contratar programadores para la empresa en la que estaba, noté un problema cualitativo en los programadores que llegaban a hacer examenes. Hoy, casi quince años después, tengo un problema similar con los out sourcings de clientes.

Si bien desde hace unos siete años las circunstancias del trabajo en la empresa de galletas obligaron a contratar técnicos en el interior del país para formatear pc e instalar infinitum, noto que en la actualidad el problema es peor, inclusive los pseudo técnicos tienen un nivel PESIMO de lectura de comprensión.

Por el momento, hay una implementación que no puede terminarse en 17 dias, y no por causas atribuibles a nosotros, sino que su técnico no entiende lo básico, y me da la impresión de ser out sourcing. De momento ya avisé a los socios que saben de lo técnico de la empresa por enésima vez, así que no queda mas remedio que esperar.

Aprovecharé por si es problema del Linux a cargar Una VM con Xp Sp3 absolutamente limpia, pero por mas que veo, es un error del outsourcing de a quien debo implementar.

Ya me contestço el proveedor, pero como ese dominio nunca lo había usado para servers, seva a tardar mas tiempo la propagación de los DNS y NS.

Por mientras ya puse exim en 25 y 26, compilè Curl y estoy a la mitad de la compilación de pdflib para php.

Hace un momento contraté dos servidores nuevos, uno para la pyme y otro para las AC.

Uno de los proveedores en Dallas cambió su polìtica de precios , yme convino dividir un server. Básicamente la nueva política tenìa que ver con contratar de manera obligatoria 25% mas servicios.

De todos modos es buena idea probar de una vez litespeed, creo que será bastante util.

A esperar los correos del proveedor.

Resulta que a pesar que los parámetros de Pureftp desde cpanel si cambian, pure tiene maximo 50 usuarios hardcoded. Levanté un ticket al proveedor del server del trabajo, y esto me respondió:
Alfonso,

Maximum number of ftp users was increased to 150 as per your request:

# ftp dominio.com
Connected to dominio.com.
220———- Welcome to Pure-FTPd [privsep] [TLS] ———-
220-You are user number 1 of 150 allowed.
220-Local time is now 20:50. Server port: 21.
220-This is a private system – No anonymous login
220-IPv6 connections are also welcome on this server.
220 You will be disconnected after 2 minutes of inactivity.
500 This security scheme is not implemented
500 This security scheme is not implemented
KERBEROS_V4 rejected as an authentication type
Name (dominio.com:root):
#

While going through pure-ftpd source code I found that it limits maximum number of users to either value of the MaxClientsNumber configuration option or number of available passive ports divided 2. Previously PassivePortRange was set to the «30000 30100» value so maximum number of clients restricted within the pure-ftpd source code was auto-set to (30100-30000)/2=50. I changed PassivePortRange to «30000 35000» and set MaxClientsNumber to 150 to achieve your needs. Hope this helps

Regards,
Paul

EL problema persiste, aunque ahora ya estña subiendo el load a valores de 2,2 y 2 a plenas 10.30 de la Mañana que son horas pico de facturación.

Tengo la impresión que aunque los ftp estan ya en el limite de 200, y solo se usan unos 120, el problema tiene que ver con que están IDLE. La persona que hizo la parte de la Máquina virtual no contempló el auto close.

No está saturado ni ram, ni cpu. El problema parece ser no de diseño de mi parte(los logs de loads desde php está bien) asi que una de dos: o el diseño de pdfs de los que hacen los formatos está consumiendo muchos recursos por las librerías, o son las conexiones IDLE. Y yo tengo que soportar los IDLE dos minutos, porque ni modo de tumbarlos en automático en menos de eso. Ya es ganancia sobre los 15 minutos estandard de la mayoría de los servidores para cortar IDLEs.

Interesante. Da que pensar que rojointenso.net requiera mas memoria porque siempre están activos los bots de spiders.

De momento en el trabajo hay varios problemas de logística. Uno de los servidores está saturando sus enlaces simultáneos FTP porque los que hicieron la PC virtual no consideraron desconectar los ftp. Así que cada cleinte que se conecta al servidor, usa una de las conexiones.

De momento ni modo de detener ese server porque les pega a los 50 clientes que si están conectados usando pure. Ya configuré elevar a 100 el tope de simultáneos, y modifiqué para que el idle los tire a los 2 minutos en lugar de los quince.

Por mientras no puedo resetear el server, ni entrar a editar los cambios a la lista de artículos para manejar la corrección a fletes.

Será mañana. Lo peor del caso es que este proyecto debería estar funcionando con dos personas de soporte nada más, y al momento están cuatro sin contarme a mi.

Antes de irme resetearé ese server y me enteraré si 100 son suficientes. Como es uno por cliente, espero que sí.