Revisión de servidores 2022. Seguridad V4

Modificación de usuarios

  • Modificamos la contraseña del usuario root de CA3 a A0
  • Ingresamos como el usuario root
  • Ejecutamos el comando
passwd
  • Resultado
#Resultado
Introduzca la nueva contraseña de UNIX: A0
Vuelva a escribir la nueva contraseña de UNIX: A0
passwd: contraseña actualizada correctamente
  • Eliminamos el usuario ugit
userdel -r ugit
  • Verificamos que no existe el usuario ugit
less /etc/passwd
  • Crea el usuario orion
adduser orion
  • Resultado
Añadiendo el usuario `orion' ...
Añadiendo el nuevo grupo `orion' (1000) ...
Añadiendo el nuevo usuario `orion' (1000) con grupo `orion' ...
Creando el directorio personal `/home/orion' ...
Copiando los ficheros desde `/etc/skel' ...
Introduzca la nueva contraseña de UNIX: V1
Vuelva a escribir la nueva contraseña de UNIX: V1
passwd: contraseña actualizada correctamente
Cambiando la información de usuario para orion
Introduzca el nuevo valor, o pulse INTRO para usar el valor predeterminado
	Nombre completo []: UGIT
	Número de habitación []: 
	Teléfono del trabajo []: 
	Teléfono de casa []: 
	Otro []: 
¿Es correcta la información? [S/n] 
  • Añadimos el usuario al grupo «root»
adduser orion root
  • Resultado
Añadiendo al usuario `orion' al grupo `root' ...
Añadiendo al usuario orion al grupo root
Hecho.
  • Abrimos
nano /etc/ssh/sshd_config
  • Modificamos el acceso de ssh para dar permiso a orion
AllowUsers root ugit
X
AllowUsers root orion
  • Reiniciamos el servicio
/etc/init.d/ssh restart
  • Verificamos que podemos ingresar con ambos usuarios
ssh root@10.20.200.15 -p 44 A0
ssh orion@10.20.200.15 -p 44 V1

Actualización del sistema

  • Si es basado en debian
apt update
apt upgrade
apt dist-upgrade
apt autoremove

Problemas Principales

  • Debian 10: NO_PUBKEY 467B942D3A79BD29
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 467B942D3A79BD29

  • d

Dependencias

  • Instalamos dependencias
apt-get install make build-essential net-tools git -y

Instalación y configuración de SSH

  • Instalamos el servicio:
apt install openssh-server openssh-client -y
  • Abrimos el archivo:
nano /etc/ssh/sshd_config
  • Modificamos el número de puerto
#Port 22
X
Port 44
  • Por defecto cualquier usuario del sistema que tenga permisos de shell se puede conectar por SSH, indicamos que nos podemos conectar por root
#PermitRootLogin prohibit-password
X
PermitRootLogin yes
  • Aplicamos las siguientes configuraciones:
-----------------------------------------------------------------------
#Tiempo para introducir la contraseña
-----------------------------------------------------------------------
#LoginGraceTime 2m
X
LoginGraceTime 45

-----------------------------------------------------------------------
#Número de sesiones máxima por usuario permitida
-----------------------------------------------------------------------
#StrictModes yes
X
StrictModes yes

-----------------------------------------------------------------------
#Números de intentos permitidos de introducir la contraseña antes de desconectarnos
-----------------------------------------------------------------------
#MaxAuthTries 6
X
MaxAuthTries 3

-----------------------------------------------------------------------
#Número de sesiones máxima por usuario permitida
-----------------------------------------------------------------------
#MaxSessions 10
X
MaxSessions 8 

-----------------------------------------------------------------------
#Si queremos habilitar el acceso ssh de usuarios del sistema con usuario y clave
#yes
#Si lo queremos impedir: no
-----------------------------------------------------------------------
#PubkeyAuthentication yes
X
PubkeyAuthentication yes
-----------------------------------------------------------------------
#PasswordAuthentication yes
X
PasswordAuthentication yes
-----------------------------------------------------------------------


-----------------------------------------------------------------------
#Agregamos al final del archivo: usuarios permitidos para conexión ssh
-----------------------------------------------------------------------
AllowUsers root orion 

  • Para brindar una mayor seguridad, vamos a indicarle a openssh cuales algoritmos de intercambio de claves, cifrado simétrico y configuración de HMAC para la comprobación de la integridad deseamos utilizar.
  • Vamos añadir también al final del archivo:
KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group18-sha512,diffie-hellman-group14-sha256,diffie-hellman-group16-sha512
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
MACs hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,umac-128-etm@openssh.com
HostKeyAlgorithms ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,ssh-rsa,ssh-dss,ssh-ed25519
  • Reiniciamos el servicio
/etc/init.d/ssh restart

Configuración de postfix – gmail

echo "Contenido" | mail -s "nombre_servidor" gustavo.matamoros@gmail.com

Instalación clamav

  • Instalamos el software
apt install clamav clamav-daemon -y
  • Detenemos el servicio para actualizar la base de datos
systemctl stop clamav-freshclam.service
  • Modificamos la configuración para que vea el servidor local de clamav
nano /etc/clamav/freshclam.conf
  • Comentamos las lineas
DatabaseMirror db.local.clamav.net
DatabaseMirror database.clamav.net
  • Agregamos al final
DatabaseMirror clamav.siua.ac.cr
PrivateMirror clamav.siua.ac.cr
DatabaseCustomURL http://clamav.siua.ac.cr/main.cvd
DatabaseCustomURL http://clamav.siua.ac.cr/daily.cvd
DatabaseCustomURL http://clamav.siua.ac.cr/bytecode.cvd
DatabaseCustomURL http://clamav.siua.ac.cr/safebrowsing.cvd
  • Actualizamos la base de datos
freshclam
  • Si da el error
Clamd was NOT notified: Can't connect to clamd through /var/run/clamav/clamd.ctl
  • 1->Reiniciamos el servidor
  • 2->Si no funciona ejecutamos
service clamav-daemon restart
  • Establecemos que el servicio arranque con el sistema
systemctl enable clamav-freshclam
  • Iniciamos el servicio
systemctl start clamav-freshclam
  • NOTA: El directorio /sys de problemas de permisos pero como ningún cliente va acceder por tanto lo podemos excluir
  • Escaneamos el sistema excluyendo sys (Omitir solo para conocimiento)
clamscan -ri --exclude-dir=/sys/ /
  • Donde:
    • r: recursivo
    • i: busque infecciones
    • –exclude-dir: excluya el directorio
    • / = cual directorio raíz

Envió de correo por parte de clamav

  • Vamos a configurar el escaneo automático a las 11:30pm por parte de clamav
  • Y vamos hacer que si detecta una infección envié los archivos a cuarentena
  • Primero debemos garantizar que el servidor puede enviar correos por la terminal con los pasos anteriores
  • Creamos la carpeta de cuarentena dentro del directorio de root
mkdir /root/clamav
  • Creamos las carpetas “cuarentena” y “logs” dentro de clamav
mkdir /root/clamav/cuarentena
mkdir /root/clamav/logs
  • Creamos el script
nano /usr/local/bin/clamav.sh
  • Agregamos el código
#!/bin/bash
# ClamAV_Scan_Script
# Script que ejecuta un escaneo con ClamAV del dir o archivo seleccionado
# editado del original en "http://www.taringa.net/comunidades/ubuntuparataringeros/1327480/[Tip]-Script-para-escanear-fácilmente-con-ClamAV.html"
# -----------------------------------------------------------------------------
# Crear la carpeta "clamav" dentro del directorio "$HOME" y dentro de la misma
# crear las carpetas "cuarentena" y "logs" dentro de "clamav"
# ----------------------------------------------------------------------------
# Ubicar el Script en "/usr/local/bin" y darle permisos de ejecucion
# "chmod +x /usr/local/bin/clamav"
# Ubicarlo en el "crontab" para su ejecucion el dia seleccionado
# ---------------------------------------------------------------------------
#
# --Carpetas de Configuracion -- #
clamfolder="clamav"
logfolder="logs"
cuarentenafolder="cuarentena"
logfile="clamscan-`date +%F_%T`.log"
dirs="/ " #directorios a verificar
scan=/usr/bin/clamscan
userhome="$HOME"
user=`whoami`

# -- Codigo de arranque -- #
echo "ClamAV scan Iniciado el dia" `date` "por el usuario" ${user} "- Guardado como" \
${userhome}/${clamfolder}/${logfolder}/${logfile}\ > ${userhome}/${clamfolder}/${logfolder}/${logfile}

echo "Iniciando escaneo con ClamAV..."
$scan --infected --recursive --log=${userhome}/${clamfolder}/${logfolder}/${logfile} \
--move=${userhome}/${clamfolder}/${cuarentenafolder} --exclude-dir=/sys/ $dirs
echo "Finalizado escaneo con Clamav" `date`
  • Le otorgamos permisos
chmod +x /usr/local/bin/clamav.sh
  • Probamos el funcionamiento (Opcional)
. /usr/local/bin/clamav.sh
  • Ahora creamos una tarea crontab
crontab -e
  • Agregamos
30 23 * * * /usr/local/bin/clamav.sh 2>&1 | tee /root/clamav/output.txt | mail -s "clamav: $(hostname -s)" log@siua.ac.cr

Verificación de instalación rkhunter

  • Primero verificamos si lo tiene instalado
rkhunter --update
  • Verificamos el script
nano /etc/cron.monthly/rkhunter.sh
  • Debe estar así
#!/bin/sh
(
rkhunter --update --check --sk --nocolors --rwo --pkgmgr dpkg
) | mail -s 'rkhunter: SERVIDOR' log@siua.ac.cr
  • Si lo tiene instalado y actualiza correctamente escanee el sistema como:
rkhunter -c
  • Si lo tiene instalado y da el siguiente error
Invalid WEB_CMD configuration option: Relative pathname: "/bin/false"
  • Abra el archivo
nano /etc/rkhunter.conf
  • Y modifique
UPDATE_MIRRORS=0
X
UPDATE_MIRRORS=1

MIRRORS_MODE=1
X
MIRRORS_MODE=0

WEB_CMD="/bin/false"
X
WEB_CMD=""
  • Y proceda a actualizarlo
rkhunter --update
  • Y luego verifique el sistema
rkhunter -c
  • Si no lo tiene instalado aplique la sección siguiente

Instalación de rkhunter

  • Instalamos rkhunter que es un escáner que analiza y busca en nuestro ordenador, backdoors, exploits, sniffers y por supuesto rootkits, realizando diferentes pruebas a nuestro sistema.
  • Ingresamos a tmp para que después del siguiente reinicio se eliminen los archivos:
cd /tmp
  • Descargamos el fichero:
wget /wp-content/uploads/2019/09/rkhunter-1.4.6.tar.gz
  • Lo descomprimimos:
tar -zxf rkhunter-1.4.6.tar.gz
  • Ingresamos a la carpeta:
cd rkhunter-1.4.6
  • Lo instalamos:
./installer.sh --install
  • Podemos verificar la versión:
rkhunter --versioncheck
  • Actualizamos la base de datos:
rkhunter --update
  • Crear el archivo rkhunter.dat
rkhunter --propupd
  • Ahora podemos verificar el sistema (Opcional)
rkhunter -c
  • Ahora creamos un cron mensual para que verifique nuestro sistema
  • Creamos una archivo en:
nano /etc/cron.monthly/rkhunter.sh
  • Agregamos
#!/bin/sh
(
rkhunter --update --check --sk --nocolors --rwo --pkgmgr dpkg
) | mail -s 'rkhunter: SERVIDOR' log@siua.ac.cr
  • Le damos permisos
chmod +x /etc/cron.monthly/rkhunter.sh
  • Podemos verificar el funcionamiento con
. /etc/cron.monthly/rkhunter.sh

Verificación de Chkrootkit (Contenedor no se instala)

  • NOTA: si el servidor es un contenedor este programa no se debe instalar
  • Primero verificamos si se encuentra instalado, para esto
chkrootkit -q
  • Si da el siguiente error
can't exec ./strings-static,
  • Ejecute
apt remove chkrootkit
apt install chkrootkit

# Vuelva a intentarlo
chkrootkit -q
  • Si no es un contenedor y no se encuentra instalado, en la siguiente sección explica como realizar el proceso

Chkrootkit (si es contenedor debian no se instala)

  • Programa que permite buscar rootkits
  • Ingresamos a /tmp para que los archivos sean eliminados después de reiniciar
cd /tmp
wget /wp-content/uploads/2019/09/chkrootkit.tar.gz
  • Lo descomprimimos:
