Blacklist a Specific Application URL on Openshift using Route
Sometimes we want to hide a sensitive URLs such as our prometheus or even Spring Boot’s actuator from external world, but we still want those URL to be accesible within internal cluster. Basically there are multiple ways of doing that, such as blocking it from Firewall, rewrite from Reverse Proxy, or even doing blacklisting from application level.
One thing that i want to try is to do blacklisting from Openshift Route level, which is something doable by the DevOps team since it is still within platform level.
So for this example, i want to expose all my API to external world except for actuator endpoint which can only be consume within internal network. So lets start with a sample Kubernetes Service Yaml,
kind: Service
apiVersion: v1
metadata:
name: catalogue-service
namespace: edwin-ns
labels:
app: catalogue-service
app.kubernetes.io/component: catalogue-service
app.kubernetes.io/instance: catalogue-service
app.kubernetes.io/name: catalogue-service
app.kubernetes.io/part-of: sample-app
app.openshift.io/runtime-version: latest
annotations:
openshift.io/generated-by: OpenShiftWebConsole
spec:
ports:
- name: 8080-tcp
protocol: TCP
port: 8080
targetPort: 8080
internalTrafficPolicy: Cluster
type: ClusterIP
ipFamilyPolicy: SingleStack
sessionAffinity: None
selector:
app: catalogue-service
deploymentconfig: catalogue-service
And i want to expose above Service into a specific URL by using Route,
kind: Route
apiVersion: route.openshift.io/v1
metadata:
name: catalogue-service
namespace: edwin-ns
labels:
app: catalogue-service
app.kubernetes.io/component: catalogue-service
app.kubernetes.io/instance: catalogue-service
app.kubernetes.io/name: catalogue-service
app.kubernetes.io/part-of: sample-app
app.openshift.io/runtime-version: latest
annotations:
openshift.io/host.generated: 'true'
spec:
host: catalogue-service-edwin-ns.apps.openshift.com
to:
kind: Service
name: catalogue-service
weight: 100
port:
targetPort: 8080-tcp
tls:
termination: edge
insecureEdgeTerminationPolicy: Redirect
wildcardPolicy: None
Above configuration means that everytime external users accessing catalogue-service-edwin-ns.apps.openshift.com, they are able to access catalogue-service application APIs thru its Kubernetes Service. If we want to block a specific URL, we need to create another Route yaml specifically for blocking it based on Path variable,
kind: Route
apiVersion: route.openshift.io/v1
metadata:
name: catalogue-service-blocking-actuator
namespace: edwin-ns
labels:
app: catalogue-service
app.kubernetes.io/component: catalogue-service
app.kubernetes.io/instance: catalogue-service
app.kubernetes.io/name: catalogue-service
app.kubernetes.io/part-of: sample-app
app.openshift.io/runtime-version: latest
annotations:
haproxy.router.openshift.io/rewrite-target: /go-to-some-404-url
openshift.io/host.generated: 'true'
spec:
host: catalogue-service-edwin-ns.apps.openshift.com
path: /actuator
to:
kind: Service
name: catalogue-service
weight: 100
port:
targetPort: 8080-tcp
tls:
termination: edge
insecureEdgeTerminationPolicy: Redirect
wildcardPolicy: None
Having those 2 YAML all together making sure that we are expose all APIs that are needed, excluding the actuator URL which we “rewrite” into some 404 url.


