service_perimeter.proto 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472
  1. // Copyright 2022 Google LLC
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. syntax = "proto3";
  15. package google.identity.accesscontextmanager.v1;
  16. import "google/api/resource.proto";
  17. import "google/protobuf/timestamp.proto";
  18. option csharp_namespace = "Google.Identity.AccessContextManager.V1";
  19. option go_package = "google.golang.org/genproto/googleapis/identity/accesscontextmanager/v1;accesscontextmanager";
  20. option java_multiple_files = true;
  21. option java_outer_classname = "ServicePerimeterProto";
  22. option java_package = "com.google.identity.accesscontextmanager.v1";
  23. option objc_class_prefix = "GACM";
  24. option php_namespace = "Google\\Identity\\AccessContextManager\\V1";
  25. option ruby_package = "Google::Identity::AccessContextManager::V1";
  26. // `ServicePerimeter` describes a set of Google Cloud resources which can freely
  27. // import and export data amongst themselves, but not export outside of the
  28. // `ServicePerimeter`. If a request with a source within this `ServicePerimeter`
  29. // has a target outside of the `ServicePerimeter`, the request will be blocked.
  30. // Otherwise the request is allowed. There are two types of Service Perimeter -
  31. // Regular and Bridge. Regular Service Perimeters cannot overlap, a single
  32. // Google Cloud project can only belong to a single regular Service Perimeter.
  33. // Service Perimeter Bridges can contain only Google Cloud projects as members,
  34. // a single Google Cloud project may belong to multiple Service Perimeter
  35. // Bridges.
  36. message ServicePerimeter {
  37. option (google.api.resource) = {
  38. type: "accesscontextmanager.googleapis.com/ServicePerimeter"
  39. pattern: "accessPolicies/{access_policy}/servicePerimeters/{service_perimeter}"
  40. };
  41. // Specifies the type of the Perimeter. There are two types: regular and
  42. // bridge. Regular Service Perimeter contains resources, access levels, and
  43. // restricted services. Every resource can be in at most ONE
  44. // regular Service Perimeter.
  45. //
  46. // In addition to being in a regular service perimeter, a resource can also
  47. // be in zero or more perimeter bridges. A perimeter bridge only contains
  48. // resources. Cross project operations are permitted if all effected
  49. // resources share some perimeter (whether bridge or regular). Perimeter
  50. // Bridge does not contain access levels or services: those are governed
  51. // entirely by the regular perimeter that resource is in.
  52. //
  53. // Perimeter Bridges are typically useful when building more complex toplogies
  54. // with many independent perimeters that need to share some data with a common
  55. // perimeter, but should not be able to share data among themselves.
  56. enum PerimeterType {
  57. // Regular Perimeter.
  58. PERIMETER_TYPE_REGULAR = 0;
  59. // Perimeter Bridge.
  60. PERIMETER_TYPE_BRIDGE = 1;
  61. }
  62. // Required. Resource name for the ServicePerimeter. The `short_name`
  63. // component must begin with a letter and only include alphanumeric and '_'.
  64. // Format:
  65. // `accessPolicies/{access_policy}/servicePerimeters/{service_perimeter}`
  66. string name = 1;
  67. // Human readable title. Must be unique within the Policy.
  68. string title = 2;
  69. // Description of the `ServicePerimeter` and its use. Does not affect
  70. // behavior.
  71. string description = 3;
  72. // Output only. Time the `ServicePerimeter` was created in UTC.
  73. google.protobuf.Timestamp create_time = 4;
  74. // Output only. Time the `ServicePerimeter` was updated in UTC.
  75. google.protobuf.Timestamp update_time = 5;
  76. // Perimeter type indicator. A single project is
  77. // allowed to be a member of single regular perimeter, but multiple service
  78. // perimeter bridges. A project cannot be a included in a perimeter bridge
  79. // without being included in regular perimeter. For perimeter bridges,
  80. // the restricted service list as well as access level lists must be
  81. // empty.
  82. PerimeterType perimeter_type = 6;
  83. // Current ServicePerimeter configuration. Specifies sets of resources,
  84. // restricted services and access levels that determine perimeter
  85. // content and boundaries.
  86. ServicePerimeterConfig status = 7;
  87. // Proposed (or dry run) ServicePerimeter configuration. This configuration
  88. // allows to specify and test ServicePerimeter configuration without enforcing
  89. // actual access restrictions. Only allowed to be set when the
  90. // "use_explicit_dry_run_spec" flag is set.
  91. ServicePerimeterConfig spec = 8;
  92. // Use explicit dry run spec flag. Ordinarily, a dry-run spec implicitly
  93. // exists for all Service Perimeters, and that spec is identical to the
  94. // status for those Service Perimeters. When this flag is set, it inhibits the
  95. // generation of the implicit spec, thereby allowing the user to explicitly
  96. // provide a configuration ("spec") to use in a dry-run version of the Service
  97. // Perimeter. This allows the user to test changes to the enforced config
  98. // ("status") without actually enforcing them. This testing is done through
  99. // analyzing the differences between currently enforced and suggested
  100. // restrictions. use_explicit_dry_run_spec must bet set to True if any of the
  101. // fields in the spec are set to non-default values.
  102. bool use_explicit_dry_run_spec = 9;
  103. }
  104. // `ServicePerimeterConfig` specifies a set of Google Cloud resources that
  105. // describe specific Service Perimeter configuration.
  106. message ServicePerimeterConfig {
  107. // Specifies how APIs are allowed to communicate within the Service
  108. // Perimeter.
  109. message VpcAccessibleServices {
  110. // Whether to restrict API calls within the Service Perimeter to the list of
  111. // APIs specified in 'allowed_services'.
  112. bool enable_restriction = 1;
  113. // The list of APIs usable within the Service Perimeter. Must be empty
  114. // unless 'enable_restriction' is True. You can specify a list of individual
  115. // services, as well as include the 'RESTRICTED-SERVICES' value, which
  116. // automatically includes all of the services protected by the perimeter.
  117. repeated string allowed_services = 2;
  118. }
  119. // Specifies the types of identities that are allowed access in either
  120. // [IngressFrom]
  121. // [google.identity.accesscontextmanager.v1.ServicePerimeterConfig.IngressFrom]
  122. // or [EgressFrom]
  123. // [google.identity.accesscontextmanager.v1.ServicePerimeterConfig.EgressFrom]
  124. // rules.
  125. enum IdentityType {
  126. // No blanket identity group specified.
  127. IDENTITY_TYPE_UNSPECIFIED = 0;
  128. // Authorize access from all identities outside the perimeter.
  129. ANY_IDENTITY = 1;
  130. // Authorize access from all human users outside the perimeter.
  131. ANY_USER_ACCOUNT = 2;
  132. // Authorize access from all service accounts outside the perimeter.
  133. ANY_SERVICE_ACCOUNT = 3;
  134. }
  135. // An allowed method or permission of a service specified in [ApiOperation]
  136. // [google.identity.accesscontextmanager.v1.ServicePerimeterConfig.ApiOperation].
  137. message MethodSelector {
  138. // The API method name or Cloud IAM permission name to allow.
  139. oneof kind {
  140. // Value for `method` should be a valid method name for the corresponding
  141. // `service_name` in [ApiOperation]
  142. // [google.identity.accesscontextmanager.v1.ServicePerimeterConfig.ApiOperation].
  143. // If `*` used as value for `method`, then ALL methods and permissions are
  144. // allowed.
  145. string method = 1;
  146. // Value for `permission` should be a valid Cloud IAM permission for the
  147. // corresponding `service_name` in [ApiOperation]
  148. // [google.identity.accesscontextmanager.v1.ServicePerimeterConfig.ApiOperation].
  149. string permission = 2;
  150. }
  151. }
  152. // Identification for an API Operation.
  153. message ApiOperation {
  154. // The name of the API whose methods or permissions the [IngressPolicy]
  155. // [google.identity.accesscontextmanager.v1.ServicePerimeterConfig.IngressPolicy]
  156. // or [EgressPolicy]
  157. // [google.identity.accesscontextmanager.v1.ServicePerimeterConfig.EgressPolicy]
  158. // want to allow. A single [ApiOperation]
  159. // [google.identity.accesscontextmanager.v1.ServicePerimeterConfig.ApiOperation]
  160. // with `service_name` field set to `*` will allow all methods AND
  161. // permissions for all services.
  162. string service_name = 1;
  163. // API methods or permissions to allow. Method or permission must belong to
  164. // the service specified by `service_name` field. A single [MethodSelector]
  165. // [google.identity.accesscontextmanager.v1.ServicePerimeterConfig.MethodSelector]
  166. // entry with `*` specified for the `method` field will allow all methods
  167. // AND permissions for the service specified in `service_name`.
  168. repeated MethodSelector method_selectors = 2;
  169. }
  170. // The source that [IngressPolicy]
  171. // [google.identity.accesscontextmanager.v1.ServicePerimeterConfig.IngressPolicy]
  172. // authorizes access from.
  173. message IngressSource {
  174. // Allowed ingress source. It can be one of [AccessLevel]
  175. // [google.identity.accesscontextmanager.v1.AccessLevel] or Google
  176. // Cloud resource.
  177. oneof source {
  178. // An [AccessLevel]
  179. // [google.identity.accesscontextmanager.v1.AccessLevel] resource
  180. // name that allow resources within the [ServicePerimeters]
  181. // [google.identity.accesscontextmanager.v1.ServicePerimeter] to be
  182. // accessed from the internet. [AccessLevels]
  183. // [google.identity.accesscontextmanager.v1.AccessLevel] listed must
  184. // be in the same policy as this [ServicePerimeter]
  185. // [google.identity.accesscontextmanager.v1.ServicePerimeter].
  186. // Referencing a nonexistent [AccessLevel]
  187. // [google.identity.accesscontextmanager.v1.AccessLevel] will cause
  188. // an error. If no [AccessLevel]
  189. // [google.identity.accesscontextmanager.v1.AccessLevel] names are
  190. // listed, resources within the perimeter can only be accessed via Google
  191. // Cloud calls with request origins within the perimeter. Example:
  192. // `accessPolicies/MY_POLICY/accessLevels/MY_LEVEL`. If a single `*` is
  193. // specified for `access_level`, then all [IngressSources]
  194. // [google.identity.accesscontextmanager.v1.ServicePerimeterConfig.IngressSource]
  195. // will be allowed.
  196. string access_level = 1;
  197. // A Google Cloud resource that is allowed to ingress the perimeter.
  198. // Requests from these resources will be allowed to access perimeter data.
  199. // Currently only projects are allowed.
  200. // Format: `projects/{project_number}`
  201. // The project may be in any Google Cloud organization, not just the
  202. // organization that the perimeter is defined in. `*` is not allowed, the
  203. // case of allowing all Google Cloud resources only is not supported.
  204. string resource = 2;
  205. }
  206. }
  207. // Defines the conditions under which an [IngressPolicy]
  208. // [google.identity.accesscontextmanager.v1.ServicePerimeterConfig.IngressPolicy]
  209. // matches a request. Conditions are based on information about the source of
  210. // the request. The request must satisfy what is defined in `sources` AND
  211. // identity related fields in order to match.
  212. message IngressFrom {
  213. // Sources that this [IngressPolicy]
  214. // [google.identity.accesscontextmanager.v1.ServicePerimeterConfig.IngressPolicy]
  215. // authorizes access from.
  216. repeated IngressSource sources = 1;
  217. // A list of identities that are allowed access through this ingress
  218. // policy. Should be in the format of email address. The email address
  219. // should represent individual user or service account only.
  220. repeated string identities = 2;
  221. // Specifies the type of identities that are allowed access from outside the
  222. // perimeter. If left unspecified, then members of `identities` field will
  223. // be allowed access.
  224. IdentityType identity_type = 3;
  225. }
  226. // Defines the conditions under which an [IngressPolicy]
  227. // [google.identity.accesscontextmanager.v1.ServicePerimeterConfig.IngressPolicy]
  228. // matches a request. Conditions are based on information about the
  229. // [ApiOperation]
  230. // [google.identity.accesscontextmanager.v1.ServicePerimeterConfig.ApiOperation]
  231. // intended to be performed on the target resource of the request. The request
  232. // must satisfy what is defined in `operations` AND `resources` in order to
  233. // match.
  234. message IngressTo {
  235. // A list of [ApiOperations]
  236. // [google.identity.accesscontextmanager.v1.ServicePerimeterConfig.ApiOperation]
  237. // allowed to be performed by the sources specified in corresponding
  238. // [IngressFrom]
  239. // [google.identity.accesscontextmanager.v1.ServicePerimeterConfig.IngressFrom]
  240. // in this [ServicePerimeter]
  241. // [google.identity.accesscontextmanager.v1.ServicePerimeter].
  242. repeated ApiOperation operations = 1;
  243. // A list of resources, currently only projects in the form
  244. // `projects/<projectnumber>`, protected by this [ServicePerimeter]
  245. // [google.identity.accesscontextmanager.v1.ServicePerimeter] that are
  246. // allowed to be accessed by sources defined in the corresponding
  247. // [IngressFrom]
  248. // [google.identity.accesscontextmanager.v1.ServicePerimeterConfig.IngressFrom].
  249. // If a single `*` is specified, then access to all resources inside the
  250. // perimeter are allowed.
  251. repeated string resources = 2;
  252. }
  253. // Policy for ingress into [ServicePerimeter]
  254. // [google.identity.accesscontextmanager.v1.ServicePerimeter].
  255. //
  256. // [IngressPolicies]
  257. // [google.identity.accesscontextmanager.v1.ServicePerimeterConfig.IngressPolicy]
  258. // match requests based on `ingress_from` and `ingress_to` stanzas. For an
  259. // ingress policy to match, both the `ingress_from` and `ingress_to` stanzas
  260. // must be matched. If an [IngressPolicy]
  261. // [google.identity.accesscontextmanager.v1.ServicePerimeterConfig.IngressPolicy]
  262. // matches a request, the request is allowed through the perimeter boundary
  263. // from outside the perimeter.
  264. //
  265. // For example, access from the internet can be allowed either
  266. // based on an [AccessLevel]
  267. // [google.identity.accesscontextmanager.v1.AccessLevel] or, for traffic
  268. // hosted on Google Cloud, the project of the source network. For access from
  269. // private networks, using the project of the hosting network is required.
  270. //
  271. // Individual ingress policies can be limited by restricting which
  272. // services and/or actions they match using the `ingress_to` field.
  273. message IngressPolicy {
  274. // Defines the conditions on the source of a request causing this
  275. // [IngressPolicy]
  276. // [google.identity.accesscontextmanager.v1.ServicePerimeterConfig.IngressPolicy]
  277. // to apply.
  278. IngressFrom ingress_from = 1;
  279. // Defines the conditions on the [ApiOperation]
  280. // [google.identity.accesscontextmanager.v1.ServicePerimeterConfig.ApiOperation]
  281. // and request destination that cause this [IngressPolicy]
  282. // [google.identity.accesscontextmanager.v1.ServicePerimeterConfig.IngressPolicy]
  283. // to apply.
  284. IngressTo ingress_to = 2;
  285. }
  286. // Defines the conditions under which an [EgressPolicy]
  287. // [google.identity.accesscontextmanager.v1.ServicePerimeterConfig.EgressPolicy]
  288. // matches a request. Conditions based on information about the source of the
  289. // request. Note that if the destination of the request is also protected by a
  290. // [ServicePerimeter]
  291. // [google.identity.accesscontextmanager.v1.ServicePerimeter], then that
  292. // [ServicePerimeter]
  293. // [google.identity.accesscontextmanager.v1.ServicePerimeter] must have
  294. // an [IngressPolicy]
  295. // [google.identity.accesscontextmanager.v1.ServicePerimeterConfig.IngressPolicy]
  296. // which allows access in order for this request to succeed.
  297. message EgressFrom {
  298. // A list of identities that are allowed access through this [EgressPolicy].
  299. // Should be in the format of email address. The email address should
  300. // represent individual user or service account only.
  301. repeated string identities = 1;
  302. // Specifies the type of identities that are allowed access to outside the
  303. // perimeter. If left unspecified, then members of `identities` field will
  304. // be allowed access.
  305. IdentityType identity_type = 2;
  306. }
  307. // Defines the conditions under which an [EgressPolicy]
  308. // [google.identity.accesscontextmanager.v1.ServicePerimeterConfig.EgressPolicy]
  309. // matches a request. Conditions are based on information about the
  310. // [ApiOperation]
  311. // [google.identity.accesscontextmanager.v1.ServicePerimeterConfig.ApiOperation]
  312. // intended to be performed on the `resources` specified. Note that if the
  313. // destination of the request is also protected by a [ServicePerimeter]
  314. // [google.identity.accesscontextmanager.v1.ServicePerimeter], then that
  315. // [ServicePerimeter]
  316. // [google.identity.accesscontextmanager.v1.ServicePerimeter] must have
  317. // an [IngressPolicy]
  318. // [google.identity.accesscontextmanager.v1.ServicePerimeterConfig.IngressPolicy]
  319. // which allows access in order for this request to succeed. The request must
  320. // match `operations` AND `resources` fields in order to be allowed egress out
  321. // of the perimeter.
  322. message EgressTo {
  323. // A list of resources, currently only projects in the form
  324. // `projects/<projectnumber>`, that are allowed to be accessed by sources
  325. // defined in the corresponding [EgressFrom]
  326. // [google.identity.accesscontextmanager.v1.ServicePerimeterConfig.EgressFrom].
  327. // A request matches if it contains a resource in this list. If `*` is
  328. // specified for `resources`, then this [EgressTo]
  329. // [google.identity.accesscontextmanager.v1.ServicePerimeterConfig.EgressTo]
  330. // rule will authorize access to all resources outside the perimeter.
  331. repeated string resources = 1;
  332. // A list of [ApiOperations]
  333. // [google.identity.accesscontextmanager.v1.ServicePerimeterConfig.ApiOperation]
  334. // allowed to be performed by the sources specified in the corresponding
  335. // [EgressFrom]
  336. // [google.identity.accesscontextmanager.v1.ServicePerimeterConfig.EgressFrom].
  337. // A request matches if it uses an operation/service in this list.
  338. repeated ApiOperation operations = 2;
  339. // A list of external resources that are allowed to be accessed. Only AWS
  340. // and Azure resources are supported. For Amazon S3, the supported format is
  341. // s3://BUCKET_NAME. For Azure Storage, the supported format is
  342. // azure://myaccount.blob.core.windows.net/CONTAINER_NAME. A request matches
  343. // if it contains an external resource in this list (Example:
  344. // s3://bucket/path). Currently '*' is not allowed.
  345. repeated string external_resources = 3;
  346. }
  347. // Policy for egress from perimeter.
  348. //
  349. // [EgressPolicies]
  350. // [google.identity.accesscontextmanager.v1.ServicePerimeterConfig.EgressPolicy]
  351. // match requests based on `egress_from` and `egress_to` stanzas. For an
  352. // [EgressPolicy]
  353. // [google.identity.accesscontextmanager.v1.ServicePerimeterConfig.EgressPolicy]
  354. // to match, both `egress_from` and `egress_to` stanzas must be matched. If an
  355. // [EgressPolicy]
  356. // [google.identity.accesscontextmanager.v1.ServicePerimeterConfig.EgressPolicy]
  357. // matches a request, the request is allowed to span the [ServicePerimeter]
  358. // [google.identity.accesscontextmanager.v1.ServicePerimeter] boundary.
  359. // For example, an [EgressPolicy]
  360. // [google.identity.accesscontextmanager.v1.ServicePerimeterConfig.EgressPolicy]
  361. // can be used to allow VMs on networks within the [ServicePerimeter]
  362. // [google.identity.accesscontextmanager.v1.ServicePerimeter] to access a
  363. // defined set of projects outside the perimeter in certain contexts (e.g. to
  364. // read data from a Cloud Storage bucket or query against a BigQuery dataset).
  365. //
  366. // [EgressPolicies]
  367. // [google.identity.accesscontextmanager.v1.ServicePerimeterConfig.EgressPolicy]
  368. // are concerned with the *resources* that a request relates as well as the
  369. // API services and API actions being used. They do not related to the
  370. // direction of data movement. More detailed documentation for this concept
  371. // can be found in the descriptions of [EgressFrom]
  372. // [google.identity.accesscontextmanager.v1.ServicePerimeterConfig.EgressFrom]
  373. // and [EgressTo]
  374. // [google.identity.accesscontextmanager.v1.ServicePerimeterConfig.EgressTo].
  375. message EgressPolicy {
  376. // Defines conditions on the source of a request causing this [EgressPolicy]
  377. // [google.identity.accesscontextmanager.v1.ServicePerimeterConfig.EgressPolicy]
  378. // to apply.
  379. EgressFrom egress_from = 1;
  380. // Defines the conditions on the [ApiOperation]
  381. // [google.identity.accesscontextmanager.v1.ServicePerimeterConfig.ApiOperation]
  382. // and destination resources that cause this [EgressPolicy]
  383. // [google.identity.accesscontextmanager.v1.ServicePerimeterConfig.EgressPolicy]
  384. // to apply.
  385. EgressTo egress_to = 2;
  386. }
  387. // A list of Google Cloud resources that are inside of the service perimeter.
  388. // Currently only projects are allowed. Format: `projects/{project_number}`
  389. repeated string resources = 1;
  390. // A list of `AccessLevel` resource names that allow resources within the
  391. // `ServicePerimeter` to be accessed from the internet. `AccessLevels` listed
  392. // must be in the same policy as this `ServicePerimeter`. Referencing a
  393. // nonexistent `AccessLevel` is a syntax error. If no `AccessLevel` names are
  394. // listed, resources within the perimeter can only be accessed via Google
  395. // Cloud calls with request origins within the perimeter. Example:
  396. // `"accessPolicies/MY_POLICY/accessLevels/MY_LEVEL"`.
  397. // For Service Perimeter Bridge, must be empty.
  398. repeated string access_levels = 2;
  399. // Google Cloud services that are subject to the Service Perimeter
  400. // restrictions. For example, if `storage.googleapis.com` is specified, access
  401. // to the storage buckets inside the perimeter must meet the perimeter's
  402. // access restrictions.
  403. repeated string restricted_services = 4;
  404. // Configuration for APIs allowed within Perimeter.
  405. VpcAccessibleServices vpc_accessible_services = 10;
  406. // List of [IngressPolicies]
  407. // [google.identity.accesscontextmanager.v1.ServicePerimeterConfig.IngressPolicy]
  408. // to apply to the perimeter. A perimeter may have multiple [IngressPolicies]
  409. // [google.identity.accesscontextmanager.v1.ServicePerimeterConfig.IngressPolicy],
  410. // each of which is evaluated separately. Access is granted if any [Ingress
  411. // Policy]
  412. // [google.identity.accesscontextmanager.v1.ServicePerimeterConfig.IngressPolicy]
  413. // grants it. Must be empty for a perimeter bridge.
  414. repeated IngressPolicy ingress_policies = 8;
  415. // List of [EgressPolicies]
  416. // [google.identity.accesscontextmanager.v1.ServicePerimeterConfig.EgressPolicy]
  417. // to apply to the perimeter. A perimeter may have multiple [EgressPolicies]
  418. // [google.identity.accesscontextmanager.v1.ServicePerimeterConfig.EgressPolicy],
  419. // each of which is evaluated separately. Access is granted if any
  420. // [EgressPolicy]
  421. // [google.identity.accesscontextmanager.v1.ServicePerimeterConfig.EgressPolicy]
  422. // grants it. Must be empty for a perimeter bridge.
  423. repeated EgressPolicy egress_policies = 9;
  424. }