mirror of https://github.com/asterisk/asterisk
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
251 lines
8.6 KiB
251 lines
8.6 KiB
\section{Introduction}
|
|
|
|
Attacks on Voice over IP networks are becoming increasingly more common. It
|
|
has become clear that we must do something within Asterisk to help mitigate
|
|
these attacks.
|
|
|
|
Through a number of discussions with groups of developers in the Asterisk
|
|
community, the general consensus is that the best thing that we can do within
|
|
Asterisk is to build a framework which recognizes and reports events that could
|
|
potentially have security implications. Each channel driver has a different
|
|
concept of what is an "event", and then each administrator has different
|
|
thresholds of what is a "bad" event and what is a restorative event. The
|
|
process of acting upon this information is left to an external program to
|
|
correlate and then take action - block traffic, modify dialing rules, etc. It
|
|
was decided that embedding actions inside of Asterisk was inappropriate, as the
|
|
complexity of construction of such rule sets is difficult and there was no
|
|
agreement on where rules should be enabled or how they should be processed. The
|
|
addition of a major section of code to handle rule expiration and severity
|
|
interpretation was significant. As a final determining factor, there are
|
|
external programs and services which already parse log files and act in concert
|
|
with packet filters or external devices to protect or alter network security
|
|
models for IP connected hosts.
|
|
|
|
\section{Framework Overview}
|
|
|
|
This section discusses the architecture of the Asterisk modifications being
|
|
proposed.
|
|
|
|
There are two main components that we propose for the initial
|
|
implementation of the security framework:
|
|
|
|
\begin{itemize}
|
|
\item Security Event Generation
|
|
\item Security Event Logger
|
|
\end{itemize}
|
|
|
|
\subsection{Security Event Generation}
|
|
|
|
The ast\_event API is used for the generation of security events. That
|
|
way, the events are in an easily interpretable format within Asterisk to
|
|
make it easy to write modules that do things with them. There are also some
|
|
helper data structures and functions to aid Asterisk modules in reporting these
|
|
security events with the proper contents.
|
|
|
|
The next section of this document contains the current list of security events
|
|
being proposed. Each security event type has some required pieces of
|
|
information and some other optional pieces of information.
|
|
|
|
Subscribing to security events from within Asterisk can be done by
|
|
subscribing to events of type AST\_EVENT\_SECURITY. These events have an
|
|
information element, AST\_EVENT\_IE\_SECURITY\_EVENT, which identifies the security
|
|
event sub-type (from the list described in the next section). The result of the
|
|
information elements in the events contain the required and optional meta data
|
|
associated with the event sub-type.
|
|
|
|
\subsection{Security Event Logger}
|
|
|
|
In addition to the infrastructure for generating the events, one module that
|
|
is a consumer of these events has been implemented.
|
|
|
|
Asterisk trunk was recently updated to include support for dynamic logger
|
|
levels. This module takes advantage of this functionality to create a
|
|
custom "security" logger level. Then, when this module is in use, logger.conf
|
|
can be configured to put security events into a file:
|
|
|
|
\begin{verbatim}
|
|
security_log => security
|
|
\end{verbatim}
|
|
|
|
The content of this file is a well defined and easily interpretable
|
|
format for external scripts to read and act upon. The definition for the format
|
|
of the log file is described later in this chapter.
|
|
|
|
\section{Events to Log}
|
|
|
|
\begin{verbatim}
|
|
(-) required
|
|
(+) optional
|
|
|
|
Invalid Account ID
|
|
(-) Local address family/IP address/port/transport
|
|
(-) Remote address family/IP address/port/transport
|
|
(-) Service (SIP, AMI, IAX2, ...)
|
|
(-) System Name
|
|
(+) Module
|
|
(+) Account ID (username, etc)
|
|
(+) Session ID (CallID, etc)
|
|
(+) Session timestamp (required if Session ID present)
|
|
(-) Event timestamp (sub-second precision)
|
|
|
|
Failed ACL match
|
|
-> everything from invalid account ID
|
|
(+) Name of ACL (when we have named ACLs)
|
|
|
|
Invalid Challenge/Response
|
|
-> everything from invalid account ID
|
|
(-) Challenge
|
|
(-) Response
|
|
(-) Expected Response
|
|
|
|
Invalid Password
|
|
-> everything from invalid account ID
|
|
|
|
Successful Authentication
|
|
-> informational event
|
|
-> everything from invalid account ID
|
|
|
|
Invalid formatting of Request
|
|
-> everything from invalid account ID
|
|
-> account ID optional
|
|
(-) Request Type
|
|
(+) Request parameters
|
|
|
|
Session Limit Reached (such as a call limit)
|
|
-> everything from invalid account ID
|
|
|
|
Memory Limit Reached
|
|
-> everything from invalid account ID
|
|
|
|
Maximum Load Average Reached
|
|
-> everything from invalid account ID
|
|
|
|
Request Not Allowed
|
|
-> everything from invalid account ID
|
|
(-) Request Type
|
|
(+) Request parameters
|
|
|
|
Request Not Supported
|
|
-> everything from invalid account ID
|
|
(-) Request Type
|
|
|
|
Authentication Method Not Allowed
|
|
-> everything from invalid account ID
|
|
(-) Authentication Method attempted
|
|
|
|
In dialog message from unexpected host
|
|
-> everything from invalid account ID
|
|
(-) expected host
|
|
\end{verbatim}
|
|
|
|
\section{Security Log File Format}
|
|
|
|
The beginning of each line in the log file is the same as it is for other
|
|
logger levels within Asterisk.
|
|
|
|
\begin{verbatim}
|
|
[Feb 11 07:57:03] SECURITY[23736] res_security_log.c: <...>
|
|
\end{verbatim}
|
|
|
|
The part of the log entry identified by $<$...$>$ is where the security event
|
|
content resides. The security event content is a comma separated list
|
|
of key value pairs. The key is the information element type, and the value is a
|
|
quoted string that contains the associated meta data for that information
|
|
element. Any embedded quotes within the content are escaped with a
|
|
backslash.
|
|
|
|
\begin{verbatim}
|
|
INFORMATION_ELEMENT_1="IE1 content",INFORMATION_ELEMENT_2="IE2 content"
|
|
\end{verbatim}
|
|
|
|
The following table includes potential information elements and what the
|
|
associated content looks like:
|
|
|
|
\begin{verbatim}
|
|
IE: SecurityEvent
|
|
Content: This is the security event sub-type.
|
|
Values: FailedACL, InvalidAccountID, SessionLimit, MemoryLimit, LoadAverageLimit,
|
|
RequestNotSupported, RequestNotAllowed, AuthMethodNotAllowed,
|
|
ReqBadFormat, UnexpectedAddress, ChallengeResponseFailed,
|
|
InvalidPassword
|
|
|
|
IE: EventVersion
|
|
Content: This is a numeric value that indicates when updates are made to the
|
|
content of the event.
|
|
Values: Monotonically increasing integer, starting at 1
|
|
|
|
IE: Service
|
|
Content: This is the Asterisk service that generated the event.
|
|
Values: TEST, SIP, AMI
|
|
|
|
IE: Module
|
|
Content: This is the Asterisk module that generated the event.
|
|
Values: chan_sip
|
|
|
|
IE: AccountID
|
|
Content: This is a string used to identify the account associated with the
|
|
event. In most cases, this would be a username.
|
|
|
|
IE: SessionID
|
|
Content: This is a string used to identify the session associated with the
|
|
event. The format of the session identifier is specific to the
|
|
service. In the case of SIP, this would be the Call-ID.
|
|
|
|
IE: SessionTV
|
|
Content: The time that the session associated with the SessionID started.
|
|
Values: <seconds>-<microseconds> since epoch
|
|
|
|
IE: ACLName
|
|
Content: This is a string that identifies which named ACL is associated with
|
|
this event.
|
|
|
|
IE: LocalAddress
|
|
Content: This is the local address that was contacted for the related event.
|
|
Values: <Address Family>/<Transport>/<Address>/<Port>
|
|
Examples:
|
|
-> IPV4/UDP/192.168.1.1/5060
|
|
-> IPV4/TCP/192.168.1.1/5038
|
|
|
|
IE: RemoteAddress
|
|
Content: This is the remote address associated with the event.
|
|
Examples:
|
|
-> IPV4/UDP/192.168.1.2/5060
|
|
-> IPV4/TCP/192.168.1.2/5038
|
|
|
|
IE: ExpectedAddress
|
|
Content: This is the address that was expected to be the remote address.
|
|
Examples:
|
|
-> IPV4/UDP/192.168.1.2/5060
|
|
-> IPV4/TCP/192.168.1.2/5038
|
|
|
|
IE: EventTV
|
|
Content: This is the timestamp of when the event occurred.
|
|
Values: <seconds>-<microseconds> since epoch
|
|
|
|
IE: RequestType
|
|
Content: This is a service specific string that represents the invalid request
|
|
|
|
IE: RequestParams
|
|
Content: This is a service specific string that represents relevant parameters
|
|
given with a request that was considered invalid.
|
|
|
|
IE: AuthMethod
|
|
Content: This is a service specific string that represents an authentication
|
|
method that was used or requested.
|
|
|
|
IE: Challenge
|
|
Content: This is a service specific string that represents the challenge
|
|
provided to a user attempting challenge/response authentication.
|
|
|
|
IE: Response
|
|
Content: This is a service specific string that represents the response
|
|
received from a user attempting challenge/response authentication.
|
|
|
|
IE: ExpectedResponse
|
|
Content: This is a service specific string that represents the response
|
|
that was expected to be received from a user attempting
|
|
challenge/response authentication.
|
|
|
|
\end{verbatim}
|
|
|