前書き
このガイドは、DigitalOceanチュートリアルの作成者向けの確立されたベストプラクティスと強力な推奨事項を要約する取り組みです。 DigitalOceanの教材で一貫性、技術的正確性、使いやすさの基盤を提供することを目的としています。
これは本質的に、社内のテクニカルライターおよび編集者、コミュニティマネージャー、エンジニアの経験の増加に基づいた、進行中の作業と意見を述べた文書の両方です。 その推奨事項は変更される可能性があり、幅広い読者とエンドユーザーを念頭に置いて教育コンテンツ向けに特別に作成されています。
ソフトウェアソースとインストール
優先ソース
大まかな降順の優先順位で、次のインストールメカニズムを使用します。
-
最良と評価された場合のproject recommended method。 多くのプロジェクトは急速に変化し、公式リポジトリを超えることを推奨していますが、一部のインストール(
curl | bash
パターンなど)では、それらを使用するかどうかを判断する必要があります。 -
現在のディストリビューションとリリースのofficial package repositories。
-
Language-specific official packages(NPM、CPAN、PIP、RubyGems、Composerなど)
-
Project-specific package repositories(例: Nginxは、最新バージョン用に独自のリポジトリを提供しています)、またはUbuntuでは、信頼できるPPAです。 これらがプロジェクトの開発者やDebian / Ubuntuパッケージメンテナーなどの信頼できるソースからのものであることを確認してください。
-
Binaries from the project’s GitHub releases pageまたは同様の公式Webソース。
-
wget
orcurl
install scriptsはシェルにパイプされ、スクリプトの検査に関する適切な警告が表示されます。
優先インストール場所
一般的に、不必要な合併症を避けてください。 ソースまたはバイナリからインストールされたパッケージ化されていないソフトウェアの場合、通常、デフォルトのインストールプレフィックスをそのまま使用する必要があります。
パッケージまたは他のインストール方法で提供されていない場合は、配布用の公式推奨事項に準拠した初期化スクリプトをサービス指向ソフトウェアに提供する必要があります。
Linuxシステムでは、自己完結型のバイナリまたはディレクトリを/opt
に配置し、スタンドアロンスクリプトを/usr/local/bin
に配置します。
ソフトウェアとシステムのメンテナンス
UbuntuおよびDebianシステムには、少なくともセキュリティ更新プログラムがインストールおよび構成されたunattended-upgrades
が必要です。 コンテキストを指定して、自動再起動またはすべて自動更新しないことをお勧めします。
提案された変更を詳しく調べて、破壊的なものが何も発生していないことを確認するため、通常、sudo apt-get upgrade
よりもsudo apt-get dist-upgrade
をお勧めします。 2つのコマンドは非常に似ていますが、一部の変更が抑制されているため、upgrade
の使用は予測が難しい場合があります。 特定のパッケージを保留すると、バージョンの不一致が発生し、本番システムで問題が発生する可能性があります。apt
と一部のドキュメントが不足しているため、Ubuntu 16.04では引き続きapt-get
を使用します。ディストリビューションの優先パッケージマネージャーに関する混乱。
サービス管理
レガシー互換性コマンドが利用可能な場合でも、ネイティブのinitシステムコマンドを使用してください。 たとえば、sudo service [service_name] start
は機能しますが、sudo systemctl start [service_name]
を使用します。
起動時にサービスを開始または無効にする方法に関する情報を提供します。 インターフェイス(journalctl -u
、systemctl status
など)で明確に示されていない場合に、サービス関連コマンドの結果を検査する方法を示します。
経験則として、サービスのリロードよりも再起動を優先します。 ほとんどの場合、一瞬のサービスの中断を回避するよりも既知の状態を確保することが重要です。また、完全なサービス障害が発生した場合は再起動がより便利です。
ブートストラップシステム
構成管理ワークフローの一部でない限り、ほとんどの場合、ユーザーデータスクリプトを優先し、ユーザーデータのスクリプトをbashするよりもcloudinitスクリプトを優先します。
ロギングとトラブルシューティング
インストールされたサービスのログにアクセスする場所と方法を説明します。 必要に応じて、サービスステータスとログ出力を確認するためのsystemctl
およびjournalctl
コマンドについて説明します。 可能であれば、一般的な障害事例を診断するための簡潔な提案を提供します。
パッケージやその他のインストールメカニズムで処理されない場合は、必ずログローテーションを処理してください。
次のプレーンテキストログファイルには、tail -f
ではなくtail -F
を使用します。後者は名前変更全体でファイルを追跡せず、ユーザーがログを監視しているときにログをローテーションすると混乱を招く可能性があります。
ユーザーとグループの管理
rootを直接使用する代わりに、sudo
ユーザーを作成します。 このタスクを前提条件として説明する適切な初期サーバーセットアップガイドを参照してください。
Debianベースのディストリビューションでは、それぞれadduser sammy
とdeluser --remove-home sammy
を持つユーザーを追加および削除します。 RHELベースのディストリビューションでは、adduser sammy
(必要に応じてpasswd sammy
でパスワードを設定)とuserdel -r sammy
を使用します。
Ubuntuでusermod -aG sudo sammy
にsudo
特権を付与します。 CentOSはもう少し複雑です。 最新バージョンはusermod -aG wheel sammy
を使用しますが、一部のバージョンでは、最初にwheel
のグループ権限のコメントを解除するためにvisudo
が必要です。 具体的には、CentOS 5では、sudo
をインストールし、wheelグループのコメントをvisudo
で解除する必要があります。 CentOS 6では、sudo
はすでにインストールされていますが、wheelのコメントを解除する必要があります。 CentOS 7にはsudo
があり、wheelグループはすでに設定されています。
特権エスカレーションされたコマンドを使用する場合は、記述されているとおりにテストしてください。 環境変数をsudo
に渡すには、sudo -E command_to_run
(環境全体で信頼されている場合)またはsudo FOO=BAR command_to_run
を使用します。 ルートシェルが必要なインスタンスの場合は、sudo -i
を使用します。 リダイレクトが必要なインスタンスの場合、宛先ファイル[sudo] command_to_run | sudo tee [-a] file_to_change
を置き換えるのではなく、tee -a
を使用して追加します。
推奨ツール
対話型シェルの場合は、GNU / LinuxシステムでBashを想定し、関連する場合は明示的に言及します。 FreeBSDでは、すぐに使用でき、便利な機能があるtcshを使用します。
テキストエディターの場合、「使用[優先]またはお気に入りのテキストエディター」というコピーを含め、コピーと貼り付けのコマンドに次の初心者向けのエディターを含めます。 Linuxでは、デフォルトでnano
になります。 FreeBSDでは、デフォルトでee
になります。 vi(m)は許容されますが、初心者向けのつまずきを引き起こす可能性がある入門的なトピックでは避けてください。
ファイル転送の場合、プッシュ機能がないため、インタラクティブでscpに似た用途には、ほとんどの場合sftp
をお勧めします。したがって、scp
も使用できます。 rsync
は、バックアップや大きな転送(または多くの小さなファイル)に役立ちます。 どのような状況でもFTPを使用しないでください。 また、堅牢性のため、wget
よりもcurl
で標準化するように努めています。 wget
の利点は、ほとんどが再帰的なダウンロードです(つまり、 私たちの種類のコンテンツでは一般的ではない特別なユースケース)。
iproute2
ユーティリティが付属しているマシンでは、considered obsoleteであるnet-tools
スイートよりもユーティリティを優先します。 一般に、ss
のようなiproute2
ユーティリティは、複数のインターフェイス、IPv6、新しいカーネル機能などをより適切にサポートします。 したがって、同様に、route
よりもip route
、ifconfig
よりもip addr show
などを使用する必要があります。 古いユーティリティの出力はデフォルトで少しきれいになっている場合もありますが、エッジケースも処理しないため、出力自体の信頼性は少し低くなります。 可能であれば、使用可能なフラグを使用して、より詳細な出力を制御します。
スクリプティング
システム管理チュートリアルのコンテキスト内では、通常、長いカスタムスクリプトや長いシェルスクリプトは避けてください。
作成者が作成したスクリプト(および場合によっては他のリソース)は、公開されたチュートリアルへのリンクを含むdo-community GitHubアカウントの記事ごとのリポジトリに存在する必要があります。 一般的に、適切なスクリプト作成のプラクティスに従ってください。 たとえば、ユーザーが入力する必要のある変数は、スクリプトの上部、できれば適切にマークされたセクションに配置します。 また、熱心にコメントするようにしてください。 DOチュートリアルでインライン化されたスクリプトの本文がブラックボックスとして機能することはありません。 ユーザーはそれを読み通すことで意味を理解できるはずです。
移植性やクロスプラットフォームの再利用が懸念される場合は、bash
よりも/bin/sh
を優先し、Bash固有の機能を避けてください。 小さなタスクにはシェルおよびcoreutils /標準Unixツールを使用します。利点が実質的でない限り、純粋にグルー言語のタスクに新しい依存関係を導入しないでください。 #!/path/to/interpreter
よりも#!/usr/bin/env interpreter
を優先します。
一般に、定期的なタスクのスケジューリングにはcron
を使用しますが、systemdタイマーも使用できます。
ファイルシステムの場所
スクリプトまたはデータをダウンロードするときは、ユーザーが書き込み可能なディレクトリにいるか、パスが明示的に指定されていることを確認してください。 参照または再利用できるようにする必要があるファイルについては、ファイルシステムの他の場所(/opt
や/etc
など)の標準の明確に定義されたパスに属していない限り、ユーザーのホームディレクトリを使用します。 使い捨てファイルの場合は、/tmp
を使用します。
Webサーバー
デフォルトでそのように構成されていないディストリビューションには、Debianスタイルの設定ディレクトリをお勧めします。 常に構成の変更をテストします(Apacheはsudo apachectl configtest
を使用し、Nginxはsudo nginx -t
を使用します)。/var/www/html
をすべてのWebサーバーのドキュメントルートとして使用する必要があります。 Nginxの/usr/share/nginx/html
のデフォルトは変更する必要があります。これは、そのディレクトリが所有されており、パッケージの更新によって変更される可能性があるためです。 これはUbuntu 16.04ではもはや問題ではありませんが、以前のリリースでは引き続き問題になります。
今後は、提供されたデフォルトファイルを変更するよりも、新しいApache仮想ホストファイルまたはNginxサーバーブロックファイルを作成することをお勧めします。 これにより、いくつかの一般的な間違いを回避し、デフォルトのファイルを意図したフォールバック構成として維持できます。
セキュリティ
システム間のすべての接続を暗号化および認証します。 (明示的または暗示的に)ユーザーに資格情報を送信したり、非公開データを平文で送信したりしないでください。
具体的には、セキュリティで保護されていない接続を介してパスワードとキーマテリアルを送信しないでください。 データベース接続、ロギング、クラスター管理、およびその他のサービスは、常に暗号化することが理想的です。 Webベースのコントロールパネルはserved over HTTPS connectionsである必要があり、TLS / SSLはサポートされているサービスに使用する必要があります。 プレーンHTTPのような公開サービスは、ユーザーが引き続き提供または提供する必要があるため、許可されますが、一般的な場合、特に動的コンテンツの場合は強く推奨されません。
デフォルトのSSHポートを変更するなど、あいまいさや演劇による低利益のセキュリティを構成するプラクティスは避けてください。 ファイアウォールを設定してください。 ディストリビューション固有の推奨事項は、Ubuntuの場合はufw
、Debianの場合はiptables
、CentOSの場合はfirewalld
です。 ただし、iptables
はプラットフォーム間で最も一貫性があり、それにフックする多くのツールがあります。
SSH
低メリットのセキュリティによる不明瞭なプラクティスを回避するために、デフォルトのSSHポートを変更しないことをお勧めします。 ポートを変更すると、ログから不要なものを取り除くのに役立つ場合がありますが、これは、それが主な関心事である特定の状況でのみ行う必要があります。
パスワード認証を無効にし、ルートに対してキーオンリー認証を使用するか、ルートログインを完全に無効にします。 少なくとも2048ビットRSAであるが推奨される4096の強力なSSHキーを使用してください。 ECDSAは技術的な理由から推奨されなくなり、Ed25519および楕円曲線アルゴリズムは十分に広くサポートされていません。
インタラクティブキーにはパスフレーズを使用しますが、非インタラクティブプロセスには使用しません。 SSHアカウントの所有権を設定またはコピーして、ルートアカウントからユーザーのホームディレクトリに変更します。 実用的な場所にfail2banをインストールします。
SSHエージェントフォワーディングは、CoreOSなどのプラットフォームの通常のワークフローには必要ですが、セキュリティ上の懸念がいくつかあることに注意してください。 基本的に、ホストの権限を持つユーザーは誰でも転送ソケットを使用してローカルのssh-agentに接続できます。
SSL/TLS
使いやすくするためにLet's Encryptの使用を強くお勧めします。TLSをお勧めします。 強力なSSLセキュリティを使用してください。 https://cipherli.st/(最新の推奨事項と従来の推奨事項の両方)を確認してください。
ドメイン名のないホストの場合、適切な強度の自己署名証明書をお勧めします。 ここでも、https://cipherli.st/に加えて、this Self-Signed Certification on Nginx guideなどのガイドで使用されている自己署名証明書の作成を確認してください。 Self-Signed SSL Certifications on ApacheやNginxのように、暗号化を有効にするときに強力なDiffie-Hellman鍵を設定します。
VPN
サーバー間の一般的な暗号化通信のソリューションとしてVPNをお勧めします。 複数のサービスをサーバー間で保護する必要がある場合、VPNはますます重要になります。各サービスを個別に暗号化する代わりに、すべての内部通信をVPNにパイプできます。 これは、問題のサービスがネイティブ暗号化をサポートしていない場合に特に便利です。
通常、サーバー間の通信にはOpenVPNよりもTincをお勧めします。 詳細と実装については、this article on Ansible and Tincを参照してください。
結論
これは、本質的に意見のある生きた文書であり、頻繁に更新されます。 技術は急速に変化しており、DigitalOceanでは常に最新の情報を提供するよう努めていますが、エラーに気づいた場合やフィードバックがある場合は、以下のコメントを監視します。