tar xvfz chkrootkit.tar.gz
  • Ingresamos a la carpeta:
cd chkrootkit-0.53/
  • Lo compilamos:
make sense
  • Regresamos un nivel en la capeta:
cd ..
  • Movemos el contenido a /usr/local/chkrootkit
mv chkrootkit-0.53/ /usr/local/chkrootkit
  • Ingresamos a la carpeta para verificar que existen los archivos
cd /usr/local/chkrootkit/
  • Creamos una enlace simbólico
ln -s /usr/local/chkrootkit/chkrootkit /usr/local/bin/chkrootkit
  • Verificamos el servidor:
#Muestra todo la salida
chkrootkit 

#Muestra solo las detecciones
chkrootkit -q
  • Creamos un cron que se ejecute todos los meses
  • Ejecutamos:
crontab -e
  • Le agregamos el siguiente contenido
@monthly /usr/local/chkrootkit/chkrootkit -q | mail -s "chkrootkit: $(hostname -s)" log@siua.ac.cr

Verificación de logwatch

  • Logwatch es un sistema de monitoreo de logs personalizable. Su función es revisar los logs del sistema en un período de tiempo determinado y elaborar un resumen con el nivel de detalle que se desee. Luego es capaz de enviar el resumen por mail en forma de reporte. Es muy útil para monitorear la actividad de los servidores y detectar posibles abusos, intentos de intrusión, consumo de recursos, etc.
  • Es importante saber que logwatch se instala en «/usr/share/logwatch» pero crea una estructura de archivos en /etc/logwatch, la idea es que toda configuración «adicional» la hagamos aquí y esta sobreescriba a la de /usr/share/logwatch
  • Abrimos el archivo
nano /etc/logwatch/conf/logwatch.conf
  • Verificamos que tenga la siguiente configuración
Output = mail

Format = html

MailTo = log@siua.ac.cr

MailFrom = Logwatch_SERVIDOR

Detail = 8
  • Es probable que si siguió esta guía al momento de reinstalar postfi se haya eliminado logwatch por lo que lo reinstalamos
apt install logwatch -y
  • Probamos el funcionamiento
logwatch
  • Si no lo tiene instalado siga la siguiente sección.

Instalar logwatch

  • Los instalamos
apt-get install logwatch -y
  • Copiamos el archivos de configuración de «fábrica»
cp /usr/share/logwatch/default.conf/logwatch.conf /etc/logwatch/conf/logwatch.conf
  • Creamos una carpeta requerida:
mkdir /var/cache/logwatch
  • Abrimos el archivo: (CAMBIO PLANTILLA)
nano /etc/logwatch/conf/logwatch.conf
  • Modificamos:
-------------------------------------------------------------- 
Output = stdout 
X 
Output = mail 
-------------------------------------------------------------- 

-------------------------------------------------------------- 
Format = text 
X 
Format = html 
-------------------------------------------------------------- 
MailTo = root 
X 
MailTo = log@siua.ac.cr
-------------------------------------------------------------- 
MailFrom = Logwatch 
X 
MailFrom = Logwatch_NOMBRE_SERVIDOR -------------------------------------------------------------- 
Detail = Low 
X 
Detail = 8 
--------------------------------------------------------------
  • Si fuera necesario modificar el archivo:
nano /etc/cron.daily/00logwatch

Instalar Fail2ban

  • Instalamos:
apt-get install fail2ban -y
  • Copiamos el archivo
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
  • Abrimos el archivo
nano /etc/fail2ban/jail.local
  • Buscamos y remplazamos:
ignoreip = 127.0.0.1/8 
X 
ignoreip = 127.0.0.1 10.20.190.0/24 10.20.200.0/24 181.193.87.0/28 10.30.240.0/24 201.237.206.56 

-------------------------------------------------------------- 
bantime  = 10m 
X 
bantime = 172800 
-------------------------------------------------------------- 
maxretry = 5 
X 
maxretry = 3 
-------------------------------------------------------------- 
destemail = root@localhost 
X 
destemail = ataques@siua.ac.cr 
  • Guardamos el archivo y cerramos
  • Remplazamos el contenido dependiendo de los servicios que desea controlar
  • Podemos saber los servicios corriendo con alguno de los siguientes comandos:
ps -axf
lsof -i -P -n
lsof -i -P -n | grep LISTEN
  • Ahora abrimos el archivo de jail para habilitar servicios
nano /etc/fail2ban/jail.d/defaults-debian.conf
  • Agregamos la jail de SSHD
#***********************************
#*********** SSH  ******************
#***********************************
[sshd]
enabled = true

[sshd-ddos]
enabled = true
  • Como nevia correos agregamos la jail de postfix
#***********************************
#**********  POSTFIX ***************
#***********************************
[postfix]
enabled  = true

[postfix-rbl]
enabled = true
  • MYSQL
#***********************************
#*********  MYSQL   ****************
#***********************************
[mysqld-auth]
enabled = true
  • Apache
#*********************************** 
#********** APACHE **************** 
#***********************************
[apache-auth]
enabled = true

[apache-badbots]
enabled = true

[apache-noscript]
enabled = true

[apache-overflows]
enabled = true

[apache-nohome]
enabled = true

[apache-botsearch]
enabled = true

[apache-fakegooglebot]
enabled = true

[apache-modsecurity]
enabled = true

[apache-shellshock]
enabled = true
  • NGINX
#***********************************
#**********  NGINX  ****************
#***********************************
[nginx-http-auth]
enabled = true
  • Reiniciamos fail2ban:
service fail2ban restart
  • Limpiamos el log
fail2ban-client flushlogs
  • Modificar el tiempo de banea a 2 días (2880 segundos)
fail2ban-client set dbpurgeage 2880

Centralización UGIT – BLACKLIST

  • Instalamos dependencias
apt-get install mysql-client curl jq -y
  • Ingresamos al directorio
cd /etc/fail2ban/
  • Abrimos el archivo
nano /etc/fail2ban/jail.local
  • Buscamos la linea
# The simplest action to take: ban only
  • Y antes de esta linea insertamos
############################################################################################################################################
################ ACCION UGIT: Banea la Ip, envia un mail, Inserta en BD y la incluye en el IPSET de PROMOX ################################
############################################################################################################################################

action_ugit = %(banaction)s[name=%(__name__)s, bantime="%(bantime)s", port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
              %(mta)s-whois[name=%(__name__)s, sender="%(sender)s", dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]
              ip-to-blacklist-ugit
  • Ahora cambiamos la accion defecto por buscamos y remplazamos
action = %(action_)s
X
action = %(action_ugit)s
  • Creamos el archivo
nano /etc/fail2ban/action.d/ip-to-blacklist-ugit.conf
  • Agregamos el siguiente contenido
[INCLUDES]

before = iptables-common.conf

[Definition]

actionban = /etc/fail2ban/agrega_ip_blacklist-ugit.sh <ip>

[Init]
  • Reiniciamos fail2ban
service fail2ban restart
  • Creamos el archivo
nano /etc/fail2ban/agrega_ip_blacklist-ugit.sh
  • Agregamos
#! /bin/bash

#######################################################################
#################           PARAMETROS             ####################
#######################################################################
#ip_ban="119.94.116.145"
#Le pasamos el primer parametro del script
ip_ban=$1



#######################################################################
################     VARIABLES: IP                 ####################
#######################################################################
Fecha_Hora=`date +"%Y-%m-%d %T"`
servidor_atacado=$(hostname -s)





###########################################################################################################
###########################################################################################################
###########                        FUNCION Comprobar si ya existe la IP                   #################
###########################################################################################################
###########################################################################################################
function verificaExiste () {
    RESPUESTA=$(mysql --defaults-file=/root/conexionmysql.ini -s <<<"SELECT IP_SAE_SIGESTIC_BLIP FROM tab_sae_sigetic_blacklist_ips WHERE IP_SAE_SIGESTIC_BLIP = '$ip_ban'")
    #printf $RESPUESTA
    #Ejemplos 124.7.227.112 (si)
    #124.7.227.113 (no)
    if [[ $RESPUESTA ]]
    then
      #Existe
      true
    else
      #No existe
      false
    fi
}

###########################################################################################################
###########################################################################################################
######################            Funcion: guardarSigetic                                  ################
###########################################################################################################
###########################################################################################################
#Esta función obtiene los datos de la IP atacante desde Whois

function guardarSigetic () {

  ##########################################################################
  #####################  P6: Inserta en MYSQL      #########################
  ##########################################################################
  #NOTA: IP va sin comillas ya que se obtienen desde la obtención de datos
  mysql --defaults-file=/root/conexionmysql.ini -e "
  insert into tab_sae_sigetic_blacklist_ips
    (
      IP_SAE_SIGESTIC_BLIP,
      Nombre_Red_SAE_SIGESTIC_BLIP,
      Organizacion_SAE_SIGESTIC_BLIP,
      Codigo_Pais_SAE_SIGESTIC_BLIP,
      Nombre_Pais_SAE_SIGESTIC_BLIP,
      Codigo_Region_SAE_SIGESTIC_BLIP,
      Nombre_Region_SAE_SIGESTIC_BLIP,
      Ciudad_SAE_SIGESTIC_BLIP,
      CIDR_SAE_SIGESTIC_BLIP,
      Latitud_SAE_SIGESTIC_BLIP,
      Longitud_SAE_SIGESTIC_BLIP,
      Fecha_Hora_SAE_SIGESTIC_BLIP,
      Servidor_SAE_SIGESTIC_BLIP
    ) values(
      $ip,
      '$nombre',
      '$organizacion',
      '$country_code',
      '$country_name',
      '$region_code',
      '$region_name',
      '$city',
      '$cidr',
      '$latitude',
      '$longitude',
      '$Fecha_Hora',
      '$servidor_atacado'
    );" $1 &> /dev/interuniversitariadealajuela

    true
}


###########################################################################################################
###########################################################################################################
######################            Funcion: obtenerInformacionIPFreeGEOIP                   ################
###########################################################################################################
###########################################################################################################
#Esta función obtiene los datos de la IP atacante desde freegeoip

function obtenerInformacionIPFreeGEOIP () {


  #############################################################
  #PASO01: Obtenemos los datos desde https://reallyfreegeoip.org
  #y creamos un json con el resultado se guarda en nano /etc/fail2ban/freegeoip.json
  #############################################################
  curl -sS https://reallyfreegeoip.org/json/$ip_ban > freegeoip.json



  #############################################################
  #PASO02: Obtenemos la información desde el JSON
  #############################################################
  freegeoip=$(cat freegeoip.json)

  printf "******************************************\n"
  printf "***** RESULTADOS DE: freegeoip   *********\n"
  printf "******************************************\n"
  echo $freegeoip

  #############################################################
  #PASO03: Verificamos los valores
  #############################################################
  #-z: string is null, that is, has zero length
  
  
  #************************************************************
  #************************************************************
  #OBTENER: IP 
  #************************************************************
  #************************************************************
  ip=$(echo ${freegeoip} | jq '.ip')
  if [ ! -z "$ip" ]
  then
    ip=$ip
  else
    ip="DESCONOCIDA"
  fi

  #************************************************************
  #************************************************************
  #OBTENER: country_code 
  #************************************************************
  #************************************************************
  country_code=$(echo ${freegeoip} | jq -r '.country_code')
  if [ ! -z "$country_code" ]
  then
    country_code=$country_code
  else
    country_code="VACIO"
  fi

  #************************************************************
  #************************************************************
  #OBTENER: country_name 
  #************************************************************
  #************************************************************
  country_name=$(echo ${freegeoip} | jq -r '.country_name')
  if [ ! -z "$country_name" ]
  then
    country_name=$country_name
  else
    country_name="DESCONOCIDO"
  fi

  #************************************************************
  #************************************************************
  #OBTENER: region_code 
  #************************************************************
  #************************************************************
  region_code=$(echo ${freegeoip} | jq -r '.region_code')
  if [ ! -z "$region_code" ]
  then
    region_code=$region_code
  else
    region_code="VACIO"
  fi

  #************************************************************
  #************************************************************
  #OBTENER: region_name 
  #************************************************************
  #************************************************************
  region_name=$(echo ${freegeoip} | jq -r '.region_name')
  if [ ! -z "$region_name" ]
  then
    region_name=$region_name
  else
    region_name="DESCONOCIDO"
  fi

  #************************************************************
  #************************************************************
  #OBTENER: city 
  #************************************************************
  #************************************************************
  city=$(echo ${freegeoip} | jq -r '.city')
  if [ ! -z "$city" ]
  then
    city=$city
  else
    city="DESCONOCIDO"
  fi

  #************************************************************
  #************************************************************
  #OBTENER: latitude 
  #************************************************************
  #************************************************************
  latitude=$(echo ${freegeoip} | jq -r '.latitude')
  if [ ! -z "$latitude" ]
  then
    latitude=$latitude
  else
    latitude="0.000000"
  fi

  #************************************************************
  #************************************************************
  #OBTENER: longitude 
  #************************************************************
  #************************************************************
  longitude=$(echo ${freegeoip} | jq -r '.longitude')
  if [ ! -z "$longitude" ]
  then
    longitude=$longitude
  else
    longitude="0.000000"
  fi



  printf "******************************************\n"
  printf "******* DATOS FINALES: FREEGEOIP *********\n"
  printf "******************************************\n"
  printf "ip:${ip}\n"
  printf "country_code:${country_code}\n"
  printf "country_name:${country_name}\n"
  printf "region_code:${region_code}\n"
  printf "region_name:${region_name}\n"
  printf "city:${city}\n"
  printf "latitude:${latitude}\n"
  printf "longitude:${longitude}\n"

  #Resultado
  true
}



###########################################################################################################
###########################################################################################################
######################            Funcion: obtenerInformacionIPWhois                       ################
###########################################################################################################
###########################################################################################################
#Esta función obtiene los datos de la IP atacante desde Whois

function obtenerInformacionIPWhois () {

  #############################################################
  #PASO01: Obtenemos los datos desde whois.arin.net
  #y creamos un archivo con el resultado se guarda en nano /etc/fail2ban/whois.txt
  #############################################################
  whois $ip_ban -h whois.arin.net > whois.txt

  #############################################################
  #PASO02: Obtenemos la información desde el TXT
  #############################################################
 
  #Obtenemos la linea deseada -i: Ignorar mayusculas y minusculas -m 1 solo el primer resultado
  netname=`cat whois.txt | grep -i -m 1 NetName: | tail -n 1`
  #Recortamos el valor
  netname=${netname#"NetName:        "}
  

  #organization
  organization=`cat whois.txt | grep -i organization: | tail -n 1`
  organization=${organization#"Organization:   "}


  #responsible
  responsible=`cat whois.txt | grep -i responsible: | tail -n 1`
  responsible=${responsible#"responsible: "}

  #role
  role=`cat whois.txt | grep -i role: | tail -n 1`
  role=${role#"role:           "}


  #cidr
  cidr=`cat whois.txt | grep -i cidr: | tail -n 1`
  cidr=${cidr#"CIDR:           "}


  #route
  route=`cat whois.txt | grep -i route: | tail -n 1`
  route=${route#"route:          "}

  #############################################################
  #PASO03: DETERMINAR VALORES CORRECTOS
  #############################################################
  


  #************************************************************
  #Nombre
  #************************************************************
  if [ ! -z "$netname" ]
  then
    nombre=$netname
  else
    if [ ! -z "$organization" ]
    then
      nombre=$organization
    else
      if [ ! -z "$responsible" ]
      then
        nombre=$responsible
      else
        if [ ! -z "$role" ]
        then
          nombre=$role
        else
          nombre="No existe"
        fi
      fi
    fi
  fi

  #************************************************************
  #Nombre
  #************************************************************
  if [ ! -z "$organization" ]
  then
    organizacion=$organization
  else
    if [ ! -z "$netname" ]
    then
      organizacion=$netname
    else
      if [ ! -z "$responsible" ]
      then
        organizacion=$responsible
      else
        if [ ! -z "$role" ]
        then
          organizacion=$role
        else
          organizacion="No existe"
        fi
      fi
    fi
  fi

  #************************************************************
  #cidr
  #************************************************************
  if [ ! -z "$route" ]
  then
    cidr=$route
  else
    if [ ! -z "$cidr" ]
    then
      cidr=$cidr
    else
      cidr=""
    fi
  fi


  printf "******************************************\n"
  printf "***********     DATOS: WHOIS     *********\n"
  printf "******************************************\n"
  printf "netname:${netname}\n"
  printf "organization:${organization}\n"
  printf "responsible:${responsible}\n"
  printf "role:${role}\n"
  printf "cidr:${cidr}\n"
  printf "route:${route}\n"

  #Resultado
  true

}

###########################################################################################################
###########################################################################################################
######################            Funcion: enviacorreo                       ################
###########################################################################################################
###########################################################################################################

function enviacorreo(){

      correoDestino="ataques@siua.ac.cr"
      correoSender="servidores@siua.ac.cr"
      logo="https://www.siua.ac.cr/img/logo.png"

      correo="<!DOCTYPE>"
      correo="$correo<html>"
      correo="$correo<head>"
      correo="$correo<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>"
      correo="$correo<meta name='viewport' content='width=device-width, initial-scale=1'>"
      correo="$correo<title>[F2B: $servidor_atacado/$ip_ban] </title>"
      correo="$correo<style type='text/css'>"
      correo="$correo table, th, td {border: 1px solid black; padding:5px}a{text-decoration: none;}.link:hover {text-decoration: none !important;}@media screen and (min-width: 650px) {.des-pt50 {padding-top: 50px !important;}.des-pb50 {padding-bottom: 50px !important;}.des-mauto {margin: 0px !important;}.des-pb0 {padding-bottom: 0px !important;}.td, .tfoot, .thead {display: table-cell !important;}.table {display: table; width: 100%;}}"
      correo="$correo</style>"
      correo="$correo</head>"
      correo="$correo<body style='margin:0;padding:0;background: #F8F8F8;' id='body'>"
      correo="$correo<div class='tac pt10 pb10 pl10 pr10' style='padding-top:10px;padding-bottom:10px;padding-right:10px;padding-left:10px;text-align:center;background: #015289;'>"
      correo="$correo<div class='table' style='max-width: 600px; margin:0 auto;'>"
      correo="$correo<div class='td w50p vam' style='vertical-align:middle;'>"
      correo="$correo<img alt='SIUA' border='0' class='pb10 des-mauto des-pb0' src='${logo}' style='display:block;border:0;padding-bottom:10px;margin:0 auto; display: block; color: #ffffff; ' width='125'>"
      correo="$correo</div>"
      correo="$correo<div class='td w50p vam des-tar' style='vertical-align:middle;'>"
      correo="$correo<p class='white' style='margin:0;font-size:16px;font-family: Helvetica, Arial, sans-serif;color:#ffffff;'>"
      correo="$correo Unidad de Gestión e Innnovación Tecnológica"
      correo="$correo</p>"
      correo="$correo</div>"
      correo="$correo</div>"
      correo="$correo</div>"
      correo="$correo<div class='frame' style='background:#F8F8F8;'>"
      correo="$correo<div class='pl15 pr15 pt35 des-pt50 pb25 des-pb50' style='padding-right:15px;padding-left:15px;padding-bottom:25px;padding-top:35px;'>"
      correo="$correo<div class='wrapper pt35 pb35 pl35 pr35 box' style='padding-top:35px;padding-bottom:35px;padding-right:35px;padding-left:35px;max-width:600px;margin:0 auto;text-align:center;mso-element-frame-width:800px;mso-element:para-border-div;mso-element-left:center;mso-element-wrap:no-wrap-beside;mso-padding-top-alt:50px;background:#ffffff;border-radius:10px;'>"
      correo="$correo<h2 class='fsz30 lh36 bold pt25 pb15 mso-mb15' style='font-family:Helvetica, Arial, sans-serif;margin:0;padding-bottom:15px;padding-top:25px;color:#353a3e;font-family:Helvetica, Arial, sans-serif;font-weight:bold;font-size:30px;line-height:36px;mso-margin-bottom-alt:15px;'>"
      correo="$correo IPs Incluidas en BD"
      correo="$correo</h2>"
      correo="$correo<p class='fsz16 lh24 mso-mb25' style='margin:0;color:#777777;font-family:Helvetica, Arial, sans-serif;font-size:16px;line-height:24px;mso-margin-bottom-alt:25px;'>"
      correo="$correo<table style='width:100%; background-color:#FFFFFF;border-collapse: collapse;align:center'>"
      
      correo="$correo<tr>"
      correo="$correo<td style='text-align:center; background-color:#015289;color:#ffffff;'>IP</td>"
      correo="$correo<td>${ip_ban}</td>"
      correo="$correo</tr>"

      correo="$correo<tr>"
      correo="$correo<td style='text-align:center; background-color:#015289;color:#ffffff;'>Fecha y Hora</td>"
      correo="$correo<td>${Fecha_Hora}</td>"
      correo="$correo</tr>"

      correo="$correo<tr>"
      correo="$correo<td style='text-align:center; background-color:#015289;color:#ffffff;'>Country Code</td>"
      correo="$correo<td>${country_code}</td>"
      correo="$correo</tr>"

      correo="$correo<tr>"
      correo="$correo<td style='text-align:center; background-color:#015289;color:#ffffff;'>Country Name</td>"
      correo="$correo<td>${country_name}</td>"
      correo="$correo</tr>"

      correo="$correo<tr>"
      correo="$correo<td style='text-align:center; background-color:#015289;color:#ffffff;'>Region Code</td>"
      correo="$correo<td>${region_code}</td>"
      correo="$correo</tr>"

      correo="$correo<tr>"
      correo="$correo<td style='text-align:center; background-color:#015289;color:#ffffff;'>Region Name</td>"
      correo="$correo<td>${region_name}</td>"
      correo="$correo</tr>"

      correo="$correo<tr>"
      correo="$correo<td style='text-align:center; background-color:#015289;color:#ffffff;'>City</td>"
      correo="$correo<td>${city}</td>"
      correo="$correo</tr>"

      correo="$correo<tr>"
      correo="$correo<td style='text-align:center; background-color:#015289;color:#ffffff;'>Latitude</td>"
      correo="$correo<td>${latitude}</td>"
      correo="$correo</tr>"

      correo="$correo<tr>"
      correo="$correo<td style='text-align:center; background-color:#015289;color:#ffffff;'>Longitude</td>"
      correo="$correo<td>${longitude}</td>"
      correo="$correo</tr>"


      correo="$correo<tr>"
      correo="$correo<td style='text-align:center; background-color:#015289;color:#ffffff;'>Netname</td>"
      correo="$correo<td>${netname}</td>"
      correo="$correo</tr>"


      correo="$correo<tr>"
      correo="$correo<td style='text-align:center; background-color:#015289;color:#ffffff;'>Organization</td>"
      correo="$correo<td>${organization}</td>"
      correo="$correo</tr>"

      correo="$correo<tr>"
      correo="$correo<td style='text-align:center; background-color:#015289;color:#ffffff;'>Responsible</td>"
      correo="$correo<td>${responsible}</td>"
      correo="$correo</tr>"

      correo="$correo<tr>"
      correo="$correo<td style='text-align:center; background-color:#015289;color:#ffffff;'>cidr</td>"
      correo="$correo<td>${cidr}</td>"
      correo="$correo</tr>"

      correo="$correo<tr>"
      correo="$correo<td style='text-align:center; background-color:#015289;color:#ffffff;'>route</td>"
      correo="$correo<td>${route}</td>"
      correo="$correo</tr>"

      
      correo="$correo</table>"
      correo="$correo</p>"
      correo="$correo</div>"
      correo="$correo</div>"
      correo="$correo</div>"
      correo="$correo</body>"
      correo="$correo</html>"





      echo $correo | mail \
      -a "From: $correoSender" \
      -a "MIME-Version: 1.0" \
      -a "Content-Type: text/html; charset=UTF-8" \
      -s "[F2B: $servidor_atacado/$ip_ban]" \
      $correoDestino
}



printf "\n"
printf "*********************************************\n"
printf "RESULTADO de la IP: $ip_ban\n"
printf "*********************************************\n"

#P1: Verificar si la ip ya existe en sigetic
if verificaExiste
  then 
    #Error01: La IP Existe en SIGETIC
      printf "ERROR01: La IP ya EXISTE en SIGETIC, nada que hacer..!!\n\n"
      exit  
  else

    #P2: Obtenemos los datos de freegeoip
    if obtenerInformacionIPFreeGEOIP
    then

      if obtenerInformacionIPWhois
        then
          if guardarSigetic
          then
            enviacorreo
            printf "\n"
            printf "*********************************************\n"
            printf "La IP ha sido INCLUIDA correctamente!!\n\n"
            printf "*********************************************\n"
          else
            #Error04: Error al guadar en la BD
            printf "ERROR04: Ha ocurrido al guardar en la base de datos!!\n\n"
            exit    
          fi
          
        else
          #Error03: Whois
          printf "ERROR03: Ha ocurrido un error al obtener los datos de whois!!\n\n"
          exit    
        fi
    else
      #Error02: Fregeoip
      printf "Error02: Ha ocurrido un error al obtener los datos de freegeoip!!\n\n"
      exit
    fi
fi
  • Ahora de damos permisos de ejecución
chmod 777 /etc/fail2ban/agrega_ip_blacklist-ugit.sh
  • Ahora creamos el archivo de conexión a la BD utilizado por el archivo
nano /root/conexionmysql.ini
  • Agregamos
[client]
host=10.20.200.165
user=sissigetic
password=$!.Bd.SIS.SissGETC.$.!
database=bd_sae_sigetic_ugit
  • Le damos permisos necesarios
chmod 600 /root/conexionmysql.ini
  • Aquí puede probar ejecutando
/etc/fail2ban/agrega_ip_blacklist-ugit.sh 124.7.227.107
  • Abrimos el archivo
nano /etc/fail2ban/action.d/sendmail-whois.conf 
  • Modificamos
            Hola UGIT,\n
            **************************************************
            La IP <ip> ha sido baneada por Fail2ban despues de:
            <failures> intentos fallidos por <name>.\n\n
            **************************************************
            Aqui hay mas informacion acerca de la ip: <ip> :\n
            `/usr/bin/whois <ip> || echo missing whois program`\n
            Saludos,\n
            UGIT" | /usr/sbin/sendmail -f <sender> <dest>
  • Reiniciamos el servicio
service fail2ban restart
  • Modificamos el tiempo de acción
fail2ban-client set sshd action ip-to-blacklist-ugit timeout 300
  • Ahora creamos una nuevo aliases
nano /etc/aliases
  • Agregamos
fail2ban: root
  • Actualizamos
newaliases
  • Reiniciamos el servicio
service fail2ban restart

Si es un servidor de bases de datos MYSQL

  • Instalamos el software
apt install mysql-server -y
  • Lo mandamos a configurar
mysql_secure_installation
  • RESULTADO
Securing the MySQL server deployment.

Connecting to MySQL using a blank password.

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: N
Please set the password for root here.

New password: L0

Re-enter new password: L0
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) : Y
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) : N

 ... 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) : Y
 - 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) : Y
Success.

All done! 
  • Cambiar el método de autenticación
  • A partir de la versión 5.7 de MySQL, el usuario raíz de MySQL está configurado para autenticarse a través del complemento auth_socket de forma predeterminada en lugar de una contraseña.
  • Para usar una contraseña para conectarse a MySQL como usuario root, necesita cambiar el método de autenticación, de auth_socket a mysql_native_password.
  • Para verificar el método de autenticación asociado con las cuentas mysql:
SELECT user,authentication_string,plugin,host FROM mysql.user;
  • RESULTADO
+------------------+------------------------------------------------------------------------+-----------------------+-----------+
| user             | authentication_string                                                  | plugin                | host      |
+------------------+------------------------------------------------------------------------+-----------------------+-----------+
| debian-sys-maint | XXX | caching_sha2_password | localhost |
| mysql.infoschema | XXX | caching_sha2_password | localhost |
| mysql.session    | $XXX | caching_sha2_password | localhost |
| mysql.sys        | XXX | caching_sha2_password | localhost |
| root             |     | auth_socket           | localhost |
+------------------+------------------------------------------------------------------------+-----------------------+-----------+
  • Para utilizar la autenticación de contraseña para la cuenta raíz, realice los siguientes cambios:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'L0';
  • Resultado
Query OK, 0 rows affected (0.03 sec)
  • Actualizar las tablas:
FLUSH PRIVILEGES;
  • Verificamos el método
SELECT user,authentication_string,plugin,host FROM mysql.user;
  • Resultado
| root             | XXX                              | mysql_native_password | localhost |
  • Le damos acceso a conexión remota
RENAME USER 'root'@'localhost' TO 'root'@'%';
  • Salimos
exit;
  • Volvemos a ingresar
mysql -u root -p
  • Creación de usuario secundario (nivel 2)
CREATE USER 'tauro'@'%' IDENTIFIED BY 'A1';
CREATE USER 'tauro'@'localhost' IDENTIFIED BY 'A1';
  • Ahora, asocie los privilegios de administración con el usuario recién creado:
GRANT ALL PRIVILEGES ON *.* TO 'tauro'@'localhost' WITH GRANT OPTION;
  • Le damos acceso a conexión remota (si no se creo con %)
RENAME USER 'tauro'@'localhost' TO 'tauro'@'%';
  • Creación de usuario (nivel 3)
  • Si desea crear un usuario para administración de sistema o sitio
CREATE USER 'situgit'@'%' IDENTIFIED BY 'XX';
  • Le damos acceso a conexión remota (si no se creo con %)
RENAME USER 'situgit'@'situgit' TO 'tauro'@'%';
  • Configuramos que se puede acceder desde cualquier hosts
  • Abrimos
nano /etc/mysql/mysql.conf.d/mysqld.cnf
  • Buscar y comentar
bind-address		= 127.0.0.1
X
#bind-address		= 127.0.0.1
  • Guardamos y salimos
  • Reiniciar MYSQL
service mysql restart
  • Ingresamos con workbeach y le damos permisos correspondientes

Si es un servidor Web – Apache

Apache2

  • Instalamos apache
apt install apache2 acl -y
  • Desactivamos el listado de archivos
nano /etc/apache2/apache2.conf
  • Modificamos
<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
</Directory>

----------------------------- X -----------------------------------------
<Directory /var/www/>
        Options -Indexes
        AllowOverride None
        Require all granted
</Directory>
  • Para establecer la codificación UTF-8 por defecto. Abrimos el archivo:
nano /etc/apache2/conf-available/charset.conf
  • Modificamos las páginas de error
nano /etc/apache2/conf-available/localized-error-pages.conf 
  • Agregamos
ErrorDocument 403 https://403.siua.ac.cr
ErrorDocument 404 https://404.siua.ac.cr
ErrorDocument 500 https://500.siua.ac.cr
  • Para ocultar la información del versión del servidor, IP, puerto, sistema operativo. Modificamos a producción «Prod»
nano /etc/apache2/conf-available/security.conf
  • Modificamos
ServerTokens OS
X
ServerTokens Prod
  • Para ocultar la firma (email del administrador)
ServerSignature On
X
ServerSignature Off

Permisos de carpeta y usuario «orion»

  • Lo primero que vamos hacer es añadir al usuario «orion» al grupo «www-data», para que podamos modificar los datos con el usuario ugit
usermod -a -G www-data orion
  • Ahora establecemos que todo los que este en /var/www/html pertenezca al grupo www-data
chgrp -R www-data /var/www/html
  • Ahora le damos permisos para que los usuarios del grupo «www-data» puedan escribir
chmod -R g+w /var/www/html
  • Ahora le damos permisos a los directorios y archivos de (lectura, escritura y ejecución para usuario y grupo 7 lectura y ejecución para el resto)
find /var/www -type d -exec chmod 2775 {} \;
find /var/www -type f -exec chmod ug+rw {} \;
  • Ahora asignamos el «sticky bit» para el grupo (para que los archivos y directorios que se creen arrastren la propiedad del grupo www-data)
chmod g+s /var/www/html/
  • Asigna los permisos por defecto (para que los directorios que se creen arrastren los mismos permisos)
setfacl -d -m g::rwx /var/www/html/
  • Comprobamos
getfacl /var/www/html/
  • RESULTADO
getfacl: Eliminando '/' inicial en nombres de ruta absolutos
# file: var/www/html/
# owner: root
# group: www-data
# flags: -s-
user::rwx
group::rwx
other::r-x
default:user::rwx
default:group::rwx
default:other::r-x
  • Deshabilitar el site defecto
a2dissite 000-default.conf 

Instalación de módulos

Modulo SSL

  • Para habilitar el soporte de SSL
a2enmod ssl

Módulo Headers

  • Para firmar las paginas con la directiva Header add Author
a2enmod headers

Módulo Expires

  • Para mejorar la experiencia del usuario y chachear las paginas estáticas y no que se descarguen cada vez que se ingresa
a2enmod expires
  • Creamos un archivo de configuración para el módulo
nano /etc/apache2/mods-available/expires.conf
  • Le agregamos lo siguiente
<IfModule mod_expires.c>
          ExpiresActive on
          ExpiresByType image/jpg "access plus 60 days"
          ExpiresByType image/png "access plus 60 days"
          ExpiresByType image/gif "access plus 60 days"
          ExpiresByType image/jpeg "access plus 60 days"
          ExpiresByType text/css "access plus 1 days"
          ExpiresByType image/x-icon "access plus 1 month"
          ExpiresByType application/pdf "access plus 1 month"
          ExpiresByType audio/x-wav "access plus 1 month"
          ExpiresByType audio/mpeg "access plus 1 month"
          ExpiresByType video/mpeg "access plus 1 month"
          ExpiresByType video/mp4 "access plus 1 month"
          ExpiresByType video/quicktime "access plus 1 month"
          ExpiresByType video/x-ms-wmv "access plus 1 month"
          ExpiresByType application/x-shockwave-flash "access 1 month"
          ExpiresByType text/javascript "access plus 1 days"
          ExpiresByType application/x-javascript "access plus 1 dyas
          ExpiresByType application/javascript "access plus 1 days"
</IfModule>
  • Una vez creado le creamos un enlace simbólico dentro de mods-enabled para habilitarlo
ln -s /etc/apache2/mods-available/expires.conf /etc/apache2/mods-enabled/

Módulo deflate

  • Permite enviar información de forma comprimida
a2enmod deflate 
  • Este módulo ya viene habilitado y con un archivo de configuración, abrimos:
nano /etc/apache2/mods-available/deflate.conf
  • Agregamos
SetOutputFilter DEFLATE
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.pdf$ no-gzip dont-vary
  • Donde le decimos que comprima todo excepto imágenes, archivos ya comprimidos y pdf’s

Módulo rewrite

a2enmod rewrite
  • Recargamos la configuración
systemctl restart apache2

Configurar fecha

  • Para ver la hora
date
#universal
date -u 
  • Para configurar la hora
dpkg-reconfigure tzdata
  • Seleccionamos america
Am
undefined
  • Seleccionamos Costa Rica
undefined
  • Obtener la zona hoaraia
timedatectl
  • Si esta incorrecta
timedatectl set-timezone America/Costa_Rica

Si es un servidor Web – Apache – PHP

  • Instalamos los pasos anteriores (Apache)
  • Podemos consultar la versión de php disponible por apt
sudo apt show php
  • Instalamos dependencias
apt install software-properties-common ca-certificates apt-transport-https software-properties-common
  • Agregamos el repositorio
add-apt-repository ppa:ondrej/php
  • Actualizamos
apt update
  • Instalación de PHP 5.6
apt-get install php5.6 php5.6-mysql php5.6-gd php5.6-ldap php5.6-odbc php5.6-pgsql php5.6-curl php5.6-json php5.6-sqlite3 php5.6-xml php5.6-mbstring php5.6-cli php5.6-common libapache2-mod-php5.6 php5.6-zip
  • Instalación de PHP 7.4
sudo apt install php7.4 libapache2-mod-php7.4 php7.4-common php7.4-cli php7.4-curl php7.4-json php7.4-gd php7.4-mbstring php7.4-intl php7.4-bcmath php7.4-bz2 php7.4-readline php7.4-zip php7.4-mysql php7.4-dom php7.4-ldap php7.4-bcmath php7.4-bz2 php7.4-intl php7.4-mbstring  php7.4-apcu php7.4-igbinary php7.4-imagick php7.4-odbc php7.4-pgsql php7.4-readline php7.4-redis php7.4-sqlite3 php7.4-xml php7.4-xsl php7.4-OPcache php7.4-gmp -y
  • Instalación de PHP 8
apt install php7.4 libapache2-mod-php7.4 php7.4-common php7.4-cli php7.4-curl php7.4-json php7.4-gd php7.4-mbstring php7.4-intl php7.4-bcmath php7.4-bz2 php7.4-readline php7.4-zip php7.4-mysql php7.4-dom php7.4-ldap php7.4-bcmath php7.4-bz2 php7.4-intl php7.4-mbstring  php7.4-apcu php7.4-igbinary php7.4-imagick php7.4-odbc php7.4-pgsql php7.4-readline php7.4-redis php7.4-sqlite3 php7.4-xml php7.4-xsl php7.4-OPcache php7.4-gmp -y