Modificar sshd_config usando un script Bash

Al usar un script Bash, puede asegurarse de que ciertos parámetros de configuración estén establecidos en su sshd_config archivar.

Bash es el shell predeterminado en la mayoría de los sistemas Linux en estos días. Se puede utilizar como un intérprete de línea de comandos interactivo, así como un lenguaje de secuencias de comandos para automatizar tareas comunes. Este artículo le muestra cómo usar un script Bash para asegurarse de que se establezcan parámetros de configuración específicos en su /etc/ssh/sshd_config archivar.

Índice

¿Por qué usar un script en lugar de un editor?

Cambiar manualmente el /etc/ssh/sshd_config el uso de un editor varias veces en varios sistemas es propenso a errores. Siempre existe el riesgo de cometer un error tipográfico o de olvidarse de establecer un parámetro. Estos errores pueden tener un impacto severo en su entorno de producción.

El uso de un script es una forma de configuración como código y ofrece varias ventajas. Por un lado, solo necesita especificar sus parámetros una vez y puede reutilizar el script para configurarlos en cualquier host en cualquier lugar que desee. Además, el uso de un script garantiza que los mismos parámetros con los mismos valores se establezcan de la misma manera en cada host donde se ejecuta el script.

El escenario

La tarea en cuestión es asegurarse de que los siguientes cuatro pares de argumentos de palabras clave se utilicen en cualquier /etc/ssh/sshd_config en todos los sistemas Linux en la infraestructura:

PermitRootLogin no

PubkeyAuthentication yes

AuthorizedKeysFile .ssh/authorized_keys

PasswordAuthentication no

Supongamos que su entorno se ve así:

  • Los hosts de Linux ejecutan varias distribuciones.
  • Bash es el shell predeterminado.
  • Los hosts usan OpenSSH para su servicio SSH y el archivo de configuración es /etc/ssh/sshd_config.
  • Se desconoce el contenido real de este archivo en los diferentes hosts.
  • Los anfitriones pertenecen a diferentes departamentos y equipos.
  • Hay diferentes administradores de sistemas con acceso raíz a estos hosts.

El escenario

No hay una sola forma de hacerlo. Elegí el siguiente método porque creo que sigue el principio de "mantenlo simple" y tiene una solución bastante robusta. Así que aquí está el guión, seguido de una explicación:

#!/bin/bash
#
# Description:
# This script sets certain parameters in /etc/ssh/sshd_config.
# It's not production ready and only used for training purposes.
#
# What should it do?
# * Check whether a /etc/ssh/sshd_config file exists
# * Create a backup of this file
# * Edit the file to set certain parameters
# * Reload the sshd configuration
# To enable debugging mode remove '#' from the following line
#set -x
# Variables

file="$1"
param[1]="PermitRootLogin "
param[2]="PubkeyAuthentication"
param[3]="AuthorizedKeysFile"
param[4]="PasswordAuthentication"

# Functions
usage(){
  cat << EOF
    usage: $0 ARG1
    ARG1 Name of the sshd_config file to edit.
    In case ARG1 is empty, /etc/ssh/sshd_config will be used as default.

    Description:
    This script sets certain parameters in /etc/ssh/sshd_config.
    It's not production ready and only used for training purposes.

    What should it do?
    * Check whether a /etc/ssh/sshd_config file exists
    * Create a backup of this file
    * Edit the file to set certain parameters
EOF
}

backup_sshd_config(){
  if [ -f ${file} ]
  then
    /usr/bin/cp ${file} ${file}.1
  else
    /usr/bin/echo "File ${file} not found."
    exit 1
  fi
}

edit_sshd_config(){
  for PARAM in ${param[@]}
  do
    /usr/bin/sed -i '/^'"${PARAM}"'/d' ${file}
    /usr/bin/echo "All lines beginning with '${PARAM}' were deleted from ${file}."
  done
  /usr/bin/echo "${param[1]} no" >> ${file}
  /usr/bin/echo "'${param[1]} no' was added to ${file}."
  /usr/bin/echo "${param[2]} yes" >> ${file}
  /usr/bin/echo "'${param[2]} yes' was added to ${file}."
  /usr/bin/echo "${param[3]} .ssh/authorized_keys" >> ${file}
  /usr/bin/echo "'${param[3]} .ssh/authorized_keys' was added to ${file}."
  /usr/bin/echo "${param[4]} no" >> ${file}
  /usr/bin/echo "'${param[4]} no' was added to ${file}"
}

reload_sshd(){
  /usr/bin/systemctl reload sshd.service
  /usr/bin/echo "Run '/usr/bin/systemctl reload sshd.service'...OK"
}

# main
while getopts .h. OPTION
do
  case $OPTION in
    h)
    usage
    exit;;
    ?)
    usage
    exit;;
  esac
done

if [ -z "${file}" ]
then

file="/etc/ssh/sshd_config"
fi
backup_sshd_config
edit_sshd_config
reload_sshd

El guión comienza con el tinglado y unas pocas líneas de comentario. Me gusta usar los comentarios en la parte superior para describir brevemente lo que se supone que debe hacer el script. Luego puse un interruptor de depuración con set -x. Pruébelo si no está familiarizado con la depuración. Esto es útil cuando se rastrean errores en su secuencia de comandos.

Me gusta tener todas las variables que necesito configurar en un solo lugar. Están en las siguientes líneas después de los comentarios y antes de definir ciertas funciones. No necesita usar ninguna función, pero me gustan porque ayudan a estructurar el script. Y las funciones lo ayudan con la solución de problemas. Puede comentar fácilmente grandes partes de su código (funciones) y concentrarse en las secciones que le están causando problemas. Si no está familiarizado con las funciones, consulte "Definición de funciones de Shell" en la página del manual de bash (1).

Revisaré el resto del script función por función.

usar()

Esta función genera una breve instrucción sobre cómo usar este script. Se llama cuando el script se ejecuta con la opción -h Donde -?.

copia de seguridad_sshd_config ()

Antes de modificar cualquier cosa en un sistema de producción, se recomienda que cree una copia de seguridad de los archivos que probablemente se modificarán. Y eso es lo que está pasando aquí, copiando ${file} en ${file}.1.

Si el archivo especificado en ${file} no existe, el script imprime un mensaje de error para SALIDA ESTÁNDAR.

editar_sshd_config ()

Ahora que tengo una copia de seguridad, editaré el archivo. En primer lugar, elimino todas las líneas que comienzan con los parámetros especificados porque no sé con qué frecuencia ya aparecen en el archivo. Tengo que asegurarme de que solo exista la configuración deseada al final. es el trabajo del sed comando ejecutado en un for hebilla.

Dado que mi configuración se almacena como elementos en una matriz Bash, puedo recorrer todos los elementos de la matriz para eliminarlos. Puede encontrar información sobre las matrices de Bash en la sección "Matrices" de la página del manual de bash (1).

En segundo lugar, los pares palabra clave-argumento deseados se agregan a la sshd_config archivar. Los cambios están impresos en SALIDA ESTÁNDAR para informar al usuario.

recargar_sshd ()

SSHD debe recargar la configuración para ponerlo en acción. Esto es lo que está pasando aquí.

# principal

Una vez declaradas todas las variables y funciones, el script comienza a funcionar. El siguiente código imprimirá una descripción de cómo usar este script para SALIDA ESTÁNDAR cuando se ejecuta con la opción -h Donde -?:

while getopts .h. OPTION
do
  case $OPTION in
           h)
           usage    
           exit;;   
           ?)
           usage    
           exit;;   
  esac
done

Si no se especifica ningún argumento, /etc/ssh/sshd_config debe usarse como el archivo predeterminado:

if [ -z "${file}" ]

then

file="/etc/ssh/sshd_config"
fi

Y finalmente, se llama a las funciones para guardar, editar y recargar el sshd_config.

 

Envoltura

Este artículo le mostró cómo usar un script Bash para editar el archivo. /etc/ssh/sshd_config. Expliqué el beneficio de usar un script en lugar de un editor, proporcioné un script de muestra y expliqué los diferentes componentes.

Este script podría programarse con cron para garantizar que los valores deseados se restablezcan periódicamente si un administrador del sistema los cambia y se olvida de restablecerlos.

Artículos de interés

Subir