Автоматизация начальной настройки сервера с Ubuntu 18.04

Вступление

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

Хотяyou can complete these steps manually, иногда проще написать сценарий для экономии времени и устранения человеческой ошибки. В этом руководстве объясняется, как использоватьa script to automate the steps in the initial server setup guide.

Что делает сценарий?

Этот сценарий является альтернативой ручному запуску процедуры, описанной вUbuntu 18.04 initial server setup guide и руководстве поsetting up SSH keys on Ubuntu 18.04.

Следующие переменные влияют на работу скрипта:

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

  • COPY_AUTHORIZED_KEYS_FROM_ROOT: следует ли копировать ключевые активы SSH из учетной записиroot в новую учетную записьsudo.

  • OTHER_PUBLIC_KEYS_TO_ADD: массив строк, представляющих другие открытые ключи для добавления в учетную запись с включенной функциейsudo. При желании это можно использовать в дополнение или вместо копирования ключей из учетной записиroot.

Вы должны обновить эти переменные по мере необходимости перед запуском скрипта.

При запуске скрипта выполняются следующие действия:

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

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

    • Если сервер был настроен для аутентификации по паролю, исходный сгенерированный пароль администратора перемещается из учетной записиroot в новую учетную записьsudo. После этого пароль для учетной записиroot блокируется.

    • Если сервер был настроен для аутентификации по ключу SSH, для учетной записиsudo устанавливается пустой пароль.

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

  • Файлauthorized_keys из учетной записиroot копируется пользователюsudo, если дляCOPY_AUTHORIZED_KEYS_FROM_ROOT задано значениеtrue.

  • Любые ключи, определенные вOTHER_PUBLIC_KEYS_TO_ADD, добавляются в файлauthorized_keys пользователяsudo.

  • Аутентификация SSH на основе пароля отключена для пользователяroot.

  • Брандмауэр UFW включен с разрешенными SSH-соединениями.

Как использовать скрипт

Сценарий можно запустить двумя способами: добавив его вthe server’s user data field during creation или войдя в систему какroot и запустив его после подготовки.

Использование пользовательских данных

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

Если вы создаете каплю изControl Panel, вы можете установить флажокUser data в разделеSelect additional options. Появится текстовое поле, куда вы можете вставить скрипт:

DigitalOcean control panel user data field

Если выcreating a Droplet using the DigitalOcean API, вы можете передать скрипт, используя вместо этого атрибутuser_data.

Если выcreating a Droplet with the doctl command line tool, вы можете передать скрипт с помощью параметра--user-data-file:

doctl compute droplet create ... --user-data-file /path/to/script

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

При первом входе в систему вам будет предложено сменить пароль. Сервер завершит текущий сеанс SSH, как только вы предоставите и подтвердите свои новые учетные данные. После этого вы можете снова войти в систему как обычно.

Запуск скрипта после инициализации

Если вы не хотите использовать пользовательские данные, вы также можете запустить скрипт вручную по SSH после загрузки сервера.

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

ssh root@servers_public_IP "bash -s" -- < /path/to/script/file

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

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

ssh root@servers_public_IP

Затем загрузите необработанный скрипт на сервер:

curl -L https://raw.githubusercontent.com/do-community/automated-setups/master/Ubuntu-18.04/initial_server_setup.sh -o /tmp/initial_setup.sh

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

nano /tmp/initial_setup.sh

Когда все будет удовлетворено, запустите сценарий вручную, используяbash:

bash /tmp/initial_setup.sh

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

Содержание скрипта

Вы можете найти сценарий начальной настройки сервера вautomated-setups repository в организации DigitalOcean Community GitHub. Чтобы скопировать или загрузить содержимое сценария напрямую, нажмите кнопкуRaw в верхней части сценария илиclick here to view the raw contents directly.

Полное содержание также включено сюда для удобства:

#!/bin/bash
set -euo pipefail

########################
### SCRIPT VARIABLES ###
########################

# Name of the user to create and grant sudo privileges
USERNAME=sammy

# Whether to copy over the root user's `authorized_keys` file to the new sudo
# user.
COPY_AUTHORIZED_KEYS_FROM_ROOT=true

# Additional public keys to add to the new sudo user
# OTHER_PUBLIC_KEYS_TO_ADD=(
#     "ssh-rsa AAAAB..."
#     "ssh-rsa AAAAB..."
# )
OTHER_PUBLIC_KEYS_TO_ADD=(
)

####################
### SCRIPT LOGIC ###
####################

# Add sudo user and grant privileges
useradd --create-home --shell "/bin/bash" --groups sudo "${USERNAME}"

# Check whether the root account has a real password set
encrypted_root_pw="$(grep root /etc/shadow | cut --delimiter=: --fields=2)"

if [ "${encrypted_root_pw}" != "*" ]; then
    # Transfer auto-generated root password to user if present
    # and lock the root account to password-based access
    echo "${USERNAME}:${encrypted_root_pw}" | chpasswd --encrypted
    passwd --lock root
else
    # Delete invalid password for user if using keys so that a new password
    # can be set without providing a previous value
    passwd --delete "${USERNAME}"
fi

# Expire the sudo user's password immediately to force a change
chage --lastday 0 "${USERNAME}"

# Create SSH directory for sudo user
home_directory="$(eval echo ~${USERNAME})"
mkdir --parents "${home_directory}/.ssh"

# Copy `authorized_keys` file from root if requested
if [ "${COPY_AUTHORIZED_KEYS_FROM_ROOT}" = true ]; then
    cp /root/.ssh/authorized_keys "${home_directory}/.ssh"
fi

# Add additional provided public keys
for pub_key in "${OTHER_PUBLIC_KEYS_TO_ADD[@]}"; do
    echo "${pub_key}" >> "${home_directory}/.ssh/authorized_keys"
done

# Adjust SSH configuration ownership and permissions
chmod 0700 "${home_directory}/.ssh"
chmod 0600 "${home_directory}/.ssh/authorized_keys"
chown --recursive "${USERNAME}":"${USERNAME}" "${home_directory}/.ssh"

# Disable root SSH login with password
sed --in-place 's/^PermitRootLogin.*/PermitRootLogin prohibit-password/g' /etc/ssh/sshd_config
if sshd -t -q; then
    systemctl restart sshd
fi

# Add exception for SSH and then enable UFW firewall
ufw allow OpenSSH
ufw --force enable

Заключение

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

Related