jueves, 20 de octubre de 2016

Censo Nacional Tecnologías Digitales

Dirección para accesar al censo

http://www.mep.go.cr/censo-nacional-tecnologias-digitales

miércoles, 26 de noviembre de 2014

Consulta tablas hijas MySQL

Para conocer las tablas hijas, que dependen por llave foránea de otra tabla, se puede utilizar la base de datos information_schema, y la tabla de la misma KEY_COLUMN_USAGE. Acá se encuentran todas las referencias, para sacar información se puede realizar una consulta como la siguiente:

SELECT

   kcu.referenced_table_name padre,

   kcu.table_name hijo,

   kcu.constraint_name nombre_constraint,

   kcu.REFERENCED_COLUMN_NAME columna_referencia,

   kcu.COLUMN_NAME nombre_columna

FROM

   information_schema.KEY_COLUMN_USAGE kcu

WHERE

   kcu.referenced_table_name IS NOT NULL

   and ( kcu.referenced_table_name = 'tabla_estudiante')

ORDER BY

   kcu.referenced_table_name;

jueves, 18 de septiembre de 2014

Balanceo de carga para Multi-WAN con Pfsense

En este artículo se configurará un servidor Pfsense. Este es un sistema operativo basado en FreeBSD, codigo abierto y distribuible, por Electric Sheep Fencing, LLC. Está optimizado para funcionar como firewall/gateway y consume relativamente bajos recursos.
Entre sus características permite configurar un balanceo de cargas basado en rutas de puerta de enlace. Esto de manera muy intuitiva y por una interface web.
No se contempla en este artículo la instalación, pues se hace de una manera muy sencilla (Únicamente estar atento en el boot, para ingresar la orden de instalación).
En la instalación se definen las interfaces de red, una para WAN, otra para LAN y otra opcional (OPT1).
En freeBSD, el nombre de las interfaces de red tiene la nomenclatura "em#" (en linux la nomenclatura sería "eth#")
Asumiremos que las interfaces están distribuidas de la siguiente manera:
WAN:em0- ISP1
LAN:em2- LAN
OPT1:em1- ISP2

Para realizar las configuraciones debemos ingresar al sitio web de administración (se instala automáticamente cuando se instala el sistema operativo). Para ello nos metemos a algún navegador web en un computador conectado a la interface "WAN" de nuestro servidor sential. En la barra de direcciones se escribe "http://IP_DE_PFSENSE". El usuario es "admin" y la contraseña "pfsense".
Una vez logeados podemos empezar la configuración

Configuración de las Interfaces de Red:

Primero debemos saber con cuales interfaces de red se está trabajando. Como vimos en la descripción anterior, debemos cambiar el nombre de las interfaces de red para que correspondan a su función y no tengamos confusiones más adelante.
en el menú de arriba nos dirigimos a "Interfaces" y configuramos los nombres y la dirección IP de cada una.
Una vez en la pantalla de Interface:
- En "Description" se escribe el nombre de la interface (para la que tiene conectado el ISP2 sería "WAN2")
- En "IPv4 address" se escribe la dirección IP para que pueda comunicarse con el resto de la red correspondiente.
- En "IPv4 Upstream Gateway" se debe seleccionar el gateway a utilizar según la red WAN que estemos configurando (WAN o WAN2), si no se escoge "none". Si debemos configurarlo y no está definido, debemos escoger la opción "add a new one" y llenamos los datos correspondientes:
- Por último salvamos la configuración en el botón "Save".

Esta configuración debe hacerse con cada una de las interfaces de red, al final debería quedar como describe la siguiente tabla:

WAN->WAN:em0- ISP1
LAN->LAN:em2- LAN
OPT1->WAN2:em1- ISP2

Configurando el "Gateway Group"

Una vez configuradas las interfaces de red dos de ellas (WAN, WAN2) nos servirán para conectarnos con los gateways (ISP1, ISP2).
Debemos meternos desde menu a "System->Routing".

En la pestaña "Gateways" tenemos que definir en cada una de las puertas de enlace una dirección IP para monitoreo, esto para comprobar que se tenga siempre conección a internet (pueden utilizar por ejemplo una dirección ip de la página de google o del servidor dns de google). Para esto nos posicionamos en la fila del gateway y pulsamos el botón con una "e" de edición. Dentro de la pantalla de edición nos dirigimos a "Monitor IP", escribimos alguna dirección IP de la WAN que podamos monitorear mediante el comando PING, y le damos guardar con el botón "Save". Esto se debe hacer con cada uno de los gateways.


