- Alfresco (5)
- bbdd (4)
- Chisteradas (6)
- Curiosidades (16)
- General (83)
- Java (5)
- JavaScript (1)
- JBoss (4)
- Linux (37)
- MacOS X (4)
- Monitorización (2)
- PHP (4)
- Sobre el autor (2)
- Sobre el autor (8)
- SysAdmin (45)
- Uncategorized (23)
- vmware (1)
- Webmaster (12)
Entradas del mes November, 2007
Cargando...
Duplicity nos permite realizar backups de nuestros directorios produciendo un fichero encriptado en formato tar y subiendo este a un servidor de ficheros local o remoto.
He seguido unos pasos de una guía que vi de no se donde para montar este programa que está de puta madre, he hecho un par de cosillas con él y ahora lo tengo puesto en el cron para que haga las copias incrementales de mis máquinas.
Os recomiendo su uso, aquí os pongo lo hecho.
Para instalarlo:
# aptitude install duplicityEste programa es como el rsync, pero lo bueno que tiene es que no tenemos ningún fichero de configuración
Otras caracteristicas:
* backup incremental
* usa librsync para realizar backup de solo lo que es necesario (uso eficiente del ancho de banda)
* permite acceso remoto como scp
* no es necesario instalar duplicity en la maquina remota, basta con un servidor scp)
* encriptacion GPG y firma para proteger los datos salvados
Para usarlo, simplemente ejecuta algo como:
duplicity datos scp://manuel@server/copiasrealiza un backup del directorio “datos” en un servidor remoto scp (server) al
que te conectas como el usuario “manuel” y dejando el backup en la carpeta /copias
Para un backup local:
duplicity datos file:///var/backup/datosEl directorio destino debe existir, duplicity no lo crea. Si no tienes planeado emplear encriptación GPG, asegurate de añadir –no-encryption en la linea de comandos:
# duplicity --no-encryption /home/jose/Desktop/SQLITE file:///home/jose/Desktop/BACKUP01
No signatures found, switching to full backup.
————–[ Backup Statistics ]————–
StartTime 1191147865.88 (Sun Sep 30 12:24:25 2007)
EndTime 1191147866.67 (Sun Sep 30 12:24:26 2007)
ElapsedTime 0.79 (0.79 seconds)
SourceFiles 14
SourceFileSize 2564610 (2.45 MB)
NewFiles 14
NewFileSize 2564610 (2.45 MB)
DeletedFiles 0
ChangedFiles 0
ChangedFileSize 0 (0 bytes)
ChangedDeltaSize 0 (0 bytes)
DeltaEntries 14
RawDeltaSize 2552322 (2.43 MB)
TotalDestinationSizeChange 2375997 (2.27 MB)
Errors 0
————————————————-
Algunos ejemplos que saco de la documentación:
duplicity /home/me scp://uname@other.host//usr/backupduplicity --full --exclude /tmp /home/me scp://uname@other.host//usr/backupFTP_PASSWORD=mypassword duplicity /home/me ftp://uname@other.host/ftp_dirduplicity scp://uid@other.host//usr/backup restored_dirHe encontrado un tema muy interesante realizado por Nestor os pongo aquí su trabajo.
Vamos a configurar un servidor de archivos o FTP, para permitir a usuarios transferir archivos desde y hacia nuestro server. En este caso elegimos ProFTPd, el cual es uno de los más usados actualmente, ya que es muy escalable y flexible; además de que permite integrarse con varios servicios, entre ellos Mysql, que es la base de datos que amos a usar en este caso para configurar para manejar todo lo relacionado con autentificación de usuarios, manejo de recursos y asignación de quotas de espacio en disco.
FTP viene de File Transfer Protocol, que es el protocolo que maneja la transferencia de archivos y todo lo relacionado con esto por defecto, trabaja utilizando los puertos 21 y 20 para datos y control respectivamente. Y tiene 2 modos de funcionamiento, como FTP Pasivo o Activo:
Bien, vamos por parte, en este caso utilizaremos Debian Etch Stable 4.1 para hacer la configuración, en este caso como nosotros teniamos instalada una base de datos Mysql decidimos aprovecharla para manejar la gestión de usuarios y no usar otro método de autentificación (existen varios), asi que primero instalamos los paquetes básicos:
apt-get install mysql-server mysql-client proftpd proftpd-mysql
Se nos van a preguntar un par de opciones de configuración de los servicios, en una parte se nos va a preguntar como queremos correr ProFTPd desde inet, y elegimos en modo Stand Alone.
Una vez hecho esto, verificamos que mysql esté escuchando en el puerto tcp 2713 y únicamente para conexiones locales, esto lo podemos hacer con el comando netstat.
Ahora para el manejo de permisos de los archivos del filesystem, vamos a crear un usuario y un grupo para que se mapeen los permisos a los directorios y archivos que vamos a utilizar para transferencia en el equipo.
groupadd -d 2001 ftpgroup
useradd -u 2001 -s /bin/false -d /bin/null -c “Usuario para el manejo de ProFTPd” -g ftpgroup ftpuser
Simplemente creamos un gropo y un usuario perteneciente al mismo, sin shell y son el GID y UID 2001.
Ahora vamos a crear la base de datos para el uso del FTP, en MySql, nos logueamos como root:
mysql -u root -p
Y creamos la instancia de la base de datos y establecemos los permisos para manejarla:
create database ftp;
GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO ‘proftpd’@'localhost’ IDENTIFIED BY ‘password’;
GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO ‘proftpd’@'localhost.localdomain’ IDENTIFIED BY ‘password’;
FLUSH PRIVILEGES;
Esto crea la base, le da permisos a un usuario local para accederla y aplica los privilegios. Debemos campiar ‘password’ por la contraseña que elijamos para esto.
Ahora vamos a trabajar con esa base de datos, creando las tablas necesarias para su uso:
USE ftp;
Y creamos las tablas necesarias:
CREATE TABLE ftpgroup (
groupname varchar(16) NOT NULL default ”,
gid smallint(6) NOT NULL default ‘5500′,
members varchar(16) NOT NULL default ”,
KEY groupname (groupname)
) TYPE=MyISAM COMMENT=’ProFTP group table’;
CREATE TABLE ftpquotalimits (
name varchar(30) default NULL,
quota_type enum(’user’,'group’,'class’,'all’) NOT NULL default ‘user’,
per_session enum(’false’,'true’) NOT NULL default ‘false’,
limit_type enum(’soft’,'hard’) NOT NULL default ’soft’,
bytes_in_avail int(10) unsigned NOT NULL default ‘0′,
bytes_out_avail int(10) unsigned NOT NULL default ‘0′,
bytes_xfer_avail int(10) unsigned NOT NULL default ‘0′,
files_in_avail int(10) unsigned NOT NULL default ‘0′,
files_out_avail int(10) unsigned NOT NULL default ‘0′,
files_xfer_avail int(10) unsigned NOT NULL default ‘0′
) TYPE=MyISAM;
CREATE TABLE ftpquotatallies (
name varchar(30) NOT NULL default ”,
quota_type enum(’user’,'group’,'class’,'all’) NOT NULL default ‘user’,
bytes_in_used int(10) unsigned NOT NULL default ‘0′,
bytes_out_used int(10) unsigned NOT NULL default ‘0′,
bytes_xfer_used int(10) unsigned NOT NULL default ‘0′,
files_in_used int(10) unsigned NOT NULL default ‘0′,
files_out_used int(10) unsigned NOT NULL default ‘0′,
files_xfer_used int(10) unsigned NOT NULL default ‘0′
) TYPE=MyISAM;
CREATE TABLE ftpuser (
id int(10) unsigned NOT NULL auto_increment,
userid varchar(32) NOT NULL default ”,
passwd varchar(32) NOT NULL default ”,
uid smallint(6) NOT NULL default ‘5500′,
gid smallint(6) NOT NULL default ‘5500′,
homedir varchar(255) NOT NULL default ”,
shell varchar(16) NOT NULL default ‘/sbin/nologin’,
count int(11) NOT NULL default ‘0′,
accessed datetime NOT NULL default ‘0000-00-00 00:00:00′,
modified datetime NOT NULL default ‘0000-00-00 00:00:00′,
PRIMARY KEY (id),
UNIQUE KEY userid (userid)
) TYPE=MyISAM COMMENT=’ProFTP user table’;
Y salimos de Mysql:
quit;
Ahora vamos a configurar proftpd para que se maneje con MySQL, editamos el archivo /etc/proftpd/proftpd.conf
Cambiamos la línea UseIpv6 a off, para que no utilice este protocolo, solo utilizaremos Ipv4. Y agregamos la siguientes líneas al final del archivo:
[...] DefaultRoot ~ # The passwords in MySQL are encrypted using CRYPT SQLAuthTypes Plaintext Crypt SQLAuthenticate users groups # used to connect to the database # databasename@host database_user user_password SQLConnectInfo ftp@localhost proftpd password # Here we tell ProFTPd the names of the database columns in the "usertable" # we want it to interact with. Match the names with those in the db SQLUserInfo ftpuser userid passwd uid gid homedir shell # Here we tell ProFTPd the names of the database columns in the "grouptable" # we want it to interact with. Again the names match with those in the db SQLGroupInfo ftpgroup groupname gid members # set min UID and GID - otherwise these are 999 each SQLMinID 500 # create a user's home directory on demand if it doesn't exist SQLHomedirOnDemand on # Update count every time user logs in SQLLog PASS updatecount SQLNamedQuery updatecount UPDATE "count=count+1, accessed=now() WHERE userid='%u'" ftpuser # Update modified everytime user uploads or deletes a file SQLLog STOR,DELE modified SQLNamedQuery modified UPDATE "modified=now() WHERE userid='%u'" ftpuser # User quotas # =========== QuotaEngine on QuotaDirectoryTally on QuotaDisplayUnits Mb QuotaShowQuotas on SQLNamedQuery get-quota-limit SELECT "name, quota_type, per_session, limit_type, bytes_in_avail, bytes_out_avail, bytes_xfer_avail, files_in_avail, files_out_avail, files_xfer_avail FROM ftpquotalimits WHERE name = '%{0}' AND quota_type = '%{1}'" SQLNamedQuery get-quota-tally SELECT "name, quota_type, bytes_in_used, bytes_out_used, bytes_xfer_used, files_in_used, files_out_used, files_xfer_used FROM ftpquotatallies WHERE name = '%{0}' AND quota_type = '%{1}'" SQLNamedQuery update-quota-tally UPDATE "bytes_in_used = bytes_in_used + %{0}, bytes_out_used = bytes_out_used + %{1}, bytes_xfer_used = bytes_xfer_used + %{2}, files_in_used = files_in_used + %{3}, files_out_used = files_out_used + %{4}, files_xfer_used = files_xfer_used + %{5} WHERE name = '%{6}' AND quota_type = '%{7}'" ftpquotatallies SQLNamedQuery insert-quota-tally INSERT "%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}" ftpquotatallies QuotaLimitTable sql:/get-quota-limit QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally RootLogin off RequireValidShell off [...]Simplemente le estamos diciendo que vamos a usar las tablas de la base de datos para manejo de usuarios, autentificación de los mismos y manejo de cuotas, debemos cambiar el password del usuario en esta configuración por el que ya utilizamos cuando creamos la base de datos en Mysql y asignamos permisos.
Ahora simplemente editamos el archivo /etc/proftpd/modules.conf
Y comentamos la línea LoadModule mod_sql_postgres.c (ponemos un caracter ‘#’ al principio). De esta forma solamente decimos que use el módulo de mysql para conectarse a la base de datos.
Bien simplemente ahora queda llenar las tablas de la base con los valores por defecto y crear un usuario de prueba, para esto volvemos a entrar a MySql, entramos a la base de datos de ftp y ejecutamos el siguiente query:
INSERT INTO `ftpgroup` (`groupname`, `gid`, `members`) VALUES (’ftpgroup’, 2001, ‘ftpuser’);
INSERT INTO `ftpquotalimits` (`name`, `quota_type`, `per_session`,
`limit_type`, `bytes_in_avail`, `bytes_out_avail`, `bytes_xfer_avail`,
`files_in_avail`, `files_out_avail`, `files_xfer_avail`) VALUES
(’exampleuser’, ‘user’, ‘true’, ‘hard’, 15728640, 0, 0, 0, 0, 0);
INSERT INTO `ftpuser` (`id`, `userid`, `passwd`, `uid`, `gid`,
`homedir`, `shell`, `count`, `accessed`, `modified`) VALUES (1,
‘exampleuser’, ’secret’, 2001, 2001, ‘/home/www.example.com’,
‘/sbin/nologin’, 0, ”, ”);
Y salimos, esto lo que hace fue asociar el usuario ftp al grupo, y crear un usuario de prueba (exampleuser en este caso, con un directorio de trabajo en /home/www.example.com).
Y listo, ya tenemos todo configurado.
Ahora para añadir usuarios y quotas vamos a ver como son las estructuras de las tablas:
userid: el nombre de usuario FTP
password: la contraseña del usuario
uid: el USER ID del usuario (debería ser 2001 que fue el que usamos cuando creamos el usuario)
gid: el GROUP IP del usuario (también debería ser 2001 en este caso)
homedir: el directorio de trabajo donde el usuario gestionará los archivos.
Para el manejo de esto quizás es conviente que instalen PhpMyAdmin o alguna herramienta para administrar MySQL via web por ejemplo, a mi me ayudó bastante. Bueno espero les haya servido.
Referencias:
http://www.howtoforge.com/proftpd_mysql_virtual_hosting_debian_etch
Pongo un video muy interesante, es indispensable no dejar una consola con el usuario root logado porque puede llegar el “simpatico de turno” y hacer esto.
Soy un desastre para las contraseñas, sobre todo si no las uso mucho o son muy largas, era cuestión de tiempo perder la de la base de datos.
Bien pues hay un modo muy sencillo con el que podemos recuperarla en un minuto.
Hagamos lo siguiente:
Creamos un fichero de texto y dentro meteremos la siguiente línea
echo “SET PASSWORD FOR ‘root’@'localhost’ = PASSWORD(’MyNewPassword’);” > /basura/init.my
Paramos la base de datos con:
# /etc/init.d/mysql stopEjecutamos el comando de mysql que recupera la clave (la base de datos debe estar parada previmente):
mysqld_safe –init-file=/basura/init.myUna vez ejecutado, tan solo queda arrancar, y listo.
Estos dos scripts son muy importantes para administradores que trabajan normalmente con servidores de correo, auque también se puede usar para otras cosas.
Primero creamos un fichero con todos los usuarios:
Manuel
Carlos
Jose
Pedro
Paco
Guardar el fichero con todos los nombres que tengamos que usar (yo he puesto a mis compañeros jejeje), y creamos un script con el siguiente contenido:
#!/bin/sh
for i in `more lista_usuarios `
do
echo $i
adduser $i
done
Ahora un chmod 755 lista_usuarios.
Ya podemos lanzar el script con ./generar_usuarios
Ahora tenemos el problema de los passwords, tenemos que hacer de modo automático que todos los usuarios tengan un password que luego ellos mismos cambiarán cuando accedan, para ello vamos a usar un script como el siguiente:
#!/bin/sh
for i in `more lista_usuarios `
do
echo $i
echo $i”123″ | passwd –-stdin “$i”
done
echo “Terminado !!”
Guardar, ejecutar y listo.
Si queremos que cuando el pc arranque haga directamente un chequeo o simplemente queremos que lo haga cada menos veces, porque sea un sistema crítico, pues podemos modificar el número de veces que se ha de montar el sistema para que lo haga así:
tune2fs -c <número de veces> /dev/partición
He leido una guía interesantísima de un usuario de linux llamado Federíco. En esta guía podemos ver como se maneja el hardware desde el sistema operativo. Es realmente útil para poder comprender el funcionamiento de nuestros sistemas.
Aquí os pongo el enlace para que todos le echeis un vistazo. No tiene desperdicio. Yo adjunto aquí la parte que más me ha interesado.
Udev - Hotplug
Ahora bien, los programas de usuario final no acceden directamente a los dispositivos en /sys. Aquí es donde entra Udev. Udev es el encargado de crear los dispositivos en el tradicional directorio /dev. Por ejemplo /dev/hda para un disco duro IDE. Anteriormente al kernel 2.6 el manejo de dispositivos en este directorio era muy complicado. Había que crear un nodo de para todo dispositivo posible, por eso /dev llegaba a tener miles de entradas. Con Udev este problema se soluciona, ya que se encarga de leer la información de /sys y crear un nodo para cada dispositivo conectado.
Básicamente las funciones de Udev se dividen en:
Creación de dispositivos y nombrado
Udev dispone de reglas de nombrado y renombrado de dispositivo bajo /dev. De manera que al conectarse un dispositivo Udev puede seguir reglas personalizables para dar un nombre específico a cada dispositivo. Así por ejemplo si el kernel indica que se ha conectado una unidad grabadora de cd’s, el dispositivo se puede crear como /dev/cdrw y no necesariamente, por ejemplo /dev/hdc. Además Udev puede gestionar nombres de manera estática. Por ejemplo las reglas de Udev permiten que los nombres de las interfaces de red se mantengan después de reiniciar el equipo aunque se quite una interfaz de red. Algo que no pasaba en sistemas anteriores en los que las interfaces de red se confundían si se quitaban placas, etc. No solo eso, sino que otra funcionalidad de Udev permite crear links simbólicos para los nombres de las unidades. Por ejemplo el nodo para un reproductor ipod puede ser creado como /dev/sda1, pero además se le puede crear un link simbólico con un nombre más representativo como /dev/ipod1. Incluso en base al número de serie del dispositivo las reglas pueden indicar que se reserve ese nombre solamente para ese dispositivo. Por último Udev también gestiona los permisos y el propietario con los que debe crearse el dispositivo.
Carga de módulos.
Esta función en realidad la hace Hotplug; sin embargo desde la versión 0.59 de Udev, Hotplug se integró dentro de Udev. También en base a reglas cada vez que un dispositivo es encontrado o conectado, Udev-Hotplug lee la información que el kernel entrega en /sys y determina el modelo del dispositivo, y en base a ello carga el módulo o driver apropiado en el kernel, para que este último pueda acceder al dispositivo.
Ejecución de programas
Por último Udev-Hotplug puede ejecutar programas específicos al detectarse o conectarse un dispositivo. Algunos programas son lanzados para configurar el hardware, actualizar el firmware del dispositivo, etc. No todos los dispositivos necesitan que se ejecute un programa para que funcionen, solo los que cumplen con las reglas que maneja Udev-Hotplug y que por supuesto son personalizables.
Para tener un mayor control de nuestra red, ahora podemos añadir en un fichero de configuración una relación entre mac y nombre de interfaz. Esto puede solucionar todo tipo de problemas a quien a veces se le cambian las interfaces de nombre cuando reinicia la máquina (hay algunos casos).
Hay dos soluciones:
Primera solución:
El comando ifrename para por darles un nombre más descriptivo:
ifrename -i eth1 -n wlan0
(Se pierde con cada reinicio del sistema)
Segunda solución:
Hay un fichero, el /etc/iftab del estilo del /etc/fstab con un modo de configuración así de sencillo,
eth0 mac XX:XX:XX:XX:XX:XX
wlan0 mac YY:YY:YY:YY:YY:YY
Con este fichero obligamos a un interface según su mac a un nombre concreto.
Todos tenemos alguna chorrada montada como por ejemplo este blog, un foro o algo del estilo y seguro que también os han entrado robots y se han dado de alta automáticamente. Si usais una verificación mediante captcha no habrá esos problemas, pero los captcha son un poco feos para mi gusto y voy a poner aquí una chisterada para que se eviten esos robots.
En el formulario de alta podemos poner un campo para poder ser rellenado por el usuario, pero este campo lo vamos a poner oculto y lo llamaremos control. Si llega un usuario a darse de alta, como es lógico al estar oculto no puede verlo y no lo rellenará, pero si por un casual se rellena, ya sabremos que no se trata de un usuario y sí de un robot; ahora solo tenemos que denegar a este bicho que quiere colarse en nuestro lugar.
Chisterada comentada por F. Ayllón.
Imagino que a los que tengáis blogs, o webs en general os habrá pasado que al mirar los logs, una parte nada despreciable del ancho de banda consumido por el servidor web corresponde al “robo de imágenes” o hotlinking por parte de otras web donde insertan un “
” con un link a una de nuestras imagenes.
Últimamente me pasa con foros y sobre todo, con eBay. Gente que vende un Mac de segunda mano, por poner un ejemplo real, imagino que buscando imagenes en google, encuentra una foto de algún post que he hecho y la inserta directamente.
Para solucionar esto, podemos usar mod_rewrite de Apache.
Creamos un un archivo .htaccess en el directorio con las imágenes que nos interese evitar hotlinking con el siguiente contenido:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} .*jpg$|.*gif$|.*png$ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !gra2.com [NC]
RewriteCond %{HTTP_REFERER} !www.gra2.com [NC]
RewriteCond %{HTTP_REFERER} !newton.gra2.com [NC]
RewriteCond %{HTTP_REFERER} !www.uptimed.com [NC]
RewriteCond %{HTTP_REFERER} !uptimed.com [NC]
RewriteCond %{HTTP_REFERER} !google. [NC]
RewriteCond %{HTTP_REFERER} !search?q=cache [NC]
RewriteRule (.*) /forbidden.jpg
En REQUEST_FILENAME indicamos las extensiones de imágenes (u otro tipo de archivos) que nos interese proteger.
Con las condiciones de HTTP_REFERER, en este caso, bloqueamos el acceso a las extensiones indicadas a no ser que el dominio donde está enlazada la imagen sea uno de los nuestros, o por ejemplo, Google o su caché.
Por último, con RewriteRule, los redireccionamos a un archivo en nuestro servidor que nos interese (puede ser otra imagen, donde podemos indicar que no se permite hacer hotlinking, un archivo vacío, etcétera.) By daniel.