A quick update: This morning I realized that remap ACLs <https://docs.trafficserver.apache.org/en/latest/admin-guide/files/remap.config.en.html#acl-filters> should to be updated for this too. I updated the draft PR to include adding @src_ip_category that takes a category to apply to remap rules. That functions in every way like the ip_allow.yaml ip_category described in the previous email.
Thanks, Brian On Wed, Nov 22, 2023 at 4:29 PM Brian Neradt <brian.ner...@gmail.com> wrote: > dev@trafficserver.apache.org, > > Bryan Call and I have been working on an idea for ip_allow.yaml. At Yahoo, > we have an internal API which categorizes IPs under certain groups via a > database lookup. Each of the IP categories have potentially different > requirements for which HTTP methods are accessible to them. For instance, > IP addresses in something like ACME_INTERNAL may be able to initiate HTTP > requests using modifying methods such as PUSH and DELETE as well as GET and > HEAD requests, while IP addresses labeled ANY_IP may only be able to use > requests with GET and HEAD methods. While the general filtering > functionality of ip_allow.yaml would be ideal for controlling these HTTP > method restrictions, the current ip_addrs node of ip_allow.yaml, while good > for explicit IP range specification, does not allow for programmatic IP > categorization like that described above. > > Currently, Yahoo implements the required filtering by basically stripping > ip_allow.yaml to nothing but the absolute minimum denominator of method > restrictions and then uses an internal plugin to implement the method > filtering based upon the categories of the database. > > In discussing this method filtering by IP category, Bryan Call had the > idea that this feature could be implemented as a general solution for the > community by a relatively simple extension of ip_allow.yaml itself. I spent > some time working on this and have a draft PR demonstrating the feature > here: > > https://github.com/apache/trafficserver/pull/10840 > > The feature includes the following new user interfaces: > > ip_category > The feature adds ip_category to ip_allow.yaml record as an alternative to > the ip_addrs key. Here is an example record specification using an > ip_category of ACME_INTERNAL: > > - apply: in ip_category: ACME_INTERNAL action: allow methods: - GET > - HEAD - POST - DELETE > > TS_HTTP_IP_ALLOW_CATEGORY_HOOK hook > The user then supplies a plugin that implements the > TS_HTTP_IP_ALLOW_CATEGORY_HOOK callback which the core uses to query > whether a given incoming IP is applicable to a given category, such as > ACME_INTERNAL above. Knowing this informs the core whether a particular > ip_allow.yaml rule applies to an incoming or outgoing connection. > > New Category Plugin API Functions > The plugin that implements the TS_HTTP_IP_ALLOW_CATEGORY_HOOK handler then > uses the following API to communicate with the core about whether an IP > belongs to a category: > > /** Obtain the category name being inspected. > * @param[in] infop The ip_allow info object. > * @param[out] category The category name being inspected whether it > contains > * the address obtained via @a TSHttpIpAllowInfoAddrGet. > * @return TS_SUCCESS if the category name was obtained, TS_ERROR > otherwise. > */ > TSReturnCode TSHttpIpAllowInfoCategoryGet(TSHttpIpAllowInfo infop, > std::string_view &category); > > /** Obtain the address being queried whether it belongs to a category. > * @param[in] infop The ip_allow info object. > * @param[out] addr The address being queried against a category > obtained via > * @a TSHttpIpAllowInfoCategoryGet. > * @return TS_SUCCESS if the address was obtained, TS_ERROR otherwise. > */ > TSReturnCode TSHttpIpAllowInfoAddrGet(TSHttpIpAllowInfo infop, sockaddr > &addr); > > /** Set whether an address applies to a category. > * @param[in] infop The ip_allow info object. > * @param[in] contains Whether the address obtained via > * @a TSHttpIpAllowInfoAddrGet is contained in the category obtained via > * @a TSHttpIpAllowInfoCategoryGet. > */ > void TSHttpIpAllowInfoContainsSet(TSHttpIpAllowInfo infop, bool > contains); > > The TSHttpIpAllowInfo is an opaque structure, but in the backend it simply > contains the three pieces of data represented above: > > struct HttpIpAllowInfo { > > /// A user-specified name for IP categories. > std::string_view category; > > /// The IP address to query whether it is contained in @a category. > swoc::IPAddr const &addr; > > /// The result of the query: the hook sets this to true of @a addr is in > @a > /// category, false otherwise. > bool contains = false; > }; > > An example plugin that makes use of this API can be found in the draft PR > here: > > > https://github.com/bneradt/trafficserver/blob/ip_allow_categories/example/plugins/c-api/ip_category/ip_category.cc > > We hope that this feature can be generally helpful to other users in the > community who have IP categories that cannot be statically specified in the > ip_addrs node of ip_allow.yaml. We welcome any thoughts or suggestions for > improvement concerning the above suggested API. > > Thanks, > Brian > > > -- > "Come to Me, all who are weary and heavy-laden, and I will > give you rest. Take My yoke upon you and learn from Me, for > I am gentle and humble in heart, and you will find rest for > your souls. For My yoke is easy and My burden is light." > > ~ Matthew 11:28-30 > -- "Come to Me, all who are weary and heavy-laden, and I will give you rest. Take My yoke upon you and learn from Me, for I am gentle and humble in heart, and you will find rest for your souls. For My yoke is easy and My burden is light." ~ Matthew 11:28-30