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}
 | |
| 
 |