Практическая работа: безопасная публикация сайта на Ubuntu Server

За одну пару студент подключается к своему учебному серверу, настраивает SSH-доступ только по ключу, публикует сайт через Nginx, закрывает лишние порты через UFW и получает HTTPS-сертификат через Certbot.

Цель практической работы

Настроить минимально безопасный веб-сервер для статического одностраничного сайта на учебном Ubuntu Server.

Время

1 час 20 минут

Работа рассчитана на одну пару. Действия выполняются последовательно.

Сервер

Ubuntu Server

Каждый студент работает в своей отдельной учебной системе.

Результат

HTTPS-сайт

Сайт открывается по домену sXX.lab.probochka-corp.ru, а SSH принимает вход только по ключу.

После выполнения студент должен уметь:

Перед началом: локальный компьютер и удалённый сервер

Локальный компьютер

Компьютер в аудитории

Это компьютер, за которым вы сидите физически. На нём открыт Windows 10, Windows Terminal, PowerShell или обычный терминал.

На локальном компьютере создаётся SSH-ключ. Приватный ключ остаётся только на локальном компьютере.

Удалённый сервер

Учебный Ubuntu Server

Это система, к которой вы подключаетесь по сети командой ssh. Все команды с sudo apt, nginx, ufw, certbot выполняются именно на удалённом сервере.

Если в задании написано «на локальном компьютере», команду нужно выполнять в терминале Windows 10. Если написано «на удалённом сервере», сначала подключитесь по SSH, а затем выполняйте команду внутри серверной консоли.

Условия выполнения

Параметр Требование
IP учебного сервера 31.163.204.186
Пользователь на сервере student
Номер студента XX. Например: 01, 02, 06, 18. Номер выдаёт преподаватель.
SSH-порт 22XX. Например: студент 06 подключается к порту 2206.
Домен сайта sXX.lab.probochka-corp.ru. Например: студент 06 использует s06.lab.probochka-corp.ru.
Директория сайта /var/www/site
Владелец директории пользователь root
Группа директории deploy
Права на директории для владельца и группы одинаковые полные права: rwx; для остальных чтение и вход
Права на файлы для владельца и группы чтение/запись, для остальных чтение
SSH подключение только по SSH-ключу, парольный вход отключён
Firewall открыты только 22/tcp, 80/tcp, 443/tcp
HTTPS сертификат получен через certbot
В командах заменяйте XX на свой номер. Если ваш номер 06, то домен будет s06.lab.probochka-corp.ru, а SSH-порт — 2206.
Не отключайте парольный вход по SSH, пока не проверили, что подключение по ключу работает. Иначе можно потерять доступ к своему серверу.

Рекомендуемый план времени

  1. 0–10 минут: получить свой номер, подключиться к удалённому серверу, установить программы.
  2. 10–30 минут: создать SSH-ключ на локальном компьютере, вручную добавить публичный ключ на сервер, проверить вход по ключу.
  3. 30–40 минут: отключить парольный вход по SSH и проверить службу.
  4. 40–55 минут: создать директорию сайта, группу deploy, настроить владельца и права.
  5. 55–65 минут: настроить Nginx и проверить сайт по HTTP.
  6. 65–72 минуты: настроить UFW.
  7. 72–80 минут: получить SSL-сертификат и выполнить итоговую проверку.

Задание 1. Подключение к серверу и установка программ

1.1. Узнайте свой номер у преподавателя.

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

Пример для студента с номером 06:

Домен: s06.lab.probochka-corp.ru
SSH-порт: 2206
1.2. Подключитесь к удалённому серверу с локального компьютера.

Эта команда выполняется в терминале Windows 10 на локальном компьютере.

ssh student@31.163.204.186 -p 22XX

Пример для студента с номером 06:

ssh student@31.163.204.186 -p 2206
1.3. На удалённом сервере обновите список пакетов.
sudo apt update
1.4. На удалённом сервере установите Nginx, UFW, Certbot и дополнительные утилиты.
sudo apt install nginx ufw certbot python3-certbot-nginx curl dnsutils openssh-client -y
1.5. На удалённом сервере проверьте, что Nginx установлен и запущен.
sudo systemctl status nginx

