<?xml version='1.0' encoding='UTF-8'?>
<title>Security Descriptors</title>
<section id="s-authzframe-secdesc-introduction">
  <title>Introduction</title>
  <para>Security descriptors contain various security properties like credentials,
    the <glossterm linkend="grid-map-file">grid map file</glossterm> location, required authentication and authorization mechanisms and so on. There are four
  types of security descriptors in the code base for setting container, 
  service, resource and client security properties:</para>
  <informaltable>
  <tgroup cols="2">
  <tbody>
    <row>
      <entry>container security descriptor</entry>
      <entry>determines the container level security requirement that needs to be enforced.</entry>
    </row>
    <row>
      <entry>service security descriptor</entry>
      <entry>determines the service level security requirement that needs to be enforced.</entry>
    </row>      
    <row>
      <entry>resource security descriptor</entry>
      <entry>determines the resource level security requirement that needs to be enforced.</entry>
    </row>
    <row>
      <entry>client security descriptor</entry>
      <entry>determines the security properties that need to be used for a particular invocation.</entry>
    </row>
  </tbody>
  </tgroup>
  </informaltable>

  <para>Each of these is represented as an object and can
  be altered programmatically. Service and container security
  descriptors can be configured as  XML files in the deployment
  descriptor as shown below.  Resource security descriptors can only
  be created dynamically, either programmatically or from a descriptor
  file. Client security descriptor can be configured as a XML file and set as property on Stub. If the security descriptor file is altered at runtime, it
  will <emphasis>not</emphasis> be reloaded</para>
</section>
<section id="s-authzframe-secdesc-configDesc">
  <title>Configuring security descriptors </title>
  <para>The following shows how the service and container security descriptor files
are configured.</para>
<para>The container security descriptor needs to be set in the core server-config.wsdd. That file is in wsrf/java/core/source/deploy-server.wsdd if editing source, prior to deploy or $GLOBUS_LOCATION/etc/globus_wsrf_core/server-config.wsdd in a binary install. The parameter element to be added is: </para>
  <screen>
&lt;globalConfiguration&gt;
   ...
   &lt;parameter name=&quot;containerSecDesc&quot;
              value=&quot;&lt;path to global security descriptor&gt;&quot;&gt;
   ...
&lt;globalConfiguration&gt;
   </screen>

   <para>A sample container security descriptor file, global_security_descriptor.xml is shipped as a part of the toolkit. The file can be edited to reflect the deployment security properties and the above parameter will be set as follows: </para>

  <screen>
&lt;globalConfiguration&gt;
   ...
   &lt;parameter name=&quot;containerSecDesc&quot;
              value=&quot;etc/globus_wsrf_core/global_security_descriptor.xml&quot;&gt;
   ...
&lt;globalConfiguration&gt;
   </screen>

   <para>Service security descriptor should be configured as follows:</para>

   <screen>
&lt;service name=&quot;MyDummyService&quot; provider=&quot;Handler&quot; style=&quot;document&quot;&gt;
   ...
   &lt;parameter name=&quot;securityDescriptor&quot; value=&quot;org/globus/wsrf/impl/security/descriptor/security-config.xml&quot;/&gt;
   ...
&lt;/service&gt;</screen>
  <para>If the security descriptor is configured to be read from a file, it is loaded as follows:<orderedlist>
      <listitem>
        <simpara>As a file if an absolute file path is specified.</simpara>
      </listitem>
      <listitem>
        <simpara>As a resource (can be included as part of jar file).</simpara>
      </listitem>
      <listitem>
        <simpara>As a file, assuming that the specified path is relative to the installation root, typically pointed to by environment variable <envar>GLOBUS_LOCATION</envar>.</simpara>
      </listitem>
    </orderedlist></para>
  <para>The security descriptor files need to comply with the <ulink url="service_security_descriptor.xsd">service security descriptor schema</ulink> or <ulink url="container_security_descriptor.xsd">container security descriptor schema</ulink> as appropriate. The resource security
    descriptor file uses the same schema as the service security
    descriptor. In all cases, the security descriptor is contained
    within the <constant>&lt;securityConfig xmlns=&quot;http://www.globus.org&quot;&gt;</constant> element.</para>

<section id="p-client-sec-desc-config" xreflabel="Configuring Client Security Descriptor"> <title> Configuring Client Security Descriptor</title>
<para>
Client security descriptors are configured as shown below:
</para>
<screen>
// Client security descriptor file 
String CLIENT_DESC = &quot;org/globus/wsrf/samples/counter/client/client-security-config.xml&quot;;
//Set descriptor on Stub 
((Stub)port)._setProperty(Constants.CLIENT_DESCRIPTOR_FILE, CLIENT_DESC);
</screen>
<para>
The client security descriptor files need to comply with the <ulink url="client_security_descriptor.xsd">client security descriptor schema</ulink>.</para></section>
</section>
<section id="s-authzframe-server-secdesc-descFile">
  <title>Writing server-side security descriptor files </title>

  <para>The next few sections deal with writing server side security
  descriptor files&mdash;that is, container, service and resource descriptor files
  to set various properties. Please note that not all parameters are
  applicable for all three types of descriptors and are appropriately
  annotated in the relevant sections. The few parameters relevant only
  for the container security descriptor are described in <ulink
  url="#s-authzframe-secdesc-container">Section 7</ulink>.</para>

  <section id="s-authzframe-secdesc-configCred">
    <title>Configuring credentials</title>
    <para>The container and each service can each be configured with a
    separate set of credentials. The credentials can be set using
    either: a) the path to a certificate and key file, or b) the path to a proxy file. If the configured credential file is modified/updated at
    runtime, the credentials will be automatically reloaded. The credentials can be configured by adding one of the following blocks to the container or service
    security descriptor. </para>
    <para>Example for option (a):<screen>&lt;securityConfig xmlns=&quot;http://www.globus.org&quot;&gt;
   ...
   &lt;credential&gt;
      &lt;key-file value=&quot;keyFile&quot;/&gt;
      &lt;cert-file value=&quot;certFile&quot;/&gt;
   &lt;/credential&gt;
   ...
&lt;/securityConfig&gt;</screen></para>
    <para>Example for option (b):

<screen>&lt;securityConfig xmlns=&quot;http://www.globus.org&quot;&gt;
   ...
   &lt;proxy-file value=&quot;proxyFile&quot;/&gt;
   ...
