DevOps
January 19

Первоначальная настройка сервера Ubuntu

Начальные данные

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

Обычно на входе у вас следующие данные (IP-адрес сервера, логин пользователя и его пароль):

IP-адрес сервера: 1.2.3.4
Пользователь: root
Пароль: some-password

Пользователь root обычно является административным пользователем. Самый главный со всеми правами доступа и привилегиями. Это значит, что любые процессы, запущенные под этим пользователем, будут иметь любые права на сервере. Что является не безопасным вариантом для запуска любых своих процессов. В случае взлома или ещё какой уязвимости, хакеры смогут сделать всё, что угодно.

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

На облачных платформах вроде Amazon, Google Cloud, Yandex Cloud такие пользователи создаются автоматически. Мы же рассмотрим обычный случай.

Подключение к серверу

Подключаемся к серверу через терминал

ssh root@ip_address

В нашем случае будет всё выглядеть вот так:

ssh [email protected]

При первом подключении он спросит, доверяем ли мы серверу

Мы говорим — да, доверяем, и вводим пароль, который запросит сервер.

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

apt update -y && apt upgrade -y && apt autoremove -y

Разберём команды:

  • apt update -y — обновляет списки репозиториев Ubuntu, откуда устанавливаются все программы
  • apt upgrade -y — обновляет все существующие пакеты и программы до последних версий
  • apt autoremove -y — удаляет все ненужные пакеты и программы, которые раньше устанавливались вспомогательными и теперь никакой пользы не несут

Теперь установим парочку программ, которые точно нужны будут:

apt install -y curl vim wget git htop ufw

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

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

Как только вошли на сервер, теперь можем добавить нового пользователя.

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

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

