+1 on keeping in on the mailing list On Fri, May 12, 2017 at 7:52 AM, Eric Friedrich (efriedri) < efrie...@cisco.com> wrote:
> Can we please keep the discussion on the dev@ list? Apache rules and all. > > “If it didn’t happen on the email list, it didn’t happen” > > > On 5/12/17, 9:50 AM, "Amir Yeshurun" <am...@qwilt.com> wrote: > > Moving discussion to the wiki page. Commented on Jeremy's notes > > On Fri, May 12, 2017 at 7:41 AM Shmulik Asafi <shmul...@qwilt.com> > wrote: > > > Regarding sharing signing key with other services raised by Eric - > notice > > jwt support asymmetric keys. I.e. only the auth server has the > private key > > and other services have a public key. > > > > Also, there's another solution for "global invalidation" besides > switching > > keys, and that is setting a threshold for token issue date. Whenever > > there's an attack or whatever and we want to invalidate all tokens > we just > > need to set the threshold for 'now' thus forcing all users to issue > a new > > token. > > I think this is more reasonable and scalable than switching keys. > > > > On 12 May 2017 05:15, "Jeremy Mitchell" <mitchell...@gmail.com> > wrote: > > > > > Here was the image I was trying to attach: > > > > > > https://cwiki.apache.org/confluence/display/TC/API+Gateway > > > > > > Jeremy > > > > > > On Thu, May 11, 2017 at 2:14 PM, Amir Yeshurun <am...@qwilt.com> > wrote: > > > > > > > Hi Jeremy, > > > > Note that attachments seems to be stripped off on this list and > the > > image > > > > is unavailable. > > > > > > > > Your assumptions are correct. We need to figure out the easiest > > topology > > > > for UI routes to bypass the GW. Please reattach the picture so > we can > > get > > > > more specific. > > > > > > > > Thanks > > > > /amiry > > > > > > > > > > > > > > > > On Thu, May 11, 2017, 20:06 Jeremy Mitchell < > mitchell...@gmail.com> > > > wrote: > > > > > > > > > What is of utmost importance to me is the ability to ease into > this. > > We > > > > > have a TO UI right now that needs to be unaffected by the API > gateway > > > in > > > > my > > > > > opinion. Granted the old UI might go away at some point but > until > > that > > > > time > > > > > it needs to function as-is. > > > > > > > > > > To me, the simplest approach is to key off request URL. > anything that > > > > > starts with /api gets api gateway treatment, the rest passes on > > > > > thru...Here's a fancy picture to communicate what I envision... > > > > > > > > > > [image: Inline image 1] > > > > > > > > > > I'm assuming all requests (endpoints) go thru the api gateway > but > > maybe > > > > > i'm wrong in that assumption. Anyhow, i guess my point is the > UI > > should > > > > > continue to work with the mojo cookie and "api" calls should > use the > > > jwt > > > > > token...however, the UI also uses api endpoints so not sure > how that > > > > would > > > > > work... > > > > > > > > > > If it's too difficult for the api gateway to support UI and API > > routes, > > > > we > > > > > could always wait until the new UI (which leverages the API) is > > > > complete... > > > > > > > > > > Jeremy > > > > > > > > > > On Thu, May 11, 2017 at 10:23 AM, Chris Lemmons < > alfic...@gmail.com> > > > > > wrote: > > > > > > > > > >> > invalidate ALL tokens by changing the token signing key > > > > >> > > > > >> Interesting idea. That does mean that the signing key has to > be > > > > retrieved > > > > >> every time from the authentication authority, or it'd be > subject to > > > the > > > > >> exact same set of attacks. But a nearly-constant rarely > changing key > > > > could > > > > >> be communicated very efficiently, I suspect. And if the > > authentication > > > > >> system is a web API, it can even use Modified-Since to 304 > 99% of > > the > > > > time > > > > >> for maximum efficiency. > > > > >> > > > > >> It does have the downside that key-invalidation events are > fairly > > > > >> significant. You'd need to invalidate the keys whenever > someone's > > > access > > > > >> was reduced or removed. As the number of accounts in the > system > > > > increases, > > > > >> that might not wind up being as infrequent as one might hope. > It's > > > easy > > > > to > > > > >> implement, though. > > > > >> > > > > >> On Thu, May 11, 2017 at 10:12 AM Jeremy Mitchell < > > > mitchell...@gmail.com > > > > > > > > > >> wrote: > > > > >> > > > > >> > Regarding the TTL on the JWT token. a 5 minute TTL seems > silly. > > > What's > > > > >> the > > > > >> > point? Unless we get into refresh tokens but that sounds > like > > > > >> oauth...blah. > > > > >> > > > > > >> > What about this and maybe i'm oversimplifying. the TTL on > the jwt > > > > token > > > > >> is > > > > >> > 24 hours. If we become aware that a token has been > compromised, > > > > >> invalidate > > > > >> > ALL tokens by changing the token signing key. maybe this is > a good > > > > idea > > > > >> or > > > > >> > maybe this is a terrible idea. I have no idea. just a > thought.. > > > > >> > > > > > >> > jeremy > > > > >> > > > > > >> > On Wed, May 10, 2017 at 12:23 PM, Chris Lemmons < > > alfic...@gmail.com > > > > > > > > >> > wrote: > > > > >> > > > > > >> > > Responding to a few people: > > > > >> > > > > > > >> > > > Often times every auth action must be accompanied by DB > writes > > > for > > > > >> > audit > > > > >> > > logs or callback functions. > > > > >> > > > > > > >> > > True. But a) if logging is too expensive it should > probably be > > > made > > > > >> > cheaper > > > > >> > > and b) the answer to "audits are too expensive" probably > isn't > > > "lets > > > > >> just > > > > >> > > do less authentication". If the audit log is genuinely the > > > > >> bottle-neck, > > > > >> > it > > > > >> > > would still be better to re-auth without the audit log. > > > > >> > > > > > > >> > > > The API gateway can poll for the latest list of tokens > at a > > > > regular > > > > >> > > interval > > > > >> > > > > > > >> > > Yeah, datastore replication for local performance is > great. > > Though > > > > if > > > > >> you > > > > >> > > can reasonably query for a list of all valid tokens every > > second, > > > > it's > > > > >> > > probably cheaper to to just query for the token you need > every > > > time > > > > >> you > > > > >> > > need it. If there are massive batches of queries that are > coming > > > > >> through, > > > > >> > > it's probably not unreasonable to choose not to > re-validate a > > > token > > > > >> > that's > > > > >> > > been validated in the last second. > > > > >> > > > > > > >> > > > Regarding maliciously delayed message or such - I don't > fully > > > > >> > understand > > > > >> > > the > > > > >> > > point; if an attacker has such capabilities she can simply > > > > >> prevent/delay > > > > >> > > devop users from updating the auth database itself thus > enabling > > > the > > > > >> > > attack. > > > > >> > > > > > > >> > > In a typical attack, an attacker might gain control of a > box on > > > the > > > > >> local > > > > >> > > network, but not necessarily the Gateway, Traffic Ops, or > Auth > > > > Server. > > > > >> > > Those are probably better hardened. But lots of networks > have a > > > > >> squishy > > > > >> > > test box that everyone forgot was there or something. The > bad > > guy > > > > >> wants > > > > >> > to > > > > >> > > use the CDN to DOS someone, or redirect traffic to > somewhere > > > > >> malicious, > > > > >> > or > > > > >> > > just cause mayhem. The longer he can keep control, the > better > > for > > > > him. > > > > >> > > > > > > >> > > So this attacker uses the local box to sniff the token > off the > > > > >> network. > > > > >> > If > > > > >> > > the communication with the Gateway is encrypted, he might > have > > to > > > do > > > > >> some > > > > >> > > ARP poisoning or something else to trick a host into > talking to > > > the > > > > >> local > > > > >> > > box instead. (Properly implemented TLS also migates this > angle.) > > > He > > > > >> knows > > > > >> > > that as soon as he starts his nefarious deed, alarms are > going > > to > > > go > > > > >> off, > > > > >> > > so he also uses this local box to DOS the Auth Server. > It's a > > lot > > > > >> easier > > > > >> > to > > > > >> > > take a box down from the outside than to actually gain > control. > > > > >> > > > > > > >> > > If the Gateway "fails open" when it can't contact the Auth > > server, > > > > the > > > > >> > > attacker remains in control. If it "fails closed", the > attacker > > > has > > > > to > > > > >> > > actually compromise the auth server (which is harder) to > remain > > in > > > > >> > control. > > > > >> > > > > > > >> > > > Do we block all API calls if the auth service is > temporarily > > > down > > > > >> > (being > > > > >> > > upgraded, container restarting, etc…)? > > > > >> > > > > > > >> > > Yes, I think we have to. Authentication is integral to > reliable > > > > >> > operation. > > > > >> > > > > > > >> > > We've been talking in some fairly wild hypotheticals, > though. Is > > > > >> there a > > > > >> > > specific auth service you're envisioning? > > > > >> > > > > > > >> > > On Wed, May 10, 2017 at 12:50 AM Shmulik Asafi < > > > shmul...@qwilt.com> > > > > >> > wrote: > > > > >> > > > > > > >> > > > Regarding the communication issue Chris raised - there > is more > > > > than > > > > >> one > > > > >> > > > possible pattern to this, e.g.: > > > > >> > > > > > > > >> > > > - Blacklisted tokens can be communicated via a > pub-sub > > > > mechanism > > > > >> > > > - The API gateway can poll for the latest list of > tokens > > at a > > > > >> > regular > > > > >> > > > interval (which can be very short ~1sec, much > shorter than > > > the > > > > >> time > > > > >> > it > > > > >> > > > takes devops to detect and react to malign tokens) > > > > >> > > > > > > > >> > > > Regarding hitting the blacklist datastore - this only > sounds > > > > >> similar to > > > > >> > > > hitting to auth database; but the simplicity of a > blacklist > > > > function > > > > >> > > allows > > > > >> > > > you to employ more efficient datastores, e.g. Redis or > just a > > > > >> hashmap > > > > >> > in > > > > >> > > > the API gateway process memory. > > > > >> > > > > > > > >> > > > Regarding maliciously delayed message or such - I don't > fully > > > > >> > understand > > > > >> > > > the point; if an attacker has such capabilities she can > simply > > > > >> > > > prevent/delay devop users from updating the auth > database > > itself > > > > >> thus > > > > >> > > > enabling the attack. > > > > >> > > > > > > > >> > > > > > > > >> > > > On Wed, May 10, 2017 at 4:25 AM, Eric Friedrich > (efriedri) < > > > > >> > > > efrie...@cisco.com> wrote: > > > > >> > > > > > > > >> > > > > Our current management wrapper around Traffic Control > > (called > > > > OMD > > > > >> > > > > Director, demo’d at last TC summit) uses a very > similar > > > approach > > > > >> to > > > > >> > > > > authentication. > > > > >> > > > > > > > > >> > > > > We have an auth service that issues a JWT. The JWT is > then > > > > >> provided > > > > >> > > along > > > > >> > > > > with all API calls. A few comments on our practical > > > experience: > > > > >> > > > > > > > > >> > > > > - I am a supported of validating tokens both in the > API > > > gateway > > > > >> and > > > > >> > in > > > > >> > > > the > > > > >> > > > > service. We have several examples of services- > Grafana for > > > > >> example, > > > > >> > > that > > > > >> > > > > require external authentication. Similarly, we have > other > > > > services > > > > >> > that > > > > >> > > > > need finer grained authentication than API Gateway > policy > > can > > > > >> handle. > > > > >> > > > > Specifically, a given user may have permissions to > > view/modify > > > > >> some > > > > >> > > > > delivery services but not others. The API gateway > presumably > > > > would > > > > >> > not > > > > >> > > > > understand the semantics of payload so this decision > would > > > need > > > > >> to be > > > > >> > > > made > > > > >> > > > > by auth within the service. > > > > >> > > > > > > > > >> > > > > - As brought up earlier, auth in the gateway is both a > > > strength > > > > >> and a > > > > >> > > > > risk. Additional layer of security is also positive, > but for > > > my > > > > >> case > > > > >> > of > > > > >> > > > > Grafana above it can present an opportunity to bypass > > > > >> authentication. > > > > >> > > > This > > > > >> > > > > is a risk, but it can be mitigated by adding auth to > the > > > service > > > > >> > where > > > > >> > > > > needed. > > > > >> > > > > > > > > >> > > > > - Verifying tokens on every access may potentially be > more a > > > > >> little > > > > >> > > > > expensive than discussed. Often times every auth > action must > > > be > > > > >> > > > accompanied > > > > >> > > > > by DB writes for audit logs or callback functions. > Not the > > > straw > > > > >> to > > > > >> > > break > > > > >> > > > > the camel’s back, but something to keep in mind. > > > > >> > > > > > > > > >> > > > > - There is also the problem of what to do if the > underlying > > > auth > > > > >> > > service > > > > >> > > > > is temporarily unavailable. Do we block all API calls > if the > > > > auth > > > > >> > > service > > > > >> > > > > is temporarily down (being upgraded, container > restarting, > > > > etc…)? > > > > >> > > > > > > > > >> > > > > - I’d like to see what we can do to use a pre-existing > > package > > > > as > > > > >> an > > > > >> > > API > > > > >> > > > > Gateway. As we decompose TO into microservices, > something > > like > > > > >> nginx > > > > >> > > can > > > > >> > > > > provide additional benefits like TLS termination and > load > > > > >> balancing > > > > >> > > > between > > > > >> > > > > service endpoints. I’d hate to see us have to > reimplement > > > these > > > > >> > > functions > > > > >> > > > > later. > > > > >> > > > > > > > > >> > > > > - I’d also like to see us give some consideration to > how an > > > API > > > > >> > gateway > > > > >> > > > is > > > > >> > > > > deployed. We raised the bar for new users by > unbundling > > > Traffic > > > > >> Ops > > > > >> > > from > > > > >> > > > > the database and it could further complicate the > > installation > > > if > > > > >> we > > > > >> > > don’t > > > > >> > > > > provide enough guidance on how to deploy the API > gateway in > > a > > > > lab > > > > >> > > trial, > > > > >> > > > if > > > > >> > > > > not best practices for production deployment. Should > we > > > > recommend > > > > >> to > > > > >> > > > deploy > > > > >> > > > > as an new RPM/systemd service, an immutable > container, or as > > > > part > > > > >> of > > > > >> > > the > > > > >> > > > > existing TO RPM? > > > > >> > > > > > > > > >> > > > > —Eric > > > > >> > > > > > > > > >> > > > > > > > > >> > > > > > On May 9, 2017, at 5:05 PM, Chris Lemmons < > > > alfic...@gmail.com > > > > > > > > > >> > > wrote: > > > > >> > > > > > > > > > >> > > > > > Blacklisting requires proactive communication > between the > > > > >> > > > authentication > > > > >> > > > > > system and the gateway. Furthermore, the client > can't be > > > sure > > > > >> that > > > > >> > > > > > something hasn't been blacklisted recently (and the > > message > > > > >> lost or > > > > >> > > > > perhaps > > > > >> > > > > > maliciously delayed) unless it checks whatever > system it > > is > > > > that > > > > >> > does > > > > >> > > > the > > > > >> > > > > > blacklisting. And if you're checking a datastore of > some > > > sort > > > > >> for > > > > >> > the > > > > >> > > > > > validity of the token every time, you might as well > just > > > check > > > > >> each > > > > >> > > > time > > > > >> > > > > > and skip the blacklisting step. > > > > >> > > > > > > > > > >> > > > > > On Tue, May 9, 2017 at 1:27 PM Shmulik Asafi < > > > > >> shmul...@qwilt.com> > > > > >> > > > wrote: > > > > >> > > > > > > > > > >> > > > > >> Hi, > > > > >> > > > > >> Maybe a missing link here is another component in > a jwt > > > > >> stateless > > > > >> > > > > >> architecture which is *blacklisting* malign tokens > when > > > > >> necessary. > > > > >> > > > > >> This is obviously a sort of state which needs to be > > handled > > > > in > > > > >> a > > > > >> > > > > datastore; > > > > >> > > > > >> but it's quite different and easy to scale and has > less > > > > >> > performance > > > > >> > > > > impact > > > > >> > > > > >> (I guess especially under DDOS) than doing full > auth > > > queries. > > > > >> > > > > >> I believe this should be the approach on the API > Gateway > > > > >> roadmap > > > > >> > > > > >> Thanks > > > > >> > > > > >> > > > > >> > > > > >> On 9 May 2017 21:14, "Chris Lemmons" < > alfic...@gmail.com > > > > > > > >> wrote: > > > > >> > > > > >> > > > > >> > > > > >>> I'll second the principle behind "start with > security, > > > > >> optimize > > > > >> > > when > > > > >> > > > > >>> there's a problem". > > > > >> > > > > >>> > > > > >> > > > > >>> It seems to me that in order to maintain security, > > > basically > > > > >> > > everyone > > > > >> > > > > >> would > > > > >> > > > > >>> need to dial the revalidate time so close to zero > that > > it > > > > does > > > > >> > very > > > > >> > > > > >> little > > > > >> > > > > >>> good as a cache on the credentials. Otherwise, as > Rob as > > > > >> pointed > > > > >> > > out, > > > > >> > > > > the > > > > >> > > > > >>> TTL on your credential cache is effectively "how > long > > am I > > > > ok > > > > >> > with > > > > >> > > > > >> hackers > > > > >> > > > > >>> in control after I find them". Practically, it > also > > means > > > > that > > > > >> > much > > > > >> > > > lag > > > > >> > > > > >> on > > > > >> > > > > >>> adding or removing permissions. That effectively > means a > > > > >> database > > > > >> > > hit > > > > >> > > > > for > > > > >> > > > > >>> every query, or near enough to every query as not > to > > > matter. > > > > >> > > > > >>> > > > > >> > > > > >>> That said, you can get the best of multiple > worlds, I > > > think. > > > > >> The > > > > >> > > only > > > > >> > > > > DB > > > > >> > > > > >>> query that really has to be done is "give me the > last > > > update > > > > >> time > > > > >> > > for > > > > >> > > > > >> this > > > > >> > > > > >>> user". Compare that to the generation time in the > token > > > and > > > > >> 99% > > > > >> > of > > > > >> > > > the > > > > >> > > > > >>> time, it's the only query you need. With that > check, you > > > can > > > > >> even > > > > >> > > use > > > > >> > > > > >>> fairly long-lived tokens. If anything about the > user has > > > > >> changed, > > > > >> > > > > reject > > > > >> > > > > >>> the token, generate a new one, send that to the > user and > > > use > > > > >> it. > > > > >> > > The > > > > >> > > > > >>> regenerate step is somewhat expensive, but still > well > > > inside > > > > >> > > > > reasonable, > > > > >> > > > > >> I > > > > >> > > > > >>> think. > > > > >> > > > > >>> > > > > >> > > > > >>> On Tue, May 9, 2017 at 11:31 AM Robert Butts < > > > > >> > > > robert.o.bu...@gmail.com > > > > >> > > > > > > > > > >> > > > > >>> wrote: > > > > >> > > > > >>> > > > > >> > > > > >>>>> The TO service (and any other service that > requires > > > auth) > > > > >> MUST > > > > >> > > hit > > > > >> > > > > >> the > > > > >> > > > > >>>> database (or the auth service, which itself hits > the > > > > >> database) > > > > >> > to > > > > >> > > > > >> verify > > > > >> > > > > >>>> valid tokens' users still have the permissions > they did > > > > when > > > > >> the > > > > >> > > > token > > > > >> > > > > >>> was > > > > >> > > > > >>>> created. Otherwise, it's impossible to revoke > tokens, > > > e.g. > > > > >> if an > > > > >> > > > > >> employee > > > > >> > > > > >>>> quits, or an attacker gains a token, or a user > changes > > > > their > > > > >> > > > password. > > > > >> > > > > >>>> > > > > >> > > > > >>>> I'm elaborating on this, and moving a discussion > from a > > > PR > > > > >> > review > > > > >> > > > > here. > > > > >> > > > > >>>> > > > > >> > > > > >>>> From the code submissions to the repo, it > appears the > > > > current > > > > >> > plan > > > > >> > > > is > > > > >> > > > > >> for > > > > >> > > > > >>>> the API Gateway to create a JWT, and then for > that JWT > > to > > > > be > > > > >> > > > accepted > > > > >> > > > > >> by > > > > >> > > > > >>>> all Traffic Ops microservices, with no database > > > > >> authentication. > > > > >> > > > > >>>> > > > > >> > > > > >>>> It's a common misconception that JWT allows you > > > > authenticate > > > > >> > > without > > > > >> > > > > >>>> hitting the database. This is an exceedingly > dangerous > > > > >> > > > misconception. > > > > >> > > > > >> If > > > > >> > > > > >>>> you don't check the database when every > authenticated > > > route > > > > >> is > > > > >> > > > > >> requested, > > > > >> > > > > >>>> it's impossible to revoke access. In practice, > this > > means > > > > the > > > > >> > JWT > > > > >> > > > TTL > > > > >> > > > > >>>> becomes the length of time _after you discover an > > > attacker > > > > is > > > > >> > > > > >>> manipulating > > > > >> > > > > >>>> your production system_, before it's _possible_ > to > > evict > > > > >> them. > > > > >> > > > > >>>> > > > > >> > > > > >>>> How long do you feel is acceptable to have a > hacker in > > > and > > > > >> > > > > manipulating > > > > >> > > > > >>>> your system, after you discover them? A day? An > hour? > > > Five > > > > >> > > minutes? > > > > >> > > > > >>>> Whatever your TTL, that's the length of time > you're > > > willing > > > > >> to > > > > >> > > > allow a > > > > >> > > > > >>>> hacker to steal and destroy you and your > customers' > > data. > > > > >> Worse, > > > > >> > > > > >> because > > > > >> > > > > >>>> this is a CDN, it's the length of time you're > willing > > to > > > > >> allow > > > > >> > > your > > > > >> > > > > CDN > > > > >> > > > > >>> to > > > > >> > > > > >>>> be used to DDOS a target. > > > > >> > > > > >>>> > > > > >> > > > > >>>> Are you going to explain in court that the DDOS > your > > > system > > > > >> > > executed > > > > >> > > > > >>> lasted > > > > >> > > > > >>>> 24 hours, or 1 hour, or 10 minutes after you > discovered > > > it, > > > > >> > > because > > > > >> > > > > >>> that's > > > > >> > > > > >>>> the TTL you hard-coded? Are you going to explain > to a > > > judge > > > > >> and > > > > >> > > > > >>> prosecuting > > > > >> > > > > >>>> attorney exactly which sensitive data was stolen > in the > > > ten > > > > >> > > minutes > > > > >> > > > > >> after > > > > >> > > > > >>>> you discovered the attacker in your system, > before > > their > > > > JWT > > > > >> > > > expired? > > > > >> > > > > >>>> > > > > >> > > > > >>>> If you're willing to accept the legal > consequences, > > > that's > > > > >> your > > > > >> > > > > >> business. > > > > >> > > > > >>>> Apache Traffic Control should not require users > to > > accept > > > > >> those > > > > >> > > > > >>>> consequences, and ideally shouldn't make it > possible, > > as > > > > many > > > > >> > > users > > > > >> > > > > >> won't > > > > >> > > > > >>>> understand the security risks. > > > > >> > > > > >>>> > > > > >> > > > > >>>> The argument has been made "authorization does > not > > check > > > > the > > > > >> > > > database > > > > >> > > > > >> to > > > > >> > > > > >>>> avoid congestion" -- Has anyone tested this in > > practice? > > > > The > > > > >> > > > database > > > > >> > > > > >>> query > > > > >> > > > > >>>> itself is 50ms. Assuming your database and > service are > > > > 2500km > > > > >> > > apart, > > > > >> > > > > >>> that's > > > > >> > > > > >>>> another 50ms network latency. Traffic Ops has > endpoints > > > > that > > > > >> > take > > > > >> > > > 10s > > > > >> > > > > >> to > > > > >> > > > > >>>> generate. Worst-case scenario, this will double > the > > time > > > of > > > > >> tiny > > > > >> > > > > >>> endpoints > > > > >> > > > > >>>> to 200ms, and increase large endpoints > > inconsequentially. > > > > >> It's > > > > >> > > > highly > > > > >> > > > > >>>> unlikely performance is an issue in practice. > > > > >> > > > > >>>> > > > > >> > > > > >>>> As Jan said, we can still have the services > check the > > > auth > > > > as > > > > >> > well > > > > >> > > > > >> after > > > > >> > > > > >>>> the proxy auth. Moreover, the services don't > even have > > to > > > > >> know > > > > >> > > about > > > > >> > > > > >> the > > > > >> > > > > >>>> auth service, they can hit a mapped route on the > API > > > > Gateway, > > > > >> > > which > > > > >> > > > > >> gives > > > > >> > > > > >>>> us better modularisation and separation of > concerns. > > > > >> > > > > >>>> > > > > >> > > > > >>>> It's not difficult, it can be a trivial endpoint > on the > > > > auth > > > > >> > > > service, > > > > >> > > > > >>>> remapped in the API Gateway, which takes the JWT > token > > > and > > > > >> > returns > > > > >> > > > > true > > > > >> > > > > >>> if > > > > >> > > > > >>>> it's still authorized in the database. To be > clear, > > this > > > is > > > > >> not > > > > >> > a > > > > >> > > > > >> problem > > > > >> > > > > >>>> today. Traffic Ops still uses the Mojolicious > cookie > > > today, > > > > >> so > > > > >> > > this > > > > >> > > > > >> would > > > > >> > > > > >>>> only need done if and when we remove that, or if > we > > move > > > > >> > > authorized > > > > >> > > > > >>>> endpoints out of Traffic Ops into their own > > > microservices. > > > > >> > > > > >>>> > > > > >> > > > > >>>> Considering the significant security and legal > risks, > > we > > > > >> should > > > > >> > > > always > > > > >> > > > > >>> hit > > > > >> > > > > >>>> the database to validate requests of authorized > > > endpoints, > > > > >> and > > > > >> > > > > >> reconsider > > > > >> > > > > >>>> if and when someone observes performance issues > in > > > > practice. > > > > >> > > > > >>>> > > > > >> > > > > >>>> > > > > >> > > > > >>>> On Tue, May 9, 2017 at 6:56 AM, Dewayne > Richardson < > > > > >> > > > dewr...@gmail.com > > > > >> > > > > > > > > > >> > > > > >>>> wrote: > > > > >> > > > > >>>> > > > > >> > > > > >>>>> If only the API GW authenticates/authorizes we > also > > > have a > > > > >> > single > > > > >> > > > > >> point > > > > >> > > > > >>>> of > > > > >> > > > > >>>>> entry to test for security instead of having it > > > sprinkled > > > > >> > across > > > > >> > > > > >>> services > > > > >> > > > > >>>>> in different ways. It also simplifies the code > on the > > > > >> service > > > > >> > > side > > > > >> > > > > >> and > > > > >> > > > > >>>>> makes them easier to test with automation. > > > > >> > > > > >>>>> > > > > >> > > > > >>>>> -Dew > > > > >> > > > > >>>>> > > > > >> > > > > >>>>> On Mon, May 8, 2017 at 8:42 AM, Robert Butts < > > > > >> > > > > >> robert.o.bu...@gmail.com > > > > >> > > > > >>>> > > > > >> > > > > >>>>> wrote: > > > > >> > > > > >>>>> > > > > >> > > > > >>>>>>> couldn't make nginx or http do what we need. > > > > >> > > > > >>>>>> > > > > >> > > > > >>>>>> I was suggesting a different architecture. Not > making > > > the > > > > >> > proxy > > > > >> > > do > > > > >> > > > > >>>> auth, > > > > >> > > > > >>>>>> only standard proxying. > > > > >> > > > > >>>>>> > > > > >> > > > > >>>>>>> We can still have the services check the auth > as > > well > > > > >> after > > > > >> > the > > > > >> > > > > >>> proxy > > > > >> > > > > >>>>>> auth > > > > >> > > > > >>>>>> > > > > >> > > > > >>>>>> +1 > > > > >> > > > > >>>>>> > > > > >> > > > > >>>>>> > > > > >> > > > > >>>>>> On Mon, May 8, 2017 at 3:36 AM, Amir Yeshurun < > > > > >> > am...@qwilt.com> > > > > >> > > > > >>> wrote: > > > > >> > > > > >>>>>> > > > > >> > > > > >>>>>>> Hi, > > > > >> > > > > >>>>>>> > > > > >> > > > > >>>>>>> Let me elaborate some more on the purpose of > the API > > > > GW. I > > > > >> > will > > > > >> > > > > >> put > > > > >> > > > > >>>> up > > > > >> > > > > >>>>> a > > > > >> > > > > >>>>>>> wiki page following our discussions here. > > > > >> > > > > >>>>>>> > > > > >> > > > > >>>>>>> Main purpose is to allow innovation by > creating new > > > > >> services > > > > >> > > that > > > > >> > > > > >>>>> handle > > > > >> > > > > >>>>>> TO > > > > >> > > > > >>>>>>> functionality, not as a part of the > monolithic Mojo > > > app. > > > > >> > > > > >>>>>>> The long term vision is to de-compose TO into > > multiple > > > > >> > > > > >>> microservices, > > > > >> > > > > >>>>>>> allowing new functionality easily added. > > > > >> > > > > >>>>>>> Indeed, the goal it to eventually deprecate > the > > > current > > > > >> AAA > > > > >> > > > > >> model, > > > > >> > > > > >>>> and > > > > >> > > > > >>>>>>> replace it with the new AAA model currently > under > > work > > > > >> > > > > >> (user-roles, > > > > >> > > > > >>>>>>> role-capabilities) > > > > >> > > > > >>>>>>> > > > > >> > > > > >>>>>>> I think that handling authorization in the > API layer > > > is > > > > a > > > > >> > valid > > > > >> > > > > >>>>> approach. > > > > >> > > > > >>>>>>> Security wise, I don't see much difference > between > > > that, > > > > >> and > > > > >> > > > > >> having > > > > >> > > > > >>>>> each > > > > >> > > > > >>>>>>> module access the auth service, as long as > the auth > > > > >> service > > > > >> > is > > > > >> > > > > >>>> deployed > > > > >> > > > > >>>>>> in > > > > >> > > > > >>>>>>> the backend. > > > > >> > > > > >>>>>>> Having another proxy (nginx?) fronting the > world and > > > > >> > forwarding > > > > >> > > > > >> all > > > > >> > > > > >>>>>>> requests to the backend GW mitigates the risk > for > > > > >> > compromising > > > > >> > > > > >> the > > > > >> > > > > >>>>>>> authorization service. > > > > >> > > > > >>>>>>> However, as mentioned above, we can still > have the > > > > >> services > > > > >> > > check > > > > >> > > > > >>> the > > > > >> > > > > >>>>>> auth > > > > >> > > > > >>>>>>> as well after the proxy auth. > > > > >> > > > > >>>>>>> > > > > >> > > > > >>>>>>> It is a standalone process, completely > optional at > > > this > > > > >> > point. > > > > >> > > > > >> One > > > > >> > > > > >>>> can > > > > >> > > > > >>>>>>> choose to deploy it in order to allow > integration > > with > > > > >> > > additional > > > > >> > > > > >>>>>>> services. Deployment > > > > >> > > > > >>>>>>> and management are still T.B.D, and feedback > on this > > > is > > > > >> most > > > > >> > > > > >>> welcome. > > > > >> > > > > >>>>>>> > > > > >> > > > > >>>>>>> Regarding token validation and revocation: > > > > >> > > > > >>>>>>> Tokens have expiration time. Expired tokens > do not > > > pass > > > > >> token > > > > >> > > > > >>>>> validation. > > > > >> > > > > >>>>>>> In production, expiration should be set to > > relatively > > > > >> short > > > > >> > > time, > > > > >> > > > > >>>> say 5 > > > > >> > > > > >>>>>>> minute. > > > > >> > > > > >>>>>>> This way revocation is automatic. > Re-authentication > > is > > > > >> > handled > > > > >> > > > > >> via > > > > >> > > > > >>>>>> refresh > > > > >> > > > > >>>>>>> tokens (not implemented yet). Hitting the DB > upon > > > every > > > > >> API > > > > >> > > call > > > > >> > > > > >>>> cause > > > > >> > > > > >>>>>>> congestion on users DB. > > > > >> > > > > >>>>>>> To avoid that, we chose to have all user > information > > > > >> > > > > >> self-contained > > > > >> > > > > >>>>>> inside > > > > >> > > > > >>>>>>> the JWT. > > > > >> > > > > >>>>>>> > > > > >> > > > > >>>>>>> Thanks > > > > >> > > > > >>>>>>> /amiry > > > > >> > > > > >>>>>>> > > > > >> > > > > >>>>>>> On Mon, May 8, 2017 at 5:42 AM Jan van Doorn < > > > > >> > j...@knutsel.com> > > > > >> > > > > >>>> wrote: > > > > >> > > > > >>>>>>> > > > > >> > > > > >>>>>>>> It's the reverse proxy we've discussed for > the > > "micro > > > > >> > > services" > > > > >> > > > > >>>>> version > > > > >> > > > > >>>>>>> for > > > > >> > > > > >>>>>>>> a while now (as in > > > > >> > > > > >>>>>>>> > > > > >> > > > > >>>> https://cwiki.apache.org/ > confluence/display/TC/Design+ > > > > >> > > Overview+v3.0 > > > > >> > > > > >>>>> ). > > > > >> > > > > >>>>>>>> > > > > >> > > > > >>>>>>>> On Sun, May 7, 2017 at 7:22 PM Eric Friedrich > > > > (efriedri) > > > > >> < > > > > >> > > > > >>>>>>>> efrie...@cisco.com> > > > > >> > > > > >>>>>>>> wrote: > > > > >> > > > > >>>>>>>> > > > > >> > > > > >>>>>>>>> From a higher level- what is purpose of the > API > > > > Gateway? > > > > >> > It > > > > >> > > > > >>>> seems > > > > >> > > > > >>>>>> like > > > > >> > > > > >>>>>>>>> there may have been some previous > discussions > > about > > > > API > > > > >> > > > > >>> Gateway. > > > > >> > > > > >>>>> Are > > > > >> > > > > >>>>>>>> there > > > > >> > > > > >>>>>>>>> any notes or description that I can catch > up on? > > > > >> > > > > >>>>>>>>> > > > > >> > > > > >>>>>>>>> How will it be deployed? (Is it a standalone > > service > > > > or > > > > >> > > > > >>> something > > > > >> > > > > >>>>>> that > > > > >> > > > > >>>>>>>>> runs inside the experimental Traffic Ops)? > > > > >> > > > > >>>>>>>>> > > > > >> > > > > >>>>>>>>> Is this new component required or optional? > > > > >> > > > > >>>>>>>>> > > > > >> > > > > >>>>>>>>> —Eric > > > > >> > > > > >>>>>>>>> > > > > >> > > > > >>>>>>>>> > > > > >> > > > > >>>>>>>>> > > > > >> > > > > >>>>>>>>>> On May 7, 2017, at 8:28 PM, Jan van Doorn < > > > > >> > j...@knutsel.com > > > > >> > > > > >>> > > > > >> > > > > >>>>> wrote: > > > > >> > > > > >>>>>>>>>> > > > > >> > > > > >>>>>>>>>> I looked into this a year or so ago, and I > > couldn't > > > > >> make > > > > >> > > > > >>> nginx > > > > >> > > > > >>>> or > > > > >> > > > > >>>>>>> http > > > > >> > > > > >>>>>>>> do > > > > >> > > > > >>>>>>>>>> what we need. > > > > >> > > > > >>>>>>>>>> > > > > >> > > > > >>>>>>>>>> We can still have the services check the > auth as > > > well > > > > >> > after > > > > >> > > > > >>> the > > > > >> > > > > >>>>>> proxy > > > > >> > > > > >>>>>>>>> auth, > > > > >> > > > > >>>>>>>>>> and make things better than today, where > we have > > > the > > > > >> same > > > > >> > > > > >>>> problem > > > > >> > > > > >>>>>>> that > > > > >> > > > > >>>>>>>> if > > > > >> > > > > >>>>>>>>>> the TO mojo app is compromised, everything > is > > > > >> compromised. > > > > >> > > > > >>>>>>>>>> > > > > >> > > > > >>>>>>>>>> If we always route to TO, we don't > untangle the > > > mess > > > > of > > > > >> > > > > >> being > > > > >> > > > > >>>>>>> dependent > > > > >> > > > > >>>>>>>>> on > > > > >> > > > > >>>>>>>>>> the monolithic TO for everything. Many > services > > > > today, > > > > >> and > > > > >> > > > > >>> more > > > > >> > > > > >>>>> in > > > > >> > > > > >>>>>>> the > > > > >> > > > > >>>>>>>>>> future really just need a check to see if > the > > user > > > is > > > > >> > > > > >>>> authorized, > > > > >> > > > > >>>>>> and > > > > >> > > > > >>>>>>>>>> nothing more. > > > > >> > > > > >>>>>>>>>> > > > > >> > > > > >>>>>>>>>> On Sun, May 7, 2017 at 11:55 AM Robert > Butts < > > > > >> > > > > >>>>>>> robert.o.bu...@gmail.com > > > > >> > > > > >>>>>>>>> > > > > >> > > > > >>>>>>>>>> wrote: > > > > >> > > > > >>>>>>>>>> > > > > >> > > > > >>>>>>>>>>> What are the advantages of these config > files, > > > over > > > > an > > > > >> > > > > >>>> existing > > > > >> > > > > >>>>>>>> reverse > > > > >> > > > > >>>>>>>>>>> proxy, like Nginx or httpd? It's just as > much > > work > > > > as > > > > >> > > > > >>>>> configuring > > > > >> > > > > >>>>>>> and > > > > >> > > > > >>>>>>>>>>> deploying an existing product, but more > code we > > > have > > > > >> to > > > > >> > > > > >>> write > > > > >> > > > > >>>>> and > > > > >> > > > > >>>>>>>>> maintain. > > > > >> > > > > >>>>>>>>>>> I'm having trouble seeing the advantage. > > > > >> > > > > >>>>>>>>>>> > > > > >> > > > > >>>>>>>>>>> -1 on auth rules as a part of the proxy. > Making > > a > > > > >> proxy > > > > >> > > > > >> care > > > > >> > > > > >>>>> about > > > > >> > > > > >>>>>>>> auth > > > > >> > > > > >>>>>>>>>>> violates the Single Responsibility > Principle, > > and > > > > >> > further, > > > > >> > > > > >>> is > > > > >> > > > > >>>> a > > > > >> > > > > >>>>>>>> security > > > > >> > > > > >>>>>>>>>>> risk. It creates unnecessary attack > surface. If > > > your > > > > >> > proxy > > > > >> > > > > >>> app > > > > >> > > > > >>>>> or > > > > >> > > > > >>>>>>>>> server is > > > > >> > > > > >>>>>>>>>>> compromised, the entire framework is now > > > > compromised. > > > > >> An > > > > >> > > > > >>>>> attacker > > > > >> > > > > >>>>>>>> could > > > > >> > > > > >>>>>>>>>>> simply rewrite the proxy config to make > all > > routes > > > > >> > > > > >> no-auth. > > > > >> > > > > >>>>>>>>>>> > > > > >> > > > > >>>>>>>>>>> The simple alternative is for the proxy to > > always > > > > >> route > > > > >> > to > > > > >> > > > > >>> TO, > > > > >> > > > > >>>>> and > > > > >> > > > > >>>>>>> TO > > > > >> > > > > >>>>>>>>>>> checks the token against the auth service > (which > > > may > > > > >> also > > > > >> > > > > >> be > > > > >> > > > > >>>>>>> proxied), > > > > >> > > > > >>>>>>>>> and > > > > >> > > > > >>>>>>>>>>> redirects unauthorized requests to a login > > > endpoint > > > > >> > (which > > > > >> > > > > >>> may > > > > >> > > > > >>>>>> also > > > > >> > > > > >>>>>>> be > > > > >> > > > > >>>>>>>>>>> proxied). > > > > >> > > > > >>>>>>>>>>> > > > > >> > > > > >>>>>>>>>>> The TO service (and any other service that > > > requires > > > > >> auth) > > > > >> > > > > >>> MUST > > > > >> > > > > >>>>> hit > > > > >> > > > > >>>>>>> the > > > > >> > > > > >>>>>>>>>>> database (or the auth service, which > itself hits > > > the > > > > >> > > > > >>> database) > > > > >> > > > > >>>>> to > > > > >> > > > > >>>>>>>> verify > > > > >> > > > > >>>>>>>>>>> valid tokens' users still have the > permissions > > > they > > > > >> did > > > > >> > > > > >> when > > > > >> > > > > >>>> the > > > > >> > > > > >>>>>>> token > > > > >> > > > > >>>>>>>>> was > > > > >> > > > > >>>>>>>>>>> created. Otherwise, it's impossible to > revoke > > > > tokens, > > > > >> > e.g. > > > > >> > > > > >>> if > > > > >> > > > > >>>> an > > > > >> > > > > >>>>>>>>> employee > > > > >> > > > > >>>>>>>>>>> quits, or an attacker gains a token, or a > user > > > > changes > > > > >> > > > > >> their > > > > >> > > > > >>>>>>> password. > > > > >> > > > > >>>>>>>>>>> > > > > >> > > > > >>>>>>>>>>> > > > > >> > > > > >>>>>>>>>>> On Sun, May 7, 2017 at 4:35 AM, Amir > Yeshurun < > > > > >> > > > > >>>> am...@qwilt.com> > > > > >> > > > > >>>>>>>> wrote: > > > > >> > > > > >>>>>>>>>>> > > > > >> > > > > >>>>>>>>>>>> Seems that attachments are stripped on > this > > list. > > > > >> > > > > >> Examples > > > > >> > > > > >>>>> pasted > > > > >> > > > > >>>>>>>> below > > > > >> > > > > >>>>>>>>>>>> > > > > >> > > > > >>>>>>>>>>>> *rules.json* > > > > >> > > > > >>>>>>>>>>>> [ > > > > >> > > > > >>>>>>>>>>>> { "host": "localhost", "path": > "/login", > > > > >> > > > > >>>>>>> "forward": > > > > >> > > > > >>>>>>>>>>>> "localhost:9004", "scheme": "https", > "auth": > > > false > > > > }, > > > > >> > > > > >>>>>>>>>>>> { "host": "localhost", "path": > > > > >> "/api/1.2/innovation/", > > > > >> > > > > >>>>>>> "forward": > > > > >> > > > > >>>>>>>>>>>> "localhost:8004", "scheme": "http", > "auth": > > > true, > > > > >> > > > > >>>>> "routes-file": > > > > >> > > > > >>>>>>>>>>>> "innovation.json" }, > > > > >> > > > > >>>>>>>>>>>> { "host": "localhost", "path": > "/api/1.2/", > > > > >> > > > > >>>>>>> "forward": > > > > >> > > > > >>>>>>>>>>>> "localhost:3000", "scheme": "http", > "auth": > > > true, > > > > >> > > > > >>>>> "routes-file": > > > > >> > > > > >>>>>>>>>>>> "traffic-ops-routes.json" }, > > > > >> > > > > >>>>>>>>>>>> { "host": "localhost", "path": > > > > >> "/internal/api/1.2/", > > > > >> > > > > >>>>>>> "forward": > > > > >> > > > > >>>>>>>>>>>> "localhost:3000", "scheme": "http", > "auth": > > > true, > > > > >> > > > > >>>>> "routes-file": > > > > >> > > > > >>>>>>>>>>>> "internal-routes.json" } > > > > >> > > > > >>>>>>>>>>>> ] > > > > >> > > > > >>>>>>>>>>>> > > > > >> > > > > >>>>>>>>>>>> *traffic-ops-routes.json (partial)* > > > > >> > > > > >>>>>>>>>>>> . > > > > >> > > > > >>>>>>>>>>>> . > > > > >> > > > > >>>>>>>>>>>> . > > > > >> > > > > >>>>>>>>>>>> { "match": "/cdns/health", > > > > >> > > > > >>> "auth": > > > > >> > > > > >>>> { > > > > >> > > > > >>>>>>> "GET": > > > > >> > > > > >>>>>>>>>>>> ["cdn-health-read"] }}, > > > > >> > > > > >>>>>>>>>>>> { "match": "/cdns/capacity", > > > > >> > > > > >>> "auth": > > > > >> > > > > >>>> { > > > > >> > > > > >>>>>>> "GET": > > > > >> > > > > >>>>>>>>>>>> ["cdn-health-read"] }}, > > > > >> > > > > >>>>>>>>>>>> { "match": "/cdns/usage/overview", > > > > >> > > > > >>> "auth": > > > > >> > > > > >>>> { > > > > >> > > > > >>>>>>> "GET": > > > > >> > > > > >>>>>>>>>>>> ["cdn-stats-read"] }}, > > > > >> > > > > >>>>>>>>>>>> { "match": "/cdns/name/dnsseckeys/ > generate", > > > > >> > > > > >>> "auth": > > > > >> > > > > >>>> { > > > > >> > > > > >>>>>>> "GET": > > > > >> > > > > >>>>>>>>>>>> ["cdn-security-keys-read"] }}, > > > > >> > > > > >>>>>>>>>>>> { "match": "/cdns/name/[^\/]+/?", > > > > >> > > > > >>> "auth": > > > > >> > > > > >>>> { > > > > >> > > > > >>>>>>> "GET": > > > > >> > > > > >>>>>>>>>>>> ["cdn-read"] }}, > > > > >> > > > > >>>>>>>>>>>> { "match": "/cdns/name/[^\/]+/sslkeys", > > > > >> > > > > >>> "auth": > > > > >> > > > > >>>> { > > > > >> > > > > >>>>>>> "GET": > > > > >> > > > > >>>>>>>>>>>> ["cdn-security-keys-read"] }}, > > > > >> > > > > >>>>>>>>>>>> { "match": > "/cdns/name/[^\/]+/dnsseckeys", > > > > >> > > > > >>> "auth": > > > > >> > > > > >>>> { > > > > >> > > > > >>>>>>> "GET": > > > > >> > > > > >>>>>>>>>>>> ["cdn-security-keys-read"] }}, > > > > >> > > > > >>>>>>>>>>>> { "match": > "/cdns/name/[^\/]+/dnsseckeys/ > > > > delete", > > > > >> > > > > >>> "auth": > > > > >> > > > > >>>> { > > > > >> > > > > >>>>>>> "GET": > > > > >> > > > > >>>>>>>>>>>> ["cdn-security-keys-write"] }}, > > > > >> > > > > >>>>>>>>>>>> { "match": "/cdns/[^\/]+/queue_update", > > > > >> > > > > >>> "auth": > > > > >> > > > > >>>> { > > > > >> > > > > >>>>>>>> "POST": > > > > >> > > > > >>>>>>>>>>>> ["queue-updates-write"] }}, > > > > >> > > > > >>>>>>>>>>>> { "match": "/cdns/[^\/]+/snapshot", > > > > >> > > > > >>> "auth": > > > > >> > > > > >>>> { > > > > >> > > > > >>>>>>> "PUT": > > > > >> > > > > >>>>>>>>>>>> ["cdn-config-snapshot-write"] }}, > > > > >> > > > > >>>>>>>>>>>> { "match": "/cdns/[^\/]+/health", > > > > >> > > > > >>> "auth": > > > > >> > > > > >>>> { > > > > >> > > > > >>>>>>> "GET": > > > > >> > > > > >>>>>>>>>>>> ["cdn-health-read"] }}, > > > > >> > > > > >>>>>>>>>>>> { "match": "/cdns/[^\/]+/?", > > > > >> > > > > >>> "auth": > > > > >> > > > > >>>> { > > > > >> > > > > >>>>>>> "GET": > > > > >> > > > > >>>>>>>>>>>> ["cdn-read"], "PUT": ["cdn-write"], > "PATCH": > > > > >> > > > > >>> ["cdn-write"], > > > > >> > > > > >>>>>>>> "DELETE": > > > > >> > > > > >>>>>>>>>>>> ["cdn-write"] }}, > > > > >> > > > > >>>>>>>>>>>> { "match": "/cdns", > > > > >> > > > > >>> "auth": > > > > >> > > > > >>>> { > > > > >> > > > > >>>>>>> "GET": > > > > >> > > > > >>>>>>>>>>>> ["cdn-read"], "POST": ["cdn-write"] }}, > > > > >> > > > > >>>>>>>>>>>> > > > > >> > > > > >>>>>>>>>>>> . > > > > >> > > > > >>>>>>>>>>>> . > > > > >> > > > > >>>>>>>>>>>> . > > > > >> > > > > >>>>>>>>>>>> > > > > >> > > > > >>>>>>>>>>>> > > > > >> > > > > >>>>>>>>>>>> On Sun, May 7, 2017 at 12:39 PM Amir > Yeshurun < > > > > >> > > > > >>>> am...@qwilt.com > > > > >> > > > > >>>>>> > > > > >> > > > > >>>>>>>> wrote: > > > > >> > > > > >>>>>>>>>>>> > > > > >> > > > > >>>>>>>>>>>>> Attached please find examples for > forwarding > > > rules > > > > >> file > > > > >> > > > > >>>>>>> (rules.json) > > > > >> > > > > >>>>>>>>>>> and > > > > >> > > > > >>>>>>>>>>>>> the authorization rules file > > > > >> (traffic-ops-routes.json) > > > > >> > > > > >>>>>>>>>>>>> > > > > >> > > > > >>>>>>>>>>>>> > > > > >> > > > > >>>>>>>>>>>>> On Sun, May 7, 2017 at 10:39 AM Amir > Yeshurun > > < > > > > >> > > > > >>>>> am...@qwilt.com> > > > > >> > > > > >>>>>>>>> wrote: > > > > >> > > > > >>>>>>>>>>>>> > > > > >> > > > > >>>>>>>>>>>>>> Hi all, > > > > >> > > > > >>>>>>>>>>>>>> > > > > >> > > > > >>>>>>>>>>>>>> I am about to submit a PR with a first > > > > operational > > > > >> > > > > >>> version > > > > >> > > > > >>>> of > > > > >> > > > > >>>>>> the > > > > >> > > > > >>>>>>>> API > > > > >> > > > > >>>>>>>>>>>> GW, > > > > >> > > > > >>>>>>>>>>>>>> to the "experimental" code base. > > > > >> > > > > >>>>>>>>>>>>>> > > > > >> > > > > >>>>>>>>>>>>>> The API GW forwarding logic is as > follow: > > > > >> > > > > >>>>>>>>>>>>>> > > > > >> > > > > >>>>>>>>>>>>>> 1. Find host to forward the request: > Prefix > > > > match > > > > >> on > > > > >> > > > > >>> the > > > > >> > > > > >>>>>>> request > > > > >> > > > > >>>>>>>>>>> path > > > > >> > > > > >>>>>>>>>>>>>> against a list of forwarding rules. > The > > > matched > > > > >> > > > > >>>> forwarding > > > > >> > > > > >>>>>> rule > > > > >> > > > > >>>>>>>>>>>> defines the > > > > >> > > > > >>>>>>>>>>>>>> target's host, and the target's > > *authorization > > > > >> > > > > >> rules*. > > > > >> > > > > >>>>>>>>>>>>>> 2. Authorization: Regex match on the > request > > > > path > > > > >> > > > > >>>> against a > > > > >> > > > > >>>>>>> list > > > > >> > > > > >>>>>>>> of > > > > >> > > > > >>>>>>>>>>>> *authorization > > > > >> > > > > >>>>>>>>>>>>>> rules*. The matched rule defines the > > required > > > > >> > > > > >>>> capabilities > > > > >> > > > > >>>>> to > > > > >> > > > > >>>>>>>>>>> perform > > > > >> > > > > >>>>>>>>>>>>>> the HTTP method on the route. These > > > capabilities > > > > >> are > > > > >> > > > > >>>>> compared > > > > >> > > > > >>>>>>>>>>>> against the > > > > >> > > > > >>>>>>>>>>>>>> user's capabilities in the user's JWT > > > > >> > > > > >>>>>>>>>>>>>> > > > > >> > > > > >>>>>>>>>>>>>> At this moment, the 2 sets of rules are > > > > hard-coded > > > > >> in > > > > >> > > > > >>> json > > > > >> > > > > >>>>>> files. > > > > >> > > > > >>>>>>>> The > > > > >> > > > > >>>>>>>>>>>>>> files are provided with the API GW > > distribution > > > > and > > > > >> > > > > >>> contain > > > > >> > > > > >>>>>>>>>>> definitions > > > > >> > > > > >>>>>>>>>>>> for > > > > >> > > > > >>>>>>>>>>>>>> TC 2.0 API routes. I have tested parts > of the > > > > API, > > > > >> > > > > >>> however, > > > > >> > > > > >>>>>> there > > > > >> > > > > >>>>>>>>>>> might > > > > >> > > > > >>>>>>>>>>>> be > > > > >> > > > > >>>>>>>>>>>>>> mistakes in some of the routes. Please > be > > > warned. > > > > >> > > > > >>>>>>>>>>>>>> > > > > >> > > > > >>>>>>>>>>>>>> Considering manageability and high > > > availability, > > > > I > > > > >> am > > > > >> > > > > >>> aware > > > > >> > > > > >>>>>> that > > > > >> > > > > >>>>>>>>> using > > > > >> > > > > >>>>>>>>>>>>>> local files for storing the set of > > > authorization > > > > >> rules > > > > >> > > > > >> is > > > > >> > > > > >>>>>>> inferior > > > > >> > > > > >>>>>>>> to > > > > >> > > > > >>>>>>>>>>>>>> centralized configuration. > > > > >> > > > > >>>>>>>>>>>>>> > > > > >> > > > > >>>>>>>>>>>>>> We are considering different > approaches for > > > > >> > centralized > > > > >> > > > > >>>>>>>>> configuration, > > > > >> > > > > >>>>>>>>>>>>>> having the following points in mind > > > > >> > > > > >>>>>>>>>>>>>> > > > > >> > > > > >>>>>>>>>>>>>> - Microservice world: API GW will > front > > > multiple > > > > >> > > > > >>>> services, > > > > >> > > > > >>>>>> not > > > > >> > > > > >>>>>>>> only > > > > >> > > > > >>>>>>>>>>>>>> Mojo. It can also front other TC > components > > > like > > > > >> > > > > >>> Traffic > > > > >> > > > > >>>>>> Stats > > > > >> > > > > >>>>>>>> and > > > > >> > > > > >>>>>>>>>>>> Traffic > > > > >> > > > > >>>>>>>>>>>>>> Monitor. Each service defines its own > routes > > > and > > > > >> > > > > >>>>>> capabilities. > > > > >> > > > > >>>>>>>> Here > > > > >> > > > > >>>>>>>>>>>> comes > > > > >> > > > > >>>>>>>>>>>>>> the question of what is the "source of > > truth" > > > > for > > > > >> the > > > > >> > > > > >>>> route > > > > >> > > > > >>>>>>>>>>>> definitions. > > > > >> > > > > >>>>>>>>>>>>>> - Handling private routes. API GW may > front > > > > non-TC > > > > >> > > > > >>>>> services. > > > > >> > > > > >>>>>>>>>>>>>> - User changes to the AAA scheme. The > > ability > > > > for > > > > >> > > > > >> admin > > > > >> > > > > >>>>> user > > > > >> > > > > >>>>>> to > > > > >> > > > > >>>>>>>>>>> makes > > > > >> > > > > >>>>>>>>>>>>>> changes in the required capabilities > of a > > > route, > > > > >> > > > > >> maybe > > > > >> > > > > >>>> even > > > > >> > > > > >>>>>>>> define > > > > >> > > > > >>>>>>>>>>>> new > > > > >> > > > > >>>>>>>>>>>>>> capability names, was raised in the > past as > > a > > > > use > > > > >> > > > > >> case > > > > >> > > > > >>>> that > > > > >> > > > > >>>>>>>> should > > > > >> > > > > >>>>>>>>>>> be > > > > >> > > > > >>>>>>>>>>>>>> supported. > > > > >> > > > > >>>>>>>>>>>>>> - Easy development and deployment of > new > > > > services. > > > > >> > > > > >>>>>>>>>>>>>> - Using TO DB for expediency. > > > > >> > > > > >>>>>>>>>>>>>> > > > > >> > > > > >>>>>>>>>>>>>> I would appreciate any feedback and > views on > > > your > > > > >> > > > > >>> approach > > > > >> > > > > >>>> to > > > > >> > > > > >>>>>>>> manage > > > > >> > > > > >>>>>>>>>>>>>> route definitions. > > > > >> > > > > >>>>>>>>>>>>>> > > > > >> > > > > >>>>>>>>>>>>>> Thanks > > > > >> > > > > >>>>>>>>>>>>>> /amiry > > > > >> > > > > >>>>>>>>>>>>>> > > > > >> > > > > >>>>>>>>>>>>> > > > > >> > > > > >>>>>>>>>>>> > > > > >> > > > > >>>>>>>>>>> > > > > >> > > > > >>>>>>>>> > > > > >> > > > > >>>>>>>>> > > > > >> > > > > >>>>>>>> > > > > >> > > > > >>>>>>> > > > > >> > > > > >>>>>> > > > > >> > > > > >>>>> > > > > >> > > > > >>>> > > > > >> > > > > >>> > > > > >> > > > > >> > > > > >> > > > > > > > > >> > > > > > > > > >> > > > > > > > >> > > > > > > > >> > > > -- > > > > >> > > > *Shmulik Asafi* > > > > >> > > > Qwilt | Work: +972-72-2221692 <072-222-1692> > > <+972%2072-222-1692> > > > > >> > <+972%2072-222-1692>| Mobile: > > > > >> > > > +972-54-6581595 <054-658-1595> <054-658-1595> > > <+972%2054-658-1595> > > > > >> <+972%2054-658-1595>| > > > > >> > shmul...@qwilt.com > > > > >> > > > <y...@qwilt.com> > > > > >> > > > > > > > >> > > > > > > >> > > > > > >> > > > > > > > > > > > > > > > > > > > > > >