Сьогодні ти прибираєш пароль зі свого входу на сервер і вперше пускаєш на нього подію, яку створив не ти, а зовнішній сервіс
| Етап | Хв | Що робимо |
|---|---|---|
| Шок-вступ | 10 | «Стіна атак»: спроби входу за ніч — шукаємо свій логін у списку |
| Пароль проти ключа | 20 | Перебір проти пари «замок-ключ» — де живе приватна частина |
| Майстер SSH-ключа | 30 | Генеруємо ed25519, кладемо в authorized_keys, права 700/600, вхід без пароля |
| Анатомія автоматизації | 15 | Конструктор «тригер → фільтр → трансформація → дія», квоти безкоштовних планів |
| OAuth-скоупи | 10 | Розбираємо реальний екран дозволів, оцінюємо ризик трьох скоупів |
| Сценарій і приймач | 25 | Збираємо Zap/аплет і hook.php, ловимо першу подію в events.jsonl |
| Автоперевірка | 5 | 🔒 ssh_key, ssh_perms — доводимо до зеленого |
| Підсумок | 5 | Питання на наступний урок: «а якщо хтось знає URL вебхука?» |
| Разом | 120 |
Слова «SSH-ключ» і «тригер» поки нічого не означають. Розберемо їх по черзі. А «скоуп» ти вже знаєш із уроку 10. Сьогодні подивишся на нього з іншого боку — на екрані згоди чужого сервісу.
Ліній сьогодні дві, і поруч вони не випадково. Перша — вхід за ключем замість пароля. Друга — автоматизація: чужий сервіс отримує право щось робити від твого імені.
Обидві про одне й те саме. Чим ти доводиш, що це справді ти? І скільки прав віддаєш назовні?
один секрет, який ти знаєш і вводиш
два файли, з яких один нікуди не їде
ed25519 у себе на комп'ютері;~/.ssh/authorized_keys на сервері;700 на теку і 600 на файл;api/hook.php, який ловить подію в ~/data/events.jsonl;/events/ з часом останньої події.api/hook.php, events/index.php
і api/scenario.md. Файл ~/data/events.jsonl пише сам
сервер, і він лежить поза ~/www. Приватний ключ
на сервер не їде ніколи — це і є весь сенс уроку.hook.php приймає подію від будь-кого, хто знає URL.
Це навмисно: наступного уроку ти додаси HMAC-підпис і мітку часу
й побачиш різницю на власному журналі.Не тому, що ти комусь цікавий. Тому що адресу не треба знати — її знаходять суцільним перебором діапазонів
Уяви людину, яка йде вулицею і смикає всі двері підряд. Не тому, що шукала саме твої. Просто якісь виявляться незамкненими.
В інтернеті так само працюють тисячі ботів. Вони стукають у порт 22 кожної адреси підряд і пробують найпоширеніші пари «логін — пароль». Перші спроби приходять уже в першу годину після ввімкнення сервера і не припиняються ніколи.
Логіни в цих спробах завжди ті самі: root, admin,
test, ubuntu, pi, user,
oracle, postgres. Це стандартні акаунти, які
на багатьох машинах справді існують.
/var/log/auth.log тобі
недоступний: він належить root:adm з правами 640,
а sudo учням не видається. Журнал відкриває вчитель на проєкторі.
Тобі доступний свій зріз — команда last, вона читає
/var/log/wtmp. Усі адреси на цій сторінці — з документаційних
діапазонів RFC 5737, вони навмисно нічиї.Головне тут не кількість. Головне — що кожна з цих спроб перевіряє саме пароль.
Поки на сервері ввімкнено вхід за паролем, ця стіна має сенс. Колись
хтось поставить qwerty123, і бот його знайде. Ключ вимикає
всю гру: підбирати стає нічого.
Твій сервер працює три дні. Адресу ти не давав нікому, сайт не індексується,
посилань на нього немає. У журналі — 4 187 рядків Failed password.
Як боти взагалі дізналися, що машина існує?
Не тому, що «пароль слабкий». Тому що в пароля чотири вроджені вади, і жодна не лікується довжиною
| Вада пароля | Що це означає на практиці |
|---|---|
| його можна вгадати | бот не перебирає всі варіанти — він починає зі списку вже відомих паролів; там уже є твій, якщо він не випадковий |
| він у тебе в голові, тому короткий | людина не запам'ятає 40 випадкових символів, а ключ їй запам'ятовувати й не треба |
| він однаковий скрізь | витік із будь-якого форуму, де ти реєструвався, — і пароль до сервера відомий даром |
| ти його вводиш | через плече, кейлогер, чужа клавіатура, автозаповнення, скріншот, історія команд |
Порівняємо чесно. Припустимо, що бот встигає 10 спроб на секунду по одному серверу. Для нього це дуже щедро.
Насправді sshd за замовчуванням дає лише 6 спроб на одне
з'єднання — параметр MaxAuthTries 6. Далі боту доводиться
підключатися наново, і це коштує часу.
Однокласник рахує: «У мене пароль — 8 випадкових малих літер. Це двісті мільярдів варіантів, підбирати роками. Навіщо мені ключ?» Де діра в його міркуванні?
Один файл лишається в тебе назавжди, другий можна друкувати на футболці. Уся конструкція тримається саме на цій асиметрії
Уяви замок і ключ до нього. Замок можна повісити на видноті: він нікому нічого не відчиняє. Ключ ти носиш при собі й нікому не даєш.
Команда ssh-keygen робить одразу два файли, і вони
математично пов'язані. З приватного можна порахувати публічний. З публічного
приватний — ні, і саме на цьому все стоїть.
Спочатку клієнт і сервер домовляються, як шифрувати саме з'єднання. Цей обмін зветься протоколом Діффі — Гелмана.
У підсумку обидва отримують спільне число — ідентифікатор сеансу. Воно унікальне для цього підключення й більше ніколи не повториться. Тільки після цього починається перевірка, хто ти такий.
petro, хочу зайти ось цим публічним ключем»;~/.ssh/authorized_keys. Немає — розмова закінчена;ed25519 — алгоритм підпису,
він не має операції шифрування взагалі. У реальному SSH сервер надсилає
дані для підпису, а не шифротекст (RFC 4252, розділ 7). Різниця не косметична:
саме тому в підпис входить ідентифікатор сеансу — щоб чужий сервер
не міг переслати твій підпис далі.Ти виклав файл id_ed25519.pub у публічний репозиторій
на GitHub — щоб не загубити. Наскільки це погано?
Команда коротка, але кожен її параметр — це рішення, яке потім не переграєш
-t rsa -b 4096.authorized_keys звідки. Пиши «хто@яка машина + місяць».ssh-agent, який тримає розшифрований ключ у пам'яті
до перезавантаження. Тоді фразу вводиш раз на день.
Формат нового ключа шифрує файл через bcrypt-KDF, за замовчуванням
16 раундів — це навмисно повільно, щоб перебір фрази коштував дорого.BEGIN OPENSSH PRIVATE KEY.
Ключі на схемі — вигадані, справжній base64 тут не потрібен.ssh-keygen там,
приватна частина народилася на спільній машині. Там живуть ще 60 акаунтів,
а сам файл потрапляє в резервні копії сервера. Уся ідея «приватне не залишає мій
комп'ютер» зникає в цю ж секунду. Генеруй локально — і тільки локально.Учень зайшов на сервер по паролю, там виконав ssh-keygen,
додав ключ у authorized_keys і тепер заходить без пароля.
Формально працює. Що з цим не так?
Файл ~/.ssh/authorized_keys — це просто список
рядків. Один рядок — один дозволений ключ
Найпростіший спосіб — команда ssh-copy-id. Вона сама створить
теку, сама допише рядок у кінець файлу і сама поставить права. Пароль ти
вводиш тут востаннє.
Другий рядок тут важливіший за перший. Ключ
-o PasswordAuthentication=no забороняє клієнту питати
пароль.
Без нього буває так. Ключ насправді не спрацював, ssh тихо
перейшов на пароль, ти його ввів — і вирішив, що все налаштовано. Ця команда
не дає себе обдурити.
ssh-copy-id
Клієнт ssh у Windows 10/11 є, а от ssh-copy-id
до нього не входить. Роби вручну — одним рядком, який усе створить
і одразу виставить права.$pub = Get-Content "$env:USERPROFILE\.ssh\id_ed25519.pub" -Raw ssh ТВІЙ-ЛОГІН@91.219.61.4 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && echo '$pub' >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
Тут && усередині лапок виконує вже
віддалений bash на сервері, а не PowerShell — тому воно працює.
Пам'ятай різницю: у самому PowerShell 5.1 && між командами
не існує, там пишуть команда; if ($?) { наступна }.
Навколо прав на ~/.ssh ходить багато неточностей.
Розберемо чесно, бо ти це перевіриш і побачиш розбіжність.
755 на ~/.ssh вхід не ламають —
і ти це перевіриш. Ми все одно вимагаємо 700: на машині,
де 60+ акаунтів, немає причини давати сусідам навіть право читати список
твоїх ключів. Це гігієна й вимога критерію, а не технічна відмова.777 справді неприпустимо
Право запису для «інших» на ~/.ssh — це дозвіл будь-якому
учневі на цьому сервері. Він може дописати свій публічний ключ у твій
authorized_keys — і заходити під тобою. Сервер це розуміє
й відмовляється працювати з такою текою взагалі. Саме тому
chmod -R 777 ~ «щоб FTP не лаявся» ламає вхід за ключем.Учень виконав chmod -R 777 ~, «щоб FTP не лаявся на права».
Вхід за ключем після цього перестав працювати: сервер знову питає пароль,
хоча authorized_keys на місці й рядок у ньому правильний. Чому?
Обери спосіб входу і ситуацію. Сторінка покаже рукостискання
крок за кроком і те, що після нього залишиться в auth.log
Значення maxretry = 5, findtime = 10m
і bantime = 10m у лічильнику — це значення з поставки
fail2ban (секція [DEFAULT] у jail.conf).
На реальному сервері їх міняють у jail.local.
PasswordAuthentication — це не твоє налаштування
Вимикає вхід за паролем адміністратор сервера, і sudo вам не видано.
Тут він для того, щоб ти побачив наслідок. Коли пароль вимкнено, бот отримує
відмову ще до першої спроби вгадування. А разом із ботом — і ти,
якщо забув поставити ключ.Учень скопіював у authorized_keys вміст файлу
id_ed25519 — без .pub. Що станеться при вході
і що з цим тепер робити?
auth.log: анатомія рядкаОдин рядок журналу відповідає на п'ять питань одразу: коли, хто, звідки, чим і чи пустили
SHA256:…,
яку показує ssh-keygen -lf. Тому після компрометації
ти зможеш перевірити, чи заходив хтось саме тим ключем.| Рядок | Що сталося |
|---|---|
Accepted publickey for … | вхід за ключем відбувся; далі — відбиток ключа |
Accepted password for … | вхід за паролем відбувся. На сервері, де мали лишитися тільки ключі, це тривожний рядок |
Failed password for … | акаунт існує, пароль не підійшов |
Invalid user admin from … | такого акаунта на сервері немає взагалі — типова робота бота |
Connection closed by authenticating user … [preauth] | відключилися, не пройшовши автентифікацію: вичерпали спроби або передумали |
Authentication refused: bad ownership or modes for directory … | права на теку або файл дозволяють запис чужим; сервер ключ не читає |
NOTICE [sshd] Ban … | це вже не sshd, а fail2ban: адресу заблоковано |
Перед тобою 20 рядків із однієї ночі. Познач кожен рядок: сервер пустив, сервер не пустив, або рядок узагалі не про вхід. Клікай по рядку, щоб перемкнути мітку.
У журналі за ніч — 3 000 рядків Failed password for root
з десятка адрес. І один рядок: Accepted password for petro
from 203.0.113.77 о 03:40. Що з цього тривожніше й чому?
У фрагменті вище о 07:58 сервер спочатку відмовив ключу, а через три секунди пустив за паролем. Який рядок пояснює причину і що саме треба виправити?
Пароль — це те, що ти знаєш. Ключ — це файл. Файл не міняють, файл відкликають
Коли витікає пароль, ти вводиш новий, і старий перестає діяти в ту саму секунду. Бо пароль на сервері один, і перевіряється він за одним записом.
Із ключем усе інакше. Сервер пускає кожен рядок з
authorized_keys. Поки твій втрачений рядок там лежить, він
працює. Зміна пароля на це не впливає ніяк.
authorized_keys — на всіх серверах;І окремо про парольну фразу. Вона не рятує ключ, але дає час. Викрадений файл без фрази — це готовий доступ прямо зараз.
З фразою зловмисникові доведеться її підбирати. Формат ключа навмисно робить кожну спробу повільною. Ключ ми однаково міняємо — просто без паніки.
Ти скопіював свій приватний ключ id_ed25519 на шкільний
комп'ютер у кабінеті, щоб зайти на сервер прямо з уроку. Усе спрацювало.
Що тепер треба зробити і чому саме це?
Той самий ключ був із парольною фразою. Це щось міняє в порядку дій?
Zapier і IFTTT не вміють нічого, чого не вміє звичайний скрипт. Вони вміють інше: чекати подію цілодобово замість тебе
Будь-який сценарій автоматизації складається з трьох частин. Перша — тригер: подія, на яку сервіс чекає цілодобово. Наприклад, хтось надіслав твою форму.
Друга — фільтр: умова, за якою більшість подій відсівається. Без нього тобі прилетить кожна дрібниця, і журнал стане непридатним.
Третя — дія: що зробити з подіями, які пройшли фільтр. Наприклад, надіслати їх на твій сервер.
scenario.md.Безкоштовні тарифи не «повільніші» — вони закінчуються. І закінчуються тихо: сценарій просто перестає спрацьовувати.
Лист про це або приходить на пошту, яку ти не читаєш, або не приходить узагалі. Дізнаєшся ти сам, коли помітиш порожній журнал.
| Безкоштовний тариф | Zapier | IFTTT |
|---|---|---|
| скільки сценаріїв | необмежено | 2 аплети |
| скільки спрацювань | 100 задач на місяць | без обмеження запусків |
| кроків у сценарії | 2 (тригер + дія) | 1 дія |
| як швидко реагує | опитування раз на 15 хв | стандартна швидкість |
| вебхук на свій сервер | недоступний: Webhooks — платний застосунок | недоступний: сервіс Webhooks лише в Pro |
hook.php: в обох вебхуки винесені в платні плани.
Тому сценарій ти все одно будуєш і показуєш у сервісі по-справжньому:
тригер, фільтр, історію запусків. А самі події на свій сервер надсилаєш
через Google Apps Script. Ти вже вмієш його з уроку 3, і робить
він те саме — безкоштовно.function onFormSubmit(e) {
var v = e.namedValues;
// 2. Фільтр: пропускаємо далі лише свій клас
if (String(v['Клас']) !== '10А') return;
// 3. Дія: POST на власний приймач
UrlFetchApp.fetch('http://91.219.61.4/s/ТВІЙ-ЛОГІН/api/hook.php', {
method: 'post',
contentType: 'application/json',
payload: JSON.stringify({
source: 'apps-script',
type: 'form',
title: String(v['Назва гуртка'])
}),
muteHttpExceptions: true
});
}
Тарифи змінюються — таблицю вище перевірено у вересні 2026
за сторінками zapier.com/pricing і ifttt.com/plans.
Перед уроком відкрий їх сам: якщо число інше, вір сайту, а не сторінці.
Твій сценарій відпрацював сотий раз 12 числа й до кінця місяця мовчить. Коли ти про це дізнаєшся?
Коли ти тиснеш «Дозволити», зовнішній сервіс отримує токен і зберігає його в себе. Далі все залежить від того, що цим токеном можна
На екрані згоди написано, що саме сервіс проситиме робити. Цей перелік дозволених дій ти вже зустрічав на уроці 10 — це скоуп (scope). Там ти сам звужував його до read-only. Тут скоуп просить чужий сервіс, а звужуєш його все одно ти.
Сервіси люблять просити з запасом. Один широкий скоуп простіший у розробці, ніж три вузьких. Твоє завдання — прочитати рядки й порівняти їх із тим, що сценарію справді потрібно.
| Що просять | Що це насправді дозволяє | Оцінка |
|---|---|---|
drive.file«доступ до файлів, які створив цей застосунок» | бачить лише свої файли й ті, які ти сам йому відкрив. Решта Диска для нього не існує | розумно |
spreadsheets.readonly«перегляд твоїх таблиць» | читає всі таблиці, але нічого не змінює й не видаляє | прийнятно |
drive«перегляд, зміна і видалення всіх файлів на Диску» | усе. Фотографії, домашні роботи, документи батьків у спільних теках | надлишково |
gmail.readonly«читання всієї пошти» | уся пошта, включно з листами відновлення пароля з інших сайтів | небезпечно |
Правило просте: сервіс не повинен мати більше прав, ніж потрібно його сценарію. Це той самий принцип найменших привілеїв, що й на уроці 10.
Різниця лише в тому, кого він тепер стосується. Там ішлося про твій власний скрипт, тут — про чужу компанію на іншому кінці світу.
Сервіс автоматизації на екрані згоди просить «перегляд, зміна і видалення всіх файлів на Google Диску». Твоєму сценарію треба читати одну таблицю з результатами опитування. Що робити?
hook.php і журнал подійЗовнішній сервіс присилає JSON. Твоє завдання — прийняти, обрізати, записати рядок і не впасти на будь-якому смітті
Формат журналу — JSONL: один рядок дорівнює одному повному JSON-об'єкту. Такий файл легко дописувати в кінець і легко читати частинами.
Великий JSON-масив довелося б щоразу перечитувати цілком. Тут — ні: новий рядок просто лягає в кінець.
<?php
declare(strict_types=1);
// 1. Приймаємо тільки POST і тільки розумного розміру
$raw = file_get_contents('php://input');
if ($_SERVER['REQUEST_METHOD'] !== 'POST' || strlen($raw) > 8192) {
http_response_code(405);
exit('method not allowed');
}
// 2. Битий JSON не повинен валити сервіс
$data = json_decode($raw, true);
if (!is_array($data)) {
http_response_code(400);
exit('bad json');
}
// 3. Беремо лише відомі поля й обрізаємо довжину
$event = [
'ts' => gmdate('c'),
'source' => substr((string)($data['source'] ?? 'unknown'), 0, 40),
'type' => substr((string)($data['type'] ?? 'event'), 0, 40),
'title' => substr((string)($data['title'] ?? ''), 0, 200),
];
// 4. Пишемо ПОЗА веб-корінням: ~/www/api/ -> на два рівні вгору -> ~/data/
$path = dirname(__DIR__, 2) . '/data/events.jsonl';
$line = json_encode($event, JSON_UNESCAPED_UNICODE) . "\n";
file_put_contents($path, $line, FILE_APPEND | LOCK_EX);
http_response_code(200);
header('Content-Type: application/json');
echo json_encode(['ok' => true]);
~/www/api → ~/www → ~. Так журнал гарантовано лежить поза www, і не залежить від того, з якої теки запущено PHP.events.jsonl
вже зараз лежить поза ~/www: щоб хоча б читати його
не міг ніхто сторонній.{"ts":"2026-09-02T08:41:07+00:00","source":"apps-script","type":"form","title":"Заявка на гурток робототехніки"}
{"ts":"2026-09-02T09:15:52+00:00","source":"apps-script","type":"form","title":"Заявка на гурток 3D-друку"}
{"ts":"2026-09-02T11:02:30+00:00","source":"ifttt","type":"weather","title":"Завтра дощ: нагадати про парасольку"}
{"ts":"2026-09-02T12:47:11+00:00","source":"unknown","type":"event","title":""}
Останній рядок — це чийсь порожній POST на твою адресу. Він валідний, тому й записався.
Такі рядки варто рахувати окремо. Їхня кількість показує, наскільки твій приймач відкритий цілому світу.
curl.exe, а не curl
У Windows PowerShell 5.1 curl — це псевдонім
Invoke-WebRequest, і ключі -X, -H,
-d там означають зовсім інше. Повне ім'я
curl.exe викликає справжній curl, який є у Windows 10/11.# Сценарій автоматизації **Кейс.** Навіщо це взагалі потрібно, одним реченням. | Частина | Що саме | |---|---| | Тригер | нова відповідь у формі «Запис у гурток» | | Фільтр | поле «Клас» = 10А, поле «Гурток» не порожнє | | Дія | POST JSON на http://91.219.61.4/s/<логін>/api/hook.php | | Сервіс | Zapier / IFTTT / Apps Script — що саме використано | ## Квоти мого тарифу - ліміт: ... задач або аплетів - як часто опитується тригер: ... - що буде, коли ліміт вичерпається: ... ## Як цей сценарій може зламатися тихо 1. ... 2. ... ## Як я про це дізнаюсь Сторінка /events/ показує час останньої події. Якщо він старший за добу — ...
Ти надіслав на свій hook.php тіло {{{
замість JSON. Що має статися правильно написаним приймачем?
Кроки 1—9 — у себе на комп'ютері й на сервері по SSH.
Кроки 10—11 — у сервісі автоматизації. По FTP їдуть три файли:
api/hook.php з кроку 12, events/index.php
з кроку 15 і api/scenario.md з кроку 16.
Галочки зберігаються
id_ed25519 (без .pub) не потрапляє нікуди.
Ні на сервер, ні в ~/upload/, ні в репозиторій. Ні у ваш
класний чат, ні на флешку, яку ви передаєте по колу. Якщо він там опинився —
ключ вважається скомпрометованим, і ти робиш крок 9 цієї сторінки.Чекер заходить на сервер твоїм ключем, дивиться права, шукає приватний ключ і надсилає тестову подію. Спроби не обмежені
Демонстраційний режим: результат згенеровано для показу.
На сервері ця кнопка викликає POST /api/check, який запускає
/opt/lessons/11/check.sh від імені учня.
ssh -o PasswordAuthentication=no;ls -l ~/.ssh у тебе локально: що приватний
ключ на місці й має права 600;scenario.md — і просить назвати два способи,
якими сценарій може зламатися тихо.Це те, що бачить учитель, коли виставляє оцінку.
| Складник | Вага | Результат |
|---|
authorized_keys;777 на ~/.ssh дозволяє сусідові дописати свій ключ,
тому сервер відмовляється працювати з такою текою;authorized_keys вставлено вміст приватного ключа:
рядок починається з -----BEGIN — це аварія, ключ міняємо;authorized_keys набрано в nano з переносом
рядка посеред base64 — вхід не працює, а помилки не видно:
сервер просто мовчки просить пароль;ssh без
-o PasswordAuthentication=no: клієнт тихо перейшов на пароль,
а учень вирішив, що ключ працює;chmod -R 777 ~ «щоб FTP не лаявся» — і вхід за ключем ліг;events.jsonl покладено в ~/www/data/ —
весь журнал подій віддається по HTTP усьому світу;scenario.md записано «ліміт великий, вистачить» замість
конкретного числа з тарифу.Опиши в ~/www/api/scenario.md два способи, якими твій
сценарій може зламатися тихо. Тобто перестати працювати так, що помилки
ніхто не побачить. Для кожного напиши, як саме ти про це дізнаєшся.
Підказки, куди дивитися. Скінчилася квота тарифу. Токен доступу
відкликали або в нього минув термін. Сервіс перейменував поле у формі.
Твій сервер відповів 500, а сервіс не повторив спробу.
Другим абзацом додай, що робитимеш, якщо завтра зникне доступ до ноутбука з приватним ключем. Як зайдеш на сервер і як відкличеш втрачений ключ.
Усі розрахунки часу підбору з кроку 3 можна перевірити калькулятором: припущення про швидкість написані просто на схемі
ssh-ed25519 в SSH; звідси
постійний префікс рядка публічного ключа.
rfc-editor.org/rfc/rfc8709ssh-keygen(1) — ключі -t, -C,
-l, -f і -a rounds
(кількість раундів KDF для парольної фрази, за замовчуванням 16).
man.openbsd.org/ssh-keygen.1sshd(8), розділ AUTHORIZED_KEYS FILE FORMAT —
формат рядка й вимоги до прав; там же описано, що StrictModes
перевіряє право запису для групи та інших.
man.openbsd.org/sshd.8sshd_config(5) — значення за замовчуванням:
StrictModes yes, MaxAuthTries 6,
PubkeyAuthentication yes, PermitRootLogin prohibit-password.
man.openbsd.org/sshd_config.5fail2ban, файл jail.conf — значення
з поставки в секції [DEFAULT]: bantime = 10m,
findtime = 10m, maxretry = 5. Саме вони
в симуляторі кроку 7.
github.com/fail2ban/fail2ban192.0.2.0/24,
198.51.100.0/24 і 203.0.113.0/24 зарезервовані
для документації. Усі адреси на цій сторінці взято звідти, вони нічиї.
rfc-editor.org/rfc/rfc5737rockyou.txt
зі збірки SecLists містить близько 14,3 млн паролів. Число взято
як порядок величини для схеми кроку 3, а не як точну характеристику
конкретного бота.
github.com/danielmiessler/SecListslast(1) — команда читає /var/log/wtmp
і доступна звичайному користувачеві; /var/log/auth.log
натомість належить root:adm. Перевір у себе:
ls -l /var/log/auth.log /var/log/wtmp.
man7.org · last(1)Webhooks by Zapier
належить до платних (premium) застосунків.
Перевірено у вересні 2026.
zapier.com/pricingWebhooks і багатокрокові аплети — лише в Pro і Pro+.
Перевірено у вересні 2026.
ifttt.com/plansdrive.file,
drive, spreadsheets.readonly,
gmail.readonly.
developers.google.com · OAuth scopesUrlFetchApp — метод
fetch() і параметри method,
contentType, payload,
muteHttpExceptions із плану Б у кроці 10.
developers.google.com · UrlFetchAppfile_put_contents — прапорці
FILE_APPEND і LOCK_EX, якими дописується
рядок у events.jsonl.
php.net · file_put_contents&& у Windows PowerShell 5.1 —
чому curl там є псевдонімом Invoke-WebRequest
і чому оператор && між командами недоступний.
learn.microsoft.com · Invoke-WebRequestПовний список із поясненнями, що звідки взято і що є
ілюстративним прикладом, — у файлі urok-11-джерела.md
поруч із цією сторінкою.