До списку уроків
9 клас · Урок 16 з 16

Кібербезпека: аудит власного акаунта

виконано0%
Крок 1

Що робимо сьогодні

Модуль I · Хмарні сервіси й документи · тема 9, один урок · 120 хвилин · останній урок модуля

Мета. Сьогодні ти не вивчаєш нову тему. Ти перевіряєш те, що вже зробив. За цей модуль у твоєму акаунті з’явилися сайт, форма, дашборд і бот. А ще чужі відповіді, скрипти й ключі.

Разом із ними могли непомітно з’явитися дірки. Зайві права на теці. Забутий токен у коді. Копія чужих персональних даних. Урок про те, як знайти їх самому — раніше за когось іншого.

Що ти здаєш ~/www/security/report.json — машиночитний звіт аудиту (password_entropy_bits, масив checks зі status і fix, phishing_score) і ~/www/security/index.html — пам’ятка «5 правил» своїми словами: не менше 800 символів тексту і не менше 5 пунктів <li>.

Після уроку ти вмієш

Рядок drwxr-xr-x, слово «токен» і «стійкість пароля в бітах» поки нічого не означають. Розберемо їх по черзі.

Хід уроку

ЕтапХвЩо робимо
Вхід у тему10Три шкільні кейси: що саме зламали
Права доступу20Анатомія drwxr-xr-x, ls -la, find
Секрети в коді15.env, токен у браузері, історія git
Паролі і 2FA20Калькулятор стійкості, словниковий перебір
Перерва10
Фішинг15Тренажер «Пошта-пастка» на 6 листів
Сканер акаунта25Проходиш чек-лист у терміналі, збираєш report.json
Підсумок модуля5Що ти вмів у вересні і що вмієш зараз
Разом120
Усі команди аудиту — у SSH-сесії на сервері Це Linux-командний рядок, а не PowerShell. Відкрий термінал і зайди на сервер своїм логіном. Далі всі команди з цієї сторінки набирай там. У PowerShell на своєму ноутбуці вони або не спрацюють, або покажуть щось геть інше.
Пароль на цій сторінці нікуди не йде Калькулятор стійкості рахує тільки у твоєму браузері: жодного запиту в мережу, жодного збереження, поле очищається при перезавантаженні. Але звичка важливіша за код — тому вводь у нього не свій справжній пароль, а схему: та сама довжина, той самий набір символів. Оцінка вийде та сама.
Крок 2

Права доступу: хто саме бачить твої файли

Сервер класу спільний. Твій сусід по парті — це ще й сусідній обліковий запис на тій самій машині.

У Linux у кожного файлу є власник, група і решта — усі інші користувачі системи. Для кожної з трьох категорій окремо вказано три дозволи: читати (r), писати (w), виконувати (x). Для теки x означає «можна зайти всередину».

Саме це й показує перший стовпчик у виводі ls -la. Розберемо його по літері.

d rwx r-x r-x тип власник група решта d = тека 4+2+1 4+0+1 4+0+1 7 5 5 r = 4 · w = 2 · x = 1 складаєш — виходить цифра 755 так має виглядати ~/www і кожна тека в ньому d rwx --- --- 700 тільки власник: ~/.ssh, ~/notes
Дев’ять літер після типу — це три групи по три. Кожна група складається в одну цифру: r = 4, w = 2, x = 1. Тому rwx — це 7, а r-x — це 5.

Чому 755 на ~/www, а 700 на решті

Сторінку з ~/www віддає браузеру не ти, а окрема програма на сервері. Вона зветься nginx: приймає запит і надсилає у відповідь потрібний файл. Працює вона від власного системного користувача, а не від тебе. Тому для твоєї теки nginx — «решта».

Щоб зайти в теку й прочитати файл, «решті» потрібні r і x на теку та r на файл. Звідси 755 для тек і 644 для файлів у публічній частині. Читати може будь-хто, змінювати — тільки власник.

А в ~/notes і ~/.ssh нікому чужому заходити не треба. Ні nginx, ні сусідові. Там 700.

У ~/data нашого кабінету стоїть 750. Читати має ще й група: від її імені працює скрипт збору форми. «Решта» не читає нічого. А на authorized_keys стоїть 600: хто допише туди рядок, заходитиме на сервер як ти.

