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

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

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

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

Этот скрипт – альтернатива ручной настройке сервера, которая описана в этом мануале.

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

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

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

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

  • Создает обычного пользователя с привилегиями sudo, используя имя, указанное в переменной USERNAME.
  • Настраивает пароль для новой учетной записи:
    • Если сервер использует парольную аутентификацию, исходный пароль root перемещается из учетной записи root в новую учетную запись sudo. Затем пароль пользователя root блокируется.
    • Если сервер использует аутентификацию на основе ключей SSH, пользователю sudo присваивается пустой пароль.
  • Пароль пользователя sudo помечается как недействительный, поэтому его необходимо изменить при первом входе в систему.
  • Файл authorized_keys из учетной записи root копируется в учетную запись sudo, если для COPY_AUTHORIZED_KEYS_FROM_ROOT установлено значение true.
  • Любые ключи, определенные в OTHER_PUBLIC_KEYS_TO_ADD, добавляются в файл authorized_keys пользователя sudo.
  • Парольная аутентификация для пользователя root отключается.
  • Включается брандмауэр UFW с поддержкой соединений 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_servers_setup.sh -o /tmp/initial_setup.sh

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

nano /tmp/initial_setup.sh

Затем запустите скрипт:

bash /tmp/initial_setup.sh

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

Содержание сценария

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

Сценарий выглядит так:

#!/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

Заключение

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

Tags: ,