Основы настройки и администрирования сервера с ОС Ubuntu 20.04 LTS

Основы настройки и администрирования сервера с ОС Ubuntu 20.04 LTS

OfShad0ws

Мы иногда публикуем инструкции по настройке различного серверного ПО, что, как нетрудно догадаться, требует настройки и администрирования сервера. Это нетривиальная задача. Неправильная настройка сервера может поставить под угрозу стабильность и безопасность. Поэтому мы решили обобщить основную информацию по этой теме в данной статье, чтобы в дальнейшем ссылаться на неё. Если ранее вы уже настраивали сервер по нашим статьям, например, для Tor и Yggdrasil или WireGuard, то мы рекомендуем проверить его состояние по данной статье.

Мы будем использовать ОС Ubuntu Server 20.04 LTS (Focal Fossa), как одну из наиболее популярных, стабильных и доступных, однако инструкции применимы почти без изменений к любой ОС на основе Debian GNU/Linux. Сервер мы будем арендовать на DigitalOcean (партнёрская ссылка). Вы можете выбрать любого другого поставщика, их возможности в основном идентичны.

Создание сервера и подключение к нему

Создание ключа SSH

При аренде сервера подключиться к нему обычно можно двумя способами: через веб-консоль или по SSH. Веб-консоль не слишком удобна, поэтому пользуйтесь ей только в крайних случаях, например, если из-за изменения настроек SSH не работает. Мы будем использовать стандартный клиент SSH, который установлен в большинстве систем GNU/Linux. Если вы пользуетесь другой ОС на настольном компьютере, то найдите подходящий вам клиент SSH самостоятельно. В SSH возможно использование пароля или ключа. Ключ гораздо безопаснее, поэтому мы сразу создадим его. Для этого введите следующую команду:

$ ssh-keygen

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

$ cat ~/.ssh/id_rsa.pub

Создание сервера

Теперь создадим сервер. В DigitalOcean для этого нужно нажать кнопку “Create”, затем “Droplets”. На появившейся странице настройте опции:

  • Choose an image”: “Distributions”, “Ubuntu”, “20.04 (LTS) x64
  • Choose a plan”: выбирайте в зависимости от ваших потребностей. Самый дешёвый сервер стоит $5 в месяц.
  • Choose a datacenter region”: разумным решением будет выбрать наиболее географически близкий к вам или к вашим клиентам центр обработки данных, но могут быть и другие критерии, например вам могут быть важны законы страны, в которой будет находиться сервер.
  • Select additional options”: по необходимости включите IPv6 и мониторинг.

В разделе “Authentication” выберите “SSH keys”. Если вы ещё не добавляли ваш ключ SSH, то нажмите кнопку “New SSH key” и добавьте ключ, который вы создали ранее, из файла ~/.ssh/id_rsa.pub. Имя хоста (пункт “Choose a hostname”) можно оставить предложенное. Если у сервера будет доменное имя, то имеет смысл указать его здесь.

Выбор ключа SSH при создании сервера.

Резервное копирование

Настройка и обновление системы в случае ошибок или прерывания связи с сервером могут привести к его неработоспособности. Мы рекомендуем перед каждой потенциально опасной операцией и перед большим обновлением системы создавать снимок сервера. Также можно включить автоматическое резервное копирование. В DigitalOcean это возможно при создании сервера или позже в его настройках. При создании выберите опцию “Enable backups”.

Включение резервного копирования при создании сервера.
Создание снимка сервера.

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

По умолчанию доступ предоставляется к пользователю root, однако это небезопасно. Вместо этого мы создадим отдельного пользователя (в примере – username), который сможет выполнять команды с правами суперпользователя благодаря команде sudo. Для этого его нужно будет добавить в группу sudo (в некоторых системах вместо этого используется группа wheel).

# adduser username
# usermod -a -G sudo username

Настроим для нового пользователя аутентификацию по ключу SSH. Для начала необходимо авторизоваться под его именем. Для включения аутентификации по ключу SSH необходимо скопировать содержимое локального файла ~/.ssh/id_rsa.pub на виртуальный сервер в файл ~/.ssh/authorized_keys. Этот файл и папку нужно создать с корректными правами доступа – только для текущего пользователя. Замените <YOUR SSH PUBLIC KEY> на строку с вашим ключом:

# su username
$ mkdir -m 700 ~/.ssh
$ echo '<YOUR SSH PUBLIC KEY>' >> ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys

Отключитесь от сервера (Ctrl + D для выхода из сессии пользователя и ещё раз для отключения) и проверьте возможность входа от имени пользователя без указания пароля (замените 46.101.128.1 на IP-адрес вашего сервера):

$ ssh username@46.101.128.1

Редактирование файлов

Для создания и редактирования конфигурационных файлов необходимо владеть навыками работы в консольном текстовом редакторе. Можно использовать Vim или Emacs, но они требуют изучения. Самым простым вариантом для новичков будет Nano, который устанавливается следующей командой:

$ sudo apt install nano

Nano с правами суперпользователя вызывается командой sudo nano. Можно дополнительно передать имя файла: sudo nano /foo/bar.txt. Далее можно разобраться по подсказкам в нижней части экрана. Они означают сочетания клавиши Ctrl с другими клавишами. Приведём часто используемые сочетания:

  • Ctrl + S – сохранить документ
  • Ctrl + X – выйти из редактора
  • Ctrl + W – найти текст
Текстовый редактор Nano.

Обновление системы

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

$ sudo apt update
$ sudo apt upgrade

При этом ядро Linux не обновляется, новая версия устанавливается рядом с текущей. Чтобы удалять неиспользуемые версии ядра Linux, вы можете воспользоваться командой sudo apt autoremove --purge. Эта команда также удалит те пакеты, которые были установлены автоматически и не требуются для работы ни одному из других пакетов в системе. При обновлении пакетов сервисы перезапускаются автоматически, а при обновлении ядра требуется перезагрузка системы:

$ sudo reboot

Безопасность SSH

Конфигурация

Конфигурация сервера SSH находится в файле /etc/ssh/sshd_config. Необходимо изменить некоторые строки. Здесь изменяемые опции представлены в алфавитном порядке. В файле конфигурации они могут быть в другом порядке, но все они там присутствуют, добавлять строки не нужно. Если строка закомментирована, то есть начинается с символа решётки (#), то этот символ необходимо удалить.

AllowAgentForwarding no
AllowTcpForwarding no
ChallengeResponseAuthentication no
PasswordAuthentication no
PermitRootLogin no
PermitUserEnvironment no
UseDNS no
X11Forwarding no

После изменения конфигурации перезапустите сервис:

$ sudo systemctl restart sshd

Смена порта SSH

По умолчанию SSH использует порт 22. Вредоносное ПО и злоумышленники будут подключаться к этому порту вашего сервера в попытках получить доступ. Сделаем эту задачу сложнее и сменим порт, на котором работает SSH. Для начала выберите любой порт с номером от 1025 до 49150. Постарайтесь выбрать порт, который не используется в сети, поскольку эти порты тоже будут уязвимы.

Некоторые поставщики виртуальных серверов могут по умолчанию включать сетевой экран в своей сети и закрывать доступ ко всем портам сервера, кроме 22-го. Перед выполнением дальнейших инструкций в этом разделе убедитесь, что такой сетевой экран выключен в интерфейсе поставщика или отсутствует, либо разрешите в его настройках дополнительный порт.

В файле /etc/ssh/sshd_config отредактируйте строку #Port 22, изменив значение и убрав символ комментария, например: Port 48428. Перезапустите сервис:

$ sudo systemctl restart sshd

С этого момента при подключении к серверу необходимо будет указывать порт:

$ ssh -p 48428 username@46.101.128.1

Сетевой экран

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

$ sudo apt install ufw
$ sudo ufw default allow outgoing
$ sudo ufw allow in 48428/tcp # замените на ваш порт SSH
$ sudo ufw default deny incoming
$ sudo ufw enable

Текущие правила можно посмотреть командой sudo ufw status verbose. По умолчанию UFW пишет информацию о соединениях в журнал. Эту опцию можно отключить командой sudo ufw logging off.

Fail2Ban

Fail2Ban – ПО для защиты от атак с подбором пароля. После нескольких неудачных попыток авторизации по SSH Fail2Ban заблокирует попытки подключения с подозрительного IP-адреса на некоторое время. Настройка не требуется, достаточно установить:

$ sudo apt install fail2ban

Fail2Ban не конфликтует с сетевым экраном UFW. Для выявления подозрительной активности он читает системные журналы. Его можно использовать для выявления атак не только на SSH, но на любой другой сервис.

Port knocking для входа по SSH

Ещё более надёжным решением можем быть port knocking. Это способ защиты от сканирования портов с целью поиска порта SSH. При использовании port knocking порт SSH по умолчанию закрыт с помощью сетевого экрана и открывается только на короткое время после получения правильной последовательности сетевых пакетов. Установим knockd на сервер и на локальное устройство:

$ sudo apt install knockd

Замените содержимое файла /etc/knockd.conf на сервере на следующие настройки, но вместо портов 2222, 3333, 4444 укажите другие номера, не следующие друг за другом в порядке возрастания или убывания, а вместо порта 48428 укажите порт, используемый для SSH.

[options]
    UseSyslog

[opencloseSSH]
    sequence      = 2222:udp,3333:udp,4444:udp
    seq_timeout   = 15
    tcpflags      = syn,ack
    start_command = ufw allow from %IP% to any port 48428
    cmd_timeout   = 5
    stop_command  = ufw delete allow from %IP% to any port 48428

Включите сервис и удалите правила, разрешающие подключения к порту SSH с любого IP-адреса:

$ sudo systemctl enable --now knockd
$ sudo ufw delete allow 48428/tcp

Отключитесь от сервера. Следующее подключение будет возможно после отправки правильной последовательности пакетов:

$ knock 46.101.128.1 2222:udp 3333:udp 4444:udp
$ ssh -p 48428 username@46.101.128.1

Некоторые полезные изменения

Ограничение размера журналов

При высокой активности сервера или при наличии ошибок системные журналы могут занимать много места на диске. Чтобы избежать ситуации, при которой свободное место закончится и сервер станет недоступен, можно ограничить максимальный размер журналов. Внесите изменения в файл /etc/systemd/journald.conf: удалите символ комментария в строке #SystemMaxUse= и установите значение, например: SystemMaxUse=50M.

Для немедленной очистки журналов (например, старше 1 дня) используйте следующие команды:

$ sudo journalctl --rotate
$ sudo journalctl --vacuum-time=1d

Удаление Snap

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

$ sudo apt purge snapd

Бесплатные сертификаты TLS от Let’s Encrypt

Если у вашего сервера будет доменное имя, то некоторые протоколы могут шифровать соединения с помощью TLS. В первую очередь это относится к протоколу HTTPS, но сертификат может использоваться и в других протоколах. Обычно использование сертфиката является платным, однако проект Let’s Encrypt предоставляет бесплатные сертификаты. Для автоматической настройки сертификата используется утилита Certbot:

$ sudo apt install certbot

Настройки утилиты находятся в файле /etc/letsencrypt/cli.ini. Используйте следующую конфигурацию, заменив доменное имя example.com и адрес электронной почты username@example.com на ваши:

agree-tos = true
cert-name = example.com
domains = example.com
email = username@example.com
max-log-backups = 0
no-eff-email = true
non-interactive = true
redirect = true
rsa-key-size = 4096
standalone = true

Откройте порт 80 в сетевом экране и запустите Certbot:

$ sudo ufw allow in 80/tcp
$ sudo certbot certonly

Для обновления сертификата используйте команду sudo certbot renew. Выполнять её можно автоматически с помощью задачи Cron. Если на порту 80 работает веб-сервер, например, Nginx, то при запуске этой команды его нужно останавливать. Это можно автоматизировать добавлением в конфигурационный файл следующих строк:

pre-hook = sudo systemctl stop nginx.service
post-hook = sudo systemctl start nginx.service

Читать файл приватного ключа сертификата может только пользователь root. Чтобы читать такие файлы, сервера приложений, такие как Nginx, запускаются изначально под этим пользователем, а потом сбрасывают привилегии. Однако некоторые приложения не умеют так делать. Чтобы дать другому пользователю (в примере sysusername) возможность читать этот файл, используйте Access Control Lists:

$ sudo apt install acl
$ sudo setfacl -m u:sysusername:r-X /etc/letsencrypt/live
$ sudo setfacl -m u:sysusername:r-X /etc/letsencrypt/live/example.com
$ sudo setfacl -m u:sysusername:r   /etc/letsencrypt/live/example.com/fullchain.pem
$ sudo setfacl -m u:sysusername:r   /etc/letsencrypt/live/example.com/privkey.pem
$ sudo setfacl -m u:sysusername:r-X /etc/letsencrypt/archive
$ sudo setfacl -m u:sysusername:r-X /etc/letsencrypt/archive/example.com
$ sudo setfacl -m u:sysusername:r   /etc/letsencrypt/archive/example.com/fullchain1.pem
$ sudo setfacl -m u:sysusername:r   /etc/letsencrypt/archive/example.com/privkey1.pem

При обновлении сертификата нужно повторить эту операцию для новых файлов в директории /etc/letsencrypt/archive, например fullchain2.pem и privkey1.pem.