Содержание

Криптография

Предисловие

Я хочу добиться высокой степени безопасности своей системы. Как и какими средствами мне этого достичь?

Достижение любой цели не обходится без определённых жертв (переосмыслив которые в будущем, Вы можете даже принять их за благо), и важным шагом на таком пути будет отказ от MS Windows. Однако, это не означает что переход произойдёт моментально и без трудностей, но нужно понемногу работать в этом направлении и изучать Unix-системы, Linux или *BSD.

Зацикленность людей на Windows и поиск решений для укрепления этой ОС напоминает визит к врачу тяжело больного пациента, который просит быстродействующего и быстропомогающего лекарства. Врач понимает, что такое лекарство может ему временно помочь, однако оно не вылечит болезнь, не увеличит срок жизни, и больной всё равно продолжит идти к могиле. Вместо этого ему предлагаются кардинальные методы (*nix-система), которые могут помочь, но они не действуют моментально, требуют терпения и выдержки, требуют сменить привычный образ жизни, требуют регулировать своё питание, и ещё много в чём себя контролировать/исправлять. Но, как показывает практика, больные в большинстве тем не менее выбирают морфий Windows. [ источник ]

Основные понятия

Стандарной программой шифрования в линуксе является PGP - Pretty Good Privacy (бесплатна для некоммерческого использования) или открытый аналог этой GnuPG - Gnu Privacy Guard.

Симметричные шифры

Шифры с открытым ключом

Смешанные шифры

Рас/шифровывание с использованием пары ключей проходит на два-три порядка медленнее, в сравнении с симметричным алгоритмом, требует бо́льших вычислительных ресурсов, поэтому на практике используются смешанные шифры:

Цифровая подпись

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

Источник

Работа с GnuPG

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

(Рас)шифрование файлов

Симметричное шифрование

Источники: раз, два

Хранение паролей: Vim + GnuPG

Общие положения

Дана машина, доступная из сети по ssh, на машине установлен криптографический пакет gpg, установлен vim с плагином vim-gnupg, а также дополнительно доступен git.
Задача обеспечить приватный доступ и хранение паролей на данной машине. Источник: тыц.

  1. Генерируем пару ключей на целевой машине, тыц
    Не забываем сделать копии секретного ключа и создать сертификат отзыва.
  2. Тестируем работоспособность шифрования на файле test.txt:
    Если всё сделано правильно, то будет создан шифрованный файл test.txt.gpg
    gpg --encrypt --recipient master@jurik-phys.net test.txt
  3. Устанавливаем Vim-GnuPG в систему:
    sudo apt-get install vim-scripts
  4. Подключаем плагин к vim'у:
    # создаём локальный каталог плагина
    mkdir ~/.vim/plugin
    # создаём символическую ссылку на плагин
    ln -s /usr/share/vim-scripts/plugin/gnupg.vim ~/.vim/plugin/gnupg.vim
  5. Открываем vim'ом ранее зашифрованный файл
    vim test.txt.gpg

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

  6. При создании новго зашифрованного файла, vim попросит указать получателя
    vim secret.gpg

Настройки в vimrc

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

" Tell the GnuPG plugin to armor new files.
let g:GPGPreferArmor=1
 
" Tell the GnuPG plugin to sign new files.
let g:GPGPreferSign=1
 
augroup GnuPGExtra
    " Set extra file options.
    autocmd BufReadCmd,FileReadCmd *.\(gpg\|asc\|pgp\) call SetGPGOptions()
    " Automatically close unmodified files after inactivity.
    autocmd CursorHold *.\(gpg\|asc\|pgp\) quit
augroup END
 
function SetGPGOptions()
    " Set updatetime to 1 minute.
    set updatetime=60000
    " Fold at markers.
    set foldmethod=marker
    " Remove comment symbols.
    set commentstring=%s
    " Automatically close all folds.
    set foldclose=all
    " Only open folds with insert commands.
    set foldopen=insert
endfunction 

Генерация паролей

Для генерации можно использовать утилиту pwgen прямо из vim'а

:r!pwgen -sy 12 1

Cертификат для сайта.

Получение сертификата

По материалам habrahabr.ru, дополнительная литература.

1. Регистрация на сайте https://login.wosign.com/reg.html и подтверждение электронной почты.

2. Заказ бесплатного сертификата по адресу https://buy.wosign.com/free/. Рядом с ценой (обозначено красным цветом) нажать на синий квадрат (получение бесплатного сертификата), ниже зелёная кнопка - продолжить оформление сертификата.

3. Ввод нужных доменных имен, подтверждение владения доменом. При вводе домена в виде www.example.com, example.com выписывается сервисом автоматически.

4. Генерация на сервере приватного ключа и CSR (Certificate Signing Request) - запроса на получение сертификата, который представляет собой текстовый файл, содержащий в закодированном виде информацию об администраторе домена и открытый ключ:

openssl req -out mydomain.com.csr -new -sha256 -newkey rsa:2048 -nodes -keyout mydomain.com.key

При генерации CSR необходимо ввести, как минимум:

Указанные в CSR данные, должны соответствовать данным, указанным в Whois-сервисе по домену.

5. Вставка содержимого файла mydomain.com.csr в форму сайта. Завершение формальностей с вводом пароля, принятием лицензионного соглашения и т.д.

6. Скачивание zip-архива с сертификатом сайта с сайта или по ссылке в письме. При подписывании сертификата возможна задержка на несколько часов.

7. После установки сертификата и сгенерированного приватного ключа на сайт, желательно проверить уровень безопасности сайта через SSL-тестере.

8. Настройка OCSP stapling на сервере для полученного сертификата.

Настройка OCSP stapling

По материалам 8host.com и , habrahabr.ru

Получение корневого и промежуточного сертификата CA.

wget -O - https://www.startssl.com/certs/ca.pem | tee -a ca-certs.pem > /dev/null 
wget -O - https://www.startssl.com/certs/sub.class1.server.ca.pem | tee -a ca-certs.pem > /dev/null 

Cертификаты в формате DER необходимо сконвертировать в PEM.

wget -O - http://aia.startssl.com/certs/ca.crt | openssl x509 -inform DER -outform PEM | tee -a ca-certs.pem > /dev/null 
wget -O - http://aia1.wosign.com/ca1g2-server1-free.cer | openssl x509 -inform DER -outform PEM | tee -a ca-certs.pem > /dev/null 
wget -O - http://aia6.wosign.com/ca6.server1.free.cer | openssl x509 -inform DER -outform PEM | tee -a ca-certs.pem > /dev/null 

Редактирование файла виртуальных хостов SSL. В директиву <VirtualHost></VirtualHost> добавить:

SSLCACertificateFile /etc/ssl/ca-certs.pem
SSLUseStapling on

Вне директивы <VirtualHost></VirtualHost> указать кэш

SSLStaplingCache shmcb:/tmp/stapling_cache(128000)

Протестировать изменённый конфиг и перезагрузить настройки:

apachectl -t
service apache2 reload

Проверка результата на SSL-тестере.

Protocol Details
----------------
OCSP stapling 	Yes

OCSP stapling итоги

На следующий день после удачной настройки сайт перестал открываться в ошибкой

sec_error_ocsp_try_server_later

В логах apach'а ошибка Bad gateway 502. Вероятно, что проявилась обозначенная на хабре проблема.

Forward Secrecy по-умолчанию

Способ 1. Рекомендованный: (digicert.com).
Использование Forward Secrecy определяется набором используемых шифров.

SSLProtocol all -SSLv2 -SSLv3
SSLHonorCipherOrder On
SSLCipherSuite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4"

Способ 2. Простой, но увеличивающий нагрузку на сервер: (raymii.org).

Увеличение стойкости DH-шифров.

#Generate the parameters
cd /etc/ssl/certs
openssl dhparam -out dhparam.pem 4096

# Add the following to your Apache config.
SSLOpenSSLConfCmd DHParameters "/etc/ssl/certs/dhparam.pem"

Turn On HSTS

HSTS - HTTP Strict Transport Security. Включение, согласно, itigloo.com.

  1. Enable the Apache Headers Module.
    a2enmod headers
  2. Add the additional header to the HTTPS VirtualHost directive. Max-age is measured in seconds.
    <VirtualHost *:443>
        # Guarantee HTTPS for 1 Year including Sub Domains 
        Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"