Technische Empfehlungen und Best Practices für die Tutorials von DigitalOcean

Einführung

In diesem Handbuch werden bewährte Vorgehensweisen und Empfehlungen für Autoren von DigitalOcean-Tutorials zusammengefasst. Es soll eine Grundlage für Konsistenz, technische Korrektheit und Benutzerfreundlichkeit des DigitalOcean-Lehrmaterials bieten.

Dies ist von Natur aus sowohl ein in Arbeit befindliches Dokument als auch ein mit einer Stellungnahme versehenes Dokument, das auf der wachsenden Erfahrung interner technischer Redakteure, Community-Manager und Ingenieure basiert. Die Empfehlungen sind freibleibend und wurden speziell für Bildungsinhalte mit einem breiten Spektrum von Lesern und Endbenutzern erstellt.

Softwarequellen und Installation

Bevorzugte Quellen

Verwenden Sie in absteigender Reihenfolge die folgenden Installationsmechanismen:

  1. Dieproject recommended method, wenn sie als am besten bewertet werden. Viele Projekte ändern sich schnell und empfehlen, über die offiziellen Repositorys hinauszugehen. Einige Installationen (wie die Muster voncurl | bash) erfordern jedoch eine Entscheidung darüber, ob sie verwendet werden sollen oder nicht.

  2. Dieofficial package repositories für die aktuelle Verteilung und Veröffentlichung.

  3. Language-specific official packages (NPM, CPAN, PIP, RubyGems, Composer usw.)

  4. Project-specific package repositories (z. Nginx stellt eigene Repos für aktuelle Versionen zur Verfügung oder unter Ubuntu eine vertrauenswürdige PPA. Stellen Sie sicher, dass diese von einer vertrauenswürdigen Quelle stammen, wie den Entwicklern des Projekts oder den Debian / Ubuntu-Paketbetreuern.

  5. Binaries from the project’s GitHub releases page oder eine ähnliche offizielle Webquelle.

  6. wget or curl install scriptswird an die Shell weitergeleitet, mit einer entsprechenden Warnung zum Überprüfen von Skripten.

Bevorzugte Installationsorte

Vermeiden Sie im Allgemeinen unnötige Komplikationen. Bei nicht gepackter Software, die von der Quelle oder den Binärdateien installiert wurde, sollten Sie im Allgemeinen das Standardinstallationspräfix akzeptieren, es sei denn, dies ist sehr ungewöhnlich oder führt zu Konflikten.

Für serviceorientierte Software sollte ein Init-Skript angegeben werden, das den offiziellen Empfehlungen für die Verteilung entspricht, sofern dies nicht durch das Paket oder eine andere Installationsmethode bereitgestellt wird.

Fügen Sie auf Linux-Systemen eigenständige Binärdateien oder Verzeichnisse in/opt und eigenständige Skripte in/usr/local/bin ein.

Software- und Systemwartung

Auf Ubuntu- und Debian-Systemen solltenunattended-upgrades mit mindestens installierten und konfigurierten Sicherheitsupdates vorhanden sein. Wir empfehlen, bei gegebenem Kontext keinen automatischen Neustart oder keine automatische Aktualisierung durchzuführen.

Wir empfehlen im Allgemeinensudo apt-get dist-upgrade übersudo apt-get upgrade, wenn Sie sich die vorgeschlagenen Änderungen genau ansehen, um sicherzustellen, dass nichts Zerstörerisches passiert. Die beiden Befehle sind sehr ähnlich, aber die Verwendung vonupgrade kann weniger vorhersehbar sein, da einige Änderungen zurückgehalten werden. Das Zurückhalten bestimmter Pakete kann zu Versionsinkongruenzen führen, die Probleme mit Produktionssystemen verursachen können.
Wir werdenapt-get unter Ubuntu 16.04 weiterhin verwenden, da fürapt und einige keine Dokumentation vorhanden ist Turbulenzen über den bevorzugten Paketmanager der Distribution.

Service-Management

Stellen Sie sicher, dass Sie native init-Systembefehle verwenden, auch wenn ältere Kompatibilitätsbefehle verfügbar sind. Verwenden Sie beispielsweisesudo systemctl start [service_name], obwohlsudo service [service_name] start funktioniert.

Geben Sie Informationen zum Aktivieren oder Deaktivieren des Dienstes beim Start an. Geben Sie an, wie das Ergebnis von dienstbezogenen Befehlen überprüft werden soll, wenn dies nicht eindeutig durch die Schnittstelle angezeigt wird (journalctl -u,systemctl status usw.).

Als Faustregel ziehen Sie Neustarts dem erneuten Laden von Diensten vor. In den meisten Fällen ist es wichtiger, einen bekannten Zustand sicherzustellen, als eine sekundenschnelle Unterbrechung des Dienstes zu vermeiden. Neustarts sind auch bei einem vollständigen Dienstausfall nützlicher.

Bootstrapping-Systeme

Wenn es nicht Teil eines Konfigurationsverwaltungs-Workflows ist, bevorzugen Sie in den meisten Fällen Benutzerdatenskripte und Cloudinit-Skripte, um Skripte in Benutzerdaten einzuschlagen.

Protokollierung und Fehlerbehebung

Erläutern Sie, wo und wie auf Protokolle für installierte Dienste zugegriffen wird. Erläutern Sie gegebenenfalls die Befehlesystemctl undjournalctl zur Überprüfung des Servicestatus und der Protokollausgabe. Bieten Sie nach Möglichkeit prägnante Vorschläge zur Diagnose häufiger Fehlerfälle an.

Stellen Sie sicher, dass die Protokollrotation in allen Fällen behandelt wird, in denen sie nicht von Paketen oder anderen Installationsmechanismen behandelt wird.

Verwenden Sie zum Verfolgen von Klartext-Protokolldateientail -F und nichttail -f, da letztere eine Datei nicht über Umbenennungen hinweg verfolgen und Verwirrung stiften können, wenn Protokolle gedreht werden, während ein Benutzer sie beobachtet.

Benutzer- und Gruppenverwaltung

Erstellen Siesudo Benutzer, anstatt root direkt zu verwenden. Lesen Sie die entsprechenden Anleitungen zur Ersteinrichtung des Servers, in denen diese Aufgabe als Voraussetzung erläutert wird.

Fügen Sie bei Debian-basierten Distributionen Benutzer mitadduser sammy bzw.deluser --remove-home sammy hinzu und entfernen Sie sie. Verwenden Sie bei RHEL-basierten Distributionenadduser sammy (legen Sie ggf. ein Kennwort mitpasswd sammy fest) unduserdel -r sammy.

Gewähren Siesudo Berechtigungen mitusermod -aG sudo sammy unter Ubuntu. CentOS ist etwas komplizierter. Moderne Versionen verwendenusermod -aG wheel sammy, aber einige Versionen erfordernvisudo, um zuerst die Gruppenberechtigungen vonwheelzu kommentieren. Insbesondere unter CentOS 5 müssensudo installiert und die Gruppewheel mitvisudo nicht kommentiert werden. Unter CentOS 6 istsudo bereits installiert,wheel muss jedoch nicht kommentiert werden. CentOS 7 hatsudo und die Gruppewheel ist bereits eingerichtet.

Stellen Sie sicher, dass Sie die Befehle so testen, wie sie geschrieben wurden, wenn Sie eskalierte Befehle verwenden. Verwenden Siesudo -E command_to_run (wenn Sie der gesamten Umgebung vertrauen) odersudo FOO=BAR command_to_run, um Umgebungsvariablen ansudo zu übergeben. Verwenden Sie für Instanzen, für die eine Root-Shell erforderlich ist,sudo -i. Verwenden Sie in Fällen, in denen eine Umleitung erforderlich ist,tee -a, um die Zieldatei anzuhängen, anstatt sie zu ersetzen:[sudo] command_to_run | sudo tee [-a] file_to_change.

Bevorzugte Tools

Nehmen Sie für interaktive Shells Bash auf GNU / Linux-Systemen an, die bei Bedarf explizit erwähnt werden. Verwenden Sie unter FreeBSD tcsh, da es sofort verfügbar ist und nützliche Funktionen bietet.

Für Texteditoren fügen wir die Kopie "use [preferred] oder your favourite text editor" hinzu und fügen den Befehlen zum Kopieren und Einfügen die folgenden anfängerfreundlichen Editoren hinzu. Unter Linux verwenden wir standardmäßignano. Unter FreeBSD verwenden wir standardmäßigee. vi (m) ist zulässig, aber vermeiden Sie es in einführenden Themen, in denen es für Anfänger einen Stolperstein darstellen könnte.

Für die Dateiübertragung empfehlen wir in den meisten Fällensftp für die interaktive und scp-ähnliche Verwendung, obwohl die Push-Funktionalität fehlt, sodassscp ebenfalls akzeptabel ist. rsync ist nützlich für Backups und große Übertragungen (oder viele kleine Dateien). Verwenden Sie unter keinen Umständen FTP. Wir bemühen uns auch, aufgrund seiner Robustheitcurl überwget zu standardisieren. Der Vorteil vonwget besteht hauptsächlich im rekursiven Download (d. h. ein spezieller Anwendungsfall, der für unsere Art von Inhalten nicht üblich ist).

Auf Computern, die mit den Dienstprogrammeniproute2ausgeliefert werden, ziehen wir sie der Suitenet-toolsvor, dhconsidered obsolete. Im Allgemeinen unterstützeniproute2 Dienstprogramme wiess mehrere Schnittstellen, IPv6, neue Kernelfunktionen usw. besser. Daher sollten wir ebenfallsip route überroute,ip addr show überifconfig usw. verwenden. Manchmal ist die Ausgabe älterer Dienstprogramme standardmäßig etwas sauberer, aber die Ausgabe selbst ist etwas weniger vertrauenswürdig, da sie auch keine Edge-Cases verarbeitet. Wenn möglich, werden wir die ausführlichere Ausgabe mithilfe der verfügbaren Flags steuern.

Scripting

Vermeiden Sie im Rahmen von Lernprogrammen für die Systemverwaltung im Allgemeinen lange benutzerdefinierte Skripts und lange Shell-Skripts.

Von Autoren geschriebene Skripte (und möglicherweise andere Ressourcen) sollten sich in einem Repository pro Artikel im GitHub-Konto von do-community mit einem Link zurück zum veröffentlichten Tutorial befinden. Befolgen Sie im Allgemeinen die guten Skriptpraktiken. Platzieren Sie beispielsweise alle Variablen, die der Benutzer am Anfang des Skripts eingeben muss, vorzugsweise in einem gut gekennzeichneten Abschnitt. Stellen Sie außerdem sicher, dass Sie aufmerksam kommentieren. Der Rumpf eines Skripts in einem DO-Tutorial sollte nicht als Black Box fungieren. Benutzer sollten in der Lage sein, die Bedeutung herauszufinden, indem sie sie durchlesen.

Bevorzugen Sie/bin/sh gegenüberbash und vermeiden Sie Bash-spezifische Funktionen, wenn Portabilität oder plattformübergreifende Wiederverwendung ein Problem darstellen. Verwenden Sie die Shell- und Coreutils / Standard-Unix-Tools für kleine Aufgaben. Vermeiden Sie die Einführung neuer Abhängigkeiten nur für klebesprachige Aufgaben, es sei denn, die Vorteile sind erheblich. Bevorzugen Sie#!/usr/bin/env interpreter gegenüber#!/path/to/interpreter.

Verwenden Sie im Allgemeinencron, um wiederkehrende Aufgaben zu planen, aber auch System-Timer sind akzeptabel.

Dateisystem-Speicherorte

Stellen Sie beim Herunterladen von Skripten oder Daten sicher, dass sich der Benutzer in einem beschreibbaren Verzeichnis befindet, oder es werden ausdrücklich Pfade angegeben. Verwenden Sie für Dateien, die als Referenz oder Wiederverwendung verfügbar sein sollen, das Home-Verzeichnis des Benutzers, es sei denn, sie gehören zu einem genau definierten Standardpfad an einer anderen Stelle im Dateisystem (z. B./opt oder/etc). Verwenden Sie für Wegwerfdateien/tmp.

Webserver

Wir empfehlen die Konfigurationsverzeichnisse im Debian-Stil für Distributionen, die nicht standardmäßig so strukturiert sind. Testen Sie immer Konfigurationsänderungen (Apache verwendetsudo apachectl configtest und Nginx verwendetsudo nginx -t).
/var/www/html sollte als Dokumentstamm für alle Webserver verwendet werden. Die Standardeinstellung von Nginx/usr/share/nginx/htmlollte geändert werden, da dieses Verzeichnis Eigentum von Paketaktualisierungen ist und möglicherweise durch Paketaktualisierungen geändert werden kann. Dies ist in Ubuntu 16.04 kein Problem mehr, bleibt aber für frühere Versionen relevant.

In Zukunft sollten Sie lieber neue Apache Virtual Host-Dateien oder Nginx-Server-Blockdateien erstellen, als die bereitgestellten Standarddateien zu ändern. Dies hilft, einige häufige Fehler zu vermeiden, und behält die Standarddateien wie beabsichtigt als Fallback-Konfiguration bei.

Sicherheit

Verschlüsseln und authentifizieren Sie alle Verbindungen zwischen Systemen. Ermutigen Sie Benutzer nicht (explizit oder implizit), Anmeldeinformationen zu senden oder nicht öffentliche Daten im Klartext zu übertragen.

Insbesondere dürfen Passwörter und Schlüsselmaterial nicht über ungesicherte Verbindungen übertragen werden. Datenbankverbindungen, Protokollierung, Clusterverwaltung und andere Dienste sollten idealerweise jederzeit verschlüsselt werden. Webbasierte Kontrollfelder müssenserved over HTTPS connections betragen, und TLS / SSL sollte für Dienste verwendet werden, bei denen dies unterstützt wird. Öffentlich zugängliche Dienste wie einfaches HTTP sind zulässig, da Benutzer diese möglicherweise noch anbieten möchten oder müssen, sollten jedoch im Allgemeinen, insbesondere bei dynamischen Inhalten, dringend davon abgeraten werden.

Vermeiden Sie Vorgehensweisen, die durch Unklarheiten oder Probleme zu einer Sicherheit mit geringem Nutzen führen, z. B. das Ändern des Standard-SSH-Ports. Konfigurieren Sie eine Firewall. Unsere distro-spezifischen Empfehlungen sindufw für Ubuntu,iptables für Debian undfirewalld für CentOS. iptables ist jedoch plattformübergreifend am konsistentesten und verfügt über viele Tools, die sich daran anschließen.

SSH

Es wird empfohlen, den Standard-SSH-Port nicht zu ändern, um Praktiken mit geringem Nutzen für die Sicherheit durch Verdeckung zu vermeiden. Das Ändern des Ports kann nützlich sein, um Holzstämme aus den Protokollen zu entfernen. Dies sollte jedoch nur in bestimmten Situationen erfolgen, in denen dies ein Hauptanliegen ist.

Deaktivieren Sie die Kennwortauthentifizierung und verwenden Sie die Nur-Schlüssel-Authentifizierung für den Root-Benutzer oder deaktivieren Sie alternativ die Root-Anmeldung vollständig. Stellen Sie sicher, dass Sie starke SSH-Schlüssel verwenden, mindestens 2048-Bit-RSA, jedoch 4096 empfohlen. ECDSA wird aus technischen Gründen nicht mehr empfohlen, und Ed25519- und elliptische Kurvenalgorithmen werden nicht ausreichend unterstützt.

Verwenden Sie Passphrasen für alle interaktiven Schlüssel, jedoch nicht für nicht interaktive Prozesse. Richten Sie SSH-Schlüssel ein, kopieren Sie sie und ändern Sie ihren Besitz vom Stammkonto in das Basisverzeichnis des Benutzers. Installieren Siefail2ban dort, wo es praktisch ist.

Beachten Sie, dass die Weiterleitung von SSH-Agenten für normale Workflows auf Plattformen wie CoreOS zwar erforderlich ist, jedoch mit einigen Sicherheitsbedenken verbunden ist. Grundsätzlich kann jeder mit Berechtigungen auf Ihrem Host über den Forwarding-Socket eine Verbindung zu Ihrem lokalen SSH-Agenten herstellen.

SSL/TLS

Wir empfehlen dringend, Let's Encrypt zu verwenden, um die Verwendung zu vereinfachen, und empfehlen TLS. Verwenden Sie eine starke SSL-Sicherheit. Schauen Sie sichhttps://cipherli.st/ an (sowohl moderne als auch ältere Empfehlungen).

Für Hosts ohne Domain-Namen empfehlen wir ein selbstsigniertes Zertifikat mit ausreichender Stärke. Schauen Sie sich noch einmalhttps://cipherli.st/ und die selbstsignierte Zertifikaterstellung an, die in Handbüchern wiethis Self-Signed Certification on Nginx guide verwendet wird. Richten Sie beim Aktivieren der Verschlüsselung einen starken Diffie-Hellman-Schlüssel ein, z. B. inSelf-Signed SSL Certifications on Apache undNginx.

VPN

Wir empfehlen VPNs als Lösung für die allgemeine verschlüsselte Kommunikation zwischen Servern. VPNs werden immer wertvoller, wenn mehrere Dienste zwischen Servern geschützt werden müssen. Anstatt jeden Dienst einzeln zu verschlüsseln, kann die gesamte interne Kommunikation an das VPN weitergeleitet werden. Dies ist besonders nützlich, wenn die betreffenden Dienste keine native Verschlüsselung unterstützen.

Im Allgemeinen empfehlen wir Tinc über OpenVPN für die Server-zu-Server-Kommunikation. Sie könnenthis article on Ansible and Tinc lesen, um weitere Details und die Implementierung zu erhalten.

Fazit

Dies ist von Natur aus ein geprüftes, lebendiges Dokument und wird häufig aktualisiert. Die Technik ändert sich schnell und wir von DigitalOcean tun unser Bestes, um auf dem Laufenden zu bleiben. Sollten Sie jedoch Fehler bemerken oder Feedback haben, werden wir die folgenden Kommentare überwachen.