Openssl шифрование файлов. Шифруем файлы с помощью OpenSSL. Как: Зашифровать файл

Полно ситуаций когда нужно зашифровать определённый файл или папку. Например, если данные передаются по открытым каналам либо сохраняются на внешнем носителе. Многие (в том числе и я) используют truecrypt, однако основное предназначение этой программы - работа с зашифрованными разделами, поэтому она не очень хороша в этом случае.

Для подобных задач вполне подходит OpenSSL - надёжное кросплатформенное решение. OpenSSL поддерживает различные алгоритмы шифрования, плюс он по умолчанию установлен во многих операционных системах, а установка на остальные не составит труда.

Под хабракатом - основы использования симметричного и асимметричного шифрования в OpenSSL, а таке пара скриптов упрощающих асимметричное шифрование с одноразовым ключом.

Простейший способ защиты данных с помощью OpenSSL - симметричное шифрование. Следующие команды шифруют и расшифровывают файл documents.zip, используя алгоритм AES с длиной ключа 256 бит:

Openssl enc -aes-256-cbc -salt -in documents.zip -out documents.enc
openssl enc -d -aes-256-cbc -in documents.enc -out documents.zip

Проблема этих команд может заключаться в том что они требуют ввода пароля. Есть ситуации когда это нежелательно. Например, автоматическое резервное копирование/шифрование данных по расписанию, либо если данные шифруются одним человеком а расшифровываются другим.

Как раз для таких случаев было придумано шифрование с открытым ключом . В общем случае вам понадобится создать открытый и закрытый ключи. Первая команда сгенерирует закрытый ключ private.pem, вторая создаст открытый ключ public.pem:

Openssl genrsa -out private.pem -aes256 2048
openssl rsa -in private.pem -pubout -out public.pem

В результате вы получаете пару RSA ключей длиной 2048 бит. К сожалению, в системе RSA размер шифруемых данных ограничен размером ключа, поэтому зашифровать более 2Кб данных не получится. Есть способ обойти это - информация сначала шифруется симметричным алгоритмом (подобно использованному выше) с использованием одноразового ключа. Затем этот одноразовый ключ шифруется публичным ключом. При расшифровке одноразовый ключ расшифровывается закрытым. Подробнее об этом уже было очень хорошо написано в статье на Хабре .

Автоматизировать шифрование поможет следующий скрипт, на выходе которого вы получите одноразовый ключ и данные (encrypt.sh) в зашифрованном виде:

FILENAME="$1"
PUBLICKEY="$2"
SESSIONKEY="$3"
RESULT="$4"

# Generate the random symmetric-key
PASSIZE=30
if [ -c /dev/urandom ] ; then
KEY=`head -c 30 /dev/urandom | openssl enc -base64`
else
KEY=`openssl rand -base64 30`
fi
export KEY

# Encrypt the symmetric key using the public key
openssl rsautl -encrypt -inkey "$PUBLICKEY" -out "$SESSIONKEY" -pubin < $KEY
EOF

# Encrypt the file
openssl enc -aes-256-cbc -pass env:KEY -in "$FILENAME" -out "$RESULT"

Следующая команда использует открытый ключ public.pem чтобы зашифровать файл documents.zip. Она сгенерирует зашифрованный одноразовый ключ session.key и зашифрованные данные documents.enc:

./encrypt.sh documents.zip public.pem session.key documents.enc

Скрипт для дешифрования (decrypt.sh):

PRIVATEKEY="$1"
SESSIONKEY="$2"
ENCRYPTED="$3"
DECRYPTED="$4"

# Decrypt the symmetric key using the private key
KEY=` openssl rsautl -decrypt -inkey "$PRIVATEKEY" -in "$SESSIONKEY" `
export KEY

# Decrypt the file
openssl enc -aes-256-cbc -d -pass env:KEY -in "$ENCRYPTED" -out "$DECRYPTED"

Команда для дешифрования использует закрытый ключ private.pem и одноразовый ключ session.key чтобы расшифровать файл documents.enc. Она сгенерирует файл documents.zip:

