サーバーの初期セットアップにCloud-Configを使用する方法

前書き

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

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

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

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

このガイドでは、簡単な例を試して、DigitalOceanメタデータサービスとcloud-configファイルについて理解します。 デモンストレーションのために、initial server setup for Ubuntu 14.04ガイドで概説されている手順のいくつかを再作成します。

目標

Ubuntu 14.04 initial server setup guideのステップを正常に複製するには、スクリプトでいくつかのタスクを実行する必要があります。

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

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

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

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

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

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

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

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

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

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

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

  • 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ファイルを貼り付けることができるテキストボックスが表示されます。

DigitalOcean user data

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

{
    "name": "test",
    "private_networking": true,
    "region": "nyc3",
    "size": "512mb",
    "image": "ubuntu-14-04-x64",
    "user_data":"#cloud-config
        config_data
        more_config"
    "ssh_keys":[ 12345,56789 ]
}

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

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

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

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

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

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

覚えておいてください、最初の行に#cloud-configだけでcloud-configファイルを開始する必要があります。 これまでのところ、ファイルは次のようになります。

#cloud-config
users:
  - name: demo

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

#cloud-config
users:
  - name: demo
  - name: second_user

各ダッシュは、ユーザーの詳細を追加できる個別のユーザーアカウントを示します(これについては、後ほど説明します)。 ただし、作成するユーザーは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: demo
    ssh-authorized-keys:
      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCv60WjxoM39LgPDbiW7ne3gu18q0NIVv0RE6rDLNal1quXZ3nqAlANpl5qmhDQ+GS/sOtygSG4/9aiOA4vXO54k1mHWL2irjuB9XbXr00+44vSd2q/vtXdGXhdSMTf4/XK17fjKSG/9y3yD6nml6q9XgQxx9Vf/IkaKdlK0hbC1ds0+8h83PTb9dF3L7hf3Ch/ghvj5++tWJFdFeG+VI7EDuKNA4zL8C5FdYYWFA88YAmM8ndjA5qCjZXIIeZvZ/z9Kpy6DL0QZ8T3NsxRKapEU3nyiIuEAmn8fbnosWcsovw0IS1Hz6HsjYo4bu/gA82LWt3sdRUBZ/7ZsVD3ELip [email protected]

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

#cloud-config
users:
  - name: demo
    ssh-authorized-keys:
      - key_one
      - key_two

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

Sudoアクセスを設定する

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

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

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

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

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

#cloud-config
users:
  - name: demo
    ssh-authorized-keys:
      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCv60WjxoM39LgPDbiW7ne3gu18q0NIVv0RE6rDLNal1quXZ3nqAlANpl5qmhDQ+GS/sOtygSG4/9aiOA4vXO54k1mHWL2irjuB9XbXr00+44vSd2q/vtXdGXhdSMTf4/XK17fjKSG/9y3yD6nml6q9XgQxx9Vf/IkaKdlK0hbC1ds0+8h83PTb9dF3L7hf3Ch/ghvj5++tWJFdFeG+VI7EDuKNA4zL8C5FdYYWFA88YAmM8ndjA5qCjZXIIeZvZ/z9Kpy6DL0QZ8T3NsxRKapEU3nyiIuEAmn8fbnosWcsovw0IS1Hz6HsjYo4bu/gA82LWt3sdRUBZ/7ZsVD3ELip [email protected]
    sudo: ['ALL=(ALL) NOPASSWD:ALL']

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

demo ALL=(ALL) NOPASSWD:ALL

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

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

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

#cloud-config
users:
  - name: demo
    ssh-authorized-keys:
      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCv60WjxoM39LgPDbiW7ne3gu18q0NIVv0RE6rDLNal1quXZ3nqAlANpl5qmhDQ+GS/sOtygSG4/9aiOA4vXO54k1mHWL2irjuB9XbXr00+44vSd2q/vtXdGXhdSMTf4/XK17fjKSG/9y3yD6nml6q9XgQxx9Vf/IkaKdlK0hbC1ds0+8h83PTb9dF3L7hf3Ch/ghvj5++tWJFdFeG+VI7EDuKNA4zL8C5FdYYWFA88YAmM8ndjA5qCjZXIIeZvZ/z9Kpy6DL0QZ8T3NsxRKapEU3nyiIuEAmn8fbnosWcsovw0IS1Hz6HsjYo4bu/gA82LWt3sdRUBZ/7ZsVD3ELip [email protected]
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    groups: sudo

これにより、従来のsudoセットアップへの移行が容易になります。 このガイドの最後でこれを行う方法を紹介します。

シェル環境を設定する

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

これは、ほとんどの人が慣れているよりもはるかに簡素化された環境であるため、新しいユーザーに対してbashシェル環境を手動で指定する必要があります。

これは、usersレベル項目内のshellディレクティブを使用して実行できます。 必要なのは、bash実行可能ファイルのフルパスを指すことだけです。

#cloud-config
users:
  - name: demo
    ssh-authorized-keys:
      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCv60WjxoM39LgPDbiW7ne3gu18q0NIVv0RE6rDLNal1quXZ3nqAlANpl5qmhDQ+GS/sOtygSG4/9aiOA4vXO54k1mHWL2irjuB9XbXr00+44vSd2q/vtXdGXhdSMTf4/XK17fjKSG/9y3yD6nml6q9XgQxx9Vf/IkaKdlK0hbC1ds0+8h83PTb9dF3L7hf3Ch/ghvj5++tWJFdFeG+VI7EDuKNA4zL8C5FdYYWFA88YAmM8ndjA5qCjZXIIeZvZ/z9Kpy6DL0QZ8T3NsxRKapEU3nyiIuEAmn8fbnosWcsovw0IS1Hz6HsjYo4bu/gA82LWt3sdRUBZ/7ZsVD3ELip [email protected]
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    groups: sudo
    shell: /bin/bash

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

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

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

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

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

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

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

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

  • ポート4444

  • PermitRootLoginno

  • AllowUsersdemo

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

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

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

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

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

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

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

#cloud-config
users:
  - name: demo
    ssh-authorized-keys:
      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCv60WjxoM39LgPDbiW7ne3gu18q0NIVv0RE6rDLNal1quXZ3nqAlANpl5qmhDQ+GS/sOtygSG4/9aiOA4vXO54k1mHWL2irjuB9XbXr00+44vSd2q/vtXdGXhdSMTf4/XK17fjKSG/9y3yD6nml6q9XgQxx9Vf/IkaKdlK0hbC1ds0+8h83PTb9dF3L7hf3Ch/ghvj5++tWJFdFeG+VI7EDuKNA4zL8C5FdYYWFA88YAmM8ndjA5qCjZXIIeZvZ/z9Kpy6DL0QZ8T3NsxRKapEU3nyiIuEAmn8fbnosWcsovw0IS1Hz6HsjYo4bu/gA82LWt3sdRUBZ/7ZsVD3ELip [email protected]
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    groups: sudo
    shell: /bin/bash
write_files:
  - item_one
  - item_two

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

デフォルトでは、このメソッドで作成されたファイルの所有者はrootであり、アクセス許可は644です。これは、まさに私たちが望んでいることです。 したがって、pathおよびcontentディレクティブを指定するだけで済みます。

pathは、ファイルシステム内でファイルを書き込む場所にすぎません。

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

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

#cloud-config
users:
  - name: demo
    ssh-authorized-keys:
      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCv60WjxoM39LgPDbiW7ne3gu18q0NIVv0RE6rDLNal1quXZ3nqAlANpl5qmhDQ+GS/sOtygSG4/9aiOA4vXO54k1mHWL2irjuB9XbXr00+44vSd2q/vtXdGXhdSMTf4/XK17fjKSG/9y3yD6nml6q9XgQxx9Vf/IkaKdlK0hbC1ds0+8h83PTb9dF3L7hf3Ch/ghvj5++tWJFdFeG+VI7EDuKNA4zL8C5FdYYWFA88YAmM8ndjA5qCjZXIIeZvZ/z9Kpy6DL0QZ8T3NsxRKapEU3nyiIuEAmn8fbnosWcsovw0IS1Hz6HsjYo4bu/gA82LWt3sdRUBZ/7ZsVD3ELip [email protected]
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    groups: sudo
    shell: /bin/bash
write_files:
  - path: /etc/ssh/sshd_config
    content: |
         Port 4444
         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
         PermitRootLogin no
         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
         AllowUsers demo

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

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

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

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

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

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

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

