Apache z mod_ssl - szybki sprint

Zabezpieczenie witryny za pomocą Basic Authentication czy mod_auth_sql na pewno utrudnia dostęp do zasobów, które nie powinny byc dostępne publicznie, jednakże dla wytrawnego włamywacza, wyposażonego w odpowiednie narzędzia, nie stanowi to większej przeszkody. Dane są przesyłanie w postaci jawnej, a więc "wychodzą" z naszego komputera jako zwykły tekst w nagłówkach, które przeglądarka wysyła wraz z rządaniem do serwera. Przkładowy nagłówek może wyglądać tak:

GET /private/index.html HTTP/1.0
Host: localhost
Authorization: Basic dXNlcj1uYXN6ZV90YWpuZV9oYXNsbw==

Pod tym nic nie mówiącym ciągiem znaków kryję się nasz użytkownik wraz hasłem, jest on zakodowany bardzo słabym algorytmem base64 i jego oryginalna postać to "user:nasze_tajne_haslo", dokładny opis można znaleźć w dokumentach RFC1945, RFC2616 i RFC2617. Rozwiązaniem w tym wypadku pozostaje transmisja szyfrowana https.

Start

Pierwszą czynnością jaką musimy zrobić jest instalacja mod_ssl(o ile go nie mamy) oraz openssl, który pozwoli nam samym tworzyć certyfikaty i je podpisywać. Kiedy już mamy wszystko, mod_ssl jest włączony (linijka LoadModule ssl_module modules/mod_ssl.so w httpd.conf, rozszerzenie w systemie Windows to dll), możemy przejść do następnej części, czyli utworzeni certyfikatu.

Tworzenie certyfikatu

Aby utworzyć nasz pierwszy certyfikat musimy w konsoli wydać komende:

openssl req -new > testcert.csr

Program zada nam serie pytań, na które powinniśmy odpowiedzieć, przykładowo jeżeli chciałbym utworzyć certyfikat dla swojego bloga to wyglądałoby to mniej więcej tak:

[mephir@localhost crt]$ openssl req -new > testcert.csr
Generating a 1024 bit RSA private key
..............++++++
......++++++
writing new private key to 'privkey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:PL
State or Province Name (full name) [Berkshire]:zachodniopomorskie
Locality Name (eg, city) [Newbury]:Uniescie
Organization Name (eg, company) [My Company Ltd]:MePhiRBlog
Organizational Unit Name (eg, section) []:website
Common Name (eg, your name or your server's hostname) []:mephir.net.pl
Email Address []:admin@mephir.net.pl

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:tajnehaslo
An optional company name []:MePhiRBlog

Wszystkie odpowiedzi na pytania zadane przez program(tutaj pogrubione) należy zastąpić wartościami odpowienimi dla siebie.

Po zakończeniu działania programu otrzymamy dwa pliki privkey.pem(klucz prywatny) oraz testcert.csr(certyfikat), następną rzeczą jest usunięcie hasła z klucza. Jeżeli tego nie zrobimy możemy mieć problemy podczas np. automatycznego uruchamiania serwera po zaniku napięcia, bowiem Apache będzie za każdym razem prosił nas o hasło.

Usuwanie hasła z klucza

Usunięcie hasła z klucza dokonamy komendą:

openssl rsa -in privkey.pem -out testcert.key

Zostaniemy poproszeni o podanie hasła, które podawaliśmy na początku poprzedniego kroku:

[mephir@localhost crt]$ openssl rsa -in privkey.pem -out testcert.key
Enter pass phrase for privkey.pem:
writing RSA key

Nastepnym etapem będzie przekształcenie żądania certyfikatu w podpisany certyfikat:

openssl x509 -in testcert.csr -out testcert.cert -req -signkey testcert.key -days 3650

W wyniku wykonania programu otrzymamy nastepującą odpowiedź:

[mephir@localhost crt]$ openssl x509 -in testcert.csr -out testcert.cert -req -signkey testcert.key -days 3650
Signature ok
subject=/C=PL/ST=zachodniopomorskie/L=Uniescie/O=MePhiRBlog/OU=website/CN=mephir.net.pl/emailAddress=admin@mephir.net.pl
Getting Private key

Tym poleceniem utworzyliśmy certyfikat X.509 na podstawie wejściowego pliku testcert.csr z żądaniem certyfikatu. Dodatkowo nasz certyfikat został podpisany za pomocą klucza prywatnego testcert.key. Certyfikat będzie ważny przez dziesięć lat.

Konfiguracja Apache

Kiedy wykonaliśmy już powyższe kroki, musimy utworzyć katalogi, w których będziemy przechowywać certyfikat, jak i klucz prywatny. W moim wypadku będzie to /etc/httpd/crt - na certyfikat oraz /etc/httpd/key - na klucz. Zmieniamy nazwę pliku testcert.cert na testcert.crt i przenosimy go do katalogu crt, a testcert.key do katalogu key. Potrzebujemy jeszcze miejsca w którym będziemy chcieli naszą "tajną stronę przechowywać" ja sobie upatrzyłem folder /var/www/sslsite. Musimy do niego wrzucić stronę, może to być prosty plik html np.:

<html>
<head>
<title>Test SSL</title>
</head>
<body>
<h1>Test SSL</h1>
</body>
</html>

Następnie musimy w konfiguracji naszego serwera dodać wirtualnego hosta, który będzie obsługiwał połączenia ssl. Wszystkie rządania protokołu https będą domyślnie przekazywane na port 443, dlateog musimy zadbac aby był on odblokowany na firewallu. Przykładowa postać wpisu w httpd.conf powinna wyglądać tak:
#ustawiamy port na, którym będzie nasłuchiwać serwer
Listen 443

#Ustawienia domyślne dla wszystkich polączeń https
<VirtualHost _default_:443>
        #wlaczenie obslugi ssl
        SSLEngine On
        #certyfikat
        SSLCertificateFile /etc/httpd/crt/testcert.crt
        #prywatny klucz
        SSLCertificateKeyFile /etc/httpd/key/testcert.key

        DocumentRoot "/var/www/sslsite" #sciezka do katalogu ze strona
        SerwerName mephir.net.pl
        ServerAdmin admin@mephir.net.pl
</VirtualHost>

Konfiguracje można oczywiście jeszcze rozbudować, ja często używam SSLProtocol -all +TLSv1 +SSLv3. Opcja ta wymusza stosowanie najnowszym protokołów do przesyłu szyfrowanych danych. Więcej możliwych opcji jest dostępnych pod adresem http://httpd.apache.org/docs/2.0/mod/mod_ssl.html .

Przykładowy plik konfiguracyjny

Poniżej znajduje się mój przykładowy plik konfiguracyjny vhosta dla phpMyAdmin(niektóre dane zostały zmienione):

<VirtualHost 1.1.1.1:443>
    ServerName pma.domena.pl
    ServerAdmin admin@mephir.net.pl
    DirectoryIndex index.php
    DocumentRoot "/usr/share/phpMyAdmin"
    SSLEngine On
    SSLCertificateFile /etc/httpd/crt/pma.crt
    SSLCertificateKeyFile /etc/httpd/key/pma.key
    SSLProtocol -all +TLSv1 +SSLv3
    <Location />
        SSLRequireSSL On
        SSLVerifyClient none
        SSLVerifyDepth 1
        SSLOptions +StdEnvVars +StrictRequire
    </Location>
</VirtualHost>

Wymuszanie połączenia https za pomocą mod_rewrite

Czasami nie mamy dostepu do konfiguracji serwera, a jednakże chcielibyśmy użytkownika zmusić aby korzystał z szyfrowanego połączenia, możemy tego dokonac w bardzo prosty sposób dodając do pliku .htaccess następujące linie:

RewriteCond %{HTTPS} !=on
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R,L]

Your rating: Brak Ocena: 4.8 (5 votes)