./decrypt.sh private.pem session.key documents.enc documents.zip

Как видите, шифрование с открытым ключом может быть почти таким же простым как и симметричное. Но есть ещё более простой путь. На написание этого поста меня побудил блог SbF₅ . Его автор (несомненно более искушённый в bash чем я) написал скрипт , который архивирует папку, шифрует её открытым ключом и генерирует другой скрипт, содержащий в себе всё необходимое: одноразовый ключ, данные и собственно команды для расшифровывания. Кроме того, скрипт может сгенерировать для вас пару RSA ключей:

./encrypt-file.sh -keys public.pem private.pem
./encrypt-file.sh folder public.pem > decrypt-folder.sh
chmod +x decrypt-folder.sh
./decrypt-folder.sh private.pem > folder.tar

В этом примере мы сначала сгенерировали пару ключей. После этого папка folder была зашифрована в скрипт decrypt-folder.sh а затем расшифрована в архив folder.tar. Возможный минус этого способа - то что данные в decrypt-folder.sh хранятся в формате BASE64, а следовательно их размер увеличивается.

UPD Перенесено в блог Информационная безопасность.

Шифрование отдельного файла

# openssl aes-128-cbc -salt -in file -out file.aes # зашифровать файл # openssl aes-128-cbc -d -salt -in file.aes -out file # расшифровать файл Естественно файл может быть и архивом.

Архивирование и шифрование директории

# tar -cf - directory | openssl aes-128-cbc -salt -out directory.tar.aes # openssl aes-128-cbc -d -salt -in directory.tar.aes | tar -x -f -

То-же самое, только тип архива tar.gz

# tar -zcf - directory | openssl aes-128-cbc -salt -out directory.tar.gz.aes # заархивировать и зашифровать директории # openssl aes-128-cbc -d -salt -in directory.tar.gz.aes | tar -xz -f - # расшифровать директории и распаковать архив
  • Используйте -k mysecretpassword после aes-128-cbc , что-бы не спрашивался пароль, но имейте в виду, это очень не безопасно.
  • Используйте aes-256-cbc вместо aes-128-cbc для получения более устойчивого шифра, увеличивается потребление процессора.

GPG шифрование

Альтернатива PGP , распространяемая по лицензии GPL (GNU General Public License ). GnuPG очень известный способ шифрования и подписи электронных писем или других данных, кроме того gpg предоставляет расширенную систему управления ключами. В данных примерах рассматривается только шифрование файлов. Самым простым является симметричный шифр. В этом случае файл шифруется с помощью пароля, соответственно расшифровать его может тот, кто знает этот пароль, никаких ключей не требуется. GPG добавляет расширение "*.gpg" к имени зашифрованного файла. # gpg -c file # Зашифровать файл по паролю # gpg file.gpg # Расшифровать файл (-o другой файл)

Шифрование с использованием пары ключей

Для более полной информации смотрите GPG Quick Start , GPG/PGP Basics и gnupg documentation . Приватный ключ и публичный ключ, основа ассиметричной криптографии. О чем нужно помнить:
  • Ваш публичный ключ используется другими для шифрования файлов, которые, как получатель, можете расшифровать только вы (даже не тот, кто его шифровал).
  • Ваш приватный ключ зашифрован по паролю и используется для расшифровки файлов, зашифрованных Вашим публичным ключем. Приваиный ключ должен храниться в безопасном месте. Помните, если приватный ключ или пароль от него будут потеряны, вместе с ними пропадут и зашифрованные файлы.
  • Ключевой файл, может содержать несколько ключей.
Сперва нужно сгенерировать пару ключей. Значения по-умолчанию вполне подойдут, однако вам нужно будет ввести имя, адрес электронной почты и комментарий (не обязательно). Комментарий полезен при создании более одного ключа для данного имени/e-mail. Так-же вам нужно будет задать ключевую фразу (именно фразу а не слово). # gpg --gen-key # Это может занять некоторое время Ключи сохраняются в ~/.gnupg/ в и в C:/Documents and Settings/%USERNAME%/Application Data/gnupg/ . в Windows. ~/.gnupg/pubring.gpg # Содержит ваш публичный ключ а так-же импортируемые ключи ~/.gnupg/secring.gpg # Может содержать больше одного ключа Некоторые часто используемые опции:
  • -e Зашифровать данные
  • -d Расшифровать данные
  • -r ИМЯ зашифровать для получателя ИМЯ (или "полное имя" или "email@domain")
  • -a Создать "ascii armored" вывод ключа
  • -o Вывести в файл

Шифрование только для персонального использования

Не требует экспорта/импорта какого либо ключа, они у вас уже есть. # gpg -e -r "Your Name" file # Зашифровать с помощью публичного ключа # gpg -o file -d file.gpg # Расшифровать. Используется опция -o , иначе пойдкт в stdout

Шифрование - расшифровка с использованием ключей

Для начала вам нужно экспортировать ваш публичный ключ, что-бы им могли пользоваться для расшифровки данных. Так-же вы должны импортировать публичный ключ от Alice, что-бы шифровать файлы для нее. Ключи можно передать в обычном ascii файле. Например Alice экспортирует ключ, вы его импортируете себе, теперь вы можете шифровать для нее файлы и расшифровать их сможет только она. # gpg -a -o alicekey.asc --export "Alice" # Alice экспортирует ключ в ascii файл. # gpg --send-keys --keyserver subkeys.pgp.net KEYID # Alice кладет ключ на сервер. # gpg --import alicekey.asc # Вы импортируете ключ себе. # gpg --search-keys --keyserver subkeys.pgp.net "Alice" # Или забираете его на сервере. # gpg -e -r "Alice" file # Зашифровать файл для Alice. # gpg -d file.gpg -o file # Расшифровать файл, зашифрованный Alice для вас.

Управление ключами

# gpg --list-keys # Список публичных ключей с KEYIDS KEYID следует за "/" например для: pub 1024D/D12B77CE - KEYID это D12B77CE # gpg --gen-revoke "Your Name" # Сгенерировать CRL (certificate revocation list) # gpg --list-secret-keys # Список приватных ключей # gpg --delete-keys NAME # Удалмть публичный ключ с локальной "связки ключей" # gpg --delete-secret-key NAME # Удалить приватный ключ с локальной "связки ключей" # gpg --fingerprint KEYID # Показать отпечаток ключа # gpg --edit-key KEYID # Редактировать ключ (например подпись или добавить/удалить email)

Полно ситуаций когда нужно зашифровать определённый файл или папку. Например, если данные передаются по открытым каналам либо сохраняются на внешнем носителе. Многие (в том числе и я) используют truecrypt, однако основное предназначение этой программы - работа с зашифрованными разделами, поэтому она не очень хороша в этом случае.

Для подобных задач вполне подходит OpenSSL - надёжное кросплатформенное решение. OpenSSL поддерживает различные алгоритмы шифрования, плюс он по умолчанию установлен во многих операционных системах, а установка на остальные не составит труда.

Под хабракатом - основы использования симметричного и асимметричного шифрования в OpenSSL, а таке пара скриптов упрощающих асимметричное шифрование с одноразовым ключом.

Простейший способ защиты данных с помощью OpenSSL - симметричное шифрование. Следующие команды шифруют и расшифровывают файл documents.zip, используя алгоритм AES с длиной ключа 256 бит:

Openssl enc -aes-256-cbc -salt -in documents.zip -out documents.enc
openssl enc -d -aes-256-cbc -in documents.enc -out documents.zip

Проблема этих команд может заключаться в том что они требуют ввода пароля. Есть ситуации когда это нежелательно. Например, автоматическое резервное копирование/шифрование данных по расписанию, либо если данные шифруются одним человеком а расшифровываются другим.

Как раз для таких случаев было придумано шифрование с открытым ключом . В общем случае вам понадобится создать открытый и закрытый ключи. Первая команда сгенерирует закрытый ключ private.pem, вторая создаст открытый ключ public.pem:

Openssl genrsa -out private.pem -aes256 2048
openssl rsa -in private.pem -pubout -out public.pem