nsldhf98234hjkzh!@1`2lkjsfhnsdjkncvlskjhf

Как только придумали пароль, создаём пользователя:

adduser ubuntu

Вот так у вас будет это выглядеть в терминале

Теперь у нас есть пользователь с обычными правами. Но иногда нам необходимо будет выполнять административные команды (например, установка программ). Чтобы не приходилось подключаться и отключаться от разных пользователей, мы просто наделим нашего пользователя правами администратора тоже. Это нормальная практика и в любой момент можно будет нашего пользователя отключить и удалить при необходимости. Так мы обезопасим самого главного пользователя root.

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

usermod -aG sudo ubuntu

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

Проверим это. Переключимся внутри сервера на нашего пользователя:

su - ubuntu

И выполним команду:

sudo apt update -y

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

Всё, теперь переключаемся обратно на нашего пользователя root. Для этого достаточно в нашем случае выйти из текущего:

exit

И второй вариант на будущее (если вы подключаетесь изначально под другим пользователем):

sudo bash

Настройка базового фаерволла (Firewall)

На серверах Ubuntu можно использовать удобную утилиту UFW (Uncomplicated Firewall), с помощью которой можно настраивать и ограничивать доступ к определённым сервисам внутри вашего сервера извне.

Например, представьте, что вы установили базу данных PostgreSQL на ваш сервер. По умолчанию база данных запущена на http://localhost:5432. Если не настраивать фаерволл, то снаружи этот порт аналогично открыт для подключения и доступен по адресу http://<ip_address>:5432. Это даёт хакерам возможность атаковать ваш сервер и запускать скрипты подбора логинов и паролей.

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

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

Чтобы посмотреть такие предустановленные профили, выполним команду:

ufw app list
Output

Available applications:
  OpenSSH

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

Поэтому выполняем:

ufw allow OpenSSH
Output

Rules updated
Rules updated (v6)

И активируем наш фаерволл:

ufw enable

Соглашаемся, когда нас спрашивают:

Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

Теперь можно посмотреть статус и активные разрешенные правила:

ufw status
Output

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

Примечание. По умолчанию ssh подключение идёт на порту 22. И аналогичные действия можно было сделать следующим образом:

ufw allow 22

Настройка подключения к пользователю ubuntu по ssh

Теперь для начала давайте проверим подключение к нашему пользователю по паролю. Для этого сначала выходим из под пользователя root, если вы ещё там.

exit

Теперь в нашем терминале подключаемся к пользователю ubuntu:

ssh ubuntu@<ip_address>

У вас должно сначала спросить пароль пользователя и подключиться.

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

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

Сперва откроем терминал в новом окне. К серверу подключаться не нужно! Это должна быть ваша локальная среда. И вводим команду:

ssh-keygen

В ответ будет спрошено куда сохранять файл и с каким именем.

Generating public/private rsa key pair.
Enter file in which to save the key (/Users/s_smelkov/.ssh/id_rsa):

Я рекомендую под каждый сервер создавать ключи отдельно и давать им соответствующие имена. Если ничего не менять, то ключи сгенерируются с именем id_rsa. Это как стандартное имя.

Допустим вы настраиваете сервер под ваш проект с доменом example.com. Я бы такое имя и задал бы для ключа. И вставил бы следующий путь и название файла

/Users/s_smelkov/.ssh/example_com

или

/Users/s_smelkov/.ssh/example

После вас попросит задать passphrase (или пароль по нашему) для вашего ключа. Вы можете оставить его пустым или написать туда что-нибудь.

Enter passphrase (empty for no passphrase):
Enter same passphrase again:

В результате генерации всё выглядит следующим образом:

Generating public/private rsa key pair.
Enter file in which to save the key (/Users/s_smelkov/.ssh/id_rsa): /Users/s_smelkov/.ssh/example_com
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/s_smelkov/.ssh/example_com
Your public key has been saved in /Users/s_smelkov/.ssh/example_com.pub
The key fingerprint is:
SHA256:+jGE5RVq3sI...A+AAv8R1G5vQ [email protected]
The key's randomart image is:
+---[RSA 3072]----+
|o  .*     .      |
|.= * o   . .     |
|+ + o E + o .    |
| + .   B = o . o |
|  . . . S O   + o|
|     . o O + . o |
|      + o = = .  |
|     . o = = o   |
|        o o ...  |
+----[SHA256]-----+

⚠️ /Users/s_smelkov — это моя домашняя папка на моём компьютере. У вас она будет по-другому называться. В зависимости от ОС пути будут разными.

После генерации будет создано 2 ключа:

  • ~/.ssh/example_com — секретный ключ, который лежит только на вашем компьютере и который никогда нельзя никому показывать.
  • ~/.ssh/example_com.pub — публичный ключ, который мы положим на сервер, чтобы могли подключаться. Публичный ключ не страшно потерять, его можно сгенерировать снова из секретного.

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

cat ~/.ssh/example_com.pub
Output:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCz5mNbuCiZiqg91Y2XDn3p4d4rD64Hz
YjdkieghlUDeEtjExBvG4onROrUQJ9mGQYOTo4e9Q6w36dt9BkrkidBX185YACXv8su
...
+79Efn6hHDdGGO5pymgilWKDuBZiNRPBNZsmJywBFyaqFGq7wu8CY/DKtqEVPbafrFq
hlKARUkIa8=s_smelkov

Это значение нам потребуется чуть позже.

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

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

mkdir -p ~/.ssh && touch ~/.ssh/authorized_keys && chmod -R go= ~/.ssh

Здесь мы для пользователя ubuntu создали его папку ssh, создали файл authorized_keys, куда будем складывать все ключ, и дали права определённые для папки, чтобы всё работало как надо.

Теперь лишь остаётся добавить публичный ключ с нашего компьютера ~/.ssh/example_com.pub в файл ~/.ssh/authorized_keys на сервере.

Для этого просто открываем файл и вставляем туда значение:

vim ~/.ssh/authorized_keys

И внутри:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCz5mNbuCiZiqg91Y2XDn3p4d4rD64Hz
YjdkieghlUDeEtjExBvG4onROrUQJ9mGQYOTo4e9Q6w36dt9BkrkidBX185YACXv8su
...
+79Efn6hHDdGGO5pymgilWKDuBZiNRPBNZsmJywBFyaqFGq7wu8CY/DKtqEVPbafrFq
hlKARUkIa8=s_smelkov

После этого можно подключаться к серверу по нашему секретному ключу без ввода пароля. Для удобства на своём компьютере в терминале создадим или отредактируем существующий файл ~/.ssh/config:

vim ~/.ssh/config

И нужно будет добавить блок:

Host <some_ssh_name>
    Hostname <server_ip_address>
    IdentityFile /path/to/secret/key
    User ubuntu
  • <some_ssh_name> — короткое имя ssh-подключения. Должно быть уникальным в этом файле. Назвать можно как хотите
  • <server_ip_address> — IP-адрес сервера
  • User ubuntu — имя пользователя в системе. Если создавали другого, поменяйте ubuntu на своё.

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

Host example_prod
    Hostname 1.2.3.4
    IdentityFile ~/.ssh/example_com
    User ubuntu

И теперь в терминале на компьютере можете выполнить подключение по ssh, используя наш блок выше:

ssh example_prod

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

⚠️ Данный шаг следует делать, только если предыдущий шаг выполнен успешно!

После подключения к серверу, открываем файл настроек ssh для сервера:

sudo vim /etc/ssh/sshd_config

Находим строку с текстом PasswordAuthentication, и выставляем параметр:

. . .
PasswordAuthentication no
. . .

Сохраняем и закрываем файл. И перезапускаем sshd сервис:

sudo systemctl restart ssh

⚠️ Прежде чем закрывать окно подключения к серверу или отключаться от него. Сначала откройте новый терминал и проверьте, что подключение по ssh-ключу работает. Иначе процесс восстановления доступа к серверу Вам приятным не покажется :)

Настройка sudo без пароля

⚠️ Данный шаг является необязательным. И необходимо несколько раз подумать, точно ли стоит отключать пароль для вашего пользователя при использовании sudo.

Но если вы всё же решили сделать это, то делается всё следующим образом.

Для этого необходимо отредактировать /etc/sudoers файл с помощью редактора:

sudo visudo

В конце файла добавляем следующую строку:

ubuntu ALL=(ALL) NOPASSWD:ALL

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

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

ubuntu ALL=(ALL) NOPASSWD:/usr/bin/systemctl /usr/sbin/reboot

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


Используемые ссылки: