Well you need to point crsplabweb2.example.com to the haproxy IP that's the whole point of it running behind a proxy. Or am I missing something?
On Mon, Oct 29, 2018 at 1:28 PM Imam Toufique <[email protected]> wrote: > Hi Igor, > > Thank you so much, I will definitely try your suggestions, but I am not > sure how it will help my situation. shibboleth SP looks for, let's > suppose, https://crsplabweb2.example.com/Shibboleth.sso - for it it's > single sign-on. for apache or nginx to talk to the SP, SP needs to run in > the same node ( as far as I know ). So, I am not sure how shibboleth will > be able to communicate with the HAP for its SSO calls. > > --imam > > > > On Sun, Oct 28, 2018 at 5:21 PM Igor Cicimov < > [email protected]> wrote: > >> Hi Imam, >> >> On Sat, Oct 27, 2018 at 4:42 PM Imam Toufique <[email protected]> >> wrote: >> >>> Hi Igor, >>> >>> Thanks very much for offering to help! I will do this in sections, >>> hopefully, I can keep this from being too cluttered. >>> >>> haproxy.cfg: >>> >>> -------------------------------------------------------------------------------------- >>> global >>> #log /dev/log local0 debug >>> #log /dev/log local1 debug >>> log 127.0.0.1 local2 >>> chroot /var/lib/haproxy >>> stats timeout 30s >>> user haproxy >>> group haproxy >>> tune.ssl.default-dh-param 2048 >>> daemon >>> >>> defaults >>> log global >>> mode http >>> option tcplog >>> option dontlognull >>> timeout connect 5000 >>> timeout client 50000 >>> timeout server 50000 >>> timeout tunnel 9h >>> option tcp-check >>> >>> frontend http_front >>> bind :80 >>> bind 0.0.0.0:443 ssl crt /etc/haproxy/crsplab2_1.pem >>> stats uri /haproxy?stats >>> default_backend web1_cluster >>> option httplog >>> log global >>> #option dontlognull >>> log /dev/log local0 debug >>> mode http >>> option forwardfor # forward IP >>> http-request set-header X-Forwarded-Port %[dst_port] >>> http-request add-header X-Forwarded-Proto https if { ssl_fc } >>> redirect scheme https if !{ ssl_fc } >>> >>> acl host_web2 hdr(host) -i crsplab2.oit.uci.edu/webdav >>> use_backend webdav_cluster if host_web2 >>> >>> acl host_web3 path_beg /jhub >>> use_backend web3_cluster if host_web3 >>> >>> >>> backend webdav_cluster >>> balance roundrobin >>> server web1 10.1.100.156:8080 check inter 2000 cookie w1 >>> server web2 10.1.100.160:8080 check inter 2000 cookie w2 >>> >>> backend web3_cluster >>> server publicIP:443 check ssl verify none inter 2000 cookie w1 >>> >>> ----------------------------------------------------------------------------------------------------- >>> Note: I have a single backend node, as it was easy to test with just one >>> node, instead of making changes to 2 nodes at a time. >>> >>> Here is my apache config: >>> >>> in httpd.conf, only change I have made is ( the rest is a stock centos >>> 7.5 httpd.conf ): >>> ------------------------------------- >>> ServerName 10.1.100.160:80 ( Internal IP of the backend node) >>> Redirect permanent /jhub https://crsplabweb1.domain.com/jhub >>> ------------------------------------- >>> >>> in my ssl.conf, where I access the jupyterhub instance running in >>> 127.0.0.1:8000 . Also, note that the backend is running shibboleth >>> SP. One of the issues I encountered is, If I did not have SSL , i was >>> getting a browser warning for not having SSL. >>> >>> Here is my ssl.conf: >>> >>> >>> -------------------------------------------------------------------------- >>> Listen 443 https >>> SSLPassPhraseDialog exec:/usr/libexec/httpd-ssl-pass-dialog >>> SSLSessionCache shmcb:/run/httpd/sslcache(512000) >>> SSLSessionCacheTimeout 300 >>> SSLRandomSeed startup file:/dev/urandom 256 >>> SSLRandomSeed connect builtin >>> SSLCryptoDevice builtin >>> >>> <VirtualHost _default_:443> >>> >>> UseCanonicalName on >>> ServerName crsplabweb1.domain.com:443 >>> >>> ErrorLog logs/ssl_error_log >>> TransferLog logs/ssl_access_log >>> LogLevel warn >>> >>> SSLEngine on >>> >>> SSLProtocol all -SSLv2 -SSLv3 >>> SSLCipherSuite HIGH:3DES:!aNULL:!MD5:!SEED:!IDEA >>> SSLCertificateFile /etc/pki/tls/certs/crsplabweb1.domain.com_cert.cer >>> SSLCertificateKeyFile /etc/pki/tls/certs/crsplabweb2.key >>> SSLCertificateChainFile >>> /etc/pki/tls/certs/crsplabweb1.domain.com_interm_reverse.c >>> >>> <Files ~ "\.(cgi|shtml|phtml|php3?)$"> >>> SSLOptions +StdEnvVars >>> </Files> >>> <Directory "/var/www/cgi-bin"> >>> SSLOptions +StdEnvVars >>> </Directory> >>> >>> <Location /jhub> >>> ProxyPass http://127.0.0.1:8000/jhub >>> ProxyPassReverse http://127.0.0.1:8000/jhub >>> RequestHeader unset Accept-Encoding >>> ProxyPreserveHost on >>> AuthType shibboleth >>> ShibRequestSetting requireSession 1 >>> Require shibboleth >>> ShibUseHeaders On >>> ShibBasicHijack On >>> RewriteEngine On >>> RequestHeader set X-Remote-User %{REMOTE_USER}s >>> </Location> >>> >>> <LocationMatch >>> "/jhub/(user/[^/]*)/(api/kernels/[^/]+/channels/websocket)(.*)"> >>> ProxyPassMatch ws://127.0.0.1:8000/jhub/$1/$2$3 >>> ProxyPassReverse ws://127.0.0.1:8000/jhub/$1/$2$3 >>> </LocationMatch> >>> >>> BrowserMatch "MSIE [2-5]" \ >>> nokeepalive ssl-unclean-shutdown \ >>> downgrade-1.0 force-response-1.0 >>> >>> CustomLog logs/ssl_request_log \ >>> "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b" >>> </VirtualHost> >>> >>> ---------------------------------------------------------------------------------- >>> >>> Thanks >>> >> >> Your problem is that you are not using the Forwarded headers set by HAP >> in Apache thus you get http response instead ssl. >> >> First for haproxy create a directory where you will keep all your SSL >> certs, lets say /etc/haproxy/ssl.d/, and put the crsplab2.oit.uci.edu >> and crsplabweb1.domain.com certificates inside. More details on setting >> SSL certificates in Haproxy can be found here: >> https://cbonte.github.io/haproxy-dconv/1.7/configuration.html#5.1-crt >> >> The config will then look something like this: >> >> frontend http_front >> bind *:80 >> bind *:443 ssl crt /etc/haproxy/ssl.d/ no-sslv3 no-tls-tickets ... >> >> backend web3_cluster >> server shibboleth1 10.1.100.160:80 check inter 2000 >> >> On the apache side remove the ssl settings (since now HAP will be >> terminating SSL) and set a SSL redirect, something like this: >> >> <VirtualHost *:80> >> ServerName crsplabweb1.domain.com >> ServerAlias www.crsplabweb1.domain.com >> >> SetEnvIfNoCase X-Forwarded-Proto https HTTPS=on >> # Insure the pages requested over ssl are always over ssl >> RewriteEngine On >> RewriteCond %{HTTP_X_Forwarded_Proto} ^https$ >> RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R,L] >> ... >> </VirtualHost> >> Let me know if any further questions. >> >> >>> On Fri, Oct 26, 2018 at 8:34 PM Igor Cicimov < >>> [email protected]> wrote: >>> >>>> Hi Imam, >>>> >>>> On Sat, Oct 27, 2018 at 9:37 AM Imam Toufique <[email protected]> >>>> wrote: >>>> >>>>> Hi, >>>>> >>>>> I came up with the following config, things seem to be working now, >>>>> for the most part. >>>>> >>>>> frontend http_front >>>>> bind :80 >>>>> bind 0.0.0.0:443 ssl crt /etc/haproxy/crsplab2_1.pem >>>>> stats uri /haproxy?stats >>>>> default_backend web1_cluster >>>>> option httplog >>>>> log global >>>>> #option dontlognull >>>>> log /dev/log local0 debug >>>>> mode http >>>>> option forwardfor # forward IP >>>>> http-request set-header X-Forwarded-Port %[dst_port] >>>>> http-request add-header X-Forwarded-Proto https if { ssl_fc } >>>>> redirect scheme https if !{ ssl_fc } >>>>> acl host_web3 path_beg /jhub >>>>> use_backend web3_cluster if host_web3 >>>>> >>>>> web3_cluster >>>>> >>>>> backend web3_cluster >>>>> mode http >>>>> balance source >>>>> server crsplabweb1.domain.com publicIP:443 check ssl verify none >>>>> inter 2000 cookie w1 >>>>> >>>>> The above config gets me to the backend node -- where I have a >>>>> jupyterhub instance running + . Shibboleth SP running for authentication. >>>>> As I could not get shibboleth SP to work by staying in my private network, >>>>> I had to set up a public IP for the backend node, get SSL certs - so >>>>> shibboleth authentication could be done. I am sure there is a better >>>>> approach to this, but I don't know what it is. I will be trying out SNAT >>>>> to see if that will allow me to keep using my private IP for the backend >>>>> nodes. If any of you know how to do SNAT, please chime in, it would be >>>>> worth the time/effort to try it out. >>>>> >>>>> Now, the interesting thing I have noticed with the above setup -- when >>>>> I connect to HAProxy, let's say with https://proxy.domain.com , I >>>>> authenticate with shibboleth, and then the URL in the browser points to >>>>> the >>>>> backend node. >>>>> >>>>> For example: >>>>> >>>>> my proxy address: https://proxy.domain.com/jhub >>>>> >>>>> after I connect to the backend, the URL turns into - >>>>> https://crsplabweb1.domain.com/jhub/tree? >>>>> >>>>> ...and everything works thereafter. >>>>> >>>>> I tried the rewrite method that Igor has suggested before, that did >>>>> not make any difference. But what I noticed is, after I connect, no >>>>> traffic go through the proxy anymore, my client ( i.e. laptop) connects >>>>> directly to the backend server. Not sure if this good or bad though (?) , >>>>> but, I am not sure how to configure this so that I will go through a >>>>> proxy but still be connected in the backend via a private IP and I can ( >>>>> still ) authenticate via shibboleth. >>>>> >>>>> So, when I change the 'web3_cluster' backend to : >>>>> >>>>> server crsplabweb1 privateIP:80 inter 2000 cookie w1 >>>>> >>>>> and, I set backend apache to accept connection on port 80, then I >>>>> break shibboleth authentication. >>>>> >>>>> Any inputs here? >>>>> >>>>> thanks, guys! >>>>> >>>>> >>>> I think it is time for you to provide the full HAP and Apache configs >>>> so we can see what is going on (please obfuscate any sensitive data). Also >>>> the use of the "cookie w1" is not clear since you are not setting it >>>> in HAP and is kinda redundant for single backend setup. >>>> >>>> >>>>> >>>>> On Thu, Oct 25, 2018 at 1:21 AM Igor Cicimov < >>>>> [email protected]> wrote: >>>>> >>>>>> >>>>>> >>>>>> On Thu, Oct 25, 2018 at 6:31 PM Igor Cicimov < >>>>>> [email protected]> wrote: >>>>>> >>>>>>> >>>>>>> >>>>>>> On Thu, 25 Oct 2018 6:13 pm Imam Toufique <[email protected]> >>>>>>> wrote: >>>>>>> >>>>>>>> so I almost got this to work, based on the situation I am in. To >>>>>>>> elaborate just a bit, my setup involves a shibboleth SP that I need to >>>>>>>> authenticate my application. Since I can't set up the HA proxy node >>>>>>>> with >>>>>>>> shibboleth SP - I had to wrap my application in the backend with >>>>>>>> apache so >>>>>>>> I can pass REMOTE_USER to the application. the application I have is - >>>>>>>> jupyterhub and it start with its own proxy. Long story short, here is >>>>>>>> my >>>>>>>> current setup: >>>>>>>> >>>>>>>> frontend >>>>>>>> bind :80 >>>>>>>> bind :443 ssl crt /etc/haproxy/crsplab2_1.pem >>>>>>>> stats uri /haproxy?stats >>>>>>>> default_backend web1_cluster >>>>>>>> option httplog >>>>>>>> log global >>>>>>>> #option dontlognull >>>>>>>> log /dev/log local0 debug >>>>>>>> mode http >>>>>>>> option forwardfor # forward IP >>>>>>>> http-request set-header X-Forwarded-Port %[dst_port] >>>>>>>> http-request add-header X-Forwarded-Proto https if { ssl_fc } >>>>>>>> redirect scheme https if !{ ssl_fc } >>>>>>>> >>>>>>>> acl host_web3 path_beg /jhub >>>>>>>> use_backend web3_cluster if host_web3 >>>>>>>> >>>>>>>> backend >>>>>>>> server web1.oit.uci.edu 128.110.80.5:80 check >>>>>>>> >>>>>>>> this works for the most part. But I am confused with a problem. >>>>>>>> when I get to my application, my backend IP address shows up in the >>>>>>>> browser >>>>>>>> URL. >>>>>>>> >>>>>>>> for example, I see this in my browser: >>>>>>>> >>>>>>>> http://128.110.80.5/jhub/user/itoufiqu/tree? >>>>>>>> >>>>>>>> whereas, I was expecting that it would show the original URL, such >>>>>>>> as: >>>>>>>> >>>>>>>> http://crsplab2.domain.com/jhub/user/itoufiqu/tree? ( where >>>>>>>> crsplab2.domain.com is the URL to get HAproxy ) >>>>>>>> >>>>>>> >>>>>>> You need to tell your backend app that it runs behind reverse proxy >>>>>>> with ssl termination and that it's domain/url is >>>>>>> https://crsplab2.domain.com >>>>>>> <http://crsplab2.domain.com/jhub/user/itoufiqu/tree>. How you do >>>>>>> that depends on the backend app you are using but most of them like >>>>>>> apache2, tomcat etc. have specific configs that you can find in their >>>>>>> documentation. For example if your backend is apache2 I bet you don't >>>>>>> have >>>>>>> the DomainName set in the config in which case it defaults to the host >>>>>>> ip >>>>>>> address. >>>>>>> >>>>>> >>>>>> You can also try: >>>>>> >>>>>> rspirep ^Location:\ http://(.*):80(.*) Location:\ https:// >>>>>> crsplab2.domain.com >>>>>> <http://crsplab2.domain.com/jhub/user/itoufiqu/tree>:443\2 if { >>>>>> ssl_fc } >>>>>> >>>>>> to fix the URL but note that this will not save you from hard coded >>>>>> url's in the returned html pages the way apache does. >>>>>> >>>>>> >>>>>>> >>>>>>>> While I am no expert in HA proxy world, I think this might due to >>>>>>>> the fact that my backend does not have SSL and HAproxy frontend does >>>>>>>> have >>>>>>>> SSL. At this point, I would avoid that IP address showing up in the >>>>>>>> browser. what is the best way to accomplish this? >>>>>>>> >>>>>>>> thanks for your continues help! >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> On Tue, Oct 23, 2018 at 8:35 AM Aleksandar Lazic < >>>>>>>> [email protected]> wrote: >>>>>>>> >>>>>>>>> Hi. >>>>>>>>> >>>>>>>>> Am 23.10.2018 um 09:04 schrieb Imam Toufique: >>>>>>>>> > I am looking for some help on how to write the following apache >>>>>>>>> proxypass rules >>>>>>>>> > in HAproxy. Not to mention I am at a bit of loss with my first >>>>>>>>> try :-) . Here >>>>>>>>> > are my current proxypass rules: >>>>>>>>> > >>>>>>>>> > ProxyPass http://10.1.100.156:8000/jhub >>>>>>>>> > ProxyPassReverse http://10.1.100.156:8000/jhub >>>>>>>>> >>>>>>>>> Well ProxyPass and ProxyPassReverse do a lot of thinks not just >>>>>>>>> rewrites, as >>>>>>>>> mentioned in the doc >>>>>>>>> >>>>>>>>> https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxypass >>>>>>>>> >>>>>>>>> https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxypassreverse >>>>>>>>> >>>>>>>>> >>>>>>>>> > <LocationMatch >>>>>>>>> "/jhub/(user/[^/]*)/(api/kernels/[^/]+/channels/websocket)(.*)"> >>>>>>>>> > ProxyPassMatch ws://10.1.100.156:8000/jhub/$1/$2$3 >>>>>>>>> > ProxyPassReverse ws://10.1.100.156:8000/jhub/$1/$2$3 >>>>>>>>> > </LocationMatch> >>>>>>>>> > >>>>>>>>> > As I am not well versed in the massive HAproxy configuration >>>>>>>>> guide, if any of >>>>>>>>> > you can give me a hand with this, I would very much appreciate >>>>>>>>> it. >>>>>>>>> >>>>>>>>> I'm also not "that" expert but I would try the following, untested. >>>>>>>>> >>>>>>>>> ### >>>>>>>>> defaults >>>>>>>>> mode http >>>>>>>>> log global >>>>>>>>> >>>>>>>>> #... maybe some other settings >>>>>>>>> timeout tunnel 10h >>>>>>>>> >>>>>>>>> frontend https_001 >>>>>>>>> >>>>>>>>> #... maybe some other settings >>>>>>>>> >>>>>>>>> acl websocket path_beg /jhub >>>>>>>>> >>>>>>>>> #... maybe some other acls >>>>>>>>> >>>>>>>>> use_backend websocket_001 if websocket >>>>>>>>> >>>>>>>>> backend websocket_001 >>>>>>>>> >>>>>>>>> reqrep "^([^\ :]*) >>>>>>>>> /jhub/(user/[^/]*)/(api/kernels/[^/]+/channels/websocket)(.*)" >>>>>>>>> "/jhub/\1/\2\3" >>>>>>>>> >>>>>>>>> # You will need to replace the first column with the response >>>>>>>>> from the >>>>>>>>> # backend response >>>>>>>>> # rspirep "^Location: >>>>>>>>> /jhub/(user/[^/]*)/(api/kernels/[^/]+/channels/websocket)(.*)" >>>>>>>>> "Location: >>>>>>>>> /jhub/\1/\2\3" >>>>>>>>> # OR >>>>>>>>> # http-response replace-header Location >>>>>>>>> "/jhub/(user/[^/]*)/(api/kernels/[^/]+/channels/websocket)(.*)" >>>>>>>>> "/jhub/\1/\2\3" >>>>>>>>> >>>>>>>>> # add some checks >>>>>>>>> >>>>>>>>> server ws_01 10.1.100.156:8000 check >>>>>>>>> ### >>>>>>>>> >>>>>>>>> Here are some links which may help you also. >>>>>>>>> >>>>>>>>> >>>>>>>>> https://www.haproxy.com/blog/websockets-load-balancing-with-haproxy/ >>>>>>>>> >>>>>>>>> https://cbonte.github.io/haproxy-dconv/1.8/configuration.html#4-reqirep >>>>>>>>> >>>>>>>>> https://cbonte.github.io/haproxy-dconv/1.8/configuration.html#4-rspirep >>>>>>>>> >>>>>>>>> I would run haproxy in Debug mode and see how the request pass >>>>>>>>> haproxy and adopt >>>>>>>>> the config. >>>>>>>>> >>>>>>>>> It would be nice when you show us the working conf ;-) >>>>>>>>> >>>>>>>>> It would be nice to have a >>>>>>>>> >>>>>>>>> http-request replace-uri <match-regex> <replace-fmt> >>>>>>>>> >>>>>>>>> to replace the reqrep. >>>>>>>>> >>>>>>>>> > thanks >>>>>>>>> >>>>>>>>> Hth >>>>>>>>> Aleks >>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>>> -- >>>>>>>> Regards, >>>>>>>> *Imam Toufique* >>>>>>>> *213-700-5485* >>>>>>>> >>>>>>> >>>>>> >>>>>> -- >>>>>> Igor Cicimov | DevOps >>>>>> >>>>>> >>>>>> p. +61 (0) 433 078 728 >>>>>> e. [email protected] <http://encompasscorporation.com/> >>>>>> w*.* www.encompasscorporation.com >>>>>> a. Level 4, 65 York Street, Sydney 2000 >>>>>> >>>>> >>>>> >>>>> -- >>>>> Regards, >>>>> *Imam Toufique* >>>>> *213-700-5485* >>>>> >>>> >>>> >>>> -- >>>> Igor Cicimov | DevOps >>>> >>>> >>>> p. +61 (0) 433 078 728 >>>> e. [email protected] <http://encompasscorporation.com/> >>>> w*.* www.encompasscorporation.com >>>> a. Level 4, 65 York Street, Sydney 2000 >>>> >>> >>> >>> -- >>> Regards, >>> *Imam Toufique* >>> *213-700-5485* >>> >> >> >> -- >> Igor Cicimov | DevOps >> >> >> p. +61 (0) 433 078 728 >> e. [email protected] <http://encompasscorporation.com/> >> w*.* www.encompasscorporation.com >> a. Level 4, 65 York Street, Sydney 2000 >> > > > -- > Regards, > *Imam Toufique* > *213-700-5485* > -- Igor Cicimov | DevOps p. +61 (0) 433 078 728 e. [email protected] <http://encompasscorporation.com/> w*.* www.encompasscorporation.com a. Level 4, 65 York Street, Sydney 2000