В результате вы получаете пару RSA ключей длиной 2048 бит. К сожалению, в системе RSA размер шифруемых данных ограничен размером ключа, поэтому зашифровать более 2Кб данных не получится. Есть способ обойти это - информация сначала шифруется симметричным алгоритмом (подобно использованному выше) с использованием одноразового ключа. Затем этот одноразовый ключ шифруется публичным ключом. При расшифровке одноразовый ключ расшифровывается закрытым. Подробнее об этом уже было очень хорошо написано в .

Автоматизировать шифрование поможет следующий скрипт, на выходе которого вы получите одноразовый ключ и данные (encrypt.sh) в зашифрованном виде:

FILENAME="$1"
PUBLICKEY="$2"
SESSIONKEY="$3"
RESULT="$4"

# Generate the random symmetric-key
PASSIZE=30
if [ -c /dev/urandom ] ; then
KEY=`head -c 30 /dev/urandom | openssl enc -base64`
else
KEY=`openssl rand -base64 30`
fi
export KEY

# Encrypt the symmetric key using the public key
openssl rsautl -encrypt -inkey "$PUBLICKEY" -out "$SESSIONKEY" -pubin < $KEY
EOF

# Encrypt the file
openssl enc -aes-256-cbc -pass env:KEY -in "$FILENAME" -out "$RESULT"

Следующая команда использует открытый ключ public.pem чтобы зашифровать файл documents.zip. Она сгенерирует зашифрованный одноразовый ключ session.key и зашифрованные данные documents.enc:

./encrypt.sh documents.zip public.pem session.key documents.enc

Скрипт для дешифрования (decrypt.sh):

PRIVATEKEY="$1"
SESSIONKEY="$2"
ENCRYPTED="$3"
DECRYPTED="$4"

# Decrypt the symmetric key using the private key
KEY=` openssl rsautl -decrypt -inkey "$PRIVATEKEY" -in "$SESSIONKEY" `
export KEY

# Decrypt the file
openssl enc -aes-256-cbc -d -pass env:KEY -in "$ENCRYPTED" -out "$DECRYPTED"

Команда для дешифрования использует закрытый ключ private.pem и одноразовый ключ session.key чтобы расшифровать файл documents.enc. Она сгенерирует файл documents.zip:

./decrypt.sh private.pem session.key documents.enc documents.zip

Как видите, шифрование с открытым ключом может быть почти таким же простым как и симметричное. Но есть ещё более простой путь. На написание этого поста меня побудил блог SbF₅ . Его автор (несомненно более искушённый в bash чем я) написал скрипт , который архивирует папку, шифрует её открытым ключом и генерирует другой скрипт, содержащий в себе всё необходимое: одноразовый ключ, данные и собственно команды для расшифровывания. Кроме того, скрипт может сгенерировать для вас пару RSA ключей:

./encrypt-file.sh -keys public.pem private.pem
./encrypt-file.sh folder public.pem > decrypt-folder.sh
chmod +x decrypt-folder.sh
./decrypt-folder.sh private.pem > folder.tar

В этом примере мы сначала сгенерировали пару ключей. После этого папка folder была зашифрована в скрипт decrypt-folder.sh а затем расшифрована в архив folder.tar. Возможный минус этого способа - то что данные в decrypt-folder.sh хранятся в формате BASE64, а следовательно их размер увеличивается.

UPD Перенесено в блог Информационная безопасность.

Как вы поняли из этих статей, не каждая программа которая обещает шифровать файлы обеспечивает безопасность информации. Как говорит Брюс Шнайер — «Криптография бывает двух типов: криптография, которая помешает читать ваши файлы вашей младшей сестре, и криптография, которая помешает читать ваши файлы дядям из правительства». OpenSSL очень популярная библиотека, которою для криптографии используют многие — как платные, так и бесплатные программы. В OpenSSL реализовано большое количество алгоритмов и режимов шифрования, что позволяет сделать выбор вам самим, а не разработчику программы.
Помимо самой библиотеки в пакет OpenSSL входит набор консольных утилит. В данной статье речь пойдёт о шифровании файлов симметричными алгоритмами.
Для шифрования файла с помощью OpenSSL надо воспользоваться командой openssl enc . Для этого доступен широкий выбор алгоритмов шифрования которые поддерживает OpenSSL — Blowfish , Camellia , DES , RC2 , RC4 , RC5 , IDEA , AES и другие. Помимо разнообразных алгоритмов также доступны разные режимы шифрования — ECB , CBC , CFB , OFB . Некоторые режимы шифрования можно использовать с разной разрядностью.
Для того что-бы просмотреть список опций команды openssl enc достаточно набрать:

$ openssl enc --help
options are
-in input file
-out output file
-pass pass phrase source
-e encrypt
-d decrypt
-a/-base64 base64 encode/decode, depending on encryption flag
-k passphrase is the next argument
-kfile passphrase is the first line of the file argument
-md the next argument is the md to use to create a key
from a passphrase. One of md2, md5, sha or sha1
-S salt in hex is the next argument
-K/-iv key/iv in hex is the next argument
- print the iv/key (then exit if -P)
-bufsize buffer size
-nopad disable standard block padding
-engine e use engine e, possibly a hardware device.
Cipher Types
-aes-128-cbc -aes-128-cfb -aes-128-cfb1
-aes-128-cfb8 -aes-128-ecb -aes-128-ofb
-aes-192-cbc -aes-192-cfb -aes-192-cfb1
-aes-192-cfb8 -aes-192-ecb -aes-192-ofb
-aes-256-cbc -aes-256-cfb -aes-256-cfb1
-aes-256-cfb8 -aes-256-ecb -aes-256-ofb
-aes128 -aes192 -aes256
-bf -bf-cbc -bf-cfb
-bf-ecb -bf-ofb -blowfish
-camellia-128-cbc -camellia-128-cfb -camellia-128-cfb1
-camellia-128-cfb8 -camellia-128-ecb -camellia-128-ofb
-camellia-192-cbc -camellia-192-cfb -camellia-192-cfb1
-camellia-192-cfb8 -camellia-192-ecb -camellia-192-ofb
-camellia-256-cbc -camellia-256-cfb -camellia-256-cfb1
-camellia-256-cfb8 -camellia-256-ecb -camellia-256-ofb
-camellia128 -camellia192 -camellia256
-cast -cast-cbc -cast5-cbc
-cast5-cfb -cast5-ecb -cast5-ofb
-des -des-cbc -des-cfb
-des-cfb1 -des-cfb8 -des-ecb
-des-ede -des-ede-cbc -des-ede-cfb
-des-ede-ofb -des-ede3 -des-ede3-cbc
-des-ede3-cfb -des-ede3-cfb1 -des-ede3-cfb8
-des-ede3-ofb -des-ofb -des3
-desx -desx-cbc -idea
-idea-cbc -idea-cfb -idea-ecb
-idea-ofb -rc2 -rc2-40-cbc
-rc2-64-cbc -rc2-cbc -rc2-cfb
-rc2-ecb -rc2-ofb -rc4
-rc4-40 -rc5 -rc5-cbc
-rc5-cfb -rc5-ecb -rc5-ofb
-seed -seed-cbc -seed-cfb
-seed-ecb -seed-ofb

После блока Cipher Types перечисляются доступные алгоритмы вместе с режимами. Шифрования по алгоритму DES представлено несколькими вариантами. Помимо стандартного DES есть ещё тройной 3DES (который тоже в нескольких вариантах) и DESX . Теперь давайте попробуем зашифровать что-то.

$ openssl enc -e -in infile.txt -out outfile.bf_cbc -bf-cbc

Эта команда зашифрует файл infile.txt по алгоритму blowfish в режиме CBC и запишет результат в файл outfile.bf_cbc . Перед тем как зашифровать будет запрошен ключ для шифрования. Для расшифровки этого файла надо воспользоваться такой командой:

$ openssl enc -d -in outfile.bf_cbc -out dec_file.txt -bf-cbc

