Como construir un servidor de cuentas shell gratis en Linux Debian


Sun Sep 13 2009 at 2:19pm UTC

Como crear un mini servidor de shells gratis en Linux Debian

En este mini manual crearemos un servidor de cuentas
shell usando Linux Debian como nuestro sistema operativo, quizas
con un poco de modificaciones dependiendo de la distribucion
deseada podriamos lograr los mismos resultados en otros Linuxes.

Usaremos el mismo programa (‘script’) que usamos en el mini manual
para FreeBSD tambien publicado en este blog meses atraz, pero
adaptadolo para Linux Debian.

El software requerido es basicamente alguna version de apache,
openssh-server, fail2ban, harden, sudo, libpam-chroot y algunas mas utilerias.

Objetivo: El usuario accesa al servidor por medio de SSH usando
el username/password assignada a ‘newuser/newuser’ respecti-
vamente, al identificarse, el sistema ejecutara la shell asignada para
‘newuser’ ubicada en ‘/sbin/newshell.sh’, dicho programa creara el
usuario, permisos, restringira el usuario, creara su web en ‘$HOME/public_html’
ademas su espacio web sera accesible en:
http://dominio.com/~username

Caracteristicas del servicio:
Espacio: 20MB
Procesos: 10
Web Space: Incluido en $HOME/public_html

Nota: Indudablemente existen miles de formas de hacer un servidor
de shells gratis, estoy seguro que no soy el primero ni el ultimo que creara
un manual parecido, debes de recordar que crear un servidor de este tipo
implica demaciados riesgos, especialmente si lo piensas usar bajo el internet,
si eso piensas deberas de poner atencion en “hardening” el sistema, en la
web existen muchos manuales al respecto, ademas si estas leyendo este manual
algunos meses/dias despues de la fecha en que lo escribi debes
de recordar que la internet es un moustro dinamico, cambia cada dia y posible-
mente los conceptos y metodos manejados aqui no aplicaran a futuro.

Primero asumo que tienes instalado un debian sin nada mas que BASE.
No X, no nada inecesario, la regla es simple: “…mientras menos programas instalados,
menos cosas tendras de que preocuparte.” , asumo tambien que haz habilitado
user quotas y group quotas en el sistema.

Dicho lo anterior, comenzamos:
Primero hagamonos root:
su

Actualizamos sistema:
apt-get update; apt-get upgrade

Instalamos y configuramos apache2, sudo, sshd, openssh-server, harden,
fail2ban, libpam-chroot:
(si no sabes usar ‘fail2ban’ ‘libpam-chroot’ y ‘harden’ puedes instalar solo apache2, sudo
y openssh-server por ahora, si recomiendo instales esos paquetes a futuro)
apt-get install apache2 sudo openssh-server harden fail2ban libpam-chroot

Habilita web space para usuarios en ‘public_html’:
a2enmod userdir

Creamos grupo ‘newshell’
addgroup newshell

Creamos la entrada a nuestra shell en /etc/shells:
adiciona /sbin/newshell.sh en
nano /etc/shells

Creamos nuestra shell, crea un archivo llamado:
/sbin/newshell.sh, y dale permisos de ejecucion asi como
pertenecer a ‘newuser’

touch /sbin/newshell.sh
chown newuser /sbin/newshell.sh
chmod 700 /sbin/newshell.sh

A continuacion copia y pega este codigo en /sbin/newshell.sh
nano /sbin/newshell.sh

#!/bin/bash
# dzup ( zzerver [at] gmail.com )
# Sun sep 13 2009 at 4:55pt
#echo "http://example.com"
echo "Hello,
Welcome to a free shell service, you are welcome to do anything you would like, as long as you do not abuse this service or conduct any malicious act, we encourage users of all skill to give us a try. We offer a free subdomain with your subscription to our free service. Remember, it is important for you to respect our service, as other users do like using us. Also, you may freely browse the web by entering w3m then the url. If you have any questions or concerns, please email them us.

Thanks again for using our service, and have a safe day.

echo “Welcome to a free shell service, powered by Debian”
num2=`echo $RANDOM` # create a ramdom number to avoid floods.
echo “Magic Number: $num2”
echo “What is the Magic Number?”
read num1
if [ “$num2” != “$num1” ] ; then
# Avoid Flows
echo “Sorry, Wrong Magic Number, try again …”
read null
exit
fi
echo “Please enter your username”
echo “username: ”
read usuario
if [ “$usuario” = “” ] ; then
# username is null.
echo “Invalid username, try again…”
echo “Press Enter to exit.”
read null
exit
fi
hacklogin=`echo “$usuario” | tr -d “|;\1404247134176$”`
if [ ! “$usuario” == “$hacklogin” ] ; then
# dangerous caracteres.
echo “Invalid Username, try again …n”
echo “Press Enter to exit.”
read null
exit
fi
# verify if username already exist.
safelogin=`echo “$usuario”|tr -cd “[:alnum:]”`
password=`echo $RANDOM$RANDOM`
existe=`sudo cat /etc/shadow|sed ‘y/[:]/[ ]/’|awk ‘{print $1}’|grep $safelogin`
existe=`echo $?`
if [ “$existe” = 0 ] ; then
# username already in system.
echo “username: ‘ $safelogin ‘ already in our system, try again … ”
echo “Press Enter to exit.”
read null
exit
fi
respuesta=”y”
echo “Ready to add $usuario in our system.”
echo “confirm ‘y’ to yes, any other character to abort.”
echo “by answering ‘y’ you agree to our terms and policies.”
echo “Correct (y/n)?”
read correcto
if [ “$correcto” != “$respuesta” ] ; then
# didn’t not accept our terms, so …byebye.
echo “Aborting creation, thanks.”
echo “(if this is an error, we was expecting ‘ $respuesta ‘ to create your shell, try again).”
echo “Press Enter to exit.”
read null
exit
fi
# Lets create our new user.
echo “Creating $usuario …”
#sudo useradd -g newshell -s /bin/bash -p `mkpasswd xxx` test2
sudo useradd –home /home/$safelogin -g newshell -s /bin/bash -p `mkpasswd $password` $safelogin
sudo mkdir /home/$safelogin #create his/her home
echo “you been issue the password:”
echo $password
sudo mkdir /home/$safelogin/public_html #create his/her http space.
sudo chown -R $safelogin:newshell /home/$safelogin/ #he own everything in his home.
sudo chmod -R 705 /home/$safelogin #make sure nobody in our group can read my files
sudo chmod -R 775 /home/$safelogin/public_html/ #make sure apache can read public_html
sudo cp /etc/skel/.bashrc /home/$safelogin #cp skel(modify /etcskel/.bash_profile)
sudo chown -R $safelogin:newshell /home/$safelogin/.bashrc # he/her own this
sudo edquota -p newuser $safelogin #Copy user quotas from our userexample
#sudo quotacheck -a #lets update quotas database
echo “User succesfully created!”
echo “Thank you for registering with us.”
echo “to login into your new shell use: ssh -l $safelogin example.com”
echo -e “username: $safelogin”
echo “password: $password”
echo -e “Press Enter to exit.”
read null
exit

Crea usuario con estas caracteriscticas:
username: newuser
password: newuser
group: root newshell y sudo
shell: /sbin/newshell.sh

adduser newuser

Editamos /etc/sudoers y nos aseguramos que ‘newuser’ use sudo
sin necesidad de intercambio de passwords:
nano /etc/sudoers

Dentro de /etc/sudoers adiciona:

root ALL=NOPASSWD: ALL
%sudo ALL=NOPASSWD: ALL
sudo ALL=NOPASSWD: ALL
newuser ALL=NOPASSWD: ALL

Edita las quotas para ‘newuser’:
edquotas newuser

Dentro de quotas, assigna los siguientes valores, tu archivo debera
lucir algo similar a esto, ello reducira espacio a 20mb y 2mb extra
cuando sea necesario:

Disk quotas for user newuser (uid 1003):
Filesystem blocks soft hard inodes soft$
/dev/xvda 40 20480 2048 10 0$

Limitamos procesos y mas cosas en /etc/security/limits.conf
nano /etc/security/limits.conf

Adiciona estas lineas:

@newshell hard nproc 10
@newshell soft nproc 10
@newshell hard cpu 5
@newshell hard nofile 100
@newshell hard memlock 32
@newshell hard stack 8192
@newshell hard` core 20480
@newshell hard data 20480
@newshell hard fsize 20480
#@newshell hard as 32
@newshell hard locks 8192

Limita algunos valores de sysctl:
sysctl kernel.randomize_va_space=2
sysctl net.ipv4.icmp_echo_ignore_broadcasts=1
sysctl net.ipv4.icmp_ignore_bogus_error_responses=1
sysctl net.ipv4.conf.all.accept_redirects=0
sysctl net.ipv4.conf.default.accept_redirects=0
sysctl net.ipv4.conf.all.accept_source_route=0
sysctl net.ipv4.conf.default.accept_source_route=0
sysctl net.ipv4.ip_forward=0
sysctl kernel.sysrq=0
sysctl net.ipv4.tcp_syncookies=1
sysctl net.ipv4.conf.all.rp_filter=1
sysctl net.ipv4.conf.all.log_martians=1

Modifica tu /etc/motd para que se vea atractivo (opcional).
nano /etc/motd

Modifica motd de ‘sbin/newshell.sh’ para que se vea
atractivo (opcional), recuerda modifica solo los comandos
‘ echo “bla-bla” ‘, deja lo demas intacto.

(si tienes alguna mejora al codigo fuente, favor de
comentarlo en la seccion, para que otros usuarios tomen
nota de tu mejora, ademas podria ser adicionado al programa
original respetando tus creditos de programacion, gracias)
nano /sbin/newshell.sh

Restringe acceso ssh a root:

sudo nano /etc/ssh/sshd_config

Modifica el archivo de tal forma que quede asi:

# Authentication:
LoginGraceTime 90
PermitRootLogin no
StrictModes yes

Mira que mas programas son inecesarios:
find / -path /proc -prune -o -type f -perm +6000 -ls

…ya casi terminamos, ahora restringue algunos comandos
(adiciona mas si lo deseas):
chmod 750 `which ping`
chmod 750 `which yes`
chmod 750 `which netstat`
chmod 4750 `which sudo`

Sale de ‘root’
exit

Felicidades!! ya tienes un servidor ssh gratis, para probar si todo
funciona como se desea, entra al servidor usando ‘newuser/newuser’
ssh -l newuser

Si todo marcha bien, el script creara un usuario nuevo en sistema y
asignara un espacio web, restringira el nuevo usuario a 10 procesos
y 20mb de espacio como quota.

La diversion apenas empieza, ahora deberas de enfocarte en asegurar
tu servidor, mantener un servidor de este tipo requiere de mucho
tiempo y dedicacion, sobre todo debes de mantenerte al dia de los
nuevos ‘exploits’ que inevitablemente SI SURGIRAN, este mini manual
no asume que tu maquina estara completamente asegurada, eso dependera
del administrador, ni tampoco asume ser el metodo correcto, solo demuestra
entre otras cosas la simple idea general de como podras hacerlo, ESTAS ADVERTIDO!

Puntos notables: si php se instala en tu servidor, asegurate que limites los usuarios
de alguna forma, ya sea usando un ‘chroot’ o/y quitando ‘safe mode’, contempla
crear una ‘chroot’ para los usuarios, restringir retransmicion de emails, compiladores
entre infinidad de mas cosas, recuerda no caer en la “esquizofrenia” que
puedes hacer un sistema indespensablemente inutil y aburrido, recuerda que
los sistemas operativos *NIX son hechos relativamente seguros, algunas personas
aseguran tanto su sistema que lo hacen practicamente inutil, la regla de oro es
simple “…instala solo lo que necesites.” y olvidate de lo demas, mate.

Si crees que este manual es de utilidad u tienes alguna idea/sugerencia
que deseas compartir con la comunidad, favor dejar tu comentario, todas las
opiniones seran publicadas, recuerda que todos mantenemos la comunidad
*NIX libre siempre que muevamos ideas.

Suerte y disfruta! =)
dzup

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: