Поиск по сайту:

Как использовать Cloud-Config для первоначальной настройки сервера


Введение

С введением службы метаданных DigitalOcean можно начать настройку серверов еще до того, как вы войдете в систему. Короче говоря, служба метаданных — это расположение HTTP, к которому ваш сервер может получить доступ во время процесса загрузки.

Расположение метаданных будет содержать основные данные о конфигурации и среде сервера, такие как сетевые адреса, имя хоста и т. д. Во время первоначальной настройки эти значения могут быть извлечены программой под названием cloud-init, чтобы помочь настроить основные службы.

Самая мощная функция заключается в том, что вы можете передать сценарий службе метаданных при создании сервера с использованием поля с именем user-data. Это будет выполняться во время первоначального процесса загрузки и является очень гибким, позволяя вам выполнить все, что вы можете написать в сценарии.

Наиболее распространенный тип передаваемого сценария называется cloud-config. Это файл в формате YAML, который предоставляет простые, удобочитаемые методы настройки общих элементов конфигурации с помощью объявления. Он также имеет возможность запускать произвольные команды для других задач.

В этом руководстве мы познакомимся со службой метаданных DigitalOcean и файлами cloud-config, попробовав простой пример. Мы воссоздадим некоторые шаги, описанные в руководстве по начальной настройке сервера для Ubuntu 14.04, чтобы продемонстрировать.

Цели

Чтобы успешно воспроизвести шаги, описанные в руководстве по первоначальной настройке сервера Ubuntu 14.04, наш скрипт должен выполнить ряд задач.

Вот основные задачи, которые выполняет приведенное выше руководство:

  • Изменить пароль пользователя root
  • Создать нового пользователя
  • Создайте пароль нового пользователя.
  • Предоставьте новому пользователю root-права
  • (Необязательно) Измените порт, который прослушивает демон SSH
  • (Необязательно) Запретить вход по SSH с правами суперпользователя.
  • (Необязательно) Явно разрешите нашему новому пользователю

Изменение целей в соответствии с окружающей средой

Для наших серверов, созданных с помощью файла cloud-config, нам придется немного изменить наши цели. Любая информация, передаваемая через файл cloud-config, доступна любому пользователю системы в течение всего срока службы сервера.

Это вводит ряд проблем безопасности, которые важно понять и решить. Вот некоторые вещи, о которых следует помнить:

  • Любая информация, передаваемая в вашем cloud-config, доступна каждому пользователю системы. Не помещайте ничего конфиденциального в свои файлы cloud-config.
  • Вы можете установить пароль для существующих пользователей, но вы должны передать его в виде обычного текста.
  • Новым пользователям можно передать хешированную версию пароля, но эти хэши очень легко взломать с помощью современного оборудования.

Имея это в виду, наша установка должна сделать все возможное, чтобы избежать фиксации паролей в любой форме в файле cloud-config. Мы можем скорректировать наши цели в соответствии с конкретными потребностями нашей среды развертывания.

Наша скорректированная стратегия будет выглядеть примерно так:

  • Не устанавливайте пароль и не предоставляйте ключи SSH для учетной записи root через cloud-config (любые ключи SSH, добавленные через интерфейс DigitalOcean, по-прежнему будут добавляться, как обычно)
  • Создать нового пользователя
  • Не устанавливать пароль для новой учетной записи пользователя
  • Настройте доступ SSH для нового аккаунта пользователя.
  • Предоставьте новому пользователю привилегии sudo без пароля для внесения административных изменений.
  • (Необязательно) Измените порт, который прослушивает демон SSH
  • (Необязательно) Ограничьте вход в SSH с правами суперпользователя (особенно если вы не включаете ключи SSH через интерфейс DigitalOcean)
  • (Необязательно) Явно разрешите нашему новому пользователю

Помимо удаления паролей для обеих учетных записей, наиболее радикальным изменением здесь является то, что новой учетной записи будет разрешено использовать sudo без ввода пароля учетной записи. Это необходимо, поскольку мы не разрешаем вход в систему root и не устанавливаем пароль учетной записи для нашего нового пользователя.

После того, как новый пользователь войдет в систему, он сможет безопасно установить пароль для себя и изменить привилегии sudo, чтобы при желании требовался пароль.

Имея в виду эти скорректированные цели, давайте начнем.

Использование файлов Cloud-Config

Файл cloud-config — это, по сути, файл YAML, который понимает определенные директивы. YAML — это формат сериализации данных, который должен быть удобочитаемым для человека, что упрощает его понимание и редактирование.

