<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>OWSM: Empowering Rego for Stateful Access Control</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Massimiliano Baldo</string-name>
          <email>massimiliano.baldo@uniud.it</email>
          <xref ref-type="aff" rid="aff2">2</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Fabio I. Ion</string-name>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Marino Miculan</string-name>
          <email>marino.miculan@uniud.it</email>
          <xref ref-type="aff" rid="aff0">0</xref>
          <xref ref-type="aff" rid="aff2">2</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Matteo Paier</string-name>
          <email>matteo.paier@imtlucca.it</email>
          <xref ref-type="aff" rid="aff1">1</xref>
          <xref ref-type="aff" rid="aff2">2</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Vincenzo Riccio</string-name>
          <email>vincenzo.riccio@uniud.it</email>
          <xref ref-type="aff" rid="aff2">2</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Ca' Foscari University of Venice - Dept. of Environmental Sciences</institution>
          ,
          <addr-line>Informatics and Statistics</addr-line>
          ,
          <country country="IT">Italy</country>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>IMT Alti Studi Lucca</institution>
          ,
          <country country="IT">Italy</country>
        </aff>
        <aff id="aff2">
          <label>2</label>
          <institution>University of Udine - Dept. of Mathematics</institution>
          ,
          <addr-line>Computer Science and Physics</addr-line>
          ,
          <country country="IT">Italy</country>
        </aff>
      </contrib-group>
      <abstract>
        <p>Service mesh technologies have emerged as a powerful tool for managing communications in microservicesoriented architectures. However, enforcing complex access control policies often requires stateful mechanisms, which are not directly supported by policy languages like Rego. To address this limitation, we propose the OPA Wrapper State Manager (OWSM). OWSM maintains a separate state store that can be accessed during policy evaluation. This enables the specification and enforcement of stateful access control policies using Rego's declarative syntax. We evaluate the performance and overhead of OWSM through experiments, demonstrating its efectiveness in enhancing the capabilities of service mesh environments.</p>
      </abstract>
      <kwd-group>
        <kwd>eol&gt;Access control</kwd>
        <kwd>Policy languages</kwd>
        <kwd>Microservices</kwd>
        <kwd>Service mesh</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>1. Introduction</title>
      <p>
        In microservice-oriented architectures, large monolithic applications are split into smaller, independent
services, often implemented using virtual machines or containers. This approach ofers numerous
benefits, including scalability, resilience, and faster development cycles. However, it also introduces
significant complexity, especially when managing inter-service communication and security. Hardcoding
these functionalities into each service implementation introduces redundancy, complicates maintenance,
and increases the risk of misconfigurations [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ].
      </p>
      <p>
        To address these challenges, Service Mesh (SM) technologies have emerged [
        <xref ref-type="bibr" rid="ref2 ref3">2, 3</xref>
        ]. A service mesh is
a dedicated infrastructure layer designed to handle service-to-service communication. It provides a
transparent sidecar proxy for each service, enabling features like load balancing, trafic management,
security, and observability without requiring changes to the application code. By abstracting network
complexity, service meshes decouple control functionalities from the core business logic of applications,
enabling improved maintainability and governance, while ensuring reliable and secure communication.
      </p>
      <p>
        While service meshes ofer powerful capabilities, they demand efective governance mechanisms
to maintain consistency, security, and compliance. To streamline administration and automate policy
enforcement, policy-based approaches have gained traction [
        <xref ref-type="bibr" rid="ref4 ref5 ref6 ref7">4, 5, 6, 7</xref>
        ]. Policy-based management
leverages declarative domain-specific languages to define rules and constraints that govern the behavior
of services. By separating policy from implementation, organizations can centralize policy management,
ensuring consistency and reducing the risk of human error.
      </p>
      <p>
        Among various domain-specific languages for policy authoring, Rego has emerged as a popular
choice for service mesh environments [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ]. Rego’s expressive syntax and powerful evaluation engine
enable the creation of sophisticated policies that can enforce a wide range of requirements, including
security, reliability, and performance.
      </p>
      <p>Controller
Data Plane</p>
      <p>...</p>
      <p>Service A
Sidecar Proxy</p>
      <p>Service Z
Sidecar Proxy</p>
      <p>Service</p>
      <p>Rego’s functional and declarative nature allows it to access a data store for policy evaluation, but it
is limited to read-only operations. This restriction can hinder the specification of access policies that
require maintaining and updating state. For instance, a policy enforcing a rate limit of 10 requests per
hour from service  to service  necessitates tracking access counts and timestamps. Similarly, as in
Bell-LaPadula model, a policy granting  access to service  based on ’s lack of access to service 
requires remembering the “ to ” access history.</p>
      <p>These scenarios highlight the need for stateful policy enforcement, which is not directly supported by
Rego’s core capabilities. In fact, in these cases the state must be updated by the services, thus violating
the separation between business logic and policy specification.</p>
      <p>To address the limitations of Rego’s stateless nature, in this paper we introduce the Open policy
agent Wrapper State Manager (OWSM). OWSM maintains a separate state store to track policy-specific
information, which can be accessed by Rego engine during policy evaluation. From Rego’s JSON
response, OWSM extracts state update instructions and forwards the final authorization decision to the
OPA agent, sidecar to the real service. By leveraging OWSM, we can write stateful policies directly in
Rego without modifying its syntax or evaluation engine. In this way, services do not need to update
the state with policy-specific information, thus keeping business logic and policy specification well
separated. Moreover, thanks to controlled access to avoid inconsistencies, the data store can be shared
across multiple Rego engines, allowing for eficient concurrent access to policy-specific information.
Synopsis. In Section 2, we provide an overview of service meshes, OPA and Rego. To address its
limitations, we introduce the OPA Wrapper State Manager (OWSM) in Section 3. In Section 4, we present
the results of experiments conducted to evaluate the impact of OWSM. Finally, we conclude in Section 5,
summarizing our findings and outlining directions for future work.</p>
    </sec>
    <sec id="sec-2">
      <title>2. Background and related works</title>
      <sec id="sec-2-1">
        <title>2.1. Service Meshes</title>
        <p>A Service Mesh typically consists of two main components: a controller and a set of sidecar proxies
(Figure 1a). The sidecar proxies form the data plane network, which directly handles the flow of requests
between microservices. Each proxy is responsible for intercepting all incoming and outgoing trafic to
its service, enforcing the policies received from the controller on a separate control plane.</p>
        <p>SMs can have multiple goals, here we focus on their role in authorization and authentication.
Authorization determines which services or users are permitted to perform specific actions on resources, while
authentication ensures that only legitimate services can communicate with each other. Compared to
traditional orchestrator policies, SMs enable more fine-grained access control and identity management.
A key advantage of SMs is their centralized policy enforcement, which simplifies the management of
security policies across a distributed environment. Policies are defined centrally and propagated to
sidecar proxies, which locally enforce the policies by intercepting and evaluating requests, thus ensuring
decentralized decision-making. For each intercepted request, a proxy evaluates the authorization policy
against the received data and metadata, such as source service identity, user attributes, request headers,
and requested actions. Based on the policy evaluation, the sidecar proxy decides whether to allow or
deny the request. This enforcement occurs transparently to the services, ensuring security without
requiring modifications to application code.</p>
      </sec>
      <sec id="sec-2-2">
        <title>2.2. Security Policies in Distributed Applications</title>
        <p>The challenge of expressing security policies in distributed applications has been a major focus of
research and development in recent years. Existing solutions can be categorized into two approaches:
Policy via Configuration Files and Policy-as-Code.</p>
        <p>
          Configuration files are collections of key-value pairs used for defining system configurations and
behaviors. This approach is widely adopted in cloud computing, including service meshes. Notable
examples include Istio [
          <xref ref-type="bibr" rid="ref3">3</xref>
          ] and Linkerd [
          <xref ref-type="bibr" rid="ref8">8</xref>
          ], which leverage configuration files to encode policies in a
structured and reproducible manner. However, these files inherently lack support for conditional logic,
complex data structures, and arithmetic operations. This limitation in expressiveness hinders their
suitability for defining intricate or dynamic policy requirements.
        </p>
        <p>
          On the other hand, the Policy-as-Code paradigm [
          <xref ref-type="bibr" rid="ref6">6</xref>
          ] advocates for expressing security policies through
specialized programming languages. Diferently from configuration files, this approach enables complex
constructs like arithmetic operations and conditional control flows, ofering enhanced expressiveness
and flexibility. A pioneering example of this paradigm is XACML [
          <xref ref-type="bibr" rid="ref9">9</xref>
          ], which represents access control
policies using XML files. XACML policies support also obligations, i.e., generic efects that have to be
executed by the Policy Enforcement Point before applying the authorization decision. However, the
XACML specification does not encompass the design or implementation of authorization agents (there
called Policy Decision Points). Building on XACML, [
          <xref ref-type="bibr" rid="ref10">10</xref>
          ] introduced FACPL, a language designed for
specifying real-world access control policies with a concise yet expressive syntax and a rigorously defined
denotational semantics. More recent proposals include OpenFGA [
          <xref ref-type="bibr" rid="ref4">4</xref>
          ], a fine-grained authorization
engine drawing inspiration from Google’s Zanzibar [
          <xref ref-type="bibr" rid="ref7">7</xref>
          ], and Cedar [
          <xref ref-type="bibr" rid="ref11">11</xref>
          ], a programming language for
access control developed by AWS Labs, whose semantics is formalized and verified in Lean [
          <xref ref-type="bibr" rid="ref12">12</xref>
          ].
        </p>
        <p>
          One of the most widespread language of this category is Rego [
          <xref ref-type="bibr" rid="ref5">5</xref>
          ], part of the Open Policy Agent
(OPA) project. Rego manipulates semistructured data (in JSON format): when evaluating a request, Rego
produces an output encapsulating the results of the policy evaluation. Due to this flexibility, Rego has
been used in various domains, ranging from cloud compliance automation to authoritative nameserver
architecture [
          <xref ref-type="bibr" rid="ref13 ref14 ref15">13, 14, 15</xref>
          ]. Moreover, policies written in XACML can be translated to Rego, and vice
versa. The widespread adoption and growing interest in Rego motivated us to focus on extending OPA’s
functionality, the oficial authorization engine for Rego, to address its current limitations.
        </p>
        <p>A Rego policy is a collection of rules (see Listing 1). Each rule comprises a head, which defines the
decision or value to be computed, and a body, which consists of a set of conditions or queries that
must evaluate to true for the rule to be applicable. To make decisions, OPA can access the information
provided in the request (Listing 3) and possibly additional data (Listing 2) from the evaluation context.</p>
        <p>As Figure 1b shows, OPA performs the following steps to evaluate a policy: 1. OPA accepts
JSONformatted inputs representing the request; 2. OPA interprets Rego rules to compute a decision based
on the request and data; 3. OPA returns the evaluation outcome to the requester as a JSON response,
which contains the outputs of all the evaluated rules.</p>
        <p>Despite the versatility of Rego, certain use cases remain challenging due to its stateless nature. The
inability to manage or persist data across requests hinders Rego’s applicability in scenarios that require
stateful paradigms. In fact, in these situations the update of the data object is on the programmer of the
services, thus violating the separation principle between policy specification and business logic.
Listing 1: Example of Rego policy for RBAC.</p>
        <p>Listing 3: Input for the RBAC example.</p>
      </sec>
    </sec>
    <sec id="sec-3">
      <title>3. OWSM: OPA Wrapper State Manager</title>
      <p>In this section we present OPA Wrapper State Manager (OWSM), whose aim is to extended OPA with
state management capabilities. By using OWSM, developers are freed from the burden of managing
state directly within their application’s business logic in scenarios where persistent state is crucial.</p>
      <p>An example of an inherently stateful policy is the one regulating access to a service API where each
call costs a token; each user is given a certain number of tokens at the beginning of the month. The
policy has to keep track of token expenditure, and to reset token counters once a month. This can not
be expressed in traditional policy engines without the introduction of additional elements that modify
and maintain the number of available tokens.</p>
      <p>
        Another example comes from security concerns, such as those investigated in [
        <xref ref-type="bibr" rid="ref16 ref17">16, 17</xref>
        ]. Let us consider
three services ,  and  which run at diferent levels of clearance, e.g.,  is at higher level than ;
according to the Bell-LaPadula security model, we want to prevent data leakage from  towards .
To ensure this property, we want to forbid ’s requests to communicate with  if  has previously
communicated with . Also in this case, we need to maintain the status of communication between
services and this can be accomplished by traditional policy engines only with the introduction of
additional stateful elements in the services themselves.
      </p>
      <p>Our solution relies on wrapping the OPA engine with a custom API that interacts with a datastore
in order to maintain and modify a state at runtime. Comparing with Figure 1a, a sidecar proxy will
interact with an OWSM instance, permitting or not a request access. There can be multiple OWSM
instances, one for each sidecar proxy in the service mesh.</p>
      <sec id="sec-3-1">
        <title>3.1. Requirement definitions</title>
        <p>A core requirement for our system is the inclusion of primitives for reading from and writing to a
state that persists across multiple policy queries. These primitives enable a policy decision engine to
dynamically update the data upon which decisions are made.</p>
        <p>The state must be accessible by multiple instances of the decision engine. Consider a service mesh
where decision engines are deployed as sidecar proxies alongside multiple replicas of a web server
ofering an API. If we aim to protect this API with the aforementioned “limited-token” middleware, the
state must be maintained consistently across all replicas. This centralized state management is crucial
to ensure that the policy “a user can access the API up to  times, where  is the number of tokens
available to the user” is enforced uniformly across all replicas.</p>
        <p>To achieve this, our system should consist of two components: (1) a policy decision engine that can
interact with (2) a datastore. We choose OPA as the underlying policy engine and Rego as the policy
language. This choice is based on the fact that its output is a JSON object, rendering it flexible and
aiding the integration with our system.</p>
      </sec>
      <sec id="sec-3-2">
        <title>3.2. Design and Implementation</title>
        <p>We avoid modifying the decision engine directly by wrapping it with an API. This API receives queries,
retrieves the latest state from the datastore, and forwards both to OPA. Our implementation is depicted
in Figure 2. The datastore must implement some locking mechanism to ensure consistency in presence
of concurrent requests. The minimal functional API for the store must thus contain four endpoints: two
to respectively get and set the state, and two to interact with the locking subsystem.</p>
        <p>The modification of the state is achieved by reserving a special policy name, i.e., state; this policy
can be defined by Rego rules (as any other policy), yielding a standard JSON dictionary. This output is
interpreted by the wrapper, which extracts the keys that need modification in the datastore, removing
them from the JSON. The datastore is updated accordingly, and then unlocked, before returning the
decision result to the requesting service.</p>
        <p>From an implementation point of view, we decided to use the Go programming language to implement
both the wrapper and the datastore. This choice has been made due to the fact that OPA is written in
Go and ofers a native Go library to interact with its internals.</p>
        <p>The API of the datastore is ofered via gRPC, an open source, high performance RPC framework.
More specifically, the datastore exposes a gRPC service, called Store, with four procedures: Get, to
retrieve the state; Put, to update a key with a new value; Lock, to guarantee mutually exclusive access
to concurrent clients; and Unlock, to release the lock. The wrapper communicates with the datastore
through gRPC and, finally, exposes to the final user an HTTP endpoint to allow for submission of
decision queries, as does OPA when used as an HTTP API. We use /query as the endpoint name.
2
OPA</p>
        <p>4
State
updater
policy
.rego
5
3</p>
        <p>To validate our system, we implemented the “token counter” and “three microservices” use cases
described above, and tested them using OWSM yielding a null error rate, thus proving the higher
expressiveness of OWSM compared to OPA. See Figure 3 for the corresponding code.</p>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>4. Experimental Evaluation</title>
      <p>
        In this section, we perform an experimental evaluation of OWSM to asses the eficiency and overhead
introduced in comparison to pure OPA. To this end, we consider use cases that can be expressed in both
pure OPA and OWSM, i.e., without any stateful information. These use cases are taken from the Access
Control section of the Rego Playground [
        <xref ref-type="bibr" rid="ref18">18</xref>
        ].
      </p>
      <p>
        Use case 1 considers an RBAC model for the Pet Store API [
        <xref ref-type="bibr" rid="ref19">19</xref>
        ], which allows users to view, adopt,
and update pets. The policy governs which users can perform actions on specific resources, following a
classic Role-based Access Control (RBAC) model. Users are assigned roles, which are granted permissions
to act on certain resources.
      </p>
      <p>Use case 2 follows an Attribute-based Access Control (ABAC) model for the same API: users,
resources, and actions are associated with attributes, over which access decisions are made.</p>
      <p>Use case 3 aims to mitigate the “Role Explosion” problem in RBAC through hierarchical roles. Role
Explosion occurs when the number of roles in a RBAC grows exponentially as the number of users and
permissions increases, leading to a complex and unmanageable set of roles. This example shows how to
implement a simple hierarchical access control policy using a graph of related roles. Hierarchical roles
help address this issue by allowing roles to inherit permissions from other roles, reducing redundancy
and simplifying role management. Specifically, users submit requests with one or more roles, and the
policy checks if the user has the required permission by traversing the role hierarchy.</p>
      <sec id="sec-4-1">
        <title>4.1. Research Questions and Methodology</title>
        <p>RQ1 [Time performance] What are the characteristics of the overhead introduced by OWSM when
handling sequences of requests?</p>
        <p>Understanding the overhead introduced by OWSM is important to evaluate its impact on maintaining
