viernes, 30 de enero de 2009

Histórico de comandos en linux ( Shell logging )

La lista de comandos que memoriza linux hace que sea más fácil recuperar hasta más de 500 comandos del archivo de historico (~/.bash_history).
Cada usuario que tiene una cuenta en el sistema contiene este archivo, donde se almacenan no solo comandos, sino por ejemplo una contraseña fallida, estos datos permanecen en .bash_history durante bastante tiempo.

Es posible ajustar la dimensión del archivo para todos los usuarios del sistema modificando el parámetro HISTSIZE del archivos de configuración situado en (/etc/profile), es recomendable un máximo de 10 comandos.

[nexus7@nexus7 ~]$ vim /etc/profile

HISTSIZE=500

modificar a

HISTSIZE=10

De esta forma cualquier curioso solo podrá hurgar en un histórico de 10 comandos, reduciendo el riesgo de contraseñas mal introducidas.

También y como otra medida de seguridad es posible que ese histórico se elimine cada vez que salimos del sistema, así nadie podrá visualizar el histórico de un usuario que esta desconectado del sistema.

HISTFILESIZE=0

jueves, 29 de enero de 2009

Crear alias en Linux

Con tanto comando, los alias nos hacen la vida más fácil, cada usuario puede tener sus alias personalizados.

Para crearlo se usa el comando (alias):

[nexus7@nexus7 ~]$ alias test="echo Hola Mundo"

y para eliminarlo se utiliza (unalias):

[nexus7@nexus7 ~]$ unalias test

Los alias que hemos creado no son permanentes. Para que los cambios sigan en cada arranque del equipo nos basta con editar el archivo (~/.bashrc) situado en el directorio raíz del usuario.

[nexus7@nexus7 ~]$ cd /home/nexus7
[nexus7@nexus7 ~]$ vim .bashrc

este es el formato del archivo:

# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then

. /etc/bashrc

fi


# User specific aliases and functions


alias nolacie='eject /media/LaCie/'

algunos ejemplos:

alias sshmiequipo1='ssh nexus7@192.168.2.99'
alias vncmiequipo2='vncviewer 192.168.2.99:5'

alias editarAlias='vim .bashrc'

alias grep='grep --color=auto'
alias home='cd /home/nexus7'
alias cls='clear'

alias hora='date "+%nHora: %H:%M:%S%n"'

alias hoy='date ''+%nFecha: %A, %d / %B / %y%n''
'
alias pow='poweroff'


El comando 'df' siempre nos presenta los datos en un formato difícilmente legible, (-h human readable) lo hace más fácil de leer.

alias df='df -h'

También nos permite aumentar la seguridad, el comando (rm) elimina archivos y carpetas de forma irrecuperable, se puede hacer interactivo de la siguiente forma.

alias rm='rm -i'


Después de añadir los alias que necesitemos, para habilitarlos sin necesidad de ejecutarlos en el terminal uno a uno, ejecutamos el siguiente comando.

[nexus7@nexus7 ~]$ bash

Por último si se necesita visualizar los alias configurados, basta con ejecutar (alias).

[nexus7@nexus7 ~]$ alias

alias l.='ls -d .* --color=auto'

alias ll='ls -l --color=auto'

alias ls='ls --color=auto'

alias nolacie='eject /media/LaCie/'

alias sshnexus7='ssh nexus7@192.168.9.58'
alias sshnexus8='ssh nexus8@192.168.9.12'

alias vi='vim'

alias vncnexus7='vncviewer 192.168.9.58:2'

alias vncnexus8='vncviewer 192.168.9.12:2'

alias vncyoli='vncviewer 192.168.9.67'

alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

domingo, 25 de enero de 2009

Como protegernos en la red con linux (2)

Habilitando IP spoofing protection

Evita una técnica de ataque que obtiene acceso no autorizado, el atacante envía paquetes a un ordenador, modificando los encabezados de los paquetes utilizando datos de un host fiable. Esto protege únicamente nuestra red interna.

1.Editar el archivo de configuración del sistema (vim /etc/sysctl.conf) y añadir las siguientes lineas:

#Habilitar IP spoofing protection
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.lo.rp_filter = 1
net.ipv4.conf.eth0.rp_filter = 1
#net.ipv4.conf.eth1.rp_filter = 1 (Si se tiene un segundo interface de red)
net.ipv4.conf.default.rp_filter = 1


2.Reiniciar la red manualmente el sistema usando el siguiente comando:

[root@nexus7 /]# /etc/init.d/network restart
Setting network parameters [OK]
Bringing up interface lo [OK]
Bringing up interface eth0 [OK]
Bringing up interface eth1 [OK]


Habilitar Source Routed, Log Spoofed y redireccionar paquetes

Este cambio enviará al log los Spoofed Packets y Source Routed Packets, debe configurarse para todas las interfaces de red.

#Habilitar Log Spoofed Packets, Source Routed Packets, Redirect Packets
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.lo.log_martians = 1
net.ipv4.conf.eth0.log_martians = 1
net.ipv4.conf.eth1.log_martians = 1
net.ipv4.conf.default.log_martians = 1


Como simpre hay que reiniciar la red después de efectuar estos cambios (/etc/init.d/network restart).

viernes, 23 de enero de 2009

Como protegernos en la red con linux (1)

Evitar que nuestro sistema responda a un ping es una muy buena forma de ocultarse, porque nadie sabe que estamos ahí.

1.Editar el archivo de configuración del sistema (vim /etc/sysctl.conf) y añadir la siguiente linea:

#Desabilitar la respuesta a un ping
net.ipv4.icmp_echo_ignore_all = 1


2.Reiniciar la red manualmente el sistema usando el siguiente comando:

[root@nexus7 /]# /etc/init.d/network restart
Setting network parameters [OK]
Bringing up interface lo [OK]
Bringing up interface eth0 [OK]
Bringing up interface eth1 [OK]


Rechazar solicitud de respuesta de difusión (broadcast), evitar ataques de Denegación de servicio (DOS)

Cuando un paquete es entregado a la dirección de difusión de nuestra red local, por ejemplo 192.168.1.255, ese paquete es entregado a todas las máquinas de nuestra red, todas responden a esa solicitud de eco ICMP produciendo una congestión o cortes en la red (Denegación de servicio)

1.Editar el archivo de configuración del sistema (vim /etc/sysctl.conf) y añadir la siguiente linea:

#Rechazar solicitud de respuesta de difusión (broadcast)
net.ipv4.icmp_echo_ignore_broadcasts = 1


2.Reiniciar la red manualmente el sistema usando el siguiente comando:

[root@nexus7 /]# /etc/init.d/network restart
Setting network parameters [OK]
Bringing up interface lo [OK]
Bringing up interface eth0 [OK]
Bringing up interface eth1 [OK]


El enrutamiento y los protocolos de enrutamiento pueden crear varios problemas. En el enrutamiento de origen cuando un paquete IP contiene detalles de la ruta, es peligroso porque el host de destino debe responder por el mismo camino. Si el atacante envía una serie de paquetes de enrutamiento a la red sería capaz de interceptar las respuestas, de esta forma podría pensar que se está comunicando con un host de confianza y no es así.

El archivo que hay que editar es (vim /etc/sysctl.conf) y se debe reiniciar la red (/etc/init.d/network restart).

# Desabilitar IP source routing
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.lo.accept_source_route = 0
net.ipv4.conf.eth0.accept_source_route = 0
net.ipv4.conf.eth1.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0


Habilitar la protección (TCP SYN Cookie)

Un "SYN Attack" es un ataque Denial of Service (DoS), este tipo de ataque consume todos los recursos de la máquina forzando su reinicio, aumentan el tráfico de red hasta que la máquina no puede responder a tantas solicitudes, no es un ataque peligroso pero si bastante molesto, se puede evitar de la siguiente forma.

El archivo que hay que editar es (vim /etc/sysctl.conf) y se debe reiniciar la red (/etc/init.d/network restart).

# Habilitar la protección (TCP SYN Cookie)
net.ipv4.tcp_syncookies = 1

sábado, 17 de enero de 2009

Inicio de múltiples procesos en Linux (Multitarea en Linux)

Se puede iniciar la ejecución de un programa simplemente escribiendo el nombre en la linea de comandos y luego pulsando enter. Ese programa deja una huella en el sistema mientras está en ejecución, linux le asigna un PID, para poder gestionarlo.

ps -A
PID TTY TIME CMD
1 ? 00:00:00 init
2 ? 00:00:00 kthreadd
3 ? 00:00:00 migration/0
4 ? 00:00:00 ksoftirqd/0
5 ? 00:00:00 watchdog/0
6 ? 00:00:00 migration/1


Un proceso es un programa en ejecución y es distinto a un programa. Un programa es un conjunto de instrucciones, mientras que un proceso es dinámico porque usa los recursos del sistema. También un programa puede ejecutar varios procesos.

Los siguientes comandos son de multiusuario y multitarea.

at --> Ejecuta un comando cuando lo necesites, es un tiempo determinado
bach --> Ejecuta el comando cuando puede el sistema
kill --> Mata procesos
nice --> Ajusta la prioridad de un proceso antes de que empiece
cron --> Ejecuta comandos de forma planificada
nohup --> Permite que un proceso que se esta ejecutando, siga cuando desconectes.
renice --> Ajusta la prioridad del proceso mientras se ejecuta
ps --> Informa sobre el proceso


Para ejecutar un programa en segundo plano basta con colocarle el signo '&' detrás del nombre o los argumentos si tuviera.

lp miarchvo.txt &
[1] 690

Así inmediatamente después de ejecutar el programa, linux informa del PID del proceso para mantenerse informado sobre él, poder finalizarlo, cambiarle la prioridad, etc.

Otra forma de iniciar múltiples procesos es usar conducciones, este comando ejecuta tres procesos independientes a la vez y se hace separando los comandos por la barra vertical '|'.

dd if=/dev/sda2 of=/dev/sdb2 | find -name *.txt | lp

Se puede planificar un comando usando el comando 'at', cuando llegue el momento se ejecutará.

at 1:45 (enter)
at> rm archivo.txt (enter)

at>
(ctrl-D)
job 1 at 2009-01-18 01:45

Las tareas con 'batch' hacen que la carga del sistema esté más repartida, el proceso se ejecuta cuando la carga del sistema no es demasiado alta, el sistema decide cuando. Ctrl-D representa el 'fin de archivo'.

batch (enter)
at> rm ProgramadePuntosDIC.pdf
(enter)
at>
(ctrl-D)
job 5 at 2009-01-18 01:55


Como es normal, cuando un proceso padre es terminado, los procesos hijos finalizan, pero 'nohup' permite ejecutar el proceso aunque salga de su sesión. El proceso durará lo que sea necesario hasta que se ejecute y para ir monitorizando como se comporta el proceso lo haremos con el log que genera 'nohup.out'

nohup sort archivo.txt &
[1] 9286
nohup: ignoring input and appending output to «nohup.out»


Para asignar una prioridad 'nice' o reasignar prioridad 'renice', la prioridad predeterminada es 10 hasta un máximo de 19 y un mínimo de -20. El siguiente comando aplicaría la máxima prioridad.

nice -n 19 sort texto.dat &


Estos comandos ejecutan programas en el momento en el que nosotros se lo decimos a través de la linea de comandos, pero si necesitamos que los procesos sean repetitivos utilizaremos 'cron' y 'crontab' no entraré en el uso de estos archivos de momento.

Por último debemos conocer 'kill', es útil para terminar un programa que usa demasiado tiempo de CPU, lleva demasiado tiempo y no produce una salida, bloquea un terminal, no es necesario, etc...

El programa 'ps -A' visualiza todos los procesos que se están ejecutando en ese momento, es útil para localizar ese proceso que ya no necesitamos, y después:

kill PID

viernes, 16 de enero de 2009