Файлы YAML основаны на нескольких правилах форматирования:

  • Отступ с пробелами указывает на структуру и взаимосвязь элементов друг с другом. Элементы с большим отступом являются подэлементами первого элемента с более низким уровнем отступа над ними.
  • Элементы списка можно идентифицировать по дефису в начале.
  • Записи ассоциативного массива создаются с помощью двоеточия (:), за которым следует пробел и значение.
  • Блоки текста имеют отступ. Чтобы указать, что блок следует читать как есть, с сохранением форматирования, используйте вертикальную черту (|) перед блоком.

Первая строка файла cloud-config должна содержать специальный идентификатор, чтобы программа cloud-init знала, что это файл cloud-config файл. Это выглядит так:

#cloud-config

Это должно быть размещено отдельно на самой первой строке. Файл cloud-config должен быть предоставлен при создании сервера. Это может быть достигнуто двумя различными способами.

Имейте в виду, что служба метаданных доступна только в регионах, где развернуто облако 1.5. Кроме того, версия cloud-init, необходимая для использования поля пользовательских данных, в настоящее время доступна только в Ubuntu 14.04 и CentOS 7, а также в образах приложений, основанных на этих выпусках.

Через интерфейс панели управления есть необязательный флажок для включения пользовательских данных. Когда вы выберете это, появится текстовое поле, куда вы можете вставить файл 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. Это будет список всех новых учетных записей, которые мы хотим создать. Поскольку мы создаем только одну учетную запись, у нас будет список из одной. Чтобы следовать руководству, на которое мы ссылались, мы назовем эту новую учетную запись demo.

Помните, что мы должны начинать наши файлы cloud-config с #cloud-config в первой строке. Пока что наш файл будет выглядеть так:

#cloud-config
users:
  - name: demo

Если бы мы хотели добавить дополнительных пользователей, мы могли бы сделать это, поместив элемент ниже и выровняв его по горизонтали, снова начав с тире, например так:

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

Каждая черточка указывает на отдельную учетную запись пользователя, под которой мы можем добавить данные пользователя (что мы сейчас и сделаем). Однако мы создаем только одного пользователя, поэтому второй строки в этом руководстве не будет.

Добавление авторизованных ключей

Чтобы войти в эту новую учетную запись без пароля, нам нужно будет предоставить один или несколько наших открытых ключей SSH. Они будут добавлены в файл authorized_keys нового пользователя в каталоге .ssh в его домашнем каталоге.

Это достигается с помощью директивы ssh-authorized-keys, которая является подэлементом записи users. В основном это означает, что мы выравниваем его с нашей директивой 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 user@example.com

Затем вы можете вставить полное содержимое как элемент под нашей записью 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 user@example.com

Если вы хотите добавить дополнительные ключи, это можно сделать, добавив еще один дефис, за которым следует второй открытый ключ:

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

Добавьте сюда любые ключи, которые вы хотите использовать для входа в эту учетную запись.

Настроить доступ к Sudo

Следующим шагом будет настройка доступа sudo к нашей новой учетной записи. Повторим еще раз: мы будем настраивать доступ к sudo без пароля, поскольку мы не будем устанавливать пароль для этой учетной записи из-за ограничений безопасности.

Чтобы настроить доступ, мы будем делать два отдельных шага.

Во-первых, мы создадим запись, которую хотим использовать для файла 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 user@example.com
    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 user@example.com
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    groups: sudo

Это облегчит переход на более традиционную настройку sudo. Мы покажем вам, как это сделать в конце этого руководства.

Установите среду оболочки

По умолчанию для вновь созданных пользователей установлена самая простая оболочка /bin/sh.

Это гораздо более урезанная среда, чем привыкло большинство людей, поэтому мы хотим вручную указать среду оболочки bash для нашего нового пользователя.

Это можно сделать с помощью директивы shell в элементе уровня users. Все, что нам нужно сделать, это указать полный путь к исполняемому файлу 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 user@example.com
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    groups: sudo
    shell: /bin/bash

Мы завершили настройку нового пользователя. Теперь мы можем перейти к дополнительным шагам, которые блокируют наш демон SSH.

Настройте и заблокируйте демон SSH (необязательно)

Следующие шаги могут быть полезны для повышения безопасности. Вы можете реализовать любой или все из них по своему усмотрению. Ознакомьтесь с руководством, которое мы автоматизируем, чтобы получить дополнительную информацию об этих параметрах. Мы покажем вам, как реализовать каждый из пунктов, используя два разных метода.

Все необходимые изменения будут в файле /etc/ssh/sshd_config. Повторим еще раз, изменения, которые мы заинтересованы внести:

  • (Необязательно) Измените порт, который прослушивает демон SSH
  • (Необязательно) Ограничьте вход в SSH с правами суперпользователя (особенно если вы не включаете ключи SSH через интерфейс DigitalOcean)
  • (Необязательно) Явно разрешите нашему новому пользователю

Эти настройки можно реализовать, внеся следующие изменения в файл sshd_config соответственно:

  • Порт 4444
  • PermitRootLogin нет
  • AllowUsers демонстрация

Существует два подхода к внесению этих изменений. Первый — полностью переписать файл, предоставив весь файл конфигурации в нашем файле cloud-config. Во-вторых, стратегически вносить изменения, используя обычные текстовые утилиты 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 user@example.com
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    groups: sudo
    shell: /bin/bash
write_files:
  - item_one
  - item_two

В нашем случае мы будем писать только один файл. Для каждого файла мы предоставляем подробную информацию об изменениях, которые мы хотим внести. Например, вы можете использовать следующие параметры: path, content, owner, разрешения и даже кодировка.

По умолчанию владельцем файлов, созданных с помощью этого метода, является root, а права доступа — 644, что нам и нужно. Поэтому нам нужно указать только директивы path и content.

путь — это просто место в файловой системе для записи файла.

Для 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 user@example.com
    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 новым содержимым, которое мы предоставили. Это файл sshd_config по умолчанию для Ubuntu, в котором изменены только элементы, упомянутые выше.

Это один из способов внесения изменений в демон SSH.

Настройка демона SSH с помощью целенаправленных изменений

Второй способ изменить файл sshd_config — это целенаправленное редактирование. Системы Linux поставляются с множеством мощных инструментов для работы с текстом, которые мы можем использовать для внесения только тех изменений, которые нам нужны.

Для запуска произвольных команд мы будем использовать директиву runcmd, которая позволяет нам запускать любую команду в системе. Каждая команда будет элементом списка директивы. Они могут быть заданы либо в виде строк, представляющих всю команду, либо в виде массива с командой и всеми параметрами в качестве элементов.

Мы будем использовать команду sed, предназначенную для подстановки строк. Хотя вы можете передать несколько операций одной команде sed, мы будем выполнять одну операцию для каждой команды sed. Это позволит нам легче устранять любые проблемы. Все наши команды sed будут редактировать файл sshd_config на месте.

Наша первая команда sed изменит строку, которая настраивает порт прослушивания. Мы идентифицируем это, выполнив поиск строки, начинающейся с \Порт. Мы укажем sed заменить всю строку (заданную регулярным выражением ^.*$ ) с нашей конфигурацией Порт 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 user@example.com
    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 user@example.com
    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 user@example.com
    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 user@example.com
    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 для поиска в этих файлах.

Если вы попали в ситуацию, когда вы не можете войти на созданный вами сервер из-за каких-то проблем с конфигурацией, лучше всего уничтожить сервер и начать заново. Для устранения неполадок иногда необходимо временно настроить тестовый сервер с паролем root в файле cloud-config, чтобы вы могли видеть, что происходит не так.

Это можно сделать, включив что-то вроде этого в ваш cloud-config:

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

Это позволит вам войти в систему с помощью консоли DigitalOcean, которая не использует SSH. Помните, что любой пароль, который вы разместите здесь, будет доступен для чтения каждому пользователю на вашем сервере в течение всего срока службы вашей системы, поэтому уничтожьте эту каплю после того, как выясните, в чем была проблема. Затем вы можете запустить другой сервер, используя исправленный файл cloud-config.

Настройка традиционного доступа к Sudo

Если вы хотите настроить более традиционный доступ с аутентификацией по паролю sudo после развертывания сервера, вы можете легко выполнить следующие шаги:

Во-первых, вам нужно установить пароль для новой учетной записи. Единственный способ сделать это без ввода текущего пароля (которого не существует) — через sudo. Вам нужно будет указать имя вашей новой учетной записи пользователя в конце команды, чтобы не устанавливать пароль root:

sudo passwd demo

Теперь, когда у вас есть пароль для вашей учетной записи, убедитесь, что вы действительно находитесь в группе sudo. Это можно сделать, набрав:

groups
demo sudo

Если вы еще не состоите в группе sudo, вы можете добавить себя, набрав:

sudo usermod -a -G sudo demo

Теперь отредактируйте файл 90-cloud-init-users с помощью команды visudo, передав файл в качестве аргумента:

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

Закомментируйте или удалите строку, связанную с вашим пользователем:

#demo ALL=(ALL) NOPASSWD:ALL

Сохраните и закройте файл. Теперь вашей учетной записи потребуется пароль для выполнения команд sudo.

Заключение

Использование файлов cloud-config для первоначальной настройки серверов может быть простым и сэкономить время в долгосрочной перспективе. Файлы легко настроить, а создание различных конфигураций может дать вам большую гибкость при быстрой настройке серверов.

Комбинируя cloud-config с более традиционной системой управления конфигурацией после подключения машины к сети, вы можете быстро и легко привести новые машины в нужное состояние.