10 клас — програма модуля

Study.UA · IT Skills · Cloud Services & Cyber Security · 16 уроків · групи 10A, 10B, 10C
Один урок на тиждень. Нижче — що саме відбувається на кожному занятті, чого ти навчишся і що в тебе залишиться після нього. Уроки йдуть по порядку: кожен спирається на попередній.

Сьогодні ти отримуєш власний акаунт на справжньому сервері. Логін і пароль видає вчитель. До кінця уроку ти зайдеш на цю машину зі свого комп’ютера й попрацюєш на ній руками.

На уроці ти навчишся

  • Модуль I · IT Skills (Cloud Services & Cyber Security) · 120 хвилин
  • Один перед тобою, другий за тисячу кілометрів
  • Браузер нічого не вигадує сам — він усе просить
  • Питання правильне, і відповідь на нього не про потужність
  • Шість відмінностей, і жодна з них не про швидкість
Залишається в тебе: Сьогодні є успішний вхід на сервер по SSH; Усі чотири теки на місці: www, upload, data, notes; Файл ~/notes/hello.txt існує і не порожній; Власник ~/notes/hello.txt — твій логін
ssh whoami id pwd ls echo "мій who
Відкрити урок 01

Ти поклав сторінку в теку www і надіслав однокласнику адресу. У себе відкриваєш — бачиш текст. Він відкриває ту саму адресу — бачить великий напис 403 Forbidden.

На уроці ти навчишся

  • Модуль I · IT Skills (Cloud Services & Cyber Security) · 120 хвилин
  • Три команди — і адреса відповідає кодом 200
  • Ти ховаєш чернетку від сторонніх очей і отримуєш не те, що хотів
  • І в цієї програми на сервері свій обліковий запис
  • Три категорії, і кожен, хто звертається до файла, потрапляє рівно в одну
Залишається в тебе: Адреса /s/<логін>/book/ віддає 200; У теці є index.html і три файли ch1.html, ch2.html, ch3.html; Кожен розділ містить щонайменше 250 слів тексту; Посилання в index.html відносні: ch1.html, без слеша спереду
ssh mkdir echo "<meta curl chmod find printf ".env\\n*.key\\nid_ed25519\\nprivate/\\n" git
Відкрити урок 02

Учора ввечері ти правив розділ книги. Щоб швидко перевірити здогадку, поставив chmod 600 на один файл, а на теку — 777, «поки що, потім поверну». Потім тебе покликали вечеряти.

На уроці ти навчишся

  • Сайт відкривається. Це не означає, що з ним усе гаразд
  • Не тому, що команди складні, а тому, що їх треба згадати всі до одної
  • Програма ходить і питає, ти читаєш результат
  • Не «сторінка відкрилася», а трицифровий код відповіді
  • Не список імен, а лічильник — рахувати простіше, ніж читати
Залишається в тебе: stat -c %a ~/bin/report.sh дорівнює 700, а ~/bin — теж 700; ~/data/report.json — валідний JSON із generated_at і всіма сімома числовими полями; У ~/data/mirror лежить дзеркало репозиторію ai-book, і воно оновлюється; hours_since_commit у звіті збігається з датою останнього коміту в дзеркалі
mkdir find git mv bash ~/bin/report.sh rm
Відкрити урок 03

У твій приймач тепер летить те, що ти не контролюєш: чужі браузери, скрипти й боти. Ти додаєш серверну перевірку кожного поля, виводиш чуже ім'я з екрануванням, ставиш honeypot і ліміти на довжину, розмір тіла й частоту. Потім сам проводиш шість атак на власний обробник і записуєш очікуваний та фактичний код відповіді.

На уроці ти навчишся

  • перевіряти кожне поле на сервері: чи прийшло, який тип, яка довжина
  • виводити чуже ім'я на сторінку так, щоб тег у ньому лишився текстом
  • ставити у формі приховане поле honeypot, яке заповнюють тільки боти
  • обмежувати довжину, розмір тіла й частоту запитів і відповідати 413, 422, 429
  • зламати власний обробник шістьма атаками й записати, що вийшло
Залишається в тебе: Оновлений ~/www/api/inbox.php із валідацією, honeypot і лімітами; сторінка ~/www/leads/index.php з останніми 10 записами й екрануванням при виводі; журнал власних атак ~/www/api/tests.md.
серверна валідація за білим списком XSS і екранування при виводі honeypot у формі коди 413, 422, 429
Відкрити урок 04

Ти збираєш таблицю з відповідями однокласників і прибираєш із неї конкретних людей. На екрані видно, чому «ми ж прибрали прізвища» не працює: у таблиці на 24 людини 12 рядків усе одно вказують рівно на одну особу. Заразом ти чистиш EXIF своїх фото і записуєш кожне перетворення колонок у журнал.

На уроці ти навчишся

  • подивитися на таблицю без прізвищ і сказати, кого з неї все одно впізнають
  • переробити колонки так, щоб рядок описував групу людей, а не одну людину
  • однією командою порахувати, скільки людей у найменшій групі твого файлу, і довести її до k ≥ 5
  • подивитися командою exiftool, що телефон дописав усередину твого фото, і стерти це
  • записати в окремий файл, яку колонку ти змінив і чому саме так
Залишається в тебе: Три текстові файли в ~/www/infographic/: очищений data.csv (≥10 рядків, ≥3 колонки), credits.md і anonymize-log.md з трьома перетвореннями. Сирий raw.csv і фото лишаються на твоєму комп'ютері.
персональні дані і квазіідентифікатори k-анонімність, правило п'яти exiftool -all= узагальнення й агрегація колонок
Відкрити урок 05

Чистий data.csv з минулого уроку стає інфографікою: діаграми малює твій власний chart.js, а поруч стоїть таблиця з тими самими числами. Ти перевіряєш палітру очима людини, яка не розрізняє червоне й зелене, і підписуєш діаграму джерелом, датою і розміром вибірки. Третя частина уроку — чужий код: що дає авторові бібліотеки один рядок script з чужого сервера і як прив'язати цей файл атрибутом integrity.

На уроці ти навчишся

  • написати до діаграми текст, який передає висновок, а не форму картинки
  • покласти поруч із діаграмою таблицю з тими самими числами
  • перевірити свої кольори очима людини, яка не бачить різниці червоного й зеленого
  • підписати діаграму так, щоб їй вірили: джерело, дата, скільки людей опитано
  • прив'язати чужий скрипт до одного точного файлу через integrity і пояснити навіщо
Залишається в тебе: Сторінка ~/www/infographic/index.html із ≥2 діаграмами, таблицею-дублікатом, підписом із джерелом і висновком ≥120 слів; власний chart.js, який читає data.csv і малює SVG; доповнений credits.md із розділом про зовнішні залежності.
SRI і атрибут integrity атака на ланцюг постачання коду колір не єдиний носій сенсу, контраст побудова SVG-діаграми з CSV
Відкрити урок 06

Ти генеруєш трек на 30—90 секунд і відеофрагмент на 10—30 секунд — і жоден із цих файлів не потрапляє на сервер. Туди їде текст: сторінка-опис, транскрипт і маніфест походження media.json з полями tool, model, prompt, license, consent, duration_sec, size_mb. Вагу файлу ти рахуєш із тривалості й бітрейту, а потім звіряєш розрахунок командою ffprobe.

На уроці ти навчишся

  • писати запит до генератора так, щоб той самий результат вийшов і завтра
  • порахувати вагу файлу з його тривалості й перевірити розрахунок командою ffprobe
  • вести поруч із роботою текстовий файл, який доводить, що це зробив ти
  • розібратися, який чужий матеріал брати можна, а який ні
  • описати відео словами так, щоб сторінка була зрозуміла без самого відео
Залишається в тебе: Тека ~/www/media/ з трьома текстовими файлами: index.html з описами, тривалостями й підписами, media.json з полями походження для кожного твору і transcript.md. Самі .mp3 і .mp4 лишаються в ~/media-local/ на твоєму комп'ютері.
маніфест походження media.json бітрейт і розрахунок ваги файлу ffprobe C2PA і Content Credentials
Відкрити урок 07

Урок веде дві лінії. Перша — чий образ і голос ти маєш право використати: статті 307 і 308 Цивільного кодексу, бланк згоди і кодове слово, яке працює навіть при ідеально схожому голосі в телефоні. Друга — твій сервер як чужий ресурс: ти забороняєш hotlink перевіркою заголовка Referer, звіряєш сигнатуру файлу з його розширенням і ставиш ліміт розміру завантаження з кодом 413.

На уроці ти навчишся

  • сказати, що вміє підробити звичайний застосунок, а що йому поки не дається
  • домовитися з людиною, перш ніж зняти її на відео й викласти запис
  • завести вдома кодове слово, яке працює навіть при схожому голосі
  • заборонити чужим сайтам вантажити картинки просто з твого сервера
  • перевірити, що всередині файлу справді те, що написано в його назві
Залишається в тебе: Чотири файли в ~/www/media/: consent.md з правилами й бланком згоди, trust-protocol.md з кодовим словом і правилом зворотного дзвінка, доповнений media.json із заповненим полем consent і конфіг захисту від hotlink (.htaccess або ~/conf/media.conf).
deepfake і межі розпізнавання на око hotlink і заголовок Referer сигнатура файлу проти розширення, код 413 статті 307 і 308 ЦК України
Відкрити урок 08

У ~/data/leads.jsonl уже лежать справжні заявки з твоєї форми. Ти пишеш скрипт ~/bin/report.sh, який читає цей приватний файл з іменами й адресами, а віддає публічний report.json із самими числами. Межу між приватним і публічним сьогодні проводиш ти сам: кожен зайвий ключ у цьому JSON бачить будь-хто у світі.

На уроці ти навчишся

  • рахувати заявки просто в терміналі: скільки всього і скільки з кожного класу
  • написати скрипт, який збирає ці числа у файл report.json
  • прибирати зі звіту імена й адреси, щоб назовні пішли самі цифри
  • ховати надто малі групи, щоб «четверо з 10C» не вказувало на конкретну людину
  • роздати права так, щоб звіт бачили всі, а вихідні дані — тільки ти
Залишається в тебе: Скрипт ~/bin/report.sh із правами 700, сторінка-дашборд ~/www/dash/index.html і згенерований самим скриптом ~/www/dash/report.json з правами 644. Файл ~/data/leads.jsonl лишається з правами 600 поза ~/www/.
jq, sort | uniq -c, awk для JSONL set -euo pipefail атомарний запис через тимчасовий файл і mv мінімізація й агрегація даних, ідемпотентність
Відкрити урок 09

report.sh переїжджає в розклад cron і з цієї миті працює без тебе. Ти видаєш йому рівно потрібні права замість chmod 777, береш для зовнішнього сервісу токен тільки на читання з терміном дії й пишеш у лог рядок, з якого видно подію, але немає жодного чужого імені. Наприкінці налаштовуєш ротацію логу і код завершення, за яким видно падіння.

На уроці ти навчишся

  • видавати скрипту рівно ті права, які йому потрібні, замість chmod 777
  • брати для скрипта ключ, яким можна лише читати, і ставити йому термін дії
  • писати в лог рядок, з якого видно, що сталося, — і жодного чужого імені
  • ховати секрет у файл ~/.env, а не в рядок розкладу
  • стежити, щоб лог не ріс вічно, і повертати чесний код виходу, коли скрипт упав
Залишається в тебе: Рядок у crontab -e, який сам запускає ~/bin/report.sh за розкладом; приватна тека ~/logs/ з правами 700 і файлом report-РРРР-ММ.log з правами 600; ~/www/dash/README.md із розкладом людською мовою і планом реагування на витік токена.
crontab і п'ять полів розкладу принцип найменших привілеїв токен зі скоупом read-only і ротація коди завершення і ротація логів
Відкрити урок 10

