Uvod
Mod_SSL
e interfeis na apache httpd kum openssl. Toi mozhe da se izpolzva kakto
za shifrirane na komunikatsiiata mezhdu ueb survura i klienta,
udostoveriavane na identichnostta na survura, a taka i za ogranichenie na
dostupa do resursite, koito predlaga. V tazi statiia shte se opitam da
predstavia osnovite na konfigurirane na tezi ogranicheniia po nachin
podoben na tozi, po koito shte budat polzvani na novata mashina na Linux-BG.
Za podruzhkata na mod_ssl
mod_ssl
e standartna chast ot vsichki distributsii, koito predlagat apache httpd.
Osobenost pri Debian, e che paketut se kazva libapache-mod-ssl. V
distributsiiata sushtestvuva i paket apache-ssl, koito predstavliava otdelen
ueb survur izpolzvasht proekta apache-ssl.org,
koito proekt ne se razrabotva ot godini i e izmesten pochti navsiakude ot
mod_ssl, koito se zarezhda kato modul na osnovniia ueb survur.
Vupreki,
che niama razliki vuv funktsionalnostta na mod_ssl v 1.3.x i 2.0.x
klonovete ima problem, koito pravi nevuzmozhno izprashtaneto na POST
zaiavki pri opredeleni iziskvaniia za sertifikatna avtentikatsiia. Tozi
problem e poroden ot razlichniia nachin, po koito 2.0.x klona obrabotva
POST zaiavkite i e opisan v tozi komentar.
Sushtestvuva i pach, koito reshava tozi problem i az sum kompiliral i
startiral httpd s nego, no tui kato avtor na pacha e Joe Orton, koito
poddurzha paketa httpd v RHEL i Fedora i toi ne go e vklyuchil v
distributsiiata, predpolagam, che ima prichini za tova i ne go polzvam, a i
ne preporuchvam na vas da go polzvate. SHTe spomena po-dolu
konfiguratsiite, koito sa prilozhimi zasega samo za 1.3.x klona, a na
tezi, koito polzvat 2.0.x klona, im preporuchvam da slediat changelog-a
na httpd paketa na svoiata distributsiia kakto i slednite dva doklada v
sistemite za doklad na greshki na:
Tova
sa problemi spetsifichni za apache httpd 2.0.x klona, a nie polzvame
dokazalata se za stabilna 1.3.h versiia i zatova mozhem da polzvame
pulnite vuzmozhnosti na modula.
Nachalna konfiguratsiia
Zapochvame
s generiraneto na sertifikat za ueb survura, podpisvaneto mu ot nashata
CA i postavianeto im v konfguratsionnite direktorii:
# openssl req -new -sha1 -keyout newkey.pem -out newreq.pem
# ./CA.pl -signreq
# mv newcert.pem /etc/apache/ssl.crt/server.crt
# mv newkey.pem /etc/apache/ssl.key/server.key
# cp Linux-BG-CA/cacert.pem /etc/apache/ssl.crt/cacert.crt
Gorniiat primer shte suzdade chasten klyuch, koito shte
bude kriptiran i shte se iska parola pri zarezhdaneto mu ot ueb survura.
Purvonachalno taka go biahme napravili, no burzo ni mina i go
dekriptirahme. Za da ne bude kriptiran izpolzvaite optsiiata -nodes.
Debian
ne vklyuchva nikakva primerna konfiguratsiia na modula i zatova e nuzhno da
si ia suzdadem sami. Tova e netipichno za drugite distributsi i az vi
suvetvam da poglednete sudurzhanieto na paketa si, primernite
konfiguratsionni failove i komentarite v tiah. Za ostanalite distributsii
vi suvetvam da ne se otkloniavate ot stoinostite, s koito e
konfigurirana obshtata chast na modula po podrazbirane. Dolnite nastroiki
sa moe delo i sa praveni kato sum tursel konservativnite i raboteshti sus
sigurnost stoinosti, no v deistvitelnost mozhe i da sa vuzmozhni po-dobri
resheniia.
Produlzhavame s obshtata konfiguratsiia na mod_ssl, za koiato suzdavame faila /etc/apache/conf.d/mod_ssl.conf.
V nego opisvame obshtite nastroiki na modula, koito shte se opitam da poiasnia kratki komentari:
<IfModule mod_ssl.c>
# Na koi port slusha. Standartno 443ti
Listen 443
# Dopulniteli mime tipove za sertifikatite i za listata s otmenenite sertifikati
AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl .crl
SSLPassPhraseDialog builtin
# Ne sum zapoznat sus spetsifikite na Debian i zatova vzimam konservativno i raboteshto sus sigurnost reshenie:
SSLSessionCache dbm:/var/run/ssl_scache
# V RedHat raboti taka:
# SSLSessionCache shmcb:/var/cache/mod_ssl/scache(512000)
#
5 min. triabva da sa dostatuchno. Tova shte e nuzhno da go promeniate samo,
ako saita vi e spetsifichen i/ili vi triabva mnogo da optimizirate.
SSLSessionCacheTimeout 300
# mutex-ite pri nas rabotiat taka:
SSLMutex file:/var/run/ssl_mutex
# Iztochnitsi na sluchaini chisla
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
# Ili mozhe bi shte polzvame:
#SSLRandomSeed startup file:/dev/urandom 512
#SSLRandomSeed connect file:/dev/urandom 512
# ZHurnali
SSLLog /var/log/apache/ssl_engine_log
# Nivo na detail (vuzmozhni sa: none, error, warn, info, trace, debug)
# Sled kato se uverim, che raboti veroiatno shte minem na error samo
SSLLogLevel warn
# Spetsialno vnimanite zasluzhavat potrebitelite na lyubimiia Internet Explorer:
SetEnvIf User-Agent “.*MSIE.*” nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
Konfiguratsionnite direktivi za zaklyucheni mezhdu
<IfModule mod_ssl.c> i </IfModule>, za da ne predizvikat
greshki, ako modulut ne e zareden.
Spetsifichni nastroiki za virtualniia host
Minavame kum spetsifichnite nastroiki za virtualniia host:
# Ako imame poveche ot edin virtualen ssl host mozhe da polzvame:
# Include /etc/apache/vhosts/*.vhost
<VirtualHost 212.50.10.155:443>
# Tiia si gi znaete
ServerName linux-bg.org
ServerAlias www.linux-bg.org
DocumentRoot /home/path/
# Pusk mashina
SSLEngine on
# Sus stari versii na SSL protokola ne se zanimavame:
SSLProtocol all -SSLv2
# Sushtoto shte e i ako napishem dolnoto, zashtoto TLSv1 i SSLv3 sa sinonimi
# SSLProtocol TLSv1
# Izpolzvani shifri. Te mozhe da se promeniat v <:Directory konteineri.
# Tuk dopuskame shifri, koito se podurzhat ot vseki skoroshen brauzur
SSLCipherSuite HIGH:MEDIUM
# Ukazvame kude se namirat sertifikata, klyucha i sertifikata na nasheto CA
SSLCACertificateFile /etc/apache/ssl.crt/cacert.crt
SSLCertificateFile /etc/apache/ssl.crt/server.crt
SSLCertificateKeyFile /etc/apache/ssl.key/server.key
# Ako triabva da vuzstanoviavate veriga na doverie polzvame dolnata direktiva. Drug nachin e prosto da konkatenirame sertifikatite.
# SSLCertificateChainFile /etc/apache/ssl.crt/certchain.crt
# Za direktoriite sudurzhashti mnogo sertifikati se polzva:
# openssl c_rehash /dir
#
Listi s otmeneni sertifikati. Tuk se vklyuchvat sertifikati, koito sa
kompromentirani, zagubeni ili prosto sme gi izdali, za da si igraem s
tiah:
SSLCARevocationFile /etc/apache/ssl.crl/server.crl
# List na otmenenite sertifikati se generira chrez komandata:
# openssl ca -gencrl -out /etc/apache/ssl.crl/server.crl
#
Niamame pod-udostoveriteli — vsichko si go podpisvame nie. Ako
imahme SubCA shte triabvashe da uvelichim dolnata stoinost s edno za vsiako
mezhdinno zveno:
SSLVerifyClient 1
# Ako sa ni nuzhni promenlivi na obkruzhenieto za cgi skriptovete ni:
#<Directory /home/path/cgi-bin&>
# SSLOptions +StdEnvVars
#</Directory>
# Za da gledame kakvo tochno se sluchva mozhe da nablyudavame zaiavkite, koito nashiia survur poluchava:
CustomLog /var/log/apache/ssl_request_log \
“%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \”%r\” %b”
</VirtualHost>
Nastroiki za ogranichavane na dostupa
Tezi
nastroiki sushto se praviat v ramkite na virtualniia host, no tuk shte sa
otdelno, za da ilyustrirat niakoi ot vuzmozhnostite. Za tiah se iziskva
predostavianeto na PKCS#12 sertifikat ot strana na potrebitelia. Kak se
suzdava toi mozhe da prochetete v statiiata za Postfix i TLS.
Otnovo poiasneniiata shte budat kato komentari:
# Za obshtiia sluchai niamame nikakvo ogranichenie. T.e. ne postaviame nikakvi
usloviia potrebitelia da ni predstavi sertifikat, nito za poletata na
tozi sertifikat:
SSLVerifyClient none
#
A zashto ne i da priemem sertifikat, ako ima takuv. Tova ne bi se
izpolzvalo na mnogo mesta, no mozhe da se ukazhe udachno reshenie za niakoi
spetsifichni sluchai:
# SSLVerifyClient optional
# Za naistina interesnite mesta nie povishavame iziskvaniiata:
<Location /secure>
# Sega veche povishavame i iziskvaniiata kato dopuskame samo 3 kombinatsii
ot shifri, zashtoto vsichki imame sviastni brauzuri. Tova shte nalozhi
predogovariane na shifrite, ako po niakakva prichina e bila izbrana
po-slaba kombinatsiia.
SSLCipherSuite HIGH:-MD5:-ADH:-3DES
#
S dolnata direktiva iskame da ni bude predstaven podpisan ot nas
validen sertifikat. Tazi direktiva se kombinira s SSLVerifyClient 1 i
tova oznachava, che iskame tozi sertifikat da e podpisan ot nas.
SSLVerifyClient require
# Ot tuk nadolu za httpd 2.0.x stava trudno:
# Ili puk mozhe da go iziskame izrichno, kato ukazhem, che v poleto za organizatsiia triabva da sme nie:
# SSLRequire %{SSL_CLIENT_S_DN_O} eq “Linux-BG”
#
Sushto taka e vuzmozhno i da dadem dostup i samo na otdelni podgrupi v
nashata organizatsiia. Primerno administratorite na poshtenskiia ili ueb
survura mozhe da si dostupvat kontrolnite paneli:
# SSLRequire %{SSL_CLIENT_S_DN_O} eq “Linux-BG” and \
# %{SSL_CLIENT_S_DN_OU} in {”Web Admin”, “Mail Admin”}
</Location>
#
Vuzmozhnostta da proveriavame stoinostite v sertifikatnite poleta
oznachava, che mozhe i da suzdadem direktorii, koito da sa dostupni prez
ueb samo ot edin edinstven potrebitel
<Location /secure/peio>
SSLVerifyClient require
SSLRequire %{SSL_CLIENT_S_DN_CN} eq “Peio Popov”
</Location>
Za da pregledame sertifikatnite poleta mozhe da izpolzvame komandata:
openssl x509 -subject -noout -in cert.pem
Ako iskame da vidim tseliia sertifikat v tekstovi vid polzvame:
openssl x509 -text -noout -in cert.pem
Poniakoga
mozhe da ni se nalozhi da ogranichim dostupa do niakoia direktoriia vuv
virtualen host, koito e dostupen i po http. Za da prenasocha vsichki
zaiavki kum https az polzvam mod_rewrite:
RewriteEngine On
RewriteBase /dir
RewriteCond %{SERVER_PORT} ^80$
RewriteRule ^(.*)$ https://servername/dir/$1 [R,L]
Vuzmozhnosti na SSLRequire
Sintaksisut
na SSLRequire direktivata e izklyuchitelno guvkav i ni pozvoliava da
vuvezhdame izklyuchitelno raznoobrazni ogranicheniia i sum siguren, che vseki
shte nameri nuzhnite sredstva, za da zadovoliat nuzhdite mu. Neka samo
spomena, che osven vsichki parametri na sertifikata razpolagame i sus
standartnite promenlivi na obkruzhenieto (CGI 1.0) i apache i mozhe da gi
vklyuchvame i tiah v izrazi kato vikame promenlivata pod formata na
%{ImeNaPromenliva}.
Osven bogatstvoto ot promenlivi nie imame i vuzmozhnostite na BNF
notatsiiata da sravniavame realni i zhelani stoinosti (vklyuchitelno i
vuzmozhnost da suzdavame funktsii), a osven tova mozhe i da posochvame
fail, ot koito da chetem.
Imaiki
predvid tezi bogati vuzmozhnosti gornite primeri sa samo nachalno
vuvedenie, za zapoznavane sus sintaksisa im i az ne vizhdam smisul da se
opitvam da izbroiavam vsichkite im vuzmozhni prilozheniia.
Za chetene
mod_ssl e izklyuchitelno dobre i dostupno dokumentiran. Vseki, koito se zapoznae s dokumentatsiiata mu
shte mozhe da izpolzva negovite pulni vuzmozhnosti. Vse pak e dobre i da
poglednete spetsifikite i otvorenite problemi svurzani s paketite v
sistemata za sledene na greshki na distributsiiata vi.