diff options
Diffstat (limited to 'samples')
27 files changed, 854 insertions, 13 deletions
diff --git a/samples/scenarios/clearwater_ims/clt-docker/Dockerfile b/samples/scenarios/clearwater_ims/clt-docker/Dockerfile new file mode 100644 index 0000000..1047521 --- /dev/null +++ b/samples/scenarios/clearwater_ims/clt-docker/Dockerfile @@ -0,0 +1,22 @@ +From ubuntu:16.04 +MAINTAINER Salman Shaikh (muhammad.shaikh@huawei.com) +RUN apt-get update && apt-get -y upgrade +RUN apt-get install -y build-essential bundler git +RUN apt-get install -y curl +#RUN apt-get remove -y ruby +RUN gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 +RUN curl -L https://get.rvm.io | bash -s stable +#RUN /bin/bash -c "source /usr/local/rvm/scripts/rvm" +RUN /bin/bash -c "source /etc/profile.d/rvm.sh \ + && rvm autolibs enable \ + && rvm install 1.9.3 \ + && rvm use 1.9.3" +#RUN mkdir -p /root/.ssh +#ADD id_rsa /root/.ssh/id_rsa +#RUN chmod 700 /root/.ssh/id_rsa +ADD clearwater-live-test.tgz /opt/ +RUN /bin/bash -c "source /etc/profile.d/rvm.sh \ + && cd /opt/clearwater-live-test \ + && bundle install" +SHELL ["/bin/bash", "-c", "source /etc/profile.d/rvm.sh"] +#CMD /bin/bash -c "source /etc/profile.d/rvm.sh" diff --git a/samples/scenarios/clearwater_ims/clt-docker/clearwater-live-test.tgz b/samples/scenarios/clearwater_ims/clt-docker/clearwater-live-test.tgz Binary files differnew file mode 100644 index 0000000..9bcb417 --- /dev/null +++ b/samples/scenarios/clearwater_ims/clt-docker/clearwater-live-test.tgz diff --git a/samples/scenarios/clearwater_ims/scripts/prov-numbers.sh b/samples/scenarios/clearwater_ims/scripts/prov-numbers.sh new file mode 100755 index 0000000..a73527a --- /dev/null +++ b/samples/scenarios/clearwater_ims/scripts/prov-numbers.sh @@ -0,0 +1 @@ +kubectl exec -it $(kubectl get pods -l=service=ellis -o jsonpath='{.items[0].metadata.name}') -c ellis -- bash -c "sudo bash -c \"export PATH=/usr/share/clearwater/ellis/env/bin:$PATH ; cd /usr/share/clearwater/ellis/src/metaswitch/ellis/tools/ ; python create_numbers.py --start 6505550000 --count 10\"" diff --git a/samples/scenarios/clearwater_ims/scripts/run-live-test.sh b/samples/scenarios/clearwater_ims/scripts/run-live-test.sh new file mode 100755 index 0000000..6fb0a50 --- /dev/null +++ b/samples/scenarios/clearwater_ims/scripts/run-live-test.sh @@ -0,0 +1,40 @@ +#!/bin/bash + +TITLE="System Information for $HOSTNAME" +RIGHT_NOW=$(date +"%x %r %Z") +TIME_STAMP="Updated on $RIGHT_NOW by $USER" + +BONO_SIP_PROXY_IP=$1 +ELLIS_IP=$2 +BASIC=$3 + +para1=0 +para2=0 +if [[ -n "$BONO_SIP_PROXY_IP" ]];then + para1=1 +else + echo "ERROR: Missing External Loadbalancer IP for Bono" +fi +if [[ -n "$ELLIS_IP" ]];then + para2=1 +else + echo "ERROR: Missing External Loadbalancer IP for Ellis" +fi + +if [ "$para1" -eq "0" ];then + echo "";echo "USAGE: $0 <BONO_SIP_PROXY_IP> <ELLIS_IP>";echo "" + exit +fi +if [ "$para2" -eq "0" ];then + echo "";echo "USAGE: $0 <BONO_SIP_PROXY_IP> <ELLIS_IP>";echo "" + exit +fi + + +if [[ $para1 == 1 && $para2 == 1 ]];then + if [ "$BASIC" == "basic" ];then + docker exec -it live-test bash -c "source /etc/profile.d/rvm.sh && cd /opt/clearwater-live-test && rake test[default.svc.cluster.local] PROXY=$BONO_SIP_PROXY_IP ELLIS=$ELLIS_IP SIGNUP_CODE=\"secret\" TESTS=\"Basic Call - Mainline\"" + else + docker exec -it live-test bash -c "source /etc/profile.d/rvm.sh && cd /opt/clearwater-live-test && rake test[default.svc.cluster.local] PROXY=$BONO_SIP_PROXY_IP ELLIS=$ELLIS_IP SIGNUP_CODE=\"secret\"" + fi +fi diff --git a/samples/scenarios/clearwater_ims/yaml/ellis-depl.yaml b/samples/scenarios/clearwater_ims/yaml/ellis-depl.yaml new file mode 100644 index 0000000..7cbaf1d --- /dev/null +++ b/samples/scenarios/clearwater_ims/yaml/ellis-depl.yaml @@ -0,0 +1,40 @@ +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: ellis + labels: + app: ellis +spec: + replicas: 1 + template: + metadata: + labels: + app: ellis + service: ellis + spec: + containers: + #- image: "localhost:5000/ellis:clearwater/base:latest" + - image: "instance-1:5000/clearwater/ellis:latest" + imagePullPolicy: Always + name: ellis + ports: + - containerPort: 22 + - containerPort: 80 + envFrom: + - configMapRef: + name: env-vars + env: + - name: MY_POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: PUBLIC_IP + value: <External Load Balancer IP> + livenessProbe: + tcpSocket: + port: 80 + initialDelaySeconds: 30 + readinessProbe: + tcpSocket: + port: 80 + restartPolicy: Always diff --git a/samples/scenarios/clearwater_ims/yaml/ellis-svc.yaml b/samples/scenarios/clearwater_ims/yaml/ellis-svc.yaml new file mode 100644 index 0000000..da65bd0 --- /dev/null +++ b/samples/scenarios/clearwater_ims/yaml/ellis-svc.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Service +metadata: + name: ellis + labels: + app: ellis +spec: + #clusterIP: None + type: "LoadBalancer" + loadBalancerIP: <External Load Balancer IP> + ports: + - name: "http" + port: 80 + selector: + app: ellis + service: ellis diff --git a/samples/scenarios/clearwater_ims/yaml/homer-depl.yaml b/samples/scenarios/clearwater_ims/yaml/homer-depl.yaml new file mode 100644 index 0000000..d753241 --- /dev/null +++ b/samples/scenarios/clearwater_ims/yaml/homer-depl.yaml @@ -0,0 +1,38 @@ +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: homer + labels: + app: homer +spec: + replicas: 1 + template: + metadata: + labels: + app: homer + service: homer + spec: + containers: + #- image: "localhost:5000/homer:clearwater/base:latest" + - image: "instance-1:5000/clearwater/homer:latest" + imagePullPolicy: Always + name: homer + ports: + - containerPort: 22 + - containerPort: 7888 + envFrom: + - configMapRef: + name: env-vars + env: + - name: MY_POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + livenessProbe: + tcpSocket: + port: 7888 + initialDelaySeconds: 30 + readinessProbe: + tcpSocket: + port: 7888 + restartPolicy: Always diff --git a/samples/scenarios/clearwater_ims/yaml/homer-svc.yaml b/samples/scenarios/clearwater_ims/yaml/homer-svc.yaml new file mode 100644 index 0000000..4329843 --- /dev/null +++ b/samples/scenarios/clearwater_ims/yaml/homer-svc.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: Service +metadata: + name: homer + labels: + app: homer +spec: + ports: + - name: "7888" + port: 7888 + selector: + app: homer + service: homer + clusterIP: None diff --git a/samples/scenarios/clearwater_ims/yaml/homestead-depl.yaml b/samples/scenarios/clearwater_ims/yaml/homestead-depl.yaml new file mode 100644 index 0000000..c30bac0 --- /dev/null +++ b/samples/scenarios/clearwater_ims/yaml/homestead-depl.yaml @@ -0,0 +1,54 @@ +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: homestead + labels: + app: homestead +spec: + replicas: 1 + selector: + matchLabels: + service: homestead + template: + metadata: + labels: + app: homestead + service: homestead + snmp: enabled + spec: + containers: + #- image: "localhost:5000/homestead:clearwater/base:latest" + - image: "instance-1:5000/clearwater/homestead:latest" + imagePullPolicy: Always + name: homestead + ports: + - containerPort: 22 + - containerPort: 8888 + envFrom: + - configMapRef: + name: env-vars + env: + - name: MY_POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + livenessProbe: + exec: + command: ["/bin/bash", "/usr/share/kubernetes/liveness.sh", "8888"] + initialDelaySeconds: 60 + readinessProbe: + exec: + command: ["/bin/bash", "/usr/share/kubernetes/liveness.sh", "8888"] + volumeMounts: + - name: homesteadlogs + mountPath: /var/log/homestead + - image: busybox + name: tailer + command: [ "tail", "-F", "/var/log/homestead/homestead_current.txt" ] + volumeMounts: + - name: homesteadlogs + mountPath: /var/log/homestead + volumes: + - name: homesteadlogs + emptyDir: {} + restartPolicy: Always diff --git a/samples/scenarios/clearwater_ims/yaml/homestead-prov-depl.yaml b/samples/scenarios/clearwater_ims/yaml/homestead-prov-depl.yaml new file mode 100644 index 0000000..18b47ea --- /dev/null +++ b/samples/scenarios/clearwater_ims/yaml/homestead-prov-depl.yaml @@ -0,0 +1,42 @@ +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: homestead-prov + labels: + app: homestead-prov +spec: + replicas: 1 + selector: + matchLabels: + service: homestead-prov + template: + metadata: + labels: + app: homestead-prov + service: homestead-prov + snmp: enabled + spec: + containers: + #- image: "localhost:5000/homestead-prov:clearwater/base:latest" + - image: "instance-1:5000/clearwater/homestead-prov:latest" + imagePullPolicy: Always + name: homestead-prov + ports: + - containerPort: 22 + - containerPort: 8889 + envFrom: + - configMapRef: + name: env-vars + env: + - name: MY_POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + livenessProbe: + exec: + command: ["/bin/bash", "/usr/share/clearwater/bin/poll_homestead-prov.sh"] + initialDelaySeconds: 60 + readinessProbe: + exec: + command: ["/bin/bash", "/usr/share/clearwater/bin/poll_homestead-prov.sh"] + restartPolicy: Always diff --git a/samples/scenarios/clearwater_ims/yaml/homestead-prov-svc.yaml b/samples/scenarios/clearwater_ims/yaml/homestead-prov-svc.yaml new file mode 100644 index 0000000..66b6358 --- /dev/null +++ b/samples/scenarios/clearwater_ims/yaml/homestead-prov-svc.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: Service +metadata: + name: homestead-prov + labels: + app: homestead-prov +spec: + ports: + - name: "8889" + port: 8889 + selector: + app: homestead-prov + service: homestead-prov + clusterIP: None diff --git a/samples/scenarios/clearwater_ims/yaml/homestead-svc.yaml b/samples/scenarios/clearwater_ims/yaml/homestead-svc.yaml new file mode 100644 index 0000000..99c1942 --- /dev/null +++ b/samples/scenarios/clearwater_ims/yaml/homestead-svc.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: Service +metadata: + name: homestead + labels: + app: homestead +spec: + ports: + - name: "8888" + port: 8888 + selector: + app: homestead + service: homestead + clusterIP: None diff --git a/samples/scenarios/clearwater_ims/yaml/ralf-depl.yaml b/samples/scenarios/clearwater_ims/yaml/ralf-depl.yaml new file mode 100644 index 0000000..da6df5f --- /dev/null +++ b/samples/scenarios/clearwater_ims/yaml/ralf-depl.yaml @@ -0,0 +1,54 @@ +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: ralf + labels: + app: ralf +spec: + replicas: 1 + selector: + matchLabels: + service: ralf + template: + metadata: + labels: + app: ralf + service: ralf + snmp: enabled + spec: + containers: + #- image: "localhost:5000/ralf:clearwater/base:latest" + - image: "instance-1:5000/clearwater/ralf:latest" + imagePullPolicy: Always + name: ralf + ports: + - containerPort: 22 + - containerPort: 10888 + envFrom: + - configMapRef: + name: env-vars + env: + - name: MY_POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + livenessProbe: + tcpSocket: + port: 10888 + initialDelaySeconds: 30 + readinessProbe: + tcpSocket: + port: 10888 + volumeMounts: + - name: ralflogs + mountPath: /var/log/ralf + - image: busybox + name: tailer + command: [ "tail", "-F", "/var/log/ralf/ralf_current.txt" ] + volumeMounts: + - name: ralflogs + mountPath: /var/log/ralf + volumes: + - name: ralflogs + emptyDir: {} + restartPolicy: Always diff --git a/samples/scenarios/clearwater_ims/yaml/ralf-svc.yaml b/samples/scenarios/clearwater_ims/yaml/ralf-svc.yaml new file mode 100644 index 0000000..2e72ac0 --- /dev/null +++ b/samples/scenarios/clearwater_ims/yaml/ralf-svc.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: Service +metadata: + name: ralf + labels: + app: ralf +spec: + ports: + - name: "10888" + port: 10888 + selector: + app: ralf + service: ralf + clusterIP: None diff --git a/samples/scenarios/deploy.sh b/samples/scenarios/deploy.sh index 1ffea37..962bd5a 100755 --- a/samples/scenarios/deploy.sh +++ b/samples/scenarios/deploy.sh @@ -15,7 +15,7 @@ cd $CLOVER_BASE_DIR echo "Deploying Istio manual sidecar injection without TLS authentication" -kubectl apply -f $ISTIO_BASE_DIR/install/kubernetes/istio.yaml +kubectl apply -f $ISTIO_BASE_DIR/install/kubernetes/istio-demo.yaml echo "Deploying Service Delivery Controller sample scenario" diff --git a/samples/scenarios/istio_ingressgateway_envoyfilter.yaml b/samples/scenarios/istio_ingressgateway_envoyfilter.yaml new file mode 100644 index 0000000..46f730c --- /dev/null +++ b/samples/scenarios/istio_ingressgateway_envoyfilter.yaml @@ -0,0 +1,24 @@ +apiVersion: networking.istio.io/v1alpha3 +kind: EnvoyFilter +metadata: + name: ext-authz + namespace: istio-system +spec: + workloadLabels: + app: istio-ingressgateway + filters: + - insertPosition: + index: FIRST + listenerMatch: + portNumber: 80 + listenerType: GATEWAY + listenerProtocol: HTTP + filterType: HTTP + filterName: "envoy.ext_authz" + filterConfig: + http_service: + server_uri: + uri: "http://modsecurity-crs.istio-system.svc.cluster.local" + cluster: "outbound|80||modsecurity-crs.istio-system.svc.cluster.local" + timeout: 0.5s + failure_mode_allow: false diff --git a/samples/scenarios/service_delivery_controller_opnfv.yaml b/samples/scenarios/service_delivery_controller_opnfv.yaml index ee0adcc..ceba36f 100644 --- a/samples/scenarios/service_delivery_controller_opnfv.yaml +++ b/samples/scenarios/service_delivery_controller_opnfv.yaml @@ -344,18 +344,38 @@ spec: selector: app: proxy-access-control --- -apiVersion: extensions/v1beta1 -kind: Ingress +apiVersion: networking.istio.io/v1alpha3 +kind: Gateway metadata: - name: proxy-gateway - annotations: - kubernetes.io/ingress.class: "istio" + name: sdc-gateway spec: - rules: - - http: - paths: - - path: - backend: - serviceName: proxy-access-control - servicePort: 9180 + selector: + istio: ingressgateway # use istio default controller + servers: + - port: + number: 80 + name: http + protocol: HTTP + hosts: + - "*" --- +apiVersion: networking.istio.io/v1alpha3 +kind: VirtualService +metadata: + name: sdcsample +spec: + hosts: + - "*" + gateways: + - sdc-gateway + http: + - match: + - uri: + prefix: / + route: + - destination: + host: proxy-access-control + port: + number: 9180 + mirror: + host: snort-ids diff --git a/samples/services/modsecurity/docker/.htaccess b/samples/services/modsecurity/docker/.htaccess new file mode 100644 index 0000000..a2b059c --- /dev/null +++ b/samples/services/modsecurity/docker/.htaccess @@ -0,0 +1,3 @@ +RewriteEngine on
+RewriteCond %{REQUEST_URI} !^/index.html$
+RewriteRule . /index.html [L]
\ No newline at end of file diff --git a/samples/services/modsecurity/docker/Dockerfile b/samples/services/modsecurity/docker/Dockerfile new file mode 100644 index 0000000..5a01f21 --- /dev/null +++ b/samples/services/modsecurity/docker/Dockerfile @@ -0,0 +1,37 @@ +FROM owasp/modsecurity:v2-ubuntu-apache
+MAINTAINER Jing Lu lvjing5@huawei.com
+
+ARG COMMIT=v3.1/dev
+ARG REPO=SpiderLabs/owasp-modsecurity-crs
+ENV PARANOIA=1
+
+RUN a2enmod rewrite
+
+RUN apt-get update && \
+ apt-get -y install python git ca-certificates iproute2 vim
+
+RUN cd /opt && \
+ git clone https://github.com/${REPO}.git owasp-modsecurity-crs-3.1 && \
+ cd owasp-modsecurity-crs-3.1 && \
+ git checkout -qf ${COMMIT}
+
+RUN cd /opt && \
+ cp -R /opt/owasp-modsecurity-crs-3.1/ /etc/apache2/modsecurity.d/owasp-crs/ && \
+ mv /etc/apache2/modsecurity.d/owasp-crs/crs-setup.conf.example /etc/apache2/modsecurity.d/owasp-crs/crs-setup.conf && \
+ cd /etc/apache2/modsecurity.d && \
+ printf "include modsecurity.d/owasp-crs/crs-setup.conf\ninclude modsecurity.d/owasp-crs/rules/*.conf" > include.conf && \
+ sed -i -e 's/SecRuleEngine DetectionOnly/SecRuleEngine On/g' /etc/apache2/modsecurity.d/modsecurity.conf && \
+ a2enmod proxy proxy_http
+
+COPY proxy.conf /etc/apache2/modsecurity.d/proxy.conf
+COPY docker-entrypoint.sh /
+
+RUN chmod 777 /docker-entrypoint.sh
+
+COPY .htaccess /var/www/html/.htaccess
+COPY apache2.conf /etc/apache2/apache2.conf
+
+EXPOSE 80
+
+ENTRYPOINT ["/docker-entrypoint.sh"]
+CMD ["apachectl", "-D", "FOREGROUND"]
diff --git a/samples/services/modsecurity/docker/apache2.conf b/samples/services/modsecurity/docker/apache2.conf new file mode 100644 index 0000000..f7c62d6 --- /dev/null +++ b/samples/services/modsecurity/docker/apache2.conf @@ -0,0 +1,227 @@ +# This is the main Apache server configuration file. It contains the +# configuration directives that give the server its instructions. +# See http://httpd.apache.org/docs/2.4/ for detailed information about +# the directives and /usr/share/doc/apache2/README.Debian about Debian specific +# hints. +# +# +# Summary of how the Apache 2 configuration works in Debian: +# The Apache 2 web server configuration in Debian is quite different to +# upstream's suggested way to configure the web server. This is because Debian's +# default Apache2 installation attempts to make adding and removing modules, +# virtual hosts, and extra configuration directives as flexible as possible, in +# order to make automating the changes and administering the server as easy as +# possible. + +# It is split into several files forming the configuration hierarchy outlined +# below, all located in the /etc/apache2/ directory: +# +# /etc/apache2/ +# |-- apache2.conf +# | `-- ports.conf +# |-- mods-enabled +# | |-- *.load +# | `-- *.conf +# |-- conf-enabled +# | `-- *.conf +# `-- sites-enabled +# `-- *.conf +# +# +# * apache2.conf is the main configuration file (this file). It puts the pieces +# together by including all remaining configuration files when starting up the +# web server. +# +# * ports.conf is always included from the main configuration file. It is +# supposed to determine listening ports for incoming connections which can be +# customized anytime. +# +# * Configuration files in the mods-enabled/, conf-enabled/ and sites-enabled/ +# directories contain particular configuration snippets which manage modules, +# global configuration fragments, or virtual host configurations, +# respectively. +# +# They are activated by symlinking available configuration files from their +# respective *-available/ counterparts. These should be managed by using our +# helpers a2enmod/a2dismod, a2ensite/a2dissite and a2enconf/a2disconf. See +# their respective man pages for detailed information. +# +# * The binary is called apache2. Due to the use of environment variables, in +# the default configuration, apache2 needs to be started/stopped with +# /etc/init.d/apache2 or apache2ctl. Calling /usr/bin/apache2 directly will not +# work with the default configuration. + + +# Global configuration +# + +# +# ServerRoot: The top of the directory tree under which the server's +# configuration, error, and log files are kept. +# +# NOTE! If you intend to place this on an NFS (or otherwise network) +# mounted filesystem then please read the Mutex documentation (available +# at <URL:http://httpd.apache.org/docs/2.4/mod/core.html#mutex>); +# you will save yourself a lot of trouble. +# +# Do NOT add a slash at the end of the directory path. +# +#ServerRoot "/etc/apache2" + +# +# The accept serialization lock file MUST BE STORED ON A LOCAL DISK. +# +#Mutex file:${APACHE_LOCK_DIR} default + +# +# The directory where shm and other runtime files will be stored. +# + +DefaultRuntimeDir ${APACHE_RUN_DIR} + +# +# PidFile: The file in which the server should record its process +# identification number when it starts. +# This needs to be set in /etc/apache2/envvars +# +PidFile ${APACHE_PID_FILE} + +# +# Timeout: The number of seconds before receives and sends time out. +# +Timeout 300 + +# +# KeepAlive: Whether or not to allow persistent connections (more than +# one request per connection). Set to "Off" to deactivate. +# +KeepAlive On + +# +# MaxKeepAliveRequests: The maximum number of requests to allow +# during a persistent connection. Set to 0 to allow an unlimited amount. +# We recommend you leave this number high, for maximum performance. +# +MaxKeepAliveRequests 100 + +# +# KeepAliveTimeout: Number of seconds to wait for the next request from the +# same client on the same connection. +# +KeepAliveTimeout 5 + + +# These need to be set in /etc/apache2/envvars +User ${APACHE_RUN_USER} +Group ${APACHE_RUN_GROUP} + +# +# HostnameLookups: Log the names of clients or just their IP addresses +# e.g., www.apache.org (on) or 204.62.129.132 (off). +# The default is off because it'd be overall better for the net if people +# had to knowingly turn this feature on, since enabling it means that +# each client request will result in AT LEAST one lookup request to the +# nameserver. +# +HostnameLookups Off + +# ErrorLog: The location of the error log file. +# If you do not specify an ErrorLog directive within a <VirtualHost> +# container, error messages relating to that virtual host will be +# logged here. If you *do* define an error logfile for a <VirtualHost> +# container, that host's errors will be logged there and not here. +# +ErrorLog ${APACHE_LOG_DIR}/error.log + +# +# LogLevel: Control the severity of messages logged to the error_log. +# Available values: trace8, ..., trace1, debug, info, notice, warn, +# error, crit, alert, emerg. +# It is also possible to configure the log level for particular modules, e.g. +# "LogLevel info ssl:warn" +# +LogLevel warn + +# Include module configuration: +IncludeOptional mods-enabled/*.load +IncludeOptional mods-enabled/*.conf + +# Include list of ports to listen on +Include ports.conf + + +# Sets the default security model of the Apache2 HTTPD server. It does +# not allow access to the root filesystem outside of /usr/share and /var/www. +# The former is used by web applications packaged in Debian, +# the latter may be used for local directories served by the web server. If +# your system is serving content from a sub-directory in /srv you must allow +# access here, or in any related virtual host. +<Directory /> + Options FollowSymLinks + AllowOverride None + Require all denied +</Directory> + +<Directory /usr/share> + AllowOverride None + Require all granted +</Directory> + +<Directory /var/www/> + Options Indexes FollowSymLinks + AllowOverride All + Require all granted +</Directory> + +#<Directory /srv/> +# Options Indexes FollowSymLinks +# AllowOverride None +# Require all granted +#</Directory> + + + + +# AccessFileName: The name of the file to look for in each directory +# for additional configuration directives. See also the AllowOverride +# directive. +# +AccessFileName .htaccess + +# +# The following lines prevent .htaccess and .htpasswd files from being +# viewed by Web clients. +# +<FilesMatch "^\.ht"> + Require all denied +</FilesMatch> + + +# +# The following directives define some format nicknames for use with +# a CustomLog directive. +# +# These deviate from the Common Log Format definitions in that they use %O +# (the actual bytes sent including headers) instead of %b (the size of the +# requested file), because the latter makes it impossible to detect partial +# requests. +# +# Note that the use of %{X-Forwarded-For}i instead of %h is not recommended. +# Use mod_remoteip instead. +# +LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined +LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined +LogFormat "%h %l %u %t \"%r\" %>s %O" common +LogFormat "%{Referer}i -> %U" referer +LogFormat "%{User-agent}i" agent + +# Include of directories ignores editors' and dpkg's backup files, +# see README.Debian for details. + +# Include generic snippets of statements +IncludeOptional conf-enabled/*.conf + +# Include the virtual host configurations: +IncludeOptional sites-enabled/*.conf + +# vim: syntax=apache ts=4 sw=4 sts=4 sr noet diff --git a/samples/services/modsecurity/docker/build.sh b/samples/services/modsecurity/docker/build.sh new file mode 100644 index 0000000..ea0feed --- /dev/null +++ b/samples/services/modsecurity/docker/build.sh @@ -0,0 +1,16 @@ +#!/bin/bash +# +# Copyright (c) Authors of Clover +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +# + +IMAGE_PATH=${IMAGE_PATH:-"localhost:5000"} +IMAGE_NAME=${IMAGE_NAME:-"clover-ns-modsecurity-crs"} + +docker build -t $IMAGE_NAME . +docker tag $IMAGE_NAME $IMAGE_PATH/$IMAGE_NAME +docker push $IMAGE_PATH/$IMAGE_NAME diff --git a/samples/services/modsecurity/docker/docker-entrypoint.sh b/samples/services/modsecurity/docker/docker-entrypoint.sh new file mode 100644 index 0000000..e8e3013 --- /dev/null +++ b/samples/services/modsecurity/docker/docker-entrypoint.sh @@ -0,0 +1,15 @@ +#!/bin/bash +python -c "import re;import os;out=re.sub('(#SecAction[\S\s]*id:900000[\s\S]*paranoia_level=1\")','SecAction \\\\\n \"id:900000, \\\\\n phase:1, \\\\\n nolog, \\\\\n pass, \\\\\n t:none, \\\\\n setvar:tx.paranoia_level='+os.environ['PARANOIA']+'\"',open('/etc/apache2/modsecurity.d/owasp-crs/crs-setup.conf','r').read());open('/etc/apache2/modsecurity.d/owasp-crs/crs-setup.conf','w').write(out)" && \ +python -c "import re;import os;out=re.sub('(#SecAction[\S\s]*id:900330[\s\S]*total_arg_length=64000\")','SecAction \\\\\n \"id:900330, \\\\\n phase:1, \\\\\n nolog, \\\\\n pass, \\\\\n t:none, \\\\\n setvar:tx.total_arg_length=64000\"',open('/etc/apache2/modsecurity.d/owasp-crs/crs-setup.conf','r').read());open('/etc/apache2/modsecurity.d/owasp-crs/crs-setup.conf','w').write(out)" && \ + +if [ ! -z $PROXY ]; then + if [ $PROXY -eq 1 ]; then + APACHE_ARGUMENTS='-D crs_proxy' + if [ -z "$UPSTREAM" ]; then + export UPSTREAM=$(/sbin/ip route | grep ^default | perl -pe 's/^.*?via ([\d.]+).*/$1/g'):81 + fi + fi +fi + + +exec "$@" $APACHE_ARGUMENTS diff --git a/samples/services/modsecurity/docker/proxy.conf b/samples/services/modsecurity/docker/proxy.conf new file mode 100644 index 0000000..4dee0c9 --- /dev/null +++ b/samples/services/modsecurity/docker/proxy.conf @@ -0,0 +1,3 @@ +<IfDefine crs_proxy> + ProxyPass "/" "http://${UPSTREAM}/" +</IfDefine> diff --git a/samples/services/modsecurity/yaml/manifest.template b/samples/services/modsecurity/yaml/manifest.template new file mode 100644 index 0000000..afeb9dc --- /dev/null +++ b/samples/services/modsecurity/yaml/manifest.template @@ -0,0 +1,38 @@ +--- +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: {{ deploy_name }} + labels: + app: {{ deploy_name }} +spec: + replicas: 1 + template: + metadata: + labels: + app: {{ deploy_name }} + spec: + containers: + - name: {{ deploy_name }} + image: {{ image_path }}/{{ image_name }}:{{ image_tag }} + ports: + - containerPort: {{ http_port }} + env: + - name: PARANOIA + value: {{ paranoia_level }} + +--- +apiVersion: v1 +kind: Service +metadata: + name: {{ deploy_name }} + labels: + app: {{ deploy_name }} +spec: + ports: + - port: {{ http_port }} + name: http-modsecurity-crs + targetPort: {{ http_port }} + selector: + app: {{ deploy_name }} +--- diff --git a/samples/services/modsecurity/yaml/modsecurity-deployment.yaml b/samples/services/modsecurity/yaml/modsecurity-deployment.yaml new file mode 100644 index 0000000..450ede5 --- /dev/null +++ b/samples/services/modsecurity/yaml/modsecurity-deployment.yaml @@ -0,0 +1,22 @@ +apiVersion: extensions/v1beta1
+kind: Deployment
+metadata:
+ name: modsecurity-crs
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: modsecurity-crs
+ template:
+ metadata:
+ labels:
+ app: modsecurity-crs
+ spec:
+ containers:
+ - name: modsecurity-crs
+ image: clover/clover-ns-modsecurity-crs
+ ports:
+ - containerPort: 80
+ env:
+ - name: PARANOIA
+ value: '1'
diff --git a/samples/services/modsecurity/yaml/modsecurity-service.yaml b/samples/services/modsecurity/yaml/modsecurity-service.yaml new file mode 100644 index 0000000..8548dca --- /dev/null +++ b/samples/services/modsecurity/yaml/modsecurity-service.yaml @@ -0,0 +1,13 @@ +apiVersion: v1
+kind: Service
+metadata:
+ name: modsecurity-crs
+spec:
+ type: NodePort
+ ports:
+ - port: 80
+ name: http-modsecurity-crs
+ protocol: TCP
+ targetPort: 80
+ selector:
+ app: modsecurity-crs
diff --git a/samples/services/modsecurity/yaml/render_yaml.py b/samples/services/modsecurity/yaml/render_yaml.py new file mode 100644 index 0000000..54f8069 --- /dev/null +++ b/samples/services/modsecurity/yaml/render_yaml.py @@ -0,0 +1,60 @@ +# Copyright (c) Authors of Clover +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 + +import argparse + +from jinja2 import Template + + +def render_yaml(args): + template_file = 'manifest.template' + out_file = 'modsecurity.yaml' + + try: + with open(template_file) as f: + tmpl = Template(f.read()) + output = tmpl.render( + image_path=args['image_path'], + image_name=args['image_name'], + image_tag=args['image_tag'], + deploy_name=args['deploy_name'], + http_port=args['http_port'], + paranoia_level=args['paranoia_level'] + ) + with open(out_file, "wb") as fh: + fh.write(output) + return "Generated manifest for {}".format(args['deploy_name']) + except Exception as e: + print(e) + return "Unable to generate manifest for {}".format( + args['deploy_name']) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument( + '--image_name', default='clover-ns-modsecurity-crs', + help='The image name to use') + parser.add_argument( + '--image_path', default='localhost:5000', + help='The path to the image to use') + parser.add_argument( + '--image_tag', default='latest', + help='The image tag to use') + parser.add_argument( + '--deploy_name', default='modsecurity-crs', + help='The k8s deploy name to use') + parser.add_argument( + '--http_port', default='80', + help='Analyze http traffic on this port') + parser.add_argument( + '--paranoia_level', default='1', + help='The modsecurity paranoia level') + + args = parser.parse_args() + print(render_yaml(vars(args))) + |