序章

DigitalOceanメタデータサービスの導入により、ログインする前にサーバーの構成を開始することができます。 つまり、メタデータサービスは、サーバーが起動プロセス中にアクセスできるHTTPの場所です。

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

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

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

このガイドでは、簡単な例を試して、DigitalOceanメタデータサービスとcloud-configファイルについて理解します。 デモンストレーションのために、 Ubuntu14.04ガイドの初期サーバーセットアップで概説されている手順の一部を再作成します。

目標

Ubuntu 14.04初期サーバーセットアップガイドの手順を正常に複製するには、スクリプトでいくつかのタスクを実行する必要があります。

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

  • rootユーザーのパスワードを変更する
  • 新しいユーザーを作成する
  • 新しいユーザーのパスワードを作成します
  • 新しいユーザーにroot権限を与える
  • (オプション)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がデプロイされているリージョンでのみ利用可能であることに注意してください。 さらに、user-dataフィールドを使用するために必要なcloud-initのバージョンは、現在、Ubuntu14.04とCentOS7、およびこれらのリリースに基づくアプリケーションイメージでのみ使用できます。

コントロールパネルのインターフェイスを介して、ユーザーデータを有効にするオプションのチェックボックスがあります。 これを選択すると、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

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

SudoAccessを設定する

次のステップは、新しいアカウントへの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']

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

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
  • PermitRootLogin no
  • AllowUsersデモ

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

#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アクセスを構成する場合は、次の手順を簡単に実行できます。

まず、新しいアカウントのパスワードを設定する必要があります。 現在のパスワード(存在しない)を入力せずにこれを行う唯一の方法は、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を従来の構成管理システムと組み合わせることで、新しいマシンをすばやく簡単に目的の状態にすることができます。