Lab 9: Криптографія¶
Завдання¶
Після виконання цієї лабораторної роботи ви зможете:
- застосовувати криптографічні концепції для захисту даних і зв'язку
Приблизний час виконання цієї лабораторної роботи: 120 хвилин
Троє можуть зберігати таємницю, якщо двоє з них мертві...
-- Benjamin Franklin
Загальні терміни та визначення криптографії¶
Криптографія¶
У загальному повсякденному вживанні криптографія — це дія або мистецтво написання таємними символами. На технічному жаргоні це можна визначити як науку про використання математики для шифрування та дешифрування даних.
Криптоаналіз¶
Криптоаналіз — це дослідження того, як скомпрометувати (подолати) криптографічні механізми. Це наука про злом коду, декодування секретів, порушення схем автентифікації та загалом зламу криптографічних протоколів.
Криптологія¶
Криптологія - це дисципліна, яка складається з криптографії та криптоаналізу. Криптологія — розділ математики, що вивчає математичні основи криптографічних методів.
Шифрування¶
Шифрування перетворює дані у форму, яку майже неможливо прочитати без відповідних знань (наприклад, ключа). Його метою є забезпечення конфіденційності, зберігаючи інформацію прихованою від будь-кого, для кого вона не призначена.
Розшифровка¶
Дешифрування є протилежністю шифруванню; він перетворює зашифровані дані в зрозумілу форму.
Шифр¶
Метод шифрування і дешифрування називається шифром.
Хеш-функції (алгоритми дайджесту)
Криптографічні хеш-функції використовуються в різних контекстах, наприклад, для обчислення дайджесту повідомлення під час створення цифрового підпису. Хеш-функція стискає біти повідомлення до хеш-значення фіксованого розміру, щоб рівномірно розподілити можливі повідомлення між можливими хеш-значеннями. Криптографічна хеш-функція робить це таким чином, що надзвичайно ускладнює створення повідомлення, яке хешує до певного хеш-значення. Нижче наведено кілька прикладів найвідоміших і найпоширеніших хеш-функцій.
a) - SHA-1 (Secure Hash Algorithm) -Це криптографічний алгоритм хешування, опублікований урядом Сполучених Штатів. Він створює 160-бітне хеш-значення з рядка довільної довжини. Вважається, що це дуже добре.
b)- MD5 (Message Digest Algorithm 5) - це криптографічний алгоритм хешування, розроблений у RSA Laboratories. Його можна використовувати для хешування байтового рядка довільної довжини до 128-бітного значення.
Алгоритм¶
Він описує покрокову процедуру розв’язування задачі, особливо усталену, рекурсивну обчислювальну процедуру для розв’язання задачі за кінцеву кількість кроків. Технічно алгоритм повинен досягти результату після кінцевої кількості кроків. Ефективність алгоритму можна виміряти як кількість елементарних кроків, необхідних для вирішення проблеми. Існує два класи алгоритмів на основі ключів. Це:
**a) **-- Симетричні алгоритми шифрування (secret-key)
Симетричні алгоритми використовують один і той самий ключ для шифрування та дешифрування (або ключ дешифрування легко отримати з ключа шифрування). Алгоритми із секретним ключем використовують один і той самий ключ для шифрування та дешифрування (або один легко вивести з іншого). Це більш простий підхід до шифрування даних, він математично менш складний, ніж криптографія з відкритим ключем. Симетричні алгоритми можна розділити на потокові шифри та блочні шифри. Потокові шифри можуть шифрувати один біт відкритого тексту за раз, тоді як блочні шифри беруть кілька бітів (зазвичай 64 біти в сучасних шифрах) і шифрують їх як єдине ціле. Симетричні алгоритми набагато швидше виконуються на комп’ютері, ніж асиметричні.
Прикладами симетричних алгоритмів є AES, 3DES, Blowfish, CAST5, IDEA та Twofish.
b) -- Асиметричні алгоритми (алгоритми з відкритим ключем)
Асиметричні алгоритми, з іншого боку, використовують різні ключі для шифрування та дешифрування, і ключ дешифрування не може бути отриманий з ключа шифрування. Асиметричні шифри дозволяють ключу шифрування бути відкритим, дозволяючи будь-кому шифрувати за допомогою ключа, тоді як лише відповідний одержувач (який знає ключ розшифровки) може розшифрувати повідомлення. Ключ шифрування також називається відкритим ключем, а ключ дешифрування – закритим або секретним ключем.
RSA, ймовірно, найвідоміший алгоритм асиметричного шифрування.
Цифровий підпис¶
Цифровий підпис прив’язує документ до власника певного ключа.
Цифровий підпис документа — це частина інформації, яка базується як на документі, так і на закритому ключі підписувача. Зазвичай він створюється за допомогою хеш-функції та функції приватного підпису (шифрування за допомогою закритого ключа підписувача). Цифровий підпис — це невелика кількість даних, створена за допомогою певного секретного ключа, і відкритий ключ можна використовувати для перевірки того, що підпис було згенеровано за допомогою відповідного закритого ключа.
Кілька методів створення та перевірки цифрових підписів доступні у вільному доступі, але найвідомішим є алгоритм відкритого ключа RSA.
Криптографічні протоколи¶
Криптографія працює на багатьох рівнях. На одному рівні у вас є алгоритми, такі як блокові шифри та криптосистеми з відкритим ключем. Спираючись на них, ви отримуєте протоколи, а на основі протоколів ви знаходите програми (або інші протоколи). Нижче наведено список типових щоденних програм, які використовують криптографічні протоколи. Ці протоколи побудовані на основі криптографічних алгоритмів нижчого рівня.
i.) Безпека сервера доменних імен (DNSSEC)
Це протокол для безпечних розподілених служб імен. Наразі він доступний як чернетка в Інтернеті.
ii.) Захищений сокетний шар (SSL)
SSL — це один із двох протоколів, які використовуються для безпечних WWW-з’єднань (інший — SHTTP). Безпека WWW стала необхідною, оскільки все більша кількість конфіденційної інформації, такої як номери кредитних карток, передається через Інтернет.
iii.) Протокол безпечної передачі гіпертексту (SHTTP)
Це ще один протокол для забезпечення більшої безпеки для транзакцій WWW.
iv.) Безпека електронної пошти та пов'язані з нею послуги
GnuPG - GNU Privacy Guard — відповідає запропонованому інтернет-стандарту OpenPGP, описаному в RFC2440.
v.) Протокол SSH2
Цей протокол є універсальним для потреб Інтернету та зараз використовується в програмному забезпеченні SSH2. Протокол використовується для захисту термінальних сеансів і TCP-з'єднань.
У наступних вправах розглядаються дві програми, які використовують криптографічні протоколи - GnuPG і OpenSSH.
Завдання 1¶
GnuPG¶
GnuPG (GNU Privacy Guard) — це набір програм для шифрування з відкритим ключем і цифрових підписів. Інструменти можна використовувати для шифрування даних і створення цифрових підписів. Він також включає розширений засіб керування ключами. GnuPG використовує криптографію з відкритим ключем, щоб дозволити користувачам безпечно спілкуватися.
Виконайте наступні вправи як звичайний користувач. напр. користувач ying
Щоб створити нову пару ключів¶
-
Увійдіть в систему як користувач «ying»
-
Переконайтеся, що пакет GnuPG встановлено у вашій системі. Впишіть:
[ying@serverXY ying]$ rpm -q gnupg gnupg-*.*
Якщо це не так, попросіть суперкористувача встановити його.
-
Перерахуйте та запишіть усі приховані каталоги у вашому домашньому каталозі.
-
Перелічіть ключі, які зараз є у вашому keyring. Впишіть:
[ying@serverXY ying]$ gpg --list-keys
!!! note
У вашій зв'язці ключів ще не повинно бути жодних ключів. Але наведена вище команда також допоможе створити середовище за замовчуванням, яке дозволить вам успішно створити нову пару ключів з першого разу.
!!! question "Лабораторні завдання:"
```
Знову перелічіть приховані каталоги у вашому домашньому каталозі. Як називається новий доданий каталог?
```
-
Використовуйте програму gpg для створення нових пар ключів. Впишіть:
[ying@serverXY ying]$ gpg --gen-key ...................................... gpg: keyring `/home/ying/.gnupg/secring.gpg' created gpg: keyring `/home/ying/.gnupg/pubring.gpg' created Please select what kind of key you want: (1) DSA and ElGamal (default) (2) DSA (sign only) (5) RSA (sign only) Your selection? 1
У запиті типу ключа, який ви хочете створити, прийміть значення за замовчуванням, тобто (DSA та ElGamal). Впишіть 1
!!! warning
Варіант (1) створить для вас дві пари ключів. Пара ключів DSA буде первинною парою ключів — для створення цифрових підписів, а підпорядкована пара ключів ELGamel — для шифрування даних.
-
Ви створите розмір ключа ELG-E 1024. Знову прийміть значення за замовчуванням у запиті нижче:
DSA key pair will have 1024 bits. About to generate a new ELG-E key pair. minimum key size is 768 bits default key size is 1024 bits highest suggested key size is 2048 bits What key size do you want? (1024) 1024 -
Створіть ключі, термін дії яких закінчиться через рік. Введіть «1y» у рядку нижче:
Please specify how long the key should be valid.
0 = key does not expire
++"n"++ = key expires in n days
++"n"+"w"++ = key expires in n weeks
++"n"+"m"++> = термін дії ключа закінчується через n місяців
++"n"+"y"++ = key expires in n years
Key is valid for? (0) 1y
-
Введіть «y», щоб прийняти термін придатності, показаний у запиті:
Is this correct (y/n)? y -
Створіть ідентифікатор користувача, щоб ідентифікувати свій ключ за допомогою:
You need a User-ID to identify your key; the software constructs the user id
from Real Name, Comment and Email Address in this form:
"Ім'я Прізвище (будь-який коментар) yourname@serverXY&"
Real name: Ying Yang Enter
Comment : my test Enter
Email address: ying@serverXY Enter
У запиті підтвердження введіть «o» (Добре), щоб прийняти правильні значення.
You selected this USER-ID:
"Ying Yang (my test) ying@serverXY"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
-
Виберіть парольну фразу, яку ви НЕ забудете під час наступного запиту:
Enter passphrase: ** Repeat passphrase: **
Завдання 2¶
Адміністрування ключів¶
Програма gpg також використовується для адміністрування ключів.
Відобразити перелік ваших ключів¶
-
Увійдіть в систему як користувач ying. Покажіть ключі у вашому key-ring. Впишіть:
[ying@serverXY ying]$ gpg --list-keys gpg: WARNING: using insecure memory! /home/ying/.gnupg/pubring.gpg ----------------------------- pub 1024D/1D12E484 2003-10-16 Ying Yang (my test) <ying@serverXY> sub 1024g/1EDB00AC 2003-10-16 [expires: 2004-10-15] -
Щоб придушити дещо дратівливе «попередження» про «незахищену пам’ять», додайте наступний параметр до вашого особистого файлу конфігурації gpg. Впишіть:
[ying@serverXY ying]$ echo "no-secmem-warning" >> ~/.gnupg/gpg.conf -
Виконайте команду, щоб знову вивести ваші ключі. Переконайтеся, що ваші зміни діють.
-
Перерахуйте свої ключі разом із їхніми підписами. Впишіть:
[ying@serverXY ying]$ gpg --list-sigs /home/ying/.gnupg/pubring.gpg -
Перелічіть лише свої секретні ключі. Впишіть:
[ying@serverXY ying]$ gpg --list-secret-keys /home/ying/.gnupg/secring.gpg ----------------------------- sec 1024D/1D12E484 2003-10-16 Ying Yang (my test) <ying@serverXY> ssb 1024g/1EDB00AC 2003-10-16 -
Відобразити ключові відбитки пальців. Впишіть:
[ying@serverXY ying]$ gpg --fingerprint /home/ying/.gnupg/pubring.gpg ----------------------------- pub 1024D/1D12E484 2003-10-16 Ying Yang (my test) <ying@serverXY> Key fingerprint = D61E 1538 EA12 9049 4ED3 5590 3BC4 A3C1 1D12 E484 sub 1024g/1EDB00AC 2003-10-16 [expires: 2004-10-15] <span id="anchor-2"></span>Revocation certificates Revocation certificates are used to revoke keys in case someone gets knowledge of your secret key or in case you forget your passphrase. They are also useful for other various functions.
Щоб створити сертифікат про відкликання¶
-
Увійшовши як користувач ying. Створіть свідоцтво про відкликання. Він буде відображатися на стандартному виводі. Впишіть:
[ying@serverXY ying]$ gpg --gen-revoke ying@serverXY
Дотримуйтесь підказок і введіть свою парольну фразу, коли буде запропоновано це зробити.
- Тепер створіть сертифікат відкликання, який зберігатиметься у форматі ASCII у файлі під назвою -
“revoke.asc”. Впишіть:
```bash
[ying@serverXY ying]$ gpg --output revoke.asc --gen-revoke ying@serverXY
```
- Ви повинні зберігати свідоцтво про відкликання в безпечному місці та навіть зробити роздруковану копію.
Експорт відкритих ключів¶
Вся суть усього цього бізнесу шифрування, підписання та дешифрування полягає в тому, що люди хочуть спілкуватися один з одним, але вони також хочуть робити це якомога безпечнішим способом.
З огляду на це - можливо, не настільки очевидне слід сказати:
Ви повинні обмінюватися відкритими ключами, щоб спілкуватися з іншими людьми за допомогою криптосистеми на основі відкритого ключа.
Або принаймні зробіть свій відкритий ключ доступним у будь-якому загальнодоступному місці (рекламні щити, веб-сторінки, сервери ключів, радіо, ТБ, СПАМ через електронну пошту тощо)
Щоб експортувати ваші відкриті ключі¶
-
Експортуйте свій відкритий ключ у двійковому форматі у файл під назвою «ying-pub.gpg». Впишіть:
[ying@serverXY ying]$ gpg --output ying-pub.gpg --export <your_key’s_user_ID>
!!! note
Будь ласка, замініть <your_key’s_user_ID> будь-яким рядком, який правильно ідентифікує ваші ключі. У нашій системі-прикладі це значення може бути будь-яким із наведених нижче:
ying@serverXY, ying, yang
Або
The actual key ID - 1D12E484
- Експортуйте відкритий ключ у файл під назвою «ying-pub.asc». Але цього разу згенеруйте його
ASCII-броньований формат. Впишіть:
```bash
[ying@serverXY ying]$gpg --output ying-pub.asc --armor --export ying@serverXY
```
-
Використовуйте команду cat, щоб переглянути двійкову версію відкритого ключа ying (ying-pub.gpg)
-
Щоб скинути налаштування терміналу, введіть:
reset -
Використовуйте команду cat, щоб переглянути версію ASCII відкритого ключа ying (ying-pub.asc)
-
Ви помітите, що версія ASCII більше підходить для розміщення на веб-сторінках або спаму тощо.
Завдання 3¶
Цифрові підписи¶
Для створення та перевірки підписів використовується пара відкритий/приватний ключ, яка відрізняється від шифрування та дешифрування. Використання закритого ключа підписувача для створення підпису полегшує перевірку за допомогою відповідного відкритого ключа.
Щоб підписати файл цифровим підписом¶
-
Створіть файл із назвою «secret-file.txt» із текстом «Hello All». Впишіть:
[ying@serverXY ying]$ echo "Hello All" > secret1.txt -
Використовуйте cat для перегляду вмісту файлу. Використовуйте команду file, щоб побачити тип файлу.
-
Тепер підпишіть файл своїм цифровим підписом. Впишіть:
[ying@serverXY ying]$ gpg -s secret1.txt
Введіть свою парольну фразу, коли буде запропоновано.
Наведена вище команда створить ще один файл «secret1.txt.gpg», який буде стиснутий і до якого додано підпис. Виконайте команду «file» для файлу, щоб перевірити це. Перегляньте файл із cat
-
Перевірте підпис у підписаному файлі “secret1.txt.gpg”. Впишіть:
[ying@serverXY ying]$ gpg --verify secret1.txt.gpg gpg: Signature made Thu 16 Oct 2003 07:29:37 AM PDT using DSA key ID 1D12E484 gpg: Good signature from "Ying Yang (my test) <ying@serverXY>" -
Створіть інший файл secret2.txt із текстом «Hello All».
-
Підпишіть файл secret2.txt, але цього разу нехай файл буде захищений ASCII. Впишіть:
[ying@serverXY ying]$ gpg -sa secret2.txt
У вашому pwd буде створено броньований файл ASCII під назвою “secret2.txt.asc”.
-
Використовуйте команду cat, щоб переглянути вміст ASCII-файлу, створеного для вас вище.
-
Створіть ще один файл під назвою «secret3.txt» із текстом «hello dude». Впишіть:
[ying@serverXY ying echo "hello dude" > secret3.txt -
Додайте свій підпис до тіла файлу, який ви створили вище. Впишіть:
[ying@serverXY ying]$ gpg --clearsign secret3.txt
Це створить нестиснений файл (secret3.txt.asc), загорнутий у ваш ASCII-підпис.
Запишіть команду для перевірки створеного для вас підпису файлу.
-
Відкрийте файл, щоб переглянути його вміст за допомогою будь-якого пейджера.
Question
Чи можете ви прочитати текст, який ви ввели у файл?
Прочитайте, перш ніж продовжити
Переконайтеся, що ваш партнер виконав усі «Вправи 1, 2 та 3» вище, перш ніж ви перейдете до вправи 4 нижче.
Якщо у вас немає партнера, вийдіть з облікового запису користувача Ying та увійдіть у систему як користувач «me».
Потім повторіть усі «Вправи 1, 2 та 3» як користувач «me».
Потім ви можете виконати вправу 4 нижче. Замініть усі посилання на користувача Ying на «serverPR» на користувача «me» на ServerXY (тобто ваш локальний хост).
Ви можете використовувати користувача «me@serverXY» або користувача «ying@serverPR» як свого партнера в наступній вправі.
Завдання 4¶
Імпорт відкритих ключів¶
У цій вправі ви будете використовувати так звану «Мережу довіри» для спілкування з іншим користувачем.
-
Увійдіть в систему як користувач ying.
-
Зробіть свій ASCII-броньований файл відкритого ключа (ying-pub.asc) доступним для вашого партнера (використайте
або - me@serverXY або ying@serverPR)
!!! note
Існує кілька способів зробити це, наприклад, електронною поштою, копіюванням та вставкою, scp, ftp, збереженням на дискеті тощо.
Оберіть для себе найефективніший метод.
-
Попросіть свого партнера надати вам доступ до файлу відкритого ключа.
-
Припустимо, що відкритий ключ вашого партнера зберігається у файлі під назвою «me-pub.asc» у вашому pwd;
Імпортуйте ключ у свій key-ring. Впишіть:
```bash
[ying@serverXY ying]$ gpg --import me-pub.asc
gpg: key 1D0D7654: public key "Me Mao (my test) <me@serverXY>" imported
gpg: Total number processed: 1
gpg: imported: 1
```
-
Тепер перелічіть ключі у вашому key-ring. Впишіть:
[ying@serverXY ying]$ gpg --list-keys /home/ying/.gnupg/pubring.gpg ----------------------------- pub 1024D/1D12E484 2003-10-16 Ying Yang (my test) <ying@serverXY> sub 1024g/1EDB00AC 2003-10-16 [expires: 2004-10-15] pub 1024D/1D0D7654 2003-10-16 Me Mao (my test) <me@serverXY> sub 1024g/FD20DBF1 2003-10-16 [expires: 2004-10-15] -
Зокрема, перелічіть ключ, пов’язаний з ідентифікатором користувача me@serverXY. Впишіть:
[ying@serverXY ying]$ gpg --list-keys me@serverXY -
Переглянути відбиток ключа для me@serverXY. Впишіть:
[ying@serverXY ying]$ gpg --fingerprint me@serverXY
Шифрування та розшифрування файлів
Процедура шифрування та дешифрування файлів або документів проста.
Якщо ви хочете зашифрувати повідомлення для користувача ying, ви зашифруєте його за допомогою відкритого ключа користувача ying.
Після отримання ying потрібно буде розшифрувати повідомлення за допомогою закритого ключа ying.
ТІЛЬКИ ying може розшифрувати повідомлення або файл, зашифрований відкритим ключем ying
Щоб зашифрувати файл¶
-
Увійшовши в систему як користувач ying, створіть файл під назвою encrypt-sec.txt. Впишіть:
[ying@serverXY ying]$ echo "hello" > encrypt-sec.txt
Переконайтеся, що ви можете прочитати вміст файлу за допомогою cat.
-
Зашифруйте файл encrypt-sec.txt, щоб лише користувач «me» міг переглядати файл. тобто ви зашифруєте його за допомогою відкритого ключа me@serverXY (який зараз є у вашому key-ring). Впишіть:
[ying@serverXY ying]$ gpg --encrypt --recipient me@serverXY encrypt-sec.txt
Наведена вище команда створить зашифрований файл під назвою «encrypt-sec.txt.gpg» у вашому pwd.
Щоб розшифрувати файл¶
- Файл, який ви зашифрували вище, призначений для me@serverXY.
Спробуйте розшифрувати файл. Впишіть:
```bash
[ying@serverXY ying]$ gpg --decrypt encrypt-sec.txt.gpg
gpg: encrypted with 1024-bit ELG-E key, ID FD20DBF1, created 2003-10-16
"Me Mao (my test) <me@serverXY>"
gpg: decryption failed: secret key not available
```
-
Чи отримали ми тут якийсь цінний урок?
-
Зробіть зашифрований файл, який ви створили, доступним для належного власника та попросіть його виконати наведену вище команду, щоб розшифрувати файл. Чи вдалося їм розшифрувати файл.
!!! note
Будьте дуже обережні під час розшифрування бінарних файлів (наприклад, програм), оскільки після успішного розшифрування файлу gpg спробує вивести вміст файлу на стандартний вивід.
Візьміть звичку використовувати команду нижче під час розшифровки файлів:
```bash
[ying@serverXY ying]$ gpg --output encrypt-sec --decrypt encrypt-sec.txt.gpg
```
Це примусово надсилає вихідні дані у файл під назвою «encrypt-sec».
Який потім можна переглянути (або запустити) за допомогою будь-якої програми, яка підходить для типу файлу (або вмісту).
!!! Tip "Поради"
```
Більшість команд і опцій, що використовуються програмою gpg, також мають короткі форми, що зменшує кількість введених користувачем команд у командному рядку. Наприклад,
```
gpg --encrypt --recipient me@serverXY encrypt-sec.txt
```
Коротка форма вищезазначеної команди така:
```
gpg -e -r me@serverXY encrypt-sec.txt
```
```
-
Щоб зашифрувати рядок "hello" і надіслати його як броньоване повідомлення ASCII користувачеві з адресою електронної пошти ying@serverXY, використовуйте команду нижче:
echo "hello" | gpg -ea -r ying@serverXY | mail ying@serverXY -
Щоб зашифрувати файл "your_file" відкритим ключем "me@serverXY" і записати його в "your_file.gpg"
підписавши його своїм ідентифікатором користувача (використовуючи свій цифровий підпис), використовуйте команду нижче:
```bash
gpg -se -r me@serverXY your_file
```
- Існує загальнодоступний сервер ключів на wwwkeys.pgp.net. Ви можете використовувати gpg, щоб завантажити туди свій ключ за допомогою:
gpg --send-keys
OpenSSH¶
OpenSSH — це реалізація протоколу SSH (Secure SHell) OpenBSD.
Це БЕЗКОШТОВНА версія набору інструментів для підключення до мережі протоколу SSH. OpenSSH шифрує весь трафік (включаючи паролі), щоб ефективно усунути підслуховування, викрадення з’єднання та інші атаки на рівні мережі. Крім того, OpenSSH надає безліч можливостей безпечного тунелювання, а також різноманітні методи автентифікації.
Це допомагає забезпечити безпечний зашифрований зв’язок між двома ненадійними хостами через незахищену мережу (наприклад, Інтернет).
Він включає як компоненти на стороні сервера, так і набір програм на стороні клієнта.
sshd¶
Серверна частина включає демон захищеної оболонки (sshd). sshd — це демон, який прослуховує з'єднання від клієнтів.
Він створює новий демон для кожного вхідного з’єднання. Розгалужені демони обробляють обмін ключами, шифрування, автентифікацію, виконання команд і обмін даними. Згідно зі сторінкою довідки sshd, sshd працює наступним чином:
Демон OpenSSH SSH підтримує лише протокол SSH 2. Кожен хост має спеціальний ключ, який використовується для ідентифікації хоста. Щоразу, коли клієнт підключається, демон відповідає своїм публічним ключем хосту. Клієнт порівнює ключ хоста зі своєю базою даних, щоб переконатися, що він не змінився. Передня безпека забезпечується через ключову угоду Діффі-Хеллмана. Ця угода ключа призводить до спільного ключа сеансу. Решта сеансу шифрується за допомогою симетричного шифру.
Клієнт вибирає алгоритм шифрування із запропонованих сервером. Крім того, цілісність сеансу забезпечується за допомогою коду автентифікації криптографічного повідомлення (hmac-md5, hmac-sha1, umac-64, umac-128, hmac-sha2-256 або hmac-sha2-512).
Нарешті, сервер і клієнт відкривають діалогове вікно автентифікації. Клієнт намагається автентифікувати себе за допомогою автентифікації на основі хоста, автентифікації відкритого ключа, автентифікації GSSAPI, автентифікації виклик-відповідь або автентифікації пароля.
Протокол SSH2, реалізований у OpenSSH, стандартизовано робочою групою «IETF secsh».
ssh¶
Клієнтський пакет програм включає ssh. Це програма, яка використовується для входу у віддалені системи, а також може використовуватися для виконання команд у віддалених системах.
Завдання 5¶
sshd¶
Деякі вправи охоплюють демон сервера sshd.
Usage: sshd [options]
Options:
-f file Configuration file (default /etc/ssh/sshd_config)
-d Debugging mode (multiple -d means more debugging)
-i Started from inetd
-D Do not fork into daemon mode
-t Only test configuration file and keys
-q Quiet (no logging)
-p port Listen on the specified port (default: 22)
-k seconds Regenerate server key every this many seconds (default: 3600)
-g seconds Grace period for authentication (default: 600)
-b bits Size of server RSA key (default: 768 bits)
-h file File from which to read host key (default: /etc/ssh/ssh_host_key)
-u len Maximum hostname length for utmp recording
-4 Use IPv4 only
-6 Use IPv6 only
-o option Process the option as if it was read from a configuration file.
Більшість систем Linux із коробки вже мають сервер OpenSSH, налаштований і запущений із деякими параметрами за замовчуванням. Файл конфігурації для sshd зазвичай знаходиться в /etc/ssh/ і має назву sshd_config.
sshd_config¶
-
Відкрийте конфігураційний файл SSH-сервера будь-яким пейджером і вивчіть його. Впишіть:
[root@serverXY root]# less /etc/ssh/sshd_config
!!! note
`sshd_config` — це досить дивний конфігураційний файл. На відміну від інших конфігураційних файлів Linux, коментарі (#) у файлі `sshd_config` позначають значення опцій за замовчуванням (тобто коментарі представляють вже скомпільовані значення за замовчуванням)
- Зверніться до сторінки довідки щодо
sshd_config.
!!! question
Що роблять наступні опції?
- AuthorizedKeysFile
- Ciphers
- Port
- Protocol
- X11Forwarding
- HostKey
-
Змініть свій pwd на каталог /etc/ssh/.
-
Перелічіть усі файли в
/etc/ssh/
Створення ключів хоста¶
Ваш сервер SSH уже має ключі хоста, які він використовує. Ці ключі були згенеровані під час першого встановлення вашої системи. У цій вправі ви дізнаєтеся, як створити ключі хост-типу для вашого сервера, але ви не будете використовувати ключі.
Для створення ключів хосту для вашого сервера¶
-
Створіть новий каталог під вашим pwd. Назвіть це запасними ключами. cd у новий каталог. Впишіть:
[root@serverXY ssh]# mkdir spare-keys && cd spare-keys -
Використайте програму
ssh-keygenдля створення ключа хоста з такими характеристиками: -
тип ключа має бути "rsa"
- Ключ не повинен мати коментарів
- Файл закритого ключа повинен мати назву - ssh_host_rsa_key
- Ключ не повинен використовувати парольну фразу
Впишіть:
```bash
[root@serverXY spare-keys]# ssh-keygen -q -t rsa -f ssh_host_rsa_key -C '' -N ''
```
!!! question "Питання"
Що потрібно зробити, щоб демон sshd використовував щойно згенерований вами ключ хоста?
-
Перегляньте відбиток ключа, який ви створили вище. Впишіть:
[root@serverXY spare-keys]# ssh-keygen -l -f ssh_host_rsa_key -
Перегляньте відбиток ключа, який ви створили, але цього разу додайте візуальне зображення відбитка ключа в ASCII. Впишіть:
[root@localhost spare-keys]# ssh-keygen -l -v -f ssh_host_rsa_key 3072 SHA256:1kQS0Nz4NofWkgqU0y+DxmDoY6AmGsF40GwZkobD8DM ssh_host_rsa_key.pub (RSA) +---[RSA 3072]----+ |X=.+ .*o+. | |B*B o + =o. | |oBE. + o o.+ | |+.+o = ooX o | |+o . . .S*.+ | |. .. | | | | | | | +----[SHA256]-----+ -
Запишіть команду для створення ключа типу dsa під назвою «ssh_host_dsa_key» без коментарів і фрази-паролю.
-
Перевірте стан служби
sshd. Впишіть:[root@localhost ~]# systemctl -n 0 status sshd.service ● sshd.service - OpenSSH server daemon Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2023-10-05 23:56:34 EDT; 3 days ago ...<SNIP>... -
Якщо ви внесете будь-які зміни до конфігураційного файлу
sshd, ви можете перезапустити службуsshd, виконавши команду:[root@localhost ~]# systemctl restart sshd.service
Завдання 6¶
ssh¶
У цьому розділі розглядаються вправи, що охоплюють клієнтську програму ssh.
usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface]
[-b bind_address] [-c cipher_spec] [-D [bind_address:]port]
[-E log_file] [-e escape_char] [-F configfile] [-I pkcs11]
[-i identity_file] [-J [user@]host[:port]] [-L address]
[-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
[-Q query_option] [-R address] [-S ctl_path] [-W host:port]
[-w local_tun[:remote_tun]] destination [command]
Використання ssh¶
-
Увійдіть на serverXY як користувач me.
-
Використовуйте
sshдля підключення до serverPR. Впишіть:[me@serverXY me]$ ssh serverPR
Введіть пароль користувача me, коли буде запропоновано. Якщо ви отримаєте будь-які попередження, введіть «yes», щоб продовжити.
-
Після входу створіть каталог під назвою - myexport і створіть порожній файл під назвою foobar у новому каталозі. Впишіть:
[me@serverPR me]$ mkdir ~/myexport && touch myexport/foobar -
Вийти з serverPR. Впишіть:
[me@serverPR me]$ exit
Ви повернетеся до локальної оболонки на serverXY.
-
Використовуйте
sshдля віддаленого виконання команди “ls” для рекурсивного перегляду списку файлів у домашньому каталозі користувача serverPR. Впишіть:[root@localhost ~]# ssh me@serverPR 'ls -lR /home/me/myexport' me@localhost's password: ...<SNIP>... /home/me/myexport: total 0 -rw-rw-r-- 1 me me 0 Oct 9 16:48 foobar
Введіть мій пароль користувача me, коли буде запропоновано. Якщо ви отримаєте будь-які попередження, введіть «yes», щоб продовжити.
-
Під час авторизації на сервері serverXY спробуйте віддалено перезавантажити serverPR від імені користувача
ying. Впишіть:[me@localhost ~]# ssh -l ying localhost 'reboot' ying@localhost's password: ...<SNIP>...
Коли буде запропоновано, введіть пароль користувача ying.
!!! Questions "Питання"
```
Чи зміг користувач ying віддалено перезавантажити serverPR? Чому ying не може віддалено перезавантажити serverPR?
```
-
З сервера serverXY спробуйте віддалено переглянути стан служби
sshd, що працює на serverPR від імені користувачаying. Впишіть:[root@localhost ~]# ssh -l ying localhost 'systemctl status sshd.service' ying@localhost's password: ● sshd.service - OpenSSH server daemon -
З сервера serverXY спробуйте віддалено перезапустити службу
sshd, що працює на serverPR, від імені користувачаying. Впишіть:[root@localhost ~]# ssh -l ying localhost 'systemctl restart sshd.service' ying@localhost's password: Failed to restart sshd.service: Interactive authentication required. See system logs and 'systemctl status sshd.service' for details.
!!! Questions "Питання"
```
- Чи міг користувач ying віддалено переглядати стан служби sshd на serverPR?
- Чи зміг користувач ying віддалено перезапустити службу sshd на serverPR?
- Напишіть коротке пояснення поведінки, яку ви спостерігаєте.
```
- Введіть «exit», щоб вийти з serverPR і повернутися до serverXY.
scp - безпечне копіювання (програма для віддаленого копіювання файлів)¶
scp копіює файли між хостами в мережі. Він використовує SSH для передачі даних, використовує ту саму автентифікацію та забезпечує ту саму безпеку, що й ssh.
usage: scp [-346BCpqrTv] [-c cipher] [-F ssh_config] [-i identity_file]
[-J destination] [-l limit] [-o ssh_option] [-P port]
[-S program] source ... target
Використання scp¶
-
Переконайтеся, що ви все ще ввійшли в систему як користувач
meна serverXY. -
Створіть каталог під назвою
myimportу вашому домашньому каталозі та перейдіть до нього за допомогою cd. -
Використайте
scpдля копіювання всіх файлів з каталогу “/home/me/myexport/” на віддаленому сервері serverPR. (крапка «.» у кінці команди важлива). Впишіть:[me@localhost ~myimport]# scp serverPR:/home/me/myexport . me@serverPR's password: scp: /home/me/myexport: not a regular file
!!! question "Питання"
Напишіть коротке пояснення, чому попередня команда не виконала свою роботу?
-
Знову виконайте попередню команду, але цього разу додайте рекурсивний параметр до
scp. Впишіть:[me@localhost ~myimport]# scp -r me@serverPR:/home/me/myexport . me@localhost's password: foobar
!!! question "Питання"
Яка різниця між варіаціями цих двох команд і за яких обставин вони матимуть однаковий результат?
- scp me@serverPR:/home/me/myexport.
та
- scp serverPR:/home/me/myexport.
-
Яка команда скопіює всі файли в “/home/me/.gnugp/” на serverPR?
-
Тепер скопіюйте домашній каталог ying на serverPR. Впишіть:
[me@localhost ~myimport]# scp -r ying@localhost:/home/ying/ ying_home_directory_on_serverPR -
Знову виконайте невеликий варіант попередньої команди, щоб скопіювати домашній каталог ying на serverPR. Впишіть:
[me@localhost ~myimport]# scp -r ying@localhost:/home/ying ying_home_directory_on_serverPR
!!! Questions "Питання"
```
Яка невелика, але суттєва різниця між варіантами двох попередніх команд? І який результат кожної команди?
- `scp -r ying@localhost:/home/ying/ ying_home_directory_on_serverPR`
та
- `scp -r ying@localhost:/home/ying ying_home_directory_on_serverPR`
```
-
Використайте команду
ls -alR, щоб переглянути список вмісту двох попередніх кроків. Впишіть:[me@localhost ~myimport]# ls -al ying_home_directory_on_serverPR/
!!! question "Питання"
Надайте коротке пояснення результату виконання команди `ls -alR`. Поясніть, наприклад, чому у вас, здається, є дублікати цих файлів .bash_history, .bashrc ...
Завдання 7¶
Створення відкритих і закритих ключів користувача для SSH¶
Кожному користувачеві, який хоче використовувати SSH з автентифікацією RSA або DSA, потрібна пара відкритого та закритого ключів. Для створення цих ключів можна використовувати програму ssh-keygen (так само, як вона використовувалася раніше, коли ви створювали нові ключі хоста для вашої системи)
Підказка
Одна з головних відмінностей між ключами хоста та користувача полягає в тому, що наполегливо рекомендується захищати ключі користувача за допомогою парольної фрази. Парольна фраза — це пароль, який використовується для шифрування закритого ключа [звичайного тексту].
Загальнодоступний ключ зберігається у файлі з тим же ім’ям, що й закритий ключ, але з розширенням «.pub». Немає простого способу відновити втрачену парольну фразу. Необхідно створити новий ключ, якщо парольну фразу втрачено або забуто.
Щоб створити відкритий/приватний ключ автентифікації користувача¶
-
Увійдіть на локальну машину як користувач ying.
-
Запустіть програму
ssh-keygen, щоб створити ключ типу «dsa» з довжиною за замовчуванням. Впишіть:[ying@serverXY ying]$ ssh-keygen -t dsa Generating public/private dsa key pair.
Натисніть Enter, щоб прийняти розташування файлу за замовчуванням.
```bash
Enter file in which to save the key (/home/ying/.ssh/id_dsa):
Created directory '/home/ying/.ssh'.
```
Вам двічі буде запропоновано ввести парольну фразу. Введіть хорошу парольну фразу, яку досить складно вгадати. Натисніть ENTER після кожного запиту.
```bash
Enter passphrase (empty for no passphrase): *****
Enter same passphrase again: *****
Your identification has been saved in /home/ying/.ssh/id_dsa.
Your public key has been saved in /home/ying/.ssh/id_dsa.pub.
The key fingerprint is:
SHA256:ne7bHHb65e50HJPchhbiSvEZ0AZoQCEnnFdBPedGrDQ ying@localhost.localdomain
The key's randomart image is:
+---[DSA 1024]----+
| .oo==++o+ |
| o+. o E.* |
...<SNIP>...
```
Після успішного завершення ви побачите повідомлення про те, що ваші ідентифікаційні дані та відкриті ключі збережено в каталозі /home/ying/.ssh/.
-
перейдіть до вашого каталогу
~/.ssh/за допомогою команди cd. Список файлів у каталозі. -
Яка команда
ssh-keygenдля перегляду відбитка ваших ключів? -
Використайте команду cat для перегляду вмісту вашого файлу відкритого ключа (наприклад,
~/.ssh/id_dsa.pub).
Завдання 8¶
Автентифікація за допомогою відкритого ключа¶
Досі ви використовували автентифікацію на основі пароля для входу в облікові записи користувачів на serverPR.
Це означає, що для успішного входу ви повинні знати пароль відповідного облікового запису на віддаленій стороні.
У цій вправі ви налаштуєте автентифікацію за допомогою відкритого ключа між вашим обліковим записом користувача на serverXY та обліковим записом користувача ying на serverPR.
Щоб налаштувати автентифікацію за допомогою відкритого ключа¶
-
Увійдіть у свою локальну систему як користувач ying.
-
cd у ваш каталог «~/.ssh».
-
Введіть наведені нижче команди точно так, як показано. Вам буде запропоновано ввести пароль ying на serverPR. Впишіть:
[ying@serverXY .ssh]$ cat id_dsa.pub | ssh ying@serverPR \ '(cd ~/.ssh && cat - >> authorized_keys && chmod 600 authorized_keys)'
Якщо говорити простою мовою, наведена вище команда звучить так:
a. отримати вміст вашого файлу відкритого ключа dsa та надіслати ( | ) вивід до ssh ying@serverPR
b. виконайте команду “cd ~/.ssh && cat - >> authorized_keys && chmod 600 authorized_keys” від імені користувача serverPR.
!!! Note "Примітка"
```
Мета попередньої складної команди — скопіювати та додати вміст вашого файлу відкритого ключа до «/home/ying/.ssh/authorized_keys» на serverPR та надати йому правильні дозволи.
```
!!! Tip "Порада"
```
Ви можете скористатися утилітою `ssh-copy-id` для легкого та більш витонченого налаштування автентифікації за допомогою відкритого/приватного ключа між системами. `ssh-copy-id` – це скрипт, який використовує `ssh` для входу на віддалену машину (ймовірно, спочатку з використанням пароля для входу).
Він складає список одного або кількох відбитків пальців (як описано нижче) та намагається увійти за допомогою кожного ключа, щоб перевірити, чи якийсь із них вже встановлений. Потім він складає список тих, яким не вдалося увійти, та за допомогою `ssh` дозволяє вхід за допомогою цих ключів на віддаленій системі. За замовчуванням він додає ключі, додаючи їх до ~/.ssh/authorized_keys віддаленого користувача (створюючи файл та каталог, якщо необхідно).
```
-
Після додавання відкритого ключа до файлу authorized_keys у віддаленій системі. Спробуйте увійти на serverPR як ying через ssh. Впишіть:
[ying@serverXY .ssh]$ ssh serverPR Enter passphrase for key '/home/ying/.ssh/id_dsa': **
Зверніть увагу, що цього разу вам буде запропоновано ввести парольну фразу замість пароля користувача. Введіть парольну фразу, яку ви створили раніше під час створення ключів.
- Після успішного входу на serverPR - вийдіть.
Завдання 9¶
ssh-agent¶
Згідно зі сторінкою довідки, ssh-agent — це програма для зберігання закритих ключів, що використовуються для автентифікації за відкритим ключем (RSA, DSA, ECDSA, Ed25519). Ідея полягає в тому, що ssh-agent запускається на початку сеансу користувача або входу в систему, а всі інші вікна або програми запускаються як клієнти програми ssh-agent. Завдяки використанню змінних середовища агент може бути знайдений та автоматично використаний для автентифікації під час входу на інші машини за допомогою ssh.
SYNOPSIS
ssh-agent [-c | -s] [-Dd] [-a bind_address] [-E fingerprint_hash] [-P pkcs11_whitelist] [-t life] [command [arg ...]]
ssh-agent [-c | -s] -k
У цій вправі ви дізнаєтеся, як налаштувати агента, щоб вам не доводилося вводити свою парольну фразу щоразу, коли ви хочете підключитися до іншої системи за допомогою автентифікації з відкритим ключем.
-
Переконайтеся, що ви ввійшли у свою локальну систему як користувач ying.
-
Введіть команду нижче:
[ying@localhost ~]$ eval `ssh-agent` Agent pid 6354
Зверніть увагу на значення ідентифікатора процесу агента (PID) у вихідних даних.
-
Запустіть програму
ssh-add, щоб отримати список відбитків усіх [публічних/приватних] ідентифікаційних даних, які наразі представлені агентом. Впишіть:[ying@localhost ~]$ ssh-add -l The agent has no identities.
Ви ще не повинні мати жодних ідентифікаторів у списку.
-
Використайте програму
ssh-addбез будь-яких опцій, щоб додати свої ключі до агента, якого ви запустили вище. Впишіть:[ying@localhost ~]$ ssh-add
Введіть свою парольну фразу, коли буде запропоновано.
```bash
Enter passphrase for /home/ying/.ssh/id_dsa:
Identity added: /home/ying/.ssh/id_dsa (ying@localhost.localdomain)
```
-
Тепер знову запустіть команду
ssh-add, щоб переглянути список відомих ідентифікаторів відбитків пальців. Впишіть:[ying@localhost ~]$ ssh-add -l 1024 SHA256:ne7bHHb65e50.......0AZoQCEnnFdBPedGrDQ ying@server (DSA) -
Тепер, коли користувач ying, спробуйте віддалено підключитися до serverPR та виконати просту тестову команду.
Якщо припустити, що ви зробили все правильно до цього моменту щодо налаштування та збереження відповідних ключів, ви зробили правильно до цього моменту, вам НЕ буде запропоновано ввести пароль або парольну фразу. Впишіть:
```bash
[ying@serverXY .ssh]$ ssh serverPR 'ls /tmp'
```
-
Якщо ви закінчили і більше не потребуєте послуг
ssh-agent, або просто хочете повернутися до автентифікації на основі ключів, ви можете видалити всі [приватні/публічні] ідентифікатори з агента. Впишіть:[ying@localhost ~]$ ssh-add -D All identities removed. -
Все зроблено!
Author: Wale Soyinka
Contributors: Steven Spencer, Ganna Zhyrnova