Múltiples instancias de sshd

From zerutek.com
Jump to: navigation, search

RECORDATORIO

Esto es el típico recordatorio, una anotación en un papel que siempre extravías.

Fuera de su contexto puede no tener ningún sentido.



19/06/2012

Múltiples instancias de sshd

En algunas ocasiones se requiere tener diferentes configuraciones de ssh en una misma máquina. Ésto se puede conseguir configurando diferentes instancias de ssh. En nuestro ejemplo vamos a generar una nueva instancia, que escuche sólo en una IP determinada, a la que sólo estén autorizados los usuarios de cierto grupo, y a una zona muy determinada, utilizando chroot.

El ejemplo que sigue está diseñado en modo "CutyPaste". Igual no es lo más claro, pero me resulta útil.

Sistemas utilizados

Ésta operativa se ha probado en Red Hat versiones 5 y 6, pero no puede ser muy diferente en otros sistemas.

Versiones mínimas

Para realizar la siguiente operativa se requieren versiones de ssh >= 5

Para Red hat 5 se ha compilado e instalado la versión proporcionada por Open ssh

Replicación de la instancia de ssh

Vamos a llamar a nuestra nueva instancia "ssh-servicio"

  • Generamos la nueva estructura
ln -s /usr/sbin/sshd /usr/sbin/sshd-servicio
cp /etc/init.d/sshd /etc/init.d/sshd-servicio
  • Creamos la configuración, apuntando a la nueva estructura
sed 's@^\#\?PidFile /var/run/sshd.*\.pid@PidFile /var/run/sshd-servicio.pid@' /etc/ssh/sshd_config > /etc/ssh/sshd_config-servicio
  • Configuramos para que escuche en la IP (en nuestro caso 1.2.3.4 para la nueva instancia, 192.168.1.1 para la normal) deseada, solamente. Éste paso se debe realizar en todas las instancias, no sólo en las nuevas. En las nuevas instancias desactivamos pam.
cp -u /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sed '/'s/^.*ListenAddress.*\..*\..*\..*/ListenAddress 192.168.1.1/'  /etc/ssh/sshd_config /etc/ssh/sshd_config
cp -u /etc/ssh/sshd_config-servicio /etc/ssh/sshd_config-servicio.bak
sed -e 's/^.*ListenAddress.*\..*\..*\..*/ListenAddress 1.2.3.4/' -e '/^UsePAM yes/ d' /etc/ssh/sshd_config-servicio.bak /etc/ssh/sshd_config-servicio
  • Si confiamos en nuestro DNS, podemos automatizar un poco éste paso:
cp -u /etc/ssh/sshd_config-servicio /etc/ssh/sshd_config-servicio.bak
sed "s/^.*ListenAddress.*\..*\..*\..*/ListenAddress `host $HOSTNAME|cut -f4 -d \" \"`/"  /etc/ssh/sshd_config-servicio.bak > /etc/ssh/sshd_config-servicio

Configuración del chroot

Los usuarios sólo deben acceder a una zona muy determinada, por lo que vamos a configurar un chroot con los datos que deseemos que vean.

Creación del chroot

Deseamos que los usuarios sólo vean los datos que se encuentran en /srv/log, pero como éste directorio no pertenece al usuario root, vamos a crear un directorio que se llame /src/chroot que si pertenece a root, y en el vamos a montar lo que queramos que éste accesible.

  • Creamos la estructura que vamos a utilizar
mkdir -p /srv/chroot/srv/log
  • añadimos la línea al /etc/fstab para realizar el montaje bind de lo que queramos esté accesible
echo "/srv/log /srv/chroot/srv/log bind bind,nosuid,defaults 1 2" >> /etc/fstab
  • Montamos la estructura:
mount /srv/chroot/srv/log

Configuración del ssh para que utiliza el chroot

  • Creamos el grupo al que permitiremos acceder a la nueva instancia.
groupadd -g 5000 Per_SFTP
  • Configuramos la nueva instancia para que sólo se pueda acceder por sftp con el consiguiente chroot y sólo los usuario de cierto grupo:
/bin/cat >> /etc/ssh/sshd_config-servicio << EOF

AllowGroups Per_SFTP

Match group Per_SFTP
 ForceCommand internal-sftp
 ChrootDirectory /srv/chroot

EOF

Configuración y arranque de la nueva instancia ssh

  • Configuramos '/etc/init.d/sshd-servicio' para que arranque la nueva instancia de ssh:
cp -u /etc/init.d/sshd-servicio /etc/init.d/sshd-servicio.bak
sed -e 's/sshd/sshd-servicio/g' -e 's@/etc/ssh/sshd.*_config@/etc/ssh/sshd_config-servicio@' -e '/^PID_FILE*.*/ a OPTIONS="-f /etc/ssh/sshd_config-servicio"' -e 's/status \$SSHD$/status -p \$PID_FILE/' /etc/init.d/sshd-servicio.bak > /etc/init.d/sshd-servicio
  • Creamos el directorio para el chroot de sshd:
mkdir /var/empty/sshd-servicio
  • Añadimos el servicio
 chkconfig --add sshd-servicio
  • Arrancamos. Arrancamos ambos servicios para que se liberen/reasignen los procesos que escuchan.
service sshd restart
service sshd-servicio start

Creación del usuario para el acceso

Tras toda ésta operativa, necesitamos crear un usuario que pueda tener acceso a la infraestructura generada.

  • Creamos el usuario. Ésta tiene que pertenecer al grupo Per_SFTP, pero no es necesario que sea su grupo primario:
useradd -u 12001 -c "SFTP-Sincronización de trazas" -s /sbin/nologin -g 2003 -G Per_SFTP syncusr 
  • Activamos el usuario asignando una password imposible:
echo 'syncusr:*' |chpasswd -e

Copia de la clave pública para el acceso

Como no deseamos utilizar contraseñas, tenemos que publicar las claves públicas de los usuarios que deseemos tengan acceso. Al ser un entorno que utiliza chroot, las claves no las puede modificar el usuario, porque se encuentran fuera del acceso del mismo.

  • Creamos la estructura necesaria, con los permisos correctos
mkdir ~syncusr/.ssh
touch ~syncusr/.ssh/authorized_keys 
chown -R 12001:2003 ~syncusr/.ssh
chmod -R u=rwx,go-rwx ~syncusr/.ssh
  • Sólo queda colocar en ~syncusr/.ssh/authorized_keys las claves públicas que necesitemos.

Alternativas a rsync

Al haber creado usuarios que sólo tienen soporte para sftp, y al requerir rsync una shell, hay que utilizar alternativas a ésta para conseguir sincronizar directorios.

lftp

Es un wrapper, que puede utilizar como origen o destino casi cualquier cosa (ftp,sftp, https, ...). La forma más sencilla para hacerlo funcionar es utilizando un fichero, donde colocaremos las configuraciones y comandos del programa:

  • El fichero de configuración sincroniza.lftp
## sincroniza.lftp ##
# Uso: lftp -f sincroniza.lftp
# Para que use el fichero de clave "sync.key"
set sftp:connect-program "ssh -a -x -o IdentityFile=~/.ssh/sync.key"
# Abre la conexión con la máquina destino
open sftp://uno.zerutek.com
# Hacemos un mirror 
## -c para que continue si se ha cortado
## -d para borrar ficheros en destino
mirror -c /srv/log /srv/destino

## Podemos conectarnos a más máquinas ##
open sftp://dos.zerutek.com
mirror -c /srv/log /srv/destino
  • Realizamos la sincronización
lftp -f sincroniza.lftp

Referencias

http://www.openssh.com

http://lftp.yar.ru