Crear una magen del disco duro en linux y enviarlo por SSH

El comando de Linux 'dd' no puede faltar en nuestra caja de herramientas, se puede usar para hacer copias de seguridad, crear imágenes del disco duro entero o parte, siempre que el disco destino tenga la misma geometría.

Hay que tener cuidado con el orden de 'if' y 'of', en los siguientes ejemplos se quiere copiar sda a sdb. Copia del disco duro.

dd if=/dev/sda of=/dev/sdb bs=4096 conv=notrunc,noerror
dd if=/dev/sda of=/path/de/imagen bs=4096 conv=notrunc,noerror
dd if=/dev/sda | gzip > /path/de/imagen.gz bs=4096 conv=notrunc,noerror


Restauración de los datos de la imagen.

dd if=/path/de/imagen of=/dev/sda bs=4096 conv=notrunc,noerror
gzip -dc /path/de/imagen.gz | dd of=/dev/sda


Para crear la imagen de un CD se usaría bs=2048 ya que los sectores de los cds tienen 2048 bytes, una vez terminada la copia se podría montar.

dd if=/dev/hdc of=/home/nexus7/micd.iso bs=2048 conv=notrunc
mount -o loop /mnt/micd


o añadirlo a fstab para que se monte al arrancar el sistema.

/home/nexus7/micd.iso /mnt/micd iso9660 rw,user,noauto 0 0
Copiar el contenido de la memoria a un archivo.
dd if=/dev/mem of=/home/nexus7/memoria.bin bs=1024


Comprimir la imagen con gzip y enviarla por ssh a otro equipo, es este ejemplo es una partición del disco.

dd if=/dev/sda2 bs=1k conv=sync,noerror | gzip -c | ssh -c blowfish nexus7@192.170.2.3 "dd of=/home/nexus7/Documentos/Copia_seguridad/particiones/imagen.gz bs=1k"

Para hacer la copia de seguridad en otro equipo sin usar compresión ni un canal seguro como es SSH, se puede usar 'netcat', un programa que viene por defecto en casi todas las distribuciones de linux. El tamaño de bs es igual a un cilindro en un disco LBA. En los siguientes ejemplos la copia se hará en origen la primera y en destino la segunda.

dd if=/dev/sda bs=16065b | netcat IP_Destino 1234
netcat -l -p 1234 | dd of=/dev/sda bs=16065b


jueves, 15 de enero de 2009

Optimizar NFS (Linux Network File System)

Después de instalar nuestra nueva unidad de red e intercambiar algunos archivos, nos planteamos seguro, si podemos acelerar esa tasa de transferencia entre nuestro equipo y la unidad de red. Con estos comandos y con paciencia podemos ajustar los valores rsize y wsize a unos valores óptimos.

El siguiente comando enviará un archivo de 256MB desde el equipo local a la carpeta compartida.

time dd if=/dev/zero of=/mnt/home/ArchivoDePrueba bs=16k count=16384

esto devolverá una salida como la siguiente, en la que se puede ver la tasa de transferencia y el tiempo que ha tardado en el proceso:

16384+0 records in
16384+0 records out
268435456 bytes (268 MB) copied, 85,9604 s,
3,1 MB/s

real
1m25.977s
user 0m0.007s
sys 0m0.360s


O la siguiente:

16384+0 records in
16384+0 records out
268435456 bytes (268 MB) copied, 40,9155 s, 6,6 MB/s

real 0m41.562s
user 0m0.003s
sys 0m0.321s

Hay que repetirlo varias veces con distintas configuraciones de rsize y wsize, los valores deben ser múltiplos de 1024 y no pueden ser mayores que el tamaño del bloque configurado en NFSSVC_MAXBLKSIZE, por supuesto montando y desmontando la unidad para que use los nuevos valores.

También se pueden usar para la misma función dos aplicaciones más complejas, bonnie++ y iOzone.

sábado, 10 de enero de 2009

Configuración de NFS

Anteriormente tenía configurado ssh para el intercambio de archivos entre los equipos de la LAN, la velocidad de transmisión de datos esta entre 3 y 4 MiB/s, es lento. NFS nos puede dar más velocidad a cambio de menos seguridad, aunque tampoco es la panacea, consiguiendo una velocidad de 9 y 10 MiB/s pero como en mi caso, para intercambiar varios gigabites es un alivio.

NFS no esta pensado para compartir archivos como en Samba o usando fish de SSH, la forma de actuar con NFS es montar una de las unidades de red del servidor en nuestro equipo.

En primer lugar y en el servidor NFS, es decir el que contendrá la carpeta que necesitamos compartir, hay que instalar varios paquetes:

yum install nfs-utils portmap

Comprobaremos si portmap y nfs están activos en el sistema, sino los arrancamos:

/etc/init.d/rpcbind status
/etc/init.d/rpcbind start (si esta inactivo)

/etc/init.d/nfs status
/etc/init.d/nfs start (si esta inactivo)

/etc/init.d/nfslock status
/etc/init.d/nfslock start
(si esta inactivo)

Si queremos que el servicio nfs este activo el siguiente arranque debemos ejecutar el siguiente comando:

/sbin/chkconfig nfs on

Configuremos la seguridad para NFS, añadiendo las siguientes lineas:

vim /etc/hosts.deny
portmap:ALL
lockd:ALL

mountd:ALL

rquotad:ALL

statd:ALL


/etc/hosts.allow
portmap:192.168.1.0/255.255.255.0
lockd:192.168.1.0/255.255.255.0

mountd:192.168.1.0/255.255.255.0

rquotad:192.168.1.0/255.255.255.0

statd:192.168.1.0/255.255.255.0


Se puede dar permisos por supuesto a una red de internet ajena a nuestra intranet, por ejemplo:

portmap:89.125.4.52

Editamos el archivo /etc/sysconfig/nfs configuramos o añadimos los siguientes parámetros:

LOCKD_TCPPORT=4000
STATD_PORT=4002
LOCKD_UDPPORT=4000
MOUNTD_PORT=4001


Abrir los puertos que anteriormente hemos seleccionado más el 111 y el 2049:

111 tpc/udp (rcp)
4000 tcp/udp
4001 tcp/udp, 4002 tcp/udp
también 2049 tcp/udp (nfs)


Configurar que carpetas vamos a exportar modificando el archivo /etc/exports

/home 192.168.1.39(rw,sync)

Con esto le notificamos al sistema que estamos compartiendo el directorio /home con permisos de lectura-escritura y escritura sincronizada a petición, si quisiéramos que fuera de solo lectura bastaría con substituir (rw) por (ro).

Cada vez que se efectue un cambio en /etc/exports hay que ejecutar el siguiente comando para que los cambios sean visibles:

exportfs -rv

Para que los cambios efectuados hasta el momento hay que reiniciar los servicios:

/etc/init.d/rpcbind restart
/etc/init.d/iptables restart
/etc/init.d/nfs restart
/etc/init.d/nfslock restart

Ahora desde la parte del cliente, vamos a comprobar que carpetas comparte el servidor y posteriormente montar la carpeta deseada. "showmount" nos presenta las carpetas compartidas y la salida seria como esta:

[root@nexus7 nexus7]# showmount -e 192.168.1.18
Export list for 192.168.1.18:

/home 192.168.1.39


Ahora procedemos a montar /home en nuestro sistema cliente, creamos una carpeta en /mnt con el nombre que queramos (mkdir /mnt/HomeNexus7).

mount -t nfs 192.168.1.18:/home /mnt/HomeNexus7/

Para que esta carpeta siga montada en cada arranque debemos añadir una nueva linea a /etc/fstab, por ejemplo:

192.168.1.18:/home /mnt/HomeNexus7 nfs rw 0 0

Podemos añadir "hard,intr", cuando servidor se cuelga el programa que accede a ese archivo también se bloquea, para evitar esto se recomienda poner en la linea de comandos de montaje:

192.168.1.18:/home /mnt/HomeNexus7 nfs rw,hard,intr, 0 0

