前書き

DigitalOceanメタデータサービスの導入により、ログインする前にサーバーの構成を開始できます。 つまり、メタデータサービスは、ブートプロセス中にサーバーがアクセスできるHTTPロケーションです。

メタデータの場所には、ネットワークアドレス、ホスト名など、サーバーの構成と環境に関する基本データが含まれます。 初期セットアップ中に、これらの値は「+ cloud-init +」と呼ばれるプログラムによってプルダウンされ、重要なサービスの設定に役立ちます。

最も強力な機能は、 `+ user-data +`というフィールドを使用してサーバーを作成するときに、メタデータサービスにスクリプトを渡すことができることです。 これは初期ブートプロセス中に実行され、非常に柔軟であるため、スクリプトを作成できるものなら何でも実行できます。

渡す最も一般的なタイプのスクリプトは、 `+ cloud-config +`スクリプトと呼ばれます。 これは、宣言によって一般的な構成アイテムを設定する簡単で読みやすい方法を提供するYAML形式のファイルです。 また、他のタスクのために任意のコマンドを実行する機能も備えています。

このガイドでは、簡単な例を試して、DigitalOceanメタデータサービスと `+ cloud-config +`ファイルに精通します。 私たちは、実証します。

目標

Ubuntu 14.04初期サーバーセットアップガイドの手順を正常に複製するには、スクリプトが多くのタスクを実行します。

上記のガイドが達成する基本的なタスクは次のとおりです。

  • ルートユーザーのパスワードを変更する

  • 新しいユーザーを作成する

  • 新しいユーザーのパスワードを作成します

  • 新しいユーザーにルート権限を付与します

  • (オプション)SSHデーモンがリッスンするポートを変更します

  • (オプション)ルートSSHログインを制限する

  • (オプション)新しいユーザーを明示的に許可する

環境に対処するための目標の変更

`+ cloud-config `ファイルで作成されたサーバーの場合、目標を少し変更する必要があります。 ` cloud-config +`ファイルを介して渡された情報はすべて、サーバーの全期間を通じてシステムの*任意の*ユーザーがアクセスできます。

これにより、理解して対処することが重要な多くのセキュリティ問題が発生します。 留意するべきいくつかの事柄は次のとおりです:

  • `+ cloud-config `で渡される情報はすべて、システム上のすべてのユーザーがアクセスできます。 ` cloud-config +`ファイルに機密情報を含めないでください。

  • 既存のユーザーのパスワードを設定できますが、プレーンテキストで渡す必要があります。

  • 新規ユーザーの場合、パスワードのハッシュ化されたバージョンを渡すことができますが、これらのハッシュは最新のハードウェアで非常に簡単に破ることができます。

これらのことを念頭に置いて、 `+ cloud-config +`ファイル内でのパスワードのコミットを回避するために、セットアップは可能な限りすべてのことを行う必要があります。 展開環境の特定のニーズに合わせて目標を調整できます。

調整された戦略は次のようになります。

  • パスワードを設定せず、 `+ cloud-config`を介してrootアカウントにSSHキーを提供しません(また、DigitalOceanインターフェースを介して追加されたSSHキーは通常どおり追加されます)

  • 新しいユーザーを作成する

  • 新しいユーザーアカウントにパスワードを設定しない

  • 新しいユーザーアカウントのSSHアクセスをセットアップする

  • 新しいユーザーにパスワードなしのsudo権限を付与して、管理上の変更を加えます。

  • (オプション)SSHデーモンがリッスンするポートを変更します

  • (オプション)ルートSSHログインを制限します(特にDigitalOceanインターフェースを介してSSHキーを含めない場合)

  • (オプション)新しいユーザーを明示的に許可する

両方のアカウントのパスワードを削除することに加えて、ここで最も劇的な変更は、アカウントのパスワードを入力せずに新しいアカウントが `+ sudo +`を使用できることです。 これは、rootログインを許可しておらず、新しいユーザーのアカウントパスワードを設定していないため必要です。

新しいユーザーがログインすると、必要に応じてパスワードを安全に設定し、sudo権限を変更してパスワードを要求することができます。

これらの調整された目標を念頭に置いて、始めましょう。

Cloud-Configファイルの使用

`+ cloud-config +`ファイルは基本的に、特定のディレクティブを理解するYAMLファイルです。 YAMLは非常に人間が読めるように設計されたデータシリアル化形式であり、理解と編集が簡単になります。

YAMLファイルは、フォーマットに関していくつかのルールに依存しています。

  • 空白を含むインデントは、アイテムの構造と相互の関係を示します。 よりインデントされたアイテムは、最初のアイテムのサブアイテムであり、その上のインデントのレベルは低くなります。

  • リストのメンバーは、先頭のダッシュで識別できます。

  • 連想配列エントリは、コロン(:)の後にスペースと値を続けて作成されます。

  • テキストのブロックはインデントされます。 フォーマットを維持したままブロックをそのまま読み込む必要があることを示すには、ブロックの前にパイプ文字(|)を使用します。

`+ cloud-config `ファイルの最初の行には、ファイルが ` cloud-config `ファイルであることを ` cloud-init +`プログラムが認識できるように、特別な識別子を含める必要があります。 これは次のようになります。

#cloud-config

これは、最初の行に単独で配置する必要があります。 サーバーの作成時に、 `+ cloud-config +`ファイルを提供する必要があります。 これは、2つの異なる方法で実現できます。

メタデータサービスは、クラウド1.5が展開されている地域でのみ利用可能であることに注意してください。 さらに、現在、ユーザーデータフィールドを使用するために必要なcloud-initのバージョンは、Ubuntu 14.04とCentOS 7、およびこれらのリリースに基づくアプリケーションイメージでのみ利用可能です。

コントロールパネルインターフェイスには、ユーザーデータを有効にするオプションのチェックボックスがあります。 これを選択すると、 `+ cloud-config +`ファイルを貼り付けることができるテキストボックスが表示されます。

image:https://assets.digitalocean.com/articles/pdocs/site/control-panel/droplets/user-data.png [DigitalOceanユーザーデータ]

APIを使用している場合、作成リクエスト中に渡されるJSONオブジェクトは、 `+ user_data +`というフィールドを利用できます。 たとえば、次のようなJSONオブジェクトを渡すことができます。

{
   "name": "test",
   "private_networking": true,
   "region": "nyc3",
   "size": "512mb",
   "image": "ubuntu-14-04-x64",
   "user_data":"

       "
   "ssh_keys":[ 12345,56789 ]
}

これらの方法はどちらも実際にはまったく同じように機能するため、最も快適な方法を使用してください。

新しいユーザーアカウントの設定

最初に行う必要があるのは、新しいユーザーアカウントを構成することです。

ここでほとんどすべての作業が行われます。 デフォルトでは、rootアカウントにはパスワードがないため、そこでパスワードを「設定解除」する必要はありません。

新しいユーザーを作成する

新しいユーザーを作成するには、 `+ users `ディレクティブを使用します。 これには、作成するすべての新しいアカウントのリストが含まれます。 作成するアカウントは1つだけなので、リストは1つになります。 リンクしたガイドに従うために、この新しいアカウントを「 demo +」と呼びます。

最初の行に +#cloud-config`のみを指定して + cloud-config`ファイルを開始する必要があることを忘れないでください。 これまでのところ、ファイルは次のようになります。

#cloud-config
users:
 - name:

さらにユーザーを追加する場合は、次のように、ダッシュで始まるアイテムの下にアイテムを水平方向に並べて配置します。

#cloud-config
users:
 - name: demo

各ダッシュは、ユーザーの詳細を追加できる個別のユーザーアカウントを示します(これについては、後ほど説明します)。 ただし、作成するユーザーは1人だけなので、このガイドにはこの2行目はありません。

認証済みキーの追加

パスワードなしでこの新しいアカウントにログインするには、1つ以上のSSH公開キーを提供する必要があります。 これらは、ホームディレクトリの `+ .ssh `ディレクトリ内の新しいユーザーの ` authorized_keys +`ファイルに追加されます。

これは、 `+ users `エントリのサブアイテムである ` ssh-authorized-keys `ディレクティブで実現されます。 基本的にこれは、 ` name +`ディレクティブに合わせて配置することを意味しますが、新しいユーザーエントリの開始ではないため、ダッシュを付けないでください。

`+ ssh-authorized_keys`エントリは実際にはキーのリストを受け取ります。 これにより、複数のSSH公開キーをファイルに追加できます。 たとえば、ラップトップ、デスクトップ、およびコンピューター用のSSHキーペアがある場合は、それらすべてを `+ ssh-authorized-keys +`リストの個別のアイテムとして追加できます。

ローカルコンピューターの公開キーの内容を取得するには、次のように入力します。

cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCv60WjxoM39LgPDbiW7ne3gu18q0NIVv0RE6rDLNal1quXZ3nqAlANpl5qmhDQ+GS/sOtygSG4/9aiOA4vXO54k1mHWL2irjuB9XbXr00+44vSd2q/vtXdGXhdSMTf4/XK17fjKSG/9y3yD6nml6q9XgQxx9Vf/IkaKdlK0hbC1ds0+8h83PTb9dF3L7hf3Ch/ghvj5++tWJFdFeG+VI7EDuKNA4zL8C5FdYYWFA88YAmM8ndjA5qCjZXIIeZvZ/z9Kpy6DL0QZ8T3NsxRKapEU3nyiIuEAmn8fbnosWcsovw0IS1Hz6HsjYo4bu/gA82LWt3sdRUBZ/7ZsVD3ELip [email protected]

次に、 `+ ssh-authorized-keys +`エントリの下に完全なコンテンツをアイテムとして貼り付けることができます。 SSH公開キーは公開されているため、これはセキュリティリスクを表すものではありません。

#cloud-config
users:
 - name:
   ssh-authorized-keys:
     -

追加のキーを追加する場合は、ダッシュを追加してから2番目の公開キーを追加することで実行できます。

#cloud-config
users:
 - name:
   ssh-authorized-keys:
     -
     -

このアカウントへのログインに使用するキーをここに追加します。

Sudoアクセスを設定する

次のステップは、新しいアカウントへの「+ sudo 」アクセスを設定することです。 繰り返しになりますが、パスワードのない「 sudo +」アクセスを設定します。これは、セキュリティの制限によりこのアカウントにパスワードを設定しないためです。

アクセスを構成するには、実際には2つの個別のステップを実行します。

最初に、 `+ sudoers`ファイルに使用するエントリを作成します。 実際には、変更は `+ / etc / sudoers.d `ディレクトリ内の別のファイルに書き込まれます。これは、解析時に ` / etc / sudoers +`に含まれます。

+ cloud-init +`はエントリ情報からアカウント名を把握するのに十分スマートであるため、作成する必要があるエントリにはユーザー名を含める必要はありません。 使用する必要があるディレクティブは `+ sudo`で、これは他の + users`レベルのディレクティブと一致しています。

このガイドでは、パスワードなしの「+ sudo +」機能を設定しているため、次のようになります。

#cloud-config
users:
 - name:
   ssh-authorized-keys:
     -
   sudo:

これにより、 `+ 90-cloud-init-users `という名前のファイルが ` / etc / sudoers.d +`ディレクトリに作成されます。 このファイル内では、エントリは次のようになります。

demo ALL=(ALL) NOPASSWD:ALL

2番目に行うことは、実際にユーザーを `+ sudo`グループに追加することです。 `+ sudo +`によって解析される新しいアカウントに固有のエントリがあるため、これは厳密には必要ありませんが、より柔軟になります。

後で、ユーザーのパスワードを手動で設定し、 `+ sudo `コマンドにそのパスワードを要求する場合があります。 ユーザーがすでに ` sudo `グループに属している場合、パスワードを設定し、 ` 90-cloud-init-users +`ファイルのエントリを削除するだけです。

補助グループを追加するには、 `+ groups +`ディレクティブを使用できます:

#cloud-config
users:
 - name:
   ssh-authorized-keys:
     -
   sudo:
   groups: sudo

これにより、従来の「+ sudo +」セットアップへの移行が容易になります。 これを行う方法については、このガイドの最後で説明します。

シェル環境を設定する

デフォルトでは、新しく作成されたユーザーのデフォルトシェルは非常に基本的な `+ / bin / sh +`シェルに設定されています。

これは、ほとんどの人が慣れている環境よりもはるかに控えめな環境なので、新しいユーザー用に手動で `+ bash +`シェル環境を指定する必要があります。

これは、 + user use`レベル項目内の + shell`ディレクティブで実現できます。 実行する必要があるのは、 `+ bash +`実行可能ファイルのフルパスを指すことだけです。

#cloud-config
users:
 - name:
   ssh-authorized-keys:
     -
   sudo:
   groups: sudo
   shell: /bin/bash

新しいユーザー設定が完了しました。 これで、SSHデーモンをロックダウンするオプションのステップに進むことができます。

SSHデーモンの構成とロックダウン(オプション)

次の手順は、セキュリティを強化するのに役立ちます。 必要に応じて、それらの一部またはすべてを実装できます。 これらのオプションの詳細については、自動化されているガイドをご覧ください。 2つの異なる方法を使用して各アイテムを実装する方法を示します。

行う必要があるすべての変更は、 `+ / etc / ssh / sshd_config +`ファイルに反映されます。 繰り返しになりますが、私たちが行うことに関心のある変更は次のとおりです。

  • (オプション)SSHデーモンがリッスンするポートを変更します

  • (オプション)ルートSSHログインを制限します(特にDigitalOceanインターフェースを介してSSHキーを含めない場合)

  • (オプション)新しいユーザーを明示的に許可する

これらの設定は、それぞれ `+ sshd_config +`ファイルでこれらの変更を行うことで実装できます。

  • Port

  • PermitRootLogin

  • AllowUsers

これらの変更を行うには、2つのアプローチがあります。 最初の方法は、 `+ cloud-config +`ファイル内で設定ファイル全体を提供することにより、ファイルを完全に書き換えることです。 2つ目は、一般的なLinuxテキストユーティリティを使用して戦略的に変更を加えることです。

これらの両方に利点があり、両方とも `+ cloud-config +`で異なるディレクティブを示します。 それぞれを順番に説明します。

新しい構成ファイルを指定してSSHデーモンを構成する

必要な変更を行うための最初の戦略は、目的の正確な内容でファイルを完全に書き換えることです。

これにより、デフォルトで使用可能なファイルに関係なく、ファイルを完全に制御できます。 方法論は単純明快であり、行動の結果を予測するのは簡単です。

新しいファイルをディスクに書き込むには、 `+ write_files `ディレクティブを使用できます。 これはトップレベルのディレクティブであるため、以前に作業していた ` users +`セクションの外側に配置する必要があります。

書き込むファイルのリスト(アイテムごとにダッシュで再度表示)を提供します。

#cloud-config
users:
 - name:
   ssh-authorized-keys:
     -
   sudo:
   groups: sudo
   shell: /bin/bash
write_files:

この例では、1つのファイルのみを書き込みます。 ファイルごとに、行う変更に関する詳細を提供します。 たとえば、使用できるパラメーターは、「+ path 」、「 conten」、「+ owner」、「+ permissions」、さらには「+ encoding」です。

デフォルトでは、このメソッドで作成されたファイルの所有者はrootであり、パーミッションは + 644 +`です。これはまさに私たちが望むものです。 したがって、 `+ path`と + content`ディレクティブのみを提供する必要があります。

`+ path +`は、ファイルを書き込むファイルシステム内の単なる場所です。

`+ content +`の場合、ファイルの内容全体をそのまま提供する必要があります。 パイプ文字(|)を使用して、書式を維持するテキストブロックを渡すことができます。

`+ sshd_config +`ファイルのコンテンツについては、(簡潔にするために)コメントを取り除いたデフォルトのコンテンツを使用し、変更を加えます。 ファイルを書き換える完全なセクションは次のようになります。

#cloud-config
users:
 - name:
   ssh-authorized-keys:
     -
   sudo:
   groups: sudo
   shell: /bin/bash
write_files:
 - path: /etc/ssh/sshd_config
   content: |

        Protocol 2
        HostKey /etc/ssh/ssh_host_rsa_key
        HostKey /etc/ssh/ssh_host_dsa_key
        HostKey /etc/ssh/ssh_host_ecdsa_key
        HostKey /etc/ssh/ssh_host_ed25519_key
        UsePrivilegeSeparation yes
        KeyRegenerationInterval 3600
        ServerKeyBits 1024
        SyslogFacility AUTH
        LogLevel INFO
        LoginGraceTime 120

        StrictModes yes
        RSAAuthentication yes
        PubkeyAuthentication yes
        IgnoreRhosts yes
        RhostsRSAAuthentication no
        HostbasedAuthentication no
        PermitEmptyPasswords no
        ChallengeResponseAuthentication no
        X11Forwarding yes
        X11DisplayOffset 10
        PrintMotd no
        PrintLastLog yes
        TCPKeepAlive yes
        AcceptEnv LANG LC_*
        Subsystem sftp /usr/lib/openssh/sftp-server
        UsePAM yes

これにより、 `+ / etc / ssh / sshd_config `の内容が、提供した新しい内容に完全に置き換えられます。 これはUbuntuのデフォルトの ` sshd_config +`ファイルで、上記のアイテムのみが変更されています。

これは、SSHデーモンに変更を加える1つの方法です。

集中的な変更によるSSHデーモンの構成

`+ sshd_config +`ファイルを変更できる2番目の方法は、集中的な編集によるものです。 Linuxシステムには、必要な変更のみを行うために活用できるさまざまな強力なテキスト操作ツールが付属しています。

任意のコマンドを実行するには、 `+ runcmd +`というディレクティブを使用します。これにより、システムで任意のコマンドを実行できます。 各コマンドは、ディレクティブの下のリスト項目になります。 これらは、コマンド全体を表す文字列として、またはコマンドとすべてのオプションを要素として含む配列として指定できます。

文字列置換用に作成された `+ sed `コマンドを使用します。 1つの「 sed 」コマンドに複数の操作を渡すことができますが、「 sed 」コマンドごとに1つの操作を行います。 これにより、問題を簡単にトラブルシューティングできます。 ` sed `コマンドはすべて、 ` sshd_config +`ファイルを所定の場所で編集します。

最初の `+ sed `コマンドは、リスニングポートを設定する行を変更します。 「ポート」で始まる行を検索することでこれを識別します。 ` sed `に、行全体(正規表現 ` ^。* $ `で指定)を ` Port 4444 +`設定で置き換えるように指示します。

#cloud-config
users:
 - name:
   ssh-authorized-keys:
     -
   sudo:
   groups: sudo
   shell: /bin/bash
runcmd:
 - sed -i -e '/^Port/s/^.*$/Port 4444/' etc/ssh/sshd_config

次の「+ sed 」行は、行の先頭でその文字列を検索することにより、「PermitRootLogin」ディレクティブを変更します。 もう一度、この行全体を ` PermitRootLogin no +`で置き換えます。

#cloud-config
users:
 - name:
   ssh-authorized-keys:
     -
   sudo:
   groups: sudo
   shell: /bin/bash
runcmd:
 - sed -i -e '/^Port/s/^.*$/Port 4444/' /etc/ssh/sshd_config
 - sed -i -e '/^PermitRootLogin/s/^.*$/PermitRootLogin no/' /etc/ssh/sshd_config

ファイルには現在「AllowUsers」ディレクティブがないため、次の「+ sed +」コマンドはファイルの最後に行を追加します。 これを行うには、最後の行(「$」で指定)を照合し、必要な行を追加します。

その後、変更を反映させるためにSSHデーモンを再起動する必要があります。 Upstartの「restart」コマンドを使用して、これを簡単に行うことができます。

#cloud-config
users:
 - name:
   ssh-authorized-keys:
     -
   sudo:
   groups: sudo
   shell: /bin/bash
runcmd:
 - sed -i -e '/^Port/s/^.*$/Port 4444/' /etc/ssh/sshd_config
 - sed -i -e '/^PermitRootLogin/s/^.*$/PermitRootLogin no/' /etc/ssh/sshd_config
 - sed -i -e '$aAllowUsers ' /etc/ssh/sshd_config
 - restart ssh

