Minivps Londres

OpenVz es una tecnica de virtualizacion Linux.
Conocida como “Virtualizacion Despues del Nucleo
el rendimiento y el aprovechamiento de la memoria es muy superior a la virtualizacion KVM.
Aunque con Algunas limitaciones.
Es perfecta para para pequeños servidores.
Aqui dejo Unos apuntes de una puesta en marcha de un miniVPS




Indice:

Notas
Referencias




Instalacion del sistema Operativo:



Entramos en la consola de administracion de la VM y le damos a Reinstalar.
Aqui ya notamos La primera limitacion.
La lista de sistemas operativos a instalar es mucho mas limitada.
Ya que el kernel sistema operativo de la maquina virtual tiene que ser compatible con el del anfitrion.

En mi caso solo puedo instalar:

  • CentOS 6 y 7
  • Debian 8 , 9 y 10
  • Ubuntu 16 , 18

os reinstall

Hoy me voy a decantar por un clasico. Debian8
Para un miniservidor es perfecto ya que el consumo de recursos va ha ser minimo.

Mas tarde hare otras maquinas con otros sistemas operativos.




Un vistazo al panel de administracion.



panel solusvm

Aqui es donde se puede ver la potencia de OpenVz.

Si le echas un vistazo a la imagen. Veras que el uso de memoria es de solo un 1%
Si el sistema operativo solo consume 1,88Mb de RAM
Y solo 300Mb de disco.

Si la informacion es correcta.
OpenVz (virtualizacion despues del nucleo) comparte el kernel de linux con la maquina anfitrion.
Por lo cual (si el administrador es honesto) estos recursos compartidos no se nos contabilizan.




Acceso desde consola.

Nos conectamos a la consola (Serial Console) y empezamos a configurar la maquina.
Nota: en mi caso tengo acceso a la consola via Serie (consola tradicional de servidores linux) y via SSH.
De cara al manejo con parecidas. pero recuerda: Para la consola serie no necesitas tener sshd instalado en el servidor.




Lo primero es lo primero: Actualizar y parar ssh



apt-get update ; apt-get upgrade ; /etc/init.d/ssh stop

Me explico……
La maquina recien instalada esta indefensa.
Si hay un cero-day Entraran hasta las trankas…

Si en este momento un escaner de ips nos pilla la ip publica con alguna vulnerabilidad y sin asegurar el ssh.
En menos de 12h es posible que se adueñen (pwned) de tu maquina.

Hasta que la maquina no este operativa.
La secuencia ideal es:

  • Arranca
  • Trabaja
  • Para

Y no es broma. Una vez me deje una maquina encendida de un dia para otro y con un ataque de fuerza bruta. me sacaron la contraseña de ssh (10 digitos y no era tipica ) en unas 12h.




Como se si han entrado?

  • Con ss -nato compruebo si hay conexiones de red. (una maquina limpia no deberia tener ninguna conexion activa y menos entrante.
    root@nl:/# ss -nato    
    State       Recv-Q Send-Q          Local Address:Port            Peer Address:Port   
    

Como se ve: no hay ninguna conexion TCP/IP.

  • Con ps veo los procesos. (una maquina debian recien instalada y sin x apenas tiene procesos)
    root@nl:/# ps 
      PID TTY          TIME CMD 
      234 pts/0    00:00:00 bash 
      447 pts/0    00:00:00 ps 
    



Aumentar la Seguridad de sshd.




1) Crear un usuario y desactivar acceso remoto a root.

root@nl:/# adduser usuario
Adding user `usuario' ... 
Adding new group `usuario' (1000) ... 
Adding new user `usuario' (1000) with group `usuario' ...
Creating home directory `/home/usuario' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for usuario
Enter the new value, or press ENTER for the default
        Full Name []: usuario
        Room Number []:
        Work Phone []: 
        Home Phone []: 
        Other []
Is the information correct? [Y/n] y


2) Desabilitar acceso ssh al usuario root

sed -i 's/^PermitRootLogin yes.*/PermitRootLogin no/g' /etc/ssh/sshd_config`

Cuando atacante ve ssh en una maquina levantada lo primero que se hace es comprobar vulnerabilidades y despues lanzar un ataque de diccionario/fuerza bruta.
el usuario tipico para estos ataques es root. si desabilitas el acceso a root no podran entrar usando esta tecnica. (aunque averiguen la contraseña de root)



3) Activo protocolo 2

sed -i 's/^Protocol.*/Protocol 2/g' /etc/ssh/sshd_config


4) LoginGraceTime a 3 segudos.

sed -i 's/^LoginGraceTime.*/LoginGraceTime 3/g' /etc/ssh/sshd_config

Limito el tiempo de inicio de sesion a 3 segundos.
Con metaexploit use auxiliary/scanner/ssh/ssh_enumusers se pueden averiguar/enumerar nombres de usuario a traves de ssh. Con esto mitigo esa tecnica.
Ojo tendras que ser rapido en teclear la contraseña. si no no te dejara entrar.
Tambien puedes usar sshpass
O entrar usando un certificado.



5) Limito a 2 conexiones activas :despues tiro50% y despues tiro90%

sed -i 's/^MaxStartups.*/MaxStartups 2:50:90/g' /etc/ssh/sshd_config 
sed -i 's/^#MaxStartups.*/MaxStartups 2:50:90/g' /etc/ssh/sshd_config

Casi todos los ataques de diccionario utilizan varias conexiones a la vez para ir mas rapido.
Si limito las conexiones a 2 entorpecere estos ataques.
(ojo si necesitas mas de 2 conexiones simultaneas amplia este numero).



6) Cambio puerto 22 por Port 12322 en el archivo /etc/ssh/sshd_config

sed -i 's/^Port.*/Port 12322/g' /etc/ssh/sshd_config

Al cambiar el puerto por uno no estandar se hace mas dificil detectar el ssh.

Recuerda: para acceder por ssh tienes que indicar el puerto. ssh test.jejo.es -p 12322



7) Desabilitar info del sistema operativo en el banner de ssh

añadir DebianBanner no en /etc/ssh/sshd_config

echo DebianBanner no >> /etc/ssh/sshd_config


Si hago un “Banner Grabbing” comprobare que ya no se ve la informacion del sistema operativo.

    Antes:
    jejo@em50l:~$ timeout 2 nc -vn 1.2.3.4 12322
    Connection to 1.2.3.4 12322 port [tcp/*] succeeded!
    SSH-2.0-OpenSSH_6.7p1 Debian-5+deb8u8
    
    Despues:
    jejo@em50l:~$ timeout 2 nc -vn 1.2.3.4 12322 
    Connection to 1.2.3.4 12322 port [tcp/*] succeeded!
    SSH-2.0-OpenSSH_6.7p1
    


Comprobacion Seguridades SSH

echo;echo;
cat /etc/ssh/sshd_config | grep Password
cat /etc/ssh/sshd_config | grep Protocol
cat /etc/ssh/sshd_config | grep Login
cat /etc/ssh/sshd_config | grep MaxStartups





Un poco de “Threat Hunting”




Avisos telegram al inicio de la maquina.

en /etc/rc.local. Poner estas lineas

# Avisos telegram al inicio de la maquina.
tk=botTelegram
id=12345678
txt=$(hostname)+Init+IP:$(timeout 2 curl -s whatismyip.akamai.com);
(timeout 8 curl -s -k "https://api.telegram.org/$tk/sendMessage?chat_id=$id&text=$txt")& 

donde tk= deberia tomar el token del bot.
e id= es nuestro id de telegram.

Puedes editar el archivo nano /etc/rc.local y pegar el texto de arriba al final del mismo. o
Lo puedes automatizar con el siguiente comando.

echo "

# Avisos telegram al inicio de la maquina.
tk=botTelegram
id=12345678
txt=\$(hostname)+Init+IP:\$(timeout 2 curl -s whatismyip.akamai.com);
(timeout 8 curl -s -k \"https://api.telegram.org/\$tk/sendMessage?chat_id=\$id&text=\$txt\")& 

" >> /etc/rc.local
 



Aviso Telegram al inicio de un usuario

en /etc/profile. Poner estas lineas

# Aviso Telegram al inicio de un usuario
tk=botTelegram
id=12345678
txt=$(hostname)+etc+profile+Aviso+Conexion+Usuario:+$USER+IP:+$SSH_CLIENT
txt=$(timeout 8 curl -ks "https://api.telegram.org/$tk/sendMessage?chat_id=$id&text=$txt" 2>/dev/null )

donde tk= deberia tomar el token del bot.
e id= es nuestro id de telegram.



Tareas Varias.




Mostrar Informacion al inicio de sesion:

Añado estas lineas a /etc/profile:

echo
echo /etc/profile

echo 
echo Nombre equipo: $(hostname)
echo Ip publica:  $(timeout 2 curl -s ipinfo.io/ip)

echo
echo ips:
ip a |grep global

uname -a
lsb_release -a

Puedes editar el archivo nano /etc/profile y pegar el texto de arriba al final del mismo.
o
Lo puedes automatizar con el siguiente comando.

echo "
echo
echo /etc/profile 
 
echo 
echo Nombre equipo: $(hostname) 
echo Ip publica:  \$(timeout 2 curl -s ipinfo.io/ip) 
 
echo
echo sistema:
uname -a 

echo 
echo ips: 
ip a |grep global 
 
echo
" >> /etc/profile
 


Instalar algunas utilidades

apt install -y mc htop iftop iotop



Buscar espacio ocupado en usr/share

du -sh /usr/share/* | grep M


Liberar espacio en usr/share

du -sh /usr/share/* | grep M
find /usr/share/locale/af -print0 | xargs -0 rm -f
find /usr/share/locale/be@latin -print0 | xargs -0 rm -f
find /usr/share/locale/ca@valencia -print0 | xargs -0 rm -f
find /usr/share/locale/dz    -print0 | xargs -0 rm -f
find /usr/share/locale/eo -print0 | xargs -0 rm -f
find /usr/share/locale/fi -print0 | xargs -0 rm -f
find /usr/share/locale/he -print0 | xargs -0 rm -f
find /usr/share/locale/it -print0 | xargs -0 rm -f
find /usr/share/locale/ko -print0 | xargs -0 rm -f
find /usr/share/locale/mk -print0 | xargs -0 rm -f
find /usr/share/locale/my_MM -print0 | xargs -0 rm -f
find /usr/share/locale/oc -print0 | xargs -0 rm -f
find /usr/share/locale/pt_BR -print0 | xargs -0 rm -f
find /usr/share/locale/sk -print0 | xargs -0 rm -f
find /usr/share/locale/sv -print0 | xargs -0 rm -f
find /usr/share/locale/tr -print0 | xargs -0 rm -f
find /usr/share/locale/xh -print0 | xargs -0 rm -f
find /usr/share/locale/am -print0 | xargs -0 rm -f
find /usr/share/locale/bg    -print0 | xargs -0 rm -f
find /usr/share/locale/cs    -print0 | xargs -0 rm -f
find /usr/share/locale/el    -print0 | xargs -0 rm -f
find /usr/share/locale/fr -print0 | xargs -0 rm -f
find /usr/share/locale/hi -print0 | xargs -0 rm -f
find /usr/share/locale/ja -print0 | xargs -0 rm -f
find /usr/share/locale/ku -print0 | xargs -0 rm -f
find /usr/share/locale/ml -print0 | xargs -0 rm -f
find /usr/share/locale/nb    -print0 | xargs -0 rm -f
find /usr/share/locale/pa -print0 | xargs -0 rm -f
find /usr/share/locale/ro -print0 | xargs -0 rm -f
find /usr/share/locale/sl -print0 | xargs -0 rm -f
find /usr/share/locale/ta -print0 | xargs -0 rm -f
find /usr/share/locale/uk -print0 | xargs -0 rm -f
find /usr/share/locale/zh_CN -print0 | xargs -0 rm -f
find /usr/share/locale/ar -print0 | xargs -0 rm -f
find /usr/share/locale/bn    -print0 | xargs -0 rm -f
find /usr/share/locale/cy    -print0 | xargs -0 rm -f
find /usr/share/locale/en_AU -print0 | xargs -0 rm -f
find /usr/share/locale/et -print0 | xargs -0 rm -f
find /usr/share/locale/ga -print0 | xargs -0 rm -f
find /usr/share/locale/hr -print0 | xargs -0 rm -f
find /usr/share/locale/ka -print0 | xargs -0 rm -f
find /usr/share/locale/lo -print0 | xargs -0 rm -f
find /usr/share/locale/mn -print0 | xargs -0 rm -f
find /usr/share/locale/ne    -print0 | xargs -0 rm -f
find /usr/share/locale/pl -print0 | xargs -0 rm -f
find /usr/share/locale/ru -print0 | xargs -0 rm -f
find /usr/share/locale/sq -print0 | xargs -0 rm -f
find /usr/share/locale/te -print0 | xargs -0 rm -f
find /usr/share/locale/ur -print0 | xargs -0 rm -f
find /usr/share/locale/zh_HK -print0 | xargs -0 rm -f
find /usr/share/locale/az -print0 | xargs -0 rm -f
find /usr/share/locale/bs    -print0 | xargs -0 rm -f
find /usr/share/locale/da    -print0 | xargs -0 rm -f
find /usr/share/locale/en_CA -print0 | xargs -0 rm -f
find /usr/share/locale/eu -print0 | xargs -0 rm -f
find /usr/share/locale/gl -print0 | xargs -0 rm -f
find /usr/share/locale/hu -print0 | xargs -0 rm -f
find /usr/share/locale/km -print0 | xargs -0 rm -f
find /usr/share/locale/mr -print0 | xargs -0 rm -f
find /usr/share/locale/nl    -print0 | xargs -0 rm -f
find /usr/share/locale/ps -print0 | xargs -0 rm -f
find /usr/share/locale/rw -print0 | xargs -0 rm -f
find /usr/share/locale/sr -print0 | xargs -0 rm -f
find /usr/share/locale/th -print0 | xargs -0 rm -f
find /usr/share/locale/vi -print0 | xargs -0 rm -f
find /usr/share/locale/zh_TW -print0 | xargs -0 rm -f
find /usr/share/locale/be -print0 | xargs -0 rm -f
find /usr/share/locale/ca    -print0 | xargs -0 rm -f
find /usr/share/locale/de    -print0 | xargs -0 rm -f
find /usr/share/locale/fa -print0 | xargs -0 rm -f
find /usr/share/locale/gu -print0 | xargs -0 rm -f
find /usr/share/locale/id -print0 | xargs -0 rm -f
find /usr/share/locale/kn -print0 | xargs -0 rm -f
find /usr/share/locale/lt -print0 | xargs -0 rm -f
find /usr/share/locale/ms -print0 | xargs -0 rm -f
find /usr/share/locale/nn    -print0 | xargs -0 rm -f
find /usr/share/locale/pt -print0 | xargs -0 rm -f
find /usr/share/locale/si -print0 | xargs -0 rm -f
find /usr/share/locale/sr@latin tl -print0 | xargs -0 rm -f
find /usr/share/locale/wo -print0 | xargs -0 rm -f
du -sh /usr/share/* | grep M
## Limpieza archivos
find /usr/share/doc -name 'copyright' -print0 | xargs -0 rm -f
find /usr/share/doc -name 'changelog.*' -print0 | xargs -0 rm -f
find /usr/share/doc -name 'TODO*' -print0 | xargs -0 rm -f
find /usr/share/doc -name 'NEWS*' -print0 | xargs -0 rm -f
find /usr/share/doc -name 'CHANGES*' -print0 | xargs -0 rm -f
find /usr/share/doc -name 'README*' -print0 | xargs -0 rm -f

find /usr/share -name 'copyright.*' -print0 | xargs -0 rm -f
find /usr/share -name 'changelog.*' -print0 | xargs -0 rm -f
find /usr/share -name 'TODO.*'      -print0 | xargs -0 rm -f
find /usr/share -name 'NEWS.*'      -print0 | xargs -0 rm -f
find /usr/share -name 'CHANGES.*'   -print0 | xargs -0 rm -f
find /usr/share -name 'README.*'    -print0 | xargs -0 rm -f


Desabilitar temporalmente ipv6

sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1
sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1

A veces parece que le cuesta conectar con algunas ips via ipv6.
Sobre todo al hacer apt-get install



Instalar una clave publica ssh

mkdir ~/.ssh
echo "ssh-rsa claversa== clavepublica" >>   ~/.ssh/authorized_keys


Workarround para que funcione el mc y top….

echo export TERM=xterm >> /etc/profile


cambiar el mensaje de saludo. (antes del password)

nano /etc/ssh/sshd-banner
nano /etc/sshd/sshd_config
y poner: Banner /etc/ssh/sshd-banner



cambiar el mensaje de saludo. (despues de iniciar sesion)

nano /etc/motd




Notas

Referencias

A Investigar: