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:
- - Instalacion-del-sistema-operativo
- - Un-vistazo-al-panel-de-administracion
- - Acceso-desde-consola
- aumentar-la-seguridad-de-sshd
- 1-crear-un-usuario-y-desactivar-acceso-remoto-a-root
- 2-desabilitar-acceso-ssh-al-usuario-root
- 3-activo-protocolo-2
- 4-logingracetime-a-3-segudos
- 5-limito-a-2-conexiones-activas-despues-tiro50-y-despues-tiro90
- 6-cambio-puerto-22-por-port-12322-en-el-archivo-etc-ssh-sshd-config
- 7-desabilitar-info-del-sistema-operativo-en-el-banner-de-ssh
- Comprobacion-seguridades-ssh
- 1-crear-un-usuario-y-desactivar-acceso-remoto-a-root
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
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.
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+deb8u8Despues:
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
- Panel https://solusvm.com/
- hardentheworld http://docs.hardentheworld.org/Applications/OpenSSH/
- Articulos bot telegram