Php

代理後面的 docker 容器中的 shibboleth SP 問題

  • April 21, 2020

我正在嘗試在代理後面的 docker 容器中設置 shibboleth。

目前我可以被重定向到 shibboleth idp 頁面,我可以在其中輸入我的登錄詳細資訊,shibboleth 將對我進行身份驗證。當它嘗試重定向回時失敗並出現 404:https ://my-service.org/Shibboleth.sso/SAML2/POST

我不知道這是 apache 問題還是 shibboleth 配置的問題。

有一個執行 apache 和 docker 的伺服器。這裡的 apache 將流量代理到在同一台伺服器上執行的 docker 容器。我有 dns 將域名指向代理。讓我們稱之為“my-service.org”。my-service.org 的 apache 代理配置如下:

<IfModule mod_ssl.c>
   <VirtualHost *:80>
       ServerName my-service.org
       ServerAdmin devs@blah.org
       DocumentRoot /var/www/html/my-service

       Redirect permanent / https://my-service.org/

       ErrorLog ${APACHE_LOG_DIR}/error.log
       CustomLog ${APACHE_LOG_DIR}/access.log combined
   </VirtualHost>
   <VirtualHost _default_:443>
       ServerName my-service.org
       ServerAdmin devs@blah.org
       DocumentRoot /var/www/html/my-service

       ErrorLog ${APACHE_LOG_DIR}/docker-dev/my-service.log
       CustomLog ${APACHE_LOG_DIR}/docker-dev/my-service_ssl_access.log combined

       SSLEngine on
       SSLCertificateFile  /etc/ssl/certs/blah.crt
       SSLCertificateKeyFile  /etc/ssl/private/blah.key
       SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:ECDHE-RSA-AES128-SHA:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4
       SSLProtocol All -SSLv2 -SSLv3
       SSLCompression off
       SSLHonorCipherOrder on

       ProxyPreserveHost On
       RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME}
       RequestHeader set X-Forwarded-SSL expr=%{HTTPS}
       ProxyPass / http://127.0.0.1:8088/
       ProxyPassReverse / http://127.0.0.1:8088/       
   </VirtualHost>
</IfModule>

‘my-service’ 容器基於 ‘php:7-apache-buster’ 容器並使用 shibd 執行 apache。它是 docker-compose 堆棧的一部分。容器的 apache 配置為:

<VirtualHost *:80>
 ServerAdmin me@blah.org
 DocumentRoot /var/www/html/my-service

 <Directory /var/www/html/my-service/>
     Options Indexes FollowSymLinks MultiViews
     AllowOverride All
     Order deny,allow
     Allow from all
 </Directory>

 <Location "/shibboleth_login.php">
   AuthType shibboleth
   ShibRequestSetting requireSession 1
   ShibUseHeaders On
   require valid-user
 </Location>

 ErrorLog ${APACHE_LOG_DIR}/error.log
 CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

就像我說的那樣,一切都在正常工作,直到從 shibboleth idp 重定向回 SP,它的位置為 404。日誌並沒有告訴我太多,但是當我載入容器 apache 配置時出現錯誤日誌:

AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.6. Set the 'ServerName' directive globally to suppress this message

我不確定這是否會對這種情況產生影響。

我認為可能會產生影響的一件事是我設置了 shibboleth 來處理 SSL:

<Sessions lifetime="28800" timeout="3600" relayState="ss:mem"
                 checkAddress="false" handlerSSL="true" cookieProps="https">

但是我的容器 apache 配置只定義了一個 HTTP 虛擬主機塊。如您所見,代理通過X-Forwarded-ProtoandX-Forwarded-SSL標頭將協議傳遞給容器。我需要那些用於“我的服務”的 php 應用程序,但不確定它們是否對 shibboleth 有影響。與 idp 的初始互動工作正常,只是重定向不起作用。

我發現我需要添加一個ServerName屬性,如下所示:

<VirtualHost *:80>
 ServerAdmin me@blah.org
 DocumentRoot /var/www/html/my-service

 ServerName https://my-service.org:443
 UseCanonicalName On

 <Directory /var/www/html/my-service/>
     Options Indexes FollowSymLinks MultiViews
     AllowOverride All
     Order deny,allow
     Allow from all
 </Directory>

 <Location "/shibboleth_login.php">
   AuthType shibboleth
   ShibRequestSetting requireSession 1
   ShibUseHeaders On
   require valid-user
 </Location>

 ErrorLog ${APACHE_LOG_DIR}/error.log
 CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

引用自:https://serverfault.com/questions/1013161