Creado por: Arturo Martín Romero / amartinromero@gmail.com
Si lo deseas cambia el Tipo de Transición y/o Plantilla:
Default -
None -
Simple -
Fade y Beige -
Slide y Serif -
Concave y Beige -
Zoom y Serif -
Zoom y Night -
Solarized -
Fade y Sky -
Serif -
Moon
Para el conseguir el máximo aprovechamiento del curso es aconsejable estar familiarizado con algún entorno GNU/Linux
A la hora de personalizar el entorno Gnome Shell podemos empezar por los siguientes aspectos:
Los sistemas GNU/Linux pueden iniciarse en diferentes modos de arranque configurables. En función del modo de arranque podemos iniciar unos servicios u otros [runlevels]
$ runlevel
$ more /etc/init/rc-sysinit.conf | grep 'env DEFAULT_RUNLEVEL'
Mediante el comando update-rc.d podemos decidir que servicios se inician en cada modo de arranque [man update-rc.d]. Otra alternativa es usar sysv-rc-conf
El uso del comando update-rc.d es muy sencillo, aunque puede hacerse manualmente mediante la creación o eliminación de enlaces simbólicos:
# update-rc.d nombre-servicio enable|disable|start|stop|defaults opciones
# update-rc.d apache2 enable|disable 2
# update-rc.d ssh start 20 2 3 4 5 . stop 20 0 1 6 .
# update-rc.d ssh defaults
# update-rc.d -f apache2 remove
# apt-get install sysv-rc-conf
# sysv-rc-conf
Para ver que servicios se inician al arrancar [+] podemos ejecutar el comando service --status-all [man service]
Clasicamente se usaba chkconfig para la gestión de los servicios:
# chkconfig --level niveles nombre-servicio off|on
# chkconfig -l
# chkconfig --list | grep apache2
# chkconfig --level 2345 apache2 off
Ej. “Crea un script que se ejecute al arrancar el equipo de tal forma que audite en un archivo el momento en que se ha iniciado ”
[1] nano /etc/init.d/auditar-arranque
[2] #!/bin/bash
date +"%Y-%m-%d %H:%M Servidor Iniciado" >> /root/auditar-arranque.txt
[3] chmod +x /etc/init.d/auditar-arranque
[4] ln -s /etc/init.d/auditar-arranque /etc/rc2.d/S99auditar-arranque
Ej. “Con la finalidad de completar el ejercicio anterior, mediante la ayuda de la clase PHP phpmailer envía un email al destinatario que tu elijas informando del arranque del servidor”
[1] apt-get install php5
nano /etc/init.d/auditar-arranque
[2] #!/bin/bash
date +"%Y-%m-%d %H:%M Servidor Iniciado" >> /root/auditar-arranque.txt
php /home/arturo/mandar-correo/mandar-correo.php
Para descargarse phpmailer: PHPMailer
El contenido del archivo mandar-correo.php podrá ser el siguiente (lo más básico):
require_once 'phpmailer/class.phpmailer.php';
$comando = "date +'%d-%m-%Y'";
exec ($comando,$fecha);
$comando2 = "date +'Fecha: %A, %d-%m-%Y'";
exec ($comando2,$fecha2);
$mail = new phpmailer();
$mail->Mailer = "smtp";
$mail->Host = "ssl://smtp.gmail.com";
$mail->Port="465";
$mail->SMTPAuth = true;
$mail->Timeout=30;
// Indicamos la cuenta de gmail desde la que se envía el email
$usuario_gmail = "alumnoiestm@gmail.com";
$alias_remitente_email = "Aviso Arranque Servidor - Email ".$fecha[0];
$pass_usuario_gmail = "alumno1234";
$mail->From = $usuario_gmail;
$mail->FromName = $alias_remitente_email;
$mail->Username = $usuario_gmail;
$mail->Password = $pass_usuario_gmail;
$numEmails = 1;
$email = array ("amartinromero@gmail.com");
for ($i=0; $i<$numEmails; $i++){
$mail->AddAddress($email[$i]);
}
// Indicamos el asunto y el cuerpo del mensaje (se puede usar lenguaje HTML)
$asunto = "Aviso Arranque Servidor ".$fecha[0];
$cuerpoMail = "";
$mail->Subject = $asunto;
$mail->Body = $cuerpoMail;
$mail->AltBody = $cuerpoMail;
// Finalmente enviamos el email
echo "Se va a enviar el email con todos los informes adjuntos!!";
$resultado = $mail->Send();
?>
A parte de los servicios iniciados en /etc/rc2.d, podemos personalizar el comportamiento de nuestro equipo al iniciar la sesión gráfica mediante Aplicaciones al Inicio
Actualmente se hace uso de claves asímetricas tanto para la garantizar tres aspectos básicos en las comunicaciones seguras: autenticiad, integridad, confidencialidad y no repudio.
Para asegurar la confidencialidad entre dos usuarios será necesario intercambiarse las claves públicas. Concretamente, si queremos mandar un archivo de manera cifrada a otra persona, y queremos asegurarnos de que sólo lo va a leer esa persona, necesitaremos que esa persona nos haya enviado previamente su clave pública y hayamos hecho uso de ella para el cifrado.
Para consultar solución: Libro Seguridad
Para asegurar la autenticidad, integridad y no repudio entre dos usuarios será necesario intercambiarse las claves públicas. Concretamente, si queremos mandar un archivo firmado a otra persona será necesario firmarlo mediante la clave privada que se tenga, y posteriormente el receptor deberá verificarlo mediante la correspondiente clave pública.
Para consultar solución: Libro Seguridad
Para consultar solución: Libro Seguridad
Para consultar solución: Libro Seguridad
SSH también hace uso de claves asimétricas para la comunicación
apt-get install openssh-server
ssh-keygen
ssh-copy-id -i ~/.ssh/id_rsa.pub arturo@192.168.1.100
Duplicity es una fabulosa herramienta que nos va a permitir crear copias de seguridad incrementales o totales de los archivos que deseemos, permitiendonos simultáneamente cifrar y enviar a un servidor de almacenamiento remoto.
apt-get install software-properties-common python-software-properties
add-apt-repository ppa:duplicity-team/ppa
apt-get update
apt-get install duplicity python-paramiko
apt-cache policy python-paramiko
sudo apt-get install python-pip
pip freeze | grep paramiko (1.10)
sudo pip install paramiko --upgrade
pip freeze | grep paramiko (>1.10)
La realización de backups con duplicity puede hacerse de tipo full o incremental, pudiendose indicar como parámetro en la llamada: ./script-backup.sh full|incremental
#!/bin/bash
export PASSPHRASE="1234"
if duplicity $1 --encrypt-key "E8DAE5E7" --sign-key "E8DAE5E7" \
--include /home/dga/Documentos \
--include /home/dga/Informes \
--include /home/dga/Confidencial \
--exclude '**' \
/home/dga scp://dga@192.168.56.102/curso11 | tee /home/dga/auditoria.log
then
php /home/dga/mandar-correo/mandar-email-exito.php
else
php /home/dga/mandar-correo/mandar-email-error.php
fi
unset PASSPHRASE
Duplicity nos permite verificar si ha habido cambios entre el último backup realizado y el sistema archivos sobre el cuasl se hace el backup:
#!/bin/bash
export PASSPHRASE="1234"
duplicity $1 --encrypt-key "E8DAE5E7" --sign-key "E8DAE5E7" \
verify \
scp://dga@192.168.56.102/curso11 /home/dga | tee /home/dga/auditoria-verify.log
unset PASSPHRASE
Para que la realización de las copias de seguridad se haga de manera desatendida habrá que hacer lo siguiene:
ssh-copy-id -i clave-pública usuario-remoto@equipo-servidor
crontab -e
# min hora diames mes dia-semana [usuario] comando
30 12 * * * /home/dga/script-backup.sh incremental|full
Para restaurar un backup realizado con duplicity existen diferentes alternativas: archivo, directorio o total
export PASSPHRASE="1234"
if duplicity $1 --encrypt-key "E8DAE5E7" --sign-key "E8DAE5E7" \
--file-to-restore Documentos/doc3.txt \
scp://dga@192.168.56.102/curso11 /home/dga/Documentos/doc3.txt
then
php /home/dga/mandar-correo/mandar-email-exito.php
echo "exito ..."
else
php /home/dga/mandar-correo/mandar-email-error.php
echo "error ..."
fi
unset PASSPHRASE
Para restaurar un backup realizado con duplicity existen diferentes alternativas: archivo, directorio o total
export PASSPHRASE="1234"
if duplicity $1 --encrypt-key "E8DAE5E7" --sign-key "E8DAE5E7" \
--file-to-restore Documentos \
scp://dga@192.168.56.102/curso11 /home/dga/Documentos
then
php /home/dga/mandar-correo/mandar-email-exito.php
echo "exito ..."
else
php /home/dga/mandar-correo/mandar-email-error.php
echo "error ..."
fi
unset PASSPHRASE
En el caso de que Duplicity no se ajuste a tus necesidades existen otras alternativas para la realización de copias de seguridad, entre los cuales podrían destacarse dos:
El archivo "/etc/network/interfaces" es consultado por el servicio "networking" para configurar la red (man interfaces)
auto eth0 eth0:1 eth0:2 eth0:3 ... eth1 ...
iface eth0 inet static
address 192.168.124.253
netmask 255.255.255.0
gateway 192.168.124.254
dns-nameservers 8.8.8.8
pre-up | up | post-up script
pre-down | down | post-down script
iface eth0:1 inet static
address 192.168.121.254
netmask 255.255.255.0
pre-up | up | post-up script
pre-down | down | post-down script
iface eth0:2 inet static
address 192.168.120.250
netmask 255.255.255.0
...
Ej. Configura varias direcciones IP por interfaz en alguna de las máquinas virtuales (X será el número de equipo)
Interfaz | IP/Máscara | Gateway | DNS |
---|---|---|---|
eth0 | 192.168.123.100+X/24 | 192.168.123.254 | 8.8.8.8 |
eth0:1 | 172.30.1.X/24 | - | - |
eth0:2 | 172.30.2.X/24 | - | - |
eth1 | 172.30.100.X/24 | - | - |
Mediante la ayuda de los comandos iptables y route podemos crear nuestros propios scripts de configuración de red de manera personalizada:
#!/bin/bash
/etc/init.d/networking stop
ifconfig eth0 down
ifconfig eth0 192.168.1.6
if ping -c 1 192.168.1.1
then
route add default gw 192.168.1.1
else
ifconfig eth0 192.168.123.100
route add default gw 192.168.123.254
fi
ifconfig eth0:alias1 192.168.2.100
ifconfig eth0:alias2 12.0.0.100
ifconfig eth0:alias3 12.0.0.150
ifconfig eth0:alias4 172.30.1.100
ifconfig eth1 ...
echo "nameserver 8.8.8.8" > /etc/resolv.conf
echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -t nat -F
iptables -t nat -A POSTROUTING -j MASQUERADE
iptables -t nat -A PREROUTING -s 192.168.2.0/24 -p tcp --dport 80 \
-j DNAT --to 192.168.2.100:80
...
Para la instalación seguiremos los pasos del capítulo 5 del PDF de los creadores de Migasfree fun-with-migasfree: Probando Migasfree (pag. 29)
echo "deb http://migasfree.org/repo debian7 PKGS" > /etc/apt/sources.list.d/migasfree.list
apt-get update
apt-get install python-django=1.6.11-1
apt-mark hold python-django
apt-get install migasfree-server
Tras lo anterior ya podremos probar a entrar en migasfree escribiendo http://ip_servidor, y accediendo como admin:admin
Para la instalación seguiremos los pasos del capítulo 5 del PDF de los creadores de Migasfree fun-with-migasfree: Probando Migasfree (pag. 29)
echo "deb http://migasfree.org/repo Ubuntu14 PKGS" > /etc/apt/sources.list.d/migasfree.list
apt-get update
apt-get install migasfree-client
nano /etc/migasfree.conf
migasfree -u
Tras lo anterior ya tendremos un cliente de Escritorio registrado en migasfree y un cliente Servidor (si lo hemos hecho en el servidor también). Ahora ya podremos empezar a controlar el software de los clientes migasfree desde el servidor migasfree.
En el caso de que uno de los clientes migasfree sea un servidor, lo más conveniente es que se actualice periodicamente contra migasfree haciendo uso del automatizador de tareas crontab:
# nano /etc/cron.d/migasfree
00 07 * * * root su -c 'migasfree --update' --login
La filosofía de Migasfree consiste en crear paquetes y desplegar estos para provocar modificaciones en el software de los equipos. Para crear un paquete DEB deberemos tener en cuenta una serie de custiones previas: estrutura del paquete, ficheros necesarios, etc. Para crear un paquete será necesario instalar el siguiente software:
sudo apt-get install debhelper devscripts
/usr/bin/debuild --no-tgz-check -us -uc
¡¡Importante!! Para consultar dudas o errores de debhelper visitar la siguiente página: debhelper.
Ej. “Crea un paquete llamado curso-paquete1 que configure dentro de /etc/hosts una asociación nombre -> ip (server -> 172.30.1.220) y despliegue unos archivos sobre el sistema de archivos:
/usr/share/curso-linux/practica1/practica1.txt
/usr/share/curso-linux/practica2/practica2.txt
Para ello haz uso de los paquetes de ejemplo que hay en los materiales del curso, y modifica los archivos necesarios. Después desplegalo mediante migasfree ”. Solución: curso-paquete1.zip
[1] nano ./debian/changelog -> versión del paquete y descripción de cambios
[2] nano ./debian/control -> definición de dependencias y descripción del paquete
[3] nano ./debian/copyright -> tipo de licencia
[4] nano ./debian/install -> directorios a desplegar
[5] nano ./debian/postinst -> script que se ejecuta tras la instalación del paquete
[6] nano ./debian/prerm -> script que se ejecuta previo a la eliminación del paquete
[7] nano ./debian/rules -> reglas a tener en cuenta en el momento de crear el paquete con debhelper
Ej. “Crea un paquete llamado curso-paquete1 que configure dentro de /etc/hosts una asociación nombre -> ip (server -> 172.30.1.220) y despliegue unos archivos sobre el sistema de archivos:
/usr/share/curso-linux/practica1/practica1.txt
/usr/share/curso-linux/practica2/practica2.txt”
# nano changelog
curso-paquete1 (1.0-1) unstable; urgency=low * Información de cambios en el paquete -- Arturo MartínFri, 02 Oct 2015 6:55:06 +0200
Ej. “Crea un paquete llamado curso-paquete1 ...”
# nano control
Source: curso-paquete1 Section: utils Priority: extra Maintainer: Arturo MartínBuild-Depends: debhelper (>= 8.0.0) Standards-Version: 3.9.3 Homepage: http://wiki.migasfree.educa.aragon.es Package: curso-paquete1 Architecture: all Pre-Depends: migasfree-client (>=4.5), sudo Depends: ${misc:Depends}, python, python-gi Description: Descripción del paquete paquete-curso-ejemplo Descripción más extensa del paquete paquete-curso-ejemplo
Ej. “Crea un paquete llamado curso-paquete1 ...”
# nano copyright
Format: http://dep.debian.net/deps/dep5 Upstream-Name: curso-paquete1 Files: * debian/* Copyright: 2015 Arturo MartínLicense: GPL-3.0+ License: GPL-3.0+ This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. ...
Ej. “Crea un paquete llamado curso-paquete1 ...”
# nano install
usr/*
Ej. “Crea un paquete llamado curso-paquete1 ...”
# nano postinst
#!/bin/sh # postinst script for curso-paquete1 set -e case "$1" in configure) echo "server 172.30.1.220" >> /etc/hosts ;; abort-upgrade|abort-remove|abort-deconfigure) ;; *) echo "postinst called with unknown argument \`$1'" >&2 exit 1 ;; esac exit 0
Ej. “Crea un paquete llamado curso-paquete1 ...”
# nano prerm
#!/bin/sh # prerm script for paquete-curso-ejemplo set -e case "$1" in remove) sed -i "s/server 172.30.1.220//g" /etc/hosts ;; upgrade|deconfigure) ;; failed-upgrade) ;; *) echo "prerm called with unknown argument \`$1'" >&2 exit 1 ;; esac exit 0
# apt-get install debhelper devscripts
// Ejecutamos el siguiente comando dentro del directorio que contiene
// la estructura del paquete
$ /usr/bin/debuild --no-tgz-check -us -uc
$ nano ~/.bash_aliases
alias crear-paquete='/usr/bin/debuild --no-tgz-check -us -uc'
// Ejecutamos el siguiente comando dentro del directorio que contiene
// la estructura del paquete
$ crear-paquete
¡¡Importante!! Consultar ante dudas o errores de debhelper deberemos consultar el siguiente enlace: ¡¡debhelper!!
# dpkg -i paquete.deb
# apt-get install -f
# gdebi paquete.deb
// A través de migasfree habiéndo subido el paquete: migasfree-upload -f paquete.deb
// y asignandolo al equipo en cuestión a través de un repositorio
// Después:
# migasfree -u
Para facilitar la subida de paquetes a migasfree:
# nano /etc/migasfree.conf
[client]
Server = IPSERVER
Version = VERSION
[packager]
User = admin
Password = admin
Version = VERSION
Store = base
sudo migasfree-upload -f paquete.deb -s base -m VERSION -u admin -p admin
sudo migasfree-upload -f paquete.deb
Ej. “Crea un paquete y distribuyelo mediante Migasfree a los equipos desktop de tal forma que configure los Action Scripts de tal forma que nos permita manejar archivos PDFs. Para ello simplemente sigue el paquete que ya esta hecho y esta disponible en la carpeta de materiales del curso ”
Ej. “Crea un paquete y distribuyelo mediante Migasfree a los equipos desktop de tal forma que configure los Action Scripts de tal forma que nos permita manejar archivos PDFs. Para ello simplemente sigue el paquete que ya esta hecho y esta disponible en la carpeta de materiales del curso ”
Para las ventanas que se abren con la aplicación necesitamos YAD:
sudo add-apt-repository -y ppa:webupd8team/y-ppa-manager
sudo apt-get update && sudo apt-get -y install yad
Ej. “Crea un paquete y distribuyelo mediante Migasfree para que configure una página de inicio para acceso a determinados directorios de Descarga ”
mkdir -p usr/share/miswebs/alias/software-pdi
mkdir -p usr/share/miswebs/alias/software-alumnos
cd usr/share/miswebs/alias/software-pdi
touch pdi1.deb pdi2.deb pdi3.deb
cd usr/share/miswebs/alias/software-alumnos
touch doc1.pdf doc2.pdf
mkdir -p usr/share/miswebs/web1
nano usr/share/miswebs/web1/index.html
Ej. “Crea un paquete ,,, ”
mkdir -p etc/apache2/sites-available && nano etc/apache2/sites-available/misitio.conf
NameVirtualHost 192.168.56.101
<VirtualHost *:80>
DocumentRoot /var/www/html/web1
Servername www.misitioweb.es
Alias /alias1 /var/www/software-pdi
<Directory /var/www/software-pdi>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
Alias /alias2 /var/www/software-alumnos
<Directory /var/www/software-alumnos>
Options ...
</Directory>
</VirtualHost>
a2ensite misitio && /etc/init.d/apache2 reload
Ej. “Crea un paquete y distribuyelo mediante Migasfree para que configure una página de inicio para acceso a determinados directorios de Descarga ”
mkdir -p usr/share/miswebs/web1 && nano usr/share/miswebs/web1/index.html
DOCUMENTACION ACCESIBLE VIA WEB
Enlace 1: Enlazar
Enlace 2: Enlazar
Ej. “Crea un paquete ... ”
nano debian/postinst
if ! test -d /var/www/html ; then mkdir -p /var/www/html ; fi
if ! test -d /var/www/html/web1 ; then
if test -d /usr/share/miswebs/web1 ; then
rsync -rhv /usr/share/miswebs/web1 /var/www/html
fi
fi
if ! test -d /var/www/software-pdi ; then
if test -d /usr/share/miswebs/alias/software-pdi ; then
rsync -rhv /usr/share/miswebs/alias/software-pdi /var/www
fi
fi
if ! test -d /var/www/software-alumnos ; then
if test -d /usr/share/miswebs/alias/software-alumnos ; then
rsync -rhv /usr/share/miswebs/alias/software-alumnos /var/www
fi
fi
chown -R www-data.www-data /var/www
if test -f /etc/apache2/sites-available/misitio.conf ; then
a2ensite misitio
fi
echo "Ahora reiniciaremos Apache ..."
/etc/init.d/apache2 reload
Ej. “Crea un paquete ... ”
nano debian/prerm
if test -d /var/www/html/web1 ; then
rm -Rf /var/www/html/web1
fi
if test -d /var/www/software-pdi ; then
rm -Rf /var/www/software-pdi
fi
if test -d /var/www/software-alumnos ; then
rm -Rf /var/www/software-alumnos
fi
a2dissite misitio
/etc/init.d/apache2 reload
crear-paquete
migasfree-upload -f curso-paquete-apache.deb
http://localhost:631/
lpadmin -p Canon-2270 -E -v socket://IP-Impresora -P /destino/Canon-2270.ppd
lpadmin -d Canon-2270
Ej. “Crea una falla que configure un para de modelos de impresoras en red haciendo uso de archivos PPD: (1) Canon ImageRunner 2270 con IP 172.30.1.247 y (2) Konica Minolta Bizhub C450 con IP 172.30.1.248, dejando la primera de ellas como predenterminada. Para ello deberás obtener previamente los PPDs de las impresoras y dejarlos accesibles a través del servicio Web Apache del propio Migasfree mediante un alias llamado /ppds ”
cd /destino
if wget http://servidor/ppds/Canon-2270.ppd &> /dev/null
then
if lpadmin -p Canon-2270 -E -v socket://IP-Impresora -P /destino/Canon-2270.ppd
then
lpadmin -d Canon-2270
fi
fi
...
$ sed -e '1,10d' /etc/squid3/squid.conf | more
$ sed -e '/^#/d' /etc/squid3/squid.conf | more
$ more /etc/samba/smb.conf | sed -e '/^#/d' -e '/^;/d' -e '/^$/d'
$ more /etc/samba/smb.conf | sed -n -e '/^[^#;]/p'
$ sed -e 's/cadena_a_sustituir/cadena_nueva/' archivo.dat (-e = --expression)
$ cat archivo.dat | sed -e 's/cadena_a_sustituir/cadena_nueva/' (primera coincidencia)
$ cat archivo.dat | sed -e 's/cadena_a_sustituir/cadena_nueva/g' (g: global)
$ cat archivo.dat | sed -e '5,8s/cadena_a_sustituir/cadena_nueva/g'
$ cat /etc/passwd | sed -e 's:/bin/sh:shell-valida:g' | grep shell-valida
$ cat archivo.dat | tail -1 | sed -e 's/[a-z]*/mi_sustitucion/g'
$ sed -e 's/<[^>]*>//g' archivo.html
$ sed -e 's/.*/FALSE:&/' /etc/passwd | cut -d":" -f1,2 | tr -s ":" " "
$ more /etc/passwd | \
cut -d":" -f1,6,7 | \
sed -e 's/\(.*\):\(.*\):\(.*\)/Nombre: \1 \nSu Home es: \2 \ncon Shell: \3\n/'
Entre las opciones de éste útil comando destacar [netstat (network statistics)]:
# netstat -a
# netstat -l -u -p -n
# netstat -r (route -n)
Pensado para el ánalisis del tráfico de red desde la consola [tcpdump]:
# tcpdump udp and dst port 53
# tcpdump dst port 22
# tcpdump tcp and \(port 80 or port 443\)
# tcpdump ip proto \\icmp
Nos permite actualizar la hora del sistema a través de un servidor NTP [ntpdate]:
# ntpdate 2.es.pool.ntp.org
Para esta presentación se ha hecho uso del framework "reveal.js", mediante la ayuda del editor "Brackets" y la personalización de una extensión del mismo para las diapositivas.