На запрос ввода ключа надо ввести тот ключ, который был введён при шифровании.
Если вы хотите сжать данные, то делать это надо, по понятным причинам, перед шифрованием.
Теперь давайте разберёмся с опциями командной строки. Опция -e указывает на то, что файл необходимо шифровать (эта опция включена по умолчанию), а опция -d расшифровывать. Ключ для шифрования можно ввести при вызове openssl enc с помощью опции -k, или в файле с помощью опции -kfile.
С помощью опции -nosalt можно отключить использование salt при шифровании (не рекомендуется так как понижает защищённость шифра).
С помощью этой утилиты также можно выполнять преобразование в base64 и обратно, но это преобразование не есть шифрованием. Детальнее читайте на сайте проекта — http://www.openssl.org/docs/apps/enc.html . Если есть какие-то вопросы спрашивайте.

P.S. После того как зашифровали информацию, необходимо правильно удалить первоначальный файл что-бы не осталось никакой остаточной информации . Для этого можете воспользоваться какой-нибудь программой которая реализует метод Гутмана . Также если вы вводите пароль в командной строке убедитесь что он не сохранился в истории, а если он читается из файла тогда что он был полностью удалён.

Такие инструменты, как OpenSSH и OpenSSL, в представлении не нуждаются. Это вечные друзья любого сисадмина и многих продвинутых пользователей. Однако далеко не все знают об их истинной мощи и возможностях, накопленных за годы разработки. Сегодня тебе откроется масса интересных способов использования этих программ.

OpenSSH

OpenSSH, пришедший на смену дырявому Telnet, до сих пор занимает первое место среди систем удаленного управления благодаря безопасности и простоте в использовании. Разобраться в нем способны все, даже самые хромированные чайники, однако подавляющее большинство пользователей задействует минимум его возможностей. Опустим рассказы о ключах, пробросах портов, проксировании и других полезных, но всем известных приемах и рассмотрим на самом деле интересные и не слишком распространенные способы использования этого инструмента.

INFO

С полным списком команд OpenSSL можно ознакомиться с помощью следующих параметров: list-standart-commands, list-message-digest-commands, list-cipher-commands.

Итак, трюк номер один - множественные подключения. OpenSSH способен обслуживать множество одновременных соединений с одной и той же машиной. Обычно пользователи просто запускают команду и ждут ее завершения, чтобы запустить следующую. К счастью, эту проблему легко обойти путем разделения одного соединения на множество сессий. Просто добавь в конфиг ssh (~/.ssh/config) следующие строки:

ControlMaster auto ControlPath ~/.ssh/mux_%h_%p_%r

Ты сможешь создать столько соединений с одним и тем же сервером, сколько посчитаешь нужным, причем время на повторную аутентификацию тратить будет не нужно.


Трюк номер два - проксирование соединений. Допустим, ты не можешь создать соединение с SSH-сервером напрямую, но можешь использовать для этого другой хост, к которому ты тоже имеешь SSH-доступ. Добавь в свой конфиг следующие строки:

ForwardAgent yes Host host HostName host.com ProxyCommand ssh proxy-host.com \ netcat -q 600 %h %p

Команда ssh host создаст соединение с сервером host.com через сервер proxy-host.com.

Трюк номер три - выход за пределы HTTP-изоляции. Многие организации не просто режут неугодный им трафик, но и принуждают пользователей выходить в Сеть только с использованием HTTP-протокола. Такую несправедливость легко обойти с помощью сorkscrew (www.agroman.net/corkscrew/), который умеет туннелировать SSH-трафик через HTTP. Просто установи его на свою машину и добавь в конфиг следующие строки (где proxy.com и 80 - это адрес внешнего HTTP-прокси и его порт):

Host * ProxyCommand corkscrew proxy.com 80 %h %p

Теперь все соединения пойдут через указанный HTTP-прокси.

Трюк номер четыре - тест пропускной способности сети. Чтобы протестировать скорость соединения, необязательно устанавливать специализированное ПО, достаточно утилиты pv и старого доброго SSH:

$ sudo apt-get install pv $ yes | pv | ssh host.com "cat > /dev/null"

Трюк номер пять - удаленный анализ сетевого трафика. Почти в любой UNIX-системе есть сетевой сниффер tcpdump, однако читать его логи довольно утомительно. Возможности OpenSSH помогут упростить анализ трафика:

$ ssh [email protected] tcpdump -w – "port !22" \ | wireshark -k -i -

Теперь весь трафик, проходящий через host.com, будет виден в графическом окне wireshark на твоей машине.

Трюк номер шесть - передача файлов на низкой скорости. Иногда бывает необходимо передать большое количество файлов на удаленную машину, но сделать это так, чтобы процесс не мешал работе с сетью. В этом случае можно воспользоваться инструментом cstream:

$ sudo apt-get install cstream $ tar -cj /backup | cstream -t 512k | \ ssh host "tar -xj -C /backup"

Трюк номер семь - всегда открытая SSH-сессия. Пользователям ноутбуков, чье соединение с сетью может быть не постоянным, приходится каждый раз заново запускать SSH-клиент в момент, когда сеть появляется, и убивать его при потере соединения. Избежать этого можно с помощью инструмента autossh, который будет поддерживать иллюзию постоянного соединения с сервером, восстанавливая связь, когда сеть окажется доступной:

$ sudo apt-get install autossh $ autossh -M50000 -t server.example.com \ "screen -raAd mysession"

Трюк номер восемь - запуск команды на нескольких серверах одновременно. Комментарии излишни:

$ echo "uptime" | pee "ssh host1" "ssh host2" \ "ssh host3"

Трюк номер девять - удаленное сравнение файлов. Часто требуется сравнить локальную и удаленную версию какого-либо конфига, однако копировать файлы туда-сюда неудобно и долго. В этом случае можно воспользоваться следующей командой:

$ ssh user@host cat /путь/к/удаленному/файлу | \ diff /путь/к/локальному/файлу -

То же самое можно проделать для двух файлов, находящихся на разных серверах:

$ diff <(ssh host1 cat /etc/apt/sources.list) \ <(ssh host2 cat /etc/apt/sources.list)

cpu0: RNG AES

Результаты бенчмарка криптографических средств, встроенных в CPU платформы VIA Eden (процессорные инструкции для работы с алгоритмом блочного симметричного шифрования AES):

% openssl speed -elapsed -evp aes-256-cbc type 16 bytes 64 bytes256 bytes 1024 bytes 8192 bytes aes-256-cbc 21780.33k79591.78k 198578.08k 317102.05k 383371.05k

Трюк номер 10 - одновременный просмотр логов с нескольких машин. С помощью multitail и SSH можно запросто просматривать логи с двух серверов одновременно:

$ sudo apt-get install multitail $ multitail -l "ssh host1 "tail -f \ /var/log/apache2/error.log"" -l "ssh host2 \ "tail -f /var/log/apache2/error.log""

Трюк номер 11 - копирование файлов с одной удаленной машины на другую через локальную. В случае если две удаленные машины не могут установить связь друг с другом, файлы между ними можно передавать, используя свой комп в качестве промежуточного звена:

$ ssh root@host1 "cd /каталог && tar -cf – ." |\ ssh root@host2 "cd /каталог && tar -xf -"

Трюк номер 12 - копирование вывода удаленной команды в буфер обмена. Часто требуется скопировать вывод удаленной команды в буфер обмена, чтобы вставить его в письмо, сообщение форума и т. д. Проще всего это сделать с помощью утилиты xclip:

$ ssh user@host cat /файл.txt | xclip

Трюк номер 13 - синхронизация времени средствами SSH. В случае, если машина не имеет доступа к NTP-серверу или на ней не установлен NTP-клиент, синхронизировать время между машинами можно так:

# date --set="$(ssh user@server date)"

Трюк номер 14 - установка пакетов удаленной машины на локальную. Нередко требуется синхронизировать две машины так, чтобы они имели одинаковый набор установленных пакетов. Стандартными методами сделать это сложно, но с помощью SSH проще простого:

