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>
> > > >> > > >
> > > >> > >
> > > >> >
> > > >>
> > > >
> > > >
> > >
> >
>

Reply via email to