Mostrando entradas con la etiqueta seguridad. Mostrar todas las entradas
Mostrando entradas con la etiqueta seguridad. Mostrar todas las entradas

lunes, 5 de febrero de 2007

Instalando el lector de tarjetas inteligentes LTC31 en Ubuntu linux

Quiero instalar un lector de tarjetas inteligentes LTC31 en cuya caja se afirma que es compatible con Linux (sin más). Existen dos versiones de éste lector, yo tengo la más antigua (se supone que con la nueva no hay que hacer todo lo que cuento a continuación).

Siguiendo las instrucciones de instalación para linux me encuentro que sólo funciona para kernels 2.4; si tienes un 2.6 tienes que aplicar un parche al código del kernel y recompilarlo. Ya empezamos.

El parche hay que solicitárselo al departamento técnico. Yo ya lo he solicitado, pero no se han puesto en contacto conmigo ni para decirme que habían recibido mi solicitud. Buscando por ahí me he encontrado el parche para la versión 2.6.11 pero yo tengo la 2.6.17 (y subiendo). Al intentar aplicar el parche, cómo no, me sale un error.

El siguiente paso fué intentar aplicar el parche manualmente. El fichero a editar era drivers/usb/host/uhci-hcd.c y tras mucho buscar no encontré dónde aplicar el parche. Al final lo encontré, en otro fichero: drivers/usb/host/uhci-q.c. Supongo que el fichero uhci-hcd.c ha sido divido dos o más partes, y éste trozo de código ha acabado en éste fichero.

El código que hay que cambiar es éste:
/* Can't have low-speed bulk transfers */
if (urb->dev->speed == USB_SPEED_LOW)
return -EINVAL;

por éste otro:
ret = uhci_submit_common(uhci, urb, eurb, uhci->skel_bulk_qh);
if (ret == -EINPROGRESS)
uhci_inc_fsbr(uhci, urb);
Por supuesto, ésto lo he visto en el parche para la 2.6.11. Ahora toca recompilar el kernel y probar... ERROR. No podía ser tan fácil. Tras toquetear un poco la función la dejé así:
int ret;

/* Inicio parche LTC31 */
qh->skel = uhci->skel_bulk_qh;
ret = uhci_submit_common(uhci, urb, qh);
if (ret == -EINPROGRESS)
uhci_inc_fsbr(uhci, urb);
/* Fin parche LTC31 */

//qh->skel = uhci->skel_bulk_qh;
// ret = uhci_submit_common(uhci, urb, qh);
if (ret == 0)
uhci_inc_fsbr(uhci, urb);
return ret;
y... ¡me ha compilado! Ahora a ver si funciona.

Pues va a ser que si. Al elegir en el Grub arrancar con el kernel recién generado ha funcionado el lector de tarjetas.

domingo, 4 de febrero de 2007

Creando certificados y claves privadas con openssl

Creando certificados y claves privadas con openssl:

Cómo instalar openssl: "sudo apt-get install openssl"

Cómo crear un certificado de CA:
cd /usr/share/doc/openvpn/examples/easy-rsa/2.0
Edita el fichero "vars" y cambia la configuración de KEY_COUNTRY, KEY_PROVINCE, KEY_CITY, KEY_ORG, y KEY_EMAIL. También he tenido que poner KEY_DIR. Luego ejecuta:
source vars
sudo ./clean-all
sudo ./build-ca
Y en el directorio "keys" podremos encontrar "ca.crt" (el certificado) y "ca.key" (la clave privada del certificado).

Esta clave es la más importante de toda la infraestructura PKI y sólo es necesaria para generar nuevos certificados de cliente o servidor. Por lo tanto, esta clave no tiene porqué estar en una máquina accesible.

Cómo crear un certificado y clave privada de servidor:
Ejecutamos:
sudo ./build-key-server nombre_del_servidor
Y en el directorio "keys" encontramos nombre_del_servidor.csr, nombre_del_servidor.crt y nombre_del_servidor.key y 01.pem (que contiene el certificado y la clave privada protegidas por la contraseña que se ha especificado durante la ejecución de build_key_server). El .csr lo podemos borrar y la clave (.key) sólo debe estar accesible a aquellos servicios (p.ej apache2, openvpn...) que la usen para firmar.

Cómo crear un certificado y clave privada de cliente:
Ejecutamos:
sudo ./buildkey cliente
Y en el directorio "keys" encontramos 02.pem, cliente.csr, cliente.crt y cliente.key. El cliente debe tener el fichero 02.pem y conocer la contraseña.

Instalando openVPN

Quiero instalarme una VPN en mi servidor para poder acceder a él. Había pensado en instalar PPTP pero he leído que PPTP no es del todo seguro, así que voy a probar con openVPN.

Para instalar y configurar openvpn he seguido el "OpenVPN 2.0 HOWTO" de openvpn.net y el "Cómo de openVpn en Linux" de www.ubuntu-es.org.

Instalar el paquete "openvpn":
sudo apt-get install openvpn
Crear el certificado de la CA y el certificado y clave privada del servidor y clientes: Si no tenemos los certificados de la CA y el servidor y la clave privada del certificado de servidor o queremos crealos para un nuevo cliente, tendremos que crealos usando openssl.

Crear un fichero de configuración de openVPN, p.ej /etc/openvpn/tunel.conf (podemos copiar el que hay en )con un contenido similar a éste:
#################################################
# Ejemplo para crear una red con multiples #
# clientes #
#################################################

# En que ip local escucha
;local a.b.c.d

# Puerto en el que escucha
# Se pueden levantar varias VPNs en puertos distintos
port 1194

# protocolo TCP o UDP?
proto tcp
;proto udp

