Командная строка и использование SSH
Предполагаемая тематика лекций
На примере прошлого года
Терминал, командная строка и программное окружение Linux
Это очень краткий обзор того, что нужно более или менее знать для участия в С/К
- История и принципы интерфейса командной строки
- Текстовый диалог
- Совмещение управления и данных
- Возможности командной оболочки
- Интерпретатор командной строки
- Редактор командной строки, история, достраивание, подсветка
- ЯП ВУ
Терминал как управляющее устройство TODO перенести из лекции 2, оформить как отдельный подраздел
- История: аппаратное устройство последовательного приёма и передачи байтов
- Эмулятор терминала
Управляющие символы (^C, ^D и т. п.)
ESC-последовательности (<ESC>[36m;, <ESC>[m, <ESC>[5;20H_QQQ и т. п.)
- Где и зачем искать эмулятор терминала
- Сборочный инструментарий Linux-окружения, общее понятие: почему не всегда есть, как добиться, чтобы был, особенности дистрибутивов и т. п.
Работа с Secure Shell
- Терминальнй доступ, проблема защиты учётных данных
- SSH: вход по логину/паролю
- Асимметричное шифрование: закрытый и открытый ключ
- Что можно и что нельзя делать с открытым и закрытым ключами
Отпечатки (простой и VisualHostkey)
- Проблема первоначального обмена ключами:
Чтобы подключиться к удалённому компьютеру по SSH, необходимо зашифровать данные его (компьютера) открытым ключом, т. н. HostKey, а он (и только он!) их расшифрует. Однако HostKey у нас ещё нет
100% надёжный канал для передачи HostKey
Посылаем запрос на HostKey
Получаем HostKey и верим ему
Шифруем данные с помощью HostKey
Удалённый компьютер дешифрует данные с помощью HostKeyPrivate
Отпечаток ключа FingerPrint опубликован в надёжном месте (например, администратор прислал фото)
Посылаем запрос на HostKey
Получаем HostKey (?)
Вычисляем отпечаток, сравниваем его с опубликованным FingerPrint (хоть вручную)
Шифруем данные с помощью HostKey
Удалённый компьютер дешифрует данные с помощью HostKeyPrivate
- Канал скомпрометирован, но мы ему верим
Посылаем запрос на HostKey
- Атакующий перехватывает запрос
Атакующий посылает запрос на HostKey
Атакующий получает HostKey
Атакующий в ответ на наш запрос возвращает нам HostKeyFAKE
Получаем HostKeyFAKE и верим ему
Шифруем данные с помощью HostKeyFAKE
Атакующий перехватывает данные, дешифрует их с помощью HostKeyFAKEPrivate (возможно, даже подменяет)
Атакующий шифрует данные с помощью HostKey
Удалённый компьютер дешифрует данные с помощью HostKeyPrivate
- SSH: изготовление персонального ключа и вход по ключу
- SSH: запароленный ключ и агент для его хранения
Подготовка и использование SSH-ключей
- Создание пары:
1 user@linuxprac$ ssh-keygen 2 Generating public/private rsa key pair. 3 Enter file in which to save the key (/home/user/.ssh/id_rsa): 4 Enter passphrase (empty for no passphrase): 5 Enter same passphrase again: 6 Your identification has been saved in /home/user/.ssh/id_rsa 7 Your public key has been saved in /home/user/.ssh/id_rsa.pub 8 The key fingerprint is: 9 SHA256:UAOdsJDbNSaGT2lJ0uC/ZeUeISrKVxECRPYksOmNFiY george@linuxprac.box.office.basealt.ru 10 The key's randomart image is: 11 +---[RSA 3072]----+ 12 |.+*.**=*o. | 13 | + =o+O+*. | 14 |Eo oB++..o | 15 |+ + ..o+ + . | 16 | + .. + S o | 17 |.. . o + . . | 18 | o . . . | 19 | . | 20 | | 21 +----[SHA256]-----+ 22
- Запуск агента
- Короткий вариант:
Это равносильно запуску ssh-agent и копипасте всего его вывода в командную строку
1 user@linuxprac$ ssh-agent 2 SSH_AUTH_SOCK=/tmp/.private/user/ssh-XXXXXXB7s3Hb/agent.3822; export SSH_AUTH_SOCK; 3 SSH_AGENT_PID=3823; export SSH_AGENT_PID; 4 echo Agent pid 3823; 5 user@linuxprac$ SSH_AUTH_SOCK=/tmp/.private/user/ssh-XXXXXXB7s3Hb/agent.3822; export SSH_AUTH_SOCK; 6 user@linuxprac$ SSH_AGENT_PID=3823; export SSH_AGENT_PID; 7 user@linuxprac$ echo Agent pid 3823 8 Agent pid 3823 9
Добавление ключа (-l показывает отпечаток, а -L — весь открытый ключ)
1 user@linuxprac$ ssh-add -l 2 The agent has no identities. 3 user@linuxprac$ ssh-add 4 Enter passphrase for /home/user/.ssh/id_rsa: 5 Identity added: /home/user/.ssh/id_rsa (george@linuxprac.box.office.basealt.ru) 6 user@linuxprac$ ssh-add -l 7 3072 SHA256:UAOdsJDbNSaGT2lJ0uC/ZeUeISrKVxECRPYksOmNFiY george@linuxprac.box.office.basealt.ru (RSA) 8 user@linuxprac$ ssh-add -L 9 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC5ZpCaF+DvI/Gw4rqc+UHf4g7STSuyS1IUr9doseJWBVNra5fPTZsRTNFGQV+aoVJF4iLOzQSypiWFpKG2bjG9n05VkSGfME62lE9U8x0UPrmtbNfUWE56e4QxmKqq6ielB2zn94brQ8+vWe1Fx2NyPr0XiX0uyp48scVo1G8tkdRQWeIQf8y2q6RFLWBG0kJnuSd5AabmyUbo/lWMG40+TQGwr2+A5YXUTWgovsFVtIoqo7tpv4ZXrcKA/BVAFUbJwZS4F+sY0W2AtcVjB5RZotjtmVoClVacxpJagK0FUpmLz/MopAELsbDPG4E4CvqsurPrlSxqeIW25rLfXHWfCl7cUhsRcWl7TiDNE/T1t0nQiK1iC/SaSI2wld28uRIfF+kEbbLICozFC1aXehpzwoRNQafTKwixkkI+LioEio1WxS6KPDiT+mcH93IGtH4U6QnEDbOMIZ4xXzdaM54chYgcOl387eU9Rv14c9b68GzZVSBBbFYpykQ6bCJ43FU= george@linuxprac.box.office.basealt.ru 10
- Копирование ключа на удалённый хост в качестве разрешённого для аутентификации
1 user@linuxprac$ ssh user@remote.host.ip 2 user@remote.host.ip's password: 3 4 user@linuxprac$ ssh-copy-id user@remote.host.ip 5 /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed 6 /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys 7 user@remote.host.ip's password: 8 9 Number of key(s) added: 1 10 11 Now try logging into the machine, with: "ssh 'remote.host.ip'" 12 and check to make sure that only the key(s) you wanted were added. 13
- «Беспарольный» логин (пароль, точнее, passphrase от ключа, уже один раз введён при добавлении ключа в агент)
1 user@linuxprac$ ssh remote.host.ip 2 Last login: Fri Sep 10 17:35:50 2021 from 193.43.10.248 3 user@remote$ tail -1 .ssh/authorized_keys 4 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC5ZpCaF+DvI/Gw4rqc+UHf4g7STSuyS1IUr9doseJWBVNra5fPTZsRTNFGQV+aoVJF4iLOzQSypiWFpKG2bjG9n05VkSGfME62lE9U8x0UPrmtbNfUWE56e4QxmKqq6ielB2zn94brQ8+vWe1Fx2NyPr0XiX0uyp48scVo1G8tkdRQWeIQf8y2q6RFLWBG0kJnuSd5AabmyUbo/lWMG40+TQGwr2+A5YXUTWgovsFVtIoqo7tpv4ZXrcKA/BVAFUbJwZS4F+sY0W2AtcVjB5RZotjtmVoClVacxpJagK0FUpmLz/MopAELsbDPG4E4CvqsurPrlSxqeIW25rLfXHWfCl7cUhsRcWl7TiDNE/T1t0nQiK1iC/SaSI2wld28uRIfF+kEbbLICozFC1aXehpzwoRNQafTKwixkkI+LioEio1WxS6KPDiT+mcH93IGtH4U6QnEDbOMIZ4xXzdaM54chYgcOl387eU9Rv14c9b68GzZVSBBbFYpykQ6bCJ43FU= user@linuxprac.box.office.basealt.ru 5
Скрипт ssh-copy-id просто логинится на удалённый хост и дописывает ключ в конец файла .ssh/authorized_keys
Д/З
Обеспечить доступ к Linux-системе, которую можно устанавливать произвольное ПО из репозитория. Если таковой нет, обратиться к FrBrGeorge
Завести публичный git-репозиторий
В случае GitHub вам понадобится сгенерировать и зарегистрировать ssh-ключ
Где делать Д/З
GIT: где угодно, лишь бы было опубликовано и мне можно было сделать git clone (GitHub, GitLab, факультетский GitLab для студентов, любой иной способ):
- Собственно Linux (варианты):
Произвольный дистрибутив семейства «Альт» (лучше не сервер ) на выделенном компе или в виртуальной машине дома — я в этом немного разбираюсь
Произвольный Linux-дистрибутив (ну, что знаю )
"Подсистема Windows для Linux" — почти ничего про это не знаю, по идее особых проблем быть не должно
Персональный аккаунт по запросу FrBrGeorge на сервере практикума (достоинство: я сам буду делать Д/З на нём ⇒ там всё будет заранее настроено)