Introduction
This WebFOCUS CE Demo explores concepts related to securing WebFOCUS, primarily focusing on network traffic. Our objective is to ensure the security of incoming traffic and traffic circulating within the WebFOCUS setup.
Discover how to fortify your WebFOCUS Container Edition on Kubernetes, ensuring that every byte of your data remains secure, whether it's flowing between components or streaming from browsers to clusters. Dive in to master the art of safeguarding your analytics!"
TL;DR
TL;DR for this article and Videos that are part of this article
· Securing Ingress and Egress Traffic: It outlines strategies for securing both incoming (ingress) and outgoing (egress) network traffic, emphasizing the use of SSL/TLS termination at the Ingress controller level for incoming traffic, and mTLS/SSL for secure communication with external services, ensuring data protection during transmission.
· POD and Multi-Container PODs Management: The document explains Kubernetes Pods and the concept of multi-container Pods within the Kubernetes ecosystem, emphasizing their role in facilitating tightly-coupled containers to share execution environments and resources, thus enhancing operational efficiency and security.
· Service Mesh Implementation with Linkerd: The document highlights the deployment of Linkerd, a service mesh, to enhance security within the WebFOCUS environment. Linkerd simplifies SSL configuration across all components, enabling secure, encrypted communication internally and improving the overall security posture of the system.
· Verification and Debugging Techniques: Various methods for verifying the security measures implemented, including using Linkerd's CLI tools and Wireshark for traffic inspection, are detailed. This ensures that the data transmission within the cluster is encrypted and secure against potential threats.
Video 1
Understanding WebFOCUS Component Interconnectivity:
In typical network configurations, traffic can be categorized into two main types: East/West, representing traffic between WebFOCUS components within the data center, and South/North, encompassing traffic entering or exiting the data center.
Now, let's delve into a high-level schematic diagram illustrating the interactions between these components and the pathways traversed by data within and outside the data center.
Overview of interconnectivity of WebFOCUS components
Upon completing the deployment of WebFOCUS CE, whether on a local cluster or a managed Kubernetes cluster, the resulting configuration resembles the following:
WebFOCUS CE, often described as a "battery-included" deployment, is self-sufficient, providing all necessary components out of the box, such as the database server, Solr, Zookeeper for search functionalities, and ETCD for centralized configuration storage.
In traditional on-premise setups, securing the main components of WebFOCUS, such as the application server and reporting server, suffices to secure most inbound user traffic, offering around 99% coverage for securing major traffic entering WebFOCUS.
While similar setups are possible in Kubernetes-based environments, they may not be the most optimal solutions as they violate Infrastructure as Code (IAC) principles. This is primarily due to the necessity of embedding certificates within container images during the build process. In Kubernetes and other cloud-based deployment practices, the consistent promotion of identical setups and certificates from development to production environments is crucial. Consequently, certificates intended solely for production environments should not be used in the development or pre-production stages. Moreover, certificate management, including renewal processes, introduces complexities. However, the CNCF community has addressed this challenge.
What is the challenge here? The challenge here lies in securing numerous components, each requiring its own SSL setup. While custom SSL configurations are feasible, they are time-consuming and cumbersome. This challenge has been recognized by the CNCF community and addressed by few of it's member projects.
One solution to this problem is adopting a service mesh, a concept we will discuss shortly.
Video 2
Securing Ingress and egress traffic (North/South traffic)
Before proceeding further, let's discuss securing both incoming and outgoing (ingress/egress) traffic, commonly referred to as North/South traffic.
Securing Ingress traffic:
To safeguard incoming traffic, utilizing an Ingress controller and implementing SSL certificate termination is advisable. Alternatively, you can opt to apply mTLS/SSL directly on your cloud load balancer, ensuring encrypted communication onward from that point.
Securing Egress traffic:
Outgoing traffic originating from the cluster, such as interactions with SMTP servers, data lakes, business/partner databases, or Active Directory, is assumed to be already secured by their respective vendors. When WebFOCUS communicates with these external services, it's recommended that mTLS/SSL communication be initiated to ensure secure data transmission.
Securing Components with Service Mesh (Linkerd):
Securing components running in the cluster
Securing components within the cluster is an optional step, especially in scenarios like an "Air Gap" setup where traffic is restricted from entering or leaving the cluster. However, if you aim to enhance security by encrypting traffic across all endpoints, employing a service mesh like Linkerd provides a straightforward solution.
How Service Mesh (Linkerd) can help?
Linkerd simplifies the process of enabling SSL across all endpoints, offering a seamless experience akin to pressing a button or executing a single command. In this demonstration, we'll witness how Linkerd effortlessly secures all endpoints and components within the WebFOCUS Cluster.
What is Service Mesh? A service mesh in Kubernetes is a dedicated infrastructure layer that facilitates communication between microservices within a cluster. It abstracts away the complexities of service-to-service communication, providing features like load balancing, traffic management, service discovery, and encryption. By deploying a service mesh like Istio or Linkerd, developers can enhance observability, reliability, and security without modifying application code. It improves the management and monitoring of microservices architectures, ensuring better control over network traffic and interactions between services.
What is Linkerd? How does it work?
Linkerd is a service mesh for Kubernetes. It makes running services easier and safer by giving you runtime debugging, observability, reliability, and security—all without requiring any changes to your code.
By abstracting away the complexity of securing individual endpoints, LinkerD Service Mesh provides centralized control and visibility, simplifying the task of securing all endpoints in a Kubernetes cluster.
How it works
Linkerd operates by deploying ultralight, transparent "micro-proxies" alongside each service instance, which efficiently manage inbound and outbound traffic for the service. These proxies act as highly instrumented network stacks, seamlessly integrating with the control plane for telemetry and control.
Understanding POD and Multi Containers in POD
Kubernetes Pods, the smallest deployable units in Kubernetes, encapsulate one or more containers along with shared resources such as storage volumes and networking interfaces. Pods serve as the basic building blocks of applications, facilitating easy scaling and management within Kubernetes clusters.
A multi-container Pod in Kubernetes allows for co-locating multiple tightly-coupled containers within the same Pod, enabling them to share the same execution environment and resources. This approach promotes efficient communication and container coordination, simplifying deployment and management tasks while maintaining a cohesive application architecture.
Adding Linkerd to our Kubernetes cluster :
Note: It's recommended that you try this demo first for non-production clusters. This demo involves imperative commands for interacting with the cluster, which is efficient for demos but doesn't strictly adhere to the Infrastructure as Code (IAC) rule. Once comfortable with the commands, consider scripting them or referring to Linkerd production deployment guidelines at linkerd.io/going-to-production.
Video 3 :
Eavesdropping on ReportCaster
Before proceeding, let's intercept TCP traffic to confirm data transmission in plaintext. We've chosen ReportCaster due to its quick startup, facilitating multiple restarts. Leveraging Wireshark, the command-line tool, we'll intercept incoming messages without rebuilding the ReportCaster container image. Instead, we'll opt for a sidecar container named "wireshark," containing the pre-installed 'tshark' tool for capturing TCP traffic.
To execute 'tshark,' the POD must start with root user privileges (user ID 0). Thus, we'll employ a Patch command to update the runAsUser
field in the security context of the reportcaster
StatefulSet in the webfocus
namespace, setting the user ID to 0.
# This `kubectl patch` command updates the `runAsUser` field in the security context of the `reportcaster` StatefulSet in the `webfocus` namespace to set the user ID to 0 (root user).
kubectl patch statefulset reportcaster -n webfocus --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/securityContext/runAsUser", "value": 0}]'
Now, we can add a sidecar container using this patch command.
# The command uses `kubectl patch` to modify the StatefulSet named `reportcaster` in the `webfocus` namespace by adding a new container named `wireshark` with the specified image.
kubectl patch statefulset reportcaster -n webfocus --type='json' -p='[{"op": "add", "path": "/spec/template/spec/containers/-", "value": {"name": "wireshark", "image": "cr.l5d.io/linkerd/debug:edge-24.3.2"}}]'
After a few seconds, we can run this command to inspect TCP traffic. This command runs a "tshark" command in the container "wireshark"
Command tshark -i any -f "tcp" -x
- prints payload data of TCP packets, use the -x option to print packet details in hexadecimal and ASCII format
# Wait pod to be ready with both the Containers
kubectl wait --for=condition=ready pod/reportcaster-0 --namespace=webfocus --timeout=60s
Make sure above comand finishes before proceeding to next stesp
# This command executes `tshark` within the `wireshark` container of the `reportcaster-0` pod in the `webfocus` namespace, capturing TCP traffic in hexadecimal format from all interfaces.
kubectl exec -it -n webfocus reportcaster-0 -c wireshark -- tshark -i any -f "tcp" -x
Sample output :
QuoteRunning as user "root" and group "root". This could be dangerous.Capturing on 'any'tshark: cap_set_proc() fail return: Operation not permitted
tshark: cap_set_proc() fail return: Operation not permitted
** (tshark:31) 05:44:59.998096 [Main MESSAGE] -- Capture started.** (tshark:31) 05:44:59.998280 [Main MESSAGE] -- File: "/tmp/wireshark_anyP81VK2.pcapng"0000 00 04 00 01 00 06 8a 15 c8 00 31 cf 00 00 08 00 ..........1.....0010 45 00 03 f0 77 08 40 00 40 06 b0 d3 c0 a8 d2 88 E...w.@.@.......0020 0a 66 71 95 8c ee 15 38 44 4c 64 c5 e7 08 79 a2 .fq....8DLd...y.0030 80 18 01 f6 13 0f 00 00 01 01 08 0a ec 43 02 94 .............C..0040 d8 c6 d0 87 50 00 00 03 45 00 53 45 4c 45 43 54 ....P...E.SELECT0050 20 74 31 2e 53 43 48 45 44 55 4c 45 49 44 2c 20 t1.SCHEDULEID,0060 74 31 2e 41 43 54 49 56 45 2c 20 74 31 2e 41 4c t1.ACTIVE, t1.AL0070 45 52 54 4a 4f 42 2c 20 74 31 2e 41 4c 45 52 54 ERTJOB, t1.ALERT0080 54 49 44 2c 20 74 31 2e 42 4c 41 43 4b 4f 55 54 TID, t1.BLACKOUT0090 4e 4f 54 49 46 59 2c 20 74 31 2e 42 4c 41 43 4b NOTIFY, t1.BLACK00a0 4f 55 54 52 45 53 45 54 2c 20 74 31 2e 42 4c 41 OUTRESET, t1.BLA00b0 43 4b 4f 55 54 52 45 53 45 54 54 49 4d 45 2c 20 CKOUTRESETTIME,00c0 74 31 2e 43 41 53 54 45 52 5f 55 53 45 52 2c 20 t1.CASTER_USER,00d0 74 31 2e 44 45 4c 45 54 45 4a 4f 42 2c 20 74 31 t1.DELETEJOB, t100e0 2e 44 45 4c 45 54 45 4a 4f 42 54 49 4d 45 2c 20 .DELETEJOBTIME,00f0 74 31 2e 49 42 46 53 49 44 2c 20 74 31 2e 4a 4f t1.IBFSID, t1.JO0100 42 44 45 53 43 2c 20 74 31 2e 4c 41 53 54 45 58 BDESC, t1.LASTEX0110 53 54 41 54 55 53 2c 20 74 31 2e 4c 41 53 54 45 STATUS, t1.LASTE0120 58 54 49 4d 45 2c 20 74 31 2e 4e 45 57 4a 4f 42 XTIME, t1.NEWJOB0130 52 55 4c 45 2c 20 74 31 2e 4e 4f 52 45 50 4f 52 RULE, t1.NOREPOR0140 54 2c 20 74 31 2e 4e 4f 54 49 46 59 5f 46 4c 41 T, t1.NOTIFY_FLA0150 47 2c 20 74 31 2e 4e 4f 54 49 46 59 5f 52 45 50 G, t1.NOTIFY_REP0160 4c 59 2c 20 74 31 2e 4e 4f 54 49 46 59 5f 53 55 LY, t1.NOTIFY_SU0170 42 4a 45 43 54 2c 20 74 31 2e 4f 4e 44 45 4d 41 BJECT, t1.ONDEMA0180 4e 44 2c 20 74 31 2e 50 52 49 4f 52 49 54 59 2c ND, t1.PRIORITY,
This confirms that data is transmitted in clear text; we will keep this sidecar container running for a while.
Updating WebFOCUS Components with Service Mesh
Important Note: Exercise caution while executing the following steps, as they will restart the entire WebFOCUS setup, resulting in temporary downtime for your cluster. Some of the steps below also include running a few of the PODs as root
a user - these is just for debug/demo purposes only. Once this debug step is over, revert it back to running as a non-root user.
1. Install Linkerd CLI: Utilize a helper script to install the Linkerd CLI on your Ubuntu system seamlessly.
# Install linkerd
curl -sL https://run.linkerd.io/install | sh
# Add linkerd in path
export PATH=$PATH:$HOME/.linkerd2/bin
# Check verison
linkerd version
Run a check to see if linked can be installed in a cluster.
linkerd check --pre
Sample output :
Quotekubernetes-api--------------√ can initialize the client√ can query the Kubernetes API
kubernetes-version------------------√ is running the minimum Kubernetes API version
pre-kubernetes-setup--------------------√ control plane namespace does not already exist√ can create non-namespaced resources√ can create ServiceAccounts√ can create Services√ can create Deployments√ can create CronJobs√ can create ConfigMaps√ can create Secrets√ can read Secrets√ can read extension-apiserver-authentication configmap√ no clock skew detected
linkerd-version---------------√ can determine the latest version√ cli is up-to-date
Status check results are √
2. Deploy the Control Plane: Employ the following steps to deploy the Linkerd control plane to your Kubernetes cluster (ensuring that your kubeconfig file has cluster admin privileges).
# Install CRD
linkerd install --crds >crds.yaml
kubectl apply -f crds.yaml
# Install linker d - we might not need runAsRoot option
linkerd install --set proxyInit.runAsRoot=true >linkerd.yaml
kubectl apply -f linkerd.yaml
3. Optional Dashboard Installation: Optionally, install the Linkerd dashboard, which provides a visual representation of data plane traffic, enabling you to monitor connections made by each pod within the cluster.
# Install Dashboard ( you might have to wait for while )
linkerd viz install >linkerd-viz.yaml
kubectl apply -f linkerd-viz.yaml
4. Dashboard Configuration Update: Customize the dashboard configuration to enable access via your Fully Qualified Domain Name (FQDN), allowing accessibility from your laptop. Additionally, expose port 8084 of the dashboard for external access.
# Update viz service "web" to allow FQDN - not just localhost
kubectl get -n linkerd-viz deployments.apps web -o json | sed "s/localhost/wfce02.ibi.systems/g" | kubectl replace -f -
# Expose dashboard to outside world (only for demo)
kubectl -n linkerd-viz port-forward svc/web 8084:8084 --address 0.0.0.0 &
5. Meshing WebFOCUS Components: In the WebFOCUS Container Edition (WF-CE), Kubernetes StatefulSets manage most components. Apply the Linkerd Proxy (sidecar) to all StatefulSets, ensuring secure traffic transmission. Note that this process will cause a brief outage lasting approximately 3 to 4 minutes while the components are restarted.
# Inject Linkerd proxy to all WebFOCUS Stateful set PODs
kubectl get -n webfocus sts -o yaml | linkerd inject - | kubectl apply -f -
# Wait for 3 min to restart all PODS
kubectl get pods -n webfocus --field-selector=status.phase!=Succeeded,status.phase!=Failed -o name | xargs -I {} kubectl wait --for=condition=ready {} --namespace=webfocus --timeout=180s
Note: If other pods are managed by Deployments (e.g., ibi DSML) and are not covered by the initial command, rerun the command and select Deployments instead of StatefulSets.
Verification of Security Measures
1. Using Linkerd CLI: Utilize the "viz" command within the Linkerd CLI to confirm that all WebFOCUS components are meshed securely.
linkerd viz -n webfocus edges sts
linkerd viz -n webfocus edges pods
2. Via Linkerd Dashboard: Access the Linkerd dashboard to inspect and validate the expected meshing of traffic visually.
3. Utilizing Wireshark: For an additional layer of validation, inspect traffic again using Wireshark. With Wireshark running within the ReportCaster POD, execute the same command as before, ensuring that all observed traffic is now encrypted.
# Command that will show all traffic for Report Caster
kubectl exec -it -n webfocus reportcaster-0 -c wireshark -- tshark -i any -f "tcp" -x
Sample output :
QuoteRunning as user "root" and group "root". This could be dangerous.Capturing on 'any'tshark: cap_set_proc() fail return: Operation not permitted
tshark: cap_set_proc() fail return: Operation not permitted
** (tshark:62) 06:05:20.014228 [Main MESSAGE] -- Capture started.** (tshark:62) 06:05:20.014337 [Main MESSAGE] -- File: "/tmp/wireshark_anyD6URK2.pcapng"0000 00 00 00 01 00 06 ee ee ee ee ee ee 00 00 08 00 ................0010 45 00 00 3c d4 f9 40 00 40 06 c6 6f 0a f1 01 1d E..<..@.@..o....0020 c0 a8 d2 9c 95 9c 20 08 19 e4 5c 3e 00 00 00 00 ...... ...\>....0030 a0 02 fb 90 9f 81 00 00 02 04 05 78 04 02 08 0a ...........x....0040 5a db 5b 9f 00 00 00 00 01 03 03 07 Z.[.........
0000 00 04 00 01 00 06 6a 2f c6 e0 ba 5b 00 00 08 00 ......j/...[....0010 45 00 00 3c 00 00 40 00 40 06 9b 69 c0 a8 d2 9c E..<..@.@..i....0020 0a f1 01 1d 20 08 95 9c 18 25 5c 9d 19 e4 5c 3f .... ....%\...\?0030 a0 12 fe d4 9f 81 00 00 02 04 05 78 04 02 08 0a ...........x....0040 69 ac ff 3c 5a db 5b 9f 01 03 03 07 i..<Z.[.....
0000 00 00 00 01 00 06 ee ee ee ee ee ee 00 00 08 00 ................0010 45 00 00 34 d4 fa 40 00 40 06 c6 76 0a f1 01 1d E..4..@.@..v....0020 c0 a8 d2 9c 95 9c 20 08 19 e4 5c 3f 18 25 5c 9e ...... ...\?.%\.0030 80 10 01 f8 9f 79 00 00 01 01 08 0a 5a db 5b 9f .....y......Z.[.0040 69 ac ff 3c i..<
0000 00 00 00 01 00 06 ee ee ee ee ee ee 00 00 08 00 ................0010 45 00 00 3c fd 40 40 00 40 06 9e 28 0a f1 01 1d E..<.@@.@..(....0020 c0 a8 d2 9c cd e4 10 5f ef b4 31 56 00 00 00 00 ......._..1V....0030 a0 02 fb 90 9f 81 00 00 02 04 05 78 04 02 08 0a ...........x....0040 5a db 5b 9f 00 00 00 00 01 03 03 07 Z.[.........
0000 00 04 00 01 00 06 6a 2f c6 e0 ba 5b 00 00 08 00 ......j/...[....0010 45 00 00 3c 00 00 40 00 40 06 9b 69 c0 a8 d2 9c E..<..@.@..i....0020 0a f1 01 1d 10 5f cd e4 55 68 95 30 ef b4 31 57 ....._..Uh.0..1W0030 a0 12 fe d4 9f 81 00 00 02 04 05 78 04 02 08 0a ...........x....0040 69 ac ff 3c 5a db 5b 9f 01 03 03 07 i..<Z.[.....
0000 00 00 00 01 00 06 ee ee ee ee ee ee 00 00 08 00 ................0010 45 00 00 34 fd 41 40 00 40 06 9e 2f 0a f1 01 1d E..4.A@.@../....0020 c0 a8 d2 9c cd e4 10 5f ef b4 31 57 55 68 95 31 ......._..1WUh.10030 80 10 01 f8 9f 79 00 00 01 01 08 0a 5a db 5b 9f .....y......Z.[.0040 69 ac ff 3c i..<
0000 00 00 00 01 00 06 ee ee ee ee ee ee 00 00 08 00 ................0010 45 00 00 a3 fd 42 40 00 40 06 9d bf 0a f1 01 1d E....B@.@.......0020 c0 a8 d2 9c cd e4 10 5f ef b4 31 57 55 68 95 31 ......._..1WUh.10030 80 18 01 f8 9f e8 00 00 01 01 08 0a 5a db 5b a0 ............Z.[.0040 69 ac ff 3c 47 45 54 20 2f 6c 69 76 65 20 48 54 i..<GET /live HT0050 54 50 2f 31 2e 31 0d 0a 48 6f 73 74 3a 20 31 39 TP/1.1..Host: 19
These comprehensive verification techniques ensure that all WebFOCUS components' traffic is safeguarded and secure after the Linkerd meshing solution is applied.
Securing Communication from Ingress to Application Servers
Video 4
What about Ingress & TLS termination?
Ingress controllers serve as reverse proxies that manage external traffic and can implement mTLS/SSL encryption on their endpoints. This ensures that communication from the user's browser to the Ingress controller remains secure and terminates at the controller itself. However, traffic between the Ingress controller and the application server remains unencrypted.
Inspecting Clear-Text Traffic with Wireshark: To inspect the clear-text traffic, we can employ Wireshark side-car containers (just like how we did above), leveraging Linkerd's capabilities (addtional command switch `--enable-debug-sidecar`). We can effectively eavesdrop on incoming traffic by injecting a debug container alongside the application server. The process involves using Linkerd's helper command to inject the side-car debug container, incorporating Wireshark for traffic analysis.
Restricting Wireshark to Ingress Controller IP: To focus Wireshark's capture solely on traffic originating from the Ingress controller, we first retrieve the IP address of the Ingress controller. We then utilize this IP address to configure the tshark
command, filtering traffic specifically from the Ingress controller's IP.
# Change run as user to 'root' so wireshark can run
kubectl patch statefulset appserver -n webfocus --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/securityContext/runAsUser", "value": 0}]'
# add a wireshark side-car using linkerd inject switch --enable-debug-sidcar
kubectl get -n webfocus sts appserver -o yaml | linkerd inject --enable-debug-sidecar - | kubectl apply -f -
# Wait 3 min for POD to come up
kubectl wait --for=condition=ready pod/appserver-0 --namespace=webfocus --timeout=180s
# Get ingress Controller POD's IP
INGRESS_CONT_IP=$(kubectl get pod -n ingress-nginx -l app.kubernetes.io/component=controller -o jsonpath='{.items[*].status.podIP}')
# Check what kind of traffic is comming to App server from Ingress Controller POD
kubectl exec -it -n webfocus appserver-0 -c linkerd-debug -- tshark -i any -f "src host $INGRESS_CONT_IP" -x
Sample output :
Quotekubectl exec -it -n webfocus appserver-
0
-c linkerd-debug -- tshark -i any -f
"src host $INGRESS_CONT_IP"
-x
Running as user
"root"
and group
"root"
. This could be dangerous.
Capturing on
'any'
tshark: cap_set_proc() fail
return
: Operation not permitted
tshark: cap_set_proc() fail
return
: Operation not permitted
** (tshark:
356
)
06
:
11
:
41.794129
[Main MESSAGE] -- Capture started.
** (tshark:
356
)
06
:
11
:
41.794229
[Main MESSAGE] -- File:
"/tmp/wireshark_anyBE9WK2.pcapng"
0000
00
00
00
01
00
06
ee ee ee ee ee ee
00
00
08
00
................
0010
45
00
00
3c bf
09
40
00
3f
06
56
09
c0 a8 d2 ad E..<..@.?.V.....
0020
c0 a8 d2 aa df
38
1f
90
4d 0a 9b be
00
00
00
00
.....
8
..M.......
0030
a0
02
fb
90
26
d8
00
00
02
04
05
78
04
02
08
0a ....&......x....
0040
35
d9 9d
95
00
00
00
00
01
03
03
07
5
...........
0000
00
00
00
01
00
06
ee ee ee ee ee ee
00
00
08
00
................
0010
45
00
00
34
bf 0a
40
00
3f
06
56
10
c0 a8 d2 ad E..
4
..@.?.V.....
0020
c0 a8 d2 aa df
38
1f
90
4d 0a 9b bf
35
cd 6b bc .....
8
..M...
5
.k.
0030
80
10
01
f8
26
d0
00
00
01
01
08
0a
35
d9 9d
95
....&.......
5
...
0040
14
b7
49
f7 ..I.
0000
00
00
00
01
00
06
ee ee ee ee ee ee
00
00
08
00
................
0010
45
00
04
76
bf 0b
40
00
3f
06
51
cd c0 a8 d2 ad E..v..@.?.Q.....
0020
c0 a8 d2 aa df
38
1f
90
4d 0a 9b bf
35
cd 6b bc .....
8
..M...
5
.k.
0030
80
18
01
f8 2b
12
00
00
01
01
08
0a
35
d9 9d
95
....+.......
5
...
0040
14
b7
49
f7
47
45
54
20
2f
77
65
62
66
6f
63
75
..I.GET /webfocu
0050
73
2f
77
65
6c
63
6f 6d
65
20
48
54
54
50
2f
31
s/welcome HTTP/
1
0060
2e
31
0d 0a
48
6f
73
74
3a
20
77
66
63
65
30
32
.
1
..Host: wfce02
0070
2e
69
62
69
2e
73
79
73
74
65
6d
73
0d 0a
58
2d .ibi.systems..X-
0080
52
65
71
75
65
73
74
2d
49
44
3a
20
30
37
66
63
Request-ID: 07fc
0090
33
61
34
63
61
38
65
64
62
66
62
61
36
61
37
61
3a4ca8edbfba6a7a
00a0
34
63
32
39
30
34
38
64
37
61
33
36
0d 0a
58
2d 4c29048d7a36..X-
00b0
52
65
61
6c 2d
49
50
3a
20
31
30
2e
39
38
2e
32
Real-IP:
10.98
.
2
00c0
30
38
2e
32
33
35
0d 0a
58
2d
46
6f
72
77
61
72
08.235
..X-Forwar
00d0
64
65
64
2d
46
6f
72
3a
20
31
30
2e
39
38
2e
32
ded-For:
10.98
.
2
00e0
30
38
2e
32
33
35
0d 0a
58
2d
46
6f
72
77
61
72
08.235
..X-Forwar
00f0
64
65
64
2d
48
6f
73
74
3a
20
77
66
63
65
30
32
ded-Host: wfce02
0100
2e
69
62
69
2e
73
79
73
74
65
6d
73
0d 0a
58
2d .ibi.systems..X-
We can see data is being transmitted between the Ingress Controller and App Server in Clear text format.
Meshing the Ingress Controller: To address the clear-text traffic between the Ingress controller and the application server, it's essential to mesh the Ingress controller deployment. Meshing involves integrating Linkerd with the Ingress controller to establish a secure communication channel. Once meshed, all traffic between the Ingress controller and the application server becomes encrypted, enhancing overall security.
kubectl get -n ingress-nginx deploy -o yaml | linkerd inject - | kubectl apply -f -
Use the command below to see if the Ingress controller POD returned successfully.
kubectl rollout status deployment.apps/ingress-nginx-controller -n ingress-nginx --timeout=180s
Inspecting Encrypted Traffic with Wireshark: Once ingress controller POD is also meshed now, if you try to run the same tshark
command again, you will see all traffic is encrypted between the Ingress controller POD (reverse proxy) and Application server
INGRESS_CONT_IP=$(kubectl get pod -n ingress-nginx -l app.kubernetes.io/component=controller -o jsonpath='{.items[*].status.podIP}')
kubectl exec -it -n webfocus appserver-0 -c linkerd-debug -- tshark -i any -f "src host $INGRESS_CONT_IP" -x
Sample output :
QuoteRunning as user
"root"
and group
"root"
. This could be dangerous.
Capturing on
'any'
tshark: cap_set_proc() fail
return
: Operation not permitted
tshark: cap_set_proc() fail
return
: Operation not permitted
** (tshark:
731
)
06
:
16
:
17.374545
[Main MESSAGE] -- Capture started.
** (tshark:
731
)
06
:
16
:
17.374653
[Main MESSAGE] -- File:
"/tmp/wireshark_any0JYMK2.pcapng"
0000
00
00
00
01
00
06
ee ee ee ee ee ee
00
00
08
00
................
0010
45
00
00
3c fc 9f
40
00
3f
06
18
75
c0 a8 d2 ab E..<..@.?..u....
0020
c0 a8 d2 aa aa
80
1f
90
b1 2d fd d3
00
00
00
00
.........-......
0030
a0
02
fb
90
26
d6
00
00
02
04
05
78
04
02
08
0a ....&......x....
0040
76
ff 9e 6d
00
00
00
00
01
03
03
07
v..m........
0000
00
00
00
01
00
06
ee ee ee ee ee ee
00
00
08
00
................
0010
45
00
00
34
fc a0
40
00
3f
06
18
7c c0 a8 d2 ab E..
4
..@.?..|....
0020
c0 a8 d2 aa aa
80
1f
90
b1 2d fd d4 4d 5b be 8c .........-..M[..
0030
80
10
01
f8
26
ce
00
00
01
01
08
0a
76
ff 9e 6d ....&.......v..m
0040
48
2d
06
7f H-..
0000
00
00
00
01
00
06
ee ee ee ee ee ee
00
00
08
00
................
0010
45
00
01
47
fc a1
40
00
3f
06
17
68
c0 a8 d2 ab E..G..@.?..h....
0020
c0 a8 d2 aa aa
80
1f
90
b1 2d fd d4 4d 5b be 8c .........-..M[..
0030
80
18
01
f8
27
e1
00
00
01
01
08
0a
76
ff 9e 6e ....'.......v..n
0040
48
2d
06
7f
16
03
01
01
0e
01
00
01
0a
03
03
77
H-.............w
0050
22
40
7d 4e 7e fc
47
a5 f9 d5
19
69
36
bd
05
b3 "@}N~.G....i6...
0060
c9 d2
11
4c ce
63
75
a6 da 6b ad
87
e4 de db
20
...L.cu..k.....
0070
81
33
3e a1 d9 cf
20
f5 0d
71
eb
29
b7 ad 0e c3 .
3
>... ..q.)....
0080
a8
21
7b f0
50
7c
65
66
de
94
e8 f1 c4 bc 1c e6 .!{.P|ef........
0090
00
04
13
03
00
ff
01
00
00
bd
00
2b
00
03
02
03
...........+....
00a0
04
00
0b
00
02
01
00
00
0a
00
08
00
06
00
1d
00
................
We can see that the data is now encrypted when it flows between Ingress Controller and App server POD
Using Linkerd's Visualization Command: Linkerd offers a CLI command called "viz," which allows us to visualize the communication between pods across namespaces. By executing the "viz" command, we can verify the secure communication between the application server (e.g., appserver-0
in the ingress-nginx
namespace) and other relevant components (e.g., webfocus
namespace), ensuring end-to-end security.
Implementing these measures establishes a robust security framework, safeguarding communication at various points within the cluster architecture.
Conclusion and Final Thoughts:
Final thoughts
Throughout this tutorial, we delved into securing WebFOCUS within Kubernetes environments, emphasizing the crucial aspects of network traffic security and implementing a service mesh with Linkerd. This comprehensive approach not only simplifies SSL configuration management but also ensures encrypted communication across all components, enhancing the overall security posture. By equipping ourselves with these methodologies, we are better prepared to protect our deployments against emerging threats, marking a significant step forward in our cybersecurity efforts.
Key takeaways include:
- Understanding the importance of securing both ingress and egress traffic to prevent unauthorized access and data breaches.
- Implementing Linkerd as a service mesh to simplify SSL configuration and secure communication across Kubernetes nodes.
- Kubernetes Pods' flexibility facilitates the addition of security measures without hindering functionality.
- The role of encrypted communication channels in safeguarding data in transit within the WebFOCUS environment.
As we wrap up, it's clear that the path to securing WebFOCUS involves a combination of strategic planning, an understanding of Kubernetes' inner workings, and the judicious application of service meshes like Linkerd. The skills and knowledge acquired here should empower you to fortify your deployments, making them resilient against the evolving threats in today's digital landscape.
Looking forward, I encourage you to explore Kubernetes security practices further, delve deeper into service mesh architectures, and continue refining your cybersecurity approach. This tutorial has laid the groundwork, but the journey to comprehensive security in WebFOCUS CE is ongoing and ever-changing.
Remember, securing your infrastructure is not a one-time effort but a continuous process of learning, adapting, and implementing the best practices.
Cleanup debugging PODs :
We need to clean two extra sidecars that we added to two of our Statefulsets - one for reportcaster
and the other one is for appserver
Remove side-car wireshark and remove run as root user from reportcaster pod
kubectl patch statefulset reportcaster -n webfocus --type='json' -p='[{"op": "remove", "path": "/spec/template/spec/containers/1"}]'
kubectl patch statefulset reportcaster -n webfocus --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/securityContext/runAsUser", "value": 1000}]'
Remove debug sidecar from appserver and remove run as the root user.
kubectl patch statefulset appserver -n webfocus --type=json -p='[{"op": "remove", "path": "/spec/template/metadata/annotations/config.linkerd.io~1enable-debug-sidecar"}]'
kubectl patch statefulset appserver -n webfocus --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/securityContext/runAsUser", "value": 1000}]'
----
Recommended Comments
There are no comments to display.