Istio Security Mission
Purpose
Showcase Istio TLS and ACL via a set of Spring Boot applications.
Prerequisites
-
Openshift 3.10 cluster
-
Istio 1.0.x installed on the aforementioned cluster using the Istio Operator.
-
Follow these instructions for more information about the Operator
-
-
Login to the cluster with the admin user
Environment preparation
Create a new project/namespace on the cluster. This is where your application will be deployed.
oc new-project <whatever valid project name you want>Build and deploy the application
With Fabric8 Maven Plugin (FMP)
Execute the following command to build the project and deploy it to OpenShift:
mvn clean fabric8:deploy -PopenshiftConfiguration for FMP may be found both in pom.xml and src/main/fabric8 files/folders.
This configuration is used to define service names and deployments that control how pods are labeled/versioned on the OpenShift cluster.
With Source to Image build (S2I)
Run the following commands to apply and execute the OpenShift templates that will configure and deploy the applications:
find . | grep openshiftio | grep application | xargs -n 1 oc apply -f
oc new-app --template=spring-boot-istio-security-name -p SOURCE_REPOSITORY_URL=https://github.com/snowdrop/spring-boot-istio-security-booster -p SOURCE_REPOSITORY_REF=master -p SOURCE_REPOSITORY_DIR=spring-boot-istio-security-name
oc new-app --template=spring-boot-istio-security-greeting -p SOURCE_REPOSITORY_URL=https://github.com/snowdrop/spring-boot-istio-security-booster -p SOURCE_REPOSITORY_REF=master -p SOURCE_REPOSITORY_DIR=spring-boot-istio-security-greetingConfigure Istio gateway
This application uses v1alpha3 routing API. Execute the following command to configure gateway and virtual service:
oc apply -f rules/gateway.ymlUse Cases
Scenario #1. Mutual TLS
This scenario demonstrates a mutual transport level security between the services.
-
Open the booster’s web page via Istio gateway route
echo http://$(oc get route istio-ingressgateway -o jsonpath='{.spec.host}{"\n"}' -n istio-system)/
-
"Hello, World!" should be returned after invoking
greetingservice. -
Now modify greeting deployment to disable sidecar injection by replacing both
sidecar.istio.io/injectvalues tofalseoc edit deploymentconfigs/spring-boot-istio-security-greeting
-
Open the booster’s web page via
greetingservice’s routeecho http://$(oc get route spring-boot-istio-security-greeting -o jsonpath='{.spec.host}{"\n"}' -n $(oc project -q))/
-
Greetingservice invocation will fail with a reset connection, because thegreetingservice has to be inside a service mesh in order to access thenameservice. -
Cleanup by setting
sidecar.istio.io/injectvalues to trueoc edit deploymentconfigs/spring-boot-istio-security-greeting
Scenario #2. Access control
This scenario demonstrates access control when using mutual TLS. In order to access a name service, calling service has to have a specific label and service account name.
-
Open the booster’s web page via Istio gateway route
echo http://$(oc get route istio-ingressgateway -o jsonpath='{.spec.host}{"\n"}' -n istio-system)/
-
"Hello, World!" should be returned after invoking
greetingservice. -
Configure Istio Mixer to block
greetingservice from accessingnameserviceoc apply -f rules/block-greeting-service.yml
-
Greetingservice invocations to thenameservice will be forbidden. -
Configure Istio Mixer to only allow requests from
greetingservice and withsa-greetingservice account to accessnameserviceoc apply -f <(sed -e "s/TARGET_NAMESPACE/$(oc project -q)/g" rules/require-service-account-and-label.yml) -
"Hello, World!" should be returned after invoking
greetingservice. -
Cleanup
oc delete -f rules/require-service-account-and-label.yml
Remove gateway configuration
oc delete -f rules/gateway.ymlUndeploy the application
With Fabric8 Maven Plugin (FMP)
mvn fabric8:undeployWith Source to Image build (S2I)
oc delete all --all
find . | grep openshiftio | grep application | xargs -n 1 oc delete -fRemove the namespace
This will delete the project from the OpenShift cluster
oc delete project <your project name>Integration tests
To run integration tests, create a new namespace and run maven job
oc new-project <project-name>
mvn clean verify -Popenshift,openshift-it