jueves, 29 de abril de 2010

Como enviar correo desde consola Linux usando otro servidor SMTP-Aplica Para Windows

Hay una solución interesante para hacer esto. Utilizar sendEmail, que es un pequeño cliente de correo por SMTP y por eso podemos configurar o indicarle que servidor queremos que se encargue de enviar o dirigir nuestros email.

La web del proyecto : http://caspian.dotconf.net/menu/Software/SendEmail/

Se encuentra disponible para Linux, BSD, OS X, Windows 98, Windows NT, Windows 2000, & Windows XP, y es muy útil para incluirlo en un script de bash, si necesitamos enviar correo desde nuestro servidor. Es un script en Perl y por eso no necesitamos una instalación compilando. Solo descomprime el archivo y a utilizar. Permite usar servidores SMTP con autentificación.

Si queremos ver la ayuda : $ ./sendEmail –help

Para enviar un mensaje sencillo desde consola :
$ sendEmail -f remite@gmail.com -t fulanito@midominio.net -s servidor_smtp -u “Asunto email” -m “Cuerpo mensaje , saludos! ” -v

Si queremos enviar fichero adjunto :
$ sendEmail -f remite@gmail.com -t fulanito@midominio.net -s servidor_smtp -u “Asunto email” -m “Cuerpo mensaje , saludos! ” -a fichero.zip -v

Es una solución sencilla para servidores Linux en los que no queremos instalar y configurar
un MTA de correo como Sendmail o Exim, etc.

Dsniff - Sniffer

Dsniff nos demuestra lo inseguras que son nuestras redes, sobretodo si nos empeñamos en enviar contraseñas en formato texto plano. Con este sniffer, nos daremos cuenta de los realmente importante que puede llegar a ser la utilizacion de la encriptacion en nuestras comunicaciones diarias ..
Tal y como dice el autor del programa Dug Song, él desarrollo esta potentísima aplicación para auditar sus propias redes y para demostrar la necesidad de usar encriptación de un modo habitual. \"por favor no abusar de este sofware\"
Gracias a dsniff, tenemos un motivo mas para usar diariamente herramientas como ssh (la version 2, porque la
1 tiene algunos problemas de seguridad y es vulnerable) y gpg (Gnu pgp).

Pero aca lo que mas nos interesa es sacarle el jugo al programa, con este programita podemos leer conversaciones del msn dentro de una lan, y muchas cosas mas.

Dsniff se compone de las siguientes herramientas:

* dsniff -> Sniffer de contraseñas
* filesnarf -> Captura y guarda ficheros pasados via NFS
* mailsnarf -> Captura el trafico POP3 y SMTP, guarda el resultado en formato mailbox
* msgsnarf -> Registra mensajes de sesiones de mensajería instantánea tipo msn.
* webspy -> Visualiza en tiempo real el trafico web de la victima inyectando el trafico en nuestro navegador.
* arpspoof -> Envenena la cache ARP
* dnspoof -> Falsifica respuestas DNS
* macof -> Inunda la red con direcciones MAC falsas provocando DoS
* sshow -> Analiza el trafico SSH en versión 1 y 2
* tcpkill -> Mata conexiones establecidas
* tcpnice -> Ralentiza conexiones.

Para instalar esta herramienta ponemos:

dijo:

apt-get install dsniff



MITM
Este primer ataque que vamos a ver consiste en realizar un clásico MITM, que nos servirá luego de lanzadera para otros ataques.
Para ello vamos a utilizar arpspoof. Imaginemos que tenemos el siguiente escenario:

Vict(192.168.1.33) <--->Rout(192.168.1.1)<--->Atac(192.168.1.35)

Para conseguir el MITM tenemos que hacer que la conexión entre la Victima y el router pase antes por nosotros, y igualmente a la inversa la conexión entre el router y la victima pase también por nosotros, quedando el escenario así:

Victima==============Atacante===============Router

Para ello abrimos un terminal de consola en root y hacemos:


dijo:

arpspoof -i eth0 -t 192.168.1.33 192.168.1.1



luego, en otro terminal en root, cubrimos el segundo canal de comunicación:


dijo:

arpspoof -i eth0 -t 192.168.1.1 192.168.1.33



y para que no se note que estamos en medio activamos el forwarding para actuar como router y enviar los paquetes a su verdadero dueño.


dijo:

echo 1 > /proc/sys/net/ipv4/ip_forward



si no hacemos esto, el tráfico quedara cortado para la victima y perderá la conexión, pudiendo así ser descubiertos.

Podemos comprobar en la maquina victima que el ataque esta en marcha haciendo un arp -a, sabremos que esta activo porque la dirección MAC del router coincidirá con la nuestra, esto es que habremos envenenado la cache ARP de la victima y los paquetes a la IP del router se enviaran a nuestra dirección MAC. También podremos detectar si somos victimas de este tipo de ataque si nuestra tabla ARP contiene MAC\'s duplicadas.

Importante!! no cerréis ninguna de las ventanas de consola en las que se esta ejecutando arpspoof, ya que de hacerlo se pararía el ataque!

Con esto ya tenemos el MITM en marcha.


Robo de contraseñas FTP

Ya sé que no es ningún mito conseguir la contraseña de un FTP, pero para ilustrar como funciona dsniff nos bastará
Una vez realizado el MITM, en la maquina atacante ponemos dsniff a la escucha mediante:


dijo:

dsniff -i eth0


y a continuación vamos a la maquina victima y abrimos una sesión FTP con cualquier proveedor...


Espiar conversaciones de Messenger

También es posible espiar conversaciones mediante la herramienta msgsnarf.
Habiendo hecho previamente el MITM podemos hacer:


dijo:

msgsnarf -i eth0


Capturar correos

Activando mailsnarf:


dijo:

mailsnarf -i eth0



podremos capturar todo el correo enviado mediante Outlook, Thunderbird... etc por la victima. Si ademas activamos dsniff probablemente capturemos la contraseña de acceso a la cuenta de correo. Con mailsnarf obtendremos el cuerpo del mensaje enviado.


Espiar trafico web en tiempo real

Para esto es imprescindible utilizar el navegador Netscape... para esto no nos sirve el Firefox U_U el Netscape Navigator lo podemos bajar de la pagina oficial de Netscape, la ultima versión estable para Linux es la 9.0.0.3.
El ataque es tan fácil como realizar un MITM y activar webspy del siguiente modo:


dijo:

webspy -i eth0 192.168.1.33



y en la barra de direcciones de Netscape poner la dirección http://192.168.1.33 ¡webspy irá inyectando el trafico web automáticamente y en tiempo real!!

viernes, 23 de abril de 2010

Procesos Linux

La más simple definición de un proceso podría ser que es una instancia de un programa en ejecución (corriendo). A los procesos frecuentemente se les refiere como tareas. El contexto de un programa que esta en ejecución es lo que se llama un proceso. Este contexto puede ser mas procesos hijos que se hayan generado del principal (proceso padre), los recursos del sistema que este consumiendo, sus atributos de seguridad (tales como su propietario y permisos de archivos asi como roles y demás de SELinux), etc.

Linux, como se sabe, es un sistema operativo multitarea y multiusuario. Esto quiere decir que múltiples procesos pueden operar simultáneamente sin interferirse unos con los otros. Cada proceso tiene la "ilusión" que es el único proceso en el sistema y que tiene acceso exclusivo a todos los servicios del sistema operativo.

Programas y procesos son entidades distintas. En un sistema operativo multitarea, múltiples instancias de un programa pueden ejecutarse sumultáneamente. Cada instancia es un proceso separado. Por ejemplo, si cinco usuarios desde equipos diferentes, ejecutan el mismo programa al mismo tiempo, habría cinco instancias del mismo programa, es decir, cinco procesos distintos.

Cada proceso que se inicia es referenciado con un número de identificación único conocido como Process ID PID, que es siempre un entero positivo. Prácticamente todo lo que se está ejecutando en el sistema en cualquier momento es un proceso, incluyendo el shell, el ambiente gráfico que puede tener múltiples procesos, etc. La excepción a lo anterior es el kernel en si, el cual es un conjunto de rutinas que residen en memoria y a los cuales los procesos a través de llamadas al sistema pueden tener acceso.

ps

El comando ps es el que permite informar sobre el estado de los procesos. ps esta basado en el sistema de archivos /proc, es decir, lee directamente la información de los archivos que se encuentran en este directorio. Tiene una gran cantidad de opciones, incluso estas opciones varían dependiendo del estilo en que se use el comando. Estas variaciones sobre el uso de ps son las siguientes:

* Estilo UNIX, donde las opciones van precedidas por un guión -
* Estilo BSD, donde las opciones no llevan guión
* Estilo GNU, donde se utilizan nombres de opciones largas y van precedidas por doble guión --

Sea cual sea el estilo utilizado, dependiendo de las opciones indicadas, varias columnas se mostrarán en el listado de procesos que resulte, estas columnas pueden ser entre muchas otras, las siguientes (y principales):
p o PID Process ID, número único o de identificación del proceso.
P o PPID Parent Process ID, padre del proceso
U o UID User ID, usuario propietario del proceso
t o TT o TTY Terminal asociada al proceso, si no hay terminal aparece entonces un '?'
T o TIME Tiempo de uso de cpu acumulado por el proceso
c o CMD El nombre del programa o camndo que inició el proceso
RSS Resident Sise, tamaño de la parte residente en memoria en kilobytes
SZ o SIZE Tamaño virtual de la imagen del proceso
NI Nice, valor nice (prioridad) del proceso, un número positivo significa menos tiempo de procesador y negativo más tiempo (-19 a 19)
C o PCPU Porcentaje de cpu utilizado por el proceso
STIME Starting Time, hora de inicio del proceso
S o STAT Status del proceso, estos pueden ser los siguientes

* R runnable, en ejecución, corriendo o ejecutándose
* S sleeping, proceso en ejecución pero sin actividad por el momento, o esperando por algún evento para continuar
* T sTopped, proceso detenido totalmente, pero puede ser reiniciado
* Z zombie, difunto, proceso que por alguna razón no terminó de manera correcta, no debe haber procesos zombies
* D uninterruptible sleep, son procesos generalmente asociados a acciones de IO del sistema
* X dead, muerto, proceso terminado pero que sigue apareciendo, igual que los Z no deberían verse nunca


Las opciones completas de ps las encuentras en las páginas del manual (man ps), o escribiendo en la terminal ps L, y para ver un resumen de sus opciones más comunes usa ps --help:

#> ps --help
********* simple selection ********* ********* selection by list *********
-A all processes -C by command name
-N negate selection -G by real group ID (supports names)
-a all w/ tty except session leaders -U by real user ID (supports names)
-d all except session leaders -g by session OR by effective group name
-e all processes -p by process ID
T all processes on this terminal -s processes in the sessions given
a all w/ tty, including other users -t by tty
g OBSOLETE -- DO NOT USE -u by effective user ID (supports names)
r only running processes U processes for specified users
x processes w/o controlling ttys t by tty
*********** output format ********** *********** long options ***********
-o,o user-defined -f full --Group --User --pid --cols --ppid
-j,j job control s signal --group --user --sid --rows --info
-O,O preloaded -o v virtual memory --cumulative --format --deselect
-l,l long u user-oriented --sort --tty --forest --version
-F extra full X registers --heading --no-heading --context
********* misc options *********
-V,V show version L list format codes f ASCII art forest
-m,m,-L,-T,H threads S children in sum -y change -l format
-M,Z security data c true command name -c scheduling class
-w,w wide output n numeric WCHAN,UID -H process hierarchy

A continuación algunos cuantos ejemplos de ps con la salida recortada.

># ps -e (-e muestra todos los procesos)
PID TTY TIME CMD
1 ? 00:00:01 init
2 ? 00:00:00 kthreadd
3 ? 00:00:00 migration/0
4 ? 00:00:00 ksoftirqd/0

#> ps -ef (-f muestra opciones completas)
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 10:12 ? 00:00:01 init [5]
root 2 0 0 10:12 ? 00:00:00 [kthreadd]
...
root 6130 5662 0 10:24 pts/0 00:00:00 su -
root 6134 6130 0 10:24 pts/0 00:00:00 -bash
sergon 6343 5604 0 10:28 ? 00:00:00 kio_file [kdeinit] file /home/sergon/tmp/ksocket-sergon/kl
root 6475 6134 0 10:38 pts/0 00:00:00 ps -ef

#> ps -eF (-F muestra opciones completas extra)
UID PID PPID C SZ RSS PSR STIME TTY TIME CMD
root 1 0 0 412 556 1 16:59 ? 00:00:01 init [5]
root 2 0 0 0 0 1 16:59 ? 00:00:00 [kthreadd]
sergon 8326 8321 0 902 1272 0 17:07 ? 00:00:00 /bin/sh /usr/lib/firefox-2.0.0.8/run-mozilla.sh /usr/lib/f
sergon 8331 8326 4 53856 62604 0 17:07 ? 00:00:50 /usr/lib/firefox-2.0.0.8/mozilla-firefox-bin
sergon 8570 7726 2 15211 37948 0 17:17 ? 00:00:10 quanta

#> ps ax (formato BSD sin guión, a muestra todos, x sin mostrar tty)
PID TTY STAT TIME COMMAND
1 ? Ss 0:01 init [5]
2 ? S< 0:00 [kthreadd]
3 ? S< 0:00 [migration/0]
4 ? S< 0:00 [ksoftirqd/0]

#> ps aux (formato BSD sin guión, u muestra usuarios y demás columnas)
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 1648 556 ? Ss 16:59 0:01 init [5]
root 2 0.0 0.0 0 0 ? S< 16:59 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S< 16:59 0:00 [migration/0]
root 4 0.0 0.0 0 0 ? S< 16:59 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 16:59 0:00 [migration/1]

#> ps -eo user,pid,tty (-o output personalizado, se indican los campos separados por coma, ver ps --help o ps L)
USER PID TT
root 1 ?
root 2 ?
sergon 8570 tty 1
root 8876 pts/1

#> ps -eH (muestra árbol de procesos)
#> ps axf (lo mismo en formato BSD)
#> ps -ec (el comando que se esta ejecutando, sin la ruta, solo el nombre real)
#> ps -el (muestra formato largo de varias columnas, muy práctico)
#> ps L (No muestra procesos, lista todos los códigos de formatos)


pstree

Muestra los procesos en forma de árbol, pstree --help te da las opciones más comunes. Recomiendo uses lo uses con la opción -A y -G para que te un árbol con líneas con líneas estilo ASCII y de terminal VT100 respectivamente, puedes añadir también -u para mostrar entre paréntesis al usuario propietario del proceso:

#> pstree -AGu
init---acpid
|-atd(daemon)
|-automount----2*[{automount}]
|-avahi-daemon(avahi)
|-beagled(sergon)----7*[{beagled}]
|-beagled-helper(sergio)----3*[{beagled-helper}]
|-compiz(sergon)----kde-window-deco
|-console-kit-dae----61*[{console-kit-dae}]
|-crond
|-dbus-daemon(messagebus)
|-dbus-daemon(sergio)
|-dbus-launch(sergio)
|-dcopserver(sergio)
|-dhclient
|-gam_server(sergio)
|-gconfd-2(sergio)
|-hald(haldaemon)----hald-runner(root)----hald-addon-acpi(haldaemon)
| |-hald-addon-cpuf
| |-hald-addon-inpu
| |-hald-addon-stor
|-httpd---8*[httpd(apache)]
|-2*[ifplugd]
|-ipw3945d
|-kaccess(sergio)
...


kill

El comando kill, que literalmente quiere decir matar, sirve no solo para matar o terminar procesos sino principalmente para enviar señales (signals) a los procesos. La señal por default (cuando no se indica ninguna es terminar o matar el proceso), y la sintaxis es kill PID, siendo PID el número de ID del proceso. Asi por ejemplo, es posible enviar una señal de STOP al proceso y se detendrá su ejecución, después cuando se quiera mandar una señal de CONTinuar y el proceso continuara desde donde se quedo.

#> kill -l (lista todas las posibles señales que pueden enviarse a un proceso)
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT
17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU
25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH
29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN
35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4
39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6
59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX

La lista previa presenta una lista de todas las posibles señales que pueden mandarse a un proceso y estas pueden ser invocadas a través del número de la señal o de su código, por ejemplo:

#> kill -9 11428 (termina, mata un proceso completamente)
#> kill -SIGKILL 11428 (Lo mismo que lo anterior)

Las señales más comunes son la 19 y 20 que detienen momentáneamente la ejecución de un proceso o programa, 18 la continua, 1 que es la señal de hang up que obliga al proceso a releer sus archivos de configuración estando en ejecución y 9 que termina rotundamente un proceso.

killall

El comando killall, que funciona de manera similar a kill, pero con la diferencia de en vez de indicar un PID se indica el nombre del programa, lo que afectará a todos los procesos que tengan ese nombre. Asi por ejemplo si se tienen varias instancias ejecutándose del proxy server squid, con killall squid eliminará todos los procesos que se esten ejecutando con el nombre 'squid'

#> killall -l (lista de posibles señales)
#> killall -HUP httpd (manda una señal de "colgar", detenerse releer sus archivos de configuración y reiniciar)
#> killall -KILL -i squid (manda señal de matar a todos los procesos squid pero pide confirmación en cada uno)


nice

Permite cambiar la prioridad de un proceso. Por defecto, todos los procesos tienen una prioridad igual ante el CPU que es de 0. Con nice es posible iniciar un programa (proceso) con la prioridad modificada, más alta o más baja según se requiera. Las prioridades van de -20 (la más alta) a 19 la más baja. Solo root o el superusuario puede establecer prioridades negativas que son más altas. Con la opción -l de ps es posible observar la columna NI que muestra este valor.

#> nice (sin argumentos, devuelve la prioridad por defecto )
0
#> nice -n -5 comando (inicia comando con una prioridad de -5, lo que le da más tiempo de cpu)


renice

Asi como nice establece la prioridad de un proceso cuando se incia su ejecución, renice permite alterarla en tiempo real, sin necesidad de detener el proceso.

#> nice -n -5 yes (se ejecuta el programa 'yes' con prioridad -5)
(dejar ejecutando 'yes' y en otra terminal se analiza con 'ps')
#> ps -el
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 12826 12208 4 75 -5 - 708 write_ pts/2 00:00:00 yes

#> renice 7 12826
12826: prioridad antigua -5, nueva prioridad 7
#> ps -el
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 12826 12208 4 87 7 - 708 write_ pts/2 00:00:15 yes

(obsérvese el campo NI en el primer caso en -5, y en el segundo con renice quedó en 7, en tiempo real)

nohup y &

Cuando se trata ejecutar procesos en background (segundo plano) se utiliza el comando nohup o el operador &. Aunque realizan una función similar, no son lo mismo.

Si se desea liberar la terminal de un programa que se espera durará un tiempo considerable ejecutándose, entonces se usa . Esto funciona mejor cuando el resultado del proceso no es necesario mandarlo a la salida estándar (stdin), como por ejemplo cuando se ejecuta un respaldo o se abre un programa Xwindow desde la consola o terminal. Para lograr esto basta con escribir el comando en cuestión y agregar al final el símbolo & (ampersand).

$> yes > /dev/null &
$> tar czf respaldo /documentos/* > /dev/null/ &
$> konqueror & (con estos ejemplos se ejecuta el comando y se libera la terminal regresando el prompt)

Sin embargo lo anterior produce que el padre del proceso PPID que se invocó con sea el proceso de la terminal en si, por lo que si cerramos la terminal o salimos de la sesión también se terminaran los procesos hijos que dependan de la terminal, no muy conveniente si se desea que el proceso continué en ejecución.

Para solucionar lo anterior, entonces se usa el comando nohup que permite al igual que '&' mandar el proceso y background y que este quede inmune a los hangups (de ahí su nombre nohup) que es cuando se cuelga o termina la terminal o consola de la cual se ejecutó el proceso.

$> nohup yes > /dev/null &
$> nohup czf respaldo /documentos/* > /dev/null/
$> nohup konqueror

Asi se evita que el proceso se "cuelgue" al cerrar la consola.

jobs

Si por ejemplo, se tiene acceso a una única consola o terminal, y se tienen que ejecutar varios comandos que se ejecutarán por largo tiempo, se pueden entonces como ya se vió previamente con nohup y el operador '&' mandarlos a segundo plano o background con el objeto de liberar la terminal y continuar trabajando.

Pero si solo se está en una terminal esto puede ser difícil de controlar, y para eos tenemos el comando jobs que lista los procesos actuales en ejecución:

#> yes > /dev/null &
[1] 26837
#> ls -laR > archivos.txt &
[2] 26854
#> jobs
[1]- Running yes >/dev/null &
[2]+ Running ls --color=tty -laR / >archivos.txt &

En el ejemplo previo, se ejecutó el comando yes y se envió a background (&) y el sistema devolvió [1] 26837, indicando asi que se trata del trabajo o de la tarea [1] y su PID, lo mismo con la segunda tarea que es un listado recursivo desde la raíz y enviado a un archivo, esta es la segunda tarea.

Con los comandos fg (foreground) y bg background es posible manipular procesos que esten suspendidos temporalmente, ya sea porque se les envió una señal de suspensión como STOP (20) o porque al estarlos ejecutando se presionó ctrl-Z. Entonces para reanudar su ejecución en primer plano usaríamos fg:

#> jobs
[1]- Stopped yes >/dev/null &
[2]+ Stopped ls --color=tty -laR / >archivos.txt &
#> fg %1
#> jobs
[1]+ Running yes >/dev/null &
[2]- Stopped ls --color=tty -laR / >archivos.txt &

Obsérvese como al traer en primer plano al 'job' o proceso 1, este adquirió el símbolo [+] que indica que esta al frente. Lo mismo sería con bg que volvería a reinicar el proceso pero en segundo plano. Y también es posible matar los procesos con kill indicando el número que devuelve jobs: kill %1, terminaría con el proceso en jobs número 1.

top

Una utilería muy usada y muy útil para el monitoreo en tiempo real del estado de los procesos y de otras variantes del sistema es el programa llamado top, se ejecuta desde la línea de comandos, es interactivo y por defecto se actualiza cada 3 segundos.

$> top
top - 13:07:30 up 8 days, 6:44, 4 users, load average: 0.11, 0.08, 0.08
Tasks: 133 total, 1 running, 131 sleeping, 0 stopped, 1 zombie
Cpu(s): 0.0%us, 0.2%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.2%si, 0.0%st
Mem: 497356k total, 472352k used, 25004k free, 21500k buffers
Swap: 1156640k total, 257088k used, 899552k free, 60420k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
26156 sergon 15 0 2160 1016 784 R 1 0.2 0:00.93 top
1 root 15 0 2012 616 584 S 0 0.1 0:00.98 init
2 root RT 0 0 0 0 S 0 0.0 0:00.29 migration/0
3 root 34 19 0 0 0 S 0 0.0 0:00.00 ksoftirqd/0
4 root RT 0 0 0 0 S 0 0.0 0:00.00 watchdog/0
5 root RT 0 0 0 0 S 0 0.0 0:00.38 migration/1
...

Estando adentro de la apliación, presionando 'h' muestra una ayuda de los posibles comandos que permiten configurar top, por ejemplo, al presionar 's' pregunta por el tiempo en segundos de actualización, etc.

Estas son algunas de las herramientas, las más importantes y usadas, para adminsitrar procesos, hay varios programas en ambientes gráficos que en una sola pantalla permiten todo lo anterior y más, y en línea de comandos te recomiendo htop, que es como un top pero en esteroides.

Armar blog con dominio propio

En este post explicaré como armar un blog en un dominio propio, luego aclararé como se podría aplicar esto a un grupo de personas (ej: staff de una empresa).
Armar DB

1. Dirigirse al administrador de base de datos (lo explicaré con phpMyAdmin)
2. Crear nueva base de datos (ej: "blogs").PhpMyAdminCreateDB

3. Hacer click en la casa PhpMyAdminHome , para volver al inicio del administrador.
4. Dirigirse a privilegios.PhpMyAdminPrivileges
5. Crear nuevo usuario
6. Elegir nombre (ej: bloguser), y contraseña.
7. En Servidor: elegir Local , y crear usuario.
8. Luego ir a Privilegios específicos para la base de datos y seleccionar la base de datos creada para los blogs (ej: "blogs"), y otorgar a este usuario todos los privilegios menos GRANT.
9. Salir del administrador

Preparar WordPress

1. Descargar Wordpress desde http://wordpress.org/latest.zip
2. Descomprimir el zip en una carpeta.
3. Dentro de la carpeta wordpress descomprimida se encuentra el archivo wp-config-sample.php . Abrirlo con NotePad.WPConfigSample
4. Donde dice "putyourdbnamehere" al lado de DB_NAME, borrarlo y ubicar el nombre de la base de datos anteriormente creada (ej: blogs).WPDatabaseName

La línea quedaría de la siguiente forma en el ejemplo:

WPDatabaseName2
5. Donde dice "usernamehere" al lado de DB_USER, borrarlo y ubicar el usuario de la base de datos anteriormente creada (ej: bloguser).WPDatabaseUser
6. Donde dice "yourpasswordhere" al lado de DB_PASSWORD, borrarlo y escribir la contraseña que le asignamos al usuario de la base de datos.image
7. Donde dice "localhost" al lado de DB_HOST, en caso de ser un blog local (que se almacena en un servidor local) dejarlo como localhost, sino borrarlo e indicar el host donde se creó la base de datos (ej: db1.example.com).WPDatabaseHost
8. Guardar el archivo como wp-config.php y cerrarlo.WPSave

Aclaración

En caso de querer preparar un blog para un grupo de personas:

1. En la carpeta del servidor es recomendable preparar una carpeta nueva para cada usuario por ejemplo, podría utilizar "../blogs/juan" y "../blogs/juana".
2. En cada una de las carpetas de los usuarios se le copia todo el contenido de la carpeta wordpress luego de ser modificado wp-config.php.
3. Como se están utilizando varios usuarios de blogs en la misma base de datos, es necesario volver a abrir los archivos wp-config.php de cada usuario y modificar el valor de la variable $table_prefix (en vez de dejar "wp_"). Se debe dejar un prefijo único para el miembro del staff (ej: para juan pérez el prefijo podría ser wp_juanperez), éste nombre no se puede repetir después en otro $table_prefix, ya que es el prefijo de las tablas de la base de datos, y producirá errores.WPTablePrefix

Si se desea, se puede colocar cada carpeta de los usuarios en un subdominio en un servidor propio.
Instalar WordPress

1. Ingresar a la web del blog (ej: www.ejemplo.com/blogs/juan)
2. Una vez en la página de instalación, ingresar Título del Blog y dirección de email del autor.Si se desea existe la opción "Allow my blog to appear in search engines like Google and Technorati" en un Checkbox.

WPInstall1
3. Luego de aceptar el formulario, el setup mostrará una clave y un usuario que permitirán ingresar al blog, anotarlos ya que después no se muestran más (pueden ser cambiados más adelante).

Customize Wordpress

* Se pueden modificar los themes del Wordpress, haciendo uno propio o descargándolos de algún lugar (ej: ejemplo de Theme), como por ejemplo http://themes.wordpress.net . Éstos se descargan, y se debe colocar la carpeta del theme en la carpeta wp-content/themes/ y luego seleccionar el Theme en la solapa Presentation desde la parte de configuración del blog.
* El título y subtítulo se selecciona desde Options (General) en la administración del Blog.
* Se pueden Modificar los Widgets (Elementos en la side bar) en la sección Widgets en la solapa Presentation en la Administración del blog.


http://staff.prosoftwarefactory.com.ar/blogs/joaco/?p=63

jueves, 22 de abril de 2010

Tubos y Redirecciones (Pipes and Redirection)

Tubos y Redirecciones (Pipes and Redirection)

0 = stdin, 1 = stdout, 2 = stderr

Algunos conceptos.
En linux existen 3 archivos muy importantes y que generalmente pasan desapercibidos. Estos se encuentran en /dev y son:
stdin, stdout y stderr.

STDIN: es el “STandarD INput” o entrada estandar, es el lugar en donde un proceso toma generalmente su entrada, por defecto el teclado. El archivo /dev/stdin es simplemente un archivo que apunta a tu terminal/consola.
Si ejecutas el comando cat sin parámetros podrás ver que toma cualquier caracter desde la entrada estandar (el teclado). Para cortar el proceso usa Control+C

# cat



STDOUT: es el “STandarD OUTput” o salida estandar, es el lugar en donde un proceso generalmente escribe su salida, por defecto, la pantalla. El archivo /dev/stdout es un archivo que apunta, también, a tu terminal/consola.

Un comando ls envía por defecto la salida a la pantalla. Pero si agregamos el caracter de redirección de salida “>” podemos enviarlo a cualquier otro lado.

Por ejemplo, si quisieramos hacer un listado de archivos la carpeta /bin seguramente veríamos pasar por pantalla muy rápidamente toda la lista de archivos y podríamos leer solo la última parte (unas 20 líneas). Esto lo podríamos solucionar enviando la salida estandar a un archivo y luego inspeccionar el archivo más detenidamente, de la siguiente manera:

# ls /bin > misalida.txt



STDERR: es el “STandarD ERRor” o error estandar, es el lugar en donde un proceso generalmente escribe los mensajes de errores, por defecto la pantalla.

Permission denied

Este mensaje es una salida stderr.

Imagínense ejecutar un comando que genera muchas líneas de salida y quizás muchos errores, que seríamos incapaces de leer, dada la velocidad con la que aparecen en nuestra pantalla.
Un ejemplo de esto es cuando usamos el comando tar como un usuario común:

$ tar cvf procs.tar /proc

Este comando generará una larga salida con errores debido a los permisos y a que algunos archivos permanecen abiertos.

Para analizar bien deberíamos redireccionar las salidas para leerlas con más tranquilidad y en detalle:

$ tar cvf procs.tar /proc >detalle.txt 2>errores.txt

Con este comando direccionamos la salida estandar al archivo detalle.txt y los errores estandar al archivo errores.txt.

¿Porqué hay un número 2 antes de > en el comando?

Este número indica la salida: 0 = stdin, 1 = stdout, 2 = stderr. Si no colocara el número 2, los archivos detalle.txt y errores.txt contendrían exactamente la misma información: sólo la salida estandar, ya que los errores nunca se almacenarían.

En “humano” el comando sería: Crear un archivo tar llamado procs.tar, todo el detalle de la salida direccionarlo al archivo detalle.txt y los errores generados enviarlos al archivo errores.txt

Otra buena opción a esta redirección es:

$ tar cvf procs.tar /proc >procs.txt 2>&1

Este comando pone stdout en el archivo procs.txt así como también se envían los errores a &1 que es la salida estandar, o sea que también van a parar al archivo procs.txt.
De esta manera tenemos stdout y stderr en un mismo archivo.

¿> o >>?

Cuando utilizamos un solo símbolo >, estamos indicando que se cree un archivo que contendrá la salida estandar. Si el archivo existe, se sobreescribirá.
Si queremos agregar a ese archivo basta con indicar dos caracteres >> (cuando el archivo destino no exista lo creará).

En una depuración de comandos es bueno realizar el agregado con >>, de lo contrario perderíamos la primer información:

$ tar cvf bins.tar /bin >detalle.txt 2>errores.txt
$ tar cvf procs.tar /procs >>detalle.txt 2>>errores.txt

Al ejecutar ambos comandos, la salida se agregará en detalle.txt y los posibles errores quedarán registrados en errores.txt.

Pipe o tubo.

Se utiliza para unir comandos, donde la salida del primer comando es la entrada del segundo. Se representa por el caracter | .

Uno de los usos más comunes es pausar un listado muy largo para analizar en detalle:

$ cat archivo.txt | more

La salida de cat es la salida estandar (pantalla), pero al utilizar el pipe esa salida la entubamos hacia la entrada del comando more.

Otro ejemplo sería redireccionando varios comandos:

$ ps ax | grep ssh | grep -v grep

Aquí realizamos un ps ax que nos mostraría la lista completa de procesos, al filtrar con grep ssh solo nos mostraría aquellas líneas que contengan la palabra ssh, pero como el mismo comando grep ssh aparece y no nos interesa, volvemos a filtrar con grep quitando las líneas que contengan la palabra grep (grep -v grep).

Un ejemplo muy útil para matar todas las instancias de ssh sería como sigue:

$ for pid in `ps ax | grep sshd | grep -v grep | awk {'print $1'}`; do kill -9 $pid; done

Explicando: realizamos un bucle con for, el cual toma cada línea de lo que está dentro de las comillas ` ` y luego hace un kill -9 de cada resultado.
Fíjense que es igual al ejemplo anterior, solo que hemos agregado el uso de awk para mostrar el primer campo (que es el pid, Process ID).
Si ejecutamos ps ax | grep sshd | grep -v grep | awk {‘print $1′} nos daría una lista de PIDs de cada instancia de sshd. Al estar dentro del bucle for, procesaríamos cada pid con el comando kill.

awk

AWK fue una de las primeras herramientas en aparecer en Unix (en la versión 3) y ganó popularidad como una manera de añadir funcionalidad a las tuberías de Unix.

Para no tener que recordar todo este comando podríamos crear un script y usar variables para pasar la búsqueda de procesos:

$ cat mataprocesos
#!/bin/bash
#$1 es el primer valor que toma de línea de comandos
rm /tmp/mataprocesos.err
PROCESO=$1
if [ -z $PROCESO ]; then
echo "Debe ingresar el nombre de proceso"
echo "Uso:"
echo " mataprocesos "
exit
fi
for NROPID in `ps ax | grep $PROCESO | grep -v grep | awk {'print $1'}`; do
kill -9 $NROPID 2>> /tmp/mataprocesos.err;
done
SIZE=`stat -c %s /tmp/mataprocesos.err`
if [ "$SIZE" -ne 0 ]; then
echo "Errores producidos"
more /tmp/mataprocesos.err
fi

Le damos permisos de ejecución y si queremos le hacemos un link simbólico dentro de /usr/bin para que sea accesible desde cualquier punto.

NOTA: si bien existe el comando pkill (que mata procesos respecto del nombre pasado) me pareció un buen ejercicio para ver las redirecciones.

martes, 20 de abril de 2010

Una sesion de correo con telnet

http://www.ignside.net/man/telnet/sesion.php

Dovecot pop3 - Correo

http://www.scribd.com/doc/8699418/Manual-de-instalacion-y-configuracion-del-Servidor-de-correo-POSTFIX-

Dovecot pop3 - Correo

Postfix y Postfix Admin GUI

http://tuxjm.net/docs/mailserver-howto/mysql-based/xhtml/ch04s04.html

http://www.scribd.com/doc/8699418/Manual-de-instalacion-y-configuracion-del-Servidor-de-correo-POSTFIX-

Test mail

telnet ipdelservidor 25
helo test
mail from: tudireccion@ferretools.com
rcpt to: tudireccion@ferretools.com
data
Subject: Test de email

.

(termina con dos ENTERS un punto y dos ENTERS de nuevo)



Instalación de postfix

Hay muchos Servidores de Correo. Algunos: sendmail, exim, qmail, postfix. Éste es el elegido. Instalamos postfix:

[root@3000xp ~]# urpmi postfix
Para satisfacer las dependencias, se instalarán los paquetes siguientes:
libpostfix1-2.2.5-7mdk.i586
postfix-2.2.5-7mdk.i586
¿Está todo bien? (S/n) s
...........................................
Terminando el registro del núcleo: [ OK ]
Terminando el registro del sistema: [ OK ]
Iniciando el registro del sistema: [ OK ]
Iniciando el registro del núcleo: [ OK ]

Lo ponemos en marcha y vemos que va todo bien:

root@3000xp ~]# /etc/init.d/postfix start
Iniciando postfix: [OK]

Puertos en escucha:

# netstat -puta
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 web:10026 *:* LISTEN 19274/master
tcp 0 0 web:smtp *:* LISTEN 19274/master

Vemos que master (postfix) está escuchando en el puerto smtp (25) del servidor. El otro (10026) lo veremos al estudiar los filtros.

Echemos un vistazo a archivos y directorios importantes:

* /etc/postfix/main.cf, que es el fundamental de configuración de postfix
* /etc/postfix/master.cf, el segundo fundamental y complejo (mejor no toquetearlo)
* /etc/postfix/aliases, que es el archivo para crear alias (redirecciones de correo). Por ejemplo, el correo dirigido a root debería leerlo un usuario del sistema, como puede ser pepito.
* /etc/postfix/sasl/smtp.conf es el archivo para configurar la autenticación ante el servidor de los usuarios
* /var/spool/postix/ es el directorio donde trabaja enjaulado Postfix. Observa cómo ha copiado hasta los archivos básicos de /etc que necesita para funcionar.

Prueba de funcionamiento

Ahora vamos a enviar un correo a pelo: nos conectaremos al puerto 25 (smtp) diremos que somos loli (y se lo creerá) y le enviaremos un correo al usuario colego (ambos son usuarios del sistema donde se ha instalado postfix). Esto hará que se cree en el directorio /var/spool/mail/ un fichero llamado colego que contendrá ese correo. Éste es el buzón de correo del usuario, y tal y como está configurado postfix ahora ahí vendrán a parar todos los correos, añadiéndose al final del archivo de cada usuario, engordando ilimitadamente si no vamos borrando los sucesivos mensajes que recibamos, y si no configuramos cuotas.

$telnet localhost 25
Trying 127.0.0.1...
Connected to web.iesdelgadohernandez.es (127.0.0.1).
Escape character is '^]'.
220 web.iesdelgadohernandez.es ESMTP Postfix (2.2.5) (Mandriva Linux)
helo localhost
250 web.iesdelgadohernandez.es
mail from: loli
250 Ok
rcpt to: colego
250 Ok
data
354 End data with .
subject: primer correo enviado de prueba
from: loli
to: colego
Este es el primer correo que te envio. Es una prueba. Adios.
.
250 Ok: queued as 830FE136DD4
quit
221 Bye
Connection closed by foreign host.

Ahora se conecta colego:

$ su colego
You have mail in /var/spool/mail/colego

Fijémonos cómo nos avisa de que tenemos un correo. Vamos a leerlo:

$ cat /var/spool/mail/colego
From loli@web.iesdelgadohernandez.es Mon Feb 13 21:32:57 2006
Return-Path:
X-Original-To: colego
Delivered-To: colego@web.iesdelgadohernandez.es
Received: from localhost (web.iesdelgadohernandez.es [127.0.0.1])
by web.iesdelgadohernandez.es (Postfix) with SMTP id 830FE136DD4
for ; Mon, 13 Feb 2006 21:31:47 +0100 (CET)
subject: primer correo enviado de prueba
from: loli@web.iesdelgadohernandez.es
to: colego@web.iesdelgadohernandez.es
Message-Id: <20060213203147.830FE136DD4@web.iesdelgadohernandez.es>
Date: Mon, 13 Feb 2006 21:31:47 +0100 (CET)

Este es el primer correo que te envio. Es una prueba. Adios.

Todo va bien (por ahora). Ya podemos mandar correo donde queramos desde nuestro servidor. Pero vamos a configurarlo un poco y a protegerlo.
Alias

Bueno, algo que debe configurarse son los alias o redirecciones que correo. El superusuario root va a recibir muchos mensajes que, por seguridad, nunca recibirá. ¿Quién los recibe ahora? Pues el usuario postfix (sí, se crea el usuario postfix del mismo modo que al instalar el servidor web apache se crea el usuario apache). La idea es que el administrador nunca se conecte como root, sino como un usuario normal y corriente; digamos pealfa.

Todo ello se consigue a través del archivo /etc/aliases y del comando newaliases. Vamos al archivo de alias mencionado y allí cambiamos:

root: postfix

por

root: pealfa

y ejecutamos el comando newaliases
# newaliases
Configuración básica

Debemos modificar algunos parámetros. Para ello dejamos al archivo /etc/postifix/main.cf como sigue:

# CREADO POR EL SCRIPT DE INSTALACIÓN. NO TOCAMOS
readme_directory = /usr/share/doc/postfix-2.2.5/README_FILES
html_directory = /usr/share/doc/postfix-2.2.5/html
sendmail_path = /usr/sbin/sendmail.postfix
setgid_group = postdrop
command_directory = /usr/sbin
manpage_directory = /usr/share/man
daemon_directory = /usr/lib/postfix
newaliases_path = /usr/bin/newaliases
mailq_path = /usr/bin/mailq
queue_directory = /var/spool/postfix
mail_owner = postfix
# PARÁMETROS CONFIGURABLES POR EL USUARIO
delay_warning_time = 4h
smtpd_banner = $myhostname ESMTP $mail_name ($mail_version) (Mandriva Linux)
unknown_local_recipient_reject_code = 450
smtp-filter_destination_concurrency_limit = 2
lmtp-filter_destination_concurrency_limit = 2
# USAMOS EL FORMATO DE BUZÓN MAILDIR. SERÁ EL BUZÓN PERSONAL DE CADA USUARIO.
home_mailbox = Mail/
# INTERFACES POR LA QUE ESCUCHARÁ PETICIONES(localhost, eth0, all):
inet_interfaces = all
# PARÁMETROS DEL HOST Y DEL DOMINIO
myhostname = web.iesdelgadohernandez.es
mydomain = iesdelgadohernandez.es
# AL ENVIAR UN CORREO, QUÉ QUEREMOS QUE APAREZCA COMO ORIGEN DEL CORREO: $myhostname, $mydomain O LO QUE SEA
myorigin= $mydomain
# EQUIPOS A LOS QUE SE PERMITIRÁ ENVIAR LIBREMENTE EL CORREO. SER RESTRICTIVOS AQUÍ. Y DOMINIOS A ADMINISTRAR:
mynetworks = 127.0.0.0/8
mydestination = localhost, $myhostname, localhost.$mydomain, $mydomain
# LIMITES PARA BUZON Y MENSAJE (20 MB / 5 MB). POR DEFECTO ESTÁ EN (50 / 10 MB).
#mailbox_siza_limit = 20480000
#message_size_limit = 5120000
Atenticación, cifrado y controles anti-spam.

Mantener en funcionamiento un servidor de correo es complejo y una gran responsabilidad. Nada más abrir el puerto 25 en nuestro sistema nos encontraremos un aluvión de intentos de usarlo como open-relay: quieren usarnos como retransmisores de correo basura. El procurar que esto no suceda es NUESTRA RESPONSABILIDAD. Por ello debemos procurar tomas todas las medidas a nuestro alcance para evitarlo. Lo de menos es ser receptores de spam. Lo que debemos procurar es que nuestro servidor no sea un zombi que rápidamente sea incluido en las listas negras como productor de correo no deseado. Aquí vamos a comentar medidas al nivel smtp, que nos dará problemas, pues mi postfix ha rechazado mensajes de servidores mal configurados (por ejemplo, del servicio técnico de empresas que se dedican a productos para redes) al aplicarle las restricciones. Señalo que, por supuesto, he pasado el test de ORDB.org y comprobado que no somos un open-relay.

Vamos a dar soporte a nuestro servidor para SASL (método de autenticación) y TLS (cifrado e integridad para los correos). Esto permitiría usar nuestro Servidor de Correo por aquellos clientes que se identifican mediante un usuario+contraseña ante el servidor smtp y, además, conseguir que tanto esa identificación como toda la comunicación se realice cifrada. Lo he añadido como una capacidad más, pero teniendo en cuenta que lo que pretendemos es dar un servicio de CorreoWeb, no es necesario para resolver el problema de la itinerancia.

Esto se ha realizado siguiendo instrucciones que podemos encontrar en la propia web de mandriva.

A instalar:

# urpmi cyrus-sasl libsasl2 libsasl2-devel libsasl2-plug-plain libsasl2-plug-anonymous libsasl2-plug-crammd5 libsasl2-plug-digestmd5 libsasl2-plug-gssapi libsasl2-plug-login

Bien. Para gestionar los usuarios y las contraseñas hay muchas formas: usando bases de datos mysql, usando el método auxprop (con el que cyrus-sasl mantiene un archivo independiente) y saslauth (se usarán las cuentas del sistema Linux). Este método es el más inseguro y sólo sirve para pocos usuarios. Es precisamente el que vamos a usar porque es el más simple. Y porque tendremos pocos usuarios, no tendrán acceso a la shell, no podrán iniciar sesión y sólo se podrán conectar remotamente vía ssh desde determinados puestos de la intranet... buff esto ya mejora algo la seguridad. De todas formas, estoy pensando lo de implementar en el futuro el uso de mysql.

# cat /etc/postfix/sasl/smtpd.conf
mech_list: plain login
pwcheck_method: saslauthd
saslauthd_path: /var/lib/sasl2/mux

Ahora vamos a utilizar ssl para crear los certificados y poder exigir autenticación tls ante el servidor smtp (postfix) para conectarse a él:

# mkdir /etc/postfix/ssl
# cd /etc/postfix/ssl

# openssl genrsa -des3 -rand /etc/hosts -out smtpd.key 1024
........................
Enter pass phrase for smtpd.key:
Verifying - Enter pass phrase for smtpd.key:

# chmod 600 smtpd.key

# openssl req -new -key smtpd.key -out smtpd.csr
Enter pass phrase for smtpd.key:
........................
Country Name (2 letter code) [AU]:ES
State or Province Name (full name) [Some-State]:Andalucia
Locality Name (eg, city) []:Bollullos del Condado
Organization Name (eg, company) [Internet Widgits Pty Ltd]:IES Delgado Hernández
Organizational Unit Name (eg, section) []:IES Delgado Hernández
Common Name (eg, YOUR name) []:web.iesdelgadohernandez.es
Email Address []:root@iesdelgadohernandez.es
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

# openssl x509 -req -days 3650 -in smtpd.csr -signkey smtpd.key -out smtpd.crt
.........................
Enter pass phrase for smtpd.key:

# openssl rsa -in smtpd.key -out smtpd.key.unencripted
Enter pass phrase for smtpd.key:
writing RSA key

# mv -f smtpd.keyunencripted smtpd.key

# openssl req -new -x509 -extensions v3_ca -keyout cakey.pem -out cacert.pem -days 3650
.........................
Country Name (2 letter code) [AU]:ES
State or Province Name (full name) [Some-State]:Andalucia
Locality Name (eg, city) []:Bollullos del Condado
Organization Name (eg, company) [Internet Widgits Pty Ltd]:IES Delgado Hernández
Organizational Unit Name (eg, section) []:IES Delgado Hernández
Common Name (eg, YOUR name) []:web.iesdelgadohernandez.es
Email Address []:root@iesdelgadohernandez.es

Veamos lo que añadimos ahora a /etc/postfix/main.cf. Observa las medidas anti UBE:

# SASL = "Simple Authentication and Security Layer" o "Capa de Simple de autenticación y seguridad".
# Esto es un método para añadir soporte autenticación a SMTP
smtpd_sasl_path = /etc/postfix/sasl:/usr/lib/sasl2
#smtp_sasl_auth_enable = yes
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
# TLS
smtp_use_tls = yes
smtp_tls_note_starttls_offer = yes
smtpd_use_tls = yes
smtpd_tls_auth_only = yes
smtpd_tls_key_file = /etc/postfix/ssl/smtpd.key
smtpd_tls_cert_file = /etc/postfix/ssl/smtpd.crt
smtpd_tls_CAfile = /etc/postfix/ssl/cacert.pem
smtpd_tls_loglevel = 1
smtpd_tls_receveid_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom
# CONTROL DEL CORREO ENTRANTE / SALIENTE
# INCLUYE MANEJO DE SAPAM, LISTAS NEGRAS Y RESTRICCIONES EN HELO
# EXIGIMOS HELO Y CUMPLIMIENTO DE LA NORMA RFC821:
smtpd_helo_required = yes
strict_rfc821_envelopes = yes
# RESTRICCIONES
# smtpd_client_restrictions =
# permit_sasl_authenticated,
# permit_mynetworks,
# reject_unknown_client

# smtpd_helo_restrictions =
# reject_invalid_hostname,
# reject_unknown_hostname,
# reject_non_fqdn_hostname

smtpd_sender_restrictions=
check_sender_access hash:/etc/postfix/lista_blanca

smtpd_recipient_restrictions =
reject_invalid_hostname,
reject_non_fqdn_hostname,
reject_non_fqdn_sender,
reject_unknown_sender_domain,
reject_unknown_recipient_domain,
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
reject_rbl_client relays.ordb.org

#Otras posibles listas opm.blitzed.org, list.dsbl.org, sbl.spamhaus.org, relays.mail-abuse.org, cbl.abuseat.org
Reinicio y comprobación:

# /etc/init.d/postfix restart Terminando postfix: [ OK ]
Iniciando postfix: [ OK ]
# /etc/init.d/saslauthd restart
saslauthd no está corriendo
Iniciando saslauthd [ OK ]
Creando enlace duro desde /var/lib/sasl2/mux a /var/spool/postfix/var/lib/sasl2/

Importante esto último: como postfix está enjaulado, se crea ese enlace duro para que pueda autenticar. Nosotros no debemos hacer nada al respecto. Al cerrarse el sistema se borrará y al iniciarse se creará automáticamente

Sabremos que tenemos el soporte TLS porque ahora al conectarnos al sistema apararecerá starttls:

# telnet localhost 25
Trying 127.0.0.1...
Connected to web.iesdelgadohernandez.es (127.0.0.1).
Escape character is '^]'.
220 web.iesdelgadohernandez.es ESMTP Postfix (2.2.5) (Mandriva Linux)
ehlo localhost
250-web.iesdelgadohernandez.es
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250 8BITMIME
quit
221 Bye
Connection closed by foreign host.

No aparece nada sobre AUTH porque hemos señalado smtpd_tsl_auth_only = yes. Si hubiésemos aceptado comunicación sin exigir tls, colocando smtpd_tsl_auth_only = no entonces aparecería lo que sigue. Obsérvese como la autenticación aparece después de starttls. La autenticación se realiza a través de texto plano en claro, pero no hay problema pues la comunicación ya va encriptada por tls:

# telnet localhost 25
Trying 127.0.0.1...
Connected to web.iesdelgadohernandez.es (127.0.0.1).
Escape character is '^]'.
220 web.iesdelgadohernandez.es ESMTP Postfix (2.2.5) (Mandriva Linux)
ehlo localhost
250-web.iesdelgadohernandez.es
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250 8BITMIME
quit
221 Bye
Connection closed by foreign host.

Veamos si hay errores o advertencias:

# cat /var/log/mail/errors
# cat /var/log/mail/warnings

Nada de nada. Todo parece correcto.
Puertos

Ya hemos repetido unas cien veces que la conexión a un servidor smtp se realiza por defecto a través del puerto 25. Asegurémosnos de que éste está abierto en nuestro cortafuegos si queremos que se acceda a nuestro Servidor de Correo desde el exterior. Porque hasta ahora está listo para enviar correos, pero no para recibirlos.

lunes, 19 de abril de 2010

Tutorial: Como instalar un completo servidor de correo con Ubuntu Parte I

Una vez hemos instalado el sistema operativo que estara en nuestro servidor, procemos a la instalación de nuestro servidor DNS, en Ubuntu es tan facil como ejecutar el siguiente comando:

sudo apt-get install bind9

Una vez hemos instalado nuestro servidor DNS, vamos al archivo de configuracion y creamos la zona para nuestro dominio, en nuestro caso, por estar usando bind, ejecutamos el siguiente comando:

sudo nano /etc/bind/named.conf

y luego configuramos nuestra zona de la siguiente forma:

zone "midominio.com" {
type master;
file "/var/cache/bind/midominio.com.db";
};

Y luego nos vamos al archivo que contiene nuestros respectivos registros para la nueva zone recien creada:

sudo nano /var/cache/bind/midominio.com.db

$TTL 86400
@ IN SOA ns0.midominio.com. root.midominio.com. (
; dmn [midominio.com] timestamp BEGIN.
200807193 ; Serial 19/07/08 #3
;dmn [midominio.com] timestamp END.
28800 ; Refresh 8h
7200 ; Retry
604800 ; Expire 7d
86400 ) ; Minimun: Id
;En el SOA no hace falta el TTL porque lo coge del $TTL
;
IN NS ns0.midominio.com.
IN MX 10 mail.midominio.com.
; Nos podemos ahorrar el midominio.com porque al no poner el punto final se añade el origen
midominio.com. IN A 201.x.x.x
ns0 IN A 201.x.x.x
mail IN A 201.x.x.x
www CNAME midominio.com. ;para que acepte www.midominio.com
ftp CNAME midominio.com.

Una vez hemos definido el archivo anterior, presionamos ctrl + o para guardar y ctrl + x para salir. Luego procedemos a reiniciar nuestro servidor demonio de DNS con el siguiente comando:

sudo service bind9 restart

Si todo ha ido bien tendremos ahora nuestro servidor DNS resolviendo correctamente nuestro dominio, para comprobarlo podemos hacerlo mediante el comando dig o verificar que no aparezcan errores en los logs del sistema.

La comprobacion con el comando dig se hace de la siguiente forma:

dig @201.x.x.x midominio.com ANY

Este comando debe de devolvernos todos los registros como los definimos en el archivo /var/cache/bind/midominio.com.db.

Hasta este punto ya tenemos configurado correctamente nuestro servidor DNS, caba aclarar que la ip 201.x.x.x se debe de sustituir por sus respectiva IP publica. En la próxima parte de este tutorial continuaremos con la instalacion de postfix, mysql, etc.

Extraido de
http://elblogdedarkness51.blogspot.com/search/label/postfixadmin

Tutorial: Como instalar un completo servidor de correo con Ubuntu Parte II

Luego de instalar nuestro servidor dns y tenerlo funcionando, vamos a instalar postfix y postfixadmin para poder comenzar a configurarlo de la siguiente forma:

sudo apt-get install postfix postfix-mysql mysql-server php5 php5-mysql php5-imap apache2
NOTA: cuando instalemos postfix se nos pedire que elijamos un tipo de configuración, nosotros seleccionaremos la que esta por defecto y luego la personalizaremos a nuestro gusto.
Una vez la instalación de los paquetes que hemos instalado en el paso anterior descargamos el postfixadmin para poder administrar nuestros dominios y cuentas virtuales. Entramos a la consola y ejecutamos el siguiente comando:
wget http://sourceforge.net/projects/postfixadmin/files/postfixadmin/postfixadmin-2.3rc7/postfixadmin_2.3rc7.tar.gz/download
Cuando la descarga termine, descomprimimos el archivo con el siguiente comando:

tar -xzvf postfixadmin_2.3rc7.tar.gz
Luego de descomprimir, copiamos el contenido de la carpeta a nuestro directorio /var/www/ de la siguiente forma: sudo cp -r postixadmin_2.3rc7 /var/www/postfixadmin y una vez finalizada la copia de la carpeta, procederemos a crear la base de datos que utilizaremos para almacenar las configuraciones de postfix y de los buzones.

CREATE DATABASE postfix;
CREATE USER 'postfix'@'localhost' IDENTIFIED BY 'choose_a_password';
GRANT ALL PRIVILEGES ON `postfix` . * TO 'postfix'@'localhost';
Para personalizar las lineas anteriores, cambiamos el usuario postfix por el que sea de nuestro gusto y 'choose_a_password' por la clave que nosotros queramos.

Una vez creado nuestro usuario y clave de la base de datos, necesitamos editar el archivo de configuración de nuestro postfixadmin de la siguiente forma:

sudo nano /var/www/postfixadmin/config.inc.php
Vamos a editar solamente algunos valores del archivo de configuración para dejarlos correctamente:

$CONF['configured'] = true;
$CONF['database_user'] = 'postfix';
$CONF['database_password'] = 'postfixadmin';
$CONF['database_name'] = 'postfix';

Con esos parámetros de configuración adaptados a nuestras necesidades, entramos a nuestro navegador web y nos vamos a la siguiente url:

http://localhost/postfixadmin/setup.php
Una vez dentro de la url anterior, el script de php ejecuta una seria de comprobaciones y al final, nos pide una clave que tendremos que colocar en el archivo config.inc.php. Yo utilizare alpha, como clave para mi instalación en mi equipo. Luego de introducir el password, el script nos indica que debemos de editar una lista dentro de config.inc.php y dejarlo de la siguiente forma:

$CONF['setup_password'] = '43b8e22909f84f6aa40d694327a631de:69d321a19d4e74eed5d6081403acb552cf8c1b24';
Procedemos a editar el archivo de configuración y luego de eso volvemos al navegador para crear nuestro usuario administrador del postfixadmin.
En la creación del administrador, se nos solicitara el password de instalación, asi que es importante editar el archivo config.inc.php y luego crear el usuario administrador de los dominio.
Posteriormente a los pasos anteriores, podemos comenzar a crear dominios virtuales y buzones de correo, aunque es preferible terminar la configuración de postfix antes de hacer cualquiera de esas cosas.



Extraido de
http://elblogdedarkness51.blogspot.com/2009/09/tutorial-como-instalar-un-completo.html

viernes, 16 de abril de 2010

Shell

UNIDAD 1 - INTRODUCCION



* INTRODUCCIÓN A SHELL PROGRAMMING

* Como escribir un Shell

* VARIABLES

* Variables del sistema – Creadas y mantenidas por el propio Linux.

* Variables del sistema

* Variables definidas por el usuario – Creadas y mantenidas por el usuario.

* Reglas de nombres de variables

* Opciones

* SHELL EXPRESIONES ARITMÉTICAS

* Parámetros de sustitución

* EXIT STATUS

* La variable READ

* Mas comandos en una sola línea.

* Procesamiento de la linea de comandos

* Por qué la línea de comandos requiere argumentos

* REDIRECCIÓN DEL STANDARD OUTPUT/INPUT

* El símbolo >

* El simbolo >>

* El simbolo <

* PIPES





FILTROS



* FILTROS - BÁSICOS

* Grep

* Tail

* Sort

* Tr

* Comm

* FILTROS - AVANZADOS

* Grep

* Egrep o grep -E y fgrep o grep -F





PROCESOS



* ¿QUE ES UN PROCESO?

* Comandos Linux relacionados con Procesos

* ESTRUCTURAS DE LENGUAJE BASH





PROGRAMACIÓN



* CONDICIONANTES (IF, TEST)

* IF...ELSE...FI ANIDADOS

* IF-THEN-ELSE MULTINIVEL

* Test

* BUCLES EN SHELL SCRIPTS

* Bucle while

* CASE

* EL COMANDO SHIFT

* DEBUGGING SHELL SCRIPTS





SHELL AVANZADO



* COMANDO EXPORT

* EJECUCIÓN CONDICIONAL (&& Y ||)

* FUNCIONES

* INTERFACE DE USUARIO

* Dialog

* COMANDO TRAP



-------------------------------------------------------------------------------





En la actualidad existen varios tipos de shell, las cuales serian las siguientes.



* Bash, llamada por sus siglas, Bourne Again SHell

* Sh, que viene de Bourne Shell

* Ksh, de las palabras Korn SHell

* Csh, de C Shell

* Ash, que viene siendo un clon al Bash



Para saber que tipo de Shell estamos usando abriremos una terminal o consola en linux, y escribiremos lo siguiente.



echo $SHELL



Para cambiar el tipo de Shell que se esta usando es con el comando



chsh


--------------------------------------------------------------------------------------

-----------------------------------------

#!/bin/sh
# Este script conecta a servidores por ssh
clear
echo "Loguaer server por ssh"
sshpass -p 'srv$server$' ssh root@192.168.131.35
--------------------------------------------------------

clear
echo “MENU”
echo “====”
echo “1. SSH Dns Ftp Proxy .”
echo “2. SSH Gateway .”
echo “3. MYSQL PHP .”
echo “4. Egroupware.”
echo “5. Firewall .”
echo “6. Obtener Password.”
echo “Elige opción”
read entrada1
case $entrada1 in
1)
/home/mnigro/35.sh
;;
2)
/home/mnigro/90.sh
;;
3)
/home/mnigro/37.sh
;;
4)
/home/mnigro/36.sh
;;
5)
/home/mnigro/sshglobal.sh
;;
6)
/home/mnigro/pass.sh
;;
esac

-----------------------------------------------------------------------------------------
El comando clear (primera linea), limpia la pantalla. El

comando “echo” muestra lo que escribamos a continuación entre comillas dobles.

el comando “read”.

Este, lee la respuesta del usuario, y la guarda como la variable: entrada1

estructura “case”. Esta, permite realizar de una forma bastante sencilla, varios if anidados. La

estructura if fi, consiste en evaluar condiciones: “si tal cosa es de tal forma, entonces haz esto.

En caso contrario esto otro”. Mediante “case” nos ahorramos bastante texto. La sintaxis es la

que se puede ver en el ejemplo. Empieza por case “$variable” in. Luego, en la siguiente linea:

1) Es para referirse al valor: 1 , que en este caso es “iniciar Kde”. El resto son las entradas para

los demás escritorios. Cada una de ellas termina obligatoriamente con los caracteres: ;;

Finalmente, para cerrar la estructura se escribe: esac, que no es otra cosa sino case, escrito al

revés.

-----------------------------------------------------------------------------
#!/bin/bash

clear

echo "Bienvenidos a GnuTrivial."

sleep 2

echo "Soy el típico juego de preguntas y respuestas."

sleep 2

echo "Si aciertas todas las preguntas, te concedere el titulo de magister del universo."

echo "¿Como se llamaba el ultimo emperador Romano de occidente, claudio, teodosio

o romulo."

read respuesta1

if test $respuesta1 = romulo

then

echo "Respuesta correcta."

else

echo "Lo siento, la respuesta correcta es: romulo."

fi

sleep 2

echo "Pasemos a la siguiente pregunta. ¿Qué célebre filosofo Griego tuvó por discipulo

a Alejandro Magno, platón, aristoteles o zenon?"

read respuesta2

if test $respuesta2 = aristoteles

then

echo "respuesta correcta."

else

echo "Lo siento, la respuesta correcta es: Aristoteles."

fi

if test $respuesta1 = romulo

test $respuesta2 = aristoteles

then

echo "Eres un pequeño magister del universo."

fi



if fi. El programa conoce la respuesta correcta y evalúa la respuesta del usuario. Si

acierta una pregunta se lo dice y pasa con la siguiente pregunta.


Como puede apreciarse, la estructura if fi, y la estructura case hacen cosas bastante similares.

Llevan a cabo una acción en función de un valor del usuario. En general, case se considera una

evolución de if fi

martes, 6 de abril de 2010

dig Linux DNS consultas

El comando dig (Domain Information Groper) permite realizar consultas a los servidores DNS, por lo que es muy útil para comprobar si el DNS está correctamente configurado en nuestra máquina. Permite comprobar tanto el mapeo de nombres a IPs como el mapeo inverso de IPs a nombres, pero sólo sirve para Internet, ya que no mira en /etc/hosts (sólo utiliza /etc/resolv.conf). Su sintaxis es:

$ dig [@servidor_dns] [opciones] [tipo]

* [@servidor_dns]: nombre o IP del servidor DNS al que queremos dirigir nuestra consulta, por ejemplo @dns1.nrc.ca. Si no especificamos este parámetro, utilizará los servidores DNS listados en /etc/resolv.conf
* : nombre de dominio cuya IP queremos resolver.
* [tipo]: tipo de consulta. Valores posibles:
o A: IP del servidor que aloja al dominio (por defecto).
o NS: servidores DNS.
o MX: servidores de correo.
o ANY: todas las anteriores.
o AAAA: IP en IPv6 (si tiene).

Veamos cómo utilizar dig:

* mapeo de nombres a IPs
o si probamos con localhost no lo encuentra: no mira en /etc/hosts, consulta a los DNS del ISP y allí no la conocen:

$ dig localhost
;; ANSWER: 0

o lo mismo ocurre con la propia máquina, pc350, o con cualquier otra máquina de la red.
o si probamos con telefonica.net consulta a los DNS del ISP y la encuentra:

$ dig telefonica.net
;; ANSWER SECTION:
telefonica.net. 10356 IN A 213.4.130.95

* mapeo inverso de IPs a nombres
o si probamos con 127.0.0.1 consulta a los DNS del ISP y encuentra localhost:

$ dig -x 127.0.0.1
;; ANSWER SECTION:
1.0.0.127.in-addr.arpa. 0 IN PTR localhost.

o si probamos con una dirección de la red local, 192.168.0.5, consulta a los DNS del ISP y no lo encuentra:

$ dig -x 192.168.0.5
;; ANSWER: 0

o si probamos con una IP de Internet, como 213.4.130.95, consulta los DNS del ISP y la encuentra:

$ dig -x 213.4.130.95
;; ANSWER SECTION:
95.130.4.213.in-addr.arpa. 60809 IN PTR www.telefonica.net.

* servidores DNS de un dominio: para saber dónde están los servidores DNS de un dominio (por ejemplo, telefonica.net) haremos:

$ dig telefonica.net. ns
;; ANSWER SECTION:
telefonica.net. 28800 IN NS dns2.terra.es.
telefonica.net. 28800 IN NS dns1.terra.es.
;; ADDITIONAL SECTION:
dns2.terra.es. 28714 IN A 213.4.141.1
dns1.terra.es. 28714 IN A 213.4.132.1

lunes, 5 de abril de 2010

MANUAL CURSOS LINUX

http://www.isftic.mepsyd.es/formacion/materiales/85/cd/REDES_LINUX/indice.htm