3.2. Configuration

3.2.1. Changing the default configuration

If you want to change the default configuration, you can perform any modification you want in the $MY_KARAF_HOME/etc directory.

If you want to change the HTTP ports that the server is listening on, you will need to add/change the following lines in the $MY_KARAF_HOME/etc/custom.properties file:

  1. org.osgi.service.http.port.secure=9443
  2. org.osgi.service.http.port=8181

If you change these ports, also make sure you adjust the following file in the cluster configuration.

The context server configuration is kept in the $MY_KARAF_HOME/etc/org.apache.unomi.cluster.cfg . It defines theaddresses where it can be found :

  1. contextserver.publicAddress=https://localhost:9443
  2. contextserver.internalAddress=http://127.0.0.1:8181

If you need to specify an Elasticsearch cluster name, or a host and port that are different than the default,it is recommended to do this BEFORE you start the server for the first time, or you will loose all the datayou have stored previously.

To change these settings, you will need to modify a file called

  1. $MY_KARAF_HOME/etc/org.apache.unomi.persistence.elasticsearch.cfg

with the following contents:

  1. cluster.name=contextElasticSearch
  2. # The elasticSearchAddresses may be a comma seperated list of host names and ports such as
  3. # hostA:9300,hostB:9300
  4. # Note: the port number must be repeated for each host.
  5. elasticSearchAddresses=localhost:9300
  6. index.name=context

3.2.2. Secured events configuration

Unomi secures some events by default. You can find the default configuration in the following file (created after thefirst server startup):

  1. $MY_KARAF_HOME/etc/org.apache.unomi.thirdparty.cfg

Ususally, login events, which operate on profiles and do merge on protected properties, must be secured. For eachtrusted third party server, you need to add these 3 lines :

  1. thirdparty.provider1.key=secret-key
  2. thirdparty.provider1.ipAddresses=127.0.0.1,::1
  3. thirdparty.provider1.allowedEvents=login,updateProperties

The events set in allowedEvents will be secured and will only be accepted if the call comes from the specified IPaddress, and if the secret-key is passed in the X-Unomi-Peer header.

3.2.3. Installing the MaxMind GeoIPLite2 IP lookup database

The Context Server requires an IP database in order to resolve IP addresses to user location.The GeoLite2 database can be downloaded from MaxMind here :http://dev.maxmind.com/geoip/geoip2/geolite2/

Simply download the GeoLite2-City.mmdb file into the "etc" directory.

3.2.4. Installing Geonames database

Context server includes a geocoding service based on the geonames database ( http://www.geonames.org/ ). It can beused to create conditions on countries or cities.

In order to use it, you need to install the Geonames database into . Get the "allCountries.zip" database from here :http://download.geonames.org/export/dump/

Download it and put it in the "etc" directory, without unzipping it.Edit $MY_KARAF_HOME/etc/org.apache.unomi.geonames.cfg and set request.geonamesDatabase.forceImport to true, import should start right away.Otherwise, import should start at the next startup. Import runs in background, but can take about 15 minutes.At the end, you should have about 4 million entries in the geonames index.

3.2.5. REST API Security

The Context Server REST API is protected using JAAS authentication and using Basic or Digest HTTP auth.By default, the login/password for the REST API full administrative access is "karaf/karaf".

The generated package is also configured with a default SSL certificate. You can change it by following these steps :

Replace the existing keystore in $MY_KARAF_HOME/etc/keystore by your own certificate :

http://wiki.eclipse.org/Jetty/Howto/Configure_SSL

Update the keystore and certificate password in $MY_KARAF_HOME/etc/custom.properties file :

  1. org.osgi.service.http.secure.enabled = true
  2. org.ops4j.pax.web.ssl.keystore=${karaf.etc}/keystore
  3. org.ops4j.pax.web.ssl.password=changeme
  4. org.ops4j.pax.web.ssl.keypassword=changeme
  5. org.osgi.service.http.port.secure=9443

You should now have SSL setup on Karaf with your certificate, and you can test it by trying to access it on port 9443.

  • Changing the default Karaf password can be done by modifying the etc/users.properties file

3.2.6. Automatic profile merging

The context server is capable of merging profiles based on a common property value. In order to use this, you mustadd the MergeProfileOnPropertyAction to a rule (such as a login rule for example), and configure it with the name of the property that will be used to identify the profiles to be merged. An example could be the "email" property, meaning that if two (or more) profiles are found to have the same value for the "email" property they will be merged by this action.

Upon merge, the old profiles are marked with a "mergedWith" property that will be used on next profile access to deletethe original profile and replace it with the merged profile (aka "master" profile). Once this is done, all cookie trackingwill use the merged profile.

To test, simply configure the action in the "login" or "facebookLogin" rules and set it up on the "email" property.Upon sending one of the events, all matching profiles will be merged.

3.2.7. Securing a production environment

Before going live with a project, you should absolutely read the following section that will help you setup a propersecure environment for running your context server.

Step 1: Install and configure a firewall

You should setup a firewall around your cluster of context servers and/or Elasticsearch nodes. If you have anapplication-level firewall you should only allow the following connections open to the whole world :

All other ports should not be accessible to the world.

For your Context Server client applications (such as the Jahia CMS), you will need to make the following portsaccessible :

  1. 8181 (Context Server HTTP port)
  2. 9443 (Context Server HTTPS port)

The context server actually requires HTTP Basic Auth for access to the Context Server administration REST API, so it ishighly recommended that you design your client applications to use the HTTPS port for accessing the REST API.

The user accounts to access the REST API are actually routed through Karaf’s JAAS support, which you may find thedocumentation for here :

The default username/password is

  1. karaf/karaf

You should really change this default username/password as soon as possible. To do so, simply modify the followingfile :

  1. $MY_KARAF_HOME/etc/users.properties

For your context servers, and for any standalone Elasticsearch nodes you will need to open the following ports for propernode-to-node communication : 9200 (Elasticsearch REST API), 9300 (Elasticsearch TCP transport)

Of course any ports listed here are the default ports configured in each server, you may adjust them if needed.

Step 2 : Follow industry recommended best practices for securing Elasticsearch

You may find more valuable recommendations here :

Step 4 : Setup a proxy in front of the context server

As an alternative to an application-level firewall, you could also route all traffic to the context server througha proxy, and use it to filter any communication.

3.2.8. Integrating with an Apache HTTP web server

If you want to setup an Apache HTTP web server in from of Apache Unomi, here is an example configuration usingmod_proxy.

In your Unomi package directory, in /etc/org.apache.unomi.cluster.cfg for unomi.apache.org

contextserver.publicAddress=https://unomi.apache.org/ contextserver.internalAddress=http://192.168.1.1:8181

and you will also need to change the contextserver.domain in the /etc/org.apache.unomi.web.cfg file

contextserver.domain=apache.org

Main virtual host config:

  1. <VirtualHost *:80>
  2. Include /var/www/vhosts/unomi.apache.org/conf/common.conf
  3. </VirtualHost>
  4. <IfModule mod_ssl.c>
  5. <VirtualHost *:443>
  6. Include /var/www/vhosts/unomi.apache.org/conf/common.conf
  7. SSLEngine on
  8. SSLCertificateFile /var/www/vhosts/unomi.apache.org/conf/ssl/24d5b9691e96eafa.crt
  9. SSLCertificateKeyFile /var/www/vhosts/unomi.apache.org/conf/ssl/apache.org.key
  10. SSLCertificateChainFile /var/www/vhosts/unomi.apache.org/conf/ssl/gd_bundle-g2-g1.crt
  11. <FilesMatch "\.(cgi|shtml|phtml|php)$">
  12. SSLOptions +StdEnvVars
  13. </FilesMatch>
  14. <Directory /usr/lib/cgi-bin>
  15. SSLOptions +StdEnvVars
  16. </Directory>
  17. BrowserMatch "MSIE [2-6]" \
  18. nokeepalive ssl-unclean-shutdown \
  19. downgrade-1.0 force-response-1.0
  20. BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
  21. </VirtualHost>
  22. </IfModule>

common.conf:

  1. ServerName unomi.apache.org
  2. ServerAdmin webmaster@apache.org
  3. DocumentRoot /var/www/vhosts/unomi.apache.org/html
  4. CustomLog /var/log/apache2/access-unomi.apache.org.log combined
  5. <Directory />
  6. Options FollowSymLinks
  7. AllowOverride None
  8. </Directory>
  9. <Directory /var/www/vhosts/unomi.apache.org/html>
  10. Options FollowSymLinks MultiViews
  11. AllowOverride None
  12. Order allow,deny
  13. allow from all
  14. </Directory>
  15. <Location /cxs>
  16. Order deny,allow
  17. deny from all
  18. allow from 88.198.26.2
  19. allow from www.apache.org
  20. </Location>
  21. RewriteEngine On
  22. RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
  23. RewriteRule .* - [F]
  24. ProxyPreserveHost On
  25. ProxyPass /server-status !
  26. ProxyPass /robots.txt !
  27. RewriteCond %{HTTP_USER_AGENT} Googlebot [OR]
  28. RewriteCond %{HTTP_USER_AGENT} msnbot [OR]
  29. RewriteCond %{HTTP_USER_AGENT} Slurp
  30. RewriteRule ^.* - [F,L]
  31. ProxyPass / http://localhost:8181/ connectiontimeout=20 timeout=300 ttl=120
  32. ProxyPassReverse / http://localhost:8181/

3.2.9. Changing the default tracking location

When performing localhost requests to Apache Unomi, a default location will be used to insert values into the sessionto make the location-based personalization still work. You can find the default location settings in the file :

  1. org.apache.unomi.plugins.request.cfg

that contains the following default settings:

  1. # The following settings represent the default position that is used for localhost requests
  2. defaultSessionCountryCode=CH
  3. defaultSessionCountryName=Switzerland
  4. defaultSessionCity=Geneva
  5. defaultSessionAdminSubDiv1=2660645
  6. defaultSessionAdminSubDiv2=6458783
  7. defaultSessionIsp=Cablecom
  8. defaultLatitude=46.1884341
  9. defaultLongitude=6.1282508

You might want to change these for testing or for demonstration purposes.

3.2.10. Apache Karaf SSH Console

The Apache Karaf SSH console is available inside Apache Unomi, but the port has been changed from the default value of8101 to 8102 to avoid conflicts with other Karaf-based products. So to connect to the SSH console you should use:

  1. ssh -p 8102 karaf@localhost

or the user/password you have setup to protect the system if you have changed it.

3.2.11. ElasticSearch X-Pack Support

It is now possible to use X-Pack to connect to ElasticSearch. However, for licensing reasons this is not provided outof the box. Here is the procedure to install X-Pack with Apache Unomi: