Automatisation de la configuration initiale du serveur avec Ubuntu 18.04

De Get Docs
Aller à :navigation, rechercher

Introduction

Lorsque vous créez un nouveau serveur Ubuntu 18.04 pour la première fois, vous devez suivre quelques étapes de configuration dès le début dans le cadre de la configuration de base. Cela augmentera la sécurité et la convivialité de votre serveur et vous donnera une base solide pour les actions ultérieures.

Bien que vous puissiez effectuer ces étapes manuellement, il peut parfois être plus facile de scripter les processus pour gagner du temps et éliminer les erreurs humaines. Ce guide explique comment utiliser un script pour automatiser les étapes du guide de configuration initiale du serveur.

Que fait le script ?

Ce script est une alternative à l'exécution manuelle de la procédure décrite dans le guide de configuration initiale du serveur Ubuntu 18.04 et le guide sur la configuration des clés SSH sur Ubuntu 18.04.

Les variables suivantes affectent l'exécution du script :

  • USERNAME : Le nom du compte d'utilisateur régulier pour créer et accorder des privilèges sudo.
  • COPY_AUTHORIZED_KEYS_FROM_ROOT : s'il faut copier les éléments clés SSH du compte racine vers le nouveau compte sudo.
  • OTHER_PUBLIC_KEYS_TO_ADD : tableau de chaînes représentant d'autres clés publiques à ajouter au compte compatible sudo. Cela peut éventuellement être utilisé en plus ou au lieu de copier les clés du compte root.

Vous devez mettre à jour ces variables si nécessaire avant d'exécuter le script.

Lorsque le script s'exécute, les actions suivantes sont effectuées :

  • Créez un compte d'utilisateur standard avec les privilèges sudo en utilisant le nom spécifié par la variable USERNAME.
  • Configurez l'état initial du mot de passe pour le nouveau compte : Si le serveur a été configuré pour l'authentification par mot de passe, le mot de passe administratif généré d'origine est déplacé du compte root vers le nouveau compte sudo. Le mot de passe du compte root est alors verrouillé. Si le serveur a été configuré pour l'authentification par clé SSH, un mot de passe vide est défini pour le compte sudo.
  • Le mot de passe de l'utilisateur sudo est marqué comme expiré, de sorte qu'il doit être modifié lors de la première connexion.
  • Le fichier authorized_keys du compte root est copié vers l'utilisateur sudo si COPY_AUTHORIZED_KEYS_FROM_ROOT est réglé sur true.
  • Toutes les clés définies dans OTHER_PUBLIC_KEYS_TO_ADD sont ajoutées au fichier authorized_keys de l'utilisateur sudo.
  • L'authentification SSH basée sur un mot de passe est désactivée pour l'utilisateur root.
  • Le pare-feu UFW est activé avec les connexions SSH autorisées.

Comment utiliser le script

Le script peut être exécuté de deux manières : en l'ajoutant au champ de données utilisateur du serveur lors de la création ou en se connectant en tant que racine et en l'exécutant après le provisionnement.

Utilisation des données utilisateur

Lors de la création d'un droplet sur DigitalOcean, vous pouvez éventuellement spécifier données utilisateur, un script à exécuter lors du provisionnement initial du serveur pour effectuer une configuration supplémentaire.

Si vous créez un droplet à partir du Panneau de configuration, vous pouvez cocher la case Données utilisateur dans la section Sélectionner des options supplémentaires. Une zone de texte apparaîtra dans laquelle vous pourrez coller le script :

Si vous créez un Droplet à l'aide de l'API DigitalOcean , vous pouvez transmettre le script à l'aide de l'attribut user_data à la place.

Si vous créez un droplet avec l'outil de ligne de commande doctl, vous pouvez transmettre le script à l'aide de l'option --user-data-file :

doctl compute droplet create ... --user-data-file /path/to/script

Quelle que soit la méthode que vous utilisez pour ajouter les données utilisateur, le script sera exécuté la première fois que le nouveau serveur démarrera. Vous devrez peut-être attendre quelques minutes pour que le processus se termine, mais vous pourrez ensuite vous connecter à votre serveur avec votre utilisateur compatible sudo pour toute autre configuration.

Lors de votre première connexion, vous serez invité à modifier votre mot de passe. Le serveur mettra fin à la session SSH en cours une fois que vous aurez fourni et confirmé vos nouvelles informations d'identification. Ensuite, vous pouvez revenir en SSH comme d'habitude.

Exécution du script après le provisionnement

Si vous ne souhaitez pas utiliser les données utilisateur, vous pouvez également exécuter le script manuellement via SSH une fois le serveur démarré.

Si vous avez téléchargé le script sur votre ordinateur local, vous pouvez le transmettre directement à SSH en tapant :

ssh [email protected]_public_IP "bash -s" -- < /path/to/script/file

Vous devriez maintenant pouvoir vous connecter à l'aide de votre compte sudo pour toute autre configuration.

Si vous n'avez pas téléchargé le script sur votre ordinateur local, commencez par vous connecter au compte root sur votre serveur :

ssh [email protected]_public_IP

Ensuite, téléchargez le script brut sur le serveur :

curl -L https://raw.githubusercontent.com/do-community/automated-setups/master/Ubuntu-18.04/initial_server_setup.sh -o /tmp/initial_setup.sh

Inspectez le script pour vous assurer qu'il s'est correctement téléchargé et mettez à jour les variables que vous souhaitez modifier :

nano /tmp/initial_setup.sh

Une fois satisfait, exécutez le script manuellement en utilisant bash :

bash /tmp/initial_setup.sh

Vous devriez pouvoir vous connecter à l'aide de l'utilisateur compatible sudo pour effectuer toute autre configuration.

Le contenu du script

Vous pouvez trouver le script de configuration initiale du serveur dans le référentiel automated-setups de l'organisation GitHub de la communauté DigitalOcean. Pour copier ou télécharger directement le contenu du script, cliquez sur le bouton Raw vers le haut du script, ou cliquez ici pour afficher directement le contenu brut.

Le contenu complet est également inclus ici pour plus de commodité :

#!/bin/bash
set -euo pipefail

########################
### SCRIPT VARIABLES ###
########################

# Name of the user to create and grant sudo privileges
USERNAME=sammy

# Whether to copy over the root user's `authorized_keys` file to the new sudo
# user.
COPY_AUTHORIZED_KEYS_FROM_ROOT=true

# Additional public keys to add to the new sudo user
# OTHER_PUBLIC_KEYS_TO_ADD=(
#     "ssh-rsa AAAAB..."
#     "ssh-rsa AAAAB..."
# )
OTHER_PUBLIC_KEYS_TO_ADD=(
)

####################
### SCRIPT LOGIC ###
####################

# Add sudo user and grant privileges
useradd --create-home --shell "/bin/bash" --groups sudo "${USERNAME}"

# Check whether the root account has a real password set
encrypted_root_pw="$(grep root /etc/shadow | cut --delimiter=: --fields=2)"

if [ "${encrypted_root_pw}" != "*" ]; then
    # Transfer auto-generated root password to user if present
    # and lock the root account to password-based access
    echo "${USERNAME}:${encrypted_root_pw}" | chpasswd --encrypted
    passwd --lock root
else
    # Delete invalid password for user if using keys so that a new password
    # can be set without providing a previous value
    passwd --delete "${USERNAME}"
fi

# Expire the sudo user's password immediately to force a change
chage --lastday 0 "${USERNAME}"

# Create SSH directory for sudo user
home_directory="$(eval echo ~${USERNAME})"
mkdir --parents "${home_directory}/.ssh"

# Copy `authorized_keys` file from root if requested
if [ "${COPY_AUTHORIZED_KEYS_FROM_ROOT}" = true ]; then
    cp /root/.ssh/authorized_keys "${home_directory}/.ssh"
fi

# Add additional provided public keys
for pub_key in "${OTHER_PUBLIC_KEYS_TO_ADD[@]}"; do
    echo "${pub_key}" >> "${home_directory}/.ssh/authorized_keys"
done

# Adjust SSH configuration ownership and permissions
chmod 0700 "${home_directory}/.ssh"
chmod 0600 "${home_directory}/.ssh/authorized_keys"
chown --recursive "${USERNAME}":"${USERNAME}" "${home_directory}/.ssh"

# Disable root SSH login with password
sed --in-place 's/^PermitRootLogin.*/PermitRootLogin prohibit-password/g' /etc/ssh/sshd_config
if sshd -t -q; then
    systemctl restart sshd
fi

# Add exception for SSH and then enable UFW firewall
ufw allow OpenSSH
ufw --force enable

Conclusion

L'automatisation de la configuration initiale du serveur peut vous faire gagner un peu de temps et vous donne une bonne base pour une configuration ultérieure. Si vous souhaitez effectuer des étapes supplémentaires, vous pouvez soit vous connecter après l'exécution du script pour continuer manuellement, soit ajouter les étapes à la fin du script pour automatiser le processus.