a good time performance during request handling. This overhead includes both the computational and
latency costs of managing state modification and wrapping pure OPA.</p>
        <p>RQ2 [Access scalability] What is the behaviour of OWSM as the number of concurrent requests increases?</p>
        <p>Understanding the behaviour of OWSM under increasing concurrency (i.e., number of concurrent
requests to the datastore) is essential for evaluating its concurrent scalability. This requires analysing
response times as the number of simultaneous requests grows.</p>
        <p>To evaluate response timing, we rely on “Apache Benchmark” (ab) version 2.4.62, a standard tool for
benchmarking web servers. We patched the source code of ab to support outputting timings in
microseconds, instead of rounding them to the nearest millisecond. Our patch modifies the ap_round_ms macro
to remove the rounding operation and return the raw runtime time value (already in microseconds) and
does not modify the functionality of ab.</p>
        <p>For comparing OPA and OWSM, we run experiments on both for each use case. At the beginning of
each experiment, we perform a warmup of OPA and OWSM by running 10 non-concurrent requests.
This avoids spurious high times from the first system query.</p>
        <p>For RQ1 we run batches of 100, 200, 400, 800, 1600, 3200, 6400, 12800, 25600, 51200 and 102400
requests to both OPA and OWSM, and we calculate the mean and the interquartile range (IQR) of the
response times for each batch.</p>
        <p>For RQ2 we run 50000 total requests with increasing levels of concurrency (100, 650, 1200, 1750, 2300,
2850, 3400, 3950, 4500, 5050, 5600, 6150, 6700, 7250, 7800, 8350, 8900, 9450 and 10000 parallel requests).
We then calculate the mean and IQR of the response times for each concurrency level.</p>
        <p>We use a server with Debian GNU/Linux 12 at kernel version 6.10-28 with a Intel(R) Core(TM)
i9-10900 CPU @ 2.80GHz (20 threads) and 128 GB of RAM.</p>
      </sec>
      <sec id="sec-4-2">
        <title>4.2. Threats to validity</title>
        <p>To account for the inherent randomness in the measurements, we performed multiple requests in each
configuration and assessed the statistical significance of the comparison between the IQRs of OPA and
OWSM by using the Mann–Whitney U test.This test provides a measure of whether one group tends
to have larger values than the other. Specifically, we calculated the U statistic and its corresponding
p-value to determine if the observed diferences between the systems were statistically significant at a
significance level of  = 0.05.</p>
        <p>Our assessment of the observed trends is supported by fitting a linear regression model to the data
and analysing the coeficient of determination ( 2).</p>
        <p>We mitigate the threats to external validity (i.e. generalization) by considering three representative
and diverse use cases directly drawn from the oficial OPA playground.</p>
        <p>(a) Time performance (use case 1)
(b) Time performance (use case 2)
(c) Time performance (use case 3)</p>
      </sec>
      <sec id="sec-4-3">
        <title>4.3. Results</title>
        <p>Figures 4a to 4c show the overhead introduced by OWSM over OPA in the three stateless use cases
under consideration. Some variability in response times for individual queries can be introduced by the
fact that OWSM consists of two separate parts (i.e. the wrapper and the datastore) communicating over
an API. This is reflected in the significantly higher IQR shown by OWSM (p-value &lt; 0.05).
(a) Concurrent scalability (use case 1)
(b) Concurrent scalability (use case 2)
(c) Concurrent scalability (use case 3)</p>
        <p>However, the overhead remains nearly constant (|slope| &lt; 0.001, p-value &gt; 0.05) across all measured
points. This is a desirable outcome, as it indicates that the overhead introduced by OWSM does not
increase as the sequence of consecutive requests progresses. A constant overhead means that OWSM
can handle multiple consecutive requests without accumulating additional delays, ensuring consistent
performance over time. This is important for maintaining predictability and reliability in real-world
use cases, where repeated requests are common.</p>
        <p>Answer to RQ1: OWSM introduces an overhead of ∼ 1 millisecond, which remains constant thorough
the whole sequence of requests.</p>
        <p>Figures 5a to 5c show that the overhead for concurrent requests introduced by OWSM follows a linear
trend (2 &gt; 0.999 , p-value &lt; 0.05). This is due to the fact that the implemented locking mechanism
in the datastore allows only one request to be processed at a time, even when the store is not modified.
This result is consistent with the previous experiment, as for 10000 concurrent requests the elapsed
time per request is ∼ 10000 milliseconds.</p>
        <p>Remarkably, OWSM demonstrates much more predictable response times in comparison to OPA,
with a significantly lower IQR. In fact, the mean response time for OWSM is ∼ 10× lower than for OPA,
highlighting its improved consistency in handling concurrent requests.</p>
        <p>Answer to RQ2: At increasing concurrency level, the response time for OWSM increases linearly, with
higher temporal stability.</p>
        <p>Our experiments quantify the expected performance overhead of OWSM compared to OPA, a
consequence of OWSM’s added functionality. The consistent overhead observed across request sequences
and the stable performance under increasing concurrency suggest that OWSM ofers a promising
solution to OPA’s lack of state management primitives. While our prototype’s basic locking mechanism
efectively maintains temporal stability, future work could explore more sophisticated concurrency
control mechanisms to further enhance performance.</p>
      </sec>
    </sec>
    <sec id="sec-5">
      <title>5. Conclusions</title>
      <p>In this paper we introduced the OPA Wrapper State Manager (OWSM), a novel solution designed to
extend the capabilities of the OPA authorization engine by incorporating state management for Rego
policies. To validate the practical applicability of OWSM, we have successfully applied it to various
scenarios that demand stateful access control. Our solution allows to maintain the definition of (stateful)
access policies just as Rego rules, without the need of modifying the business logic of services. To assess
the performance impact of OWSM, we conducted empirical evaluations comparing it to pure OPA.
Our findings demonstrate that OWSM maintains temporal stability even under increasing concurrency
levels, while the introduced overhead remains relatively low, making it a viable solution for service
mesh environments.</p>
      <p>Future work includes generalizing our findings to a broader range of real-world use cases, also
derived from software repositories. We also plan to investigate advanced locking mechanisms to
improve eficiency and concurrency while maintaining temporal stability; this includes exploring
techniques like caching data subsets within the wrapper to reduce RPC accesses. Furthermore, we
aim to statically verify properties of Rego policies to prevent errors and vulnerabilities. Finally, we are
interested in integrating NLP to bridge the gap between informal natural language descriptions and the
definition and validation of stateful Rego security policies.</p>
    </sec>
    <sec id="sec-6">
      <title>Acknowledgments</title>
      <p>This work was partially supported by the Department Strategic Project on Artificial Intelligence of the
University of Udine (2020-25), and the M4C2 I1.3 “SEcurity and RIghts In the CyberSpace - SERICS”
(PE00000014 - CUP H73C2200089001, D33C22001300002), under the National Recovery and Resilience
Plan (NRRP) funded by the European Union - NextGenerationEU.</p>
    </sec>
    <sec id="sec-7">
      <title>Declaration on Generative AI</title>
      <p>During the preparation of this work, the authors used ChatGPT, Reverso Context in order to: Grammar