В статусе должно быть active (running). Для выхода из просмотра статуса нажмите Q.

Задание 2. Настройка подключения только по SSH-ключу

В этом разделе команды выполняются в двух местах. Ключ создаётся на локальном компьютере Windows 10. Файл authorized_keys редактируется на удалённом сервере Ubuntu.
2.1. На локальном компьютере создайте SSH-ключ.

Откройте терминал Windows 10 или PowerShell. Выполните команду:

ssh-keygen -t ed25519 -C "studentXX@college-lab"

Когда программа спросит путь для сохранения ключа, можно нажать Enter и оставить путь по умолчанию.

В результате обычно создаются два файла:

C:\Users\LOGIN\.ssh\id_ed25519
C:\Users\LOGIN\.ssh\id_ed25519.pub

id_ed25519 — приватный ключ. Его нельзя никому отправлять. id_ed25519.pub — публичный ключ. Его нужно добавить на удалённый сервер.

2.2. На локальном компьютере прочитайте содержимое публичного ключа.

В PowerShell выполните:

type $env:USERPROFILE\.ssh\id_ed25519.pub

Если используется обычный cmd, команда будет такой:

type %USERPROFILE%\.ssh\id_ed25519.pub

Скопируйте всю строку целиком. Она начинается с ssh-ed25519 и заканчивается комментарием, например studentXX@college-lab.

2.3. На удалённом сервере подготовьте директорию для SSH-ключей.

Подключитесь к серверу по паролю, если ещё не подключены:

ssh student@31.163.204.186 -p 22XX

Затем на удалённом сервере выполните:

mkdir -p ~/.ssh
chmod 700 ~/.ssh
nano ~/.ssh/authorized_keys
2.4. На удалённом сервере вставьте публичный ключ в authorized_keys.

В открытый файл ~/.ssh/authorized_keys вставьте строку публичного ключа, которую скопировали с локального компьютера.

После вставки сохраните файл:

  • Ctrl + O — сохранить;
  • Enter — подтвердить имя файла;
  • Ctrl + X — выйти из редактора.

Затем настройте права:

chmod 600 ~/.ssh/authorized_keys
chown -R $USER:$USER ~/.ssh
2.5. С локального компьютера проверьте вход по SSH-ключу.

Откройте новый терминал Windows 10. Старую SSH-сессию пока не закрывайте.

В PowerShell можно использовать команду:

ssh -i $env:USERPROFILE\.ssh\id_ed25519 student@31.163.204.186 -p 22XX

Также можно указать путь явно:

ssh -i C:\Users\LOGIN\.ssh\id_ed25519 student@31.163.204.186 -p 22XX

Пример для студента с номером 06:

ssh -i C:\Users\LOGIN\.ssh\id_ed25519 student@31.163.204.186 -p 2206

Если подключение открылось без ввода пароля от пользователя student, вход по ключу работает.

2.6. На удалённом сервере отключите парольный вход по SSH.

Выполняйте этот шаг только после успешной проверки входа по ключу.

sudo nano /etc/ssh/sshd_config

Найдите или добавьте строки:

PubkeyAuthentication yes
PasswordAuthentication no
PermitRootLogin no
2.7. На удалённом сервере проверьте конфигурацию SSH и перезапустите службу.
sudo sshd -t
sudo systemctl restart ssh

Если команда sudo sshd -t ничего не вывела, значит синтаксис конфигурации корректный.

2.8. С локального компьютера ещё раз проверьте подключение по ключу.

Откройте новый терминал Windows 10 и выполните:

ssh -i C:\Users\LOGIN\.ssh\id_ed25519 student@31.163.204.186 -p 22XX

Если вход успешный, настройка SSH выполнена правильно.

Не закрывайте рабочую SSH-сессию, пока не убедились, что новая сессия по ключу успешно открывается.

Задание 3. Создание директории сайта и настройка прав

3.1. На удалённом сервере создайте группу deploy.
sudo groupadd deploy

Если группа уже существует, это не критическая ошибка. Проверьте её наличие:

getent group deploy
3.2. На удалённом сервере добавьте своего пользователя в группу deploy.
sudo usermod -aG deploy $USER

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

exit

Затем на локальном компьютере снова подключитесь к удалённому серверу:

ssh -i C:\Users\LOGIN\.ssh\id_ed25519 student@31.163.204.186 -p 22XX

После повторного входа проверьте группы:

groups $USER

В списке должна быть группа deploy.

3.3. На удалённом сервере создайте директорию сайта.
sudo mkdir -p /var/www/site
3.4. Назначьте владельца root и группу deploy.
sudo chown -R root:deploy /var/www/site
3.5. Настройте права на директории и файлы.
sudo find /var/www/site -type d -exec chmod 775 {} \;
sudo find /var/www/site -type f -exec chmod 664 {} \;

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

sudo chmod g+s /var/www/site
3.6. Создайте одностраничный сайт.

В тексте страницы замените XX на свой номер.

sudo tee /var/www/site/index.html > /dev/null <<'HTML'
<!DOCTYPE html>
<html lang="ru">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Сайт студента XX</title>
  <style>
    body {
      margin: 0;
      font-family: Arial, sans-serif;
      background: #f5f7fb;
      color: #182033;
    }
    main {
      max-width: 760px;
      margin: 80px auto;
      background: white;
      padding: 40px;
      border-radius: 18px;
      box-shadow: 0 10px 30px rgba(20, 35, 70, 0.08);
    }
    h1 { color: #2f6fed; }
  </style>
</head>
<body>
  <main>
    <h1>Сайт работает</h1>
    <p>Это сайт студента XX, опубликованный через Nginx на Ubuntu Server.</p>
  </main>
</body>
</html>
HTML

После создания файла снова примените владельца и права:

sudo chown root:deploy /var/www/site/index.html
sudo chmod 664 /var/www/site/index.html
3.7. Проверьте владельца, группу и права.
ls -ld /var/www/site
ls -l /var/www/site

Ожидаемый смысл результата: владелец root, группа deploy, у группы есть права на изменение файлов сайта.

Задание 4. Настройка Nginx для раздачи сайта

4.1. На удалённом сервере создайте конфигурацию сайта.
sudo nano /etc/nginx/sites-available/site

Вставьте конфигурацию. Замените XX на свой номер:

server {
    listen 80;
    server_name sXX.lab.probochka-corp.ru;

    root /var/www/site;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ /\. {
        deny all;
    }
}

Пример для студента с номером 06:

server_name s06.lab.probochka-corp.ru;
4.2. Включите сайт в Nginx.
sudo ln -sf /etc/nginx/sites-available/site /etc/nginx/sites-enabled/site

Если включён стандартный сайт Nginx, отключите его:

sudo rm -f /etc/nginx/sites-enabled/default
4.3. Проверьте конфигурацию и перечитайте Nginx.
sudo nginx -t
sudo systemctl reload nginx

В результате проверки должно быть syntax is ok и test is successful.

4.4. Проверьте сайт по HTTP.
curl -I http://sXX.lab.probochka-corp.ru
curl http://sXX.lab.probochka-corp.ru

Пример для студента с номером 06:

curl -I http://s06.lab.probochka-corp.ru

Задание 5. Настройка UFW

UFW настраивается внутри вашего удалённого сервера. Несмотря на то что вы подключаетесь снаружи к порту 22XX, внутри учебной системы SSH-служба работает на обычном порту 22/tcp.
5.1. На удалённом сервере посмотрите текущие правила.
sudo ufw status numbered

Если firewall ещё не включён, это нормально.

5.2. Настройте политику по умолчанию.
sudo ufw default deny incoming
sudo ufw default allow outgoing
5.3. Разрешите только нужные порты.
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
5.4. Включите firewall и проверьте результат.
sudo ufw enable
sudo ufw status verbose

В результате должны быть открыты только 22/tcp, 80/tcp, 443/tcp.

Если после включения UFW SSH-соединение не разорвалось, это хороший признак. Но всё равно откройте новый терминал и проверьте подключение по ключу ещё раз.

Задание 6. Настройка SSL-сертификата через Certbot

6.1. Проверьте, что ваш домен указывает на учебный сервер.
dig sXX.lab.probochka-corp.ru
curl -I http://sXX.lab.probochka-corp.ru

Пример для студента с номером 06:

dig s06.lab.probochka-corp.ru
curl -I http://s06.lab.probochka-corp.ru
6.2. Получите сертификат для своего домена.

Замените XX на свой номер:

sudo certbot --nginx -d sXX.lab.probochka-corp.ru

Пример для студента с номером 06:

sudo certbot --nginx -d s06.lab.probochka-corp.ru
6.3. Проверьте HTTPS.
curl -I https://sXX.lab.probochka-corp.ru

Ожидаемый результат: сайт отвечает по HTTPS, а браузер открывает страницу без ошибки сертификата.

6.4. Проверьте автоматическое продление сертификата.
sudo certbot renew --dry-run
Если Certbot выдал ошибку, не запускайте команду много раз подряд. Сначала проверьте sudo nginx -t, curl -I http://sXX.lab.probochka-corp.ru и правильность своего номера в домене.

Итоговая проверка

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

Что проверяется Команда Ожидаемый результат
SSH-конфигурация sudo sshd -t команда не выводит ошибок
Парольный вход отключён sudo grep -E "^(PasswordAuthentication|PubkeyAuthentication|PermitRootLogin)" /etc/ssh/sshd_config PasswordAuthentication no, PubkeyAuthentication yes, PermitRootLogin no
Подключение по ключу ssh -i C:\Users\LOGIN\.ssh\id_ed25519 student@31.163.204.186 -p 22XX вход выполняется по ключу
Пользователь в группе deploy groups $USER в списке есть deploy
Права директории сайта ls -ld /var/www/site владелец root, группа deploy, права похожи на drwxrwsr-x
Файл сайта ls -l /var/www/site/index.html владелец root, группа deploy, права -rw-rw-r--
Nginx sudo nginx -t syntax is ok, test is successful
Домен в Nginx grep server_name /etc/nginx/sites-available/site указан домен sXX.lab.probochka-corp.ru
Firewall sudo ufw status verbose открыты 22/tcp, 80/tcp, 443/tcp
HTTP curl -I http://sXX.lab.probochka-corp.ru сайт отвечает по HTTP
HTTPS curl -I https://sXX.lab.probochka-corp.ru сайт отвечает по HTTPS
Certbot sudo certbot certificates сертификат выпущен для нужного домена

Что нужно сдать преподавателю

  1. Свой номер студента: XX.
  2. Ссылку на сайт в формате https://sXX.lab.probochka-corp.ru.
  3. Скриншот успешного подключения по SSH-ключу с локального компьютера.
  4. Вывод команды groups $USER.
  5. Вывод команды ls -ld /var/www/site.
  6. Вывод команды ls -l /var/www/site/index.html.
  7. Вывод команды sudo nginx -t.
  8. Вывод команды sudo ufw status verbose.
  9. Вывод команды curl -I https://sXX.lab.probochka-corp.ru.
  10. Вывод команды sudo certbot certificates.

Критерии оценки

Критерий Баллы
Установлены нужные программы и службы работают 10
SSH работает по ключу, парольный вход отключён 20
Директория /var/www/site создана с правильным владельцем, группой и правами 20
Nginx корректно отдаёт одностраничный сайт на домене sXX.lab.probochka-corp.ru 20
UFW настроен: открыты только 22, 80, 443 15
SSL-сертификат получен через Certbot, сайт открывается по HTTPS 15
Максимум: 100 баллов. Работа считается выполненной, если сайт открывается по HTTPS, SSH-пароль отключён, а права на директорию сайта соответствуют заданию.