Один урок на тиждень. Нижче — що саме відбувається на кожному занятті, чого ти навчишся і що в тебе залишиться після нього. Уроки йдуть по порядку: кожен спирається на попередній.
01
Операційні системи, Linux і твій сервер
Ти отримуєш власний акаунт на спільному навчальному сервері, де працюють три класи — 63 учні та вчитель. Підключаєшся по SSH, міняєш виданий пароль і створюєш чотири робочі теки. Заразом розбираєш, навіщо Linux розділяє користувачів і що означає кожен символ у рядку ls -l.
Після уроку ти
- вмієш заходити на сервер зі свого комп'ютера й міняти виданий пароль командою passwd
- вмієш трьома командами — whoami, id, who — дізнатися, хто ти на цій машині і хто на ній ще працює
- вмієш читати рядок ls -l: чий це файл, яка група і кому що з ним можна
- вмієш скласти свої чотири теки й розрізняти, яку з них бачить увесь інтернет, а яку тільки ти
- вмієш знайти командою top процес, через який сервер гальмує в усього класу
Залишається в тебе: Акаунт на сервері зі зміненим паролем, чотири теки www/ upload/ data/ notes/, сторінка index.html у ~/www/, що відкривається за твоєю адресою, і файли whoami.md та rules.md у ~/notes/.
SSH і passwd
whoami, id, who
права rwx і читання ls -l
top і спільні ресурси VPS
Відкрити урок 01
02
AI-книга і права доступу: публікація на власному сабдомені
Ти пишеш із локальною моделлю книгу з трьох розділів і викладаєш її на свій сабдомен: читати може будь-хто, правити — тільки ти. Друга половина уроку про права доступу: переводиш rwxr-xr-x у 755 і назад, ставиш 755 на теки і 644 на файли. Учитель показує з акаунта attacker, що робить із твоєю текою запис 777.
Після уроку ти
- вмієш складати промпт так, щоб модель видала потрібний розділ з першого разу
- вмієш зверстати книгу з чотирьох сторінок і викласти її на свій сабдомен
- вмієш читати рядок ls -l: чий файл, яка група, хто що з ним може
- вмієш перекладати rwxr-xr-x у 755 і назад в умі
- вмієш ставити 755 на теки, 644 на файли й перевіряти себе командою find
Залишається в тебе: Тека ~/www/book/ на твоєму сабдомені: index.html зі змістом, три розділи ch1.html — ch3.html по ≥250 слів, маніфест book.json, журнал NOTES.md та img-credits.md; права 755 на теки, 644 на файли, 700 на ~/.ssh.
chmod і вісімковий запис 755 / 644
шлях запиту DNS → nginx → файл у ~/www/
промпт як технічне завдання
find для аудиту прав
Відкрити урок 02
03
Вебхук і секрет у .env: форма стукає до твого сервера
Досі твій сайт лише віддавав сторінки — сьогодні він уперше починає приймати дані. Google-форма через Apps Script сама надсилає POST на твою адресу, а приймач inbox.php перевіряє токен і відповідає кодом 200, 401, 403 або 405. Токен ти кладеш у ~/.env з правами 600, а самі анкети — у файл поза теками сайту.
Після уроку ти
- вмієш зробити на своєму сайті адресу, куди чужий сервіс сам надсилає дані
- вмієш відповідати на запит потрібним кодом: 200, 401, 403, 405
- вмієш сховати токен у файл, який не побачить браузер
- вмієш складати анкети у файл поза теками сайту, рядок за рядком
- вмієш знаходити у власному коді рядки, які не можна нікуди віддавати
Залишається в тебе: Google-форма щонайменше з 4 полями і Apps Script, який шле POST після кожного надсилання; ~/www/api/inbox.php із README.md; ~/.env із правами 600; журнал ~/data/leads.jsonl поза веб-корінням, куди приймач дописує рядок.
вебхук проти опитування (polling)
коди відповіді 200, 401, 403, 405
файл .env і openssl rand, права 600
формат JSONL і межа веб-кореня
Відкрити урок 03
04
Недовірений ввід: валідація, honeypot, екранування XSS
У твій приймач тепер летить те, що ти не контролюєш: чужі браузери, скрипти й боти. Ти додаєш серверну перевірку кожного поля, виводиш чуже ім'я з екрануванням, ставиш 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
05
Датасет без слідів: PII, анонімізація, EXIF
Ти збираєш таблицю з відповідями однокласників і прибираєш із неї конкретних людей. На екрані видно, чому «ми ж прибрали прізвища» не працює: у таблиці на 24 людини 12 рядків усе одно вказують рівно на одну особу. Заразом ти чистиш EXIF своїх фото і записуєш кожне перетворення колонок у журнал.
Після уроку ти
- вмієш подивитися на таблицю без прізвищ і сказати, кого з неї все одно впізнають
- вмієш переробити колонки так, щоб рядок описував групу людей, а не одну людину
- вмієш однією командою порахувати, скільки людей у найменшій групі твого файлу, і довести її до k ≥ 5
- вмієш подивитися командою exiftool, що телефон дописав усередину твого фото, і стерти це
- вмієш записати в окремий файл, яку колонку ти змінив і чому саме так
Залишається в тебе: Три текстові файли в ~/www/infographic/: очищений data.csv (≥10 рядків, ≥3 колонки), credits.md і anonymize-log.md з трьома перетвореннями. Сирий raw.csv і фото лишаються на твоєму комп'ютері.
персональні дані і квазіідентифікатори
k-анонімність, правило п'яти
exiftool -all=
узагальнення й агрегація колонок
Відкрити урок 05
06
Чесна інфографіка: доступність, чужий код і SRI
Чистий 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
07
AI-медіа: промпт, вага файлів, маніфест походження media.json
Ти генеруєш трек на 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
08
Deepfake, згода на образ і захист ресурсів
Урок веде дві лінії. Перша — чий образ і голос ти маєш право використати: статті 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
09
Скрипт звіту report.sh: агрегація даних і дашборд
У ~/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
10
cron, логи і принцип найменших привілеїв
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
11
Автоматизація Zapier/IFTTT і вхід за SSH-ключем
Ти генеруєш пару ключів 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
12
Підпис вебхука HMAC, мітка часу і захист від replay
Учитель кладе чужий запис у твій 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
13
Чат-бот із серверним проксі: ключ ніколи не на фронтенді
За три кліки в панелі «Мережа» ти дістаєш ключ із навчального бота, у якому він лежить просто в 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
14
Prompt injection, rate limit і секрет в історії git
Твій бот працює, але передає моделі будь-який підкинутий текст як інструкцію і не має обмежень. Ти ставиш межу «системний промпт / дані користувача», фільтр виходу з канаркою, ліміт довжини 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
15
Збірка командного продукту і гігієна вебформ
Команда зводить п'ять окремих робіт модуля — книгу, дашборд, опис AI-медіа, бота і журнал автоматизації — в один сайт зі спільною навігацією на team-N.nstekh.uk. Далі всі форми проходять однакову послідовність із шести перевірок: CSRF-токен, honeypot, серверна валідація, екранування, ліміти довжини й частоти. Наприкінці команда проганяє чек-лист готовності з 15 пунктів і закриває всі блокуючі.
Після уроку ти
- вмієш зводити п'ять окремих сторінок в один сайт з однією навігацією
- вмієш написати README.md так, щоб чужа людина знайшла потрібне без вас
- вмієш пояснити, як чужий сайт може надіслати запит від імені твого відвідувача
- вмієш ставити у форму приховане поле, без якого сервер запит не прийме
- вмієш прогнати форму через шість перевірок і побачити на екрані код відмови
Залишається в тебе: Командний продукт на team-N.nstekh.uk: одна головна сторінка й однакова навігація на всіх п'яти компонентах, README.md з архітектурою і таблицею ролей, SECURITY.md і PHP-обробники форм із CSRF-токеном та шістьма фільтрами.
CSRF і токен у формі
звірка токена через hash_equals
спільна навігація з абсолютними шляхами
README.md і SECURITY.md
Відкрити урок 15
16
Крос-аудит red/blue team, виправлення і захист
Останній урок модуля: кожна група перевіряє продукт сусідньої за списком із 12 пунктів і сама отримує звіт про свої вразливості. Спершу підписуються правила аудиту — тільки призначена ціль, тільки чек-лист, нічого не псувати; вихід за межі анулює звіт усієї команди. Далі 30 хвилин на виправлення, повторний прогін audit.sh і тривилинний захист продукту перед класом.
Після уроку ти
- вмієш перевіряти чужий сайт за списком із 12 пунктів, не виходячи за межі дозволеного
- вмієш записати знахідку так, щоб чужа команда відтворила її без тебе
- вмієш відрізнити вразливість, яку лагодять першою, від тієї, що почекає
- вмієш прийняти звіт про свої помилки й закрити їх за півгодини
- вмієш захистити свій продукт перед класом за три хвилини
Залишається в тебе: Підписані audit-rules.md, звіт audit-report.json, де до кожної знахідки додано відтворюваний доказ, і FIXES.md із часом подання та часом закриття кожної знахідки; повторний прогін audit.sh із зеленим чек-листом і захист продукту.
red team і blue team
чек-лист із 12 перевірок і фіксація доказу
відповідальне розкриття
стаття 361 Кримінального кодексу України
Відкрити урок 16