| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685 |
- <?xml version='1.0'?>
- <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
- "http://www.oasis-open.org/docbookid/id/g/4.5/docbookx.dtd">
- <refentry id="module.auth"
- xmlns:serdoc="http://sip-router.org/xml/serdoc">
- <refmeta>
- <refentrytitle>auth</refentrytitle>
- <manvolnum>7</manvolnum>
- </refmeta>
- <refnamediv>
- <refname>auth</refname>
- <refpurpose>Basic Functionality for Digest Authentication</refpurpose>
- </refnamediv>
- <refsect1>
- <title>Description</title>
- <para>
- The <command>auth</command> SER module provides basic functionality
- for digest authentication. However, it does not provide access to
- the user information and therefore relies on another module. These
- modules are <serdoc:module>auth_db</serdoc:module>,
- <serdoc:module>auth_diameter</serdoc:module>,
- <serdoc:module>auth_identity</serdoc:module>, and
- <serdoc:module>auth_radius</serdoc:module>.
- </para>
- </refsect1>
- <refsect1>
- <title>Functions</title>
- <refsect2 xml:id="function.consume_credentials">
- <title>
- <function>consume_credentials</function> ()
- </title>
- <para>
- Allowed in request processing only.
- </para>
- <para>
- The <function>consume_credentials()</function> function
- removes previously authorized credentials from the request.
- This means that forwarded or relayed requests
- will not contain credentials that were checked by this server
- and ensures that the proxy will not reveal information about
- credentials used to downstream elements. In addition, the
- message will be shorter.
- </para>
- <para>
- The function must be called after a call to an authorization
- function such as
- <serdoc:func>www_authenticate</serdoc:func>.
- </para>
- </refsect2>
- </refsect1>
- <refsect1>
- <title>Module Parameters</title>
- <refsect2 xml:id="module.auth.auth_checks_in_dlg">
- <title><parameter>auth_checks_in_dlg</parameter></title>
- <serdoc:paraminfo>
- <serdoc:paramtype>integer</serdoc:paramtype>
- <serdoc:paramdefault>0</serdoc:paramdefault>
- </serdoc:paraminfo>
- <para>
- The <parameter>auth_checks_in_dlg</parameter> parameter controls
- which integrity checks are performed on requests within a dialog,
- ie., requests that carry a To tag. The default value of
- <literal>0</literal> turns off any checks. Otherwise, the value
- indicates which checks are run.
- </para>
- <para>
- See <serdoc:link linkend="module.auth.integrity_checks">Additional
- Integrity Checks</serdoc:link> below for more details.
- </para>
- </refsect2>
- <refsect2 xml:id="module.auth.auth_checks_no_dlg">
- <title><parameter>auth_checks_no_dlg</parameter></title>
- <serdoc:paraminfo>
- <serdoc:paramtype>integer</serdoc:paramtype>
- <serdoc:paramdefault>0</serdoc:paramdefault>
- </serdoc:paraminfo>
- <para>
- The <parameter>auth_checks_no_dlg</parameter> parameter controls
- which integrity checks are performed on out-of-dialog requests,
- ie., requests that do not carry a To tag. The default value of
- <literal>0</literal> turns off any checks. Otherwise, the value
- indicates which checks are run.
- </para>
- <para>
- See <serdoc:link linkend="module.auth.integrity_checks">Additional
- Integrity Checks</serdoc:link> below for more details.
- </para>
- </refsect2>
- <refsect2 xml:id="module.auth.auth_checks_register">
- <title><parameter>auth_checks_register</parameter></title>
- <serdoc:paraminfo>
- <serdoc:paramtype>integer</serdoc:paramtype>
- <serdoc:paramdefault>0</serdoc:paramdefault>
- </serdoc:paraminfo>
- <para>
- The <parameter>auth_checks_register</parameter> parameter
- controls which integrity checks are performed on a REGISTER
- message. If the parameter is changed from its default value
- of <literal>0</literal>, it activates those checks and defines,
- which checks are run.
- </para>
- <para>
- See <serdoc:link linkend="module.auth.integrity_checks">Additional
- Integrity Checks</serdoc:link> below for more details.
- </para>
- </refsect2>
- <refsect2 xml:id="module.auth.challenge_attr">
- <title><parameter>challenge_attr</parameter></title>
- <serdoc:paraminfo>
- <serdoc:paramtype>attriubte name</serdoc:paramtype>
- <serdoc:paramdefault>$digest_challenge</serdoc:paramdefault>
- </serdoc:paraminfo>
- <para>
- The <parameter>challenge_attr</parameter> parameter names the
- attribute which will contain the complete header field with the
- authentication challenge. The content if this attribute has to
- be added to the response in order to transmit the challenge
- to the client.
- </para>
- </refsect2>
- <refsect2 xml:id="module.auth.nc_array_order">
- <title><parameter>nc_array_order</parameter></title>
- <serdoc:paraminfo>
- <serdoc:paramtype>integer</serdoc:paramtype>
- <serdoc:paramdefault>20</serdoc:paramdefault>
- </serdoc:paraminfo>
- <para>
- The <parameter>nc_array_order</parameter> parameter is an
- alternative way to set the maximum number of nonces for the nonce
- check enabled by the
- <serdoc:modparam module="auth">nonce_count</serdoc:modparam>
- parameter. Its meaning is identical to that of the
- <serdoc:modparam module="auth">nc_array_size</serdoc:modparam>
- parameter but the size is given by stating the power of 2.
- See <serdoc:modparam module="auth">nc_array_size</serdoc:modparam>
- and <serdoc:modparam module="auth">nonce_count</serdoc:modparam>
- for more details.
- </para>
- </refsect2>
- <refsect2 xml:id="module.auth.nc_array_size">
- <title><parameter>nc_array_size</parameter></title>
- <serdoc:paraminfo>
- <serdoc:paramtype>integer</serdoc:paramtype>
- <serdoc:paramdefault>1048576</serdoc:paramdefault>
- </serdoc:paraminfo>
- <para>
- The <parameter>nc_array_size</parameter> parameter sets the
- maximum number of in-flight nonces for the nonce
- count check enabled by the
- <serdoc:modparam module="auth">nonce_count</serdoc:modparam>
- parameter. It represents the maximum number of nonces for which
- state will be kept. When this number is exceeded, state for older
- nonces will be discarded to make space for new ones. See
- <serdoc:modparam module="auth">nonce_count</serdoc:modparam> for
- more details.
- </para>
- <para>
- The value should be a power of 2. If it is not, it will be rounded
- down to such a number. For example a value of 1000000 will be
- rounded down to 524288. The
- <serdoc:modparam module="auth">nc_array_order</serdoc:modparam>
- parameter can be used to directly specify the power of 2. For
- instance, a value for
- <serdoc:modparam module="auth">nc_array_order</serdoc:modparam>
- of 20 is equivalent to a <parameter>nc_array_size</parameter>
- of 1048576.
- </para>
- <para>
- The memory used to keep the nonce state will be
- equal to the value of <parameter>nc_array_size</parameter> in
- bytes.
- </para>
- </refsect2>
- <refsect2 xml:id="module.auth.nid_pool_no">
- <title><parameter>nid_pool_no</parameter></title>
- <serdoc:paraminfo>
- <serdoc:paramtype>integer</serdoc:paramtype>
- <serdoc:paramdefault>1</serdoc:paramdefault>
- </serdoc:paraminfo>
- <para>
- The <parameter>nid_pool_no</parameter> parameter controls the number
- of partitions for the
- <serdoc:modparam module="auth">nonce_count</serdoc:modparam> and
- <serdoc:modparam module="auth">one_time_nonce</serdoc:modparam>
- arrays. It is common to both of them to reduce the nonce size.
- </para>
- <para>
- Instead of using single arrays for keeping nonce state, these arrays
- can be divided into several partitions. Each SER process is assigned
- to one of these partitions, allowing for higher concurrency on
- multi-CPU machines. Besides increasing performance, increasing
- <parameter>nid_pool_no</parameter> has also a negative effect: it
- could decrease the maximum supported in-flight nonces in certain
- conditions. In the worst case, when only one SER process receives
- most of the traffic (e.g. very busy TCP connection between two
- proxies), the in-flight nonces could be limited to the array size
- (<serdoc:modparam module="auth">nc_array_size</serdoc:modparam>
- for <serdoc:modparam module="auth">nonce_count</serdoc:modparam>
- and <serdoc:modparam module="auth">otn_in_flight_no</serdoc:modparam>
- for <serdoc:modparam module="auth">one_time_nonce</serdoc:modparam>)
- divided by the partitions number
- (<parameter>nid_pool_no</parameter>). However for normal traffic,
- where
- the process receiving a message is either random or chosen in a
- round-robin fashion, the maximum number of in-flight nonces will be
- influenced to a very small degree by
- <parameter>nid_pool_no</parameter>, since the messages
- will be close to equally distributed to processes using different
- partitions.
- </para>
- <para>
- The <parameter>nid_pool_no</parameter> value should be one of:
- 1, 2, 4, 8, 16, 32 or 64 (the maximum value is 64 and all values
- should be a power of 2 or else they will be rounded down to such
- a value).
- </para>
- </refsect2>
- <refsect2 xml:id="module.auth.nonce_auth_max_drift">
- <title><parameter>nonce_auth_max_drift</parameter></title>
- <serdoc:paraminfo>
- <serdoc:paramtype>integer</serdoc:paramtype>
- <serdoc:paramdefault>3</serdoc:paramdefault>
- </serdoc:paraminfo>
- <para>
- The <parameter>nonce_auth_max_drift</parameter> parameter
- specifies the maximum difference in seconds between a nonce
- creation time and the current time, if the nonce creation time
- appears to be in the future.
- </para>
- <para>
- In some cases, like shortly after a system time backward
- adjustment or when the current proxy is part of a cluster which is
- not time-synchronized, it's possible to receive a nonce with
- a creation time in the future. In this case if the difference is
- greater then the value of <parameter>nonce_auth_max_drift</parameter>
- in seconds, the nonce is considered stale and the request
- re-challenged. If this were not done, a dramatic time change
- backwards may lead to nonces having been generated before the
- cange being valid for too long.
- </para>
- </refsect2>
- <refsect2 xml:id="module.auth.nonce_count">
- <title><parameter>nonce_count</parameter></title>
- <serdoc:paraminfo>
- <serdoc:paramtype>boolean</serdoc:paramtype>
- <serdoc:paramdefault>no</serdoc:paramdefault>
- </serdoc:paraminfo>
- <para>
- The <parameter>nonce_count</parameter> parameter controls, whether
- tracking of nounce count is enabled. If it is set to
- <literal>yes</literal>, the received <parameter>nc</parameter> value
- is remembered and checked against the value used in the previous
- digest response. For a successful authentication the received
- <parameter>nc</parameter> must be greater then the previously
- received one (See RFC 2617 for more details). This will provide
- protection against replay attacks while still allowing credentials
- caching at the UA side.
- </para>
- <para>
- In order for this to work, the
- <serdoc:modparam module="auth">qop</serdoc:modparam> parameter
- must not be set to an empty string. It it is, the challenges won’t
- include the <parameter>qop</parameter> parameter and the user agent
- will probably not include the <parameter>qop</parameter> or
- <parameter>nc</parameter> parameters in its response.
- </para>
- <para>
- If a response doesn’t include <parameter>qop</parameter> or
- <parameter>nc</parameter> (for example obsolete UAs that don't
- support them) the response will be checked according to the other
- enabled nonce checks, in this order:
- <serdoc:modparam module="auth">one_time_nonce</serdoc:modparam> and
- the applicable of the additional integrity checks. If a response
- includes <parameter>nc</parameter> only the normal
- <serdoc:modparam module="auth">nonce_expire</serdoc:modparam>
- checks and the
- <serdoc:modparam module="auth">nonce_count</serdoc:modparam> checks
- will be performed, all the other checks will be ignored.
- </para>
- <para>
- The <parameter>nonce_count</parameter> checks work by tracking a
- limited number of nonces. The maximum number of tracked nonces is
- set using the
- <serdoc:modparam module="auth">nc_array_size</serdoc:modparam> or
- <serdoc:modparam module="auth">nc_array_order</serdoc:modparam>
- parameters. If this number is exceeded, older entries will be
- overwritten. As long as the maximum rate of challengeable messages
- per average response time is lower then
- <serdoc:modparam module="auth">nc_array_size</serdoc:modparam>,
- the nonce count check should work flawlessly. For optimal
- performance (maximum reuse of cache credentials)
- <serdoc:modparam module="auth">nc_array_size</serdoc:modparam>
- divided by
- <serdoc:modparam module="auth">nid_pool_no</serdoc:modparam>
- should be lower then the message rate multiplied by the desired
- <serdoc:modparam module="auth">nonce_expire</serdoc:modparam>.
- <!-- XXX: Give an example with default nonce_expire and typical
- RTT. -->
- </para>
- <para>
- The maximum accepted <parameter>nc</parameter> value is 255. If
- <parameter>nc</parameter> becomes greater then this, the nonce will
- be considered stale and the UA will be re-challenged.
- </para>
- <para>
- <emphasis>Note:</emphasis> If the <parameter>nonce_count</parameter>
- parameter is enabled, all challenges should be done in stateful
- mode, ie., a transaction should be created prior to the
- authentication check, for instance by using the function
- <serdoc:func>t_newtran</serdoc:func>, to absorb possible
- retransmissions. All the replies need to be sent statefuly,
- using <serdoc:func>t_reply()</serdoc:func>). Otherwise,
- all retransmissions will be challenged which may cause the user
- agent to believe the password supplied by the user to be wrong.
- </para>
- <para>
- For more information on stateful processing, see
- <serdoc:module>tm</serdoc:module>. An example on how to implement
- a stateful registrar can be found in
- <serdoc:module>registrar</serdoc:module>.
- </para>
- </refsect2>
- <refsect2 xml:id="module.auth.nonce_expire">
- <title><parameter>nonce_expire</parameter></title>
- <serdoc:paraminfo>
- <serdoc:paramtype>integer</serdoc:paramtype>
- <serdoc:paramdefault>300</serdoc:paramdefault>
- </serdoc:paraminfo>
- <para>
- The <parameter>nonce_exipre</parameter> parameter determines the
- time in seconds before a nonce is considered stale.
- </para>
- <para>
- Nonces have a limited lifetime after which they
- will be considered stale.
- This is to protect replay attacks. Credentials containing a stale
- nonce will be not authorized. The user agent will be challenged
- again instead. This new challenge will not only contain a newly
- generated nonce, but also the <parameter>stale</parameter>
- parameter which indicates to the client the failure was not due
- to a wrong username or password and it doesn't need to disturb
- the user asking for them. It can simply recalculate its answer
- using existing username and password.
- </para>
- </refsect2>
- <refsect2 xml:id="module.auth.one_time_nonce">
- <title><parameter>one_time_nonce</parameter></title>
- <serdoc:paraminfo>
- <serdoc:paramtype>boolean</serdoc:paramtype>
- <serdoc:paramdefault>no</serdoc:paramdefault>
- </serdoc:paraminfo>
- <para>
- The <parameter>one_time_nonce</parameter> controls whether digist
- responses with a reused nonce will be rejected. If it is set to
- <literal>yes</literal>, nonces cannot be reused by user agents.
- </para>
- <para>
- This results in each request being challenged. To avoid retransmits
- being challenged, it should only be used in stateful mode, ie., by
- creating a transaction before authentication, for instance trough
- a call to the <serdoc:func>t_newtran</serdoc:func> function. For
- more information on stateful mode see
- <serdoc:module>tm</serdoc:module>. An example on how to implement
- a stateful registrar can be found in
- <serdoc:module>registrar</serdoc:module>.
- </para>
- <para>
- The one time nonce provides enhanced replay protections at the cost
- of invalidating UA side credentials
- caching and causing extra round trips. Therefore, the nonce chount
- check enabled through the
- <serdoc:modparam module="auth">nonce_count</serdoc:modparam>
- parameter should be preferred.
- </para>
- <para>
- The one time nonce provides the same protection as the nonce count
- check but requiring more messages. The advantages are that it uses
- less memory for the same supported number of maximum in-flight
- nonces (by a factor of 8) and that it works
- with user agents that do not support <parameter>qop</parameter>
- and <parameter>nc</parameter>. It shoud thus be used if such
- user agents are in use and the checks described in section
- <serdoc:link linkend="module.auth.integrity_checks">Additional
- Integrity Checks</serdoc:link> are not deemed sufficient.
- </para>
- <para>
- Like the nonce count check, one time nonces works by tracking a
- limited number of nonces. The maximum number of tracked nonces is
- set using the
- <serdoc:modparam module="auth">otn_in_flight_no</serdoc:modparam>
- or
- <serdoc:modparam module="auth">otn_in_flight_order</serdoc:modparam>
- parameters. If this number is exceeded, older entries will be
- overwritten. As long as the maximum rate of challengeable messages
- per average response time is lower then
- <serdoc:modparam module="auth">otn_in_flight_no</serdoc:modparam>,
- the one time nonce check should work flawlessly.
- </para>
- </refsect2>
- <refsect2 xml:id="module.auth.otn_in_flight_no">
- <title><parameter>otn_in_flight_no</parameter></title>
- <serdoc:paraminfo>
- <serdoc:paramtype>integer</serdoc:paramtype>
- <serdoc:paramdefault>1048576</serdoc:paramdefault>
- </serdoc:paraminfo>
- <para>
- The <parameter>otn_in_flight_no</parameter> parameter specifies
- the maximum number of in-flight nonces for the one time nonce
- check enabled by the
- <serdoc:modparam module="auth">one_time_nonce</serdoc:modparam>
- parameter. It represents the maximum number of nonces remembered
- for the one time nonce check. When this number is exceeded,
- information about older nonces will be discarded and overwritten
- with information about newly generated nonces. See
- <serdoc:modparam module="auth">one_time_nonce</serdoc:modparam>
- for more details.
- </para>
- <para>
- The value should be a power of 2. If it is not, it will be rounded
- down to such a value. The
- <serdoc:modparam module="auth">otn_in_flight_order</serdoc:modparam>
- parameter can be used to directly specify the power of 2.
- </para>
- <para>
- The memory used to keep the nonce information will be identical to
- the value of <parameter>otn_in_flight_no</parameter> divided by 8
- since only 1 bit of state is kept per nonce.
- </para>
- </refsect2>
- <refsect2 xml:id="module.auth.otn_in_flight_order">
- <title><parameter>otn_in_flight_order</parameter></title>
- <serdoc:paraminfo>
- <serdoc:paramtype>integer</serdoc:paramtype>
- <serdoc:paramdefault>20</serdoc:paramdefault>
- </serdoc:paraminfo>
- <para>
- The <parameter>otn_in_flight_order</parameter> parameter is an
- alternative way to set the maximum number of nonces for the
- one time nonce check enabled by the
- <serdoc:modparam module="auth">one_time_nonce</serdoc:modparam>
- parameter. Its meaning is identical to that of the
- <serdoc:modparam module="auth">otn_in_flight_no</serdoc:modparam>
- parameter but the size is given by stating the power of 2.
- See <serdoc:modparam module="auth">otn_in_flight_no</serdoc:modparam>
- and <serdoc:modparam module="auth">one_time_nonce</serdoc:modparam>
- for more details.
- </para>
- </refsect2>
- <refsect2 xml:id="module.auth.protect_contacts">
- <title><parameter>protect_contacts</parameter></title>
- <serdoc:paraminfo>
- <serdoc:paramtype>boolean</serdoc:paramtype>
- <serdoc:paramdefault>no</serdoc:paramdefault>
- </serdoc:paraminfo>
- <para>
- If the <parameter>protect_contacts</parameter> parameter is set
- to <literal>yes</literal>, the contacts are included when creating
- a nonce.
- </para>
- <!-- XXX What does this exactly mean? -->
- </refsect2>
- <refsect2 xml:id="module.auth.proxy_challenge_header">
- <title><parameter>proxy_challenge_header</parameter></title>
- <serdoc:paraminfo>
- <serdoc:paramtype>string</serdoc:paramtype>
- <serdoc:paramdefault>"Proxy-Authenticate"</serdoc:paramdefault>
- </serdoc:paraminfo>
- <para>
- The <parameter>proxy_challenge_header</parameter> parameter
- contains the name of the header field that should be used to
- include the proxy-to-user challenge.
- </para>
- </refsect2>
- <refsect2 xml:id="module.auth.qop">
- <title><parameter>qop</parameter></title>
- <serdoc:paraminfo>
- <serdoc:paramtype>string</serdoc:paramtype>
- <serdoc:paramdefault>"auth"</serdoc:paramdefault>
- </serdoc:paraminfo>
- <para>
- The <parameter>qop</parameter> parameter determines, which value
- for the <parameter>qop</parameter> parameter should be included
- in a challenge. The parameter was optional in the SIP revision
- described by RFC 2543. The current version from RFC 3261 states,
- however, that the parameter must be included in all challenges.
- </para>
- <para>
- In digest authentication, the <parameter>qop</parameter>
- parameter, short for ‘quality of protection’, indicates which
- parts of a request should be used for the calculation of the
- digest response. If the value is <literal>auth</literal>,
- only authentication should be done and the response is solely
- calculated using information from the challenge plus the user’s
- password. A value of <literal>auth-int</literal> indicates that
- in addition the integrity of the request body is to be verified.
- For this purpose, a hash over the body is additionally included
- in the calculation.
- </para>
- <para>
- In a challenge the parameter indicates, which of these methods
- the server supports. This can either be one of them or both,
- separated by a comma. For challenges generated by SER, this
- is given by the <parameter>qop</parameter> module. It may also
- be an empty string, in which case no <parameter>qop</parameter>
- parameter will be present in challenges created by SER. This may
- be necessary for compatibility with some old clients but will
- make your SER not comply with RFC 3261.
- </para>
- <para>
- Protection against nonce replay attacks can be achieved by
- additionally enabling the
- <serdoc:modparam module="auth">nonce_count</serdoc:modparam>
- parameter. See there for more information.
- </para>
- </refsect2>
- <refsect2 xml:id="module.auth.secret">
- <title><parameter>secret</parameter></title>
- <serdoc:paraminfo>
- <serdoc:paramtype>string</serdoc:paramtype>
- <serdoc:paramdefault>random value</serdoc:paramdefault>
- </serdoc:paraminfo>
- <para>
- The <parameter>secret</parameter> parameter
- sets the secret used for the calculation of the nonce and for
- message integrity checks. If not set, a random secret will be
- chosen upon start.
- </para>
- </refsect2>
- <refsect2 xml:id="module.auth.www_challenge_header">
- <title><parameter>www_challenge_header</parameter></title>
- <serdoc:paraminfo>
- <serdoc:paramtype>string</serdoc:paramtype>
- <serdoc:paramdefault>"WWW-Authenticate</serdoc:paramdefault>
- </serdoc:paraminfo>
- <para>
- The <parameter>www_challenge_header</parameter> parameter
- contains the name of the header field that should be used to
- transmit a user-to-user challenge for authentication.
- </para>
- </refsect2>
- </refsect1>
- <refsect1 id="module.auth.integrity_checks">
- <title>Additional Integrity Checks</title>
- <para>
- The auth module can perform additional integrity checks on the
- authentication response inclued in a request by the client.
- </para>
- <para>
- Without the extra checks, the nonce value will be used only to
- store the expire time (see <parameter>nonce_expire</parameter>),
- plus an MD5 hash over it and some secret to prevent tampering
- with the expire time. With this arrangement, some replay attacks
- are still possible in the expire "window".
- </para>
- <para>
- A
- possible workaround is to always force qop authentification and
- always check the URI from the authorization header, but this does not
- work if an upstream proxy rewrites the URI and it will also not work
- with a lot of UA implementations.
- </para>
- <para>
- When the extra checks are enabled, the nonce will include and extra
- MD5 hash over some selected parts of the message and another secret.
- This will be used to check if these parts of the message are the same
- when a UA retries the request with the authentication response, thus
- protecting from replay attacks or at least severly limiting their
- possibility.
- </para>
- <para>
- Three module parameters control which parts of the message will be
- included for different types of requests. The parameter
- <parameter>auth_checks_register</parameter> sets them for REGISTER
- requests. The parameter <parameter>auth_checks_no_dlg</parameter>
- does the same for requests that to not have a
- <parameter>tag</parameter> parameter in the To header field or have
- no To header field altogether (in other words requests sent outside
- of an existing dialog). And, finally, the parameter
- <parameter>auth_checks_in_dlg</parameter> controls the checks for
- SIP requests sent within dialogs, such as BYEs or re-INVITEs.
- </para>
- <para>
- The default value for all three parameters is 0, in which case no
- extra checks are performed and the module behaves as it did before
- their introduction. Otherwise the parameter is a bit field. The
- message parts to be included in the check can be determined by adding
- any of the following values together:
- </para>
- <variablelist>
- <varlistentry>
- <term><literal>1</literal></term>
- <listitem>
- <para>
- check the full Request-URI,
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><literal>2</literal></term>
- <listitem>
- <para>
- check the Call-ID,
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><literal>4</literal></term>
- <listitem>
- <para>
- check the <parameter>tag</parameter> parameter of the From
- header field,
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><literal>9</literal></term>
- <listitem>
- <para>
- check the source IP address the request was received from.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- <para>
- For example, setting <parameter>auth_checks_register</parameter> to
- <literal>6</literal> would check if the Call-ID or the From tag
- have changed from the REGISTER message for which the nonce was
- generated. This allows nonce reuse only within the same UA and
- for the expire time. Note that enabling the extra checks will
- limit nonce caching by UAs, requiring extra challenges and
- round trips, but will provide much better protection.
- </para>
- <para>
- When the <parameter>secret</parameter> parameter is set and the
- extra checks are enabled, the first half of the secret will be used
- for the expire time hash and the other half for the hash on the
- extra checks, so make sure you have a long secret. At least 32
- characterss are recommended.
- </para>
- </refsect1>
- <refsect1>
- <title>See Also</title>
- <simplelist type="inline">
- <member><serdoc:sbin>ser</serdoc:sbin></member>
- <member><serdoc:file>ser.cfg</serdoc:file></member>
- <member><serdoc:module>auth_db</serdoc:module></member>
- <member><serdoc:module>auth_diameter</serdoc:module></member>
- <member><serdoc:module>auth_identity</serdoc:module></member>
- <member><serdoc:module>auth_radius</serdoc:module></member>
- </simplelist>
- </refsect1>
- </refentry>
- <!-- vim:sw=2 sta et sts=2 ai tw=76
- -->
|