Ahora podemos crear un grupo de gateways, esto realiza el balanceo y failover de una vez, con unos pocos pasos. Seleccionamos la pestaña "Groups" y dentro buscamos a la derecha un botón con el símbolo de más "+". Esto nos lleva a la pantalla para crear el grupo. Debemos escribir el nombre del grupo, las cantidad de niveles de prioridad que tendrá cada puerta de enlace (tier 1 - una petición, tier - 2 dos peticiones, tier 3 -tres peticiones, etc), en "Trigger Level" debe estar seleccionada la opción "Member Down" y por último la Descripción. Una vez llenas estas configuraciones guardamos en el botón "Save". Esto es todo para definir el Gateway Group

Creando las reglas de acceso

Por último para poder hacer que nuestro PFsense funja como gateway para nuestra red LAN debemos crear la regla en el firewall. Nos dirigimos al menú "Firewall->Rules", seleccionamos la pestaña "LAN" y presionamos el botón con el símbolo más "+" que se encuetra a la derecha de la cabecera de la tabla.

Esto nos dirige a la página para agregar una nueva regla. En ella debemos verificar que en "Action" esté selecciónada la opción "Pass", en Interface la opción "LAN" y en Source y Destination la opción "Any". En la mísma página debemos ir a "Advance Features", buscamos en la lista de configuraciones el "Gateway", precionamos el botón "Advance". Esto hace que aparezca una lista con los gateways disponibles, seleccionamos el Gateway Group creado anteriormente. Ahora le damos guardar y con esto ya deberíamos tener conección a internet con las máquinas de red y un sevidorsito de balanceo de carga y fail over .



martes, 29 de julio de 2014

Balanceo de Carga con Debian, IPTables e interfaces Bridge (virtuales).

Hace unos días tuvimos que resolver una configuración de balanceo de carga (únicamente balanceo de carga, sin redundancia). El esquema de red es el siguiente:
En resumen,según el esquema y lo que necesitamos:
Conecciones ADSL (o cualquier otro tipo de salida hacia internet)
Dos Router ADSL que nos servirán de Gateway, cada uno: ADSL1,ADSL2
Servidor Principal
Instalado en Debian 7 (Wheezy)
Instalado Proxmox como interfaz de administración de KVM
Dos Interfaces de Red (NIC) físicas (van conectadas cada una a un ADSL): IF1, IF2
Una Interfaz de Red Virtual (Bridge) que no está enlazada a ninguna interfaz de red física: IF0

La idea principal es que el servidor sirva de puerta de enlace, suministrando dos conexiones de internet a una misma salida virtual (bridge), para que la utilicen los servidores montados sobre máquinas virtuales (servidor de firewall, http proxy, distribución, dhcp, etc) y que devuelvan la conexión.

Configurar interfaces de red


Esto se hace desde el archivo "/etc/interfaces", donde se definen las configuraciones de las interfaces de red físicas y virtuales. Primero se deben conseguir los datos de configuración de los gateways de cada ISP, necesitamos IP-address y Netmask de cada router/gateway. A continuación el ejemplo de archivo de configuración (recuerden establecer los parámetros de conexión según sus necesidades). Primero abrimos el archivo de configuración con algún editor de texto, yo utilizo nano desde consola, para abrir el archivo se utilizaría el siguiente comando:
nano /etc/network/interfaces
Ahora editamos el archivo de configuración, básicamente debemos configurar las interfaces estáticas (manuales) y quitamos el Gateway:
# ###################################
# Configuración del loopback
auto lo

iface lo inet loopback
# ###################################
# Configuración de interfaces físicas
# ...

# IF1 - Sale por ADSL 1
# NO debe configurar Gatway --- SIN GATEWAY
auto eth0
allow-hotplug eth0
iface eth0 inet static
address 10.10.1.2
netmask 255.255.255.0
network 10.10.1.0
broadcast 10.10.1.255
# el gateway para el ejemplo es el 10.10.1.1

# IF2 - Sale por ADSL 2
# NO debe configurar Gatway --- SIN GATEWAY
auto eth1
allow-hotplug eth1
iface eth1 inet static
address 10.20.2.2
netmask 255.255.255.0
network 10.20.2.0
broadcast 10.20.2.255
# el gateway para el ejemplo es el 10.20.2.1

# ...
# Configuración de interfaz Virtual
# ...

# IF0 para red LAN Virtual
# Vmbr2 no tiene ninguna interface de red física enlazada,
# pues se utilizará únicamente para máquinas virtuales.
auto vmbr2
iface vmbr2 inet static
address 192.168.1.1
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
bridge_ports none
bridge_stp off
bridge_fd 0
# ...
# TO DO
# ...

Agregar tablas de rutas

Seguido se deben agregar las tablas de rutas, esto al final del archivo de configuración "/etc/iproute2/rt_tables", se puede agregar cualquier nombre, pero representativo para acordarnos a la hora de hacer los otros scripts. Agregaremos 4, 2 de salida/entrada y 2 de marcado de paquetes:

echo 200 T1 >> /etc/iproute2/rt_tables
echo 201 T2 >> /etc/iproute2/rt_tables
echo 202 lento >> /etc/iproute2/rt_tables
echo 203 rápido >> /etc/iproute2/rt_tables

Configurar rutas en el iptables

En las siguientes lineas se documenta todo explicando paso a paso. Nos basamos, casi textualmente :P, del blog de K-Nabora. Si desea puede hacer esta configuración en un archivo de script (bash,sh). Estas configuraciones se pierden con cada reinicio del computador, para que queden "permanentes" debería mandarlas a llamar desde "rc.local".
#!/bin/bash
# Se crean las tablas de rutas para las dos interfaces uplink
echo "Creando las rutas para cada tabla T1"
ip route add 10.10.1.0/24 dev eth0 src 10.10.1.2 table T1
ip route add default via 10.10.1.1 table T1
echo "Creando las rutas para cada tabla T2"
ip route add 10.20.2.0/24 dev eth1 src 10.20.2.2 table T2
ip route add default via 10.20.2.1 table T2
echo "Hecho."

# Aseguro que cada red enviará sus solicitudes a la ip correcta
echo "Asegurando la ruta para cada interface e IP"
echo "Asegurando ruta para eth0"
ip route add 10.10.1.0/24 dev eth0 src 10.10.1.2
echo "Asegurando ruta para eth1"
ip route add 10.20.2.0/24 dev eth1 src 10.20.2.2
echo "Hecho."

# Creo dos reglas para que cada ip se fije a su tabla de rutas
echo "Creando reglas para tabla T1"
ip rule add from 10.10.1.2 table T1
echo "Creando reglas para tabla T2"
ip rule add from 10.20.2.2 table T2
echo "Hecho."

# Se hace el balanceo 1 a 2
echo "Haciendo el balanceo"
ip route add default scope global nexthop via 10.10.1.1 dev eth0 weight 1
nexthop via 10.20.2.1 dev eth1 weight 2
echo "Hecho."

# Se agrega dos tablas de rutas estáticas para hacer marcado de paquetes sobre ellas
echo "Creando tablas para marcado de paquetes ..."
# Enlace lento
ip rule add fwmark 1 table lento
ip route add table lento via 10.10.1.1 dev eth1

# Enlace rápido
ip rule add fwmark 2 table rapido
ip route add table rapido via 10.20.2.1 dev eth2

echo "Refrescando las rutas"
ip route flush cache
echo "Hecho."

Para probar podemos utilizar los siguientes comandos:
  • ip route
  • ip route list table T1
  • ip route list table T2
  • ip route show table lento
  • ip route show table rapido
Si todo salió bien, deberíamos tener conexión hacia internet desde nuestro servidor principal.

Configurar nateo en el iptables

En las siguientes lineas se documenta todo explicando paso a paso. Nos basamos, casi textualmente :P, del blog de K-Nabora. Si desea puede hacer esta configuración en un archivo de script (bash,sh). Estas configuraciones se pierden con cada reinicio del computador, para que queden "permanentes" debería mandarlas a llamar desde "rc.local".

echo "Limpiando rutas"
iptables -F # Flush - Elimina las reglas existentes una a una
iptables -X # Elimina reglas definidas por el usuario
iptables -Z # Pone los contadores a cero
iptables -t nat -F # elimina las reglas definidas en la tabla nat
iptables -t mangle -F # elimina las reglas definidas en la tabla mangle

echo "Activando el NAT (ip_forwarding)"
echo 1 > /proc/sys/net/ipv4/ip_forward

echo "Enmascarando y definiendo NAT"
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 -j MASQUERADE

#Opcional
# Se realiza marcado de paquetes para permitir el retorno de paquetes para servicios de chat MSN y IRC
iptables -t mangle -A PREROUTING -i vmbr2 -s 192.168.1.0/24 -p tcp --dport 1863 -m state --state NEW,ESTABLISHED,RELATED -J MARK --set-mark 2
iptables -t mangle -A PREROUTING -i vmbr2 -s 192.168.1.0/24 -p tcp --dport 6667 -m state --state NEW,ESTABLISHED,RELATED -J MARK --set-mark 2


Enlaces

.
Antes agradecer a K-nabora e Izzy

lunes, 28 de abril de 2014

Ubuntu - Agragar usuario con contraseña desde consola

Es algo poco común, pero en ocasiones necesitamos diseñar scripts que nos permitan establecer la contraseña de un usuario desde consola, y en mi caso, en la misma línea que se crea el usuario. Ubuntu utiliza encriptación SHA-512 para guardar las contraseñas.

Con el comando useradd, se puede establecer la contraseña cuando se crea el usuario, pero hay que ingresarla encripatada de una vez. Para hacer este menester se utiliza perl embebido en el comando useradd, y la cadena "$6" en la encriptación.

useradd -m -p $(perl -e 'print crypt("password","\$6\$saltsalt\$") . "\n"') _usuario

viernes, 4 de abril de 2014

Instalar una aplicación wine una vez, ejecutar en muchos usuarios.

Esta duda me ha atormentado desde hace mucho tiempo (casi desde que empecé a utilizar GNU/Linux) y es como instalar una vez un programa Windows en linux y ejecutarlo en cualquier usuario linux.
Se me ocurrieron varias cosas, como crear un enlace simbólico a la carpeta wine de los otros usuarios, pero por los permisos no sirvió, enlaces duros tampoco.
Trasteando un poco leí una solución que me sirvió, en lo poco que la he probado, que es hacer un usuario y ejecutar wine (o playonlinux) como él, entonces las instalaciones y todo quedan en su carpeta de usuario y la podemos utilizar desde el usuario que se desee. Suena sencillo, pero luego se complica un poco (hay que otorgar al usuario "wine" permiso para que ejecute X en el usuario que queremos ejecutar, etc), pero encontré una página donde solucionaron casi todo. En esta entrada transcribo, casi textualmente, traduciendo al español los pasos a seguir para lograrlo.

Instalar WINE y PLAYONLINUX

Instalarlos es muy sencillo, pueden buscar los paquetes en el gestor de paquetes Synaptic.

Crear una nueva cuenta de usuario para Wine

Se creará una cuenta de usuario llamada "wine" (en minuscula). Para crearlo se puede hacer mediante la consola
$ sudo adduser --disabled-login --shell /forbid/login wine
Esto debería crear una nueva cuenta de usuario llamada wine que no se podrá autenticar, pero tendrá directorio home.

Opcional

Dependiendo de los programas que se quieran instalar se deberá agregar al usuario wine a un grupo que tenga los permisos necesarios. Por ejemplo, si se tiene un programa que requiera audio deberá agregarse wine al grupo audio
$ sudo usermod --append --groups audio wine
De igual manera, según necesidad, se tendrá que agregar el usuario wine a grupos como cdrom, floppy, etc.

Permitir a nuestra propia cuenta de usuario lanzar comandos bajo el nombre de la cuenta wine

Tener mucho cuidado en esta sección los usuarios de Ubuntu y otras distribuciones donde sudo maneja los privilegios de super usuario y no se tiene acceso al usuario root. El comando sudo permite correr comandos bajo el nombre de otra cuenta. Usualmente sudo es utilizado para correr programas como super usuario (lo hicimos un par de veces en la sección anterior). Pero también se puede usar sudo con la opción -u, que permite correr los comandos como otro usuario. Normalmente esto requiere que se digite la contraseña de dicho usuario, pero editando el archivo /etc/sudoers se puede dar permiso a tu propia cuenta de usuario para correr el comando sin necesidad de escribir la contraseña de la otra cuenta de usuario.  Para editar /etc/sudoers se debe hacer son el momando visudo
sudo visudo
Una vez dentro del archivo /etc/sudoers, se necesita agregar una nueva linea al final del archivo. Se quiere que nuestra cuenta, para este ejemplo llamada "pepe", pueda correr comandos como el usuario wine. Para esto se agrega la siguiente línea
pepe ALL=(wine) NOPASSWD: ALL
Recuerde cambiar pepe por su propio nombre de usuario.  Debe de hacer esto con cada usuario que desee ejecute la aplicación windows.  Leyendo un poco la documentación de /etc/sudoers y un par de ejemplos por ahí dice que se puede agregar Alias y listas de usuarios.
Ahora se puede, desde la terminal, probar que sirvan los comandos corridos desde la cuenta wine :
$ sudo -u wine ls /home/wine

Opcional (recomendado)

Si la cuenta de usuario que desea que ejecute los programas Windows no está dentro del grupo sudo, debe agregarla desde la terminal. Pero al hacer esto, le estará dando permisos (por la configuración por default que viene en el archivo /etc/sudoers) para ejecutarse y loguearse como administrador. Por motivos de seguridad esto no es deseable, para corregir esto, siga los siguientes pasos, sin salir de la edición del archivo /etc/sudoers.
Documente la línea %sudo ALL=(ALL:ALL) ALL, quedando así
#Allow members of group sudo to execute any command
#%sudo ALL=(ALL:ALL) ALL
Seguido debe agregar al grupo administrador de sistema (donde se encuentra su cuenta principal de administración) y darle todos los permisos, para esto (probado en Ubuntu 13.10) agregue las siguientes líneas al archivo
#Permitir al grupo administrador ejecutar cualquier comando
%adm ALL=(ALL:ALL) ALL
Con esto le concede permiso a los usuarios del grupo adm (administradores en Ubuntu) a ejecutar cualquier comando y poderse loguear como super usuario.

No permitir que wine y playonlinux sean usados por otras cuentas de usuario

Porque queremos estar seguros que Wine o PlayOnLinux no será utilizado deliberadamente o accidentalmente por otra cuenta de usuario que no se wine, necesitamos cambiar los permisos de ejecución de los respectivos archivos binarios.  Estos se encuentran en la carpeta de sistema /usr/bin.
$ sudo chown root:wine /usr/bin/wine*
$ sudo chown root:wine /usr/bin/playonlinux*
$ sudo chmod o-x /usr/bin/wine*
$ sudo chmod o-x /usr/bin/playonlinux*

Creando el script runaswine

Según la lógica que llevamos, correr una aplicación en windows debería ser tan simple como digitar sudo -u wine /ruta/programa_windows.exe. Pero en la práctica, nos podemos encontrar un par de piedras grandes en el camino.
Primero que todo, el usuario wine no podrá tener acceso al servidor X  para manejar los gráficos. Al intentar correr la aplicación, como HotPotatoes, únicamente nos generará un mensaje de error. Para dar permiso al usuario wine de utilizar el servidro X, podemos ingresar en el terminal el siguiente comando:
xhost +SI:localuser:wine
Esto dará permiso al usuario wine de utilizar el servidor X de nuestro usuario por una sesión únicamente.
nota: Pareces ser que se puede hacer permanente mediante xauth , tengo que investigar sobre el asunto.
El comando sudo -u wine /ruta/programa_windows.exe ahora debería servir.  Pero, las variables de entorno de nuestro usuario wine están apuntando a las variables de nuestro usuario ejecutor, esto puede crear conflictos a la hora de ejecutar programas y dejar un par posibles huecos de seguridad (también se tiene que investigar más este punto) ,entonces se puede usar el comando env, utilizando la cuenta wine para reflejar las variables hacia wine.

sudo -u wine env HOME=/home/wine USER=wine USERNAME=wine LOGNAME=wine wine "$@"

Esto lo podemos agregar en un script que se ejecute luego desde terminal, el cual se puede guardar en /usr/bin, para este ejemplo el escript se llamará runaswine.bash.
nano /usr/bin/runaswine.bash

Dentro del archivo escribiremos los comandos recién vistos.
#!/bin/bash
# Run Wine as user wine.
# Should only be used for running Windows software with Wine emulator.

echo "Adding wine to X server permissions list."
xhost +SI:localuser:wine

echo "Running as wine:" "$@"
# Use sudo -u wine to run command (and all arguments) as user wine.
# and use env command to set environment variables for wine user.
sudo -u wine env HOME=/home/wine USER=wine USERNAME=wine LOGNAME=wine playonlinux "$@"
http://www.bobulous.org.uk/misc/Spotify-Linux-Wine.html
http://www.linuxtotal.com.mx/?cont=info_admon_014

viernes, 28 de marzo de 2014

TTS en archivo MP3 desde google translator con terminal

Una opción sencilla y de calidad aceptable para Text To Speech (TTS) puede ser el audio que nos ofrese el traductor de google.
La limitante que tiene es que parece no aceptar más de 100 caracteres.
El comando a utilizar seria el siguiente:

wget -U "Mozilla/5.0" -qO - 'http://www.translate.google.com/translate_tts?tl=es&q="Lo que quiera reproducir"'  >  archivo_salida.mp3