Резюме¶
В этой главе вы научились использовать шифрование для защиты данных в системе Linux. Сначала было рассмотрено шифрование сетевого обмена с помощью OpenSSH, а затем использование GPG для шифрования файлов Linux.
Глава началась с повторения принципов работы шифрования. Первый рассмотренный тип — симметричное шифрование. При симметричном шифровании ключ, используемый для шифрования сообщения, совпадает с ключом для его расшифровки. Это означает, что отправитель и получатель должны иметь один и тот же ключ. Одно из ключевых преимуществ симметричного шифрования — скорость: оно работает значительно быстрее асимметричного. Одна из сложностей — безопасная доставка ключа всем сторонам, которым необходимо обмениваться данными. К криптографическим стандартам, использующим симметричное шифрование, относятся:
- 3DES
- AES
- Blowfish
При выборе схемы шифрования следует использовать алгоритмы с ключом не менее 128 бит. Чем длиннее ключ, тем надёжнее защита данных.
Затем было рассмотрено асимметричное шифрование. Асимметричное шифрование использует два ключа вместо одного: открытый и закрытый. Данные, зашифрованные открытым ключом, можно расшифровать только закрытым. Данные, зашифрованные закрытым ключом, можно расшифровать только открытым. Асимметричное шифрование также называется криптографией с открытым ключом. Широко применяемые механизмы асимметричного шифрования:
- RSA
- DSA
Пары закрытый/открытый ключ должны быть значительно длиннее ключей для симметричного шифрования — 1024 бит и более.
Нередко встречаются реализации, совмещающие симметричное и асимметричное шифрование. Асимметричное шифрование применяется для первоначального обмена ключами с целью безопасной передачи секретного ключа обеим сторонам сеанса. После этого обе стороны располагают одним и тем же ключом и могут переключиться на симметричное шифрование для всего остального сеанса.
Удостоверяющий центр (CA) отвечает за выдачу и управление ключами шифрования. При запросе пары ключей у CA он одновременно генерирует открытый и закрытый ключи, используя заданную схему шифрования, например RSA или DSA. Закрытый ключ передаётся только владельцу, а открытый может быть предоставлен любому желающему. Основная роль CA — проверка подлинности сторон зашифрованного обмена. Необходимо различать два типа CA:
- Внутренний удостоверяющий центр
- Внешний удостоверяющий центр
Поскольку при установке операционной системы Linux создаётся собственный внутренний CA, его можно использовать для генерации сертификатов и шифрования как сетевого трафика, так и файлов в файловой системе.
Затем был рассмотрен способ шифрования сеансов удалённого доступа между Linux-системами с помощью OpenSSH. Ранние сетевые службы Linux, такие как Telnet, rlogin, rcp, rshell и FTP, передают данные в открытом виде, что раскрывает имена пользователей, пароли и другие конфиденциальные данные для перехватчиков. OpenSSH предоставляет набор утилит для шифрования таких передач:
sshdsshscpsftpslogin
OpenSSH использует шифрование с парой закрытый/открытый ключ совместно с шифрованием секретным ключом. Сначала SSH-клиент устанавливает соединение с системой, на которой работает SSH-сервер, на IP-порту 22. Сервер отправляет открытый ключ клиенту. Клиент проверяет, есть ли у него уже копия этого ключа. По умолчанию, если ключ сервера отсутствует, пользователю предлагается его добавить. После этого клиент генерирует 256-битный секретный ключ, шифрует его открытым ключом сервера и отправляет серверу. Сервер расшифровывает его закрытым ключом. Теперь обе системы могут использовать симметричное шифрование для сеанса. В SSH версии 2 секретный ключ не передаётся явно от клиента к серверу — вместо этого для согласования ключа без его передачи по сети используется протокол обмена ключами Диффи-Хеллмана.
Настройка OpenSSH включает конфигурирование как сервера, так и клиента. Демон sshd настраивается с помощью файла /etc/ssh/sshd_config. SSH-клиент настраивается через /etc/ssh/ssh_config или ~/.ssh/ssh_config. Для подключения к SSH-серверу необходимо открыть порт 22 в межсетевом экране на уровне узла системы, где работает sshd.
Загрузить SSH-клиент и подключиться к демону sshd на удалённой Linux-системе можно командой ssh –l user_name ip_address.
Затем были рассмотрены способы туннелирования незашифрованного трафика через SSH-туннель. Когда клиентское программное обеспечение для туннелируемого протокола (например, почтовый клиент с POP3) устанавливает соединение с локальным SSH-клиентом, трафик шифруется SSH и туннелируется на SSH-сервер. На стороне сервера трафик расшифровывается и перенаправляется соответствующей службе (например, демону POP3). Данные шифруются перед передачей, даже если исходный протокол (например, POP3) не поддерживает шифрование.
Для настройки SSH-туннеля необходимо отредактировать файл /etc/ssh/sshd_config на системе с sshd и установить параметр AllowTcpForwarding в значение yes. Затем создаётся локальный туннель с высокого IP-порта к порту удалённого сервера нужной службы:
Туннель можно проверить командой telnet localhost client_tunnel_port.
Также можно туннелировать трафик X-сервера к удалённым X-клиентам через SSH. Для этого клиентская система должна принимать соединения от X-сервера командой xhost +X_server_hostname, затем X-сервер перенаправляет графический вывод на клиентскую систему с помощью переменной окружения DISPLAY. Параметр X11Forwarding в файле /etc/ssh/sshd_config на системе X-сервера устанавливается в значение yes. В командной строке клиентской системы выполняется ssh –X –l user_name IP_address_of_X_server для входа на удалённую систему.
В завершение обсуждения SSH было рассмотрено использование аутентификации по открытому ключу вместо имени пользователя и пароля. Для этого открытый ключ пользователя на клиентской системе должен быть помещён в файл ~/.ssh/authorized_keys в домашнем каталоге пользователя на серверной системе.
При такой конфигурации SSH-клиент сообщает SSH-серверу, какой открытый ключ следует использовать для аутентификации. Сервер проверяет наличие этого ключа у клиента; при обнаружении генерирует случайное число, шифрует его этим открытым ключом и отправляет клиенту. Клиент расшифровывает число закрытым ключом и вычисляет его MD5-контрольную сумму. Контрольная сумма отправляется серверу, который вычисляет собственную контрольную сумму от исходного числа. Если суммы совпадают, пользователь автоматически входит в систему.
Для настройки аутентификации по открытому ключу:
- Создайте пару ключей на клиентской системе командой
ssh-keygen. - Скопируйте открытый ключ на SSH-сервер командой
scp. - Добавьте содержимое скопированного файла ключа в конец файла
~/.ssh/authorized_keysв домашнем каталоге пользователя, от имени которого будет выполняться подключение к SSH-серверу. Это можно сделать, перенаправив (с>>) вывод командыcatв файлauthorized_keys.
После этого можно подключаться к удалённому SSH-серверу с клиентской системы. Вместо имени пользователя и пароля потребуется указать парольную фразу закрытого ключа. При желании можно использовать команду ssh-agent, чтобы не вводить парольную фразу каждый раз при установке SSH-соединения.
Затем тема сменилась на шифрование файлов в файловой системе Linux. Для экзаменов Linux+/LPIC-1 необходимо знать, как использовать утилиту GNU Privacy Guard (GPG) с открытым исходным кодом. GPG — реализация с открытым исходным кодом стандарта OpenPGP (RFC 4880), позволяющая шифровать и цифровым образом подписывать данные.
GPG использует как асимметричное, так и симметричное шифрование. GPG сначала генерирует случайный симметричный ключ и шифрует им передаваемое сообщение. Симметричный ключ шифруется открытым ключом получателя и отправляется вместе с сообщением. При получении сообщения GPG сначала расшифровывает симметричный ключ закрытым ключом пользователя, затем использует его для расшифровки остального сообщения. GPG поддерживает следующие алгоритмы:
- Симметричное шифрование: AES, 3DES, Blowfish
- Асимметричное шифрование: Elgamal, RSA
- Хеши: MD5, SHA-1 и SHA-2, RIPEMD-160
- Цифровые подписи: DSA, RSA
Для шифрования файла с помощью GPG:
- Создайте ключи командой
gpg --gen-key. - Зашифруйте файл командой
gpg –e –r key_user_name filename.
Зашифрованный файл расшифровывается командой gpg --output output_filename --decrypt encrypted_filename.
Для обмена зашифрованными файлами с другими пользователями необходим обмен открытыми ключами GPG. Два способа:
- Скопировать открытые ключи на общедоступный сервер ключей:
gpg --keyserver hkp://subkeys.pgp.net --send-key key_ID. - Обменяться ключами вручную: экспортировать открытый ключ командой
gpg --export --armor key_owner_email > public_key_filename, отправить файл другому пользователю, который импортирует его командойgpg --import public_key_filename.
Просмотреть ключи в связке ключей GPG можно командой gpg --list-keys. После импорта открытого ключа файлы от этого пользователя расшифровываются командой gpg --output output_filename --symmetric encrypted_filename.
При необходимости отозвать ключ (если он скомпрометирован, утерян или забыта парольная фраза) создаётся сертификат отзыва. Рекомендуется создавать сертификат сразу после создания пары ключей: gpg --output revoke.asc --gen-revoke key_ID. Для отзыва ключа необходимо импортировать сертификат: gpg --import revocation_certificate_filename. Если для распространения использовался ручной способ — сертификат необходимо импортировать на все системы, где был импортирован открытый ключ. При использовании сервера ключей — направить отзыв туда: gpg --keyserver public_key_server_URL --send key_ID.
Ускоренное повторение (Accelerated Review)¶
- При симметричном шифровании ключ для шифрования совпадает с ключом для расшифровки.
- Отправитель и получатель должны иметь один и тот же ключ.
- Симметричное шифрование работает значительно быстрее асимметричного.
- Сложность симметричного шифрования — безопасная доставка ключа всем сторонам.
- Стандарты симметричного шифрования: 3DES, AES, Blowfish.
- Чем длиннее ключ, тем надёжнее защита данных.
- Асимметричное шифрование использует два ключа: открытый и закрытый.
- Данные, зашифрованные открытым ключом, расшифровываются только закрытым.
- Данные, зашифрованные закрытым ключом, расшифровываются только открытым.
- Асимметричное шифрование называется также криптографией с открытым ключом.
- Широко применяемые механизмы асимметричного шифрования: RSA, DSA.
- Пары закрытый/открытый ключ должны быть длиной не менее 1024 бит.
- Нередко встречаются реализации с комбинацией симметричного и асимметричного шифрования:
- Асимметричное шифрование используется для первоначального обмена ключами.
- После передачи секретного ключа обеим сторонам сеанс переключается на симметричное шифрование.
- Удостоверяющий центр (CA) отвечает за выдачу ключей шифрования и управление ими.
- При запросе пары ключей CA одновременно генерирует открытый и закрытый ключи.
- Закрытый ключ передаётся только владельцу.
- Открытый ключ может быть предоставлен любому желающему.
- Основная роль CA — проверка подлинности сторон зашифрованного обмена.
- Ранние сетевые службы Linux (Telnet, rlogin, rcp, rshell, FTP) передают данные в открытом виде, раскрывая конфиденциальные данные перехватчикам.
- OpenSSH предоставляет набор утилит для шифрования:
sshd,ssh,scp,sftp,slogin. - OpenSSH использует шифрование с парой закрытый/открытый ключ совместно с шифрованием секретным ключом:
- SSH-клиент устанавливает соединение с сервером на IP-порту 22.
- Сервер отправляет открытый ключ клиенту.
- Клиент проверяет наличие копии ключа.
- При отсутствии ключа пользователю предлагается его добавить.
- Клиент генерирует 256-битный секретный ключ, шифрует его открытым ключом сервера и отправляет.
- Сервер расшифровывает секретный ключ закрытым ключом.
- Обе системы переходят на симметричное шифрование для сеанса.
- SSH-клиент загружается и подключается к
sshdкомандойssh –l user_name ip_address. - Незашифрованный трафик можно туннелировать через SSH:
- Трафик клиентского ПО для туннелируемого протокола шифруется SSH и туннелируется к серверу.
- На стороне сервера трафик расшифровывается и перенаправляется соответствующей службе.
- Для настройки SSH-туннеля:
- В файле
/etc/ssh/sshd_configпараметрAllowTcpForwardingустанавливается вyes. - Создаётся локальный туннель с высокого IP-порта к порту удалённого сервера.
- В файле
- Туннель проверяется командой
telnetс клиентского конца. - Также можно туннелировать трафик X-сервера к удалённым X-клиентам через SSH:
- Клиентская система принимает соединения от X-сервера.
- X-сервер перенаправляет графический вывод на клиент через переменную
DISPLAY. - Экспортируется новое значение переменной.
- В файле
/etc/ssh/sshd_configпараметрX11Forwardingустанавливается вyes. - С командной строки клиента используется параметр
–Xдля входа на удалённую систему. - Запускается нужное графическое приложение.
- Можно настроить SSH на аутентификацию по открытому ключу.
- Открытый ключ пользователя на клиентской системе должен находиться в
~/.ssh/authorized_keysу соответствующего пользователя на сервере. - Для настройки аутентификации по открытому ключу:
- Пара ключей на клиенте создаётся командой
ssh-keygen. - Открытый ключ копируется на SSH-сервер командой
scp. - Содержимое ключа добавляется в
~/.ssh/authorized_keysпользователя, от имени которого выполняется подключение.
- Пара ключей на клиенте создаётся командой
- При желании можно использовать
ssh-agentдля хранения парольной фразы. - Для экзаменов Linux+/LPIC-1 необходимо знать, как использовать GPG для шифрования файлов.
- GPG использует как асимметричное, так и симметричное шифрование:
- GPG генерирует случайный симметричный ключ и шифрует им передаваемое сообщение.
- Симметричный ключ шифруется открытым ключом получателя и отправляется вместе с сообщением.
- При получении GPG расшифровывает симметричный ключ закрытым ключом пользователя.
- GPG расшифровывает остальное сообщение расшифрованным симметричным ключом.
- Для шифрования файла с помощью GPG:
- Ключи создаются командой
gpg --gen-key. - Файл шифруется командой
gpg –e –r key_user_name filename.
- Ключи создаются командой
- Зашифрованный файл расшифровывается командой
gpg --output output_filename --decrypt encrypted_filename. - Для отправки зашифрованных файлов другим пользователям необходим обмен открытыми ключами:
- Открытый ключ экспортируется:
gpg --export --armor key_user_email > public_key_filename. - Файл ключа отправляется пользователям, которым нужен доступ к зашифрованным файлам.
- Другой пользователь импортирует ключ:
gpg –import public_key_filename. - Просмотр ключей в связке:
gpg --list-keys. - После импорта расшифровка:
gpg --output output_filename --symmetric encrypted_filename.
- Открытый ключ экспортируется:
- Открытые ключи можно скопировать на сервер ключей:
gpg --keyserver hkp://subkeys.pgp.net --send-key key_ID. - Сертификат отзыва следует создать сразу после создания пары ключей:
gpg --output revoke.asc --gen-revoke key_ID. - Для отзыва ключа сертификат импортируется:
gpg --import revocation_certificate_filename. - При использовании сервера ключей отзыв направляется туда:
gpg --keyserver public_key_server_URL --send key_ID.