Многие прикладные протоколы, такие как HTTP, SMTP, POP3, IMAP, TELNET были придуманы в те далекие времена, когда в Сети не было "браконьерства”, все люди были братья и доверяли друг другу. Но с тех пор, как Интернет вошел во все сферы современного человека, он сильно изменился. Так же, как когда-то назрела необходимость ставить противоугонные сигнализации на автомобили, появилась необходимость и в защите передачи данных. Было придумано криптование. Появилась даже целая наука, под названием криптография. А прежние прикладные протоколы были переписаны и с учетом требований безопасности они теперь поддерживали шифрование передаваемых данных. Нешифрованные протоколы, естественно, не ушли в небытие и по-прежнему широко используются в Сети. Но если Вам необходима безопасность и уверенность в том, что при авторизации где-либо никто не перехватит Ваш пароль, Вы можете использовать в работе протоколы https, smtps, pop3s, imaps, ssh и т.д., которые будут хранить Вашу конфиденциальную информацию с применением SSL шифрования.
Протокол SSL (Secure Socket Layer) использует асимметричную криптографию, обычно известную как криптография с открытым ключом. В криптографии с открытым ключом создаются два ключа, одни публичный, другой секретный. Все зашифрованное с помощью одного ключа может быть расшифровано только с помощью другого. То есть данные, которые были зашифрованы секретным ключом сервера могут быть дешифрованы только с помощью публичного ключа этого же сервера, давая уверенность в том, что данные пришли оттуда от него.
Более подробно об SSL можно почитать в Wiki. Мы же займемся настройкой поддержки SSL шифрования для нашего веб сервера Apache.
В статье ранее был опубликован материал по установке и настройке Apache 1.3 на машину под управлением операционной системы FreeBSD. В этой же статье было рассказано о том, как подключить для работы Apache интерпретатор PHP и модуль Perl. Теперь поговорим о том, как же обезопасить соединения с нашим веб сервером.
Для работы нам впервую очередь понадобится openssl. В системе он уже должен присутствовать. Проверьте:
# whereis openssl openssl: /usr/bin/openssl /usr/share/openssl/man/man1/openssl.1.gz
Отлично. OpenSSL имеется. Если у Вас ситуация иная, загляните в порт /usr/ports/security/openssl и установите openssl из него.
Теперь следует поставить Apache с поддержкой SSL. У меня раньше стоял без поддержки, потому его следует деинсталлировать.
# pkg_info | grep apache apache-1.3.41 The extremely popular Apache http server. # pkg_delete apache-1.3.41
Далее идем в порты, достаем оттуда www/apache13-modssl и собираем его.
# cd /usr/ports/www/apache13-modssl # make
Старый конфиг httpd.conf (надеюсь, Вы его забекапили перед тем, как снесли старую версию?) выбрасывать не стоит. Он нам пригодится в дальнейшем и нам ничего не прийдется настраивать заново - только довнести определенные параметры настройки SSL.
После сборки пакета на экран вывалится инфо:
<=== src/support +---------------------------------------------------------------+ | Before you install the package you now should prepare the SSL | | certificate system by running the 'make certificate' command. | | For different situations the following variants are provided: | | | | % make certificate TYPE=dummy (dummy self-signed Snake cert) | | % make certificate TYPE=test (test cert signed by Snake CA) | | % make certificate TYPE=custom (custom cert signed by own CA) | | % make certificate TYPE=existing (existing cert) | | CRT=/path/to/your.crt [KEY=/path/to/your.key] | | | |Use: | | TYPE=dummy when you're a vendor package maintainer, | | TYPE=test when you're an admin but want to do tests only, | | TYPE=custom when you're an admin willing to run a real server | | TYPE=existing when you're an admin who upgrades a server. | | (The default is TYPE=test) | | | | Additionally add ALGO=RSA (default) or ALGO=DSA to select | | the signature algorithm used for the generated certificate. | | | | Use 'make certificate VIEW=1' to display the generated data. | | | | Thanks for using Apache - mod_ssl. Ralf S. Engelschall | | rse@engelschall.com | | www.engelschall.com | +---------------------------------------------------------------+ <=== src ===> Creating Dummy Certificate for Server (SnakeOil) use 'make certificate' to create a real one]
Нам советуют сразу же создать сертификаты SSL.
Прежде чем инсталлировать пакет, Вы должны приготовить SSL сертификат путем запуска команды ‘make certificate’. Для различных ситуаций предлагаются следущие варианты: % make certificate TYPE=dummy (”тупой” самоподписанный сертификат Snake) % make certificate TYPE=test (тестовый сертификат Snake подписанный Snake CA) % make certificate TYPE=custom (выборочные параметры сертификата, который будет подписан собственным CA) % make certificate TYPE=existing (использовать существующий сертификат) CRT=/путь/к_вашему/сертификату.crt [KEY=/путь/к_вашему/ключу.key] Используйте следущие опции: TYPE=dummy если Вы попросту собираете пакет из исходников TYPE=test если Вы администратор, но желаете попросту провести тесты TYPE=custom если Вы администратор и желаете запустить рабочий сервер TYPE=existing если Вы администратор и обновляете свой сервер. (По умолчанию применяется TYPE=test) Отдельно Вы можете указать: ALGO=RSA (по-умолчанию) или ALGO=DSA для выбора алгоритма подписи, который будет использован при генерировании сертификата. Используйте ‘make certificate VIEW=1′ для отображения сгенерированных данных. Спасибо, что юзаете Апача с модом ССЛ.
Прежде чем инсталлировать пакет, Вы должны приготовить SSL сертификат путем запуска команды ‘make certificate’. Для различных ситуаций предлагаются следущие варианты:
Используйте следущие опции:
(По умолчанию применяется TYPE=test)
Отдельно Вы можете указать: ALGO=RSA (по-умолчанию) или ALGO=DSA для выбора алгоритма подписи, который будет использован при генерировании сертификата.
Используйте ‘make certificate VIEW=1′ для отображения сгенерированных данных.
Спасибо, что юзаете Апача с модом ССЛ.
Что-ж, не будем пренебрегать этим советом. Сгенерируем custom сертификат.
make certificate TYPE=custom
Начнем отвечать на вопросы.
STEP 0: Signature Algorithm ((R)SA or (D)SA) [R]: - Выбираем тип алгоритма шифрования подписи - R
STEP 0: Signature Algorithm ((R)SA or (D)SA) [R]:
STEP 1: Генерируется персональный (секретный) RSA ключ для поставщика сертификата.
STEP 1:
STEP 2: - Следует ответить на вопросы о поставщике сертификата. Если мы генерируем сертификат самостоятельно, то и информацию будем вводить о себе. Будущий сертификат будет "выдан самим собой”. Хотя, если Вам действительно необходим сертификат от действительно сертифицированного поставщика, можете обратиться, например, в Verisign.
STEP 2:
1. Country Name - двухбуквенный код страны - UA (Украина) или RU (Россия) 2. State or Province Name - название провинции (штата, области) - DP 3. Locality Name - город - Dnepropetrovsk 4. Organization Name - название организации - Daemony’s Personal 5. Organizational Unit Name - подразделение - Certificator 6. Common Name - основное имя подписывающего сертификатора - Daemony CA 7. Email Address - ну тут понятно, думаю. 8. Certificate Validity - срок действия сертификата, дней - 1095
STEP 3: Генерируется X.509 сертификат поставщика, который был выдан самим собой [ca.crt].
STEP 3:
STEP 4: Генерируется персональный (секретный) RSA ключ для нашего сервера.
STEP 4:
STEP 5: - Следует ответить на вопросы о нашем сервере и его владельце. Вобщем, информация которую мы ниже введем будет доступна при просмотре нашего будущего сертификата сервера. Важно! Пункт 6 - Common Name - следует указать в точности такой как и доменное имя Вашего сервера.
STEP 5:
1. Country Name - двухбуквенный код страны - UA (Украина) или RU (Россия) 2. State or Province Name - название провинции (штата, области) - DP 3. Locality Name - город - Dnepropetrovsk 4. Organization Name - название организации - Daemony’s Secured Server 5. Organizational Unit Name - подразделение - Some else 6. Common Name - основное имя сервера (!!!) - seсure.com 7. Email Address - электронный адрес администратора сервера. 8. Certificate Validity - срок действия сертификата, дней - 1095
STEP 6: Генерируется X.509 сертификат для сервера seсure.com [server.crt]
STEP 6:
STEP 7: RSA шифрование персонального ключа поставщика сертификата (CA) с помощью пароля [ca.key].
STEP 7:
Вам расскажут о том, что файл ca.key содержит очень важную информацию, а спросят "следует ли засекретить ca.key установив на него пароль”?
Encrypt the private key now? [Y/n]:
Ну попробуем согласиться, и нажать Y.
writing RSA key
Нас попросят ввести пароль, а потом его повторить:
Enter PEM pass phrase: Verifying - Enter PEM pass phrase:
Если Вы неверно введете подтверждение пароля скрипт завершит свою работу с ошибкой. Если все хорошо, то Вы увидите:
Fine, you’re using an encrypted private key.
STEP 8: Аналогично, как и в предыдущем случае, нам предложат поставить пароль на персональный ключ сервера [server.key]. Согласимся.
STEP 8:
Все. Программа на этом завершает свою работу. По окончании операции мы получим сгенерированные файлы
conf/ssl.key/ca.key conf/ssl.crt/ca.crt conf/ssl.key/server.key conf/ssl.crt/server.crt conf/ssl.csr/server.csr
которые будут установлены в каталог /usr/local/etc/apache/. Можно проинсталить пакет и запустить Apache.
/usr/local/etc/apache/
# make install clean # apachectl start [Sat Feb 23 00:09:23 2008] [warn] Loaded DSO libexec/apache/libphp5.so uses
plain Apache 1.3 API, this module might crash under EAPI! (please recompile
it with -DEAPI)
[Sat Feb 23 00:09:23 2008] [warn] Loaded DSO libexec/apache/libperl.so uses
it with -DEAPI) /usr/local/sbin/apachectl start: httpd started
Упс… Ругается. Прийдется теперь и PHP с Perl перекомпилировать, поскольку до этого он был собран с plain Apache 1.3 API.
# pkg_info | grep php5-5 ; pkg_info | grep mod_perl php5-5.2.5_1 PHP Scripting Language mod_perl-1.30 Embeds a Perl interpreter in the Apache server # portupgrade –force php5-5.2.5_1 mod_perl-1.30
Пересобралось. Проверяем.
root# apachectl stop /usr/local/sbin/apachectl stop: httpd stopped root# apachectl start /usr/local/sbin/apachectl start: httpd started
Вот теперь полный порядок! Можно перейти к конфигурирования нашего защищенного веб сервера.
Открываем /usr/local/etc/apache/httpd.conf и проверяем (а при отсутствии добавляем) следущие строки:
/usr/local/etc/apache/httpd.conf
- в секции LoadModule после всех модулей:
LoadModule
<IfDefine SSL> LoadModule ssl_module libexec/apache/libssl.so </IfDefine>
- в секции AddModule после всех модулей:
AddModule
<IfDefine SSL> AddModule mod_ssl.c </IfDefine>
- далее, после Port 80:
Port 80:
<IfDefine SSL> Listen 80 Listen 443 </IfDefine>
- и напоследок
##### SSL ##### <IfDefine SSL> AddType application/x-x509-ca-cert .crt AddType application/x-pkcs7-crl .crl </IfDefine> <IfModule mod_ssl.c> SSLPassPhraseDialog builtin SSLSessionCache dbm:/var/run/ssl_scache SSLSessionCacheTimeout 300 SSLMutex file:/var/run/ssl_mutex SSLRandomSeed startup builtin SSLRandomSeed connect builtin SSLLog /var/log/apache/ssl_engine.log SSLLogLevel info </IfModule>
Теперь нам осталось всего лишь добавить виртуальный хост с поддержкой SSL. Делаем это так:
<IfDefine SSL> <VirtualHost seсure.com:443> ServerName seсure.com ServerAdmin root@seсure.com DocumentRoot /usr/local/www/seсure.com/htdocs-s ErrorLog /usr/local/www/seсure.com/logs/error.log TransferLog /usr/local/www/seсure.com/logs/transfer.log CustomLog /usr/local/www/seсure.com/logs/ssl_request.log \ ”%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \”%r\” %b” SSLEngine On SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:\ +MEDIUM:+LOW:+SSLv2:+EXP:+eNULL SSLCertificateFile /usr/local/etc/apache/ssl.crt/server.crt SSLCertificateKeyFile /usr/local/etc/apache/ssl.key/server.key <Files ~ "\.(cgi|shtml|phtml|php?)$”> SSLOptions +StdEnvVars </Files> <Directory "/usr/local/www/seсure.com/cgi-bin”> SSLOptions +StdEnvVars </Directory> SetEnvIf User-Agent ".*MSIE.*” \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 <Directory "/usr/local/www/seсure.com/htdocs-s”> Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny Allow from all </Directory> </VirtualHost> </IfDefine>
Как сделать так, чтобы прежний виртуальный сервер, который у нас уже был в конфиге, работал теперь по https, а всех пришедших на него по http перенаправлял туда же? Очень просто. Допустим у нас в файле httpd.conf уже существовал сервер:
<VirtualHost seсure.com:80> ServerName seсure.com ServerAdmin root@seсure.com DocumentRoot /usr/local/www/seсure.com/htdocs CustomLog /usr/local/www/seсure.com/logs/access.log combined ErrorLog /usr/local/www/seсure.com/logs/error.log <Directory "/usr/local/www/seсure.com/htdocs”> Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny Allow from all </Directory> </VirtualHost>
Переместим все файлы этого сервера из папки /usr/local/www/seсure.com/htdocs/ в /usr/local/www/seсure.com/htdocs-s/, а в /usr/local/www/seсure.com/htdocs/ оставим всего один файл - .htaccess с таким содержанием:
Redirect permanent / https://secure.com/
Сохраняем httpd.conf. Проверяем все пути к файлам и папкам, а также права на них. И пробуем запускать наш сервер.
Для того, чтобы запустить Apache с поддержкой SSL следует выполнить команду:
# apachectl startssl
В этот момент наш Apache попытается прочесть собственный персональный ключ server.key. Однако, ранее мы на server.key установили пароль, а потому apache у нас его запросит:
root# apachectl startssl Apache/1.3.41 mod_ssl/2.8.31 (Pass Phrase Dialog) Some of your private key files are encrypted for security reasons. In order to read them you have to provide us with the pass phrases. Server secure.com:443 (RSA) Enter pass phrase:
Не введете правильно пароль, сервер не запустится. Собственно, данным примером я показал для чего мы все таки поставили пароль на персональный ключ - для его защиты. Но для запуска сервера при старте системы постоянно вводить пароль, естественно, мы не сможем. Сейчас мы это ограничение уберем и снимем защиту по паролю к персонального ключа.
root# cd /usr/local/etc/apache/ssl.key root# cp server.key server.key.backup root# openssl rsa -in server.key.backup -out server.key Enter pass phrase for server.key.backup: вводим наш пароль writing RSA key
Все. Пароль больше Apache не спросит. Но учтите, что Вы должны теперь позаботиться о максимальной сохранности файла server.key. Сделать это можно только лишь установив верно права на файлы и каталоги.
Проверяем наличие строки apache_enable=”YES” в файле /etc/rc.conf и пробуем вновь запустить наш Apache:
apache_enable=”YES”
/etc/rc.conf
root# apachectl startssl /usr/local/sbin/apachectl startssl: httpd started
Проверим, точно ли запустился?
# sockstat | grep httpd www httpd 31273 21 tcp4 *:443 *:* www httpd 31273 22 tcp4 *:80 *:* www httpd 31272 21 tcp4 *:443 *:* www httpd 31272 22 tcp4 *:80 *:* root httpd 31270 21 tcp4 *:443 *:* root httpd 31270 22 tcp4 *:80 *:* root# ps -ax | grep httpd 31270 ?? Ss 0:00,60 /usr/local/sbin/httpd -DSSL 31272 ?? I 0:00,00 /usr/local/sbin/httpd -DSSL 31273 ?? I 0:00,02 /usr/local/sbin/httpd -DSSL 31347 ?? I 0:00,07 /usr/local/sbin/httpd -DSSL 31349 ?? I 0:00,00 /usr/local/sbin/httpd -DSSL
Все работает. Теперь попробуем проверить работает ли перенаправление http://secure.com/ -> https://secure.com/ . Если получаете какую-либо ошибку, проверьте первым делом, что у Вас в httpd.conf подключен модуль mod_rewrite. Хотя если Вы ничего не изменяли, по-умолчанию он присутствует.
При первом входе на Ваш сервер https://secure.com/ браузер даст Вам знать о том, что прислан SSL сертификат. Также Вы узнаете, что этот сертификат не подписан ни одним из доверенных издателей. Вобщем Ваше право принимать такой сертификат ;).
https://secure.com/
Кроме запуска, останова и перезапуска Apache посредством apachectl можно использовать стандартный rc скрипт, который поставляется вместе с дистрибутивом и после инсталяции помещается в папку /usr/local/etc/rc.d/. Если посмотреть в скрипт, то можно увидеть такую строчку:
apache_flags=”-DSSL”
Эта опция заставляет запускаться Apache с поддержкой SSL.
Учтите, что с использованием SSL расходы трафика будут больше, потому что передается больше данных. В основном, это для пользователя не нужные данные и содержат они в себе ключи шифрования и сами данные в шифрованном виде. Но по большому счету, это все мелочи.