Как использовать 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, нашему сценарию необходимо будет выполнить ряд задач.

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

  • Изменить пароль пользователя root

  • Создать нового пользователя

  • Создайте пароль нового пользователя

  • Дайте новому пользователю привилегии root

  • (Необязательно) Измените порт, который слушает демон SSH

  • (Необязательно) Ограничить вход в систему по SSH

  • (Необязательно) явно разрешить наш новый пользователь

Изменение целей для решения проблем окружающей среды

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

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

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

  • Вы можете установить пароль для существующих пользователей, но вы должны передать его в виде простого текста.

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

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

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

  • Не устанавливайте пароль и не предоставляйте SSH-ключи для учетной записи root черезcloud-config (любые SSH-ключи, добавленные, хотя интерфейс DigitalOcean все равно будет добавлен как обычно)

  • Создать нового пользователя

  • Не устанавливать пароль для новой учетной записи пользователя

  • Настройте доступ SSH для новой учетной записи пользователя

  • Дайте новому пользователю привилегии sudo без пароля для административных изменений.

  • (Необязательно) Измените порт, который слушает демон SSH

  • (Необязательно) Ограничьте вход в систему root 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:

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

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

#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 [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 для нашего нового пользователя.

Это может быть выполнено с помощью директивы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 [email protected]
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    groups: sudo
    shell: /bin/bash

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

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

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

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

  • (Необязательно) Измените порт, который слушает демон SSH

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

  • (Необязательно) явно разрешить наш новый пользователь

Эти настройки могут быть реализованы путем внесения этих изменений в файлsshd_config соответственно:

  • Порт4444

  • PermitRootLoginno

  • AllowUsersdemo

Есть два подхода к внесению этих изменений. Первый - полностью переписать файл, поместив весь файл конфигурации в наш файл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 [email protected]
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    groups: sudo
    shell: /bin/bash
write_files:
  - item_one
  - item_two

В нашем случае мы будем писать только один файл. Для каждого файла мы предоставляем подробную информацию об изменениях, которые мы хотим внести. Например, вы можете использовать следующие параметры: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 новым содержимым, которое мы предоставили. Это файлsshd_config по умолчанию для Ubuntu с измененными только элементами, упомянутыми выше.

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

Конфигурирование демона SSH с помощью целенаправленных изменений

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

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

Мы будем использовать командуsed, которая предназначена для подстановки строк. Хотя вы можете передать несколько операций одной командеsed, мы будем выполнять одну операцию для каждой командыsed. Это позволит нам легче устранять любые проблемы. Все наши команды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 для поиска в этих файлах.

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

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

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

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

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

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

Во-первых, вам нужно установить пароль для новой учетной записи. Единственный способ сделать этоwithout, который должен ввести текущий пароль (которого не существует), - это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 с более традиционной системой управления конфигурацией после того, как машина была переведена в оперативный режим, вы можете быстро и легко привести новые машины в желаемое состояние.

Related