Múltiples instancias de sshd
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
Contents
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