Перейти к содержанию

Резюме

В этой главе вы научились использовать шифрование для защиты данных в системе 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 предоставляет набор утилит для шифрования таких передач:

  • sshd
  • ssh
  • scp
  • sftp
  • slogin

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-порта к порту удалённого сервера нужной службы:

ssh -f -N -L high_port:remote_host_address:port user_name@remote_host_address

Туннель можно проверить командой 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-контрольную сумму. Контрольная сумма отправляется серверу, который вычисляет собственную контрольную сумму от исходного числа. Если суммы совпадают, пользователь автоматически входит в систему.

Для настройки аутентификации по открытому ключу:

  1. Создайте пару ключей на клиентской системе командой ssh-keygen.
  2. Скопируйте открытый ключ на SSH-сервер командой scp.
  3. Добавьте содержимое скопированного файла ключа в конец файла ~/.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:

  1. Создайте ключи командой gpg --gen-key.
  2. Зашифруйте файл командой 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.