Automatisieren des anfänglichen Server-Setups mit Ubuntu 18.04

Einführung

Wenn Sie zum ersten Mal einen neuen Ubuntu 18.04-Server erstellen, sollten Sie im Rahmen der Grundkonfiguration einige Konfigurationsschritte ausführen. Dies erhöht die Sicherheit und Benutzerfreundlichkeit Ihres Servers und bietet Ihnen eine solide Grundlage für nachfolgende Aktionen.

Währendyou can complete these steps manually, kann es manchmal einfacher sein, die Prozesse zu skripten, um Zeit zu sparen und menschliches Versagen zu beseitigen. In diesem Handbuch wird die Verwendung vona script to automate the steps in the initial server setup guide erläutert.

Was macht das Skript?

Dieses Skript ist eine Alternative zum manuellen Ausführen der inUbuntu 18.04 initial server setup guide und der Anleitung zusetting up SSH keys on Ubuntu 18.04 beschriebenen Prozedur.

Die folgenden Variablen beeinflussen die Ausführung des Skripts:

  • USERNAME: Der Name des regulären Benutzerkontos, für dassudo-Berechtigungen erstellt und erteilt werden sollen.

  • COPY_AUTHORIZED_KEYS_FROM_ROOT: Gibt an, ob die SSH-Schlüsselressourcen vom Konto vonrootauf das neue Konto vonsudokopiert werden sollen.

  • OTHER_PUBLIC_KEYS_TO_ADD: Ein Array von Zeichenfolgen, die andere öffentliche Schlüssel darstellen und demsudo-fähigen Konto hinzugefügt werden sollen. Dies kann optional zusätzlich zu oder anstelle des Kopierens der Schlüssel vomroot-Konto verwendet werden.

Sie sollten diese Variablen nach Bedarf aktualisieren, bevor Sie das Skript ausführen.

Wenn das Skript ausgeführt wird, werden die folgenden Aktionen ausgeführt:

  • Erstellen Sie ein reguläres Benutzerkonto mit den Berechtigungen vonsudounter Verwendung des durch die VariableUSERNAMEangegebenen Namens.

  • Konfigurieren Sie den anfänglichen Kennwortstatus für das neue Konto:

    • Wenn der Server für die Kennwortauthentifizierung konfiguriert wurde, wird das ursprünglich generierte Administratorkennwort vom Kontorootin das neue Kontosudoverschoben. Das Passwort für das Konto vonrootwird dann gesperrt.

    • Wenn der Server für die SSH-Schlüsselauthentifizierung konfiguriert wurde, wird ein leeres Kennwort für das Konto vonsudofestgelegt.

  • Das Kennwort dessudo-Nutzers wird als abgelaufen markiert, sodass es bei der ersten Anmeldung geändert werden muss.

  • Dieauthorized_keys-Datei vomroot-Konto wird auf densudo-Benutzer kopiert, wennCOPY_AUTHORIZED_KEYS_FROM_ROOT auftrue gesetzt ist.

  • Alle inOTHER_PUBLIC_KEYS_TO_ADD definierten Schlüssel werden zurauthorized_keys-Datei dessudo-Benutzers hinzugefügt.

  • Die kennwortbasierte SSH-Authentifizierung ist für den Benutzer vonrootdeaktiviert.

  • Die UFW-Firewall ist aktiviert, wobei SSH-Verbindungen zulässig sind.

Verwendung des Skripts

Das Skript kann auf zwei Arten ausgeführt werden: durch Hinzufügen zuthe server’s user data field during creation oder durch Anmelden alsroot und Ausführen nach der Bereitstellung.

Benutzerdaten verwenden

Beim Erstellen eines Droplets in DigitalOcean können Sie optionaluser data angeben, ein Skript, das während der ersten Serverbereitstellung ausgeführt wird, um eine zusätzliche Konfiguration durchzuführen.

Wenn Sie ein Droplet ausControl Panel erstellen, können Sie das KontrollkästchenUser data im AbschnittSelect additional options aktivieren. Ein Textfeld wird angezeigt, in das Sie das Skript einfügen können:

DigitalOcean control panel user data field

Wenn Siecreating a Droplet using the DigitalOcean API sind, können Sie das Skript stattdessen mit dem Attributuser_data übergeben.

Wenn Siecreating a Droplet with the doctl command line tool sind, können Sie das Skript mit der Option--user-data-file übergeben:

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

Unabhängig von der Methode, mit der Sie die Benutzerdaten hinzufügen, wird das Skript beim ersten Start des neuen Servers ausgeführt. Möglicherweise müssen Sie einige Minuten warten, bis der Vorgang abgeschlossen ist. Anschließend können Sie sich mit Ihremsudo-fähigen Benutzer bei Ihrem Server anmelden, um weitere Konfigurationen vorzunehmen.

Wenn Sie sich zum ersten Mal anmelden, werden Sie aufgefordert, Ihr Kennwort zu ändern. Der Server beendet die aktuelle SSH-Sitzung, sobald Sie Ihre neuen Anmeldeinformationen eingegeben und bestätigt haben. Danach können Sie wieder wie gewohnt SSH verwenden.

Ausführen des Skripts nach der Bereitstellung

Wenn Sie keine Benutzerdaten verwenden möchten, können Sie das Skript auch manuell über SSH ausführen, sobald der Server hochgefahren ist.

Wenn Sie das Skript auf Ihren lokalen Computer heruntergeladen haben, können Sie es direkt an SSH übergeben, indem Sie Folgendes eingeben:

ssh root@servers_public_IP "bash -s" -- < /path/to/script/file

Sie sollten sich jetzt für jede weitere Konfiguration mit Ihremsudo-Konto anmelden können.

Wenn Sie das Skript nicht auf Ihren lokalen Computer heruntergeladen haben, melden Sie sich zunächst beim Konto vonrootauf Ihrem Server an:

ssh root@servers_public_IP

Laden Sie als Nächstes das RAW-Skript auf den Server herunter:

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

Überprüfen Sie das Skript, um sicherzustellen, dass es ordnungsgemäß heruntergeladen wurde, und aktualisieren Sie alle zu ändernden Variablen:

nano /tmp/initial_setup.sh

Wenn Sie zufrieden sind, führen Sie das Skript manuell mitbash aus:

bash /tmp/initial_setup.sh

Sie sollten sich mit dem Benutzersudo anmelden können, um weitere Konfigurationen abzuschließen.

Der Inhalt des Skripts

Sie finden das erste Server-Setup-Skript inautomated-setups repository in der DigitalHcean Community GitHub-Organisation. Um den Skriptinhalt direkt zu kopieren oder herunterzuladen, klicken Sie oben im Skript auf die SchaltflächeRaw oder aufclick here to view the raw contents directly.

Der vollständige Inhalt ist auch hier zur Vereinfachung enthalten:

#!/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

Fazit

Durch die Automatisierung der Ersteinrichtung des Servers sparen Sie Zeit und erhalten eine gute Grundlage für die weitere Konfiguration. Wenn Sie weitere Schritte ausführen möchten, können Sie sich entweder nach der Ausführung des Skripts anmelden, um manuell fortzufahren, oder die Schritte an das Ende des Skripts anhängen, um den Prozess zu automatisieren.