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" <[email protected]> wrote:

    Moving discussion to the wiki page. Commented on Jeremy's notes
    
    On Fri, May 12, 2017 at 7:41 AM Shmulik Asafi <[email protected]> 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" <[email protected]> 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 <[email protected]> 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 <[email protected]>
    > > 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 <[email protected]>
    > > > > 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 <
    > > [email protected]
    > > > >
    > > > >> 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 <
    > [email protected]
    > > >
    > > > >> > 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 <
    > > [email protected]>
    > > > >> > 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) <
    > > > >> > > > [email protected]> 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 <
    > > [email protected]
    > > > >
    > > > >> > > 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 <
    > > > >> [email protected]>
    > > > >> > > > 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" <[email protected]
    > >
    > > > >> 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 <
    > > > >> > > > [email protected]
    > > > >> > > > > >
    > > > >> > > > > >>> 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 <
    > > > >> > > > [email protected]
    > > > >> > > > > >
    > > > >> > > > > >>>> 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 <
    > > > >> > > > > >> [email protected]
    > > > >> > > > > >>>>
    > > > >> > > > > >>>>> 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 <
    > > > >> > [email protected]>
    > > > >> > > > > >>> 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 <
    > > > >> > [email protected]>
    > > > >> > > > > >>>> 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)
    > > > >> <
    > > > >> > > > > >>>>>>>> [email protected]>
    > > > >> > > > > >>>>>>>> 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 <
    > > > >> > [email protected]
    > > > >> > > > > >>>
    > > > >> > > > > >>>>> 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 <
    > > > >> > > > > >>>>>>> [email protected]
    > > > >> > > > > >>>>>>>>>
    > > > >> > > > > >>>>>>>>>> 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 <
    > > > >> > > > > >>>> [email protected]>
    > > > >> > > > > >>>>>>>> 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 
<
    > > > >> > > > > >>>> [email protected]
    > > > >> > > > > >>>>>>
    > > > >> > > > > >>>>>>>> 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
    > <
    > > > >> > > > > >>>>> [email protected]>
    > > > >> > > > > >>>>>>>>> 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>|
    > > > >> > [email protected]
    > > > >> > > > <[email protected]>
    > > > >> > > >
    > > > >> > >
    > > > >> >
    > > > >>
    > > > >
    > > > >
    > > >
    > >
    >
    

Reply via email to