#cloud-config
users:
  - name: demo
    ssh-authorized-keys:
      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCv60WjxoM39LgPDbiW7ne3gu18q0NIVv0RE6rDLNal1quXZ3nqAlANpl5qmhDQ+GS/sOtygSG4/9aiOA4vXO54k1mHWL2irjuB9XbXr00+44vSd2q/vtXdGXhdSMTf4/XK17fjKSG/9y3yD6nml6q9XgQxx9Vf/IkaKdlK0hbC1ds0+8h83PTb9dF3L7hf3Ch/ghvj5++tWJFdFeG+VI7EDuKNA4zL8C5FdYYWFA88YAmM8ndjA5qCjZXIIeZvZ/z9Kpy6DL0QZ8T3NsxRKapEU3nyiIuEAmn8fbnosWcsovw0IS1Hz6HsjYo4bu/gA82LWt3sdRUBZ/7ZsVD3ELip [email protected]
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    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: demo
    ssh-authorized-keys:
      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCv60WjxoM39LgPDbiW7ne3gu18q0NIVv0RE6rDLNal1quXZ3nqAlANpl5qmhDQ+GS/sOtygSG4/9aiOA4vXO54k1mHWL2irjuB9XbXr00+44vSd2q/vtXdGXhdSMTf4/XK17fjKSG/9y3yD6nml6q9XgQxx9Vf/IkaKdlK0hbC1ds0+8h83PTb9dF3L7hf3Ch/ghvj5++tWJFdFeG+VI7EDuKNA4zL8C5FdYYWFA88YAmM8ndjA5qCjZXIIeZvZ/z9Kpy6DL0QZ8T3NsxRKapEU3nyiIuEAmn8fbnosWcsovw0IS1Hz6HsjYo4bu/gA82LWt3sdRUBZ/7ZsVD3ELip [email protected]
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    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コマンドは、現在ファイルに「AllowUsers」ディレクティブがないため、ファイルの最後に行を追加します。 これを行うには、最後の行(「$」で指定)を照合し、必要な行を追加します。

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

#cloud-config
users:
  - name: demo
    ssh-authorized-keys:
      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCv60WjxoM39LgPDbiW7ne3gu18q0NIVv0RE6rDLNal1quXZ3nqAlANpl5qmhDQ+GS/sOtygSG4/9aiOA4vXO54k1mHWL2irjuB9XbXr00+44vSd2q/vtXdGXhdSMTf4/XK17fjKSG/9y3yD6nml6q9XgQxx9Vf/IkaKdlK0hbC1ds0+8h83PTb9dF3L7hf3Ch/ghvj5++tWJFdFeG+VI7EDuKNA4zL8C5FdYYWFA88YAmM8ndjA5qCjZXIIeZvZ/z9Kpy6DL0QZ8T3NsxRKapEU3nyiIuEAmn8fbnosWcsovw0IS1Hz6HsjYo4bu/gA82LWt3sdRUBZ/7ZsVD3ELip [email protected]
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    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 demo' /etc/ssh/sshd_config
  - restart ssh

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

完成品

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

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

{"name": "your_droplet_name",
"private_networking": true,
"region": "nyc3",
"size": "512mb",
"image": "ubuntu-14-04-x64",
"user-data": "#cloud-config
users:
  - name: demo
    ssh-authorized-keys:
      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCv60WjxoM39LgPDbiW7ne3gu18q0NIVv0RE6rDLNal1quXZ3nqAlANpl5qmhDQ+GS/sOtygSG4/9aiOA4vXO54k1mHWL2irjuB9XbXr00+44vSd2q/vtXdGXhdSMTf4/XK17fjKSG/9y3yD6nml6q9XgQxx9Vf/IkaKdlK0hbC1ds0+8h83PTb9dF3L7hf3Ch/ghvj5++tWJFdFeG+VI7EDuKNA4zL8C5FdYYWFA88YAmM8ndjA5qCjZXIIeZvZ/z9Kpy6DL0QZ8T3NsxRKapEU3nyiIuEAmn8fbnosWcsovw0IS1Hz6HsjYo4bu/gA82LWt3sdRUBZ/7ZsVD3ELip [email protected]
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    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 demo' /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:yourpassword
  expire: False
. . .

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

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

サーバーの展開後に、より従来型のパスワード認証されたsudoアクセスを構成する場合は、次の手順を簡単に実行できます。

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

sudo passwd demo

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

groups
demo sudo

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

sudo usermod -a -G sudo demo

次に、ファイルを引数として渡して、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を従来の構成管理システムと組み合わせることで、新しいマシンをすばやく簡単に目的の状態にすることができます。