# ssh remotehost "dpkg --get-selections" | \ dpkg --set-selections && dselect install

Трюк номер 15 - снимок удаленного экрана. Можно очень легко получить изображение X-сервера с удаленной машины, воспользовавшись стандартным графическим пакетом ImageMagick:

# ssh user@host "DISPLAY=:0.0 import -window \ root -format png -" | display -format png -

Трюк номер 16 - ускорение передачи данных. Если машины, с которыми установлено соединение, находятся внутри заведомо безопасной сети (например, офис или дом), передачу данных средствами SSH можно несколько ускорить, если использовать менее стойкий алгоритм шифрования. Для этого добавь в конфигурационный файл следующие строки:

Host host.com Ciphers arcfour256 MACs [email protected]

Трюк номер 17 - вывод звука с удаленной машины на локальную. Вместе с картинкой рабочего стола удаленной машины иногда хочется получить и звук. Это делается с помощью банального dd:

$ dd if=/dev/dsp | ssh -c arcfour -C \ user@host dd of=/dev/dsp

Трюк номер 18 - запуск локального скрипта на удаленной машине. Нередко требуется запустить скрипт на удаленной машине, однако копировать его туда совсем необязательно, достаточно выполнить следующую простую команду:

$ ssh -T user@host < script.sh

OpenSSL

OpenSSL представляет собой систему защиты и сертификации данных, которая была разработана в ответ на создание протокола безопасных сокетов SSL компанией Netscape. Вопреки расхожему мнению, OpenSSL вовсе не является инструментом для реализации SSL-протокола и может выполнять множество самых разнообразных функций, в том числе управлять ключами и сертификатами, рассчитывать хеши и т. д. Вот лишь неполный список возможностей этого криптографического комбайна:

  • создание ключей RSA и DSA и управление ими (команды rsa, dsa, dsaparam);
  • создание сертификатов формата x509, формирование запросов на сертификацию, восстановление (команды x509, req, verify, ca, crl, pks12, pks7);
  • симметричное и асимметричное шифрование данных (команды enc, rsautl);
  • расчет хешей (команда dgst);
  • работа с S/MIME (команда s/mime).

Также OpenSSL может быть использован для проверки SSL-серверов и клиентов с помощью специальных команд sclient/s server и для тестирования скорости работы различных алгоритмов (команда speed).

Мы не раз писали о работе с пакетом OpenSSL, поэтому не будем рассматривать стандартные примеры его использования вроде создания хешей и сертификатов, а сразу перейдем к более серьезным трюкам.


Время - деньги

Одна из интересных особенностей OpenSSL заключается в том, что он может провести бенчмарк используемых алгоритмов и скорости установления SSL-соединения. Для этого предназначена стандартная команда s_time. Чтобы оценить скорость установки SSL-соединения, нужно применить ее к команде openssl:

$ openssl s_time -connect gmail.com:443 \ -www /test.html -new 103 connections in 0.75s; 137.33 connections/user sec, bytes read 42436 103 connections in 31 real seconds, 412 bytes read per connection

То же самое можно проделать с помощью наиболее стойких алгоритмов:

$ openssl s_time -ssl3 -cipher HIGH \ -connect gmail.com:443 -www / -new 99 connections in 0.73s; 135.62 connections/user sec, bytes read 40788 99 connections in 31 real seconds, 412 bytes read per connection

Эти две команды позволяют определить максимальную пропускную способность SSL-сервера. Но еще более интересный способ заключается в тестировании всех поддерживаемых алгоритмов. Для этого нам придется прибегнуть к скриптингу:

IFS=":" for c in $(openssl ciphers -ssl3 RSA); do echo $c openssl s_time -connect host:443 -www / -new \ -time 10 -cipher $c 2>&1 | grep bytes echo done

Такая команда позволяет измерить скорость установки SSL-соединения с помощью различных алгоритмов шифрования, что можно использовать, например, для тюнинга SSL-сервера. Если же SSL-сервера как такового еще нет, его легко эмулировать с помощью самого OpenSSL. На серверной машине запускаем OpenSSL-сервер: