JBoss Application Server biztonságossá tétele
Technológiák: JBoss 5, 6
Egy alapértelmezett telepítés után a JBoss Application Server (továbbiakban JBoss) főleg fejlesztésre való. Alapesetben csak localhostról fogad kéréseket, tehát megfelelően biztonságos, de ahhoz, hogy meg lehessen nyitni a nagyvilág elé, pár biztonsági beállítást el kell végezni.
A JBoss-t általában egy web szerver, pl. egy Apache HTTP Server mögé szokták helyezni, és a kettő között valamilyen modullal kell kapcsolatot létesíteni. (Erről már korábban esett szó a Tomcat clusterezése kapcsán, szóba jövő variációk a mod_jk, mod_proxy_http és mod_proxy_ajp, melyből a mod_proxy_http bizonyult nyerőnek. Amennyiben a JBoss web szerver mögött helyezkedik el, bizonyos biztonsági beállításokat ott is el lehet végezni. Én most azt az esetet tárgyalom, amikor a JBoss közvetlen elérhető.
A biztonsági kérdéseket az Open Web Application Security Project (OWASP) szerint is osztályozni fogom. Az OWASP egy nonprofit szervezet, mely célja az alkalmazások biztonságossá tétele. Ennek a szervezetnek bárki tagja lehet, aki értéket tud hozzáadni. A OWASP Testing Project keretein belül a készült egy OWASP Testing Guide v3 (még 2008-ban), mely Creative Commons 2.5 License keretein belül elérhető, és célja egy olyan tesztelési keretrendszer biztosítása, melynek használatával feltárhatók a webes alkalmazások gyakori hibái. A dokumentum 11 kategóriában több mint hatvan teszt esetet tartalmaz. Olyan kategóriák vannak, mint információgyűjtés, autentikáció, session management, dos, webszolgáltatások, AJAX, stb. Olyan teszt esetekre kell gondolni, mint pl. lekérhető-e a web szerver típusa és pontos verziószáma, hozzá lehet-e férni alapértelmezett jelszavakkal adminisztrációs felületekhez, SQL injection, stb.
Az OWASP kiad egy OWASP Top 10 dokumentumot is, melyben az általa az adott évben leggyakrabban előforduló biztonsági problémákat sorolja fel. 2010-ben az első három biztonsági probléma az Injection, Cross-Site Scripting (XSS) és a Broken Authentication and Session Management. Ezekről a 2011-es Magyarországi Web Konferencián Karóczkai Krisztián tartott egy előadást, egy Liferay portálon fejlesztett minta alkalmazáson prezentálva a hibákat.
Én most nem a fejlesztési, hanem a JBoss adminisztrációs aspektusokra szeretnék kitérni.
A OWASP-IG-004 teszt eset célja a web szerverről információkat gyűjteni.
Ez ezárt fontos egy támadó számára, hiszen ismertek a különböző web
szerverek bizonyos verzióinak hibái, amiket a pontos típus és verzió
ismeretében ki lehet használni. Egy JBoss-t indítva a http header-t
figyelve láthatjuk (pl. Live HTTP
Headers
Firefox plugin használatával, vagy Linux-on a
curl -I http://localhost:8080
parancs kiadásával), hogy a következő
információk jelennek meg:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
X-Powered-By: Servlet 2.5; JBoss-5.0/JBossWeb-2.1
...
A Server fejléc kikapcsolását a
$JBOSS_HOME\server\[config]\deploy\jbossweb.sar\server.xml
állományban kell megtenni, a Connector tag-nek kell adni egy server
tulajdonságot. Vigyázzunk, ez nem lehet üres String, hanem legalább egy
karakter hosszúnak lennie kell. Tehát használjuk pl. az alábbi
beállítást.
<Connector protocol="HTTP/1.1" port="8080" address="${jboss.bind.address}"
connectionTimeout="20000" redirectPort="8443" server=" " />
Néhány cikk a neten azt írja, hogy itt kell használni a xpoweredBy tulajdonságot is, de ez csak a JBoss-4.x alkalmazásszerverekre volt megfelelő. Ehelyett a $JBOSS_HOME\server\[config]\deployers\jbossweb.deployer\web.xml állományban kell a CommonHeadersFilter-ben a X-Powered-By paramétert beállítani, lásd az alábbi példát.
<filter>
<filter-name>CommonHeadersFilter</filter-name>
<filter-class>org.jboss.web.tomcat.filters.ReplyHeaderFilter</filter-class>
<init-param>
<param-name>X-Powered-By</param-name>
<param-value></param-value>
</init-param>
</filter>
Az OWASP-IG-005 teszt eset az alkalmazás felderítését írja le. Ennek
során több minden kerül kivizsgálásra, ide tartoznak az admin felületek
is. A JBoss alapbeállítással tartalmaz egy indító felületet, melyen pár
link található. Innen érhető el az Administration Console
/admin-console/
néven (alapértelmezett felhasználónév/jelszó az
admin
/admin
), a JMX Console /jmx-console/
címen, és a JBoss Web Console
/web-console/
címen. Az utóbbi kettő nem is kér autentikációt. A Tomcat
status az indító felület része.
Ezek mindegyike egy-egy webes alkalmazás, melyek a
$JBOSS_HOME\server\[config]\deploy
könyvtárban telepítettek a
következő néven.
Felület | URL | Könyvtár |
---|---|---|
Indító felület | / | ROOT.war |
Administration Console | /admin-console/ | admin-console.war |
JMX Console | /jmx-console/ | jmx-console.war |
JBoss Web Console | /web-console/ | management |
A legbiztonságosabb, ha ezeket letöröljük.
Amennyiben mégis meg akarjuk tartani, figyelni kell arra, hogy ne sértsük meg az előző (OWASP-IG-005) teszt esetet. Ugyanis ezek léte már árulkodik az alkalmazásszerverről. Így célszerű ezen URL-eket tűzfal szinten is levédeni.
Az Administration Console egy kicsit kilóg a többi közül, ugyanis annak
biztonságát a Seam Security része őrzi. Gyakorlatilag a jmx-console JAAS
konfiguráció névre hivatkozik. A JAAS-t a
/server/[config]/conf/login-config.xml
állomány konfigurálja. Ebben
található a jmx-console néven egy UsersRolesLoginModule
(un. security
domain), mely a felhasználókat a
/server/[config]/conf/props/jmx-console-users.properties
, a hozzá
tartozó szerepköröket ugyanitt a jmx-console-roles.properties
fájlban
tárolja. Alapértelmezetten itt az admin
felhasználó szerepel, admin
jelszóval, és JBossAdmin
szerepkörrel. Ennek a szerepkörnek a meglétét
ellenőrzi az alkalmazás.
A JMX Console és a Web Console a Servlet API által specifikált
deklaratív biztonságot használják, a web.xml
-ben kell konfigurálni. A
konfigurációk megtalálhatók ezekben az állományokban
($JBOSS_HOME\server\[config]\deploy\jmx-console.war\WEB-INF\web.xml
,
$JBOSS_HOME\server\[config]\deploy\management\console-mgr.sar\web-console.war\WEB-INF\web.xml
),
csak megjegyzésben.
<security-constraint>
<web-resource-collection>
<web-resource-name>HtmlAdaptor</web-resource-name>
<description>An example security config that only allows users with the
role JBossAdmin to access the HTML JMX console web application
</description>
<url-pattern>/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>JBossAdmin</role-name>
</auth-constraint>
</security-constraint>
Ez a részlet definiálja, hogy mely erőforrásokhoz milyen szerepkör
szükséges, valamint az autentikáció formája Basic Authentication. Az
alkalmazásszerverfüggő, hogy honnan veszi a felhasználókat. A JBoss
esetén a web.xml
mellett lévő jboss-web.xml
írja le (JNDI névvel), hogy
milyen security domainben kell keresni a felhasználókat. Ez szintén
megjegyzésben van. Pl. JMX Console esetén a jmx-console
security domain.
<security-domain>java:/jaas/jmx-console</security-domain>
Ez az előbb említett login-config.xml
állományban van definiálva. A
JBoss Web Console esetén a web-console
a security domain, amely a
login-config.xml
állományban a web-console-users.properties
és
web-console-roles.properties
állományokra hivatkozik, melyek nem
léteznek. Átírhatjuk ezt is a props/jmx-console-users.properties
és
props/jmx-console-roles.properties
értékekre.
Tehát ezekben az állományokban ezen részek ne legyenek megjegyzésben, és
változtassuk meg a jelszót a
$JBOSS_HOME\server\[config]\conf\props\jmx-console-users.properties
állományban.
A OWASP-IG-006 teszt eset írja le a hibakódok elemzését. Itt tipikusan a 404 oldalakra kell gondolni, és ezek közül is azokra, amelyek az alkalmazáson kívül esnek. (Hiszen az alkalmazáson belüli hibakezelést végezze maga az alkalmazás.) Amennyiben a ROOT.war könyvtár szerepel a deploy könyvtárban, a hibaoldalak információt szolgáltatnak ki az alkalmazásszerver típusáról. Javasolt a ROOT.war könyvtár törlése, ekkor válaszként egy üres oldal jön vissza nem található URL beírása esetén.