and spelling check, paraphrase and reword. After using this tool/service, the authors reviewed and
edited the content as needed and take full responsibility for the publication’s content.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>W.</given-names>
            <surname>Li</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Y.</given-names>
            <surname>Lemieux</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Gao</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Z.</given-names>
            <surname>Zhao</surname>
          </string-name>
          , Y. Han,
          <article-title>Service mesh: Challenges, state of the art, and future research opportunities</article-title>
          ,
          <source>in: 2019 IEEE International Conference on Service-Oriented System Engineering (SOSE)</source>
          ,
          <year>2019</year>
          , pp.
          <fpage>122</fpage>
          -
          <lpage>1225</lpage>
          . doi:
          <volume>10</volume>
          .1109/SOSE.
          <year>2019</year>
          .
          <volume>00026</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>M.</given-names>
            <surname>Ganguli</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Ranganath</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Ravisundar</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Layek</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Ilangovan</surname>
          </string-name>
          , E. Verplanke,
          <article-title>Challenges and opportunities in performance benchmarking of service mesh for the edge</article-title>
          ,
          <source>in: 2021 IEEE International Conference on Edge Computing (EDGE)</source>
          ,
          <year>2021</year>
          , pp.
          <fpage>78</fpage>
          -
          <lpage>85</lpage>
          . doi:
          <volume>10</volume>
          .1109/EDGE53862.
          <year>2021</year>
          .
          <volume>00020</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>O.</given-names>
            <surname>Sheikh</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Dikaleh</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Mistry</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Pape</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Felix</surname>
          </string-name>
          ,
          <article-title>Modernize digital applications with microservices management using the Istio service mesh</article-title>
          ,
          <source>in: CASCON '18: Proceedings of the 28th Annual International Conference on Computer Science and Software Engineering</source>
          , IBM,
          <year>2018</year>
          , p.
          <fpage>359</fpage>
          -
          <lpage>360</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          <article-title>[4] OpenFGA, Relationship-based access control made fast, scalable</article-title>
          , and easy to use,
          <year>2024</year>
          . Available at https://openfga.dev/.
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5] OpenPolicyAgent, Rego documentation,
          <year>2024</year>
          . Available at https://www.openpolicyagent.org/docs/ latest/policy-language/.
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>S.</given-names>
            <surname>Pallewatta</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M. A.</given-names>
            <surname>Babar</surname>
          </string-name>
          ,
          <article-title>Towards secure management of edge-cloud IoT microservices using policy as code</article-title>
          ,
          <source>in: Proc. European Conference on Software Architecture (ECSA)</source>
          , Springer,
          <year>2024</year>
          , pp.
          <fpage>270</fpage>
          -
          <lpage>287</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>R.</given-names>
            <surname>Pang</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Caceres</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Burrows</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Z.</given-names>
            <surname>Chen</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            <surname>Dave</surname>
          </string-name>
          ,
          <string-name>
            <given-names>N.</given-names>
            <surname>Germer</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Golynski</surname>
          </string-name>
          ,
          <string-name>
            <given-names>K.</given-names>
            <surname>Graney</surname>
          </string-name>
          ,
          <string-name>
            <given-names>N.</given-names>
            <surname>Kang</surname>
          </string-name>
          ,
          <string-name>
            <given-names>L.</given-names>
            <surname>Kissner</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J. L.</given-names>
            <surname>Korn</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Parmar</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C. D.</given-names>
            <surname>Richards</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Wang</surname>
          </string-name>
          ,
          <article-title>Zanzibar: Google's consistent, global authorization system</article-title>
          ,
          <source>in: 2019 USENIX Annual Technical Conference (ATC '19)</source>
          ,
          <year>2019</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <surname>Linkerd</surname>
          </string-name>
          ,
          <source>The world's most advanced service mesh</source>
          ,
          <year>2024</year>
          . Available at https://linkerd.io/.
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>M.</given-names>
            <surname>Lorch</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Proctor</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Lepro</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Kafura</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Shah</surname>
          </string-name>
          ,
          <article-title>First experiences using xacml for access control in distributed systems</article-title>
          ,
          <source>in: Proc. 2003 ACM workshop on XML security</source>
          ,
          <year>2003</year>
          , pp.
          <fpage>25</fpage>
          -
          <lpage>37</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <given-names>A.</given-names>
            <surname>Margheri</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Masi</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Pugliese</surname>
          </string-name>
          ,
          <string-name>
            <given-names>F.</given-names>
            <surname>Tiezzi</surname>
          </string-name>
          ,
          <article-title>A rigorous framework for specification, analysis and enforcement of access control policies</article-title>
          ,
          <source>IEEE Trans. Software Eng</source>
          .
          <volume>45</volume>
          (
          <year>2019</year>
          )
          <fpage>2</fpage>
          -
          <lpage>33</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <given-names>J. W.</given-names>
            <surname>Cutler</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Disselkoen</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Eline</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>He</surname>
          </string-name>
          ,
          <string-name>
            <given-names>K.</given-names>
            <surname>Headley</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Hicks</surname>
          </string-name>
          ,
          <string-name>
            <given-names>K.</given-names>
            <surname>Hietala</surname>
          </string-name>
          ,
          <string-name>
            <given-names>E.</given-names>
            <surname>Ioannidis</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Kastner</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Mamat</surname>
          </string-name>
          , et al.,
          <article-title>Cedar: A new language for expressive, fast, safe, and analyzable authorization</article-title>
          ,
          <source>Proceedings of the ACM on Programming Languages</source>
          <volume>8</volume>
          (
          <year>2024</year>
          )
          <fpage>670</fpage>
          -
          <lpage>697</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <given-names>C.</given-names>
            <surname>Disselkoen</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Eline</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>He</surname>
          </string-name>
          ,
          <string-name>
            <given-names>K.</given-names>
            <surname>Headley</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Hicks</surname>
          </string-name>
          ,
          <string-name>
            <given-names>K.</given-names>
            <surname>Hietala</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Kastner</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Mamat</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>McCutchen</surname>
          </string-name>
          ,
          <string-name>
            <given-names>N.</given-names>
            <surname>Rungta</surname>
          </string-name>
          , et al.,
          <article-title>How we built Cedar: A verification-guided approach</article-title>
          ,
          <source>in: Proc. 32nd ACM International Conference on the Foundations of Software Engineering</source>
          ,
          <year>2024</year>
          , pp.
          <fpage>351</fpage>
          -
          <lpage>357</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [13]
          <string-name>
            <given-names>J.</given-names>
            <surname>Larisch</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T. A.</given-names>
            <surname>Thijm</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Ahmad</surname>
          </string-name>
          , P. Wu,
          <string-name>
            <given-names>T.</given-names>
            <surname>Arnfeld</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Fayed</surname>
          </string-name>
          ,
          <article-title>Topaz: Declarative and verifiable authoritative DNS at CDN-scale</article-title>
          ,
          <source>in: Proceedings of the ACM SIGCOMM 2024 Conference</source>
          ,
          <year>2024</year>
          , pp.
          <fpage>891</fpage>
          -
          <lpage>903</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          [14]
          <string-name>
            <given-names>R.</given-names>
            <surname>Oku</surname>
          </string-name>
          ,
          <string-name>
            <given-names>K.</given-names>
            <surname>Shiomoto</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Y.</given-names>
            <surname>Ohba</surname>
          </string-name>
          ,
          <article-title>Decentralized identifier and access control based architecture for privacy-sensitive data distribution service</article-title>
          ,
          <source>in: 2022 IEEE 8th World Forum on Internet of Things (WF-IoT)</source>
          ,
          <year>2022</year>
          , pp.
          <fpage>1</fpage>
          -
          <lpage>6</lpage>
          . doi:
          <volume>10</volume>
          .1109/WF-IoT54382.
          <year>2022</year>
          .
          <volume>10152128</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          [15]
          <string-name>
            <given-names>A.</given-names>
            <surname>Paul</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Manoj</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Udhayakumar</surname>
          </string-name>
          ,
          <article-title>Amazon Web Services cloud compliance automation with Open Policy Agent</article-title>
          , in: 2024
          <source>International Conference on Expert Clouds and Applications (ICOECA)</source>
          , IEEE,
          <year>2024</year>
          , pp.
          <fpage>313</fpage>
          -
          <lpage>317</lpage>
          . doi:
          <volume>10</volume>
          .1109/ICOECA62351.
          <year>2024</year>
          .
          <volume>00063</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          [16]
          <string-name>
            <given-names>V.</given-names>
            <surname>Casola</surname>
          </string-name>
          ,
          <string-name>
            <given-names>V.</given-names>
            <surname>Riccio</surname>
          </string-name>
          , G. Tricomi, G. Merlino,
          <string-name>
            <given-names>P.</given-names>
            <surname>Di Gianantonio</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B.</given-names>
            <surname>Crispo</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Rak</surname>
          </string-name>
          ,
          <string-name>
            <surname>A</surname>
          </string-name>
          . Puliafito, SecCO-OC:
          <article-title>securing microservice-base apps</article-title>
          ,
          <source>in: Proc. 10th Italian Conference on ICT for Smart Cities and Comunities</source>
          ,
          <year>2024</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          [17]
          <string-name>
            <given-names>L.</given-names>
            <surname>Verderame</surname>
          </string-name>
          ,
          <string-name>
            <given-names>L.</given-names>
            <surname>Caviglione</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Carbone</surname>
          </string-name>
          ,
          <string-name>
            <surname>A</surname>
          </string-name>
          . Merlo, SecCo: Automated services
          <article-title>to secure containers in the DevOps paradigm</article-title>
          ,
          <source>in: Proc. 2023 International Conference on Research in Adaptive and Convergent Systems, RACS</source>
          <year>2023</year>
          , ACM,
          <year>2023</year>
          , pp.
          <volume>10</volume>
          :
          <fpage>1</fpage>
          -
          <lpage>6</lpage>
          . URL: https://doi.org/10.1145/3599957. 3606222. doi:
          <volume>10</volume>
          .1145/3599957.3606222.
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          [18]
          <string-name>
            <surname>Sytra</surname>
          </string-name>
          , The Rego playground,
          <year>2024</year>
          . Available at https://play.openpolicyagent.org/.
        </mixed-citation>
      </ref>
      <ref id="ref19">
        <mixed-citation>
          [19]
          <string-name>
            <surname>Swagger</surname>
          </string-name>
          ,
          <source>Swagger Petstore - OpenAPI 3.0</source>
          ,
          <year>2024</year>
          . Available at https://petstore3.swagger.io/.
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>