cxf-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From conflue...@apache.org
Subject [CONF] Apache CXF Documentation > Security
Date Mon, 23 Apr 2012 21:58:00 GMT
<html>
<head>
    <base href="https://cwiki.apache.org/confluence">
            <link rel="stylesheet" href="/confluence/s/2042/9/1/_/styles/combined.css?spaceKey=CXF20DOC&amp;forWysiwyg=true"
type="text/css">
    </head>
<body style="background: white;" bgcolor="white" class="email-body">
<div id="pageContent">
<div id="notificationFormat">
<div class="wiki-content">
<div class="email">
    <h2><a href="https://cwiki.apache.org/confluence/display/CXF20DOC/Security">Security</a></h2>
    <h4>Page <b>edited</b> by             <a href="https://cwiki.apache.org/confluence/display/~sergey_beryozkin">Sergey
Beryozkin</a>
    </h4>
        <br/>
                         <h4>Changes (1)</h4>
                                 
    
<div id="page-diffs">
                    <table class="diff" cellpadding="0" cellspacing="0">
    
            <tr><td class="diff-snipped" >...<br></td></tr>
            <tr><td class="diff-unchanged" > <br>{code}  <br></td></tr>
            <tr><td class="diff-added-lines" style="background-color: #dfd;">
<br>h1. Controlling the depth of XML payloads <br> <br>Endpoints expecting
XML payloads may get [DepthRestrictingInterceptor|http://svn.apache.org/repos/asf/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/security/DepthRestrictingStreamInterceptor.java]
registered and configured in order to control the limits a given XML payload may not exceed.
This can be useful in a variety of cases in order to protect against massive payloads which
can potentially cause the denial-of-service situation or simply slow the service down a lot.
<br> <br>The complete number of XML elements, the number of immediate children
of a given XML element may contain and the stack depth of the payload can be restricted, for
example: <br> <br>{code:xml} <br> <br>&lt;bean id=&quot;depthInterceptor&quot;
class=&quot;org.apache.cxf.interceptor.security.DepthRestrictingStreamInterceptor&quot;&gt;
<br>  &lt;!-- Total number of elements in the XML payload --&gt; <br>
 &lt;property name=&quot;elementCountThreshold&quot; value=&quot;5000&quot;/&gt;
<br> <br>  &lt;!-- Total number of child elements for XML elements --&gt;
<br>  &lt;property name=&quot;innerElementCountThreshold&quot; value=&quot;3000&quot;/&gt;
<br> <br>  &lt;!-- Maximum stack depth of the XML payload --&gt; <br>
 &lt;property name=&quot;innerElementLevelThreshold&quot; value=&quot;20&quot;/&gt;
<br> <br>&lt;/bean&gt; <br> <br>&lt;jaxws:endpoint&gt;
<br>  &lt;jaxws:inInterceptors&gt; <br>   &lt;bean ref=&quot;depthInterceptor&quot;/&gt;
<br> &lt;/jaxws:inInterceptors&gt; <br>&lt;jaxws:endpoint&gt;
<br> <br>&lt;jaxrs:server&gt; <br>  &lt;jaxrs:inInterceptors&gt;
<br>   &lt;bean ref=&quot;depthInterceptor&quot;/&gt; <br> &lt;/jaxrs:inInterceptors&gt;
<br>&lt;jaxrs:server&gt; <br> <br>{code} <br> <br>When
one of the limits is reached, the error is returned. JAX-WS consumers will receive 500, JAX-RS/HTTP
consumers: 413. <br> <br>The following system properties can also be set up for
JAX-WS endpoints: &quot;org.apache.cxf.staxutils.innerElementCountThreshold&quot;
and &quot;org.apache.cxf.staxutils.innerElementLevelThreshold&quot;. <br> <br>Finally,
default JAX-RS org.apache.cxf.jaxrs.provider.JAXBElementProvider and JAXB-based org.apache.cxf.jaxrs.provider.json.JSONProvider
can be directly configured with [DepthRestrictingProperies|http://svn.apache.org/repos/asf/cxf/trunk/api/src/main/java/org/apache/cxf/staxutils/DocumentDepthProperties.java].
<br> <br></td></tr>
    
            </table>
    </div>                            <h4>Full Content</h4>
                    <div class="notificationGreySide">
        <p><span style="font-size:2em;font-weight:bold"> Securing CXF Services
</span></p>

<div>
<ul>
    <li><a href='#Security-Securetransports'>Secure transports</a></li>
<ul>
    <li><a href='#Security-HTTPS'>HTTPS</a></li>
</ul>
    <li><a href='#Security-WSSecurity'>WS-* Security</a></li>
    <li><a href='#Security-Authentication'>Authentication</a></li>
    <li><a href='#Security-WSSecurityUsernameTokenandCustomAuthentication'>WS-Security
UsernameToken and Custom Authentication</a></li>
    <li><a href='#Security-Authorization'>Authorization</a></li>
    <li><a href='#Security-ControllingthedepthofXMLpayloads'>Controlling the depth
of XML payloads</a></li>
</ul></div>

<h1><a name="Security-Securetransports"></a>Secure transports</h1>

<h2><a name="Security-HTTPS"></a>HTTPS</h2>

<p>Please see the <a href="http://cxf.apache.org/docs/client-http-transport-including-ssl-support.html"
class="external-link" rel="nofollow">Configuring SSL Support</a> page for more information.</p>

<h1><a name="Security-WSSecurity"></a>WS-* Security</h1>

<p>Please see the <a href="http://cxf.apache.org/docs/ws-support.html" class="external-link"
rel="nofollow">WS-* Support</a> page for more information.</p>

<h1><a name="Security-Authentication"></a>Authentication</h1>

<p>Container or Spring Security managed authentication as well as the custom authentication
are all the viable options used by CXF developers.</p>

<p>Starting from CXF 2.3.2 and 2.4.0 it is possible to use an org.apache.cxf.interceptor.security.JAASLoginInterceptor
in order to authenticate a current user and populate a CXF SecurityContext.</p>

<p>Example :</p>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-xml">
<span class="code-tag">&lt;jaxws:endpoint address=<span class="code-quote">"/soapService"</span>&gt;</span>
 <span class="code-tag">&lt;jaxws:inInterceptors&gt;</span>
   <span class="code-tag">&lt;ref bean=<span class="code-quote">"authenticationInterceptor"</span>/&gt;</span>
 <span class="code-tag">&lt;/jaxws:inInterceptors&gt;</span>
<span class="code-tag">&lt;/jaxws:endpoint&gt;</span>

<span class="code-tag">&lt;bean id=<span class="code-quote">"authenticationInterceptor"</span>
class=<span class="code-quote">"org.apache.cxf.interceptor.security.JAASLoginInterceptor"</span>&gt;</span>
   <span class="code-tag">&lt;property name=<span class="code-quote">"contextName"</span>
value=<span class="code-quote">"jaasContext"</span>/&gt;</span>
   &lt;!--
     Deprecated starting from 2.4.4 and 2.5.0 
     <span class="code-tag">&lt;property name=<span class="code-quote">"rolePrefix"</span>
value=<span class="code-quote">"ROLE_"</span>/&gt;</span>
   --&gt;
   <span class="code-tag">&lt;property name=<span class="code-quote">"roleClassifier"</span>
value=<span class="code-quote">"ROLE_"</span>/&gt;</span>

<span class="code-tag">&lt;/bean&gt;</span>
<span class="code-tag"><span class="code-comment">&lt;!-- Similarly for JAX-RS
endpoints --&gt;</span></span>
</pre>
</div></div> 

<p>The JAAS authenticator is configured with the name of the JAAS login context (the
one usually specified in the JAAS configuration resource which the server is aware of). It
is also configured with an optional "roleClassifier" property which is needed by the CXF SecurityContext
in order to differentiate between user and role Principals. By default CXF will assume that
role Principals are represented by javax.security.acl.Group instances.</p>

<p>In some cases objects representing a user principal and roles are implementing the
same marker interface such as Principal. That can be handled like this:</p>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-xml">

<span class="code-tag">&lt;bean id=<span class="code-quote">"authenticationInterceptor"</span>
class=<span class="code-quote">"org.apache.cxf.interceptor.security.JAASLoginInterceptor"</span>&gt;</span>
   <span class="code-tag">&lt;property name=<span class="code-quote">"contextName"</span>
value=<span class="code-quote">"jaasContext"</span>/&gt;</span>
   <span class="code-tag">&lt;property name=<span class="code-quote">"roleClassifier"</span>
value=<span class="code-quote">"RolePrincipal"</span>/&gt;</span>
   <span class="code-tag">&lt;property name=<span class="code-quote">"roleClassifierType"</span>
value=<span class="code-quote">"classname"</span>/&gt;</span>
<span class="code-tag">&lt;/bean&gt;</span>
<span class="code-tag"><span class="code-comment">&lt;!-- Similarly for JAX-RS
endpoints --&gt;</span></span>
</pre>
</div></div> 

<p>In this case JAASLoginInterceptor will know that the roles are represented by a class
whose simple name is RolePrincipal. Note that full class names are also supported.</p>


<h1><a name="Security-WSSecurityUsernameTokenandCustomAuthentication"></a>WS-Security
UsernameToken and Custom Authentication</h1>

<p>If needed, one may want to configure a jaxws:endpoint with a "ws-security.ut.no-callbacks"
property set to true and register a custom org.apache.cxf.interceptor.security.AbstractUsernameTokenInInterceptor
implementation for using a WSS4J UsernameToken wrapped in a CXF specific UsernameToken for
the custom authentication and Subject creation. JAASLoginInterceptor will also recognize a
CXF UsernameToken and thus can be used instead of the custom org.apache.cxf.interceptor.security.AbstractUsernameTokenInterceptor.</p>

<p>Note that the "ws-security.ut.no-callbacks" property has been renamed to "ws-security.validate.token"
in CXF 2.4.0. The name of the property is 'positive' thus one will need to set this property
to false in order to postpone the validation of the token.</p>

<h1><a name="Security-Authorization"></a>Authorization</h1>

<p>Container or Spring Security managed authorization as well as the custom authorization
are all the viable options used by CXF developers.</p>

<p>CXF 2.3.2 and 2.4.0 introduce org.apache.cxf.interceptor.security.SimpleAuthorizingInterceptor
and org.apache.cxf.interceptor.security.SecureAnnotationsInterceptor interceptors which can
help with enforcing the authorization rules.</p>

<p>Example :</p>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-xml">
<span class="code-tag">&lt;jaxws:endpoint id=<span class="code-quote">"endpoint1"</span>
address=<span class="code-quote">"/soapService1"</span>&gt;</span>
 <span class="code-tag">&lt;jaxws:inInterceptors&gt;</span>
   <span class="code-tag">&lt;ref bean=<span class="code-quote">"authorizationInterceptor"</span>/&gt;</span>
 <span class="code-tag">&lt;/jaxws:inInterceptors&gt;</span>
<span class="code-tag">&lt;/jaxws:endpoint&gt;</span>

<span class="code-tag">&lt;bean id=<span class="code-quote">"authorizationInterceptor"</span>
class=<span class="code-quote">"org.apache.cxf.interceptor.security.SimpleAuthorizingInterceptor"</span>&gt;</span>
   <span class="code-tag">&lt;property name=<span class="code-quote">"methodRolesMap"</span>&gt;</span>
      <span class="code-tag">&lt;map&gt;</span>
        <span class="code-tag">&lt;entry key=<span class="code-quote">"addNumbers"</span>
value=<span class="code-quote">"ROLE_USER ROLE_ADMIN"</span>/&gt;</span>
        <span class="code-tag">&lt;entry key=<span class="code-quote">"divideNumbers"</span>
value=<span class="code-quote">"ROLE_ADMIN"</span>/&gt;</span>  
      <span class="code-tag">&lt;/map&gt;</span>
   <span class="code-tag">&lt;/property&gt;</span> 
<span class="code-tag">&lt;/bean&gt;</span>

<span class="code-tag">&lt;jaxws:endpoint id=<span class="code-quote">"endpoint2"</span>
address=<span class="code-quote">"/soapService2"</span> implementor=<span class="code-quote">"#secureBean"</span>&gt;</span>
 <span class="code-tag">&lt;jaxws:inInterceptors&gt;</span>
   <span class="code-tag">&lt;ref bean=<span class="code-quote">"authorizationInterceptor2"</span>/&gt;</span>
 <span class="code-tag">&lt;/jaxws:inInterceptors&gt;</span>
<span class="code-tag">&lt;/jaxws:endpoint&gt;</span>

<span class="code-tag"><span class="code-comment">&lt;!-- This bean is annotated
with secure annotations such as RolesAllowed --&gt;</span></span>
<span class="code-tag">&lt;bean id=<span class="code-quote">"secureBean"</span>
class=<span class="code-quote">"org.apache.cxf.tests.security.SecureService"</span>/&gt;</span>

<span class="code-tag">&lt;bean id=<span class="code-quote">"authorizationInterceptor2"</span>
class=<span class="code-quote">"org.apache.cxf.interceptor.security.SecureAnnotationsInterceptor"</span>&gt;</span>
   <span class="code-tag">&lt;property name=<span class="code-quote">"securedObject"</span>
ref=<span class="code-quote">"secureBean"</span>/&gt;</span>
<span class="code-tag">&lt;/bean&gt;</span>

</pre>
</div></div> 

<h1><a name="Security-ControllingthedepthofXMLpayloads"></a>Controlling
the depth of XML payloads</h1>

<p>Endpoints expecting XML payloads may get <a href="http://svn.apache.org/repos/asf/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/security/DepthRestrictingStreamInterceptor.java"
class="external-link" rel="nofollow">DepthRestrictingInterceptor</a> registered and
configured in order to control the limits a given XML payload may not exceed. This can be
useful in a variety of cases in order to protect against massive payloads which can potentially
cause the denial-of-service situation or simply slow the service down a lot.</p>

<p>The complete number of XML elements, the number of immediate children of a given
XML element may contain and the stack depth of the payload can be restricted, for example:</p>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-xml">

<span class="code-tag">&lt;bean id=<span class="code-quote">"depthInterceptor"</span>
class=<span class="code-quote">"org.apache.cxf.interceptor.security.DepthRestrictingStreamInterceptor"</span>&gt;</span>
  <span class="code-tag"><span class="code-comment">&lt;!-- Total number of
elements in the XML payload --&gt;</span></span>
  <span class="code-tag">&lt;property name=<span class="code-quote">"elementCountThreshold"</span>
value=<span class="code-quote">"5000"</span>/&gt;</span>

  <span class="code-tag"><span class="code-comment">&lt;!-- Total number of
child elements for XML elements --&gt;</span></span>
  <span class="code-tag">&lt;property name=<span class="code-quote">"innerElementCountThreshold"</span>
value=<span class="code-quote">"3000"</span>/&gt;</span>

  <span class="code-tag"><span class="code-comment">&lt;!-- Maximum stack
depth of the XML payload --&gt;</span></span>
  <span class="code-tag">&lt;property name=<span class="code-quote">"innerElementLevelThreshold"</span>
value=<span class="code-quote">"20"</span>/&gt;</span>

<span class="code-tag">&lt;/bean&gt;</span>

<span class="code-tag">&lt;jaxws:endpoint&gt;</span>
  <span class="code-tag">&lt;jaxws:inInterceptors&gt;</span>
   <span class="code-tag">&lt;bean ref=<span class="code-quote">"depthInterceptor"</span>/&gt;</span>
 <span class="code-tag">&lt;/jaxws:inInterceptors&gt;</span>
<span class="code-tag">&lt;jaxws:endpoint&gt;</span>

<span class="code-tag">&lt;jaxrs:server&gt;</span>
  <span class="code-tag">&lt;jaxrs:inInterceptors&gt;</span>
   <span class="code-tag">&lt;bean ref=<span class="code-quote">"depthInterceptor"</span>/&gt;</span>
 <span class="code-tag">&lt;/jaxrs:inInterceptors&gt;</span>
<span class="code-tag">&lt;jaxrs:server&gt;</span>

</pre>
</div></div>

<p>When one of the limits is reached, the error is returned. JAX-WS consumers will receive
500, JAX-RS/HTTP consumers: 413.</p>

<p>The following system properties can also be set up for JAX-WS endpoints: "org.apache.cxf.staxutils.innerElementCountThreshold"
and "org.apache.cxf.staxutils.innerElementLevelThreshold".</p>

<p>Finally, default JAX-RS org.apache.cxf.jaxrs.provider.JAXBElementProvider and JAXB-based
org.apache.cxf.jaxrs.provider.json.JSONProvider can be directly configured with <a href="http://svn.apache.org/repos/asf/cxf/trunk/api/src/main/java/org/apache/cxf/staxutils/DocumentDepthProperties.java"
class="external-link" rel="nofollow">DepthRestrictingProperies</a>.</p>

    </div>
        <div id="commentsSection" class="wiki-content pageSection">
        <div style="float: right;">
            <a href="https://cwiki.apache.org/confluence/users/viewnotifications.action"
class="grey">Change Notification Preferences</a>
        </div>
        <a href="https://cwiki.apache.org/confluence/display/CXF20DOC/Security">View
Online</a>
        |
        <a href="https://cwiki.apache.org/confluence/pages/diffpagesbyversion.action?pageId=24190972&revisedVersion=12&originalVersion=11">View
Changes</a>
                |
        <a href="https://cwiki.apache.org/confluence/display/CXF20DOC/Security?showComments=true&amp;showCommentArea=true#addcomment">Add
Comment</a>
            </div>
</div>
</div>
</div>
</div>
</body>
</html>

Mime
View raw message