Acá en salud, ahora se están cayendo de la mata y dándose cuenta de los
peligroso que son las conexiones planas.
Aún no logro hacerle entender a la gente, la diferencia entre un certificado
autofirmado y un certificado emitido por una autoridad de certificación
; pero que más les vamos a pedir, si el certificado de nauta es autofirmado.
De momento con darle la muela del candadito y las letricas verdes en el
navegador, van cogiendo algo.
Pero volviendo al tema postfix con SSL. Vamos a crear un certificado
autofirmado, por tanto, regla de oro:
el hostname que provees en el certificado, debe ser machear al del servicio
En letra de molde. Si proveemos un certificado autofirmado, para conectarnos a
smtp.hcg.sld.cu no puedes decir en el cliente de correo, que el servidor
smtp es 192.168.0.1 porque no será válido.
Aún cuando el certificado no sea válido, déjame recodarte que debemos ir
haciéndole cultura de seguridad informática, si no… bueno… no me voy a meter
en un lío diciendo las barbaridades que se logran suplantando identidades.
Bueno entremos en materia. Lo Primero que haremos será generar la clave privada
para el servidor.
Donde dice smtp.tudominio.cu tu pondrás el hostname de que apunta para tu
servidor smtp. Si eres un desastre y no tiene DNS. Pon la IP de tu servidor de
correo.
REPITO
Donde dice FQDN or YOUR name debe decir la dirección del servidor SMTP. La
dirección tal cual la pones en los clientes.
Ahora creamos el certificado. Te pedirá hasta la talla de calzoncillos que usas.
NO respondas a lo locoi, recuerda el FQDN. Te acuerdas del password
que pusiste?
Enter pass phrase for smtp.tudominio.cu.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code)[AU]:CU
State or Province Name (full name)[Some-State]:Havana
Locality Name (eg, city)[]:Plaza
Organization Name (eg, company)[Internet Widgits Pty Ltd]:Calixto
Organizational Unit Name (eg, section)[]:Informatica
Common Name (e.g. server FQDN or YOUR name)[]:smtp.tudominio.cu
Email Address []:ssl@tudominio.cu
Bites verdad? Bueno, ya hicimos lo más importante, pero no hemos terminado.
Vamos a firmar el certificado con la la llave emisora.
Cada vez que un servicio con con un certificado SSL valla a ser iniciado.
Debería pedir un password, para así asegurar que el legítimo operador de
servicio ha sido quien le dio la arrancada. Pero poner un password cada vez que
arranca postfix, no es ninguna gracia. Por tanto, quitamos el password.
Obviamente, te lo pedirá una última vez.
openssl req -new -x509 -extensions v3_ca -keyout cakey.pem -out cacert.pem -days 3650
# aqui te pedirá la misma rutina, ojo con lo que pones en el campo FQDN or YOUR name
Bueno, con el disi y con el mulo, ya tenemos una CA loca, que la podemos reusar
para otros servicios, por tanto, tratemosla como tal.
Cada vez que paso por
23, me cuentro mil y una
red cuyo ESSID tiene el sufijo Conectify delante. Insultado por semejante
derroche de windows, le comentaba a un colega, que daba tristeza no ver un
linuxero ahí conectado.
El socio me dijo: -en linux no se puede compartir la wifi
PA DARLE POR LA CARA!
Dos paquetes nada más que hacen falta: iw, hostapd
La idea es:
crear una interfaz wifi como estacion
crear una interfaz wifi como AP
crear un interfaz bridge (puente)
declarar que la interfaz de salida del puente, es la estación
echar a andar el AP por software
¿SE ENTENDIÓ?
Si tienes el puñetero NetworkManager corriendo, este es un buen momento para
pararlo.
La interfaz que usualmente vez como wlan0 es en realidad phy0. ¿Quieres
verlo? Corre esto:
iw
1
iw dev wlan0 del
¿Te fijaste que wlan0 desapareció? No te preocupes, puedes volver a crearla.
Así:
iw
1
iw phy phy0 interface add estacion0 type station
Como mismo hicimos una estación, podemos hacer un AP.
iw
1
iw phy phy0 interface add hotspot0 type __ap
Ahora creamos la interfaz de puente y le asignamos a wlan0 como extremo de
salida.
br0
123456
ip link add name br0 type bridge
iw dev estacion0 set 4addr on
ip link set dev estacion0 promisc on
ip link set dev estacion0 up
ip link set dev estacion0 master br0
ip link set up dev br0
En letra de molde:
crea un bridge llamado br0
dile que lleva ipv4 (requerido, no se por qué)
pon la interfaz en modo promiscuo
levanta el enlace de estaicon0
coloca a estacion0 como interfaz de salida del túnel
levanta el bridge
Ahora viene lo más importante, el AP. El fichero /etc/hostapd/hostapd.conf
contendrá la configuración de nuestros AP. A mi me quedó así:
# el nombre de tu wifissid=Linux
# la contraseña de tu wifiwpa_passphrase=secretisisimo
# la interfaz de red que hará de APinterface=hostspot0
# el puente al que se acoplarábridge=br0
# el canal, lo puede seleccionar manual# pero un valor de 0, hará el survey.# Mejor que el ap lo seleccione, así# no chocas con ningún canal de etecsa en 23# y aprovechemos ahora que podemos hacer lo# que nos de la gana con el espectro radioeléctricochannel=0
# no toques más nada de aquí pa abajoauth_algs=3
driver=nl80211
hw_mode=g
logger_stdout=-1
logger_stdout_level=2
max_num_sta=5
rsn_pairwise=CCMP
wpa=2
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP CCMP
y arráncalo:
systemctl
1
systemctl start hostapd
Desde entonces, lo que se conecte a tu wifi con ESSID “Linux” en este caso, irá
a dar a la red que tengas conectada en tu Wifi. En este caso la red de br0, cuyo
otro extremo sería la wifi de etecsa.
Lo mismo puede hacer cambiando el extremo del tunel. Por ejemplo, con eth0
saldría hacia una red cableada. Una manera de meter una WiFi en una red.
Además
De esta misma forma, si tuvieras dos tarjetas wifi, pones una como AP y le pones
la otra como extremo del puente.
OJO
Otra cosa, si tienes corriendo el NetworkManager no podrás echar a andar
hostapd. Páralo, arranca hostapd y vuelve a hechar a andar el
NetworkManager.
La técnica es la técnica y sin técnica, no hay técnica.
Mantener un reloj sincronizado y en hora, siempre ha sido un dilema. Algunas
personas no reconocen la necesidad de esto; y además son tan imbéciles, que
luego se quejan cuando la desfasada fecha de su computadora les impide
conectarse a un sitio SSL.
En los servidores y en las estaciones de trabajo que se respeten; siempre ha
sido una opción usar un cliente NTP. Pero los ntp, cuando la fecha no está en el
día adecuado, no se toman la molestia de sincronizar. En los raspberry-pi eso
puede llegar a ser un tremendo problema, ya que NO tienen reloj de hardware y ni
siquiera conservan la fecha.
El tan criticado Systemd, tiene una
solución para este problema. Sucia y burda, pero muy eficiente. Normalmente, los
“clientes” NTP, son
cliente y servidor. En el caso de systemd-timsyncd, no se tomaron la molestia de
implementar un servidor; solamente un cliente minimalista. Además, guarda las
sincronizaciones en un fichero, para determinar si tu reloj de hardware se
adelante o atraza y contrarrestar dicho efecto.
Lo bueno que tiene es que agarra la fecha y hora de cualquier parte; luego, la
setea sin chistar. La configuración es sencillísima. Localiza el fichero:
/etc/systemd/timesyncd.conf
Declárale un servidor principal y si te da la gana, uno o varios adicionales. A
mi me quedó así:
/etc/systemd/timesyncd.conf
123456789101112131415
# This file is part of systemd.## systemd is free software; you can redistribute it and/or modify it# under the terms of the GNU Lesser General Public License as published by# the Free Software Foundation; either version 2.1 of the License, or# (at your option) any later version.## You can override the directives in this file by creating files in# /etc/systemd/timesyncd.conf.d/*.conf.## See timesyncd.conf(5) for details[Time]NTP=time.hcg.sld.cu
FallbackNTP=time.sld.cu time.microsoft.com
Generalmente, mi laptop está en el calixto, por eso puse mi servidor local como
primario; pero si no lo estuviera, de seguro time.sld.cu sería alcanzable. En
el dificilísimo caso de que estuviera de cara a internet, quizás responda el de
microsoft, que no está malo. Por cierto, los comentarios del fichero son
bastante útiles, vale la pena leerlos.
Por último, lo más importante, habilitar y arrancar el servicio:
systemctl start systemd-timesyncd.service
systemctl enable systemd-timesyncd.service
Para saber el estado del servicio, corre:
timedatectl
Te dirá la hora local y la UTC; te dirá además si está sincronizando por NTP.
Con ese comando puede hacer un montón de operaciones, por ejemplo, setear la
hora civilizadamente, ya que este la pone en el RTC también.
No existe juez más justo, que el pasar del tiempo.
“La que se avecina”, sería una buena manera para describir la revolución de
aparatos con android que habrá en el Calixto García muy pronto. Yo siempre con
el paso al frente y las luz larga (modestia y aparte) estuve pensando que tener
nuestro propio repositorio de aplicaciones para android; sería una buena manera
de mantener a todo el mundo bien actualizado, sobre todo a aquellos que no
tienen acceso a internet.
Para el que no lo conozca, fdroid es una herramienta
cliente para repositorios de android, osea como google market pero libre.
La mecánica es sencilla: Bajo los paquetes con
aptoide, verifico que sean seguros y copio la cache
para el directorio repo/ de fdroid en el servidor con acrosync
En el repo de debian y en AUR, el paquete se llama fdroidserver. La rutina
de instalación ya la conoces.
Creamos el directorio donde meteremos el repo, en mi caso, aquí:
mkdir
1
mkdir -p /srv/http/fdroid/repo
Creamos la configuración de nginx, a mi me quedó así:
Un virtualhost nombrado android. No olvide crear el puntero DNS
Ahora, ve al directorio raíz del repo, OJO A LA RAIZ, NO a donde dice repo/.
fdroid
12
cd /srv/http/fdroid/
fdroid init
Te preguntará por la android-sdk, por lo general, está en /opt/android-sdk,
dale la ruta.
¿¿No tienes la SDK de android?? Ah pues estás muy jodio… En el caso de arch,
el repo de bbqlinux contiene la sdk completa, solo para 64 bits.
Pero volviendo con fdroid:
Ahora debe habérse creado el directorio repo/ dentro del directorio
/srv/http/fdroid y es ahí donde copiarás las APK.
cp /donde/esten/tus/*.apk /srv/http/fdroid/repo/
Pero claro, querrás que tu repo se identifique. El fichero
/srv/http/fdroid/config.py contiene lo que buscas. Por la linea trenta y
pico; a mi me quedó así:
config.py
123456789101112
...repo_url="http://android.hcg.sld.cu"repo_name="Calixto Garcia"repo_icon="calixto_xsm.png"repo_description="""Repositorio de aplicaciones de android del calixto. Intentaremos proveerleaplicaciones debidamente actualizadas. Sientase libre de colaborar, trayendonoslas mas recientes APK."""...
Ah! y sin tildes, si no, python se vuelve loco con el encoding.
Ahora vamos a crear el índice inicial, pero eso mismo comando lo correrás cuando
agregues aplicaciones a tu repo.
fdroid
1
fdroid update --create-metadata
OJO!! Asegúrate de que las APK no tengan un espacio en su nombre; muchísimo
menos un caracter raro. Si todo salió bien debes ver algo como “Generating
metada”.
Con eso terminaste el servidor… Ve a fdroid y ponle la URL del virtualhost
como repo, luego update y listo…
¿Cómo se hace? Facilito. Párate en la primer pantalla, aprieta el botón de menú
del dispositivo y toca donde dice “Gestionar Repositorios” o en inglés, “Manage
Repos”
Desactiva los respos inalcanzables y añade tu repo local. Luego actualiza y
listo, verás las aplicaciones disponibles.
Ya solo te quedaría instalar un rsync que desemboque en el repo y con
acrosync subes la cache de aptotide para el repo, así
como lo estoy haciendo yo ahora.
De siempre, los usuarios que fueron forzados a abandonar
MSAcces por un motivo u otro;
sienten un incontenible necesidad por los “informes”.
A la hora de imprimir, muchos usaurios no entienden que un HTML se imprima.
Incluso, habiéndoles hecho un javascript que muestra el diálogo de impresión,
simplemente lo cierra y me preguntan “¿y ahora que hago con esto?”
En recientes diálogos con un bibliotecario (que hereda la clase Usuario) me dijo
que la gente entiende más de imprimir PDF.
Hacer un PDF me pareció una tare bastante compleja; y lo es, pero
Prawn lo hace de una manera casi
increíble. Para no aburrirte con el cuento, te mostraré como montarlo arriba del
tren.
# el controlador bin ban bin banclassEjemploController<ApplicationControllerdefaccion# la acción, como se llame# a según el sapo, la pedrárespond_todo|format|# tírame el pdfformat.pdfdo# tráeme al animalrequire'prawn'# créame un nuevo documento pdf@pdf=Prawn::Document.new# tírame el banner, el H1 como quien dice, tamaño de fuente 25px en negrita@pdf.formatted_text[{text:'El título del documentos',size:25,styles:[:bold]}]# hazle una rallita horizontal debano al header@pdf.stroke_horizontal_line0,235# mueve el cursor pa abajo@pdf.move_down20# la variable cuerpo contiene un texto laaaaaaargooo en HTML# un HTML muy rudimentario, Prawn lo interpresta, por ejemplo# las cláusulas <strong>@pdf.text@cuerpo,inline_format:true# por jemeplo, itera en el modelo User y escribe sus nombresforuserinUser.all@pdf.text"Nombre: #{user.nombre}",inline_format:true@pdf.move_down10@pdf.text"Edad: #{user.edad}",inline_format:true@pdf.move_down30end# tírala!!!send_data@pdf.render,filename:"solicitud.pdf"end# formatend# respond_toend# defend# class
Vamos a dividir en sílabas:
Línea 7
Rails, la acción responde a múltiples mime-types
Línea 10
Rails, application/pdf responde a la extensión PDF format.pdf do
Línea 13
Carga la librería, sí, ya se que en Rails debes hacer eso en un initializer, de
cualquier manera, aún, luego de haberlo agregado a tu Gemfile, no te olvides de
requerirla, ya sea en un initializer o en el controlador.
Línea 16
Crea un nuevo PDF y almacénalo en la variable de instancia @pdf
Línea 19
El método formatted_text, recibe como argumento un array de hashes
Cada array en un bloque de texto y contiene un hash. La clave :text contiene el
texto a renderizar, :size el tamaño y :style el estilo de fuente.
Línea 22
Trazar línea horizontal, el método stroke_horizontal_line recibe como
argumento, de donde, a donde debe trazar la línea.
Pasemos a la línea 41
El método render devuelve el PDF. Si lo sacas con puts verás el PDF
crudo. Podrías también tirarlo pa un fichero así:
“fulanito.pdf”
1
IO.write'fulanito.pdf',@pdf.render
A los usuarios le encantan los PDF, hazlos feliz ;)
Existen dos tipos de personas, las que hacen lo que le dicen; y, las que dicen lo que hay que hacer.
La fiebre LTSP sigue subiendo en el Calixto. La solución definitiva para toda
máquina que butee por la red, sin importar su cantidad de RAM o micro…
Pero cuando hay más de un servidor con DHCP en la misma red, se forma el rollo.
isc-dhcp no se puede bloquear con iptables
Si tienes alguna duda de la afirmación anterior, has la tarea y busca en google.
De nada vale ponerle un cortafuegos a cada servidor porque isc usa “raw
packets” y se caga en lo que diga iptables. Por suerte de afuera pa dentro eso
no se aplica. No obstante, ojo si pones un isc con múltiples interfaces, no sea
que acabes dándole DHCP al ruter.
En un ambiente como este, no queda otra que hacer un DHCP central con múltiples
parámetros, de forma que los clientes ligeros se agrupen por MAC address y se
seleccione el servidor adecuado a la hora de butear.
El fichero de configuración es /etc/dhcp/dhcpd.conf y bajo la declaración de
la subnet puedes poner una cláusula group para dar parámetros diferentes.
La sintaxis es sencilla:
“ejemplo”
1234567891011121314
subnet { parametros de la red
}group { parametros del grupo
host nombre { parametros del host
}}
Tomemos el caso de dos servidores LTSP en la red, el 10.1.1.6 y el 10.1.1.3, a
mi me quedó así:
# vim:filetype=configauthoritative;# la redsubnet 10.1.1.0 netmask 255.255.255.0 { range 10.1.1.100 10.1.1.254; option domain-name "hcg.sld.cu"; option domain-name-servers 10.1.1.1; option broadcast-address 10.1.1.255; option subnet-mask 255.255.255.0;}# subnet# ganker y su pandilla, la gente de archivos médicosgroup {# clientes ligeros con linux y ltsp option root-path "/opt/ltsp/i386";if substring( option vendor-class-identifier, 0, 9)="PXEClient"{ filename "/ltsp/i386/pxelinux.0";}else{ filename "/ltsp/i386/nbi.img";}# buteen por ganker next-server 10.1.1.3;# los clientes host clganker1 { hardware ethernet 00:1E:90:E1:B4:0A;} host clganker2 { hardware ethernet 00:1E:90:E2:6E:1A;} host clganker3 { hardware ethernet 00:1E:90:E2:75:B6;} host clganker4 { hardware ethernet 00:1E:90:F5:E8:A5;} host clganker5 { hardware ethernet 00:1E:90:F5:E9:88;}}# ganker# atenea y su flotilla, el servidor de la bibliotecagroup {# clientes ligeros con linux y ltsp option root-path "/opt/ltsp/i386";if substring( option vendor-class-identifier, 0, 9)="PXEClient"{ filename "/ltsp/i386/pxelinux.0";}else{ filename "/ltsp/i386/nbi.img";}# buteen por el servidor de la bibliteoca next-server 10.1.1.6;# los clientes host biblioteca1 { hardware ethernet 00:1E:90:E1:B4:0A;} host biblioteca2 { hardware ethernet 00:1E:90:E2:6E:1A;} host biblioteca3 { hardware ethernet 00:1E:90:E2:75:B6;} host biblioteca4 { hardware ethernet 00:1E:90:F5:E8:A5;} host biblioteca5 { hardware ethernet 00:1E:90:F5:E9:88;}}# ganker
¿Qué hicimos? Sencillo, declaramos un grupo con distintos parámetros, aunque en
este caso solo next-server es verdaderamente distinto. En ambos casos se
engatilla el mismo file-name y root-path ya que ambos servidores hay lo
mismo. Pero quizás en su red usted tiene otro servidor bootp o PXE y no querrá
que las opciones de LTSP sean la misma.
Finalmente el parámetro next-server difiere y es que es este el que le da
porque servidor bootear.