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 lors 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.

Alors queyou can complete these steps manually, il peut parfois être plus facile de scripter les processus pour gagner du temps et éliminer les erreurs humaines. Ce guide explique comment utilisera script to automate the steps in the initial server setup guide.

Que fait le script?

Ce script est une alternative à l'exécution manuelle de la procédure décrite dans lesUbuntu 18.04 initial server setup guide et le guide sur lessetting up SSH keys on Ubuntu 18.04.

Les variables suivantes affectent la manière dont le script est exécuté:

  • USERNAME: Le nom du compte d'utilisateur normal auquel créer et accorder les privilègessudo.

  • COPY_AUTHORIZED_KEYS_FROM_ROOT: s'il faut copier les actifs de clé SSH du compteroot vers le nouveau comptesudo.

  • OTHER_PUBLIC_KEYS_TO_ADD: tableau de chaînes représentant d'autres clés publiques à ajouter au compte activé poursudo. Cela peut éventuellement être utilisé en plus ou au lieu de copier les clés du compteroot.

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

Lors de l'exécution du script, les actions suivantes sont effectuées:

  • Créez un compte utilisateur standard avec les privilègessudo en utilisant le nom spécifié par la variableUSERNAME.

  • Configurez le mot de passe initial pour le nouveau compte:

    • Si le serveur a été configuré pour l'authentification par mot de passe, le mot de passe administratif d'origine généré est déplacé du compteroot vers le nouveau comptesudo. Le mot de passe du compteroot 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 comptesudo.

  • Le mot de passe de l'utilisateursudo est marqué comme expiré de sorte qu'il doit être modifié lors de la première connexion.

  • Le fichierauthorized_keys du compteroot est copié vers l'utilisateursudo siCOPY_AUTHORIZED_KEYS_FROM_ROOT est défini surtrue.

  • Toutes les clés définies dansOTHER_PUBLIC_KEYS_TO_ADD sont ajoutées au fichierauthorized_keys de l’utilisateursudo.

  • L'authentification SSH par mot de passe est désactivée pour l'utilisateurroot.

  • 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 àthe server’s user data field during creation ou en se connectant en tant queroot et en l'exécutant après l'approvisionnement.

Utilisation des données utilisateur

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

Si vous créez un Droplet à partir desControl Panel, vous pouvez cocher la caseUser data dans la sectionSelect additional options. Une zone de texte apparaîtra où vous pourrez coller le script:

DigitalOcean control panel user data field

Si vous êtescreating a Droplet using the DigitalOcean API, vous pouvez passer le script en utilisant l'attributuser_data à la place.

Si vous êtescreating a Droplet with the doctl command line tool, vous pouvez passer le script en utilisant l'option--user-data-file:

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

Quelle que soit la méthode utilisée pour ajouter les données utilisateur, le script sera exécuté lors du premier démarrage du nouveau serveur. Vous devrez peut-être attendre quelques minutes pour que le processus se termine, mais ensuite, vous pouvez vous connecter à votre serveur avec votre utilisateur activésudo pour toute configuration supplémentaire.

La première fois que vous vous connectez, il vous sera demandé de changer 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 à 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 sur 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 root@servers_public_IP "bash -s" -- < /path/to/script/file

Vous devriez maintenant pouvoir vous connecter en utilisant votre comptesudo pour toute configuration ultérieure.

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

ssh root@servers_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 a été téléchargé correctement et mettez à jour les variables que vous souhaitez modifier:

nano /tmp/initial_setup.sh

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

bash /tmp/initial_setup.sh

Vous devriez pouvoir vous connecter à l'aide de l'utilisateur activé poursudo pour terminer toute configuration supplémentaire.

Le contenu du script

Vous pouvez trouver le script de configuration initiale du serveur dans lesautomated-setups repository de l'organisation GitHub DigitalOcean Community. Pour copier ou télécharger directement le contenu du script, cliquez sur le boutonRaw vers le haut du script, ouclick here to view the raw contents directly.

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 donner une bonne base pour une configuration ultérieure. Si vous souhaitez effectuer d'autres opérations, vous pouvez vous connecter après l'exécution du script pour continuer manuellement ou ajouter les étapes à la fin du script pour automatiser le processus.