# "dev tun" => tunel IP
# "dev tap" => tunel ethernet
dev tun
;dev tap

# ca - certificado de la CA
# cert - certificado del servidor
# key - clave asociada al certificado del servidor
ca /usr/share/doc/openvpn/examples/easy-rsa/keys/ca/ca.crt
cert /usr/share/doc/openvpn/examples/easy-rsa/keys/servidor/servidor.crt
key /usr/share/doc/openvpn/examples/easy-rsa/keys/servidor/servidor.key # Mantener en secreto

# Parametros Diffie hellman
# Se pueden generar asi:
# openssl dhparam -out dh1024.pem 1024
dh /usr/share/doc/openvpn/examples/easy-rsa/keys/dh1024.pem

# Red a la que se asignan los clientes => 192.168.10.0/255.255.255.0
# El servidor será 192.168.10.1
server 192.168.10.0 255.255.255.0

# Mantiene una lista de ip-ip_virual que permite reconectar clientes a la misma IP
ifconfig-pool-persist ipp.txt

# Metemos una ruta para que los clientes puedan llegar a la red 192.168.1.0/255.255.255.0
push "route 192.168.1.0 255.255.255.0"

# Permite hacer de gateway (y redirigir todo el tráfico del cliente al servidor, p.ej. tráfico web)
;push "redirect-gateway"

# Hay que descomentar la linea siguiente para que los clientes puedan verse entre sí
;client-to-client

# Hay que descomentar la linea siguiente para que un mismo cliente puede abrir varias conexiones
duplicate-cn

# El primer parametro indica cada cuanto tiempo probar la conexion (en segundos)
# El segundo, el tiempo transcurrido sin respuesta hasta que se corta la conexion con el cliente
keepalive 10 120

# Permitir compresion
comp-lzo

# Numero maximo de clientes concurrentes
max-clients 25

# Quitamos privilegios al demonio
user nobody
group nobody

# The persist options will try to avoid
# accessing certain resources on restart
# that may no longer be accessible because
# of the privilege downgrade.
persist-key
persist-tun

# configuracion del log
status /var/log/openvpn/openvpn-status.log
log-append /var/log/openvpn/openvpn.log
verb 4

Crear los parámetros de Diffie-Hellman: si no lo has hecho ya, ejecuta:
sudo openssl dhparam -out dh1024.pem 1024Y te creará dh1024.pem.

Reinicia openvpn: sudo /etc/init.d/openvpn restart

Si surge algún error, comprueba los logs en /etc/log/openvpn/openvpn.log.
Asegúrate de tener bien todas las rutas a ficheros en el fichero de configuración.

Para configurar el cliente:
Instala openvpn en la máquina cliente y copia los ficheros cliente.crt, cliente.key y ca.crt
a /etc/openvpn/keys/

Copia el fichero de configuración de ejemplo que hay en /usr/share/doc/openvpn/examples/sample-config-files/cliente.conf
a /etc/openvpn y edítalo manualmente. Reinicia openvpn y si hay algún problema, mira los logs.

sábado, 3 de febrero de 2007

Configurando el firewal ipchains con webmin

Configurando el firewall ipchains con webmin:

  1. Nos aseguramos de que ipchains está instalado con "sudo apt-get install ipchains"
  2. Accedemos a la dirección del webmin a través de un navegador, p.ej. https://servidor:10000/
  3. Vamos a red -> cortafuegos linux
  4. Elegimos "bloquear trafico de red en la interfaz externa" y "habilitar firewall al arrancar" y pulsamos "configurar firewall"
  5. Denegar conexiones entrantes por defecto: En la sección "paquetes entrantes" pulsamos "añadir", que nos lleva a pantalla "Añadir regla" de "paquetes entrantes"
    1. En "Rule comment" ponemos "Por defecto"
    2. En "Acción a ejecutar" elegimos "denegar"
    3. Pulsamos el botón "Crear"
  6. Para abrir puertos (por ejemplo para el webmin), hay que añadir otra regla en "paquetes entrantes"
    1. En "Rule comment" ponemos un comentario (p.ej. "webmin")
    2. En "Acción a ejecutar" elegimos "aceptar"
    3. En "Protocolo red" elegimos "igual a" y el protocolo del servicio a admitir (en este caso "TCP")
    4. En "Puerto TCP o UDP destino" elegimos "igual a" y escribimos el puerto de destino (en este caso 10000)
    5. Si queremos restringir el acceso a dicho puerto a una IP o subred determinada, en el campo "IP o red de origen" elegimos "igual a" y la IP o red (p.ej. 192.168.1.0/24)
    6. Pulsamos el botón "crear"
    7. Pulsando el icono de la flecha hacia arriba en la regla recién creada, la subimos por encima de creada anteriormente (denegar entrantes por defecto)
  7. Una vez hayamos terminado de configrar el cortafuegos, pulsamos el botón "aplicar configuración"
  8. Si queremos abrir puertos por linea de comandos, podemos usar: "/sbin/ipchains -A input -p $protocol --dport $port -s $localaddress -j ACCEPT" cambiando
    1. $protocol por el protocolo "tcp" o "udp"
    2. $port por el puerto de destino (o puertos), p.ej. 3306 para mysql, 80 para apache, 8080 para tomcat, ...
    3. $localaddress por la dirección IP (o subred), p.ej. 192.168.1.0/24
  9. Si queremos denegar conexiones entrantes a un puerto desde un interfaz determinado por linea de comandos, podemos usar "/sbin/ipchains -A input -p $protocol --dport $port -i $interfaz -j DENY" cambiando
    1. $protocol y $port como en el punto 8
    2. $interfaz por el interfaz a restringir (p.ej. eth0, wlan0, etc...)