&lt;/securityConfig&gt;</screen></para>
    <para>The  framework will look for credentials in the following order:
  <orderedlist>
        <listitem>
          <simpara>Resource credentials </simpara>
        </listitem>
        <listitem>
          <simpara><glossterm linkend="svc-cred">Service credentials</glossterm></simpara>
        </listitem>
        <listitem>
          <simpara>Container credentials </simpara>
        </listitem>
        <listitem>
          <simpara>Default credentials. This uses the underlying security library to acquire the credentials. It will typically result in finding the <glossterm linkend="proxy-cert">proxy certificate</glossterm> of the user that is running the container.</simpara>
        </listitem>
      </orderedlist> 
</para>
  </section>
  <section id="s-authzframe-secdesc-configGridmap">
    <title>Configuring grid map files</title>
    <para>The container and each service can be configured with a separate
    grid map file in each of their security descriptors as shown below:</para>
    <screen>&lt;securityConfig xmlns=&quot;http://www.globus.org&quot;&gt;
   ...
   &lt;gridmap value=&quot;gridMapFile&quot;/&gt;
   ...
&lt;/securityConfig&gt;</screen>
    <para>The  framework will first look for a gridmap configured by the resource,
    then by the service and then by the container. For services configured to perform
    grid map file authorization, the grid map file can be updated
    dynamically using the SecurityManager API. Also, if the gridmap
    file changes at runtime it will be automatically reloaded.</para>
  </section>
  <section id="s-authzframe-secdesc-configAuth">
    <title>Configuring authentication methods</title>
    <para><emphasis>This can only be done at service or resource level.</emphasis> </para>
    <para>The authentication methods a service requires are specified using
    the <constant>&lt;auth-method&gt;</constant> element.  The authentication
    methods can also be configured on a per method basis.  This is
    done by specifying the <constant>&lt;auth-method&gt;</constant> element
    within a <constant>&lt;method name=&quot;operation name&quot;&gt;</constant> element. The
    value of the <emphasis>name</emphasis> attribute can be set to either the operation
    name (preferred) or the operation name with a given namespace.</para>
    <para>Currently, the following authentication methods are supported:</para>
    <table>
      <title>Authentication methods</title>
      <tgroup cols="2">
        <tbody>
          <row>
            <entry>
              <constant>&lt;none/&gt;</constant>
            </entry>
            <entry>
              <para>Indicates that no authentication is required.</para>
              <para>This method <emphasis>cannot</emphasis> be specified with any
          other authentication method.</para>
            </entry>
          </row>
          <row>
            <entry>
              <constant>&lt;GSISecureMessage/&gt;</constant>
            </entry>
            <entry>
              <para>Indicates the GSI Secure
            Message authentication method.</para>
              <para>The <constant>&lt;protection-level&gt; </constant>sub element can
          be used to specify a protection level that must be
          applied to the message:
    <table>
      <title>Protection mechanims</title>
      <tgroup cols="2">
        <tbody>
          <row>
            <entry>
              <constant>&lt;integrity/&gt;</constant>
            </entry>
            <entry>Indicates that the message must be integrity protected (signed).</entry>
          </row>
          <row>
            <entry>
              <constant>&lt;privacy/&gt;</constant>
            </entry>
            <entry>Indicates that the message must be privacy protected (encrypted and signed).</entry>
          </row>
        </tbody>
      </tgroup>
    </table>
              </para>
            </entry>
          </row>
          <row>
            <entry>
              <constant>&lt;GSISecureConversation/&gt;</constant>
            </entry>
            <entry>
              <para>Indicates the GSI Secure
            Conversation authentication method (with integrity or
            privacy protection).</para>
              <para>The <constant>&lt;protection-level&gt;</constant> sub element can be used
          to indicate a specific protection level that must be applied to the
          message:
    <table>
      <title>Protection mechanims</title>
      <tgroup cols="2">
        <tbody>
          <row>
            <entry>
              <constant>&lt;integrity/&gt;</constant>
            </entry>
            <entry>Indicates that the message must be integrity protected (signed).</entry>
          </row>
          <row>
            <entry>
              <constant>&lt;privacy/&gt;</constant>
            </entry>
            <entry>Indicates that the message must be privacy protected (encrypted and signed).</entry>
          </row>
        </tbody>
      </tgroup>
    </table>

</para>
            </entry>
          </row>
          <row>
            <entry>
              <constant>&lt;GSITransport/&gt;</constant>
            </entry>
            <entry>
              <para>Indicates the GSI Secure Transport authentication method.</para>
              <para>The <constant>&lt;protection-level&gt;</constant> sub element can be used
          to specify a specific protection level that must be applied to the
          message:
    <table>
      <title>Protection mechanims</title>
      <tgroup cols="2">
        <tbody>
          <row>
            <entry>
              <constant>&lt;integrity/&gt;</constant>
            </entry>
            <entry>Indicates that the message must be integrity protected (signed).</entry>
          </row>
          <row>
            <entry>
              <constant>&lt;privacy/&gt;</constant>
            </entry>
            <entry>Indicates that the message must be privacy protected (encrypted and signed).</entry>
          </row>
        </tbody>
      </tgroup>
    </table>
</para>
            </entry>
          </row>
        </tbody>
      </tgroup>
    </table>
    <para><emphasis>Notes:</emphasis></para>
    <itemizedlist>
      <listitem>
        <simpara>Multiple authentication methods can be specified under the <constant>&lt;auth-method&gt;</constant> element (except for the <constant>&lt;none/&gt;</constant> method, see above). As long as one of the specified authentication methods is used, access to the service is allowed.</simpara>
      </listitem>
      <listitem>
        <simpara>If <emphasis>no</emphasis> <constant>&lt;protection-level&gt;</constant> sub element is specified, then all protection levels are available to clients. However, if the <constant>&lt;protection-level&gt;</constant> sub element <emphasis>is</emphasis> specified, then the service will only accept the protection levels listed under said element.</simpara>
      </listitem>
      <listitem>
        <simpara>The <constant>org.globus.wsrf.impl.security.authentication.SecurityPolicyHandler</constant> handler <emphasis>must</emphasis> be installed properly in order for this to work. This handler is installed by default.</simpara>
      </listitem>
      <listitem>
        <simpara>If a security descriptor is <emphasis>not</emphasis> specified, authentication method enforcement is <emphasis>not</emphasis> performed.</simpara>
      </listitem>
    </itemizedlist>
    <para><emphasis>Example:</emphasis></para>
    <screen>&lt;securityConfig xmlns=&quot;http://www.globus.org&quot;&gt;

   &lt;method name=&quot;findServiceData&quot;&gt;
      &lt;auth-method&gt;
         &lt;none/&gt;
      &lt;/auth-method&gt;
   &lt;/method&gt;

   &lt;method name=&quot;destroy&quot;&gt;
      &lt;auth-method&gt;
         &lt;GSISecureMessage/&gt;
         &lt;GSISecureConversation&gt;
            &lt;protection-level&gt;
               &lt;integrity/&gt;
            &lt;/protection-level&gt;
         &lt;/GSISecureConversation&gt;
      &lt;/auth-method&gt;
   &lt;/method&gt;

   &lt;!-- default auth-method for any other method --&gt;
   &lt;auth-method&gt;
      &lt;GSISecureConversation/&gt;
   &lt;/auth-method&gt;