これは、ファイルに必要な編集を行い、サービスを再起動するのに十分なはずです。

完成品

`+ cloud-config +`ファイルを使用して、調整されたすべての目標を達成しました。 コントロールパネルを使用してサーバーを作成するか、APIを使用してサーバーを起動できます。

APIの使用を選択した場合、サンプルのデータペイロードは次のようになります。

{"name": "",
"private_networking": true,
"region": "nyc3",
"size": "512mb",
"image": "ubuntu-14-04-x64",
"user-data": "#cloud-config
users:
 - name:
   ssh-authorized-keys:
     -
   sudo:
   groups: sudo
   shell: /bin/bash
runcmd:
 - sed -i -e '/^Port/s/^.*$/Port 4444/' /etc/ssh/sshd_config
 - sed -i -e '/^PermitRootLogin/s/^.*$/PermitRootLogin no/' /etc/ssh/sshd_config
 - sed -i -e '$aAllowUsers ' /etc/ssh/sshd_config
 - restart ssh"}

トラブルシューティング

`+ cloud-config +`ファイルを正常に動作させるのに問題がある場合は、ログファイルで手がかりを確認できます。

これらは次の場所にあります。

  • * / var / log / cloud-init.log *:cloud-initによる構成ファイルの処理の実際のプロセスログ。

  • * / var / log / cloud-init-output.log *:構成の処理によって生成された出力はすべてここにあります。

通常、 `+ grep +`を使用してこれらのファイルを検索すると、何が起こったのかに関する良い情報を見つけることができます。

構成の問題のために作成したサーバーにログインできない状況になった場合は、サーバーを破棄して再起動することをお勧めします。 トラブルシューティングのために、 `+ cloud-config +`ファイルにrootパスワードを使用してテストサーバーを一時的にセットアップし、何が問題なのかを確認することが必要な場合があります。

これは、 `+ cloud-config +`に次のようなものを含めることで実行できます。

#cloud-config
chpasswd:
 list: |
   root:
 expire: False
. . .

これにより、SSHに依存しないDigitalOceanコンソールを使用してログインできます。 ここに入力したパスワードは、システムの全期間を通じてサーバー上のすべてのユーザーが読み取り可能なため、問題が何であるかを確認した後、このドロップレットを破棄してください。 その後、正しい `+ cloud-config`ファイルを使用して別のサーバーを起動できます。

従来のSudoアクセスのセットアップ

サーバーがデプロイされた後に、より一般的なパスワード認証の「+ sudo +」アクセスを設定する場合は、次の手順を簡単に実行できます。

まず、新しいアカウントのパスワードを設定する必要があります。 現在のパスワード(存在しない)を入力せずにこれを行う唯一の方法は、 `+ sudo +`を使用することです。 ルートパスワードを設定しないようにするには、コマンドの最後に新しいユーザーアカウントの名前を指定する必要があります。

sudo passwd

アカウントのパスワードを取得したので、あなたが実際に `+ sudo +`グループにいることを確認してください。 これは、次のように入力することで実行できます。

groups
sudo

まだ `+ sudo +`グループにない場合は、次のように入力して自分を追加できます。

sudo usermod -a -G sudo

次に、ファイルを引数として渡すことで、 `+ visudo `コマンドで ` 90-cloud-init-users +`ファイルを編集します:

sudo visudo -f /etc/sudoers.d/90-cloud-init-users

ユーザーに関連付けられている行をコメントアウトまたは削除します。

#demo ALL=(ALL) NOPASSWD:ALL

ファイルを保存して閉じます。 アカウントでは、 `+ sudo +`コマンドを実行するためにパスワードが必要になります。

結論

`+ cloud-config +`ファイルを使用してサーバーの初期設定を完了することは簡単で、長期的には時間を節約できます。 これらのファイルは簡単に調整でき、さまざまな構成を構築することで、サーバーをすばやくセットアップする際の柔軟性が大幅に向上します。

マシンがオンラインになった後、「+ cloud-config +」と従来の構成管理システムを組み合わせることにより、新しいマシンを正確かつ迅速に目的の状態にすることができます。