サーバーの初期設定にCloud-Configを使用する方法
序章
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
ファイルを貼り付けることができるテキストボックスが表示されます。
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つのファイルのみを書き込みます。 ファイルごとに、作成したいチャネルに関する詳細を提供します。 たとえば、使用できるパラメーターは、path
、content
、owner
、permissions
、さらには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
を従来の構成管理システムと組み合わせることで、新しいマシンをすばやく簡単に目的の状態にすることができます。