Intrusion detection in Apigee hybrid - Part 2

This series of 3 articles - co-authored with my colleague Nicola Cardace @ncardace  - discusses the usage of an Intrusion Detection System (IDS) with the Apigee hybrid runtime and Google Cloud Monitoring and Logging.

This is the second article, discussing the installation of the Snort IDS. Please refer to Part 1 if you missed it!

Install Open Source IDS (Snort)

At this step, please connect to your IDS VM using ssh to proceed to the Snort installation.

Installation of Snort on Ubuntu

The following chapter details the installation of Snort on Ubuntu.

Installing from the source

sudo apt-get update -y
sudo apt install -y gcc libpcre3-dev zlib1g-dev libluajit-5.1-dev \
libpcap-dev openssl libssl-dev libnghttp2-dev libdumbnet-dev \
bison flex libdnet autoconf libtool
mkdir ~/snort_src && cd ~/snort_src

Snort 2.9 introduces the DAQ, or Data Acquisition library, for packet I/O. The DAQ replaces direct calls to libpcap functions with an abstraction layer that facilitates operation on a variety of hardware and software interfaces without requiring changes to Snort. It is possible to select the DAQ type and mode when invoking Snort to perform pcap readback or inline operation, etc.

wget https://www.snort.org/downloads/snort/daq-2.0.7.tar.gz
tar -xvzf daq-2.0.7.tar.gz
cd daq-2.0.7
autoreconf -f -i
./configure && make && sudo make install
cd ~/snort_src
wget https://www.snort.org/downloads/snort/snort-2.9.17.1.tar.gz
tar -xvzf snort-2.9.17.1.tar.gz
cd snort-2.9.17.1
./configure --enable-sourcefire && make && sudo make install

Configuring Snort to run in Network IDS (NIDS) mode

sudo ldconfig
sudo ln -s /usr/local/bin/snort /usr/sbin/snort

 Setting up username and folder structure

sudo groupadd snort
sudo useradd snort -r -s /sbin/nologin -c SNORT_IDS -g snort

sudo mkdir -p /etc/snort/rules
sudo mkdir /var/log/snort
sudo mkdir /usr/local/lib/snort_dynamicrules

sudo chmod -R 5775 /etc/snort
sudo chmod -R 5775 /var/log/snort
sudo chmod -R 5775 /usr/local/lib/snort_dynamicrules

sudo chown -R snort:snort /etc/snort
sudo chown -R snort:snort /var/log/snort
sudo chown -R snort:snort /usr/local/lib/snort_dynamicrules

sudo touch /etc/snort/rules/white_list.rules
sudo touch /etc/snort/rules/black_list.rules
sudo touch /etc/snort/rules/local.rules

sudo cp ~/snort_src/snort-2.9.17.1/etc/*.conf* /etc/snort
sudo cp ~/snort_src/snort-2.9.17.1/etc/*.map /etc/snort

 Add local rules:

sudo vi /etc/snort/rules/local.rules

 Here is an example of a local rule. Keep in mind that an alert rule is defined on one single line.

# $Id: local.rules,v 1.11 2004/07/23 20:15:44 bmc Exp $
# ----------------
# LOCAL RULES
# ----------------
# This file intentionally does not come with signatures.  Put your local
# additions here.

alert tcp $HOME_NET any -> [67.213.75.205] 443 (msg:"Feodo Tracker: potential Dridex CnC Traffic detected"; threshold: type limit, track by_src, seconds 60, count 1; classtype:trojan-activity; reference:url, feodotracker.abuse.ch/browse/host/67.213.75.205/; sid:900505001; rev:1;)

Above is an example of a snort rule (file: local.rules) that triggers an alert if the destination of a target endpoint or a service callout uses the suspicious IP address  67.213.75.205

It explicitly says that if a TCP connection is made from $HOME_NET (Apigee hybrid runtime pods) to 67.213.75.205 on port 443, an alert will be generated by the IDS (Snort)

The following threshold is also set on the local rule: 

threshold: type limit, track by_src, seconds 60, count 1;

It explicit mentions that a limit of 1 alert per minute (60 seconds) is generated per source IP (Apigee hybrid "runtime" pods).

Basics of Snort rules can be found here.

Snort Configuration 

At this step, we need to configure snort. For this, please edit the Snort configuration file:

sudo vi /etc/snort/snort.conf

Make sure that variables HOME_NET and EXTERNAL_NET are defined in snort.conf:

  • HOME_NET: is an array containing the IP ranges used by your Apigee hybrid runtime (ingress and Message Processor pods)
  • EXTERNAL_NET can be set to any

Here is a screenshot of a Snort configuration, providing an example on how these 2 variables can be set (cf. line 45 and 48):

joel_gauci_0-1627322303254.png

You also need to specify the custom local rules that you want to include in your Snort configuration.

For this, go to the "Step #7" of your Snort configuration file and include your local rules (file: local.rules), as shown on the following picture:

joel_gauci_0-1627369154382.png
Testing the Apigee hybrid & IDS solution

The Apigee hybrid and  IDS solution can be easily tested.

For this you can create a an API proxy that contains a service callout policy or a target endpoint. In this case, the URL of the service callout (or target endpoint) uses a hostname or IP address that is considered as a security sensitive destination.

As an example, identify IP addresses of httpbin.org or example.com. We will consider these IP addresses as suspicious destinations.

Modify the local.rules file in order to integrate these IP addresses.

Here is an example:

alert tcp $HOME_NET any -> [18.235.124.214] 443 (msg:"Testing a simple Snort rule"; threshold: type limit, track by_src, seconds 60, count 1; classtype:trojan-activity; sid:000000001; rev:1;)
alert tcp $HOME_NET any -> [52.201.75.114] 443 (msg:"Testing a simple Snort rule"; threshold: type limit, track by_src, seconds 60, count 1; classtype:trojan-activity; sid:000000002; rev:1;)

NB: in this example, 18.235.124.214 and 52.201.75.114 are IP addresses of httpbin.org (there may be some others...)

From now on, each time one of these 2 IP addresses will be used as a target destination on an Apigee hybrid runtime, an alert will be triggered by Snort. Let's test it!

API Proxy Configuration

We just create here a simple API Proxy in pass-through mode. The target endpoint of this API proxy is:

https://httpbin.org/get 
Remember that in our test we consider httpbin.org as a suspicious destination...
joel_gauci_0-1627385405622.png
Verify the target endpoint, as shown on the following picture:
joel_gauci_0-1627386541694.png

Starting Snort

You can start your Snort IDS in console mode, using the following command:

sudo snort -A console -i ens4 -u snort -g snort -c /etc/snort/snort.conf

The output of the command is provided on the following picture:

joel_gauci_1-1627385873816.png

At this step, all the API traffic of the Apigee hybrid runtime is mirrored to the Snort IDS Virtual Machine (VM) and scanned by Snort from the ens4 interface...Please refer to Part 1 in case you want to learn and discover the implementation details of the solution.

Let's call the "simple API", using the following cURL command:

export RUNTIME_IP=<YOUR_APIGEE_HYBRID_RUNTIME_INGRESS_IP>
export RUNTIME_HOST_ALIAS=<YOUR_APIGEE_HYBRID_RUNTIME_HOST_ALIAS>
curl -k https://$RUNTIME_HOST_ALIAS/simple/v1 -i --resolve "$RUNTIME_HOST_ALIAS:443:$RUNTIME_IP"

You should receive an HTTP 200 response, as the following one:

HTTP/2 200 
date: Tue, 27 Jul 2021 11:44:21 GMT
...
{
"args": {},
"headers": {
"Accept": "*/*",
"Host": "httpbin.org",
...
}

On the Snort IDS console, you should see a message like this one:

07/27-11:44:21.479674 [**] [1:2:1] Testing a simple Snort rule [**] [Classification: A Network Trojan was detected] [Priority: 1] {TCP} 10.130.0.3:55202 -> 52.201.75.114:443

You can see that the suspicious call has been detected by Snort, which has triggered an alert we can see in the console.

In the next article of the series, we install a logging agent (fluentd) on the IDS Virtual Machine (VM) in order to push logs from the IDS VM to Cloud Logging.

Finally, we create an alerting policy on Google Cloud Monitoring in order to see alerts directly on the Google Cloud console.

 

Contributors
Comments
thiagoscodeler
Bronze 4
Bronze 4

@joel_gauci Can you please share the link for part 3?

Version history
Last update:
‎07-27-2021 04:54 AM
Updated by: