Unknown macro: {next_previous_link3}
Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 2 Next »

This section explains how to minimize the security threats to the Jaggery applications that are hosted within your WSO2 DAS pack. This is achieved via headers that can be embedded in the HTTP responses of these applications.

Available headers

The following is a list of headers that need to be enabled to enhance the security aspects of Jaggery Applications.

HeaderPurpose
X-XSS-Protection: 1; mode=blockThis enables reflected XSS protection in supported web browsers.
X-Content-Type-Options: nosniffThis disables mime sniffing that can result in reflected or stored XSS in certain browsers.
Cache-Control: no-store, no-cache, must-revalidate, privateThis prevents sensitive information from being cached in web browsers, proxies and other intermediate network devices.

In addition, the following are headers that need to be enabled based on the requirement of the application. These headers can be customized based on the URL pattern.

HeaderPurpose
X-Frame-Options: DENYThis disables embedding Jaggery apps in iframes or frames.
X-Frame-Options: SAMEORIGINThis allows you to embed Jaggery apps in iframes or frames within the same origin.



The X-Frame-Options header mitigates the clickjacking attacks. Out-of-the-box Jaggery applications need to use the SAMEORIGIN option. The DENY option should not be used because some out-of-the-box dashboards may use framing. If an application that resides outside the origin needs to frame a Jaggery app, then the X-Frame-Options header must  not be returned at all. This must be configured as per application requirement, taking the security risk into consideration.


Enabling a header

To apply the basic security headers required to secure Jaggery applications, update the <DAS_HOME>/repository/deployment/server/jaggeryapps/<app-name>/jaggery.conf file as shown in the steps below.

Note the following about the configurations below:

  • These configurations enable the Strict-Transport-Security: max-age=15768000; includeSubDomains header for additional security. This header prevents any communication over HTTP from taking place for the number of milliseconds specified via the max-age parameter, starting from the time the latest response with the aforementioned header was received.
  • Enabling these headers may cause some inconvenience in a developer environment where URLs and certificates change. This happens when some browsers do not forget the preference of that domain unrtil the time specified via the max-age parameter has elapsed, even when the browser cache is cleared.Therefore, it is recommended to enable these headers in only the production and staging environments.

These headers are required for the production and staging environments for additional security.


For development environments:

  1. Add the two filters named HttpHeaderSecurityFilter and ContentTypeBasedCachePreventionFilter in the "filters": [] section as shown below. 

    "filters":[
      {
        "name":"HttpHeaderSecurityFilter",
        "class":"org.apache.catalina.filters.HttpHeaderSecurityFilter",
        "params" : [
            {"name" : "hstsEnabled", "value" : "false"},
                        { "name": "antiClickJackingOption", "value": "SAMEORIGIN" }
     	     ]
      },
      {
        "name": "ContentTypeBasedCachePreventionFilter",
        "class": "org.wso2.carbon.ui.filters.cache.ContentTypeBasedCachePreventionFilter",
        "params":[
          {"name": "patterns", "value": "text/html\" ,application/json\" ,plain/text"},
          {"name": "filterAction", "value": "enforce"},
          {"name": "httpHeaders", "value": "Cache-Control: no-store, no-cache, must-revalidate, private"}
        ]
      }
    ],
  2. Add the filter mappings for the two filters you added. These two filter mapping configurations need to be added in the "filterMappings":[] as shown below.

    "filterMappings":[
      {
        "name":"HttpHeaderSecurityFilter", 
        "url":"*"
      },
      {
        "name": "ContentTypeBasedCachePreventionFilter",
        "url": "*"
      }
    ]
  3. Save your changes.

For production environments:

  1. Add the two filters named HttpHeaderSecurityFilter and ContentTypeBasedCachePreventionFilter in the "filters": [] section as shown below. 

    "filters": [
        {
            "name": "HttpHeaderSecurityFilter",
            "class": "org.apache.catalina.filters.HttpHeaderSecurityFilter",
            "params": [
    	  {"name": "hstsMaxAgeSeconds",  "value": "15768000"},
                  { "name": "antiClickJackingOption", "value": "SAMEORIGIN" }
            ]
         },
         {
            "name": "ContentTypeBasedCachePreventionFilter",
            "class": "org.wso2.carbon.ui.filters.cache.ContentTypeBasedCachePreventionFilter",
            "params":  [
    	{ "name": "patterns", "value": "text/html\" ,application/json\" ,plain/text" },
    	{ "name": "filterAction", "value": "enforce"},
    	{ "name": "httpHeaders", "value": "Cache-Control: no-store, no-cache, must-revalidate, private" }
            ]
        }
    ],
  2. Add the filter mappings for the two filters you added. These two filter mapping configurations need to be added in the "filterMappings":[] as shown below.

    "filterMappings": [
        { "name": "HttpHeaderSecurityFilter", "url": "*" },
        { "name": "ContentTypeBasedCachePreventionFilter", "url": "*"}
    ]
  3. Save your changes.
  • No labels