Jak zabezpečit Liferay portál pomocí HTTPS
Pro našeho zákazníka jsme implementovali portlet pro zabezpečené přihlášení do jeho interních aplikací. Tento portlet je umístěn na Liferay portálu a po ověření loginu a hesla proti Access Manageru SunSSO (technologii popsal kolega zde) vydá uživateli SSO cookie. Součástí tohoto úkolu bylo zabezpečit Liferay portál, aby k přihlašovací stránce šlo přistupovat pouze pomocí HTTPS. Na druhou stranu bylo nutné, aby k jiným stránkách portálu bylo možné nadále přistupovat přes HTTP.
V tomto článku vás seznámíme se způsobem, jak jsme tento požadavek vyřešili.
Analýza prostředí
V prostředí našeho zákazníka běží portál Liferay 6.1.2 CE na aplikačním serveru Tomcat 7.0.40.
Jedno z řešení, které bychom mohli použít, by spočívalo v nastavení HTTPS přímo do konfigurace Tomcatu. Druhou možností bylo nainstalovat před Liferay web server, který se postará o zabezpečení přes SSL a požadavky bude lokálně předávat aplikačnímu serveru již nešifrovaně.
Zvolili jsme druhý přístup, protože umožňuje větší flexibilitu a i do budoucna snazší řešení specifických požadavků zákazníka. Vybrali jsme Apache web server, který bude poskytovat následující služby:
- Na portu 80 bude poskytovat přístup k Liferay portálu přes HTTP.
- Na portu 443 bude poskytovat zabezpečený přístup k Liferay přes HTTPS. Pro ověření pravosti serveru bude nabízet certifikát uložený na serveru.
- Přistoupí-li uživatel přes HTTP, zůstane po celou dobu na nezabezpečeném kanálu. Podobně pro HTTPS – po prvním přístupu na HTTPS už na něm uživatel zůstane. Není žádoucí vyžadovat jen zabezpečený přístup.
- Předchozí bod má jednu výjimku, a to u stránky pro přihlášení. Zde je vždy vynucen přístup přes HTTPS.
Pro zajištění všech uvedených služeb stačí do standardní instalace Apache přidat ještě modul mod_ssl.
Nastavení Apache
Web server Apache a modul mod_ssl jsme nainstalovali ze standardních balíčků operačního systému CentOS:
$ yum install httpd $ yum install mod_ssl
Dále ověříme, že jsou přítomné moduly mod_proxy a mod_proxy_ajp (na CentOSu jsou součástí standardní instalace Apache). Pokud nejsou, nainstalujeme je podobně jako mod_ssl.
Instance Apache je umístěna v adresáři /etc/httpd
. Zde vytvoříme adresář ssl
, kam umístíme náš certifikát a jeho soukromý klíč (mujweb.cz.cert a mujweb.cz.key).
Konfiguraci portů chceme mít umístěnou v jednom souboru, proto v hlavním konfiguračním souboru v conf/httpd.conf
zakomentujeme řádek Listen 80
. Ve složce conf.d
přidáme ke všem konfiguračním souborům např. příponu “.orig”, aby je Apache nenačítal (případně je můžeme rovnou smazat).
Následně vytvoříme hlavní konfigurační soubor v adresáři conf.d
:
LoadModule ssl_module modules/mod_ssl.so Listen 80 Listen 443 SSLPassPhraseDialog builtin SSLSessionCache "shmcb:/var/run/ssl_scache(512000)" SSLSessionCacheTimeout 300 SSLMutex "file:/var/run/ssl_mutex" <VirtualHost mujweb.cz:80> ServerName mujweb.cz <IfModule mod_proxy.c> ProxyRequests Off ProxyVia On <Proxy *> Order Allow,Deny Allow from All </Proxy> <LocationMatch "/web/login"> Redirect permanent / https://mujweb.cz/ </LocationMatch> ProxyPass / ajp://localhost:8009/ </IfModule> </VirtualHost> <VirtualHost mujweb.cz:443> ServerName mujweb.cz <IfModule mod_proxy.c> ProxyRequests Off ProxyVia On <Proxy *> Order Allow,Deny Allow from All </Proxy> ProxyPass / ajp://localhost:8009/ </IfModule> SSLEngine on SSLProtocol -ALL +SSLv3 +TLSv1 SSLCipherSuite ALL:!aNULL:!ADH:!eNULL:!LOW:!EXP:RC4+RSA:+HIGH:+MEDIUM SSLCertificateFile "/etc/httpd/ssl/mujweb.cz.cert" SSLCertificateKeyFile "/etc/httpd/ssl/mujweb.cz.key" SSLVerifyClient none <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars </FilesMatch> BrowserMatch ".*MSIE.*" \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 ErrorLog "logs/httpd-error.log" TransferLog "logs/httpd-access.log" CustomLog "logs/httpd-ssl_request.log" \ "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b" </VirtualHost>
Všimněme si zvýrazněných řádků. První z nich zajistí, že při přístupu na přihlašovací stránku (http://mujweb.cz/web/login
) je uživatel ihned natrvalo přesměrován na HTTPS. Řádek s direktivou ProxyPass / ajp://localhost:8009/
zajišťuje předávání požadavků do Liferay, čímž se podrobněji zabývá následující kapitola.
Nyní zbývá už jen nastartovat Apache a také nastavit, aby se automaticky spouštěl při každém restartu serveru:
$ service httpd start $ chkconfig --level 2345 httpd on
Samozřejmostí, na kterou ale snadno zapomeneme, je, aby porty 80 a 443 byly povolené ve firewallu :-)
Nastavení Liferay
Tomcat běží standardně na portu 8080, kde poskytuje stránky portálu. Zároveň ale na portu 8009 poslouchá jeho AJP konektor, který je určen ke komunikaci aplikačního serveru s web serverem. Požadavky na web server proto směřujeme na tento port, což zajistí, že Liferay dostane informaci o tom, jakým způsobem uživatel přistupuje. Liferay tuto informaci potřebuje zejména kvůli generování odkazů v rámci portálu (např. odkazy, kam se odesílají formuláře). Musí vědět, zda má vygenerovat odkaz pro HTTP, nebo HTTPS, či jaké má použít hostname.
V konfiguraci Liferay portálu je třeba provést nastavení dvou portálových proměnných. Obvykle se úpravy portálových proměnných provádí v souboru portal-ext.properties, ale pokud tento soubor z nějakého důvodu nechceme vytvářet, můžeme je napsat i přímo do portal-setup-wizard.properties, který je umístěn v adresáři, kam jsme instalovali Liferay.
Nastavíme následující proměnné:
web.server.http.port=80 web.server.https.port=443
Pokud bychom chtěli, aby Liferay generoval všechny URL adresy pro HTTPS, nastavili bychom ještě web.server.protocol=https
. To ale pro nás v tomto případě nebylo žádoucí. V některých situacích bychom mohli dále nastavit web.server.host=preferovanyHost.cz
, aby Liferay při generování URL odkazů používal hostname “preferovanyHost.cz”.
Po nastavení portálových proměnných zbývá už jen restartovat Liferay portál.
Závěr
Těch pár kroků uvedených výše stačí k tomu, že máme zabezpečný přístup k Liferay portálu přes HTTPS. Jednoduché, že?
Způsobů, jak zabezpečit Liferay portál i s uvedenými požadavky na přesměrování, je určitě mnoho, a pokud se o některé z nich chcete se mnou podělit, neváhejte se ozvat na info@bcvsolutions.eu!