El Curso se encuentra aquí
CAT
- Permite leer archivos
// Obtiene toda la información de los logeos en el sistema operativo
cat /var/log/auth.log
Less
- Es mas recomendado para leer archivos grandes
// Obtiene toda la información de los logeos en el sistema operativo
less /var/log/auth.log
//Para movernos podemos utilizar las flechas de arriba y abajo
//Para movernos por página utilizamos la barra espaciadora
// para salir :q
//para buscar /criterio_busqueda
//n: para buscar la siguiente considencia
/shift+n: para invertido
Permisos
- Listamos los archivos
//ingresar al home del usuario
cd
//listar los archivos
ls -l
- Resultado
-rw-r--r-- 1 root root 0 Jul 11 17:30 archivo.txt
-rw-r--r-- 1 root root 0 Jul 11 17:30 prueba
- El primer carácter representa
- -: es un archivo
- d: es un directorio
- l: enlace simbólico
- Los siguientes 9 caracteres representa los permisos del archivo (Ej: rw-r–r–), donde:
- r: read/lectura
- w: write/ escritura
- x: execute/ejecución
- Y se dividen en 3 grupos de tres caracteres:
- 3 primeros: usuario (rw-r–r–)
- 3 secundarios: grupo (rw-r–r–)
- 3: terciarios: otros usuarios del SO (rw-r–r–)
chmod
- Permite cambiar los permisos sobre los archivos
- Posee dos formas de utilizar
- ugoa
- u:usuario
- g:grupo
- o:otros
- a:todos
//Por ejemplo para agregar al usuario permisos de ejecutar
chmod u+x archivo.txt
- Resultados
ls -l
//Resultado
-rwxr--r-- 1 root root 0 Jul 11 17:30 archivo.txt
- Para eliminar un permiso a el grupo
chmod g-w archivo.txt
//resultado
-rwxr--r-- 1 root root 0 Jul 11 17:30 archivo.txt
- Darle permisos a todos (si no se pode nada se asume que es a todos)
chmod +x archivo.txt
Con formato octal
- Se utilizan números del 0 al 7
- Donde:
- r: suma 4
- w: suma 2
- x: suma 1
- Entonces si tenemos
-rwxr--r-- 1 root root 0 Jul 11 17:30 archivo.txt
- Significa que los permisos están como
- 7: para el usuario
- 5: grupo
- 5: otros
chmod 755 archivo.txt
chown
- Permite cambiar el propietario del archivo
//Formato
chown usuario:grupo archivo.txt
//pasar el archivo al usuario y grupo root
chown root:root archivo.txt
// se puede acortar así
chown root: archivo.txt
Terminales virtuales
- Los SO Linux poseen terminales terminales virtuales numeradas tty1-tty6 y la tty7 esta para la interfaz gráfica
Listar usuarios conectados «w»
- Para ver los usuarios conectados podemos utilizar el comando «w»
w
- Resultado
root@platzi:~# w
17:57:48 up 1:05, 2 users, load average: 0.06, 0.15, 0.17
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 - 16:52 47:12 0.10s 0.10s -bash
root pts/3 10.20.200.137 17:10 1.00s 0.04s 0.00s w
Listar usuarios conectados «who»
- También lo podemos obtener con el comando «who» pero es más resumida
who
- Resultado
root@platzi:~# who
root tty1 2022-07-11 16:52
root pts/3 2022-07-11 17:10 (10.20.200.13
Saber a cual terminal estoy conectado «tty»
- tty: permite saber a cual terminal se esta conectado
root@platzi:~# tty
/dev/pts/3
Listar los procesos de terminales «ps»
- con ps podemos listar los procesos que están corriendo
- Y si deseamos saber específicamente los de una terminal
root@platzi:~# ps -ft tty1
UID PID PPID C STIME TTY TIME CMD
root 119 1 0 16:52 pts/1 00:00:00 /bin/login -p --
root 306 119 0 16:52 pts/1 00:00:00 -bash
Eliminar el proceso de una terminal (usuario atacante)
kill -9 306
Monitoreo de procesos
ps
- Nos lista información de los procesos que están corriendo
//ps aux
ps aux
- Resultado
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 2.2 105476 11600 ? Ss 16:52 0:04 /lib/systemd/systemd --system --deserialize 15
root 99 0.0 0.3 3824 1976 ? Ss 16:52 0:00 /usr/sbin/cron -f
message+ 100 0.0 0.7 7760 3776 ? Ss 16:52 0:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
root 105 0.0 1.1 16872 5804 ? Ss 16:52 0:00 /lib/systemd/systemd-logind
- Nos muestra
- El usuario
- PID: número de proceso
- CPU
- MEM: memoria
- TTY: terminal utilizada
- COMMAND: comando que lo ejecuto
Enlazar comandos «|»
- Para enlazar comando podemos utilizar «|»
- Por ejemplo para un usuario específico
ps aux | grep root
jobs
- Permite saber los procesos que se están ejecutando en la terminal
jobs
fg
- Permite volver a al proceso anterior
fg
- Podemos ver que si son varios procesos y solo damos fg regresa al primero pero vemos que tienen números por eso lo podemos pasar parametros
fg 2
Ejecutar un script sin perder la consola «&»
- Si desea ejecutar una script sin perder la consola (es decir correr en segundo plano) utilizamos el caracter «&»
Ejecutar script y guardar su resultado «nohup»
- Existe un comando para guardar el resultado de un script dentro de un archivo de nombre «nohup.out»
top
- Muestra información del sistema operativo
- Cuantos usuarios están conectados
- Información de la CPU
- Pero primero para saber la información del CPU ejecutamos
- Ejecutamos grep con «-i» para que acepte tanto minúsculas como mayúsculas así puede ser «Processor» o «processor» (que es el correcto)
cat /proc/cpuinfo | grep -i "processor"
- Como se ve en el resultado solo tenemos un procesador el «0»
- Ahora si ejecutamos top vemos que la carga de este procesador es 0,03 o sea una carga muy baja
top
- Ahora si solo tenemos un CPU este valor puede ir de 0 a 1
- Si tenemos 4 CPU puede ir de 0 a 4
- Y estos valores se miden cada 1 / 5 / 15 minutos
free
- Nos brinda información de la memoria
- cuanto tiene
- Cuanto esta usada
- y cuanta esta libre
free
- Le podemos pasar el parámetro «-h», para verlo por Megabyte y gigabytes
free -h
du
- Nos permite saber información del disco duro
du
- Le podemos pasar los parámetros
du -hsc /home/orion/
Saber que procesos consumen más CPU
- ps:
- aux: ver los proceso del SO
- auxf: full-format listing
- sort
- -n: –numeric-sort
- -r: –reverse
- -k: –key=KEYDEF / sort via a key; KEYDEF gives location and type (ordenar por parámetro 3 CPU)
- head: obtener los 5 primeros
ps auxf | sort -nr -k 3 | head -5
Saber que procesos consumen más RAM
ps auxf | sort -nr -k 4 | head -5
htop
- Permite realizar una mejor administración de procesos
- Instalación
apt install htop
Redes
ifconfig
- brinda información de la red
- if: interface
- config: configuración
- Para instalarlo
apt install net-tools
- Ejecutarlo
ifconfig
ip a
- Nueva forma de obtener la información de red
- ip address show
ip a
- Si el servidor tiene direcciones IP v4 y IP v6 podemos filtrarlo con
//IP v4
ip -4 a
//IP v6
ip -6 a
hostname
- me brinda el nombre del servidor
hostname
Puerta predeterminada
- Para saber la puerta predeterminada
route -n
nslookup
- para realizar una búsqueda inversa de un dominio
nslookup google.com
- Nos muestra la IP v4 y IP v6
Manejo de paquetes
- RED HAT:
- rmp: redhat manager packet
- yum: gestgor de paquetes
- Debian:
- deb:
- se puede instalar con
- dpkg
- apt
- La base de datos de RPM se encuentra en /var/lib/rmp
- Listar todos los paquetes instalados
- -q: query
- -a: all
rpm -qa
- Instalación de un paquete
- -i: instalation
rpm -i paquete.rpm
- Eliminar un paquete
- -e: erase
rpm -e paquete.rpm
- El comando yum nos permite instalar un programa desde un repositorio sin conocer la ruta del archivo o dependencias
- dpkg: debian packet manager
En Ubuntu server
apt
- Actualizar los indices del sistema
apt update
- Actualizar el sistema
apt upgrade
- Actualizar el kernel
apt dist-upgrade
- Buscar un paquete
apt search mysql
//mas específico
apt search "mysql-server$"
- También se puede hacer con cache
apt-cache search "mysql-server$"
dpkg
- listar paquetes instalados
dpkg -l
tzdata: hora del sistema
- Si deseamos reconfigurar hora del sistema podemos hacer
dpkg-reconfigure tzdata
- podemos verificar con
date
snap
- Es un nuevo gestor de paquetes
- Para instalarlo
apt install snapd
- Podemos buscar
snap search aws-cli
- Ver el estado de los paquetes snap
snap refresh --list
- saber información de un paquete
snap info aws-cli
Centos server
rpm
- Listar paquetes instalados
- -q:query
- -a:all
rpm -qa
- Obtener información de un paquete específico
- -i: install
rpm -qi bash
- saber donde esta el paquete instalado
rpm -qc bash
yum
- Permite la instalación de paquetes
- Para actualizar los indices
sudo yum update
- le decimos que si «y» para que los actualice
- Nos puede solicitar que aceptemos la descarga de llaves pki
ip a
- Verificar la dirección IP
ip a
ifconfig
- Primero debemos instalarlo
yum install net-tools
- Ejecutamos
ifconfig
Ubuntu: Instalación de nagios 4.4.7
- Guía de instalación: aquí
Manejo de usuarios
id
- Muestra la información del usuario
id
- Resultado
- uid: id de usuario
- gid: id de grupo
- gropus= grupos a los que pertenece el usuario
- En las diferentes distribuciones los id de usuario inician en:
- debian:1000
- Red Hat: 500
- 0: esta reservado para el usuario root
whoami
- devuelve el nombre del usuario actual
whoami
/etc/passwd
- Este es el archivo que contiene la información de los usuarios
cat /etc/passwd
- El primer usuario es el usuario root
root:x:0:0:root:/root:/bin/bash
- Donde:
- x: significa que la contraseña esta cifrada o contraseña sombra
- 0: uid
- 0: gid
- root: nombre de usuario
- /root: home del usuario (que para root es diferentes a los otros usuarios)
- /bin/bash: la consola que utiliza el usuario
- Algunos usuarios no tienen login por esto tienen
/usr/sbin/nologin
/etc/shadow
- Este es el archivo donde se encuentran las contraseñas almacenadas la cual esta cifrada por el SO
cat /etc/shadow
passwd
- Permite cambiar la contraseña de un usuario
//al usuario actual
passwd
//A otro usuario
passwd tavo
Creación de usuarios
- Existen dos formas de crear usuarios
- useradd
- adduser
useradd
- Permite crear un usuario pero:
- no solicita contraseña
- no crea directorio home
//Formato
useradd nombre_usuario
//ejemplo
useradd tavo
- Si consultamos
cat /etc/passwd
adduser
- Permite crear un usuario pero
- Si solicita contraseña
- Crea directorio home
- NO SE ENCUENTRA EN TODAS LAS DISTRIBUCIONES DE LINUX
//Formato
adduser nombre_usuario
//ejemplo
adduser tavo2
- Resultado
Eliminación de usuarios
userdel
- permite eliminar un usuario
//Formato
userdel nombre_usuario
//Ejemplo
userdel tavo
Nota: history
- En Linux existe un comando «history» que tiene un historial de comandos
history
- Y para ejecutar un comando escribimos
//Formato
!#_comando
//Ejemplo
!184
Modificar un usuario
usermod
- permite modificar la información de un usuario
- Principalmente modificar los grupos
//Formato
usermod nombre_usuario
//Ejemplo
usermod orion
Grupos en el SO
- primero creamos un usuario «nodejs»
adduser nodejs
- Para ingresar al usuario nodejs
su - nodejs
- Pero aquí me va pedir la contraseña
- ¿Que pasa si no me la sé? como root tiene permisos podemos hacer
sudo su - nodejs
- Y me va a pedir mi contraseña «root»
- Que pasa si a este usuario básico le decimos que ejecute
apt update
- Nos brinda el siguiente error por que no tiene permisos para hacerlo
- Entonces vamos a corregirlo, salimos del usuario nodejs
exit
- preguntamos por los grupos de nodejs
groups nodejs
- Nos indica que el usuario nodejs pertenece solamente al grupo nodejs (esto por que al crear un usuario se crea un grupo con el mismo nombre)
Agrega un usuario a un grupo
- Existen dos formas
- gpasswd
- usermod
gpasswd
- permite agregar un usuario a un grupo
- -a: add / agregar
//Formato
gpasswd -a nombre_usuario nombre_grupo
//Ejemplo
gpasswd -a nodesjs sudo
- Ahora podemos volver a ingresar como el usuario nodejs e intentar hacer la actualización
NOTA: Sudo su
- Significa
- sudo: super user do
- su: switch user
- Continuamos
sudo su - nodejs
sudo apt update
usermod
- Permite agregar un usuario a un grupos
- -a: add /agregar
- G: grupo
- NOTA: aquí es al revés de gpasswd donde nom_usuario nom_grupo y aquí nom_grupo nom_usuario
//Formato
usermod -aG nombre_grupo nombre_usuario
//Ejemplo
usermod -aG sudo nodesjs
Eliminar un usuario de un grupo
gpasswd
- Permite agregar y eliminar un usuario de un grupo
- -d: delete / eliminar
//Formato
gpasswd -d nombre_usuario nombre_grupo
//Ejemplo
gpasswd -d nodesjs sudo
PAM: Método de autenticación en Linux
- Es un método de autenticación de usuarios de Linux
- Consta de 3 carpetas importantes
/etc/pam.d
- Al igual que en con cualquier programa instalado en Linux, los archivos de configuración se encuentran en /etc
ls /etc/pam.d/
/lib64/security
- Al igual que en con cualquier programa instalado en Linux, los archivos de librerías se encuentran en /lib y para este específico /lib64
- NOTA: Esta no se encuentra
/etc/security
- Mantiene las configuración de la seguridad de PAM
ls /etc/security
pwscore
- Permite validar si una contraseña es segura
- Pero en ubuntu primero debemos instalar
apt install libpwquality-tools -y
- Ahora ejecutamos
pwscore
- Otra prueba
pwscore
- Esto por que los Hakers mantienen diccionarios de contraseñas estándar
- Ahora si la contraseña puede ser correcta el la valida con un número de 0 a 100 donde:
- 0: es muy mala
- 100: muy buena
pwscore
ulimit
- Permite conocer los límites que un usuario tiene
ulimit
- Me indica que el usuario no tiene limites
- Si le paso el parámetro «-a» puedo verlos todos
- Y podemos ver por ejemplo que el usuario tiene permiso de crear 514052 procesos
- y vemos que tiene entre paréntesis una «(-u)» que es la que hacer referencia a este específicamente
- Que pasa si queremos que el usuario solo ejecute 10 procesos
ulimit -u 10
- podemos volver a verificar
ulimit -a
- Para probarlo vamos a crear un script de bash
nano script.sh
- Le agregamos
#!/bin/bash
echo "hola"
$0
- Donde
- #!/bin/bash: indica la consola que vamos a utilizar
- echo «hola»: imprimir un mensaje
- $0: ejecutar varias veces este script
- Le damos permisos de ejecución
chmod 777 script.sh
- Lo ejecutamos
./script.sh
- Y vemos que estamos limitados
Limitar acceso SSH por usuario y con Horario
/etc/security/time.conf
- Permite configurar a PAM para que los usuario solo pueden ingresar a en un horario específico
nano /etc/security/time.conf
- Podemos agregar por ejemplo
*;*;orion;Wk0800-1700
- Significa que orion se puede logear entre las 8am a 17pm entre semana (L-V)
SSH
/etc/ssh/sshd_config
- Es es el archivo que tiene la configuración del servicio
nano /etc/ssh/sshd_config
- Instrucciones
//Permite que se habilite la autenticación con password
PasswordAuthentication yes
//Descomentar: permite o no password vacios
#PermitEmptyPasswords no
X
PermitEmptyPasswords no
Crear llaves en máquina cliente para logearnos en el servidor (cliente)
- Paso 1: crear una llave
- Si no le paso parámetros creara una llaves 2048 bits
- El va crear dos llaves
- Pública:
- Privada:
ssh-keygen
- Proceso
Generating public/private rsa key pair.
Enter file in which to save the key (/home/tavo/.ssh/id_rsa):
Enter passphrase (empty for no passphrase): sk
Enter same passphrase again: sk
Your identification has been saved in /home/tavo/.ssh/id_rsa
Your public key has been saved in /home/tavo/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:KDCeBHkaGGS75Um02cNmX4RtZ/UMQ+maMi4ZnIt4hik tavo@SER-DESA
The key's randomart image is:
+---[RSA 3072]----+
|== . o. o=. |
|=.+ = ..o o .= |
| =+= * ..o . o |
|.o=++ o.. . |
| .oo. o.S o |
| . + o o |
| + . = o |
| E + + + . |
| . o . |
+----[SHA256]-----+
- Con este comando se crearon las dos llaves pública y privada
- Con el algoritmo «rsa»
- Y se almacenaran en «/home/tavo/.ssh/id_rsa»
- Para verlas
ls -la /home/tavo/.ssh/
- Aquí esta la llave privada «id_rsa»
- Y la pública «id_rsa.pub»
- Ahora debemos pasar la llave pública al servidor
- -i: indica cual es el archivo
- Debe ser la llave pública
ssh-copy-id -i /home/tavo/.ssh/id_rsa.pub root@10.20.200.168 -p 44
- Resultado
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/tavo/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@10.20.200.168's password: A0
Number of key(s) added: 1
Now try logging into the machine, with: "ssh -p '44' 'root@10.20.200.168'"
and check to make sure that only the key(s) you wanted were added.
- Como vemos nos solicita la contraseña del usuario del servidor remoto para este caso «root»
- Y ahora podemos intentar ingresar
ssh root@10.20.200.168 -p 44
- Nos solicita la contraseña de la llave (si le pusimos una a la hora de crearla sk)
- Y podemos ingresar
Eliminar que no se pueda ingresar por password (servidor)
- Si deseamos que no se pueda ingresar por password debemos cambiar
nano /etc/ssh/sshd_config
- Y modificamos
PasswordAuthentication yes
X
PasswordAuthentication yes
- Reiniciamos el servicio
systemctl restart ssh.service
Revisar la conexión
- Al momento de realizar una conexión ssh, este permite parámetros donde:
- Le podemos poner una «-v» o hasta 4 v’s (4 más información)
- Estas significan «verbose» que significa imprima en pantalla lo que pasa
ssh -vvvv root@10.20.200.168 -p 44
- Así nos va brindar información para poder determinar cual es el posible error
Instalación de bind9
Contexto histórico de los DNS
En Junio de 1983 alrededor de 70 sitios estuvieron conectados a la red de ciencias de la computación, permitiendo de esta forma la unión de algunos establecimientos gubernamentales, científicos y universitarios para que pudieran compartir datos, por esta razón los archivos de host no eran suficientes para hacer la replicación entre sitios, por este motivo en noviembre de 1983 se publicó el RFC 882 que define el servicio de nombre de dominios. Paso siguiente en octubre de 1984 se crearon 7 TLDs (Dominios de nivel superior) o también conocidos como dominios de propósito general .arpa, .com, .org, .edu, .gov, .mil y la letra de los países respetando su código ISO
- Para realizar el proceso de instalación de bind lo primero que realizaremos es verificar que bind se encuentre en los repositorios, para esto utilizaremos otro gestor de paquetes llamado aptitude, para instalarlo simplemente diremos .
apt install aptitude -y
- Con aptitude instalado buscaremos el paquete bind utilizando para ellos una expresión regular.
aptitude search "?name(^bind)"
- Lo instalamos
sudo apt install -y bind9
- Validamos la instalación con netstat y verificaremos que el puerto 53 esté en escucha
netstat -ltn
- Si deseamos ver el programa que está ejecutando este servicio agregamos el modificador p a netstat
netstat -ltnp
- Para realizar consultas al DNS podemos utilizar varias herramientas, entre ellas dig, que me permiten conocer más al respecto del nombre de dominio, para ello usaremos el dominio platzi.com y lo buscaremos en la máquina local, es decir 127.0.0.1
dig www.platzi.com @127.0.0.1
- Allí encontraremos una salida, nos interesa la parte de respuesta y la de tiempo de ejecución para validar que la respuesta se dio desde localhost
- Paso siguiente después de instalarlo es verificar todo lo que viene incluido dentro del paquete como lo son los archivos de configuración manuales entre otros, para esto podemos hacer uso de dpkg -L bind9.
dpkg -L bind9
/etc/bind
/etc/bind/bind.keys
/etc/bind/db.0
/etc/bind/db.127
/etc/bind/db.255
/etc/bind/db.empty
/etc/bind/db.local
/etc/bind/named.conf
/etc/bind/named.conf.default-zones
/etc/bind/named.conf.local
/etc/bind/named.conf.options
/etc/bind/zones.rfc1918
/etc/default/named
/etc/init.d/named
/etc/insserv.conf.d/bind9
/etc/network/if-down.d/bind9
/etc/network/if-up.d/bind9
/etc/ppp/ip-down.d/bind9
/etc/ppp/ip-up.d/bind9
/etc/ufw/applications.d/bind9
/lib/systemd/system/named-resolvconf.service
/lib/systemd/system/named.service
/usr/lib/tmpfiles.d/named.conf
/usr/lib/x86_64-linux-gnu/named
/usr/lib/x86_64-linux-gnu/named/filter-aaaa.so
/usr/sbin/named
/usr/sbin/named-journalprint
/usr/sbin/named-nzd2nzf
/usr/share/apport/package-hooks/bind9.py
/usr/share/doc/bind9
/usr/share/doc/bind9/README.Debian
/usr/share/doc/bind9/README.gz
/usr/share/doc/bind9/copyright
/usr/share/doc/bind9/NEWS.Debian.gz
/usr/share/doc/bind9/changelog.Debian.gz
- El archivo de configuración principal será /etc/bind/named.conf, también tenemos el archivo /etc/bind/rndc.key en este se puede configurar la clave que se puede usar para obtener acceso al nombre de dominio.
- Podemos ver la versión de bind de dos formas named -v o una versión extendida con named -V
//Sencilla
bind -v
//extendida
bind -V
- Como cliente tienes varias opciones para configurar tus DNS, lo que influirá directamente en tu velocidad, seguridad o reputación. Para eso te daré algunas opciones, el orden no significa nada:
OpenDns
Google DNS
Neustar UltraDNS
Cloudflare
quad
Public DNS
Yandex DNS
- Existe una herramienta que nos permite seleccionar cuál será el DNS que debemos utilizar basados en nuestra ubicación y nuestras búsquedas, se llama namebench. Para ello sólo basta instalarlo y ejecutarlo en la máquina cliente y con esto obtendremos sugerencias al respecto.
- https://tools.ietf.org/html/rfc920
Servicios
systemctl
- Permite administrar los servicios
//Formato
systemctl start|stop|restart|status nombre servicio
//Ejemplo
systemctl status apache2
- Resultado
- Aquí se brinda información importante
- Ubicación: nos indica desde que ruta se levanto el servicio
Loaded: loaded (/lib/systemd/system/apache2.service;
- Y luego puede ser enabled/disabled:
- enabled: si se reinicia el servidor el servicio se cargará
- disabled:si se reinicia el servidor el servicio NO se cargará
Activar un servicio para que arranque con el sistema
- Si el servicio aparece como disabled
- Para activarlo
//Formato
systemctl enable nombre_servicio
//Ejemplo
systemctl enable apache2
Listar todos los servicios
- Si queremos listar todos los servicios corriendo
systemctl list-units -t service --all
journalctl
- Brinda la información de los log’s de los servicios
- -f: follow / seguir
- -u: unit/ unidad: Show messages for the specified systemd unit UNIT (such as a service unit), or for any of the units matched by PATTERN.
//Formato
journalctl -fu nombre_servicio
//Ejemplo
journalctl -fu apache2
Espacio disco log’s
- Podemos saber tambien cuanto disco duro están utilizan los log’s del sistema con
journalctl --disk-usage
Reinicio de máquina
- Saber cuanto veces se ha reiniciado la máquina
journalctl --list-boots
Servicios por tipo de error
- Para listar los servicios por tipo de error
//Formato
journalctl -p info|crit|notice|warnnig
//Ejemplo
journalctl -p crit
- También podemos cambiar el tipo de salida por ejemplo a JSON
//Formato
journalctl -p info|crit|notice|warnnig -o json
//Ejemplo
journalctl -p crit -o json
NGINX / Apache / NGINX Amplify
- NGINX y Apache son softwares para montar servidores web, puedes realizar la instalación de ambos en el sistema operativo, teniendo como base que pueden estar corriendo al mismo tiempo, siempre y cuando no estén a la espera de conexiones por el mismo puerto.
- NGINX Amplify es una herramienta de monitorización gratuita y de código abierto para Nginx y aplicaciones basadas en PHP. Te permite detectar y arreglar los problemas de tu webiste y trackear los sistemas que tengas corriendo con Nginx. Con Nginx Amplify puedes ver y monitorear las métricas de Nginx, incluyendo peticiones actuales, versiones de PHP, errores de HTTP, conexiones, uso de CPU, de memoria, bases de datos y mucho más.
Nginx Amplify está compuesta por tres elementos:
- Backend Amplify: un elemento nuclear implementado como SaaS.
- Agente Amplify: Necesitarás instalar el agente en el servidor en el que Nginx y la aplicación PHP estén corriendo.
- Web UI Amplify: web interfaz que es accesible via TLS o a través de los túneles SSL
- Para validar los puertos que tienen un proceso activo usamos:
netstat -tulpn
- Podríamos tener una infraestructura donde NGINX puede servir como proxy y Apache como servidor web.
- Si revisamos las estadísticas podemos ver que Apache aún es el líder del mercado en servidores web, seguido por NGINX, es por esta razón que veremos la instalación y configuración de ambos.
- Existen en internet artículos interesantes de comparación entre ambos y el caso de uso de cada uno de ellos.
- https://www.digitalocean.com/community/tutorials/apache-vs-nginx-practical-considerations
- https://www.nginx.com/faq/what-is-nginx-how-different-is-it-from-e-g-apache/
Apache instalación
apt install apache2 -y
NGINX instalación
apt install nginx nginx-extras -y
- Para verificar si los servicios está corriendon se debe ejecutar los siguientes comandos:
systemctl status apache2
systemctl status nginx
- Si se siguió el orden de instalación, NGINX no debe estar ejecutándose, pues por defecto intentará levantarse en el puerto 80, el cual ya se encuentra ocupado por Apache, para ello cambiaremos el puerto de Apache al puerto alterno http 8080.
nano /etc/apache2/ports.conf
- A continuación tenemos que cambiar el puerto al 8080, para esto se debe cambiar la instrucción Listen 8080 dentro del documento ports.conf.
Listen 80
X
Listen 8080
- Después abrimos nuestro archivo de configuración de Apache
nano /etc/apache2/sites-available/000-default.conf
- Modificamos
<VirtualHost *:80>
X
<VirtualHost *:8080>
- Después realizamos el proceso de detener apache2 y volverlo a encender, con los siguientes comandos
systemctl restart apache2
systemctl restart nginx
systemctl status apache2
systemctl status nginx
- Ambos sitios deberían estar activos y en ejecución.
- Paso siguiente, dirígete al archivo de configuración de NGINX donde te asegurarás que exista una directiva en el location llamada proxy_pass que contenga lo siguiente:
nano /etc/nginx/sites-enabled/default
- Modificamos
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
X
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
proxy_pass http://127.0.0.1:8080;
}
- Si por alguna razón el servidor Apache no se encuentra en la misma máquina, debemos cambiar la dirección IP y el puerto respectivo.
- Apache tiene un comando para activar sitios que es a2ensite que recibe como parámetro el archivo de configuración definido en /etc/apache2/sites-available. NGINX no cuenta con este comando, motivo por el cual se tiene un enlace blando, es decir, cuando creemos un archivo de configuración en /etc/nginx/sites-available debemos ejecutar
ln -s /etc/nginx/sites-available/configuracion_nginx /etc/nginx/sites-enabled/
- Apache también me permite deshabilitar sitios
a2dissite 000-default
- Apache también me permite agregar módulos
a2enmod rewrite headers env dir mime
systemctl restart apache2
- Si queremos activar letsecrypt en NGINX, debemos agregar una línea en el .htaccess en la ruta /var/www/html/nombre_host/.htaccess.
nano /var/www/html/nombre_host/.htaccess
- Y agregar
SetEnvIf X-Forwarded-Proto https
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
NGINX -Amplify
- Nos permite administrar nuestros servidores Linux
- Primero instalamos python3.8
apt install python3.8 -y
- Ingresamos a la carpeta de nginx
cd /etc/nginx
- Realizamos la búsqueda
- -i: sin importar mayúsculas o minúsculas
grep -i include\.*conf nginx.conf
- Ahora vamos a crear un archivo en /etc/nginx/conf.d de nombre stub_status.conf
- Con este comando se queda esperando que escribamos el contenido
cat > conf.d/stub_status.conf
- Agregamos
server{
listen 127.0.0.1:80;
server_name 127.0.0.1;
location /nginx_status {
stub_status on;
allow 127.0.0.1;
deny all;
}
}
- Confirmamos con CTRL+C
- Aquí:
- listen 127.0.0.1:80;: escuchamos esta máquina por el puerto 80
- server_name 127.0.0.1;: nombre del servidor
- location /nginx_status {: ubicación donde se encuentra el servicio
- stub_status on;: que este habilitado
- allow 127.0.0.1;: que solo permita desde la propia máquina
- deny all;: deniegue el resto del tráfico
- Verificamos el archivo
cat /etc/nginx/conf.d/stub_status.conf
- Matamos nginx
kill -HUP `cat /var/run/nginx.pid`
- Reiniciamos nginx
systemctl restart nginx
systemctl status nginx
- Hacemos que cargue con el SO
systemctl enable nginx
- Ingresamos a la página de NGINX-AMplify: https://amplify.nginx.com/login
- Y creamos una cuenta
- Nois va a mostrar un página de como instalar el agente de nginx-amplify en servidores linux
- ejecutamos
wget https://github.com/nginxinc/nginx-amplify-agent/raw/master/packages/install.sh
//o esta
curl -L -O https://github.com/nginxinc/nginx-amplify-agent/raw/master/packages/install.sh
- Y luego
API_KEY='95b2d2025cd88709485197fed20e5d3a' sh ./install.sh
- Luego nos indica que iniciemos el servicio con y los verificamos
service amplify-agent start | stop | status
- Reiniciamos nginx
systemctl restart nginx
- Ahora si regresamos a la página de NGIX-Amplify podemos ver que nuestro servidor ya esta reportando métricas para el servidor NGINX
Instalación MYSQL
- Buscamos el programa de mysql-server
apt search "mysql-server$"
- Como vemos es la versión 8
- Instalamos
apt install mysql-server -y
- Ahora para comprobar que se instaló correctamente hacemos el siguiente comando, pero si lo corremos como root ingresa de una vez pero si lo ejecutamos como orion
su orion
mysql
- Nos regresa
- Esto por que no hemos configurado usuarios aún
- Pero MYSQL por defecto va crear un usuario en /etc/mysql/debian.cnf
nano /etc/mysql/debian.cnf
user = debian-sys-maint
password = kC1EK8O8EBdKkmwM
- Por tanto podemos conectarnos
mysql -u debian-sys-maint -p
- Una vez dentro
- Podemos listar la bases de datos
show databases;
- Salimos
exit
- Ahora podemos configurar la seguridad de mysql como usuario root
su root
mysql_secure_installation
- Si a la hora de digitar las contraseñas no da el siguiente error
Failed! Error: SET PASSWORD has no significance for user 'root'@'localhost' as the authentication method used doesn't store authentication data in the MySQL server. Please consider using ALTER USER instead if you want to change authentication parameters.`
- Matamos la terminal y ejecutamos como root
mysql
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password by 'HB0';
- Ejecutamos
mysql_secure_installation
- Hacemos
Securing the MySQL server deployment.
Enter password for user root: HB0
VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?
Press y|Y for Yes, any other key for No: No
Using existing password for root.
Change the password for root ? ((Press y|Y for Yes, any other key for No) : o^[No
... skipping.
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.
Remove anonymous users? (Press y|Y for Yes, any other key for No) : Yes
Success.
Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : No
... skipping.
By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : Yes
- Dropping test database...
Success.
- Removing privileges on test database...
Success.
Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : yes
Success.
All done!
Naggios + MYSQL
- guia: aquí
Find
- Permite buscar en el sistema operativo
//Formato
find ruta
//Ejemplo buscar todos los archivos en /etc
find /etc -type f
//Ejemplo buscar logs y que sean archivos sin importar mayúsculas ni minúsculas
find /var/log/ -iname "*.log" -type f
- Archivos que recibieron cambios en los últimos 10 minutos
find /etc -mtime 10
grep
- Si deseamos buscar una palabra dentro de un archivo
grep "server" /etc/nginx/sites-available/default
awk
- permite buscar dentro de un archivo
//Ejemplo buscar los ip que han accedido a nginx
awk '{print $1}' /var/log/nginx/access.log
//Podemos perfeccionar con que las ordene y las muestre de forma única por ejemplo con gitlab
awk '{print $1}' /var/log/apache2/git443.siua.ac.cr-access.log | sort | uniq -c | sort -nr
- Ahora por que $1
- Por que si hacemos
cat /var/log/apache2/git443.siua.ac.cr-access.log
- Vemos que tenemos
66.249.65.29 - - [20/Jul/2022:06:15:12 -0600] "GET /mrojas/dashboard_Highcharts/-/blob/db60927fbe41b3c3b333daa89e9ac94a5b5eebb5/Datatables/license.txt HTTP/1.1" 200 26548
66.249.74.10 - - [20/Jul/2022:06:15:20 -0600] "GET /assets/webpack/monaco.744a71b8.chunk.js HTTP/1.1" 200 677621
66.249.65.29 - - [20/Jul/2022:06:15:21 -0600] "POST /api/graphql HTTP/1.1" 200 7015
66.249.65.27 - - [20/Jul/2022:06:15:26 -0600] "GET /mrojas/dashboard_Highcharts/-/blob/db60927fbe41b3c3b333daa89e9ac94a5b5eebb5/Datatables/license.txt?format=json&viewer=simple HTTP/1.1" 200 7603
66.249.74.6 - - [20/Jul/2022:06:58:46 -0600] "GET /mrojas/dashboard_Highcharts/-/tree/bcdad27f9cc9e685d0401a44ab335c71a7297217 HTTP/1.1" 200 28239
66.249.74.6 - - [20/Jul/2022:06:59:02 -0600] "POST /api/graphql HTTP/1.1" 200 6689
66.249.74.10 - - [20/Jul/2022:06:59:05 -0600] "GET /mrojas/dashboard_Highcharts/-/refs/bcdad27f9cc9e685d0401a44ab335c71a7297217/logs_tree/?format=json&offset=0 HTTP/1.1" 200 6795
66.249.74.8 - - [20/Jul/2022:06:59:08 -0600] "POST /api/graphql HTTP/1.1" 200 7786
66.249.74.8 - - [20/Jul/2022:06:59:10 -0600] "GET /assets/webpack/commons-pages.projects.blob.show-pages.projects.show-pages.projects.tree.show.5eee6986.chunk.js HTTP/1.1" 200 33819
66.249.74.6 - - [20/Jul/2022:06:59:12 -0600] "POST /api/graphql HTTP/1.1" 200 7742
205.210.31.30 - - [20/Jul/2022:07:03:16 -0600] "GET / HTTP/1.1" 302 5369
- Y como se ve tenemos información separada por espacios en blanco, entonces si por ejemplo ocupamos ver lo que intenta hacer el usuario podemos hacer
awk '{print $7}' /var/log/apache2/git443.siua.ac.cr-access.log | sort | uniq -c | sort -nr
Otros servicios de logs
Un servidor puede llegar a registrar millones de líneas de datos en un log. Para facilitar el monitoreo y mantenimiento podemos usar herramientas o tecnologías que nos permitan tomar esta información sin procesar y convertirla en visualizaciones fáciles de consumir y entender.
El primer paso para seleccionar las herramientas que usaremos. Lo primero es tener una base de conocimiento que nos identifique el servidor en circunstancias normales y de esta forma con la ayuda de estas herramientas detectar preocupaciones o incluso tendencias con una sola mirada.
Algunas herramientas que podemos tener en distribuciones Linux son:
Collectd
Es un demonio que recopila datos de rendimiento, y junto con la herramienta collectd web, es capaz de generar reportes que se pueden visualizar en un navegador WEB. Se puede establecer un servidor y a él conectarle un número ilimitado de clientes remotos. Podemos agregar más plugins si los necesitamos, para ello podemos visitar la página https://collectd.org/wiki/index.php/Table_of_Plugins
Nmon
Obtener visualizaciones rápidas de mi sistema. Se instala con apt install nmon. Tiene una característica especial que me permite guardar en archivos de formato nmon que se pueden convertir en información que puede ser presentada en html con la herramienta nmonchart. Nmon -f -s 15 -c 20, se recolectará información por cinco minutos mostrados en incrementos de 15 segundos 20 veces.
Munin
Es una herramienta para analizar el rendimiento del servidor que contiene gráficos históricos para facilitar la identificación de problemas en el tiempo.
Grafana
Permite consultar, visualizar, alertar y ante todo entender las métricas de negocio sin importar dónde están almacenadas. Se puede crear, explorar y compartir tableros de mando con el equipo basados en el principio de la cultura orientada a los datos.
También podemos instalar agentes de monitoreo en los servidores, algunas opciones son https://newrelic.com/ y https://www.datadoghq.com/, podemos tener una prueba del servicio y analizar el rendimiento de nuestro servidor.
Cabe aclarar que también necesitará algún sistema de alarma automatizado que nos envíe alertas de forma proactiva cuando las cosas no estén funcionando bien.
Bash
- Creamos un archivo
cd /root
nano archivo1.sh
- Agregamos
#!/bin/bash
#Funcion:
WELCOME="Hola Gustavo"
echo $WELCOME
- #!: indica como se va a interpretar el script en un momento determinado
- /bin/bash: indica que se va a interpretar con bash
- #: comentarios
- $VARIABLE: permite acceder al contenido de las variables
- Guardamos
- y le damos permisos de ejecución (El usuario puede ejecutar)
chmod u+x archivo1.sh
- Lo ejecutamos
chmod u+x archivo1.sh
variables del SO
env
- permite listar todas las variables de entorno del sistema
env
- Podemos listar su contenido con $
- Ejemplo: listar donde están todos los binarios
echo $PATH
- Estos binarios se convierten en los comandos por ejemplo si listamos la ruta
ls /usr/bin/
- podemos ver que esta por ejemplo apt
- Todos estos binarios lo podemos utilizar en nuestros scripts
- Creamos un nuevo script
cd /root
nano archivo2.sh
- Agregamos
#!/bin/bash
#Verificar la cantidad de espacio en el sistema operativo
#Desarrollado por: Gustavo Matamoros
#Guarda el resultado de ejecutar pwd e la variable CWD
CWD=$(pwd)
#Obtener la fecha y hora de hoy %F=FULL %T=Tiempo
FECHA=$(date +"%F%T")
#Imprimir la fecha
echo $FECHA
#Ejecutamos el comando df(lista el sistema de archivos) con -h:human y en el resultado buscamos /dev
#>: la salida la va a redirigir a un archivo especifico pero lo sobre escribe
#$FECHA: le concatenamos la fecha
df -h | grep /dev > uso_disco_"$FECHA".txt
#>>:Permite que se agregue la informacion
df -h | grep /dev/sda2 >> uso_disco_"$FECHA".txt
echo "Se ha generado la informacion en: uso_disco_*"
- Le damos permisos de ejecución
chmod u+x archivo2.sh
- Lo ejecutamos
./archivo2.sh
Script Respaldo MYSQL
- Creamos un archivo con los datos de conexión a la BD
nano /root/conexionmysql.ini
- Agregamos
[client]
host=10.20.200.XXX
user=T
password=AM1
- Le damos permisos necesarios
chmod 600 /root/conexionmysql.ini
- Creamos
nano /root/respaldo_mysql.sh
- Le agregamos
#!/bin/bash
# Funcion: Respaldo de Base de Datos mysql
# BD:
# Desarrollador por: Gustavo Matamoros
# Ejecutado por: crontab
#
#
#######################################################################
################# PARAMETROS ####################
#######################################################################
#nombreDB="XXX"
#Le pasamos el primer parametro del script
nombreDB="$1"
#Creamos una variable para que almacene todas las rutas desde donde se puede ejecutar
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# Creamos una variable para que si algo falla se deje de ejecutar
set -e
# Variable: readoly / contiene la ruta del script
#$: permite almacenar el resultado de un comando Linux en una variable
readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
#echo ${SCRIPT_DIR}= /root
# Variable: readonly / contiene el nombre del script
readonly SCRIPT_NAME="$(basename "$0")"
#echo ${SCRIPT_NAME} = respaldo_mysql.sh
#################################################################
######### FUNCION: log #######################
#################################################################
# FUNCION: crea una variable readonly con el mensaje del primer parametro y lo imprime
function log {
# Variable: local / readonly / primer parametro
local readonly level="$1"
# Variable: local / readonly / segudo parametro
local readonly mensaje="$2"
# Variable: local / readonly / fecha y hora actual los errores los redirigimos a 2 que es el estandar
# fecha [nivel] [nombre_script] mensaje
local readonly timestamp=$(date +"%Y-%m-%d %H:%M:%S") >&2 echo -e "${timestamp} [${level}] [${SCRIPT_NAME}] ${mensaje}"
}
#################################################################
######### FUNCION: log_error #######################
#################################################################
# FUNCION: crea una variable readonly con el mensaje del primer parametro y lo imprime
function log_error {
# Variable: local / readoly / contiene el mensaje que se le paso como primer parametro
local readonly mensaje="$1"
# Imprimir el mensaje
log "ERROR" "$mensaje"
}
#################################################################
######### FUNCION: assert_is_installed #######################
#################################################################
# FUNCION: Verificar si el programa pasado como parametro esta instalado
function assert_is_installed {
#Almacena el primer parametro pasado a la funcion
local readonly name="$1"
# Si la ejecucion del comando que viene de la variable $1 = name no devuelve nada
if [[ ! $(command -v ${name}) ]]
then
# Si el programa no esta instalado
log_error "El binario: '$name', no esta instalado"
# Salimos del script
exit 1
fi
}
#################################################################
############### FUNCION: RUN ################################
#################################################################
# FUNCION: Verificar si los programas necesarios estan instalados
function run {
assert_is_installed "mysql"
assert_is_installed "mysqldump"
assert_is_installed "gzip"
}
#################################################################
############### FUNCION: make_backup #########################
#################################################################
# FUNCION: Verificar si los programas necesarios estan instalados
function make_backup {
# Definimos donde se va a guardar los resultados
local BAK="$(echo $HOME/mysql)"
# Verificamos donde esta la ruta mysql
local MYSQL="$(which mysql)"
# Verificamos donde esta la ruta mysqldump
local MYSQLDUMP="$(which mysqldump)"
# Verificamos donde esta la ruta gzip
local GZIP="$(which gzip)"
# Obtenemos la fecha de hoy
local NOW="$(date +"%d_%m_%Y")"
# Si la carpeta no existe creela
[ ! -d "$BAK" ] && mkdir -p "$BAK"
#momentoActual
nombreArchivo=$BAK/${nombreDB}_${NOW}_$(date +"%H_%M_%S")
#Nombre del archivo sql que se va a crear
FILESQL=${nombreArchivo}.sql
#echo ${FILESQL}
#Nombre del archivo gzip que se va a crear
FILEGZ=${nombreArchivo}.gz
# Mandamos a hacer el respaldo
#--set-gtid-purged=OFF: obtenga un id
#--single-transaction: una transaccion simpĺe
# -9: opcion de gzip para que lo comprima a la mayor cantidad posible
# > $FILE: guarde el resultado en el archivo creado
$MYSQLDUMP --defaults-file=/root/conexionmysql.ini --single-transaction --set-gtid-purged=OFF --databases ${nombreDB} > $FILESQL
# Comprimimos el archivo y se borra de una vez
$GZIP -9 ${FILESQL}
#| $GZIP -9 > $FILE
#/usr/bin/mysqldump --defaults-file=/root/conexionmysql.ini --single-transaction --set-gtid-purged=OFF --databases bd_sis_una_vacaciones
echo "******************************************"
echo "************ RESULTADO *******************"
echo "******************************************"
echo "Se ha creado correctamente el archivo: '${FILEGZ}'"
}
# Mandamos a llamar a 2 funciones
# * run: que corre el script
# * make_backup: que respalda la BD
run
make_backup
- Y lo podemos probar
./respaldo_mysql.sh bd_sis_una_vacaciones
Vulnerabilidades
- Existe esta página donde se pueden consultar las vulnerabilidades existentes
ufw
- Podemos verificar su estado
ufw status
- Podemos permitir puertos
ufw allow 22 comment 'ssh'
- Activarlo
ufw enable
- Listar reglas
ufw status
- Las reglas tienen números si los deseamos consultar
ufw status numbered
- Ahora si por ejemplo deseamos eliminar el acceso por IP V6
ufw delete 2
- SSH solo lo deberíamos permitir desde una IP
ufw allow from 10.20.200.137 proto tcp to any port 22 comment 'Permitir SSH'
- Si deseamos eliminar las reglas
ufw reset
nmap
- Realiza un escaneo de la red
- -p-: para escanear todos lo puertos
sudo nmap -sV -sC -O -oA platzi 10.20.200.168
- Resultado
Starting Nmap 7.80 ( https://nmap.org ) at 2022-08-08 10:38 CST
Nmap scan report for 10.20.200.168
Host is up (0.00038s latency).
Not shown: 995 closed ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0)
53/tcp open domain ISC BIND 9.16.1 (Ubuntu Linux)
| dns-nsid:
|_ bind.version: 9.16.1-Ubuntu
80/tcp open http nginx 1.18.0 (Ubuntu)
|_http-server-header: nginx/1.18.0 (Ubuntu)
|_http-title: Apache2 Ubuntu Default Page: It works
111/tcp open rpcbind 2-4 (RPC #100000)
| rpcinfo:
| program version port/proto service
| 100000 2,3,4 111/tcp rpcbind
| 100000 2,3,4 111/udp rpcbind
| 100000 3,4 111/tcp6 rpcbind
|_ 100000 3,4 111/udp6 rpcbind
8080/tcp open http Apache httpd 2.4.41 ((Ubuntu))
|_http-server-header: Apache/2.4.41 (Ubuntu)
|_http-title: Apache2 Ubuntu Default Page: It works
MAC Address: A6:DD:E8:F5:85:F4 (Unknown)
No exact OS matches for host (If you know what OS is running on it, see https://nmap.org/submit/ ).
TCP/IP fingerprint:
OS:SCAN(V=7.80%E=4%D=8/8%OT=22%CT=1%CU=31872%PV=Y%DS=1%DC=D%G=Y%M=A6DDE8%TM
OS:=62F13C0B%P=x86_64-pc-linux-gnu)SEQ(SP=106%GCD=1%ISR=10C%TI=Z%CI=Z%II=I%
OS:TS=A)OPS(O1=M5B4ST11NW7%O2=M5B4ST11NW7%O3=M5B4NNT11NW7%O4=M5B4ST11NW7%O5
OS:=M5B4ST11NW7%O6=M5B4ST11)WIN(W1=FE88%W2=FE88%W3=FE88%W4=FE88%W5=FE88%W6=
OS:FE88)ECN(R=Y%DF=Y%T=40%W=FAF0%O=M5B4NNSNW7%CC=Y%Q=)T1(R=Y%DF=Y%T=40%S=O%
OS:A=S+%F=AS%RD=0%Q=)T2(R=N)T3(R=N)T4(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=R%O=%RD=0
OS:%Q=)T5(R=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)T6(R=Y%DF=Y%T=40%W=0%S
OS:=A%A=Z%F=R%O=%RD=0%Q=)T7(R=N)U1(R=Y%DF=N%T=40%IPL=164%UN=0%RIPL=G%RID=G%
OS:RIPCK=G%RUCK=G%RUD=G)IE(R=Y%DFI=N%T=40%CD=S)
Network Distance: 1 hop
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 27.01 seconds
- Como podemos ver nos brinda información de los puertos abiertos y las versiones del software y sistema operativo
nikto
- Permite verificar estado de un servidor web
- Vamos a guardar la salida en un archivo nikto.txt
- Primero instalamos
sudo apt install nikto
- Ejecutamos
nikto -h 10.20.200.168 -o nikto.txt
- Resultado
- Nikto v2.1.5
---------------------------------------------------------------------------
+ Target IP: 10.20.200.168
+ Target Hostname: 10.20.200.168
+ Target Port: 80
+ Start Time: 2022-08-08 10:44:50 (GMT-6)
---------------------------------------------------------------------------
+ Server: nginx/1.18.0 (Ubuntu)
+ Server leaks inodes via ETags, header found with file /, fields: 0x2aa6 0x5e38ea7d39faa
+ The anti-clickjacking X-Frame-Options header is not present.
+ No CGI Directories found (use '-C all' to force check all possible dirs)
+ Allowed HTTP Methods: GET, POST, OPTIONS, HEAD
+ 6544 items checked: 0 error(s) and 3 item(s) reported on remote host
+ End Time: 2022-08-08 10:44:59 (GMT-6) (9 seconds)
---------------------------------------------------------------------------
+ 1 host(s) tested
Lynis
- Nos brinda un informe de seguridad del sistema operativo
apt install lynis
- Para verificar el sistema
sudo lynis audit system
NodeJs
- Descargamos el repositorio
cd /tmp
git 0clone https://github.com/edisoncast/linux-platzi
cd linux-platzi
- Instalamos nodejs
apt install nodejs npm -y
node -v
- Esto nos instala la versión de node v10.19.0
- Si queremos utilizar la versión 10 hacemos
apt install curl
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install gcc g++ make
sudo apt-get install -y nodejs
node -v
- Agregamos el usuario nodejs
adduser nodejs
- Ahora si levantamos el servidor web que descargamos desde git
node /root/linux-platzi/server.js
- Nos indica que el servidor se levanta en el puerto 3000
- Por esto vamos hacer que nginx se ejecute como un proxy reverso par atender por el puerto 80
- Entonces vamos hacer que este servicio se levante con el sistema operativo
- Todos los servicios de inicio del SO se encuentran en
ls /lib/systemd/system
- Ahora si abrimos uno se estos podemos ver que tienen una estructura definida, por ejemplo
cat /lib/systemd/system/mysql.service
- Resultado
# MySQL systemd service file
[Unit]
Description=MySQL Community Server
After=network.target
[Install]
WantedBy=multi-user.target
[Service]
Type=notify
User=mysql
Group=mysql
PIDFile=/run/mysqld/mysqld.pid
PermissionsStartOnly=true
ExecStartPre=/usr/share/mysql/mysql-systemd-start pre
ExecStart=/usr/sbin/mysqld
TimeoutSec=infinity
Restart=on-failure
RuntimeDirectory=mysqld
RuntimeDirectoryMode=755
LimitNOFILE=10000
# Set enviroment variable MYSQLD_PARENT_PID. This is required for restart.
Environment=MYSQLD_PARENT_PID=1
- Primero debemos saber de donde corre node
which node
#Resultado
/usr/bin/node
- Entonces creamos el archivo
nano /lib/systemd/system/platzi@.service
- Agregamos
- [Unit]: una unidad indica que la verificación se realiza con systemd
- Documentacion=que la documentación esta en
- After= después que encienda la red
- [Service]: inicia la configuración del servicio
- Environment=PORT=%i: vamos a utilizar una variable de entorno que esta definida en el código y vamos aceptar varios puertos 3000, 3001, 3002, 3003 para que nginx haga un balanceo de cargas
- Type=simple: el tipo es simple
- User=nodejs: que el usuario que va ejecutar es nodejs (debe estar creado)
- WorkingDirectory= directorio donde estará trabajando (por defecto donde el se crea el directorio del usuario a la hora de crear el usuario)
- ExecStart=/usr/bin/node /home/nodejs/lunix-platzi/server.js donde esta el ejecutable de node y ejecute el script server.js
- Restart-on=failure: si existe una falla del servicio reinicie
- [Install]: configuración de install
- WantedBy=multi-user.target: que inicie con cualquier usuario
[Unit]
Description=Balanceo de carga para platzi
Documentation=https://github.com/edisoncast/linux-platzi
After=network.target
[Service]
Environment=PORT=%i
Type=simple
User=nodejs
WorkingDirectory=/home/nodejs/server
ExecStart=/usr/bin/node /home/nodejs/server/server.js
Restart=on-failure
[Install]
WantedBy=multi-user.target
- Ahora dentro de la carpeta del proyecto existe la carpeta
ls /root/linux-platzi/configuracion_servidor/bash/
- Esta tiene los script para habilitar, iniciar y detener el servicio
enable.sh start.sh stop.sh
NOTA: Journalctl
- Si deseamos darle seguimiento a un servicio podemos hacer
- f: seguimiento
- u: unidad
journalctl -fu platzi@.service
Continuamos
- Creamos la carpeta del servicio
# Ingresamos con el suuario nodejs
su - nodejs
#Clonamos el proyecto
git clone https://github.com/edisoncast/linux-platzi
#Listamos para comprobar
ls linux-platzi/
#Renombramos la carpeta
mv linux-platzi/ server
#Salimos del usuario
exit
- Iniciamos el servicio
cd /root/linux-platzi/configuracion_servidor/bash/
chmod 777 *
./enable.sh
#Resultado
Created symlink /etc/systemd/system/multi-user.target.wants/platzi@3000.service -> /lib/systemd/system/platzi@.service.
Created symlink /etc/systemd/system/multi-user.target.wants/platzi@3001.service -> /lib/systemd/system/platzi@.service.
Created symlink /etc/systemd/system/multi-user.target.wants/platzi@3002.service -> /lib/systemd/system/platzi@.service.
Created symlink /etc/systemd/system/multi-user.target.wants/platzi@3003.service -> /lib/systemd/system/platzi@.service.
#iniciamos el servcio
./start.sh
- Comprobamos su estado
systemctl status platzi@3000.service
- Si ejecutamos
curl localhost:3000
#Resultado
El servidor de platzi está corriendo con pid 2290715 y en el puerto 3000
nginx proxy reverso
- Verificamos que esta corriendo
systemctl status nginx
- Ingresamos a
cd /etc/nginx/sites-available/
- Truncamos (limpiamos el contenido del archivo)
truncate -s0 default
- Abrimos el archivo
nano default
- Agregamos
server {
#Escuche IP V4 por puerto 80 / sea servidor defecto
listen 80 default_server;
#Escuche IP V6 por puerto 80 / sea servidor defecto
listen [::]:80 default_server;
#Que el nombre del servidor sea cualquier cosa
server_name _;
# La ubicacion que va abriri sea la raiz
location / {
# Indicamos que el parametro de header va ser la variable de nginx $proxy_add_x_forwarded_for
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# Que el nombre del hosts lo tome de la variable $host
proxy_set_header Host $host;
# Que la version del http va ser la 1.1 (desactualizada)
proxy_http_version 1.1;
# Todo los que llegue lo vamos a reenviar a http://backend
proxy_pass http://backend;
}
}
# Creamos los backend
upstream backend {
server 127.0.0.1:3000;
server 127.0.0.1:3001;
server 127.0.0.1:3002;
server 127.0.0.1:3003;
}
- verificamos la configuración
nginx -t
- Resultado
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
- Iniciamos
systemctl start nginx
systemctl status nginx