Threat modeling is a structured approach of identifying and prioritizing potential threats to a system, and determining the value that potential mitigations would have in reducing or neutralizing those threats.
Using OWASP’s threat modeling cheat sheet for guidance.
The interfaces through which potential attackers can interact with the application or supply them with data. The diagram below models these interfaces (when configured to use the kubernetes sync provider), the sections that follow describe them further.
OFO appends flagd
as a sidecar container to any pod spec application with valid annotations. The application is then able to evaluate flags by calling flagd
(typically via an sdk and flag provider) using whichever configured protocol (REST/gRPC/socket, with or without TLS). While a caller of the application could be from a trusted entity (internal infrastructure), it is more prudent to presume the agent to be untrusted (and using any protocol which the application allows).
OFO listens to webhooks from the Kubernetes control plane (its API server), specifically it handles mutations of pods. It parses the mutated pod’s annotations to determine which CRD to retrieve flagd’s flag configuration from, mutating flagd’s internal state if necessary.
Stored in the kubernetes cluster’s etcd instance, this custom resource contains the configuration for the sidecar container (flagd
) OFO
appends to the application pod(s).
Stored in the kubernetes cluster’s etcd instance, this custom resource contains the sidecar’s (flagd
) feature flags configuration. It also incorporates configuration for the sidecar container (flagd
), although, this is deprecated and superseded by the flag source configuration CR.
The feature flags configurations may contain personally identifiable information (used in targeting rules e.g. email domain). They generally should not contain any sort of secret.
Stored in OFO
’s container’s registry, these variables are used to configure the flag source if not declared explicitly by the flag source configuration CR or flag configuration CR.
flagd
’s flag configuration is the determinant of the response to any flag request, it is stored in flagd
’s memory.
There are numerous ways to set and maintain this state, configured by the flag configuration CR:
PII may be used in flag evaluation. It is sent from the workload to flagd. In all deployment patterns currently supported by the operator, this data never leaves the node and is never persisted.
flowchart LR
user-agent -->|http,authenticated| kube-apiserver
The user-agent (e.g. cluster admin or developer) is typically (and therefore assumed to be) internal to the intranet. They make authenticated http requests to the kubeapi-server
to mutate the state of the cluster.
Pertinent requests are
OFO
.OFO
& is picked up as an event by flagd
(if configured).The data in transit is at threat of tampering, the security control is authentication.
flowchart LR
user-agent -->|authenticated?| application --> flagd
The user-agent (e.g. web browser) is typically (and therefore assumed to be) external to the intranet. They make (potentially authenticated) requests (subject to tampering) to the application to which OFO
sidecars flagd
. Internally, the application (typically) uses an OpenFeature SDK
(dependent on the application’s programming language) alongside a flagd-provider
to make feature flag requests.
flowchart LR
kube-apiserver -->|http,authenticated| OFO
OFO
receives an authenticated http request notifying it of the pod. OFO
queries (authenticated http) the pod’s annotations to determine whether it needs to take action. If satisfactory, OFO
further mutates the state of the pod.OFO
receives an authenticated http request notifying it of the flag configuration CR. OFO
asserts that the CR is valid.The data in transit is at threat of tampering, the security control is authentication.
flowchart LR
OFO -->|http,authenticated| kube-apiserver
As a result of the mutation of pods webhook, OFO
appends flagd
to the pod’s containers (this is known as the “sidecar” pattern) and sends (authenticated http request) the pod’s configuration back to the kube-apiserver. flagd
is configured based on the pod’s annotated flag configuration CR. If the CR is configured to use the filepath provider, a ConfigMap is created containing the flag configuration and mounted as a volume to the flagd
container (this file is subsequently watched by flagd
).
The data in transit is at threat of tampering, the security control is authentication.
flowchart LR
flagd -->|http,authenticated| kube-apiserver
flagd
makes an authenticated http request to retrieve its initial flag configuration state from the CR. Subsequently, it registers an event handler to listen to changes to the CR. The configuration is at threat of information disclosure and tampering, the security control is authentication.
flowchart LR
flagd --> file-system
flagd
opens a file watcher on its configured file path, mutating its internal state to mirror the flag configuration file. The file is at threat of information disclosure and tampering, the security control is that the file is only accessible by the flagd
container and data transit is contained within the flagd
container.
flowchart LR
flagd -->|authenticated?| remote-source
flagd
polls a remote endpoint over http for a flag configuration, mutating its internal state to mirror the response. The data is at threat of information disclosure and tampering, the security control is authentication (if used).
flowchart LR
kube-apiserver -->|http,authenticated| flagd
flagd
listens to changes of its registered CR, mutating its internal state to mirror the change. The data is at threat of information disclosure and tampering, security control is authentication.
flowchart LR
file-system --> flagd
flagd
listens to changes of its registered file, mutating its internal state to mirror the change. The data is at threat of information disclosure and tampering, the security control is that the file is only accessible by flagd
container and data transit is contained within flagd
container.