Ти генеруєш пару ключів ed25519 у себе на комп'ютері, кладеш публічну частину в ~/.ssh/authorized_keys і заходиш на сервер без пароля — приватний ключ машину не залишає. Друга лінія уроку: збираєш у Zapier або IFTTT сценарій «тригер → фільтр → дія», який стукає у твій api/hook.php, і розбираєш екран згоди сервісу. Приймач сьогодні приймає подію від будь-кого — це навмисно, і це закриє урок 12.

На уроці ти навчишся

  • заходити на сервер без пароля — по двох файлах, які створив сам
  • читати журнал входів і бачити, хто і чим стукав у твій сервер уночі
  • прибрати загублений ключ одним рядком, не міняючи нічого іншого
  • зібрати сценарій, який щось робить сам, коли настане подія
  • подивитися на екран згоди сервісу й назвати, які саме скоупи ти віддаєш
Залишається в тебе: Пара ed25519 (приватний ключ тільки на твоєму комп'ютері), ~/.ssh із правами 700 і authorized_keys із 600, вхід без пароля. На сервері — api/hook.php, сторінка events/index.php із часом останньої події та api/scenario.md; журнал ~/data/events.jsonl поза ~/www.
ssh-keygen ed25519 і authorized_keys права 700 на ~/.ssh і 600 на файл ключа журнал входів: last, auth.log OAuth-скоупи і схема «тригер → фільтр → дія»
Відкрити урок 11

Учитель кладе чужий запис у твій events.jsonl, знаючи лише адресу ендпойнта — і відрізнити його від справжнього ти не зможеш. Ти закриваєш цю вразливість підписом: hash_hmac рахує HMAC від тіла запиту, а hash_equals порівнює підписи за сталий час. Далі додаєш вікно 300 секунд для X-Timestamp і сховище nonce, щоб той самий запит не пройшов удруге.

На уроці ти навчишся

  • підписувати запит так, щоб підробити його не вийшло навіть з адресою на руках
  • відрізнити чужий запис у своєму журналі від власного
  • відхилити запит, який хтось перехопив учора й надсилає сьогодні
  • не приймати той самий запит удруге, навіть якщо він прийшов за секунду
  • описати свою схему так, щоб чужа людина надіслала тобі подію без твоїх підказок
Залишається в тебе: Оновлений ~/www/api/hook.php із перевіркою X-Signature, X-Timestamp і nonce у правильному порядку, та api/security.md з описом схеми для чужої команди. Секрет HOOK_SECRET у ~/.env, тека ~/data/nonces/ — обидва поза веб-корінням.
HMAC і hash_hmac порівняння за сталий час hash_equals replay-атака, вікно 300 секунд і nonce коди відповіді 400, 401, 409
Відкрити урок 12

За три кліки в панелі «Мережа» ти дістаєш ключ із навчального бота, у якому він лежить просто в chat.js — і робиш свого інакше. Ключ читає api/chat.php з файлу ~/.env уже на сервері, а браузер знає тільки адресу /api/chat.php. Заразом пишеш system.md із роллю, межами і формулою відмови бота, ставиш серверні перевірки й налаштовуєш .gitignore.

На уроці ти навчишся

  • знайти чужий ключ у чужому боті за три кліки, без жодного зламу
  • написати сторінку чату, яка звертається тільки до твого власного сервера
  • тримати ключ у файлі, який браузер не бачить і не може попросити
  • поставити на сервері обмеження, щоб чужий скрипт не з'їв твою квоту за ніч
  • порахувати, скільки коштує одна репліка бота і скільки — місяць роботи
Залишається в тебе: Робочий бот на твоїй адресі: bot/index.html, bot/chat.js, bot/system.md і api/chat.php із перевірками методу, типу вмісту, довжини й частоти. Ключ лише в ~/.env з правами 600; .gitignore налаштовано, і ключа немає ані в робочій теці, ані в історії комітів.
серверний проксі і межа довіри ~/.env з правами 600 системний промпт у system.md .gitignore і перевірка git log --all -p
Відкрити урок 13

Твій бот працює, але передає моделі будь-який підкинутий текст як інструкцію і не має обмежень. Ти ставиш межу «системний промпт / дані користувача», фільтр виходу з канаркою, ліміт довжини 400 символів із кодом 413 і ліміт частоти 10 запитів за 60 секунд із кодом 429. Заразом ганяєш сканер по ~/www і по історії git — і якщо ключ знайдено, першою дією відкликаєш його.

На уроці ти навчишся

  • перевіряти свій репозиторій на ключі — не тільки у файлах, а й в історії комітів
  • відкликати ключ, що втік, і поставити новий за десять хвилин
  • ставити боту межу: не більше 10 запитів за хвилину з однієї адреси
  • відповідати на завеликий запит правильним кодом, а не помилкою сервера
  • зламати чужого бота підкинутою командою — і залатати після цього свого
Залишається в тебе: Оновлений api/chat.php із лімітами й фільтром виходу, bot/system.md, журнал восьми атак bot/injection-tests.md і bot/incident.md із порядком дій при витоку ключа. Лічильник запитів сервер пише в ~/data/, поза ~/www.
пряма й непряма prompt injection rate limit, код 429 і заголовок Retry-After ліміт довжини і код 413 канарка у фільтрі виходу, ротація ключа
Відкрити урок 14

Команда зводить п'ять окремих робіт модуля — книгу, дашборд, опис AI-медіа, бота і журнал автоматизації — в один сайт зі спільною навігацією на https://studyua.91.219.61.4.nip.io/s/team-N/. Далі всі форми проходять однакову послідовність із шести перевірок: CSRF-токен, honeypot, серверна валідація, екранування, ліміти довжини й частоти. Наприкінці команда проганяє чек-лист готовності з 15 пунктів і закриває всі блокуючі.

На уроці ти навчишся

  • зводити п'ять окремих сторінок в один сайт з однією навігацією
  • написати README.md так, щоб чужа людина знайшла потрібне без вас
  • пояснити, як чужий сайт може надіслати запит від імені твого відвідувача
  • ставити у форму приховане поле, без якого сервер запит не прийме
  • прогнати форму через шість перевірок і побачити на екрані код відмови
Залишається в тебе: Командний продукт на https://studyua.91.219.61.4.nip.io/s/team-N/: одна головна сторінка й однакова навігація на всіх п'яти компонентах, README.md з архітектурою і таблицею ролей, SECURITY.md і PHP-обробники форм із CSRF-токеном та шістьма фільтрами.
CSRF і токен у формі звірка токена через hash_equals спільна навігація з абсолютними шляхами README.md і SECURITY.md
Відкрити урок 15

Останній урок модуля: кожна група перевіряє продукт сусідньої за списком із 12 пунктів і сама отримує звіт про свої вразливості. Спершу підписуються правила аудиту — тільки призначена ціль, тільки чек-лист, нічого не псувати; вихід за межі анулює звіт усієї команди. Далі 30 хвилин на виправлення, повторний прогін audit.sh і тривилинний захист продукту перед класом.

На уроці ти навчишся

  • перевіряти чужий сайт за списком із 12 пунктів, не виходячи за межі дозволеного
  • записати знахідку так, щоб чужа команда відтворила її без тебе
  • відрізнити вразливість, яку лагодять першою, від тієї, що почекає
  • прийняти звіт про свої помилки й закрити їх за півгодини
  • захистити свій продукт перед класом за три хвилини
Залишається в тебе: Підписані audit-rules.md, звіт audit-report.json, де до кожної знахідки додано відтворюваний доказ, і FIXES.md із часом подання та часом закриття кожної знахідки; повторний прогін audit.sh із зеленим чек-листом і захист продукту.
red team і blue team чек-лист із 12 перевірок і фіксація доказу відповідальне розкриття стаття 361 Кримінального кодексу України
Відкрити урок 16
Твій сайт: /s/твій-логін/ · вхід на сервер: ssh твій-логін@91.219.61.4 · зміна пароля: passwd