ЩоПраваХто читаєНавіщо саме так
~/www і теки в ньому755усіnginx має зайти в теку, щоб віддати сторінку
файли в ~/www644усі читаютьчитати — так, змінювати — тільки ти
~/data750ти і групавідповіді однокласників не для інтернету
~/upload750ти і групаприймальня FTP, не публічна вітрина
~/notes700тільки тичернетки нікого не стосуються
~/.ssh700тільки тисписок твоїх ключів нікого більше не стосується; це ще й вимога критерію
~/.ssh/authorized_keys600тільки тихто допише туди свій ключ — зайде як ти
~/bin/build_dash.py700тільки тизапускати твій скрипт має право лише ти
Що саме перевіряє sshd, а що — ми Часто кажуть: «не поставиш на ~/.ssh рівно 700 — ключ не спрацює». Це неточно. Сервер із увімкненим StrictModes відмовляє тоді, коли теку або authorized_keys може записувати хтось, крім власника, — тобто на правах 775 чи 777. Права 755 він приймає спокійно, і вхід за ключем працює. 700 ми ставимо з іншої причини: сусідові по серверу нема чого читати список твоїх ключів. Це гігієна і вимога критерію perm_ssh, а не технічна відмова.
Чому 777 не ставлять ніколи Сімка для «решти» — це rwx для будь-якого користувача сервера. Він може не тільки прочитати твій файл, а й переписати його. Підмінити index.html. Дописати рядок у твій скрипт, який ти сам потім запустиш від свого імені. На питання «чому не працює» 777 відповіді не дає — воно лише ховає справжню причину.

Дивимось на свої права одним рядком

SSH-сесія на сервері
$ ls -ld ~/www ~/data ~/upload ~/notes ~/.ssh drwxr-xr-x 7 ТВІЙ-ЛОГІН ТВІЙ-ЛОГІН 4096 Apr 12 10:02 /home/ТВІЙ-ЛОГІН/www drwxr-x--- 2 ТВІЙ-ЛОГІН ТВІЙ-ЛОГІН 4096 Apr 12 09:41 /home/ТВІЙ-ЛОГІН/data drwxr-x--- 2 ТВІЙ-ЛОГІН ТВІЙ-ЛОГІН 4096 Apr 11 18:20 /home/ТВІЙ-ЛОГІН/upload drwx------ 2 ТВІЙ-ЛОГІН ТВІЙ-ЛОГІН 4096 Mar 03 12:15 /home/ТВІЙ-ЛОГІН/notes drwx------ 2 ТВІЙ-ЛОГІН ТВІЙ-ЛОГІН 4096 Apr 12 10:30 /home/ТВІЙ-ЛОГІН/.ssh

ls -ld показує саму теку, а не її вміст. Саме це й потрібно для перевірки прав. Ключ -l дає довгий формат, -d — «саму теку». Вивід вище демонстраційний: у твоєму буде твій логін і твої дати.

Але переглядати очима сотні файлів безглуздо. Питання «чи є в мене дірки» ставлять інакше — find шукає саме порушення:

SSH-сесія на сервері
$ find ~/www -perm -o=w /home/ТВІЙ-ЛОГІН/www/form/stats.json $ find ~/www -type f ! -perm -o=r /home/ТВІЙ-ЛОГІН/www/deck/deck.css $ find ~/www -type d ! -perm 755 /home/ТВІЙ-ЛОГІН/www/dash
Візуальний chmod

Клацай прапорці. Сторінка одразу показує рядок ls, число і вердикт: годиться таке для публічної теки чи це вже дірка.

drwxr-xr-x · 755

Питання

Форма не зберігала відповіді, і ти зробив chmod -R 777 ~/www/form — «щоб точно працювало». Форма запрацювала. Що ти зробив насправді?

Питання

ls -ld ~/data показує drwxr-xr-x. Файлів у теці ти не чіпав, а /data/ у браузері й далі дає 403. Це нормально?

Крок 3

Секрети в коді: чому токен у .js — це вже не секрет

Ключ, пароль, токен доступу до API — усе це «секрети». Головне правило: секрет не лежить у тому, що ти віддаєш людям.

Уяви рядок у твоєму ~/www/dash/app.js:

~/www/dash/app.js — так робити не можна
const API_KEY = "grist_9f3c7a41b0e2d85f"; fetch("https://grist.example/api/docs/abc/tables/Data/records", { headers: { Authorization: "Bearer " + API_KEY } });

Цей файл лежить у публічній теці. Отже, будь-хто в інтернеті може просто його завантажити — і побачити ключ:

будь-який комп’ютер у мережі
$ curl -s http://91.219.61.4/s/ТВІЙ-ЛОГІН/dash/app.js | head -3 const API_KEY = "grist_9f3c7a41b0e2d85f";

Не потрібні ні злам, ні хитрощі: браузер зобов’язаний завантажити твій JavaScript, інакше сторінка не запрацює. Той самий рядок видно у DevTools → Sources і в «переглянути код сторінки».

Перед виливанням на сайт JavaScript часто стискають: прибирають пробіли, переноси рядків і довгі імена змінних. Файл стає удвічі меншим і незручним для читання. Таке стиснення звуть мінімізацією. Ховати вона нічого не вміє: ключ лишається тим самим текстом, просто без пробілів навколо.

Правило одним реченням Усе, що потрапило в .html, .css або .js у ~/www, — публічне. Секрет живе там, куди відвідувач не дістає: у файлі поза ~/www, у змінній оточення, у конфігу серверного скрипта.

.env — і чому саме 600

.env — простий текстовий файл «ім’я=значення». Звідти програма читає свої секрети під час запуску.

Він дає три речі одразу. Секрету немає в коді, тож код можна показувати кому завгодно. Файл лежить поза ~/www, тож його не віддає веб-сервер. Права на ньому 600 — читає й пише лише власник.

SSH-сесія на сервері
$ nano ~/.config/dash.env GRIST_API_KEY=grist_9f3c7a41b0e2d85f $ chmod 600 ~/.config/dash.env $ ls -l ~/.config/dash.env -rw------- 1 ТВІЙ-ЛОГІН ТВІЙ-ЛОГІН 41 Apr 12 11:04 /home/ТВІЙ-ЛОГІН/.config/dash.env

Скрипт build_dash.py читає ключ звідти. У самому скрипті лишається тільки ім’я змінної. Тепер його можна показати на проєкторі, залити в репозиторій команди й віддати на код-рев’ю: секрету в ньому немає.

Перевірка «чи не забув я щось у публічній теці» Одна команда шукає найпоширеніші форми секретів одразу по всьому сайту. Порожній вивід — це те, чого ти хочеш.
SSH-сесія на сервері
$ grep -rIn -E "api[_-]?key|secret|token|password *=|BEGIN [A-Z ]*PRIVATE KEY" ~/www /home/ТВІЙ-ЛОГІН/www/dash/app.js:3:const API_KEY = "grist_9f3c7a41b0e2d85f"; $ find ~/www -name ".env" -o -name "*.sql" -o -name "id_*" -o -name "*.bak" /home/ТВІЙ-ЛОГІН/www/dash/.env

У цій команді чотири ключі, і кожен закриває свою проблему.

-r — шукати не в одному файлі, а в усій теці разом із підтеками. Без нього grep подивиться тільки те, що лежить у ~/www верхнім шаром. А забутий токен зазвичай лежить не там, а на кілька тек глибше.

-I — це велика латинська «і». Вона каже: не заглядай у картинки, відео й архіви. Такі файли складаються не з літер, а з байтів, і їх звуть двійковими. Слова token там не буде, а екран вони засмітять сотнями рядків.

-n — писати біля кожного знайденого рядка його номер. Це економить хвилини: ти відкриваєш файл одразу на потрібному рядку, а не гортаєш його очима.

-E — дозволити в шаблоні пошуку значок | зі значенням «або». Шаблон зі значками, які щось означають, звуть регулярним виразом — англійською regexp. Наш шаблон читається так: знайди api_key, або secret, або token — усі п’ять форм за один прохід.

Чому видалити файл із git недостатньо

Git не зберігає «поточний стан теки». Він зберігає усі стани: кожен коміт — це знімок, і всі знімки лишаються в репозиторії назавжди. Ти видалив .env і зробив новий коміт — з’явився ще один знімок, у якому файлу немає. Але попередній знімок, де він є, нікуди не подівся.

SSH-сесія на сервері · так це видно
$ git rm --cached .env $ git commit -m "прибрав .env" $ git log --oneline --all -- .env a91c4e2 прибрав .env 3f7b018 додав налаштування дашборда $ git show 3f7b018:.env GRIST_API_KEY=grist_9f3c7a41b0e2d85f

Один рядок — і ключ знову на екрані, через тиждень після «видалення». А якщо коміт уже пішов у спільний репозиторій, копії є в кожного, хто зробив git clone чи git fetch.

твоя тека git commit git push спільний репозиторій .env з токеном знімок у історії копія їде в мережу Gitea, GitHub, дзеркала ще можна виправити ще можна переписати точка неповернення клон однокласника повна історія форк репозиторію окрема копія бот-сканер знаходить за хвилини кеш і дзеркала живуть своїм життям git rm .env — файл зникає з теки, але лишається в кожному старому коміті. Після push працює лише одне: відкликати старий токен і випустити новий.
Поки коміт не пішов у мережу, історію ще можна переписати. Після push копій стає більше, ніж ти можеш відстежити. Допомагає одне: відкликати сам секрет.
Що робити, якщо токен уже втік Спершу зайди в сервіс і відклич старий ключ. З цієї секунди він нічого не відмикає. Потім випусти новий і поклади його в .env поза ~/www. Додай .env у .gitignore. Історію чистити можна потім, за бажанням: головним був перший крок.
Питання

Богдан сховав ключ у файл ~/www/dash/config.js. Посилання на нього немає на жодній сторінці. «Його ніхто не знайде, адреси ж ніде немає». Наскільки він у безпеці?

Питання

Ти випадково закомітив .env із робочим токеном і зробив push у репозиторій команди. Через хвилину зробив git rm .env, новий коміт і ще один push. Що робити далі?

Крок 4

Паролі: чому довжина сильніша за значки

Стійкість пароля вимірюють не «складністю на вигляд», а числом варіантів, які довелося б перебрати.

Кожен символ множить кількість варіантів на розмір алфавіту. Якщо в паролі тільки малі літери, алфавіт — 26 символів. Якщо ще й великі, цифри й розділові знаки з клавіатури — 95. Пароль довжиною L з алфавіту N дає NL варіантів. Вагу цього числа зручно міряти в бітах:

Ентропія пароля H = L × log₂(N). Кожен зайвий біт — це вдвічі більше роботи для того, хто перебирає. Додати один символ до пароля з 95-символьного алфавіту — це +6,6 біта. Додати ще одне випадкове слово зі списку на 7776 слів — +12,9 біта, тобто майже вдвічі більше за один значок.

Ось звідки береться головна порада. Заміна o на 0 і a на @ ентропії не додає. Слово лишилося тим самим словниковим. А правило заміни знає кожна програма перебору. Дописати ще два слова — це +26 біт. Різниця в мільйони разів.

Що таке словниковий перебір

Ніхто не перебирає паролі «підряд» від aaaaaa. Спершу пробують списки вже витеклих паролів. Їх мільярди, і вони у відкритому доступі.

Потім до кожного слова застосовують правила. Додати рік у кінці. Зробити першу літеру великою. Замінити літери на схожі цифри. Приписати ! чи 123. І тільки якщо нічого не збіглося, починається справжній повний перебір.

Тому P@ssw0rd! формально має 9 символів і 59 біт. А насправді падає в перші секунди: він є в списках витоків просто в такому вигляді. І Sasha2010 — це «ім’я + рік», найпопулярніше правило зі всіх.

Скільки триває перебір на одній сучасній відеокарті (≈10¹¹ спроб/с, швидкий хеш) шкала логарифмічна: кожні 24 пікселі стовпчика — це час у 10 разів більший 123456 P@ssw0rd! Sasha2010 x!7Qp2 4 випадкові слова xk7Qp2!vR 6 випадкових слів 12 випадкових символів у топ-10 будь-якого списку словник + заміна літер ім’я + рік, 27 біт 6 випадкових символів, 39 біт 52 біти 59 біт 78 біт 79 біт миттєво миттєво миттєво 7 секунд 10 годин 73 дні 70 тис. років 171 тис. років Перші три падають не від перебору, а від словника: їх уже хтось увів до тебе.
Числа — це повний перебір усіх варіантів на швидкості порядку 10¹¹ спроб на секунду (одна сучасна відеокарта, хеш без затримки). У середньому знаходять удвічі швидше. Для перших трьох рядків перебір узагалі не потрібен: словник із правилами дістає їх раніше.
Швидкість перебору залежить від того, де перевіряють Той самий пароль тримається по-різному. Через форму входу на сайті, яка блокує після кількох невдач, — це десятки спроб на секунду. Якщо в зловмисника є база хешів і повільна функція на кшталт bcrypt — сотні тисяч на секунду. Якщо хеш швидкий (MD5, SHA-1 без затримки) — сотні мільярдів. Тому 52 біти «10 годин» на графіку — це найгірший для тебе випадок, а не звичайний.
Калькулятор стійкості · рахує лише у твоєму браузері

Нічого не надсилається в мережу і нічого не зберігається. Це просто арифметика на цій сторінці — можеш від’єднати ноутбук від Wi-Fi і перевірити. І все ж вводь схему свого пароля, а не сам пароль: та сама довжина, ті самі види символів.

Довжина 0 · алфавіт 0 символів · 0 біт

    Один пароль на всі сервіси — головна помилка

    Уяви ланцюжок. Ти зареєструвався на маленькому форумі про ігри, він через рік втратив базу користувачів. У базі — твоя пошта й твій пароль. Далі працює автомат: ту саму пару «пошта + пароль» підставляють у сотні популярних сервісів підряд. Це називається credential stuffing — не злам, а просто вхід із правильним паролем.

    Ніхто не «зламував» твою пошту. Її відкрили ключем, який ти сам залишив на форумі. Тому правило звучить так: унікальний пароль на кожен сервіс. Насамперед на пошту: через неї відновлюють доступ до всього іншого.

    Запам’ятати три десятки різних паролів неможливо. Цього ніхто й не вимагає. Для цього є менеджер паролів — програма, що тримає всі паролі в зашифрованому файлі.

    Ти пам’ятаєш один майстер-пароль: довгий, із кількох слів. Решту менеджер вигадує сам і сам підставляє. Є й побічна користь. Пароль він підставляє тільки на правильному домені. На сайті-двійнику він не запропонує нічого — і це вже готова перевірка на фішинг.

    Двофакторка на пальцях

    Пароль — це «щось, що я знаю». Його можна підглянути, вгадати або дістати з витоку. Другий фактор — «щось, що в мене є»: телефон, на якому кожні 30 секунд з’являється новий шестизначний код. Щоб зайти, потрібні обидва.

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

    ти пароль код 6 цифр вхід відбувся щось, що я знаю щось, що в мене є обидва фактори збіглися той, хто дістав твій пароль із витоку пароль коду немає вхід заблоковано той самий, що й у тебе телефон лишився в тебе і тобі прийшло сповіщення Код рахується із спільного секрету і поточного часу — застосунок нічого нікуди не надсилає, тому 2FA працює в літаку, а перехопити «канал передачі коду» неможливо: каналу немає.
    Двофакторка не робить пароль сильнішим. Вона робить украдений пароль недостатнім — а це на практиці важливіше.
    Питання

    Сайт вимагає «мінімум 8 символів, велика літера, цифра і спецсимвол». Марія вводить Marija1!, Олег — слива-вітер-камінь-сім, але сайт його не приймає. Хто з них має стійкіший пароль і чому?

    Питання

    У тебе один добрий пароль на 22 символи, і він стоїть скрізь: пошта, ігровий акаунт, форум, сервер класу. Форум злили. Що станеться далі?

    Крок 5

    Фішинг: лист, який просить тебе зробити помилку

    Фішинг не ламає програму. Він ламає людину — поспіхом, страхом і однією літерою в адресі.

    Схема завжди та сама. Лист виглядає як від сервісу, яким ти користуєшся. Він вимагає терміново кудись увійти чи щось відкрити. Сторінка, на яку ти потрапляєш, — точна копія справжньої.

    Ти вводиш пароль — і він одразу в чужих руках. Далі тебе перекидає на справжній сайт, щоб ти нічого не запідозрив.

    Окремо варто знати приманку саме для школярів: «перевір, чи не зламали твій акаунт — увійди тут». Вона працює, бо звучить як турбота і як порада з уроку інформатики.

    Насправді сервіс, який щось помітив, не проситиме тебе входити за посиланням із листа. Він просто заблокує вхід і скаже зайти на сайт самостійно.

    Один лист — шість ознак. Достатньо помітити будь-яку одну. Від: Адміністрація школи pidtrymka@shcool-vps.example Тема: ТЕРМІНОВО: акаунт буде видалено через 2 години Шановний користувач, ми зафіксували підозрілий вхід до вашого акаунта. Підтвердьте пароль за посиланням протягом 2 годин, інакше доступ буде втрачено назавжди. https://school-vps.example/login справжня адреса, яку покаже браузер: http://sch00l-vps.top/l/9fa2 вкладення: rahunok.pdf.exe 12 34 56 домен із підміненою літерою: shcool замість school, зона .example тиск часом: «через 2 години», «інакше буде втрачено назавжди» «Шановний користувач» — тебе не знають на ім’я, лист масовий жоден сервіс не просить підтвердити пароль за листом текст посилання і справжня адреса — різні домени й різні зони подвійне розширення .pdf.exe: це не документ, це програма
    Ознаки рідко ходять поодинці, але й однієї досить, щоб не клікати. Найнадійніша перевірка — навести курсор на посилання й прочитати адресу в рядку стану браузера, не натискаючи.

    Куди дивитися по черзі

    ОзнакаЩо конкретно перевірити
    Адреса відправникане ім’я, а те, що після @. Ім’я відправника вписує сам відправник — воно нічого не доводить
    Домен-двійникпідмінена літера (shcool, paypa1, rn замість m), зайвий дефіс, інша зона: .top замість .ua
    Терміновість«протягом 2 годин», «інакше видалимо», «останнє попередження» — щоб ти не встиг подумати
    Адреса посиланнянаведи курсор: текст посилання і справжня адреса можуть не збігатися взагалі
    Вкладенняподвійне розширення .pdf.exe, архів із паролем «щоб антивірус не заважав», прохання «увімкнути макроси»
    Сама вимоганадіслати пароль, код із SMS, фото документа — цього не просить жодна нормальна служба підтримки
    Правильна адреса відправника ще нічого не доводить Поле «Від» у листі підробити нескладно. Воно як зворотна адреса на конверті: її пише той, хто відправляє. Тому вимога «надішліть пароль» лишається фішингом, навіть якщо лист прийшов начебто з правильного домену. Дивись не лише на адресу, а й на те, що саме в тебе просять зробити.
    Тренажер · Пошта-пастка · 6 листів

    Прочитай кожен лист і вирішуй: це безпечно чи це фішинг. Після відповіді підсвітяться ознаки, які варто було помітити.

    Пройдено 0 з 6 · правильно 0

    Це розминка перед серверним тренажером. У report.json потрапляє результат серверного тренажера на 10 листів — його чекер звіряє з логом, тому вписати собі 10/10 руками не вийде.

    Питання

    Приходить лист: «Ми помітили вхід до твого акаунта з іншого міста. Перевір, чи не зламали тебе — увійди тут». Домен у посиланні — school-vps-check.top. Твої дії?

    Питання

    Тобі приходить SMS із кодом підтвердження входу, хоча ти нікуди не входив. За хвилину — повідомлення: «Це служба підтримки, продиктуйте код, щоб ми скасували чужий вхід». Що це означає і що робити?

    Крок 6

    Приватність у власних роботах

    Найчастіше персональні дані витікають не через злам, а через копію файлу, яку хтось поклав «щоб було зручно».

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

    Три питання до власного акаунта

    Перше: чи не лишились у моїх файлах чужі відповіді? Класична історія — копія responses.csv у ~/www/form/, зроблена, щоб «швидше подивитися». З цієї секунди відповіді всього класу лежать в інтернеті за прямим посиланням. Знайти їх може будь-хто, кому це спаде на думку.

    SSH-сесія на сервері
    $ find ~/www -type f \( -name "*.csv" -o -name "*.log" -o -name "*.sql" -o -name "*.bak" \) /home/ТВІЙ-ЛОГІН/www/form/responses.csv $ grep -rIl -E "[0-9]{10}|@gmail|@ukr\.net|\+380" ~/www /home/ТВІЙ-ЛОГІН/www/bot/dialogs.json

    Друга команда шукає у публічній теці те, що схоже на телефон, пошту або номер у форматі +380. Ключ -l друкує лише імена файлів, а не самі рядки. Так чужі дані не з’являться ще й у тебе на екрані під час перевірки.

    Друге: чи справді ~/data/ не віддається по HTTP? Права на теці — це захист від сусіда по серверу. Від інтернету захищає конфігурація nginx. Перевіряють це не логікою, а запитом:

    SSH-сесія на сервері
    $ curl -s -o /dev/null -w "%{http_code}\n" http://91.219.61.4/s/ТВІЙ-ЛОГІН/data/ 403 $ curl -s -o /dev/null -w "%{http_code}\n" http://91.219.61.4/s/ТВІЙ-ЛОГІН/data/responses.csv 404

    -o /dev/null викидає тіло відповіді, а -w "%{http_code}" друкує лише код. 403 або 404 — добре. 200 — так бути не має: скажи вчителю одразу, не чекаючи кінця уроку.

    Третє: чи прибрав я тестові дані? Під час розробки ти сам заповнював свою форму, писав тестові репліки в бота, вставляв у приклади імена однокласників. Чернетки, дампи діалогів і «тимчасові» копії лишаються назавжди, якщо їх не прибрати свідомо.

    Правило з уроку 4, яке досі діє Публічною є вся тека ~/www цілком, без винятків. Файл не стає приватним від того, що на нього немає посилання: адресу можна вгадати, знайти в логах, побачити в історії репозиторію. Приватні дані живуть у ~/data, і крапка.
    Питання

    Наталя поклала responses.csv у ~/www/form/. Файл вона перейменувала на x7f3-tmp.csv. Пояснює так: «таку назву ніхто не вгадає, а мені зручно відкривати з телефона». Що з цим не так?

    Питання

    У ~/www/bot/dialogs.json лежать тестові діалоги, де однокласники писали боту свої імена й клас. Роботу здано, оцінку виставлено. Що робити з файлом?

    Крок 7

    Сканер власного акаунта

    Десять перевірок. Кожну ти виконуєш у своєму терміналі й чесно позначаєш результат — сторінка складає з цього security/report.json і показує світлофор.

    Сканер нічого не перевіряє за тебе. Доступу до твого акаунта він не має і мати не може. Він робить інше: тримає порядок перевірки й підказує точну команду. А наприкінці збирає твої відповіді у звіт, який читає чекер.

    Обманювати сканер немає сенсу: check 16 запускає ті самі перевірки на сервері вже без тебе.

    Найчесніший спосіб — робити це паралельно Відкрий термінал поруч зі сторінкою. Копіюєш команду → виконуєш → дивишся на реальний вивід → тиснеш відповідний варіант. Не намагайся пригадати, «як там було минулого тижня».
    Два числа, які сканер не вгадає

    Ентропію бере калькулятор на кроці 4 — щойно ти щось туди введеш, число підставиться сюди саме. Результат тренажера вписуєш руками, але чекер звіряє його з серверним логом.

    Загальний вердикт
    Ще не пройдено жодної перевірки

    Зелених 0 · жовтих 0 · червоних 0 · без відповіді 10

    Твій report.json

    Оце й треба покласти у ~/www/security/report.json. Кнопка копіює весь текст цілком.

    {}
    Як зберегти файл, щоб чекер його прочитав Найпростіше — створити його просто на сервері: nano ~/www/security/report.json, вставити текст, зберегти. Якщо робиш файл на своєму комп’ютері, збережи його у UTF-8 без BOM (VS Code, Notepad++). У Windows PowerShell 5.1 не роби echo … > report.json: перенаправлення > запише файл у UTF-16, і jq на сервері вилетить із незрозумілою помилкою. Якщо все ж PowerShell — тільки Out-File -Encoding utf8, і навіть тоді перевір результат командою head -c 3 report.json | xxd.
    Крок 8

    Практика: аудит, ключ, звіт

    Кроки 1—11 — у SSH-сесії на сервері (крок 5 — у себе на комп’ютері), кроки 12—13 — здача. Галочки зберігаються.

    Приватний ключ на сервер не їде. Ніколи. Пара ключів складається з двох файлів: id_ed25519 — приватний, лишається у тебе на комп’ютері; id_ed25519.pub — публічний, його й кладуть на сервер. Якщо на сервері з’явився файл без .pub — ключ скомпрометовано, треба генерувати нову пару.
    Крок 9

    Автоперевірка

    Чекер повторює твій аудит уже без тебе: сам дивиться права, сам шукає секрети, сам звіряє phishing_score з логом тренажера. Спроби не обмежені.

    Демонстраційний режим: результат згенеровано для показу. На сервері ця кнопка викликає POST /api/check, який запускає check 16 від імені учня.

    Що вчитель дивиться на твоєму екрані

    Крок 10

    Шкала виконання

    Це те, що бачить учитель, коли виставляє оцінку.

    СкладникВагаРезультат
    Виконано
    0%
    Рекомендований бал за 12-бальною

    П’ять правил, які варто винести з уроку

    Де найчастіше помиляються на цьому уроці

    Підсумок модуля: що ти вмів у вересні і що вмієш зараз

    На початку року в тебе був логін і порожня тека. Ось що змінилося.

    ТемаБуло на початкуСтало
    Сервер і файлифайли лежали «десь на комп’ютері»працюєш у Linux по SSH, розрізняєш публічне і приватне, читаєш і виставляєш права
    1 · LLM«запитав у нейромережі»будуєш керований промпт, бачиш галюцинації, зберігаєш історію як граф у JSON
    2 · Данітаблиця як розлінований аркушпроєктуєш поля й типи, збираєш дані власною формою, знаєш, чому валідації в HTML замало
    3 · Презентаціяслайд-простирадло з текстом виступубудуєш виступ за структурою, тримаєш контраст 4.5:1, малюєш живі діаграми з data.json
    4 · Комікс«намалювала нейромережа»ведеш канон героя, документуєш промпти, верстаєш панелі й чесно маркуєш AI
    5 · Звук і відеомонтаж кнопками, як вийдепишеш музику кодом і збираєш відео скриптом build.sh, який відтворюваний
    6 · Дашбордцифри переписували рукамибудуєш ETL-конвеєр, ставиш його в cron і читаєш власні логи
    7 · Бот«бот — це магія»описуєш діалог автоматом і розумієш, що таке ін’єкція в промпт
    8 · Командафайли пересилали в чатігілки, pull request, код-рев’ю і деплой, який робиться сам після push
    9 · Безпека«мене це не стосується»проводиш аудит власного акаунта, знаходиш свої ж дірки й закриваєш їх

    Останній рядок — головний. П’ятнадцять уроків ти щось створював. Сьогодні ти вперше подивився на створене очима того, хто шукає слабке місце.

    Тепер ти прочитаєш права на своїй теці. Знайдеш токен у власному коді. Перевіриш, чи не лежать чужі телефони в публічних файлах. Це і є звичка, яку варто лишити собі: перевіряти свою роботу першим.

    Домашнє завдання

    Пройди цей самий чек-лист для свого особистого акаунта — пошти або ігрового. Питання ті самі. Чи унікальний там пароль? Чи ввімкнена двофакторка? Чи не світиться десь твій номер телефону? Чи не приходили тобі листи, які тепер виглядають як фішинг?

    За результатами допиши до пам’ятки шосте правило — своє власне, сформульоване з того, що ти знайшов у себе.

    Джерела

    Звідки взяті числа й формулювання

    Усе на цій сторінці — з документації, стандартів і відкритих рекомендацій. Перевіряти дозволено й корисно.

    Повний список із поясненнями, що саме звідки взято, — у файлі urok-16-джерела.md поруч із цією сторінкою.