Really interesting, when thinking about load balancing...

    Pier

-- 
----------------------------------------------------------------------------
Pier Fumagalli  <http://www.betaversion.org/>  <mailto:[EMAIL PROTECTED]>

------ Forwarded Message
> From: Charles Forsythe <[EMAIL PROTECTED]>
> Organization: NetVoice Technologies
> Reply-To: [EMAIL PROTECTED]
> Date: Mon, 26 Feb 2001 03:51:50 -0600
> To: [EMAIL PROTECTED]
> Subject: Re: [advanced-servlets] Session Load Balancing   (was: To avoid
> Duplicate Login)
> 
> Nic Ferrier wrote:
>> I don't know how NAS or Websphere work but there are (AFAIK) only two
>> main approaches you can take to session load balancing. ...
>> either:
>> 
>> a) the server recieving the session request asks an authoritative
>> source for the current session data which locks the session until the
>> updated data is returned on completion of the reciever
>> 
>> b) the sever recieiving the session request locks the session for the
>> duration of the request via a broadcast to other servers and on
>> completion sends the updated session data to those other servers
> 
> I thought of a third way a while back.  To my knowledge, it's never been
> done. If anyone thinks it's a good idea, please use it before Microsoft
> patents it.
> 
> Basically, the Session ID is enhanced with a server-of-origin tag.  I'll
> call this a "composite ID" consisting of a "server tag" and a "Session
> ID" where the Session ID serves its traditional function.  Ignoring
> security issues (for now), you might see composite IDs that looked like:
> 
> serverX:sessionPPP
> serverX:sessionDDD
> serverY:sessionQQQ
>  ...and so on...
> 
> In this example, the first ID indicates that server X owns the Session
> with the ID sessionDDD.  The Session with ID sessionQQQ is owned by
> server Y.
> 
> If server X gets a request with a composite ID of "serverX:sessionPPP"
> it proceeds with the request the way a stand-alone container would;
> nothing gets serialized, broadcasted, saved, loaded or locked.
> 
> If the next request from that client is routed to server Y, then server
> Y will get a request with that same composite ID of
> "serverX:sessionPPP".  This tells server Y that the first thing it needs
> to do is get the canonical version of Session sessionPPP from server X.
> (The exact method for this may vary, but suffice to say it will not
> involve spawning Threads from Servlets. :-)  In the response from server
> Y, the composite Session ID will change to "serverY:sessionPPP".
> 
> This approach is extremely efficient if there is any level of server
> affinity in your load balancing.  By server affinity, I mean that the
> load balancing attempts to keep a particular client and server paired.
> For example "DNS round-robin" has 100% server affinity because once the
> client has resolved the IP address of the server, it will continue to go
> to the same server.  DNS round-robin is a poor load balancing, but it
> eliminates application distribution problems entirely.
> 
> On the other end of the scale is the Cisco LocalDirector and other
> "Layer 4 Switches" (also called "sprayers" sometimes).  To put
> perspective on things, consider that a LocalDirector can load balance a
> million simultaneous TCP sessions with a combined throughput of 200
> Mbits/s.  It's aimed at sites that get hundreds of millions of hits per
> day.  The LocalDirector will try some tricks to ensure server affinity,
> but it can't guarantee server affinity (DNS round-robin is really the
> closest you get to guaranteed affinity).  Server affinity is just one of
> several desired goals that are weighted by a LocalDirector
> configuration.  For example, if a client request is paired with a server
> that is currently at its connection limit, the LocalDirector will send
> the request to another server (unless you configure it never to do
> that).
> 
> The net result of this is that Sessions may move from one server to
> another, but it will happen as infrequently as possible.
> 
> The really nasty issue is this: What if a client makes two concurrent
> requests, each of which is routed to a different server?  Well, there
> are a lot of different ways to handle that, but it's problem faced by
> any distributed Servlet container (therefore someone's probably already
> thought of a good solution).
> 
> SECURITY ISSUES:  There is a simple way to make this system resistant to
> exploits and non-catastrophic failures.  Due to painful past experience
> with the blinkered analysis that is usually applied to web application
> security, I figured I'd explore the most obvious wrong answers just to
> get them out of the way.
> 
> Good Session IDs are virtually impossible to guess, thus preventing
> malicious hackers from hijacking other users' Sessions by forging their
> Session IDs.  One-way hash functions, such as MD5, are useful for
> generating values of mysterious origin.  The composite ID must contain a
> server tag that must not be opaque to the servers.  You might think that
> it would be valuable to encrypt the composite ID with a two-way cipher
> before sending it to the client to ensure that the server tag was opaque
> to the client.  Actually, such an encryption accomplishes nothing, so
> you'd be wrong.
> 
> To illustrate, let's look at some Session IDs with an obvious server tag
> format.  What would you gain by making the following changes to a
> Session ID?
> 
> Original:    www1:54b0c58c7ce9f2a8b551351102ee0938
> Case 1:        www1:54b0c58c7ce9f2a8b551351102ee0925
> Case 2:        www2:54b0c58c7ce9f2a8b551351102ee0938
> 
> In case #1, the portion of the composite ID corresponding to the Session
> ID has been changed; the hash value has been changed linearly to a
> smaller value.  This should have the same result it has on any other
> securely-generated Session ID.  That is, it should merely create a
> meaningless random number.
> 
> In case #2, the server-tag has been changed from "www1" to "www2".
> First of all, www2 will only have a Session matching that composite ID
> if had been involved in an earlier request.  If www2 is unfamiliar with
> this Session, the attempt to switch server tags will simply fail.
> 
> Assuming that www2 has participated in that Session, the worst-case
> scenario is that the the Session state it has is out of date.  We need
> to prevent such stale-data exploits.  It's easy to imagine an
> application, such as an online exam, where returning to a previous
> application state might provide an undesirable advantage to the client.
> 
> An approach I've seen used is to change the value of the Session ID with
> each request.  This is employed in non-distributed applications to
> insure that a stolen Session ID is only valuable in the short time
> between its issue and the subsequent request.  Furthermore, a
> successfully hijacked Session will cause the legitimate user to lose the
> sequential integrity of Session IDs, locking that user out of the
> application and making them instantly aware that there is some kind of
> problem.
> 
> Realistically, if an attacker was able to steal a Session ID that was
> still valid, it could be used immediately, thereby negating the benefit
> of changing it on each request.  Additionally, two decades of experience
> with Microsoft products has acclimatized users to frequent, inexplicable
> software failures.  The casts serious doubt on the scenario wherein the
> legitimate user finds the sudden inability to use a web application
> mysterious, suspicious or even unusual.
> 
> In the distributed case, this questionable "security feature" might
> appear to prevent an attacker from returning to a previous server and
> its stale Session state.  Simply changing the server tag of the current
> composite ID should fail because the Session ID will have changed as
> well, rendering it meaningless to any servers with stale data.  Again,
> while this is true, its only actual effect is an increase in the
> complexity of the Session management code.
> 
> For example, we might have these IDs:
> 
> Last ID on www2:    www2:54b0c58c7ce9f2a8b551351102ee0938
> Current ID on www1:    www1:3699ae702046d4d24d5ced13f2034531
> 
> The attacker records the first ID from www2, and forces a server switch
> to www1 (or any other server).  The procedure to force a server switch
> depends on the method of server affinity used, but, again, no
> server-affinity method is bullet-proof.  After the switch, the attacker
> could request the stale Session state by replaying the old ID.  It
> doesn't matter that the Session ID has changed or even if the server tag
> is indecipherable to the client.
> 
> This is why encrypted IDs don't do any good.  If there is any benefit to
> switching back to a Server with stale data, the only information you
> need to do so is the value of the composite ID last delivered by that
> stale server.  It bears repeating: this is regardless of whether or not
> you can interpret or modify the composite ID's contents.  The world is
> full of web developers who think that Session Cookies containing
> encrypted data provite really 31337 application security.  Why?  FOR THE
> LOVE OF GOD, WHY?!  If you don't want the client to have access to some
> data, KEEP IT ON THE SERVER (indexed by a suitably random Session ID
> that is sent to the client).
> 
> Anyway, the easy (and obvious) answer to preventing stale-data exploits
> is to prevent stale data from being considered valid.  Each server
> simply invalidates its own copy of the Session state when it is sent to
> another server.  
> 
> In addition, the server releasing the state should maintain a
> "forwarding address" for the current Session state.  If, for example,
> www2 were to get a request for a Session it no longer maintains, it
> could request that Session from the server it last sent the state to
> (e.g. www1).  If, in turn, that Server no longer has the official copy,
> the request would be relayed to the next server in the chain (e.g.
> wwwN).  The worst case would be an exhaustive search of the server farm
> to find the data.  If the server affinity mechanism works at all, it is
> extremely unlikely that this would occur.
> 
> The active state search is a valuable feature.  Not only will it
> gracefully thwart stale data exploits, but it provides an elegant
> recovery mechanism in case there is a glitch that causes the client to
> get out of sync with the servers.
> 
> In order for the search to work, the Session ID must remain static
> throughout the lifetime of the Session, so that it is the same on every
> server that hosts it.  Therefore, rotating the Session ID (Lame Idea #1)
> costs you more in functionality than it gains you in security.  Even
> without the lost-state search, invalidating state Session state will
> remove any value to obscuring or the server-tag syntax or encrypting the
> composite IDs (Lame Idea #2).
> 
> -- Charles
> 
> Before posting a question, try to find your answer here:
> <http://www.egroups.com/links/advanced-servlets>
> Announcements should go to: [EMAIL PROTECTED]
> To Post a message, send it to: [EMAIL PROTECTED]
> To Unsubscribe, send a blank message to:
> [EMAIL PROTECTED]
> 
> Your use of Yahoo! Groups is subject to http://docs.yahoo.com/info/terms/
> 
> 

------ End of Forwarded Message


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, email: [EMAIL PROTECTED]

Reply via email to