Цель практической работы
Настроить минимально безопасный веб-сервер для статического одностраничного сайта на учебном Ubuntu Server.
После выполнения студент должен уметь:
- понимать разницу между локальным компьютером и удалённым сервером;
- подключаться к удалённому серверу по SSH;
- создавать SSH-ключ на локальном компьютере;
- вручную добавлять публичный ключ в
~/.ssh/authorized_keysна удалённом сервере; - отключать парольную аутентификацию в SSH;
- создавать группу для деплоя файлов сайта;
- настраивать права директории
/var/www/site; - создавать server block для Nginx;
- открывать только нужные порты через UFW;
- получать SSL-сертификат через Certbot.
Перед началом: локальный компьютер и удалённый сервер
Компьютер в аудитории
Это компьютер, за которым вы сидите физически. На нём открыт Windows 10, Windows Terminal, PowerShell или обычный терминал.
На локальном компьютере создаётся SSH-ключ. Приватный ключ остаётся только на локальном компьютере.
Учебный Ubuntu Server
Это система, к которой вы подключаетесь по сети командой ssh. Все команды с sudo apt, nginx, ufw, certbot выполняются именно на удалённом сервере.
Условия выполнения
| Параметр | Требование |
|---|---|
| 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.
Рекомендуемый план времени
- 0–10 минут: получить свой номер, подключиться к удалённому серверу, установить программы.
- 10–30 минут: создать SSH-ключ на локальном компьютере, вручную добавить публичный ключ на сервер, проверить вход по ключу.
- 30–40 минут: отключить парольный вход по SSH и проверить службу.
- 40–55 минут: создать директорию сайта, группу
deploy, настроить владельца и права. - 55–65 минут: настроить Nginx и проверить сайт по HTTP.
- 65–72 минуты: настроить UFW.
- 72–80 минут: получить SSL-сертификат и выполнить итоговую проверку.
Задание 1. Подключение к серверу и установка программ
Дальше в задании используется обозначение XX. Вместо него нужно подставлять свой номер из двух цифр.
Пример для студента с номером 06:
Домен: s06.lab.probochka-corp.ru
SSH-порт: 2206
Эта команда выполняется в терминале Windows 10 на локальном компьютере.
ssh student@31.163.204.186 -p 22XX
Пример для студента с номером 06:
ssh student@31.163.204.186 -p 2206
sudo apt update
sudo apt install nginx ufw certbot python3-certbot-nginx curl dnsutils openssh-client -y
sudo systemctl status nginx
В статусе должно быть active (running). Для выхода из просмотра статуса нажмите Q.
Задание 2. Настройка подключения только по SSH-ключу
authorized_keys редактируется на удалённом сервере Ubuntu.
Откройте терминал 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 — публичный ключ. Его нужно добавить на удалённый сервер.
В PowerShell выполните:
type $env:USERPROFILE\.ssh\id_ed25519.pub
Если используется обычный cmd, команда будет такой:
type %USERPROFILE%\.ssh\id_ed25519.pub
Скопируйте всю строку целиком. Она начинается с ssh-ed25519 и заканчивается комментарием, например studentXX@college-lab.
Подключитесь к серверу по паролю, если ещё не подключены:
ssh student@31.163.204.186 -p 22XX
Затем на удалённом сервере выполните:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
nano ~/.ssh/authorized_keys
authorized_keys.
В открытый файл ~/.ssh/authorized_keys вставьте строку публичного ключа, которую скопировали с локального компьютера.
После вставки сохраните файл:
- Ctrl + O — сохранить;
- Enter — подтвердить имя файла;
- Ctrl + X — выйти из редактора.
Затем настройте права:
chmod 600 ~/.ssh/authorized_keys
chown -R $USER:$USER ~/.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, вход по ключу работает.
Выполняйте этот шаг только после успешной проверки входа по ключу.
sudo nano /etc/ssh/sshd_config
Найдите или добавьте строки:
PubkeyAuthentication yes
PasswordAuthentication no
PermitRootLogin no
sudo sshd -t
sudo systemctl restart ssh
Если команда sudo sshd -t ничего не вывела, значит синтаксис конфигурации корректный.
Откройте новый терминал Windows 10 и выполните:
ssh -i C:\Users\LOGIN\.ssh\id_ed25519 student@31.163.204.186 -p 22XX
Если вход успешный, настройка SSH выполнена правильно.
Задание 3. Создание директории сайта и настройка прав
deploy.
sudo groupadd deploy
Если группа уже существует, это не критическая ошибка. Проверьте её наличие:
getent group deploy
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.
sudo mkdir -p /var/www/site
root и группу deploy.
sudo chown -R root:deploy /var/www/site
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
В тексте страницы замените 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
ls -ld /var/www/site
ls -l /var/www/site
Ожидаемый смысл результата: владелец root, группа deploy, у группы есть права на изменение файлов сайта.
Задание 4. Настройка Nginx для раздачи сайта
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;
sudo ln -sf /etc/nginx/sites-available/site /etc/nginx/sites-enabled/site
Если включён стандартный сайт Nginx, отключите его:
sudo rm -f /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl reload nginx
В результате проверки должно быть syntax is ok и test is successful.
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
22XX, внутри учебной системы SSH-служба работает на обычном порту 22/tcp.
sudo ufw status numbered
Если firewall ещё не включён, это нормально.
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbose
В результате должны быть открыты только 22/tcp, 80/tcp, 443/tcp.
Задание 6. Настройка SSL-сертификата через Certbot
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
Замените XX на свой номер:
sudo certbot --nginx -d sXX.lab.probochka-corp.ru
Пример для студента с номером 06:
sudo certbot --nginx -d s06.lab.probochka-corp.ru
curl -I https://sXX.lab.probochka-corp.ru
Ожидаемый результат: сайт отвечает по HTTPS, а браузер открывает страницу без ошибки сертификата.
sudo certbot renew --dry-run
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 |
сертификат выпущен для нужного домена |
Что нужно сдать преподавателю
- Свой номер студента:
XX. - Ссылку на сайт в формате
https://sXX.lab.probochka-corp.ru. - Скриншот успешного подключения по SSH-ключу с локального компьютера.
- Вывод команды
groups $USER. - Вывод команды
ls -ld /var/www/site. - Вывод команды
ls -l /var/www/site/index.html. - Вывод команды
sudo nginx -t. - Вывод команды
sudo ufw status verbose. - Вывод команды
curl -I https://sXX.lab.probochka-corp.ru. - Вывод команды
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 |