&lt;/securityConfig&gt;</screen>
    <para>In the above example:</para>
    <itemizedlist>
      <listitem>
        <simpara>the <function>findServiceData()</function> operation does not require any authentication.</simpara>
      </listitem>
      <listitem>
        <simpara>the <function>destroy()</function> operation requires either <emphasis>GSI Secure Message</emphasis> authentication with either level of protection or <emphasis>GSI Secure Conversation</emphasis> authentication with integrity protection.</simpara>
      </listitem>
      <listitem>
        <simpara>all other operations must be authenticated with <emphasis>GSI Secure Conversation</emphasis> with either level of protection.</simpara>
      </listitem>
    </itemizedlist>
  </section>
  <section id="s-authzframe-secdesc-configRunas">
    <title>Configuring the run-as mode</title>
    <para>The <constant>&lt;run-as&gt;</constant> element is used to configure the
    JAAS run-as identity under which the service method will be
    executed. The run-as identity can be configured on a per method
    basis. Currently, the following run-as identities are
    supported:</para>
    <table>
      <title>Run-as methods</title>
      <tgroup cols="2">
        <tbody>
          <row>
            <entry>
              <constant>&lt;caller-identity/&gt;</constant>
            </entry>
            <entry>
              <para>The service method will be run with the security identity
          of the client. The caller Subject will contain the following:</para>
              <itemizedlist>
                <listitem>
                  <simpara>If using <emphasis>GSI Secure Message</emphasis>: a GlobusPrincipal (the identity of the signer) is added to the principal set of the caller-identity Subject. Also, the signer&apos;s certificate chain is added to the public credentials set of the Subject object.</simpara>
                </listitem>
                <listitem>
                  <para>If using <emphasis>GSI Secure Conversation</emphasis>: a
            GlobusPrincipal (the identity of the initiator) is added
            to the principal set of the Subject.  <itemizedlist>
                      <listitem>
                        <simpara>If client authentication was performed, the client&apos;s certificate chain will be added to the public credentials set of the Subject object. </simpara>
                      </listitem>
                      <listitem>
                        <simpara>Also, if delegation was performed, the delegated credential is added to the private credential set of the Subject object. </simpara>
                      </listitem>
                    </itemizedlist></para>
                </listitem>
                <listitem>
                  <simpara>If grid map file authorization was performed, a UserNamePrincipal is added to the principal set of the Subject object.</simpara>
                </listitem>
              </itemizedlist>
            </entry>
          </row>
          <row>
            <entry>
              <constant>&lt;system-identity/&gt;</constant>
            </entry>
            <entry>The service method will be run with the security identity of the container.</entry>
          </row>
          <row>
            <entry>
              <constant>&lt;service-identity/&gt;</constant>
            </entry>
            <entry>The service method will be run with the security identity of the service itself (if the service has one, otherwise the container identity will be used).</entry>
          </row>
          <row>
            <entry>
              <constant>&lt;resource-identity/&gt;</constant>
            </entry>
            <entry>The service method will be run with the security identity of the resource. If no resource is specified or if the resource does not have a configured subject, credentials in this order of occurrence will be used: service credential, container credential.</entry>
          </row>
        </tbody>
      </tgroup>
    </table>
    <para><emphasis>Notes:</emphasis> </para>
    <itemizedlist>
      <listitem>
        <simpara><emphasis>resource-identity</emphasis> is the default setting.</simpara>
      </listitem>
      <listitem>
        <simpara>The <constant>org.globus.wsrf.impl.security.authentication.SecurityPolicyHandler</constant> handler <emphasis>must</emphasis> be installed properly in order for this to work. It is installed by default.</simpara>
      </listitem>
      <listitem>
        <simpara>If the security descriptor is <emphasis>not</emphasis> specified, then the run-as identity is not set and there will be no JAAS subject associated with the execution of the operation. This means that any method calls that require credentials and that are invoked by the service method itself will fail.</simpara>
      </listitem>
    </itemizedlist>
    <para><emphasis>Example:</emphasis></para>
    <screen>&lt;securityConfig xmlns=&quot;http://www.globus.org&quot;&gt;
   &lt;method name=&quot;add&quot;&gt;
      &lt;run-as&gt;
         &lt;caller-identity/&gt;
      &lt;/run-as&gt;
   &lt;/method&gt;

   &lt;method name=&quot;subtract&quot;&gt;
      &lt;run-as&gt;
         &lt;system-identity/&gt;
      &lt;/run-as&gt;
   &lt;/method&gt; 
   
   &lt;!-- default run-as for any other method --&gt;
   &lt;run-as&gt; 
      &lt;service-identity/&gt;
   &lt;/run-as&gt;
&lt;/securityConfig&gt;</screen>
    <para>In the above example:</para>
    <itemizedlist>
      <listitem>
        <simpara>the <function>add()</function>operation will be run with the caller&apos;s identity.</simpara>
      </listitem>
      <listitem>
        <simpara>the <function>subtract()</function> call will be run with the system identity.</simpara>
      </listitem>
      <listitem>
        <simpara>all other operations will be run with the service identity (if the service has one set).</simpara>
      </listitem>
    </itemizedlist>
  </section>
  <section id="s-authzframe-secdesc-configAuthz">
    <title>Configuring authorization mechanisms</title>
    <para>The container and each service can be configured with a chain of
  authorization mechanisms (also known as Policy Decision Points (PDPs)) and attribute collection mechanisms (also known as Policy Information Points (PIPs)),
  using the <emphasis>authz</emphasis> element. PIPs are expected to collect attributes and store them for use by PDPs in authorization process or in the invocation chain. PDPs are expected to  be enforce some authorization policy. The chain combines the decision from all the PDPs.Each PDP/PIP name is scoped and the
  format is <emphasis>prefix:FQDN of the PDP/PIP</emphasis>. For example,
  <emphasis>self:org.globus.wsrf.impl.security.authorization.SelfAuthorization</emphasis>.  The prefix is used to allow multiple instances of the same PDP/PIP to exist in the same authorization chain. All the PIPs in the authorization chain are invoked in the order configured, before the PDPs are invoked. The
  authorization is deemed to be a permit if each of the authorization
  mechanisms in the chain returns a permit.</para>
    <para><emphasis>Example:</emphasis></para>
    <screen>&lt;securityConfig xmlns=&quot;http://www.globus.org&quot;&gt;
   ...
   &lt;authz value=&quot;pdp1:org.foo.PDP1 pdp2:org.foo.PDP2 foo1:org.foo.authzMechanism bar1:org.bar.barMechanism&quot;/&gt;
   ...
&lt;securityConfig/&gt;</screen>
    <para>Each PDP/PIP is instantiated with some configuration information that
 can be used to get any further information that the PDP/PIP may need to make
authorization decisions. If the authorization chain is configured at the
container level, then the parameters are picked up from the global configuration
section of the container deployment descriptor. If the authorization chain is
configured at the service level, the PDPs will pick up parameters from the relevant
  service section of the deployment descriptor. Resource level configuration
  has to be done programmatically and is described <ulink url="#s-authzframe-secdesc-resDesc">here</ulink>.
  In all three cases, the prefix specified in the authorization chain configuration is used to get the right property. For example, all properties for
        <emphasis>foo1:org.foo.authzMechanism</emphasis>
      are picked up from properties that have been scoped with the prefix
        <emphasis>foo1-</emphasis>.
      </para>
    <para> The following PDPs are a part of the toolkit and are configured as shown. The framework maps and plugs in the scoped name of the PDP at the time of authorization.
</para>
    <table>
      <title>Builtin PDPs</title>
      <tgroup cols="2">
        <tbody>
          <row>
            <entry>
              <constant>none</constant>
            </entry>
            <entry> No authorization is performed. </entry>
          </row>
          <row>
            <entry>
              <constant>self</constant>
            </entry>
            <entry>
              <itemizedlist>
                <listitem>
                  <simpara>PDP Name: <constant>selfAuthz:org.globus.wsrf.impl.security.authorization.SelfAuthorization</constant></simpara>
                </listitem>
                <listitem>
                  <simpara>This scheme does not require any additional configuration information.</simpara>
                </listitem>
                <listitem>
                  <para>Only clients that present the same identity as the identity
          in the current JAAS subject associated with the service are
          allowed to access the service. </para>
                  <para>The current JAAS subject is determined by the value of
          the run-as element in the service security descriptor (see <ulink url="#s-authzframe-secdesc-configRunas">Configuring run-as mode</ulink>).</para>
                </listitem>
              </itemizedlist>
            </entry>
          </row>
          <row>
            <entry>
              <constant>gridmap</constant>
            </entry>
            <entry>
              <itemizedlist>
                <listitem>
                  <simpara>PDP Name: <constant>grimapAuthz:org.globus.wsrf.impl.security.authorization.GridMapAuthorization</constant></simpara>
                </listitem>
                <listitem>
                  <simpara>A grid map file must be configured as described in <xref linkend="s-authzframe-secdesc-configGridmap" />.</simpara>
                </listitem>
                <listitem>
                  <simpara>Grid map file authorization is performed, i.e. a mapping must exist for the client identity in the configured <glossterm linkend="grid-map-file">grid map file</glossterm>. </simpara>
                </listitem>
              </itemizedlist>
            </entry>
          </row>
          <row>
            <entry>
              <constant>identity</constant>
            </entry>
            <entry>
              <itemizedlist>
                <listitem>
                  <simpara>PDP Name: <constant>idenAuthz:org.globus.wsrf.impl.security.authorization.IdentityAuthorization</constant></simpara>
                </listitem>
                <listitem>
                  <simpara>The property <constant>idenAuthz-identity</constant> set to the expected identity must be configured in the service or container deployment descriptor in the case of service level or container level authorization respectively.</simpara>
                </listitem>
                <listitem>
                  <simpara>The client identity must match the value of this property.</simpara>
                </listitem>
              </itemizedlist>
            </entry>
          </row>
          <row>
            <entry>
              <constant>host</constant>
            </entry>
            <entry>
              <para><itemizedlist>
                  <listitem>
                    <simpara>PDP Name: <constant>hostAuthz:org.globus.wsrf.impl.security.authorization.HostAuthorization</constant></simpara>
                  </listitem>
                  <listitem>
                    <simpara>The property <constant>hostAuthz-url</constant> set to the expected host name must be configured in the service or container deployment descriptor in the case of service level or container level authorization respectively.</simpara>
                  </listitem>
                  <listitem>
                    <simpara>Host based authorization is done and should match the expected host set in the property.</simpara>
                  </listitem>
                </itemizedlist>       </para>
            </entry>
          </row>
          <row>
            <entry>
              <constant>samlCallout</constant>
            </entry>
            <entry>
              <para><itemizedlist>
                  <listitem>
                    <simpara>PDP Name: <constant>samlAuthz:org.globus.wsrf.impl.security.authorization.SAMLAuthorizationCallout</constant></simpara>
                  </listitem>
                  <listitem>
                    <simpara>This scheme calls out to a configured <ulink url="https://forge.gridforum.org/projects/ogsa-authz">OGSA-AuthZ</ulink> compliant authorization service.</simpara>
                  </listitem>
                  <listitem>
                    <simpara>When this PDP is specified via the <constant>samlCallout</constant> alias or the <constant>org.globus.wsrf.impl.security.authorization.Authorization.AUTHZ_SAML</constant> constant the prefix <constant>samlAuthz</constant> is used when acquiring configuration settings.</simpara>
                  </listitem>
                  <listitem>
                    <simpara>The SAML authorization callout PDP can be configured by specifying parameters in the service entry in the deployment descriptor of the service that is using the callout. The available configuration properties are described in <xref linkend="t-authzframe-secdesc-saml-params"/>.</simpara>
                  </listitem>
                </itemizedlist>       </para>
            </entry>
          </row>
          <row>
            <entry>
              <constant>userName</constant>
            </entry>
            <entry>
              <itemizedlist>
                <listitem>
                  <simpara>PDP Name: <constant>userNameAuthz:org.globus.wsrf.impl.security.authorization.UsernameAuthorization</constant></simpara>
                </listitem>
                <listitem>
                  <simpara>This scheme does not require any additional configuration information.</simpara>
                </listitem>
                <listitem>
                  <simpara>This uses the configured <ulink url="http://java.sun.com/products/jaas/">JAAS Login Module</ulink> to authorize the user based on username and password. The PDP uses <constant>NameCallback</constant> and <constant>PasswordCallback</constant> to send user name and password information to the Login module.</simpara>
                </listitem>
              </itemizedlist>
            </entry>
          </row>
          <row>
            <entry>
              <constant>someScope:org.globus.wsrf.impl.security.authorization.LocalConfigPDP</constant>
            </entry>
            <entry>
              <itemizedlist>
                <listitem>
                  <simpara>PDP Name: <constant>someScope:org.globus.wsrf.impl.security.authorization.LocalConfigPDP</constant></simpara>
                </listitem>
                <listitem>
                  <simpara>The property authzConfigFile should be set to a file containing mappings between users and their allowed operations. 
                    One user mapping is specified per line and multiple operations are separated by semicolon (;). 
                    The file may be modified without restarting the hosting environemnt.</simpara>
                  
                  <para>Example:
<screen>/O\=Grid/O\=Globus/OU\=Sample\Org/CN\=AdminUser={http://www.globus.org/counter}add;{http://www.globus.org/counter}subtract 
/O\=Grid/O\=Globus/OU\=Sample\Org/CN\=User={http://www.globus.org/counter}query</screen> 
Note that white spaces and equal signs (=) need to be escaped with backslash (\)</para>
                </listitem>
                <listitem>
                  <simpara> This parses the configure file to determine if a specific user is allowed to access an operation.</simpara>
                </listitem>
              </itemizedlist>
            </entry>
          </row>
        </tbody>
      </tgroup>
    </table>
    <table id="t-authzframe-secdesc-saml-params">
      <title>SAML Callout PDP Parameters</title>
      <tgroup cols="2">
        <tbody>
          <row>
            <entry>
              <constant>&lt;prefix&gt;-authzService</constant>
            </entry>
            <entry>The URL of the authorization service.</entry>
          </row>
          <row>
            <entry>
              <constant>&lt;prefix&gt;-authzServiceIdentity</constant>
            </entry>
            <entry>The identity to use for authorizing the authorization service. If no identity was specified then the service is authorized using the identity associated with the entity performing the callout (self-authorization).</entry>
          </row>
          <row>
            <entry>
              <constant>&lt;prefix&gt;-authzServiceCertificateFile</constant>
            </entry>
            <entry>A filename identifying the certificate to use when encrypting messages and verifying responses signed at the SAML level. This is only required if using GSI Secure Message with privacy protection or if the user requested SAML signing.</entry>
          </row>
          <row>
            <entry>
              <constant>&lt;prefix&gt;-authzServiceCertificate</constant>
            </entry>
            <entry>This parameter is equivalent to the above, but can only be used programmatically. It must be set to a value of type <constant>java.security.cert.X509Certificate</constant>.</entry>
          </row>
          <row>
            <entry>
              <constant>&lt;prefix&gt;-securityMechanism</constant>
            </entry>
            <entry>The security mechanism to use. Recognized values are <constant>none</constant>, <constant>msg</constant> (GSI-Secure Message) and <constant>conv</constant> (GSI-Secure Conversation). 
              
              <glossterm linkend="transport-level-security">Transport security</glossterm> may be indicated by specifying a HTTPS URL in the <constant>&lt;prefix&gt;-authzService</constant> property. This property defaults to transport security if indicated by the URL and GSI-Secure Message otherwise.</entry>
          </row>
          <row>
            <entry>
              <constant>&lt;prefix&gt;-protectionLevel</constant>
            </entry>
            <entry>The protection level to use. Recognized values are <constant>sig</constant> (integrity protection) and <constant>enc</constant> (privacy and integrity protection). Defaults to <constant>sig</constant>.</entry>
          </row>
          <row>
            <entry>
              <constant>&lt;prefix&gt;-samlAuthzReqSigned</constant>
            </entry>
            <entry>Determines if the request is internally signed or not. SAML requests can include a signature in the request and response documents. This is separate from any security mechanism applied at either the SOAP or transport level. Recognized values are <constant>true</constant> and <constant>false</constant>. Defaults to <constant>false</constant>.</entry>
          </row>
          <row>
            <entry>
              <constant>&lt;prefix&gt;-samlAuthzSimpleDecision</constant>
            </entry>
            <entry>Determines whether to request a simple decision statement or not. More information on this setting can be found <ulink url="https://forge.gridforum.org/projects/ogsa-authz">here</ulink>. Recognized values are <constant>true</constant> and <constant>false</constant>. Defaults to <constant>true</constant>.</entry>
          </row>
        </tbody>
      </tgroup>
    </table>
    <para>Other than these, any custom authorization scheme could be
 configured with its own configuration information. Refer to <xref linkend="s-authzframe-secdesc-customAuthz"/>, for details on writing a custom
authorization mechanism.</para>
  </section>
  <section id="s-authzframe-secdesc-customAuthz">
    <title>Writing a custom authorization mechanism</title>
    <para>The authorization handler can be configured to call out to a custon PIP or PDP. The custom PDP class must implement the interface <constant>org.globus.wsrf.security.PDP</constant> and the custom PIP class must implement the interface <constant>org.globus.wsrf.security.PDP</constant>. </para>


    <para><emphasis>Example PIP: </emphasis> 
  </para>
    <screen>package org.foobar;

import ....;

public class FooPIP implements PIP
{

    public String CURRENT_TIME = "org.foobar.current.time";

    public void collectAttributes(Subject peerSubject,
			         MessageContext context,
	                         QName operation) throws AttributeException {

       // collect attributes, say attributes from certificate extension
       // store in message context with some property.
       // Example here stores current time.
       messageContext.setProperty(FooPIP.CURRENT_TIME, Calendar.getInstance());
    }

    public void initialize(PDPConfig config,
                           String name,
                           String id)
        throws InitializeException {

        /* Read the initialization information 
         */

    }

    public void close() throws CloseException {
        this. authorizedIdentity = null;
    }
}</screen>

    <para>To use the above PIP one would configure a service security descriptor with the following authorization settings:</para>
    <screen>&lt;securityConfig xmlns=&quot;http://www.globus.org&quot;&gt;
   ...
   &lt;authz value=&quot;foo1:org.foobar.FooPIP&quot;/&gt;
   ...
&lt;securityConfig/&gt;</screen>

    <para><emphasis>Example PDP: </emphasis> 
  </para>
    <screen>package org.foobar;

import ....;

public class FooPDP implements PDP
{
    private Principal authorizedIdentity;

    /* Not used by the current code */
    public String[] getPolicyNames() {
        return new String[0];
    }

    /* Not used by the current code */
    public Node getPolicy(Node query)
        throws InvalidPolicyException {
        return null;
    }

    /* Not used by the current code */
    public Node setPolicy(Node policy)
        throws InvalidPolicyException {
        return null;
    }

    public boolean isPermitted(Subject peerSubject,
                               MessageContext context,
                               QName operation)
        throws AuthorizationException {

        // The parameters set by FooPIP can be accessed here.
        Calendar currentTime = 
            (Calendar)context.getProperty(FooPIP.CURRENT_TIME);

        if (peerSubject == null) {
            return false;
        }

        Set peerPrincipals = peerSubject.getPrincipals();

        if ((peerPrincipals == null) || peerPrincipals.isEmpty()) {
            return false;
        }

        /* Check if the peer identity and the authorized
         * identity match
         */

        return peerPrincipals.contains(this.authorizedIdentity);
    }

    public void initialize(PDPConfig config,
                           String name,
                           String id)
        throws InitializeException {

        /* Read the initialization information from the service
         * specific WSDD parameter &lt;name&gt;-authorizedIdentity
         */

        this. authorizedIdentity =
            new GlobusPrincipal((String) config.getProperty(
                name, &quot;authorizedIdentity&quot;));
    }

    public void close() throws CloseException {
        this. authorizedIdentity = null;
    }
}</screen>
    <para>To use the above PDP one would configure a service security descriptor with the following authorization settings:</para>
    <screen>&lt;securityConfig xmlns=&quot;http://www.globus.org&quot;&gt;
   ...
   &lt;authz value=&quot;foo1:org.foobar.FooPDP&quot;/&gt;
   ...
&lt;securityConfig/&gt;</screen>
    <para>This security descriptor (identified as <filename>/.../foo-pdp-security-config.xml</filename> below) can then be used by a service. The association is created by adding a couple of parameters to the service&apos;s WSDD entry:</para>
    <screen>...
&lt;service name=&quot;MyDummyService&quot; 
             provider=&quot;Handler&quot; 
             style=&quot;document&quot;&gt;
   ...
   &lt;parameter name=&quot;securityDescriptor&quot; 
                     value=&quot;/.../foo-pdp-security-config.xml&quot;/&gt;
   &lt;parameter name=&quot;foo1-authorizedIdentity&quot; 
                     value=&quot;/DC=org/DC=doe/OU=People/CN=John D&quot;/&gt;
   ...
&lt;/service&gt;</screen>
    <para>Note that the parameter <parameter>foo1-authorizedIdentity</parameter> in the above configures the identity the PDP uses  for authorizing incoming requests. The parameter name is derived by composing the prefix (<parameter>foo1</parameter>) used when specifying the PDP in the security descriptor with the property  (<parameter>authorizedIdentity</parameter>) used in the PDP code.</para>
  </section>
</section>
<section id="s-authzfram-client-secdesc">
  <title>Writing client side security descriptors </title>

  <section id="s-authzfram-client-secdesc-cred">
  <title>Configuring credentials </title>
  <para> Client side credentials are configured similar to server side credentials as described in <xref linkend="s-authzframe-secdesc-configCred"/>.</para>
  </section>

  <section id="s-authzfram-client-secdesc-authz">
  <title>Configuring authorization mechanism </title>
  <para> The &lt;authz&gt; element is used to determine the mechanism to use to authorize the server that is being contacted. The following values are currently supported:
<informaltable>
  <tgroup cols="2">
  <tbody>
    <row>
      <entry><constant>none</constant></entry>
      <entry>No authorization is done.</entry>
    </row>
    <row>
      <entry><constant>self</constant></entry>
      <entry>Self authorization is done, i.e the server should be running with the same credentials as the client.</entry>
    </row>      
    <row>
      <entry><constant>host</constant></entry>
      <entry>Host authorization is done, i.e the server should be running with credentials that have the host name it is running on embedded in it.</entry>
    </row>
    <row>
      <entry><emphasis>any other string</emphasis></entry>
      <entry>Identity authorization is done using the value as the identity, i.e the server should be running with identity specified as value. </entry>
    </row>
  </tbody>
  </tgroup>
  </informaltable>
The following sample configures self authorization:
<screen>
  &lt;securityConfig xmlns=&quot;http://www.globus.org&quot;&gt;
     ...
     &lt;authz value=&quot;self&quot;/&gt;
     ...
  &lt;/securityConfig&gt;
</screen>
</para>

<note> <para>Custom client authorization schemes can be written and plugged in. But security descriptors cannot be used to configure such authorization schems. Refer to <xref linkend="s-authzframe-public-domain"/> for information on writing custom client-side authorization scheme. </para></note>

</section>
<section id="s-authzfram-client-secdesc-secConv">
  <title>Configuring GSI Secure Conversation </title>
  <para> The client can be configured to do GSI Secure Conversation using the element &lt;GSISecureConversation&gt;. The following subelements can be used to set various properties 
  <informaltable>
  <tgroup cols="2">
  <tbody>
    <row>
      <entry><constant>&lt;integrity&gt;</constant></entry>
      <entry>Sets protection level to signature.</entry>
    </row>
    <row>
      <entry><constant>&lt;privacy&gt;</constant></entry>
      <entry>Sets protection level to encryption (signature is also done).</entry>
    </row>      
    <row>
      <entry><constant>&lt;anonymous&gt;</constant></entry>
      <entry>Server is accessed as anonymous.</entry>
    </row>
    <row>
      <entry><constant>&lt;delegation value=&quot;</constant><emphasis>type of delegation</emphasis><constant>&quot;&gt;</constant></entry>
      <entry>Determines the type of delegation to be done. The value can be set to <constant>full</constant> or <constant>limited</constant>. If the <emphasis>delegation</emphasis> element is not used, no delegation is done.</entry>
    </row>
  </tbody>
  </tgroup>
  </informaltable>  
The following sample sets GSI Secure Conversation with privacy and full delegation:
<screen>
  &lt;securityConfig xmlns=&quot;http://www.globus.org&quot;&gt;
     ...
     &lt;GSISecureConversation&gt;
         &lt;privacy/&gt;
         &lt;delegation value=&quot;full&quot;/&gt;
     &lt;/GSISecureConversation&gt;
     ...
  &lt;/securityConfig&gt;
</screen>
</para>
 </section>
<section id="s-authzfram-client-secdesc-secMsg">
  <title>Configuring GSI Secure Message </title>
  <para> The client can be configured to do GSI Secure Message using the element &lt;GSISecureMessage&gt;. The following subelements can be used to set various properties: 
  <informaltable>
  <tgroup cols="2">
  <tbody>
    <row>
      <entry><constant>&lt;integrity&gt;</constant></entry>
      <entry>Sets protection level to signature </entry>
    </row>
    <row>
      <entry><constant>&lt;privacy&gt;</constant></entry>
      <entry>Sets protection level to encryption (signature is also done) </entry>
    </row>      
    <row>
      <entry><constant>&lt;peer-credentials value=&quot;</constant><emphasis>path to file with credentials to encrypt with</emphasis><constant>&quot;&gt;</constant></entry>
      <entry>Sets the path to the file containing the credential to use if privacy protection is chosen.</entry>
    </row>
  </tbody>
  </tgroup>
  </informaltable>  

The following sample sets GSI Secure Message with integrity:
<screen>
  &lt;securityConfig xmlns=&quot;http://www.globus.org&quot;&gt;
     ...
     &lt;GSISecureMessage&gt;
         &lt;integrity/&gt;
     &lt;/GSISecureMessage&gt;
     ...
  &lt;/securityConfig&gt;
</screen>
</para>
 </section>
</section>
<section id="s-authzfram-secdesc-descProgram">
  <title>Programmatic altering of security descriptors </title>
  <para>The security descriptor (container, security and resource) can be
    created and altered programmatically (as opposed to writing a
    security descriptor file). For the service and container
    descriptor, we recommend writing a security descriptor file so
    that the security properties are initialized at start up.</para>
  <table>
    <title>Descriptor classes</title>
    <tgroup cols="2">
      <tbody>
        <row>
          <entry>Container Security Descriptor</entry>
          <entry>
            <para>This is represented by <constant>org.globus.wsrf.impl.security.descriptor.ContainerSecurityDescriptor</constant>. </para>
            <para>If a container security descriptor file is configured as
          described in <xref linkend="s-authzframe-secdesc-configDesc"/>, then an
          object is created and stored. To alter the values, use the
          API provided in
          <constant>org.globus.wsrf.impl.security.descriptor.ContainerSecurityConfig</constant>.</para>
          </entry>
        </row>
        <row>
          <entry>Service Security Descriptor</entry>
          <entry>
            <para>This is represented by
      <constant>org.globus.wsrf.impl.security.descriptor.ServiceSecurityDescriptor</constant>. </para>
            <para>If a service security descriptor file is configured as
            described in <xref linkend="s-authzframe-secdesc-configDesc"/>, then an
            object is created and stored. To alter the values, use the
            API provided in
            <constant>org.globus.wsrf.impl.security.descriptor.ServiceSecurityConfig</constant>.</para>
          </entry>
        </row>
        <row>
          <entry>Resource Security Descriptor</entry>
          <entry>
            <para>This is represented by <constant>org.globus.wsrf.impl.security.descriptor.ResourceSecurityDescriptor</constant>. </para>
            <para>To initialize the descriptor, i.e. load credentials and gridmap, use
          the API in <constant>org.globus.wsrf.impl.security.descriptor.ResourceSecurityConfig</constant>.
          Refer to the description of resource security descriptors in <xref linkend="s-authzframe-secdesc-resDesc"/> for more details.</para>
          </entry>
        </row>
        <row>
          <entry>Client Security Descriptor</entry>
          <entry>
            <para>This is represented by <constant>org.globus.wsrf.impl.security.descriptor.ClientSecurityDescriptor</constant>. </para>
            <para>To initialize the descriptor, use
          the API in <constant>org.globus.wsrf.impl.security.descriptor.ClientSecurityConfig</constant>.</para>
          </entry>
        </row>
      </tbody>
    </tgroup>
  </table>
</section>
<section id="s-authzframe-secdesc-resDesc">
  <title>Resource security descriptors</title>
  <para>Resource level security can be set up using a resource security
descriptor.  A resource security descriptor overrides any service or container level
security settings. To make a resource secure, it needs to implement
<constant>org.globus.wsrf.impl.security.SecureResource</constant>.  This
interface has a method that returns an instance of
<constant>org.globus.wsrf.impl.security.descriptor.ResourceSecurityDescriptor</constant>. If
<constant>null</constant> is returned, it is assumed that no security is set
on the resource. </para>

  <para> Secure resources must implement org.globus.wsrf.security.SecureResource interface. 
  </para>

  <orderedlist>
  <listitem><para> A ResourceSecurityDescriptor object can be created and initialized in the resource's constructor. The object should be returned as a part of the getSecurityDescriptor method.
<screen>

    public MyDummyResource implements SecureResource {
    
       private ResourceSecurityDescriptor desc = null;

       public MyDummyResource() throws Exception {


            this.desc = new ResourceSecurityDescriptor();

          // set security properties on the above object using get/set methods
          // in the API
        }

        public ResourceSecurityDescriptor getSecurityDescriptor() {
            return this.desc;
        }
    }
</screen>
  </para>
  </listitem>

  <listitem><para> A ResourceSecurityDescriptor object can be created similar to above, but initialized from a file and set in the constructor.
<screen>
    public MyDummyResource implements SecureResource {
    
       private ResourceSecurityDescriptor desc = null;

           ResourceSecurityConfig securityConfig =
               new ResourceSecurityConfig(&quot;/path/to/security/file&quot;);
           try {
             securityConfig.init();
           } catch (ConfigException exp) {
              // handle exception 
           }
           this.desc = securityConfig.getSecurityDescriptor();
        }

        public ResourceSecurityDescriptor getSecurityDescriptor() {
            return this.desc;
        }
    }
</screen>
  </para>
  </listitem>
  </orderedlist>

  <para>The resource security descriptor is identical to the service
    security descriptor and exposes an API to set and get all properties
    that are described in <xref linkend="s-authzframe-server-secdesc-descFile"/>. A 
    resource security descriptor object can also be created by reading settings from a descriptor file. The file
    needs to be written as described in <xref linkend="s-authzframe-server-secdesc-descFile"/>.</para>
  <para><emphasis>Examples: </emphasis> 
  </para>
  <para>The following code snippet creates a resource descriptor object directly: 
  </para>
  <screen>ResourceSecurityDescriptor desc = new ResourceSecurityDescriptor();
desc.setRejectLimitedProxy(&quot;true&quot;);</screen>
  <para>The following code snippet creates a resource descriptor object
  from a file: </para>
  <screen>ResourceSecurityConfig config = new ResourceSecurityConfig(&quot;resDescFileName&quot;);
config.init();
ResourceSecurityDescriptor desc = config.getSecurityDescriptor();</screen>
  <para>There are two attributes of the security descriptor,
  <emphasis>credentials</emphasis> and <emphasis>gridmap</emphasis>, that can
  be specified as objects (<constant>javax.security.auth.Subject</constant> and
  <constant>org.globus.security.gridmap.GridMap</constant>, respectively) or as paths to
  credentials and the grid map file. Similarly, the <emphasis>service authorization chain</emphasis> object or a comma separated list of PDP
  names can be specified. In each of these cases, if the properties are
  configured as filenames or PDP names as the case may be, the helper API in
  <constant>org.globus.wsrf.impl.security.descriptor.ResourceSecurityConfig</constant>
  can be used to load the classes.  The credentials, grid map file and PDPs
  specified in the authorization chain are loaded if the property
  <constant>initialized</constant> in the descriptor is set to
  <constant>false</constant>.
  </para>
  <para>For example, the code snippet below  creates a descriptor that has a
    grid map file and an authorization chain. When
    <function>config.init()</function> is called, the grid map file is loaded and an
    instance of the service authorization chain class is created. The
    configuration information for the service
    authorization chain is by default picked up from the global deployment
    descriptor. To provide for other PDP configurations it needs to be
    set programmatically, as shown below.</para>
  <screen>ResourceSecurityDescriptor desc = new ResourceSecurityDescriptor();
desc.setGridMapFile(&quot;foo/bar/gridmap&quot;);
desc.setAuthz(&quot;customAuthz:org.globus.some.customAuthz foo1:org.foo.barAuthz&quot;);
ResourceSecurityConfig config = new ResourceSecurityConfig(desc);
config.init();</screen>
  <para>If the descriptor property changes, a reload can be forced by setting <constant>setInitialized</constant> to <constant>false</constant>:</para>
  <screen>desc.setInitialized(false); 
desc.setGridMapFile(&quot;foo/bar/newGridMap&quot;); 
config.init();</screen>
  <para>GridMap and Subject objects can also be set directly,
    i.e. without configuring files to be read:</para>
  <screen>desc.setInitialized(false);
GridMap map = new GridMap();
map.map(&quot;Some user DN&quot;, &quot;userid&quot;);
desc.setGridMap(map);</screen>
  <para id="programPDPConfig">Service Authorization can also be set directly
    by creating an object of  type <constant>org.globus.wsrf.impl.security.authorization.ServiceAuthorizationChain</constant>.
    The chain needs to be initialized with  one or more objects implementing the <constant>org.globus.wsrf.security.authorization.PDPConfig</constant> interface.
    The <constant>org.globus.wsrf.impl.security.descriptor.ResourceSecurityDescriptor</constant> class
    has an API to initialize a PDP using the PDPConfig class. The distribution
    has a few sample classes that implement the <constant>org.globus.wsrf.security.authorization.PDPConfig</constant> interface
    and are described below: 
  <itemizedlist>
      <listitem>
        <simpara><constant>org.globus.wsrf.impl.security.authorization.ContainerPDPConfig</constant>: Obtains configuration information from the global deployment descriptor.</simpara>
      </listitem>
      <listitem>
        <simpara><constant>org.globus.wsrf.impl.security.authorization.ServicePropertiesPDPConfig</constant>: Obtains configuration information from a service&apos;s deployment descriptor.</simpara>
      </listitem>
      <listitem>
        <simpara><constant>org.globus.wsrf.impl.security.authorization.ResourcePDPConfig</constant>: Obtains configuration information from a hashmap stored in memory.</simpara>
      </listitem>
    </itemizedlist>
</para>
  <para>Examples:</para>
  <para>This sample creates a authorization chain and sets it on the
resource security descriptor:</para>
  <screen>// Create a resource security descriptorResourceSecurityDescriptor
ResourceSecurityDescriptor desc = new ResourceSecurityDescriptor();
// Configure a chain of PDPsString
String authzChain = &quot;identityAuthz custom:org.something.CustomAuthz&quot;;
// Create configuration object that implements PDPConfig
ResourcePDPConfig config = new ResourcePDPConfig(authzChain);
// Set properties that are required by the PDPs on the configuration object.
// Property used by Identity authorization: scope, property name, property value
config.setProperty(&quot;idenAuthz&quot;, &quot;identity&quot;, &quot;O=this, OU=is expected, CN=identity&quot;);
// Property used by CustomAuthz: scope, property name, property value
config.setProperty(&quot;custom&quot;, &quot;someProp&quot;, &quot;foo&quot;);
desc.setAuthzChain(authzChain, config, &quot;Name of Chain&quot;, &quot;Some id&quot;);</screen>
</section>
<section id="s-authzframe-secdesc-container">
  <title>Container-only security configuration</title>
  <para>Other than the security properties that have been described in <ulink url="#Descriptor">Security Descriptor</ulink>, two more properties are exclusive
  to the container security descriptor.
</para>
  <itemizedlist>
    <listitem>
      <para>When <emphasis>GSI Secure Conversation</emphasis> is used, a security context is established.
    A sweeper task is run every 10 minutes to delete all expired contexts. This
    interval can be set (in milliseconds) in the container security descriptor
    as shown below:
    <screen>&lt;securityConfig xmlns=&quot;http://www.globus.org&quot;&gt;
   ... 
   &lt;context-timer-interval value=&quot;10000&quot;/&gt;
   ... 
&lt;/securityConfig&gt;</screen></para>
    </listitem>
    <listitem>
      <para>For message level security one may also set the amount of time for which to track received messages for the purpose of preventing replay attacks. Messages outside of this window will be rejected automatically, whereas messages within this window are checked against recently received messages through the use of the message UUID. This window can be configured (in milliseconds) as shown below:
  <screen>&lt;securityConfig xmlns=&quot;http://www.globus.org&quot;&gt;
   ... 
   &lt;replay-timer-interval value=&quot;100&quot;/&gt;
   ... 
&lt;/securityConfig&gt;</screen> </para>
    </listitem>
  </itemizedlist>
</section>
<section id="s-authzframe-secdesc-configOthers">
  <title>Other configuration</title>
  <para>The container security descriptor can be set up at the command line (rather than configured in the deployment descriptor as described <link linkend="s-authzframe-secdesc-configDesc">here</link>) by using the <emphasis>-containerDesc</emphasis> option when starting up the container using <emphasis>globus-start-container</emphasis>.<screen> bin\globus-start-container -containerDesc path/to/desc</screen></para>
</section>
