Automatisation de la configuration initiale du serveur avec Ubuntu 18.04
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ègessudo
.COPY_AUTHORIZED_KEYS_FROM_ROOT
: s'il faut copier les éléments clés SSH du compte racine vers le nouveau comptesudo
.OTHER_PUBLIC_KEYS_TO_ADD
: tableau de chaînes représentant d'autres clés publiques à ajouter au compte compatiblesudo
. 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 variableUSERNAME
. - 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'utilisateursudo
siCOPY_AUTHORIZED_KEYS_FROM_ROOT
est réglé surtrue
. - Toutes les clés définies dans
OTHER_PUBLIC_KEYS_TO_ADD
sont ajoutées au fichierauthorized_keys
de l'utilisateursudo
. - 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.