代理後面的 docker 容器中的 shibboleth SP 問題
我正在嘗試在代理後面的 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-Proto
andX-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>