lunes, 17 de noviembre de 2014

Comandos Linux a tope!!!

Información del sistema

  1. arch: mostrar la arquitectura de la máquina (1).
  2. uname -m: mostrar la arquitectura de la máquina (2).
  3. uname -r: mostrar la versión del kernel usado.
  4. dmidecode -q: mostrar los componentes (hardware) del sistema.
  5. hdparm -i /dev/hda: mostrar las características de un disco duro.
  6. hdparm -tT /dev/sda: realizar prueba de lectura en un disco duro.
  7. cat /proc/cpuinfo: mostrar información de la CPU.
  8. cat /proc/interrupts: mostrar las interrupciones.
  9. cat /proc/meminfo: verificar el uso de memoria.
  10. cat /proc/swaps: mostrar ficheros swap.
  11. cat /proc/version: mostrar la versión del kernel.
  12. cat /proc/net/dev: mostrar adaptadores de red y estadísticas.
  13. cat /proc/mounts: mostrar el sistema de ficheros montado.
  14. lspci -tv: mostrar los dispositivos PCI.
  15. lsusb -tv: mostrar los dispositivos USB.
  16. date: mostrar la fecha del sistema.
  17. cal 2011: mostrar el almanaque de 2011.
  18. cal 07 2011: mostrar el almanaque para el mes julio de 2011.
  19. date 041217002011.00: colocar (declarar, ajustar) fecha y hora.
  20. clock -w: guardar los cambios de fecha en la BIOS.

Apagar (Reiniciar Sistema o Cerrar Sesión)

  1. shutdown -h now: apagar el sistema (1).
  2. init 0: apagar el sistema (2).
  3. telinit 0: apagar el sistema (3).
  4. halt: apagar el sistema (4).
  5. shutdown -h hours:minutes &: apagado planificado del sistema.
  6. shutdown -c: cancelar un apagado planificado del sistema.
  7. shutdown -r now: reiniciar (1).
  8. reboot: reiniciar (2).
  9. logout: cerrar sesión.

Archivos y Directorios

  1. cd /home: entrar en el directorio “home”.
  2. cd ..: retroceder un nivel.
  3. cd ../..: retroceder 2 niveles.
  4. cd: ir al directorio raíz.
  5. cd ~user1: ir al directorio user1.
  6. cd -: ir (regresar) al directorio anterior.
  7. pwd: mostrar el camino del directorio de trabajo.
  8. ls: ver los ficheros de un directorio.
  9. ls -F: ver los ficheros de un directorio.
  10. ls -l: mostrar los detalles de ficheros y carpetas de un directorio.
  11. ls -a: mostrar los ficheros ocultos.
  12. ls *[0-9]*: mostrar los ficheros y carpetas que contienen números.
  13. tree: mostrar los ficheros y carpetas en forma de árbol comenzando por la raíz.(1)
  14. lstree: mostrar los ficheros y carpetas en forma de árbol comenzando por la raíz.(2)
  15. mkdir dir1: crear una carpeta o directorio con nombre ‘dir1′.
  16. mkdir dir1 dir2: crear dos carpetas o directorios simultáneamente (Crear dos directorios a la vez).
  17. mkdir -p /tmp/dir1/dir2: crear un árbol de directorios.
  18. rm -f file1: borrar el fichero llamado ‘file1′.
  19. rmdir dir1: borrar la carpeta llamada ‘dir1′.
  20. rm -rf dir1: eliminar una carpeta llamada ‘dir1′ con su contenido de forma recursiva. (Si lo borro recursivo estoy diciendo que es con su contenido).
  21. rm -rf dir1 dir2: borrar dos carpetas (directorios) con su contenido de forma recursiva.
  22. mv dir1 new_dir: renombrar o mover un fichero o carpeta (directorio).
  23. cp file1: copiar un fichero.
  24. cp file1 file2: copiar dos ficheros al unísono.
  25. cp dir /* .: copiar todos los ficheros de un directorio dentro del directorio de trabajo actual.
  26. cp -a /tmp/dir1 .: copiar un directorio dentro del directorio actual de trabajo.
  27. cp -a dir1: copiar un directorio.
  28. cp -a dir1 dir2: copiar dos directorio al unísono.
  29. ln -s file1 lnk1: crear un enlace simbólico al fichero o directorio.
  30. ln file1 lnk1: crear un enlace físico al fichero o directorio.
  31. touch -t 0712250000 file1: modificar el tiempo real (tiempo de creación) de un fichero o directorio.
  32. file file1: salida (volcado en pantalla) del tipo mime de un fichero texto.
  33. iconv -l: listas de cifrados conocidos.
  34. iconv -f fromEncoding -t toEncoding inputFile > outputFile: crea una nueva forma del fichero de entrada asumiendo que está codificado en fromEncoding y convirtiéndolo a ToEncoding.
  35. find . -maxdepth 1 -name *.jpg -print -exec convert ”{}” -resize 80×60 “thumbs/{}” \;: agrupar ficheros redimensionados en el directorio actual y enviarlos a directorios en vistas de miniaturas (requiere convertir desde ImagemagicK).

Encontrar archivos

  1. find / -name file1: buscar fichero y directorio a partir de la raíz del sistema.
  2. find / -user user1: buscar ficheros y directorios pertenecientes al usuario ‘user1′.
  3. find /home/user1 -name \*.bin: buscar ficheros con extensión ‘. bin’ dentro del directorio ‘/ home/user1′.
  4. find /usr/bin -type f -atime +100: buscar ficheros binarios no usados en los últimos 100 días.
  5. find /usr/bin -type f -mtime -10: buscar ficheros creados o cambiados dentro de los últimos 10 días.
  6. find / -name \*.rpm -exec chmod 755 ‘{}’ \;: buscar ficheros con extensión ‘.rpm’ y modificar permisos.
  7. find / -xdev -name \*.rpm: Buscar ficheros con extensión ‘.rpm’ ignorando los dispositivos removibles como cdrom, pen-drive, etc.…
  8. locate \*.ps: encuentra ficheros con extensión ‘.ps’ ejecutados primeramente con el command ‘updatedb’.
  9. whereis halt: mostrar la ubicación de un fichero binario, de ayuda o fuente. En este caso pregunta dónde está el comando ‘halt’.
  10. which halt: mostrar la senda completa (el camino completo) a un binario / ejecutable.

Montando un sistema de ficheros

  1. mount /dev/hda2 /mnt/hda2: montar un disco llamado hda2. Verifique primero la existencia del directorio ‘/ mnt/hda2′; si no está, debe crearlo.
  2. umount /dev/hda2: desmontar un disco llamado hda2. Salir primero desde el punto ‘/ mnt/hda2.
  3. fuser -km /mnt/hda2: forzar el desmontaje cuando el dispositivo está ocupado.
  4. umount -n /mnt/hda2: correr el desmontaje sin leer el fichero /etc/mtab. Útil cuando el fichero es de solo lectura o el disco duro está lleno.
  5. mount /dev/fd0 /mnt/floppy: montar un disco flexible (floppy).
  6. mount /dev/cdrom /mnt/cdrom: montar un cdrom / dvdrom.
  7. mount /dev/hdc /mnt/cdrecorder: montar un cd regrabable o un dvdrom.
  8. mount /dev/hdb /mnt/cdrecorder: montar un cd regrabable / dvdrom (un dvd).
  9. mount -o loop file.iso /mnt/cdrom: montar un fichero o una imagen iso.
  10. mount -t vfat /dev/hda5 /mnt/hda5: montar un sistema de ficheros FAT32.
  11. mount /dev/sda1 /mnt/usbdisk: montar un usb pen-drive o una memoria (sin especificar el tipo de sistema de ficheros).

Espacio de Disco

  1. df -h: mostrar una lista de las particiones montadas.
  2. ls -lSr |more: mostrar el tamaño de los ficheros y directorios ordenados por tamaño.
  3. du -sh dir1: Estimar el espacio usado por el directorio ‘dir1′.
  4. du -sk * | sort -rn: mostrar el tamaño de los ficheros y directorios ordenados por tamaño.
  5. rpm -q -a –qf ‘%10{SIZE}t%{NAME}n’ | sort -k1,1n: mostrar el espacio usado por los paquetes rpm instalados organizados por tamaño (Fedora, Redhat y otros).
  6. dpkg-query -W -f=’${Installed-Size;10}t${Package}n’ | sort -k1,1n: mostrar el espacio usado por los paquetes instalados, organizados por tamaño (Ubuntu, Debian y otros).

Usuarios y Grupos

  1. groupadd nombre_del_grupo: crear un nuevo grupo.
  2. groupdel nombre_del_grupo: borrar un grupo.
  3. groupmod -n nuevo_nombre_del_grupo viejo_nombre_del_grupo: renombrar un grupo.
  4. useradd -c “Name Surname ” -g admin -d /home/user1 -s /bin/bash user1: Crear un nuevo usuario perteneciente al grupo “admin”.
  5. useradd user1: crear un nuevo usuario.
  6. userdel -r user1: borrar un usuario (‘-r’ elimina el directorio Home).
  7. usermod -c “User FTP” -g system -d /ftp/user1 -s /bin/nologin user1: cambiar los atributos del usuario.
  8. passwd: cambiar contraseña.
  9. passwd user1: cambiar la contraseña de un usuario (solamente por root).
  10. chage -E 2011-12-31 user1: colocar un plazo para la contraseña del usuario. En este caso dice que la clave expira el 31 de diciembre de 2011.
  11. pwck: chequear la sintaxis correcta el formato de fichero de ‘/etc/passwd’ y la existencia de usuarios.
  12. grpck: chequear la sintaxis correcta y el formato del fichero ‘/etc/group’ y la existencia de grupos.
  13. newgrp group_name: registra a un nuevo grupo para cambiar el grupo predeterminado de los ficheros creados recientemente.

Permisos en Ficheros (Usa ”+” para colocar permisos y ”-” para eliminar)

  1. ls -lh: Mostrar permisos.
  2. ls /tmp | pr -T5 -W$COLUMNS: dividir la terminal en 5 columnas.
  3. chmod ugo+rwx directory1: colocar permisos de lectura ®, escritura (w) y ejecución(x) al propietario (u), al grupo (g) y a otros (o) sobre el directorio ‘directory1′.
  4. chmod go-rwx directory1: quitar permiso de lectura ®, escritura (w) y (x) ejecución al grupo (g) y otros (o) sobre el directorio ‘directory1′.
  5. chown user1 file1: cambiar el dueño de un fichero.
  6. chown -R user1 directory1: cambiar el propietario de un directorio y de todos los ficheros y directorios contenidos dentro.
  7. chgrp group1 file1: cambiar grupo de ficheros.
  8. chown user1:group1 file1: cambiar usuario y el grupo propietario de un fichero.
  9. find / -perm -u+s: visualizar todos los ficheros del sistema con SUID configurado.
  10. chmod u+s /bin/file1: colocar el bit SUID en un fichero binario. El usuario que corriendo ese fichero adquiere los mismos privilegios como dueño.
  11. chmod u-s /bin/file1: deshabilitar el bit SUID en un fichero binario.
  12. chmod g+s /home/public: colocar un bit SGID en un directorio –similar al SUID pero por directorio.
  13. chmod g-s /home/public: desabilitar un bit SGID en un directorio.
  14. chmod o+t /home/public: colocar un bit STIKY en un directorio. Permite el borrado de ficheros solamente a los dueños legítimos.
  15. chmod o-t /home/public: desabilitar un bit STIKY en un directorio.

Atributos especiales en ficheros (Usa ”+” para colocar permisos y ”-” para eliminar)

  1. chattr +a file1: permite escribir abriendo un fichero solamente modo append.
  2. chattr +c file1: permite que un fichero sea comprimido / descomprimido automaticamente.
  3. chattr +d file1: asegura que el programa ignore borrar los ficheros durante la copia de seguridad.
  4. chattr +i file1: convierte el fichero en invariable, por lo que no puede ser eliminado, alterado, renombrado, ni enlazado.
  5. chattr +s file1: permite que un fichero sea borrado de forma segura.
  6. chattr +S file1: asegura que un fichero sea modificado, los cambios son escritos en modo synchronous como con sync.
  7. chattr +u file1: te permite recuperar el contenido de un fichero aún si este está cancelado.
  8. lsattr: mostrar atributos especiales.

Archivos y Ficheros comprimidos

  1. bunzip2 file1.bz2: descomprime in fichero llamado ‘file1.bz2′.
  2. bzip2 file1: comprime un fichero llamado ‘file1′.
  3. gunzip file1.gz: descomprime un fichero llamado ‘file1.gz’.
  4. gzip file1: comprime un fichero llamado ‘file1′.
  5. gzip -9 file1: comprime con compresión máxima.
  6. rar a file1.rar test_file: crear un fichero rar llamado ‘file1.rar’.
  7. rar a file1.rar file1 file2 dir1: comprimir ‘file1′, ‘file2′ y ‘dir1′ simultáneamente.
  8. rar x file1.rar: descomprimir archivo rar.
  9. unrar x file1.rar: descomprimir archivo rar.
  10. tar -cvf archive.tar file1: crear un tarball descomprimido.
  11. tar -cvf archive.tar file1 file2 dir1: crear un archivo conteniendo ‘file1′, ‘file2′ y’dir1′.
  12. tar -tf archive.tar: mostrar los contenidos de un archivo.
  13. tar -xvf archive.tar: extraer un tarball.
  14. tar -xvf archive.tar -C /tmp: extraer un tarball en / tmp.
  15. tar -cvfj archive.tar.bz2 dir1: crear un tarball comprimido dentro de bzip2.
  16. tar -xvfj archive.tar.bz2: descomprimir un archivo tar comprimido en bzip2
  17. tar -cvfz archive.tar.gz dir1: crear un tarball comprimido en gzip.
  18. tar -xvfz archive.tar.gz: descomprimir un archive tar comprimido en gzip.
  19. zip file1.zip file1: crear un archivo comprimido en zip.
  20. zip -r file1.zip file1 file2 dir1: comprimir, en zip, varios archivos y directorios de forma simultánea.
  21. unzip file1.zip: descomprimir un archivo zip.

Paquetes RPM (Red Hat, Fedora y similares)

  1. rpm -ivh package.rpm: instalar un paquete rpm.
  2. rpm -ivh –nodeeps package.rpm: instalar un paquete rpm ignorando las peticiones de dependencias.
  3. rpm -U package.rpm: actualizar un paquete rpm sin cambiar la configuración de los ficheros.
  4. rpm -F package.rpm: actualizar un paquete rpm solamente si este está instalado.
  5. rpm -e package_name.rpm: eliminar un paquete rpm.
  6. rpm -qa: mostrar todos los paquetes rpm instalados en el sistema.
  7. rpm -qa | grep httpd: mostrar todos los paquetes rpm con el nombre “httpd”.
  8. rpm -qi package_name: obtener información en un paquete específico instalado.
  9. rpm -qg “System Environment/Daemons”: mostar los paquetes rpm de un grupo software.
  10. rpm -ql package_name: mostrar lista de ficheros dados por un paquete rpm instalado.
  11. rpm -qc package_name: mostrar lista de configuración de ficheros dados por un paquete rpm instalado.
  12. rpm -q package_name –whatrequires: mostrar lista de dependencias solicitada para un paquete rpm.
  13. rpm -q package_name –whatprovides: mostar la capacidad dada por un paquete rpm.
  14. rpm -q package_name –scripts: mostrar los scripts comenzados durante la instalación /eliminación.
  15. rpm -q package_name –changelog: mostar el historial de revisions de un paquete rpm.
  16. rpm -qf /etc/httpd/conf/httpd.conf: verificar cuál paquete rpm pertenece a un fichero dado.
  17. rpm -qp package.rpm -l: mostrar lista de ficheros dados por un paquete rpm que aún no ha sido instalado.
  18. rpm –import /media/cdrom/RPM-GPG-KEY: importar la firma digital de la llave pública.
  19. rpm –checksig package.rpm: verificar la integridad de un paquete rpm.
  20. rpm -qa gpg-pubkey: verificar la integridad de todos los paquetes rpm instalados.
  21. rpm -V package_name: chequear el tamaño del fichero, licencias, tipos, dueño, grupo, chequeo de resumen de MD5 y última modificación.
  22. rpm -Va: chequear todos los paquetes rpm instalados en el sistema. Usar con cuidado.
  23. rpm -Vp package.rpm: verificar un paquete rpm no instalado todavía.
  24. rpm2cpio package.rpm | cpio –extract –make-directories *bin*: extraer fichero ejecutable desde un paquete rpm.
  25. rpm -ivh /usr/src/redhat/RPMS/`arch`/package.rpm: instalar un paquete construido desde una fuente rpm.
  26. rpmbuild –rebuild package_name.src.rpm: construir un paquete rpm desde una fuente rpm.

Actualizador de paquetes YUM (Red Hat, Fedora y similares)

  1. yum install package_name: descargar e instalar un paquete rpm.
  2. yum localinstall package_name.rpm: este instalará un RPM y tratará de resolver todas las dependencies para ti, usando tus repositorios.
  3. yum update package_name.rpm: actualizar todos los paquetes rpm instalados en el sistema.
  4. yum update package_name: modernizar / actualizar un paquete rpm.
  5. yum remove package_name: eliminar un paquete rpm.
  6. yum list: listar todos los paquetes instalados en el sistema.
  7. yum search package_name: Encontrar un paquete en repositorio rpm.
  8. yum clean packages: limpiar un caché rpm borrando los paquetes descargados.
  9. yum clean headers: eliminar todos los ficheros de encabezamiento que el sistema usa para resolver la dependencia.
  10. yum clean all: eliminar desde los paquetes caché y ficheros de encabezado.

Paquetes Deb (Debian, Ubuntu y derivados)

  1. dpkg -i package.deb: instalar / actualizar un paquete deb.
  2. dpkg -r package_name: eliminar un paquete deb del sistema.
  3. dpkg -l: mostrar todos los paquetes deb instalados en el sistema.
  4. dpkg -l | grep httpd: mostrar todos los paquetes deb con el nombre “httpd”
  5. dpkg -s package_name: obtener información en un paquete específico instalado en el sistema.
  6. dpkg -L package_name: mostar lista de ficheros dados por un paquete instalado en el sistema.
  7. dpkg –contents package.deb: mostrar lista de ficheros dados por un paquete no instalado todavía.
  8. dpkg -S /bin/ping: verificar cuál paquete pertenece a un fichero dado.

Actualizador de paquetes APT (Debian, Ubuntu y derivados)

  1. apt-get install package_name: instalar / actualizar un paquete deb.
  2. apt-cdrom install package_name: instalar / actualizar un paquete deb desde un cdrom.
  3. apt-get update: actualizar la lista de paquetes.
  4. apt-get upgrade: actualizar todos los paquetes instalados.
  5. apt-get remove package_name: eliminar un paquete deb del sistema.
  6. apt-get check: verificar la correcta resolución de las dependencias.
  7. apt-get clean: limpiar cache desde los paquetes descargados.
  8. apt-cache search searched-package: retorna lista de paquetes que corresponde a la serie «paquetes buscados».

Ver el contenido de un fichero

  1. cat file1: ver los contenidos de un fichero comenzando desde la primera hilera.
  2. tac file1: ver los contenidos de un fichero comenzando desde la última línea.
  3. more file1: ver el contenido a lo largo de un fichero.
  4. less file1: parecido al commando ‘more’ pero permite salvar el movimiento en el fichero así como el movimiento hacia atrás.
  5. head -2 file1: ver las dos primeras líneas de un fichero.
  6. tail -2 file1: ver las dos últimas líneas de un fichero.
  7. tail -f /var/log/messages: ver en tiempo real qué ha sido añadido al fichero.

Manipulación de texto

  1. cat file1 file2 .. | command <> file1_in.txt_or_file1_out.txt: sintaxis general para la manipulación de texto utilizando PIPE, STDIN y STDOUT.
  2. cat file1 | command( sed, grep, awk, grep, etc…) > result.txt: sintaxis general para manipular un texto de un fichero y escribir el resultado en un fichero nuevo.
  3. cat file1 | command( sed, grep, awk, grep, etc…) » result.txt: sintaxis general para manipular un texto de un fichero y añadir resultado en un fichero existente.
  4. grep Aug /var/log/messages: buscar palabras “Aug” en el fichero ‘/var/log/messages’.
  5. grep ^Aug /var/log/messages: buscar palabras que comienzan con “Aug” en fichero ‘/var/log/messages’
  6. grep [0-9] /var/log/messages: seleccionar todas las líneas del fichero ‘/var/log/messages’ que contienen números.
  7. grep Aug -R /var/log/*: buscar la cadena “Aug” en el directorio ‘/var/log’ y debajo.
  8. sed ‘s/stringa1/stringa2/g’ example.txt: reubicar “string1” con “string2” en ejemplo.txt
  9. sed ‘/^$/d’ example.txt: eliminar todas las líneas en blanco desde el ejemplo.txt
  10. sed ‘/ *#/d; /^$/d’ example.txt: eliminar comentarios y líneas en blanco de ejemplo.txt
  11. echo ‘esempio’ | tr ‘[:lower:]‘ ‘[:upper:]‘: convertir minúsculas en mayúsculas.
  12. sed -e ‘1d’ result.txt: elimina la primera línea del fichero ejemplo.txt
  13. sed -n ‘/stringa1/p’: visualizar solamente las líneas que contienen la palabra “string1”.

Establecer caracter y conversión de ficheros

  1. dos2unix filedos.txt fileunix.txt: convertir un formato de fichero texto desde MSDOS a UNIX.
  2. unix2dos fileunix.txt filedos.txt: convertir un formato de fichero de texto desde UNIX a MSDOS.
  3. recode ..HTML < page.txt > page.html: convertir un fichero de texto en html.
  4. recode -l | more: mostrar todas las conversiones de formato disponibles.

Análisis del sistema de ficheros

  1. badblocks -v /dev/hda1: Chequear los bloques defectuosos en el disco hda1.
  2. fsck /dev/hda1: reparar / chequear la integridad del fichero del sistema Linux en el disco hda1.
  3. fsck.ext2 /dev/hda1: reparar / chequear la integridad del fichero del sistema ext 2 en el disco hda1.
  4. e2fsck /dev/hda1: reparar / chequear la integridad del fichero del sistema ext 2 en el disco hda1.
  5. e2fsck -j /dev/hda1: reparar / chequear la integridad del fichero del sistema ext 3 en el disco hda1.
  6. fsck.ext3 /dev/hda1: reparar / chequear la integridad del fichero del sistema ext 3 en el disco hda1.
  7. fsck.vfat /dev/hda1: reparar / chequear la integridad del fichero sistema fat en el disco hda1.
  8. fsck.msdos /dev/hda1: reparar / chequear la integridad de un fichero del sistema dos en el disco hda1.
  9. dosfsck /dev/hda1: reparar / chequear la integridad de un fichero del sistema dos en el disco hda1.

Formatear un sistema de ficheros

  1. mkfs /dev/hda1: crear un fichero de sistema tipo Linux en la partición hda1.
  2. mke2fs /dev/hda1: crear un fichero de sistema tipo Linux ext 2 en hda1.
  3. mke2fs -j /dev/hda1: crear un fichero de sistema tipo Linux ext3 (periódico) en la partición hda1.
  4. mkfs -t vfat 32 -F /dev/hda1: crear un fichero de sistema FAT32 en hda1.
  5. fdformat -n /dev/fd0: formatear un disco flooply.
  6. mkswap /dev/hda3: crear un fichero de sistema swap.

Trabajo con la SWAP

  1. mkswap /dev/hda3: crear fichero de sistema swap.
  2. swapon /dev/hda3: activando una nueva partición swap.
  3. swapon /dev/hda2 /dev/hdb3: activar dos particiones swap.

Salvas (Backup)

  1. dump -0aj -f /tmp/home0.bak /home: hacer una salva completa del directorio ‘/home’.
  2. dump -1aj -f /tmp/home0.bak /home: hacer una salva incremental del directorio ‘/home’.
  3. restore -if /tmp/home0.bak: restaurando una salva interactivamente.
  4. rsync -rogpav –delete /home /tmp: sincronización entre directorios.
  5. rsync -rogpav -e ssh –delete /home ip_address:/tmp: rsync a través del túnelSSH.
  6. rsync -az -e ssh –delete ip_addr:/home/public /home/local: sincronizar un directorio local con un directorio remoto a través de ssh y de compresión.
  7. rsync -az -e ssh –delete /home/local ip_addr:/home/public: sincronizar un directorio remoto con un directorio local a través de ssh y de compresión.
  8. dd bs=1M if=/dev/hda | gzip | ssh user@ip_addr ‘dd of=hda.gz’: hacer una salva de un disco duro en un host remoto a través de ssh.
  9. dd if=/dev/sda of=/tmp/file1: salvar el contenido de un disco duro a un fichero. (En este caso el disco duro es “sda” y el fichero “file1”).
  10. tar -Puf backup.tar /home/user: hacer una salva incremental del directorio ‘/home/user’.
  11. ( cd /tmp/local/ && tar c . ) | ssh -C user@ip_addr ‘cd /home/share/ && tar x -p’: copiar el contenido de un directorio en un directorio remoto a través de ssh.
  12. ( tar c /home ) | ssh -C user@ip_addr ‘cd /home/backup-home && tar x -p’: copiar un directorio local en un directorio remoto a través de ssh.
  13. tar cf – . | (cd /tmp/backup ; tar xf – ): copia local conservando las licencias y enlaces desde un directorio a otro.
  14. find /home/user1 -name ‘*.txt’ | xargs cp -av –target-directory=/home/backup/ –parents: encontrar y copiar todos los ficheros con extensión ‘.txt’ de un directorio a otro.
  15. find /var/log -name ‘*.log’ | tar cv –files-from=- | bzip2 > log.tar.bz2: encontrar todos los ficheros con extensión ‘.log’ y hacer un archivo bzip.
  16. dd if=/dev/hda of=/dev/fd0 bs=512 count=1: hacer una copia del MRB (Master Boot Record) a un disco floppy.
  17. dd if=/dev/fd0 of=/dev/hda bs=512 count=1: restaurar la copia del MBR (Master Boot Record) salvada en un floppy.

CD-ROM

  1. cdrecord -v gracetime=2 dev=/dev/cdrom -eject blank=fast -force: limpiar o borrar un cd regrabable.
  2. mkisofs /dev/cdrom > cd.iso: crear una imagen iso de cdrom en disco.
  3. mkisofs /dev/cdrom | gzip > cd_iso.gz: crear una imagen comprimida iso de cdrom en disco.
  4. mkisofs -J -allow-leading-dots -R -V “Label CD” -iso-level 4 -o ./cd.iso data_cd: crear una imagen iso de un directorio.
  5. cdrecord -v dev=/dev/cdrom cd.iso: quemar una imagen iso.
  6. gzip -dc cd_iso.gz | cdrecord dev=/dev/cdrom -: quemar una imagen iso comprimida.
  7. mount -o loop cd.iso /mnt/iso: montar una imagen iso.
  8. cd-paranoia -B: llevar canciones de un cd a ficheros wav.
  9. cd-paranoia – ”-3”: llevar las 3 primeras canciones de un cd a ficheros wav.
  10. cdrecord –scanbus: escanear bus para identificar el canal scsi.
  11. dd if=/dev/hdc | md5sum: hacer funcionar un md5sum en un dispositivo, como un CD.

Trabajo con la RED ( LAN y Wi-Fi)

  1. ifconfig eth0: mostrar la configuración de una tarjeta de red Ethernet.
  2. ifup eth0: activar una interface ‘eth0′.
  3. ifdown eth0: deshabilitar una interface ‘eth0′.
  4. ifconfig eth0 192.168.1.1 netmask 255.255.255.0: configurar una dirección IP.
  5. ifconfig eth0 promisc: configurar ‘eth0’en modo común para obtener los paquetes (sniffing).
  6. dhclient eth0: activar la interface ‘eth0′ en modo dhcp.
  7. route -n: mostrar mesa de recorrido.
  8. route add -net 0/0 gw IP_Gateway: configurar entrada predeterminada.
  9. route add -net 192.168.0.0 netmask 255.255.0.0 gw 192.168.1.1: configurar ruta estática para buscar la red ‘192.168.0.0/16′.
  10. route del 0/0 gw IP_gateway: eliminar la ruta estática.
  11. echo “1” > /proc/sys/net/ipv4/ip_forward: activar el recorrido ip.
  12. hostname: mostrar el nombre del host del sistema.
  13. host www.example.com: buscar el nombre del host para resolver el nombre a una dirección ip(1).
  14. nslookup www.example.com: buscar el nombre del host para resolver el nombre a una direccióm ip y viceversa(2).
  15. ip link show: mostar el estado de enlace de todas las interfaces.
  16. mii-tool eth0: mostar el estado de enlace de ‘eth0′.
  17. ethtool eth0: mostrar las estadísticas de tarjeta de red ‘eth0′.
  18. netstat -tup: mostrar todas las conexiones de red activas y sus PID.
  19. netstat -tupl: mostrar todos los servicios de escucha de red en el sistema y sus PID.
  20. tcpdump tcp port 80: mostrar todo el tráfico HTTP.
  21. iwlist scan: mostrar las redes inalámbricas.
  22. iwconfig eth1: mostrar la configuración de una tarjeta de red inalámbrica.
  23. whois www.example.com: buscar en base de datos Whois.

Redes de Microsoft Windows (SAMBA)

  1. nbtscan ip_addr: resolución de nombre de red bios.
  2. nmblookup -A ip_addr: resolución de nombre de red bios.
  3. smbclient -L ip_addr/hostname: mostrar acciones remotas de un host en windows.

Tablas IP (CORTAFUEGOS)

  1. iptables -t filter -L: mostrar todas las cadenas de la tabla de filtro.
  2. iptables -t nat -L: mostrar todas las cadenas de la tabla nat.
  3. iptables -t filter -F: limpiar todas las reglas de la tabla de filtro.
  4. iptables -t nat -F: limpiar todas las reglas de la tabla nat.
  5. iptables -t filter -X: borrar cualquier cadena creada por el usuario.
  6. iptables -t filter -A INPUT -p tcp –dport telnet -j ACCEPT: permitir las conexiones telnet para entar.
  7. iptables -t filter -A OUTPUT -p tcp –dport http -j DROP: bloquear las conexiones HTTP para salir.
  8. iptables -t filter -A FORWARD -p tcp –dport pop3 -j ACCEPT: permitir las conexiones POP a una cadena delantera.
  9. iptables -t filter -A INPUT -j LOG –log-prefix “DROP INPUT”: registrando una cadena de entrada.
  10. iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE: configurar un PAT (Puerto de traducción de dirección) en eth0, ocultando los paquetes de salida forzada.
  11. iptables -t nat -A PREROUTING -d 192.168.0.1 -p tcp -m tcp –dport 22 -j DNAT –to-destination 10.0.0.2:22: redireccionar los paquetes diriguidos de un host a otro.

Monitoreando y depurando

  1. top: mostrar las tareas de linux usando la mayoría cpu.
  2. ps -eafw: muestra las tareas Linux.
  3. ps -e -o pid,args –forest: muestra las tareas Linux en un modo jerárquico.
  4. pstree: mostrar un árbol sistema de procesos.
  5. kill -9 ID_Processo: forzar el cierre de un proceso y terminarlo.
  6. kill -1 ID_Processo: forzar un proceso para recargar la configuración.
  7. lsof -p $$: mostrar una lista de ficheros abiertos por procesos.
  8. lsof /home/user1: muestra una lista de ficheros abiertos en un camino dado del sistema.
  9. strace -c ls >/dev/null: mostrar las llamadas del sistema hechas y recibidas por un proceso.
  10. strace -f -e open ls >/dev/null: mostrar las llamadas a la biblioteca.
  11. watch -n1 ‘cat /proc/interrupts’: mostrar interrupciones en tiempo real.
  12. last reboot: mostrar historial de reinicio.
  13. lsmod: mostrar el kernel cargado.
  14. free -m: muestra el estado de la RAM en megabytes.
  15. smartctl -A /dev/hda: monitorear la fiabilidad de un disco duro a través de SMART.
  16. smartctl -i /dev/hda: chequear si SMART está activado en un disco duro.
  17. tail /var/log/dmesg: mostrar eventos inherentes al proceso de carga del kernel.
  18. tail /var/log/messages: mostrar los eventos del sistema.

Otros comandos útiles

  1. apropos …keyword: mostrar una lista de comandos que pertenecen a las palabras claves de un programa; son útiles cuando tú sabes qué hace tu programa, pero de sconoces el nombre del comando.
  2. man ping: mostrar las páginas del manual on-line; por ejemplo, en un comando ping, usar la opción ‘-k’ para encontrar cualquier comando relacionado.
  3. whatis …keyword: muestra la descripción de lo que hace el programa.
  4. mkbootdisk –device /dev/fd0 `uname -r`: crear un floppy boteable.
  5. gpg -c file1: codificar un fichero con guardia de seguridad GNU.
  6. gpg file1.gpg: decodificar un fichero con Guardia de seguridad GNU.
  7. wget -r www.example.com: descargar un sitio web completo.
  8. wget -c www.example.com/file.iso: descargar un fichero con la posibilidad de parar la descargar y reanudar más tarde.
  9. echo ‘wget -c www.example.com/files.iso‘ | at 09:00: Comenzar una descarga a cualquier hora. En este caso empezaría a las 9 horas.
  10. ldd /usr/bin/ssh: mostrar las bibliotecas compartidas requeridas por el programa ssh.
  11. alias hh=’history’: colocar un alias para un commando –hh= Historial.
  12. chsh: cambiar el comando Shell.
  13. chsh –list-shells: es un comando adecuado para saber si tienes que hacer remoto en otra terminal.
  14. who -a: mostrar quien está registrado, e imprimir hora del último sistema de importación, procesos muertos, procesos de registro de sistema, procesos activos producidos por init, funcionamiento actual y últimos cambios del reloj del sistema.

domingo, 16 de noviembre de 2014

Certificados SSL para Apache

Introducción

Origen: Linuxtotal

Imaginémonos a la empresa "Pato, S.A." que ofrece a sus empleados y clientes el sitio http://www.pato.com/consulta, donde mediante un nombre de usuario y contraseña es posible para los empleados consultar saldos, órdenes, resurtir, estados de cuenta, etc. y para los clientes observar el estado de sus pedidos, su saldo, pagos, historial de compras, etc. El sitio esta perfectamente diseñado, protegido contra inyecciones sql, ataques mediante el url, el servidor al día con los últimos parches y actualizaciones, toda entrada de usuario, contraseña, y demás debidamente validadas para solo recibir caracteres válidos y excluir caracteres usados en consultas e instrucciones sql, etc. etc. Una belleza en cuanto a la seguridad de la aplicación Web. PERO, todo el sitio funciona bajo un servidor Web apache en el puerto 80, esta bien, pero implica que un empleado rencoroso porque no le aumentaron el sueldo o no lo promovieron de puesto y con intenciones de querer ser un hacker, instala un sniffer en su PC (dentro de la empresa), baja herramientas para envenenar mediante un ataque arp (arp poisoning) el switch al que corresponde a su segmento red de tal modo que puede observar todo el tráfico de red de los equipos conectados a su switch. Fácil, nada del otro mundo, cualquier chico de los scripts (script kiddie) le hubiera enseñado como hacerlo si no lo hubiese el sabido ya. En unas cuantas horas tiene ya varias cuentas de usuario y contraseñas, se introduce como ellas y baja información confidencial de varios de sus compañeros y como algunos son gerente, también obtiene información sensible de clientes. Listo, ahora a chantajear a la empresa por medio de un cómplice en el exterior o simplemente tratar de utilizar la información en su beneficio o peor aun causar algún tipo de destrozo con esta.
¿Ficción? Absolutamente no. Lo anterior es perfectamente posible porque el tráfico de red generado entre el cliente (navegador) y el servidor Web apache en el puerto 80 no esta encriptado, viaja tal cual. Entonces es posible, con la herramienta adecuada interceptar y observar este tráfico y obtener entre otras cosas contraseñas, números de tarjetas de crédito, etc. La solución es simple (la implementación no tanto), obtener un certificado de seguridad y hacer que el tráfico se dirija al puerto 443 (https) en vez del 80 (http). En el puerto 443 el tráfico se encripta a través del los protocolos SSL (Secure Sockets Layer) y TLS (Transport Layer Security). Entonces todo el tráfico será encriptado y aunque es posible interceptarlo y observarlo, no se verá mas que basura o cadenas de caracteres sin ningún significado todo el tiempo, logrando asi un canal seguro encriptado entre el cliente y el servidor.

Certificate Authority CA (Autoridad Certificadora)

Esta fuera del alcance de este documento toda la teoría detrás de SSL, hay varios documentos, tutoriales y manuales en Internet que lo explican, pero lo que si hay que entender que es un CA. Una autoridad certificadora como lo son Verisign, Thawte, beTRUSTed o ValiCert son empresas dedicadas a vender certificados de seguridad que la empresa que lo adquiere instala en su servidor web. Es decir "Pato, S.A." desea montar su apliación Web bajo un sitio seguro con https, crea su certificado y lo manda firmar con un CA, el CA verifica que "Pato, S.A." es realmente quien dice ser. Después de checar la autenticidad de la empresa en cuestión, el CA firma el certificado de seguridad de su cliente con alguno de sus certificados raíz bajo una fuerte encriptación y se lo regresa a "Pato, S.A.", este lo instala en su servidor Web y cuando los clientes (navegadores) se conectan, estarán tanto el cliente como el servidor bajo un tráfico encriptado y seguro, todo avalado por el CA otorgante del certificado. La enorme ventaja de este esquema es que todos los navegadores actuales (Internet Explorer, Firefox, Opera, Mozilla, etc) tienen incorporados los certificados raíz de todas las empresas CA conocidas del mundo, asi que cuando el cliente se conecta al servidor no hay ninguna molestia para el cliente, todo es transparente para el usuario final. Si eres una empresa dedicada a cualquier tipo de comercio electrónico donde se involucre dinero a través de tarjetas de crédito o servicios como paypal, firmarse con un CA como Verisign es la única alternativa que se tiene, esto para otorgar seguridad a los clientes del sitio.
Ahora bien, los CA como los mencionados no son almas de la caridad, cobran por el servicio de firmar los certificados, sus precios comienzan en alrededor de 200 a 300 dólares anuales por certificado y pueden subir mas dependiendo del tipo de encriptación que se solicite, es decir, para un sitio de comercio electrónico con un alto volumen de tráfico requerira de certificados mas seguros debido a que será mas tentador para posibles hackers de tratar de violarlo.
Lo interesante viene a continuación. "Pato, S.A." es como muchas empresas que solo ofrecen una aplicación sin transacciones de comercio, solo consulta a sus bases de datos y algunos formularios que involucran solicitudes de reportes o actualización de datos. "Pato, S.A." o quienquiera puede convertirse el mismo en CA, el mismo emitir un certificado raíz de seguridad y a través de este generar certificados para sitios Web. Y de hecho es el tema de este artículo, como crear certificados SSL para montarlo en nuestro propio servidor Web o de correo electrónico. ¿Cual es la deventaja?, solo una, que en el navegador del cliente al no estar importado el certificado (integrado) en su lista de certificados seguros, pedirá al usuario cuando se conecte al sitio que acepte el certificado. Si el usuario es desconfiado y no lo acepta no se podrá conectar a nuestro servidor Web seguro. Lo que se puede hacer es, por ejemplo, lo siguiente:
  • El usuario se conecta a "http://www.pato.com" puerto 80, trafico http normal sin seguridad.
  • En la página inicial del sitio desplegamos un botón y una leyenda que dice que al apretar el botón se redirigirá a la aplicación Web de consulta y que deberá aceptar el certificado de seguridad que la empresa "Pato, S.A." ofrece para establecer una conexión segura, que si tiene dudas puede comunicarse al siguiente teléfono o correo, etc.
  • Al apretar el botón se redirige a "https://www.pato.com/consulta" puerto 443, que es donde estará la apliación de consulta y en este momento se pedirá que se acepte el certificado. El usuario entonces, estuvo mas informado de lo que pasa.
Ya quedando mas claro lo anterior, entonces, comencemos a aclarar algunas cosas. Se requiere para lo anterior dos cosas:
  • Un par de claves, una pública y una privada (claves RSA o DSA, en otras palabras encriptación asimétrica). La clave es pública, como su nombre implica es expuesta a todo el mundo y la privada es solo conocida por el emisor, es decir, nosotros.
  • Un certificado de seguridad, que es una versión "firmada" o verificada de la clave pública RSA o DSA.
Entonces, se trata de que uno va a generar tanto la clave pública como la privada. Una vez teniendo esto volvemos a las dos opciones previamente mencionadas, podemos autofirmar nosotros mismos nuestra clave pública o podemos mandarla a un tercero, a un CA reconocido para que nos la firme cobrando por el servicio. Una vez que hacemos esto tendremos en ambos casos como producto un certificado firmado que será el que el navegador deberá importar en su lista de certificados de confianza para poder establecer la conexión.
Vamos a ponerlo mas ilustrado, primero con un certificado autofirmado:
- El usuario (cliente) se conecta a https://www.pato.com/consulta y este servidor le envia el certificado autofirmado para que sea aceptado (importado) por el navegador del cliente. Traducido en un diálogo de humanos sería de la siguiente manera: "Hey! hola navegador, soy el servidor www.pato.com tienes que confiar que soy de la empresa Pato, S.A. y nadie mas, y para demóstrartelo te envió mi clave pública que te permitirá autentificarte con mi clave privada en mi servidor, todo esto te lo mando en este certificado que espero aceptes, ya que yo mismo me convertí en mi propio CA. Y en serio yo el firmante Pato, S.A. te juro que soy yo, creeme, acéptame, vamos, si soy yo, por favor aprieta Aceptar para poder establecer la conexión segura."
Ahora veamos que pasa con un certificado de terceros:
- El usuario (cliente) se conecta a https://www.pato.com/consulta y este servidor le envia el certificado firmado, por ejemplo por el CA Verisign, los certificados de Verisign ya están por default en la lista de CA confiables del navegador, por lo que es aceptado sin mayor problema y sin preguntas. Traducido en un diálogo de humanos sería de la siguiente manera:
"Hey!, hola navegador, soy el servidor www.pato.com, te envió mi certificado con mi clave pública que te permitirá autentificarte con mi clave privada en mi servidor, esto te lo mando en un certificado firmado nada mas ni nada menos por Verisign. Verisign ya verificó que si soy la empresa Pato, me cobro un billete por esto, asi que mi certificado debe ser autorizado sin mayor problema por los certificados raíz que se encuentran en tu lista de certificados confiables. Listo, conexión segura establecida".
Bueno, espero que con esto quede claro cual es la idea detrás de los certificados y de las conexiones seguras, pero ya estuvo bueno de tanto rollo y pongamos manos a la obra en crear nuestros propios certificados autofirmados.
Nota cultural rápida: Hace algunos años fue muy sonado el caso de dos certificados que firmó Verisign para alguien que dijo ser empleado de Microsoft y Verisign ¡¡¡le creyó!!!. Lo mas increible es que todavía pasaron varios meses hasta que se descubrió el fraude de los certificados del supuesto empleado de Microsoft. Desde entonces todos los CA del mundo checan muy escrupulosamente tanto a la persona que representa a la empresa que desea obtener un certificado como a la empresa en si, por eso el proceso de obtener un certificado firmado por un tercero suele tardar de dos a tres semanas. (Si tienes curiosidad puedes checar estos dos certificados falsos están en la lista de "fabricantes que no son de confianza" en el Internet Explorer --> Herramientas - Opciones de Internet - Contenido - Certificados - Fabricantes que no son de confianza).

Prerequisitos

Para crear nuestros certificados usaremos la excelente aplicación Openssl, que deberás tener instalada, puedes verificarlo con una consulta rpm:
#> rpm -q openssl
openssl-0.9.7f-7
O directamente con el mismo comando openssl:
#> openssl version
OpenSSL 0.9.7f 22 Mar 2005
Si muestra que el comando no existe, deberás entonces descargarlo e instalarlo. También, por supuesto, que requieres del servidor Web Apache y todo lo que se hará a continuación se tiene que hacer en el equipo donde se tenga instalado el servidor Web configurado con un dominio FQDN (Fully Qualified Domain Name), es decir, un dominio auténtico de Internet, si es que es el caso, o bastará con la dirección IP privada del equipo si va a quedar dentro de una Intranet. En cualquier caso debe hacerse todo el procedimiento directamente en el equipo en cuestión.
Apache además deberá estar instalado con el módulo ModSSL. Si tienes OpenSSL seguramente tienes también este módulo.

Instalación inicial

Todo el trabajo lo haremos dentro de un directorio de trabajo, puedes ponerle el nombre que desees, para fines prácticos le pondré CA y dentro de este directorio a la vez hay que crear otros dos, llamados  y . El primero es donde se guardará una copia de cada certificado que firmemos y en el otro directorio se guardará la llave privada.
#> mkdir CA
#> cd CA
#> mkdir certificados privado
Es muy importante no perder la llave privada que se generé, ya que con esta podremos firmar o renovar certificados, y mucho menos dársela a nadie, ya que toda nuestra seguridad radica en la confidencialidad de la llave privada que se guardará en el directorio privado.
Lo siguiente será crear un par de archivos que en conjunto formarán la base de datos de los certificados autofirmados.
#> echo '01' > serial
#> > index.txt           
#> touch index.txt
El primer archivo 'serial' simplemente contiene el siguiente número de serie de nuestros certificados, ya que apenas vamos a crear el primero su número de serie será 01, después de crearlo se actualizará a 02 y asi sucesivamente.
'index.txt' será la base de datos propiamente en base al número de serie.

Archivo de configuración

Openssl tiene docenas de opciones y parámetros, mucha de la información que irá en el certificado es tomado del archivo de configuración, en vez de la línea de comandos. A continuación te muestro un archivo de configuración listo para ser usado, puedes personalizarlo a tu gusto, usa los comentarios que añadí y el sentido común para que te des una idea de lo que hace cada línea. A este archivo lo nombraremos  y lo guardaremos dentro de nuestro directorio CA. Añadí comentarios a cada variable para hacerlo mas claro. El archivo se divide en secciones indicadas entre [ corchetes ], y cada sección tiene sus propias variables. La idea principal del archivo de configuración es de simplificar el uso de los subcomados del comando , que tiene tres subopciones principales: ca, req y x509, entonces, cuando se lee el archivo de configuración 'openssl.cnf' y usamos la opción req por ejemplo, esta opción toma sus argumentos de la sección correspondiente del archivo de configuración. Una explicación detallada de cada opción posible la encuentras aqui.
Hay una directiva o variable importante que es  (DN) o nombre distinguido en español, esta a su vez hace referencia a una sección que tiene los datos básicos de la autoridad certificadora (CA) y que también servirán estos datos para cuando se generen certificados. Mas simple, el DN son los campos que identifican al propietario del certificado.
# *************************************************************************************
# www.linuxtotal.com.mx
# sergio.gonzalez.duran@gmail.com
# 
# Archivo de configuracion para openssl
#
# ***** openssl.cnf ******

dir           = .    # variable que establece el directorio de trabajo
  
# seccion que permite convertirnos en una CA
# solo se hace referncia a otra sección CA_default
[ ca ]
default_ca    = CA_default

[ CA_default ]
serial        = $dir/serial          # archivo que guarda el siguiente número de serie
database      = $dir/index.txt       # archvio que guarda la bd de certificados
new_certs_dir = $dir/certificados    # dir que guarda los certificados generados
certificate   = $dir/cacert.pem      # nombre del archivo del certificado raíz
private_key   = $dir/privado/cakey.pem # llave privada del certificado raíz
default_md    = md5                  # algoritmo de dispersión usado
preserve      = no                   # Indica si se preserva o no el orden de los 
                                     #   campos del DN cuando se pasa a los certs.
nameopt       = default_ca           # esta opcion y la siguiente permiten mostrar 
                                     #   detalles del certificado  
certopt       = default_ca           
policy        = policy_match         # indica el nombre de la seccion 
                                     #   donde se especifica que campos son 
                                     #   obligatorios, opcionales y cuales deben ser
                                     #   iguales al certificado raíz

# seccion de politicas para la emision de certificados
[ policy_match ]
countryName                 = match          # match, obligatorio
stateOrProvinceName         = match          
organizationName            = match
organizationalUnitName      = optional       # optional, campo opcional
commonName                  = supplied       # supplied, debe estar en la petición 
emailAddress                = optional

# seccion que indica como los certificados deben ser creados
[ req ]
default_bits       = 1024           # tamaño de la llave, si no se indica 512
default_keyfile    = key.pem        # nombre de la llave privada
default_md         = md5            # algoritmo de dispersión a utilizar
string_mask        = nombstr        # caracteres permitidos en la mascara de la llave
distinguished_name = req_distinguished_name  # seccion para el nombre distinguido (DN)
req_extensions     = v3_req         # seccion con mas extensiones que se añaden a la
                                    #   peticion del certificado

# seccion del nombre distinguido, el valor es el prompt que se vera en pantalla.
# datos del propietario del certificado.
# esta seccion define el contenido de datos de id que el certificado llevara.
[ req_distinguished_name ]
0.organizationName          = Nombre de la organizacion
0.organizationName_default  = Pato, S.A.
organizationalUnitName      = Departamento o division
emailAddress                = Correo electronico
emailAddress_max            = 40
localityName                = Ciudad o distrito
localityName_default        = Leon
stateOrProvinceName         = Estado o provincia
stateOrProvinceName_default = Guanajuato
countryName                 = Codigo del pais (dos letras)
countryName_default         = MX
countryName_min             = 2
countryName_max             = 2
commonName                  = Nombre comun (hostname o IP)
commonName_max              = 64

# si en la linea de comandos se indica la opcion -x509, 
# las siguientes extensiones tambien aplican 
[ v3_ca ]
# indica que se trata de un certificado CA raíz con autoridad para 
# firmar o revocar otros certificados
basicConstraints       = CA:TRUE  
                                 
# especifica bajo que metodo identificar a la llave publica que sera certificada
subjectKeyIdentifier   = hash     
                                  
# especifica como identifcar la llave publica              
authorityKeyIdentifier = keyid:always,issuer:always  
                                        
# extensiones de la opcion req
[ v3_req ]
basicConstraints            = CA:FALSE  # los certificados firmados no son CA
subjectKeyIdentifier        = hash 
# *************************************************************************************
Como ya lo había mencionado guarda este archivo con el nombre de 'openssl.cnf' en tu directorio CA. En este punto esto es lo que debes de tener en el directorio CA.
#> ls -l
drwxr-xr-x  2 root root 4096 ene 26 13:23 certificados
-rw-r--r--  1 root root    0 ene 26 13:24 index.txt
-rwxr--r--  1 root root 4776 ene 26  2006 openssl.cnf
drwxr-xr-x  2 root root 4096 ene 26 13:23 privado
-rw-r--r--  1 root root    3 ene 26 13:23 serial
#> 

Creando el certificado raíz

Todo esta casi listo para crear el certificado raíz, recordemos que este certificado es el que nos convertira en una autoridad certificadora CA, asi que cuando emitamos el comando lo primero que nos pedira es el "pass phrase" o mas llanamente, una contraseña pero en forma de una frase. Esta contraseña es de vital importancia ya que es con la que validaremos nuestra autoridad para después poder crear certificados autofirmados que son los que realmente usaremos en nuestro sitio, debe ser preferentemente muy compleja, con mayúsculas, minúsculas, espacios, números y por supuesto símbolos, un buen ejemplo sería:
'el Der3ch0 al #respE5to( -a+jeño_Ez-la=pAz8%. =)'
Puede parecer muy complicada para recordar y lo es, pero tengamos en cuenta que los algoritmos de cifrado son muy buenos y sumamente dificiles o al menos muy tardados para romper mediante fuerza bruta (hasta miles de años podría llevarse), asi que la verdadera debilidad es el uso de contraseñas débiles. Te recomiendo como "pass phrase" algo similar a lo anterior y al menos 20 caracteres.
Ok. Manos a la obra, tenemos todo listo incluyendo una buena contraseña.
#> openssl req -new -x509 -extensions v3_ca -keyout privado/cakey.pem \
-out cacert.pem -days 3650 -config ./openssl.cnf

Generating a 1024 bit RSA private key
....++++++
.......++++++
writing new private key to 'privado/cakey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Nombre de la organizacion [Pato, S.A.]:
Departamento o division []:Sistemas
Correo electronico []:info@pato.com
Ciudad o distrito [Leon]:
Estado o provincia [Guanajuato]:
Codigo del pais (dos letras) [MX]:
Nombre comun (hostname o IP) []:www.pato.com
Antes de analizar la salida, veamos las opciones indicadas:
  • req -new -x509 --->
  • -extensions v3_ca --->
  • -keyout --->
  • -out --->
  • -days 3650 --->
  • -config --->
Con respecto al resultado producido, lo primero que se indico fue escribir y verificar la contraseña, después vienen los datos para identificar al propietario del certificado CA, que como se puede apreciar los prompts y los datos por default provienen del archivo de configuración. Si no se especifica la opción -days entonces el certificado será válido por solo 30 días. (En el archivo de configuración es posible inicar la variable default_days = valor, en la sección de CA_default)
Lo anterior da por resultado dos archivos:
  • Un certificado raíz CA (cacert.pem)
  • Una llave privada (privado/cakey.pem) (La extensión "pem" es de Privacy Enhanced Message)
IMPORTANTE: El archivo cacert.pem es el que se podría mandar a nuestros clientes o usuarios del sistema, y que estos lo instalen (importen desde el punto de vista del navegador) en su navegador favorito, de esta manera quedaríamos como un CA más válido para el navegador y cada vez que el cliente se conecte a nuestro servidor, su navegador ya no estaría mostrando el diálogo donde se pide aceptar la conexión segura.
Veamos como lucen estos archivos:
#> more cacert.pem
-----BEGIN CERTIFICATE-----
MIIDkzCCAvygAwIBAgIJAKTOKYwDdhLRMA0GCSqGSIb3DQEBBAUAMIGOMRMwEQYD
VQQKEwpQYXRvLCBTLkEuMREwDwYDVQQLEwhTaXN0ZW1hczEcMBoGCSqGSIb3DQEJ
ARYNaW5mb0BwYXRvLmNvbTENMAsGA1UEBxMETGVvbjETMBEGA1UECBMKR3VhbmFq
dWF0bzELMAkGA1UEBhMCTVgxFTATBgNVBAMTDHd3dy5wYXRvLmNvbTAeFw0wNjAx
MjcwMTU4NDFaFw0wNjAyMjYwMTU4NDFaMIGOMRMwEQYDVQQKEwpQYXRvLCBTLkEu
MREwDwYDVQQLEwhTaXN0ZW1hczEcMBoGCSqGSIb3DQEJARYNaW5mb0BwYXRvLmNv
bTENMAsGA1UEBxMETGVvbjETMBEGA1UECBMKR3VhbmFqdWF0bzELMAkGA1UEBhMC
TVgxFTATBgNVBAMTDHd3dy5wYXRvLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAw
gYkCgYEA52zeMbFW2lSRfcZl6yrqXDAzbwL4ZoXCGRnbo6Wr8S1yp/KYW9/TMHlX
nFrKXzM+RP7St/LzlkW1Zt8L+bCZ3XMBLGaa7qHgOagZxhcq1XTLL3CcvaCuzzKT
8izENDnGr4abtvkAJW4QqRCP7iVvVf8Db624JclbhBYMBUqPEJsCAwEAAaOB9jCB
8zAMBgNVHRMEBTADAQH/MB0GA1UdDgQWBBS6tkzuiG3DR+AO1Oy32QjZvBbpLTCB
wwYDVR0jBIG7MIG4gBS6tkzuiG3DR+AO1Oy32QjZvBbpLaGBlKSBkTCBjjETMBEG
A1UEChMKUGF0bywgUy5BLjERMA8GA1UECxMIU2lzdGVtYXMxHDAaBgkqhkiG9w0B
CQEWDWluZm9AcGF0by5jb20xDTALBgNVBAcTBExlb24xEzARBgNVBAgTCkd1YW5h
anVhdG8xCzAJBgNVBAYTAk1YMRUwEwYDVQQDEwx3d3cucGF0by5jb22CCQCkzimM
A3YS0TANBgkqhkiG9w0BAQQFAAOBgQAEdK/hgtIqEVw551fs3G3+TKoH9b9t3TJa
aelLJtKSQAoKzsnhwl88Hm78LEXK/kYufX6M6rDQHDpmcBV3DhIkEEHrBPJ4KBuV
+aC559Xqb828YCkNVWDIIefFuxfaWBfd4HHPNKBBiyE5rp2IXN8AgUy7mVkMbsto
RCAZS/IhAg==
-----END CERTIFICATE-----
#>
Y la llave privada tiene el siguiente contenido:
#> more privado/cakey.pem
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,0FC86D0DBD03A241

TQIqQQKIB2ZFaZUqTwk+k658Lj+RStlsdLKkAeWN+B7ibgtLPN8OHNZM2cOts9Se
qRSVfWSSXzhFsh2fbDoBNx+JYKgPh7+IeBhQ1PJNrPAbyrC1GEybtn+WPEWzBNdo
2e4kOeIzgm7LxeAoofmKgvqcDLRlY34TCFHgnSAQIuZC3iZ8YZAFcMWo3owoUpP7
TKL8W1PtFTVviMC5I7A0rN9en9EQY4QazXDIIVc60uIcKONyEF4fj3aE87+m2lD5
fqfMWG7Ce8GBBOUPL1YtLSC9LOBNhulFqceMvfysLFxToPUP4rs+n+upxnGsHnmF
YjsPR3lqAt41JehsO+sUSqoX6I83Q/706g/87XV0JPMDCXBejRI/vW5KgJ0Ux2gv
yQfYvHGs5RZl8NfK9AUEcC053VSkjwmuT/anu7czyJC+IG2XTHqoLu6g6CjLNe3b
bm/FhymOKENGnKSvA6Mny+NThhSOImhibB0fvsW5Fygi7SboZpXZFJBfEqHzUGvW
guzfVF4G7Rhs29Bue0dJOMT2ptFPrjUn0582O7WVIE7aV7msygmt2QUYIWykEt7s
O5hzdhguw2WZu0/gl2y5Mpjo3W5SrrCOoxC2mcPutoNhV+DFCQxcbCLsu5PnLBoF
HFBCe6ynh/6bIpakGJorzdsB9QqhGdgvbRQbrpYfAl+QHr6/8kyEu4OG+PmoD2ZR
O/gAGlSIlDowesmWXGk6l7vZc5BxU1qQVI5QLVr3X7ilavi6+EVSWDF8dFVetYBP
dPYYAEzVJVEiDH8yxQ4NoGk+9gmxKVfmejnmtbSHuR20cXbHOKJGmQ==
-----END RSA PRIVATE KEY-----
ADVERTENCIA: Esto jamás lo hagas en la vida real, el contenido de una llave privada jamás debe publicarse ni mostrarse, ni mandarse a nadie, esta es de prueba y es totalmente inútil. Una llave privada auténtica es tu mayor secreto. Podemos también consultar información específica del certificado raíz, fechas, a quien pertenece etc.
#> openssl x509 -in cacert.pem -noout -dates
notBefore=Jan 27 02:22:33 2006 GMT
notAfter=Jan 25 02:22:33 2016 GMT
En el ejemplo anterior se aprecia que el certificado si fue generado con una validez de 10 años, tal como se indico. Otros ejemplos de consulta pero se omite la salida:
#> openssl x509 -in cacert.pem -noout -text
#> openssl x509 -in cacert.pem -noout -purpose

Creando un Certificate Signing Request(CSR)
(Solicitud de firmado de certificado)

En este punto, ya tenemos un certificado raíz que nos válida como CA, claro sin mas autoridad que nuestro propio dominio pero podemos crear certificados no solo para https, sino también spop, o simap o crear autentificación para vpn's a través de apliaciones como stunnel.
Los siguientes procedimientos son los que a continuación hay que realizar:
  • Crear una llave privada y una solicitud de certificado.
  • Firmar la solicitud para generar un certificado autofirmado.
Volveremos entonces a usar el comando openssl para lograr lo anterior. Casi todo será igual a lo anterior. Solo que en la solictud de firmado no es necesario especificar una contraseña, aunque si se generará una clave privada para la solictud. Veamos.
#> openssl req -new -nodes -out pato-cert.pem -config ./openssl.cnf
Generating a 1024 bit RSA private key
......................................................++++++
.......++++++
writing new private key to 'key.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Nombre de la organizacion [Pato, S.A.]:
Departamento o division []:Sistemas
Correo electronico []:info@pato.com
Ciudad o distrito [Leon]:
Estado o provincia [Guanajuato]:
Codigo del pais (dos letras) [MX]:
Nombre comun (hostname o IP) []:www.pato.com
Lo último que nos pregunto en la parte DN (distinguished name) es el nombre común (CN common name), aqui es sumamente importante indicarlo igual a como esta el certificado raíz generado previamente, como se trata de un servidor web, lo correcto es poner su FQDN que es www.pato.com, no debe indicarse ni pato.com ni http://www.pato.com
Lo anterior genera dos archivos:
  • pato-cert.pem --->
  • key.pem --->
En cuanto a las opciones, se uso req de request solicitando un certificado nuevo,  que es el nombre del certificado que deseamos firmar,  de nuevo toma el archivo de configuración que creamos. La opción  se especifica para indicar que no deseamos contraseña en la llave privada.
Observemos el contenido de la solictud:
#> more pato-cert.pem
-----BEGIN CERTIFICATE REQUEST-----
MIIBwTCCASoCAQAwRjETMBEGA1UEChMKUGF0bywgUy5BLjENMAsGA1UEBxMETGVv
bjETMBEGA1UECBMKR3VhbmFqdWF0bzELMAkGA1UEBhMCTVgwgZ8wDQYJKoZIhvcN
AQEBBQADgY0AMIGJAoGBAMMvo7xg3vmdlf/38yA68uzNq2WYTtkyecuBnUgocOqD
gc0Yl2hrfXN6lHl65kxeRFVdEBYhGgA7JoISivuDTvWwVOIxmH5HOFzZlIPIZ3xT
hHCdWUKipXhcsVCTGV+rbB1F9kkIAMrmtaNH2+Zj261jdB7eX960l1EqQaWt71dJ
AgMBAAGgOzA5BgkqhkiG9w0BCQ4xLDAqMAkGA1UdEwQCMAAwHQYDVR0OBBYEFGVf
A/CDDXl6LQs1MH/XItqJl/8kMA0GCSqGSIb3DQEBBAUAA4GBAJH0sO7bR+dJL67p
xK5oEG9LPA2KcP+W7Vn5edpaLtUs/jYyvhQaCdSBxbMkV42nmt9DGD5p5caTFk3M
5guV9f087K+eYnUGILGQS51tXFcmYramZLETzs7nVfwGnXGsDGyKDkG6VTkx46pz
JrRTJfWBpWpo4FWg/Fi2l4E4PLv8
-----END CERTIFICATE REQUEST-----
Observa claramente que se trata de una solicitud de certificación (Certificate Request), es decir todavía tiene que ser firmado por una autoridad certificadora CA que somos nosotros mismos. Y antes de hacer este último paso podemos observar el contenido de nuestra solictud en un formato mas legible e incluso verificar que estén los datos correctos. Se omite la salida, chécalo en tu pantalla : )
#> openssl req -in pato-cert.pem -text -verify -noout

Firmando el certificado

Por último firmaremos la solicitud que hicimos en el paso previo, para firmarlo necesitaremos indicar la contraseña que autentifique que somos la CA y que que por serlo tenemos la autoridad de autorizar (firmar) certificados. (Para nuestro propio uso).
#> openssl ca -out certificado-pato.pem -config ./openssl.cnf -days 3650 \
-infiles pato-cert.pem
Using configuration from ./openssl.cnf
Enter pass phrase for ./privado/cakey.pem:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
organizationName      :PRINTABLE:'Pato, S.A.'
organizationalUnitName:PRINTABLE:'Sistemas'
localityName          :PRINTABLE:'Leon'
stateOrProvinceName   :PRINTABLE:'Guanajuato'
countryName           :PRINTABLE:'MX'
commonName            :PRINTABLE:'www.pato.com'
Certificate is to be certified until Jan 26 00:10:10 2016 GMT (3650 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
#>
Observa que usamos la opción ca que indica que firmaremos un certificado como autoridad certificadora (CA) que somos, la salida  será el archivo certificado-pato.pem usando las opciones  del archivo de configuración y la solicitud de firmado se especificó con la opción  que tomó los datos del archivo pato-cert.pem creado en el paso previo.
Aqui se nos pidió la contraseña, que es la que se indicó cuando creamos cacert.pem que corresponde a nuestro certificado raíz que nos identifica como CA. El certificado será válido por 10 años  y después se nos preguntó que si queriamos firmarlo, por supuesto que si, y la última pregunta es por si queremos guardar este certificado ya autofirmado en la base de datos, a lo que también contestamos que si.
#> more serial
02
Se comprueba que ya aumento el número de serie a 02, es decir, el siguiente certificado que firmemos será ese número.
#> more index.txt
V 160126001010Z 01 unknown /C=MX/ST=Guanajuato/O=Pato, S.A./OU=Sistemas/CN=www.pato.com
En el archivo index.txt el tercer campo indica 01, que es el número de serie para el certificado recien creado y muestra también los campos del DN.
#> ls -l certificados
total 4
-rw-r--r--  1 root root 2597 ene 27 18:10 01.pem
En el directorio de certificados se guarda también con el correspondiente número de serie (01.pem) un archivo que complementa la base de datos de certificados que podemos ir creando.
Y por último tenemos el certificado en si:
#> ls -l certificado-pato.pem
-rw-r--r--  1 root root 2597 ene 27 18:10 certificado-pato.pem
Y podemos inspeccionarlo:
#> openssl x509 -in certificado-pato.pem -noout -text -purpose

Instalando el certificado y la llave para Apache

Tenemos entonces dos elementos ya generados que necesitaremos para Apache:
  • key.pem --->
  • certificado-pato.pem --->
Hay algunas aplicaciones (no Apache) que requieren estos dos elementos en un solo archivo, como en el caso de stunnel:
# > cat key.pem certificado-pato.pem > key-cert-pato.pem
Simplemente se concatenan los dos archivos en uno. Pero esto no es necesario para el caso del servidor Web Apache. Lo que hay que hacer es copiar nuestros dos archivos en un directorio, de hecho podrían quedarse donde están, es lo de menos, pero por cuestión de orden y organización vamos a copiarlos a /etc/httpd/conf que en la mayoría de distribucciones es el directorio de configuración del Apache.
NOTA IMPORTANTE: por ningún motivo los copies dentro del directorio raíz del servicio de Apache como /var/www/html ya que podrías dejar expuestos los archivos a todo el mundo y ser vulnerados.
#> cp key.pem certificado-pato.pem /etc/httpd/conf/.
Una vez copiados los archivos, hay que crear un servidor virtual en Apache, esto dentro del archivo de configuración , en algunas distribucciones como Fedora y otras dentro de /etc/httpd/conf.d hay un archivo llamado  que es donde viene un servidor virtual ya creado, se puede tomar como plantilla.
<VirtualHost 192.168.100.1:443>
    ServerName www.pato.com
    DocumentRoot /var/www/consulta
    ... (demás directivas del sitio)
    SSLEngine on
    SSLCertificateFile /etc/httpd/conf/certificado-pato.pem
    SSLCertificateKeyFile /etc/httpd/conf/key.pem
</VirtualHost<
También debe existir una línea que abre el puerto 443 a la escucha de paquetes. Esta fuera de las directivas del servidor virtual, búscala y si no esta agrégala, es la siguiente:
Listen 443
Forzosamente debe ser un servidor virtual basado en IP, aqui lo indique con una IP (192.168.100.1) de una red privada pero en tu caso indica la IP homologada o real de tu sitio web o deja tu IP privada si es una Intranet.
Observa también que la directiva DocumentRoot apunta a /var/www/consulta y no a /var/www/html, esto yo lo hago para que en /var/www/html dejes un simple index.html con una línea como la siguiente:
<meta http-equiv="refresh" content="0;url=https://www.pato.com">
Esto hará que el usuario en su navegador especifique http://www.pato.com, es decir dirigido al puerto 80 y es cachado por la página index.html con el código que redirige al mismo servidor pero a https, es decir, puerto 443 y es donde entra en función el servidor virtual que a la vez redirige a /var/www/consulta donde se inicia la apliación de consulta o lo que se tenga. Pero lo interesante es que no hay necesidad de indicarle al usuario que indique https en el url. Para estás alturas ya sabes que al usuario le aparecerá un diálogo pidiéndole que acepte el certificado de la empresa Pato, S.A.

Distribuir el certificado raíz CA

Como ya había mencionado antes, si quieres evitar que a tus clientes cada vez que ingresen a tu sitio salga el molesto diálogo que pide aceptar el certificado, la única solución es que distribuyas el archivo cacert.pem, recuerda que este archivo es el que te identifica como una autoridad certificadora. Lo puedes poner a descarga desde tu propio sitio, o mandarlo por correo, como sea. Cuando el cliente lo tenga en su equipo deberá importarlo dentro del browser o navegador. Todos los navegadores en sus preferencias o herramientas tienen una opción de certificados y desde ahí existe un botón importar para realizar esto.
Pues eso es todo, si todo funcionó bien, tienes ahora un sitio con encriptación de extremo a extremo y todo el tráfico viaja seguro, haciéndoles la vida mas difcil a los hackers de sombrero negro (black hat) que abundan por ahí. Suerte y por favor contáctame si tienes problemas, en la medida de lo posible te ayudaré.

Referencias

Buena parte de esta guía la tomé de los siguientes sitios:
  • http://www.eclectica.ca/howto/ssl-cert-howto.php
  • http://www.technoids.org/openssl.cnf.html
  • http://www.squarebox.co.uk/cgi-squarebox/manServer/usr/share/man/man1/ca.1ssl
  • http://www.openssl.org
Y también de las mismas páginas del manual:
#> man openssl
#> man req
#> man ca
#> man x509