tweet:2016:0112_01
NGiNX+SSL+Authで認証に失敗する
管理しているシステムで、不思議な挙動に遭遇したので、メモっておく。
とりあえず解決はしたっぽいのだが、あまりにもWorkAroundっぽいので、「これで今後も大丈夫なのか?」も含めて、原因は不明。
問題が発生した環境
対外部分:NGiNXを用いたHTTP/HTTPs LoadBalancer * OS: FreeBSD 10.2-RELEASE * NGiNX: 1.8.0 (portsから)
- Compile Optionとして、LDAP AuthモジュールとDEBUG関連Moduleを投入している
内部: Zabbix * OS: CentOS 7 * Apache * Zabbix (http://zabbix.example.com / https://zabbix.example.com )
+------------+ +-----------------------+ -----+ FBSD/NGiNX +-----+ CentOS7/Apache/Zabbix | +------------+ +-----------------------+
発生した症状
* https接続(SSL)で、Zabbixにアクセスし、スクリーンタブを開くと、Basic認証画面が表示され、一部の画像が取れなくなる。
- そのページの全ての画像が見られなくなるわけではないところが悩ましい。
- 同じページをhttpで接続(not SSL)すると、問題なく表示できる。
- 認証に失敗し取得できなかった画像ページを直接アクセスすると、問題なく画像が取得できる。
発生時の設定(抜粋)
なお、ここでは、LDAP設定の方を記載しているが、BASIC認証でも同じ問題が発生した。
(snip...) ssl_engine cryptodev; # for AES-NI (snip...) http { (snip...) ##### SSL Configuration ssl_ciphers DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-CAMELLIA128-SHA:DHE-RSA-AES128-SHA:AES128-GCM-SHA256:AES128-SHA256:CAMELLIA128-SHA:AES128-SHA:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-RSA-CAMELLIA256-SHA:DHE-RSA-AES256-SHA:AES256-GCM-SHA384:AES256-SHA256:CAMELLIA256-SHA:AES256-SHA:!aNULL:!MD5; ssl_prefer_server_ciphers on; ssl_protocols TLSv1.2 TLSv1.1 TLSv1; ssl_session_cache shared:SSLresumption:10m; ssl_session_timeout 10m; ##### LDAP Authentication Configuration ldap_server ldap { url ldap://... require valid_user; } upstream ZAB { server 192.0.2.128:80 max_fails=3 fail_timeout=10; } server { listen 198.51.100.128:80; server_name zabbix.example.com; auth_ldap "Forbidden"; auth_ldap_servers ldap; location / { proxy_pass http://ZAB/; proxy_redirect default; } } server { listen 198.51.100.128:443 ssl; server_name zabbix.example.com; auth_ldap "Forbidden"; auth_ldap_servers ldap; ssl on; ssl_certificate /some/where/zabbix.cert; ssl_certificate_key /some/where/zabbix.key; location / { proxy_pass http://ZAB/; proxy_redirect default; } } }
WordAround
なぜか、設定を以下のように修正したら、この問題は再現しなくなった。
(snip...) ssl_engine cryptodev; # for AES-NI (snip...) http { (snip...) large_client_header_buffers 4 256k; ##### SSL Configuration ssl_ciphers DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-CAMELLIA128-SHA:DHE-RSA-AES128-SHA:AES128-GCM-SHA256:AES128-SHA256:CAMELLIA128-SHA:AES128-SHA:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-RSA-CAMELLIA256-SHA:DHE-RSA-AES256-SHA:AES256-GCM-SHA384:AES256-SHA256:CAMELLIA256-SHA:AES256-SHA:!aNULL:!MD5; ssl_prefer_server_ciphers on; ssl_protocols TLSv1.2 TLSv1.1 TLSv1; ssl_session_cache shared:SSLresumption:10m; ssl_session_timeout 10m; ##### LDAP Authentication Configuration ldap_server ldap { url ldap://... require valid_user; } upstream ZAB { server 192.0.2.128:80 max_fails=3 fail_timeout=10; } server { listen 198.51.100.128:80; server_name zabbix.example.com; auth_ldap "Forbidden"; auth_ldap_servers ldap; location / { proxy_pass http://ZAB/; proxy_redirect default; } } server { listen 198.51.100.128:443 ssl; server_name zabbix.example.com; ssl on; ssl_certificate /some/where/zabbix.cert; ssl_certificate_key /some/where/zabbix.key; auth_ldap "Forbidden"; auth_ldap_servers ldap; location / { proxy_pass http://ZAB/; proxy_redirect default; } } }
つまり、 * large_client_header_buffersを大きくすると問題は出なくなった という状況。
判明している条件
* SSLを利用している時に限定して問題が発現する * auth情報をlocation指定の外に置くと、問題が発現する * 問題が発生した場合、そのページ内では常に問題が発現し、再現可能
- ただし、再現条件の詳細は不明。単純にURLの長さというわけではないように見える
とりあえずのメモ
なぜHTTPとHTTPsで異なるかは不明だが、HTTPsを利用している場合、414(URI Too Long)が返る。
これ以上は、後日。
tweet/2016/0112_01.txt · 最終更新: 2016/01/12 16:08 by 127.0.0.1