domingo, 4 de enero de 2009

Configuración de VNC

Configuración VNC en Linux
VNC (Virtual Network Computing) es una herramienta cliente/servidor muy útil para control remoto de escritorios, VNC es libre con licencia GPL, existen versiones para casi todos los sistemas operativos.

En primer lugar hay que generar el password de acceso y almacenarlo:

vncserver -auth /home/nexus8/.Xauthority

[root@nexus7 nexus7]# vncserver -auth /home/nexus8/.Xauthority New 'nexus7:1 (nexus7)' desktop is nexus7:1 Creating default startup script /root/.vnc/xstartup Starting applications specified in /root/.vnc/xstartup Log file is /root/.vnc/nexus7:1.log
[root@nexus7 nexus7]#


Desde una ventana de terminal ejecutar:

vncpasswd

Solicitará una clave que más tarde se usará para el acceso a través de vncviewer.

Editar el archivo de configuración "vi /etc/sysconfig/vncservers"
-nolisten tcp, evita conexiones via tcp
-nohttpd, evita conexiones web
-localhost, evita conexiones vnc a través de localhost excepto si es a través de un canal seguro


...
VNCSERVERS="2:nexus8"
VNCSERVERARGS[2]="-geometry 1024x768 -nolisten tcp -nohttpd"


En la primera linea, el 2 significa que del puerto configurado es el 5900+2, el 5902 es el puerto que hay que abrir en el firewall. Después de configurar este archivo, lanzar el servicio y configurar su autoarranque para la siguiente sesión:

chkconfig vncserver on
service vncserver start

editar el siguiente archivo "vi /root/.vnc/xstartup" y descomentar la segunda y tercera linea dejándolo como el ejemplo, sin más cambios:

#!/bin/sh

vncconfig -iconic &
# Uncomment the following two lines for normal desktop:
unset SESSION_MANAGER
exec /etc/X11/xinit/xinitrc

[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
xterm -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
twm &


reiniciar el servidor

service vncserver restart

y finalmente para conectar desde un cliente, bastaría con esto:

vncviewer ipDestino:2

viernes, 2 de enero de 2009

Las bondades de fuser

A veces al desmontar un dispositivo, por ejemplo un usb aparece el desagradable mensaje "El dispositivo está ocupado", no hay problema, con el comando de linux "fuser" podemos saber que o quien ocupa nuestro dispositivo o puerto.

Ejecutando "fuser" desde un terminal, si el recurso esta siendo usado, nos informa de quien y que proceso lo mantiene ocupado.

-a display unused files too
-c mounted FS
-f silently ignored (for POSIX compatibility)
-i ask before killing (ignored without -k)
-k kill processes accessing the named file
-l list available signal names
-m show all processes using the named filesystems
-n SPACE search in this name space (file, udp, or tcp)
-s silent operation
-SIGNAL send this signal instead of SIGKILL
-u display user IDs
-v verbose output
-V display version information
-4 search IPv4 sockets only
-6 search IPv6 sockets only
- reset options

udp/tcp names: [local_port][,[rmt_host][,[rmt_port]]]


Al reproducir una pelicula en un disco duro externo se produce un bloqueo, ejecutando "fuser -v -m /media/Lacie".

-v salida detallada
-m todos los procesos de la ruta asignada

[nexus6@nexus6 ~]$ fuser -v -m /media/LaCie/
USER PID ACCESS COMMAND
/media/LaCie/: nexus6 24499 f.... dragon


tenemos el ID del proceso que podriamos matar con:

kill 24499

pero añadiendo -k matamos el proceso directamente:

fuser -v -k -m /media/Lacie

fuser también nos puede informar de que proceso ocupa un puerto, en este caso el puerto 22, "fuser -v-n tcp 21":

[nexus6@nexus6 ~]$ fuser -v-n tcp 21
USER PID ACCESS COMMAND
21/tcp: nexus6 4321
F. raíz ... vsftpd

Vsftpd esta utilizando el puerto 21, con la opcion -k se puede terminar con el proceso.