我一直在尝试加强网站对涉及会话劫持的攻击的防御。该网站在 node.js 应用程序前面使用 Nginx 运行。作为对策之一,目标是配置 Nginx 以将应用程序会话 ID 绑定到 SSL 会话。为此,我使用以下第三方模块:https://github.com/wburgers/Session-Binding-Proxy,它实现了如下所述的概念纸。
我成功地用该模块重建了 Nginx,但很难让它正常工作(甚至无法持续工作)。无论我怎么尝试,代理都会出现以下情况:
1)校验和不匹配:
2014/12/17 21:17:32 [debug] 3113#0: *1 ssl_session_master_key: 25a913d0524eb78d8433fdd5f5cf930a9a948ce09f5bfd8d
2014/12/17 21:17:32 [debug] 3113#0: *1 Session Binding Proxy encryption/decryption key: 80F426773F639A33C3279B55BDE9842D3767844DA026AEFF523C08DA03257A00
2014/12/17 21:17:32 [debug] 3113#0: *1 Session Binding Proxy Handler searching for: connect.sid
2014/12/17 21:17:32 [debug] 3113#0: *1 Session Binding Proxy Handler in string: __insp_wid=1037948077; __insp_nv=true; __insp_ref=d; __insp_norec_sess=true; _ga=GA1.2.999148523.1418831731; __insp_slim=1418846762624; connect.sid=s%3AMnIX0bsYtYJV7LSIYPrf53S1LMQnWoo2.HpVHL9F3tQ%2BlawYAE49gmE%2FIz3wUjJhd0Fh7QgBQOTw
2014/12/17 21:17:32 [debug] 3113#0: *1 Encrypted cookie value: H
2014/12/17 21:17:32 [info] 3113#0: *1 Session Binding Proxy: SHA256 checksum mismatch., client: 82.173.175.112, server: www.somehost.com, request: "GET /api/init?timestamp=1418847452710 HTTP/1.1", host: "www.somehost.com", referrer: "https://www.somehost.com/"
2014/12/17 21:17:32 [debug] 3113#0: *1 ssl_session_master_key: 25a913d0524eb78d8433fdd5f5cf930a9a948ce09f5bfd8d
2014/12/17 21:17:32 [debug] 3113#0: *1 Session Binding Proxy Filter IV: F66F734D7C905BEE
2014/12/17 21:17:32 [debug] 3113#0: *1 Session Binding Proxy encryption/decryption key: 80F426773F639A33C3279B55BDE9842D3767844DA026AEFF523C08DA03257A00
2)日志中出现内存分配错误,并且 Nginx 进程崩溃:
2014/12/17 12:55:05 [emerg] 32348#0: *51 malloc(9837586053127471180) failed (12: Cannot allocate memory), client: 62.140.137.158, server: www.somehost.com, request: "GET /api/timeline/2014-12-17 HTTP/1.1", host: "www.somehost.com"
2014/12/17 12:55:05 [emerg] 32348#0: *52 malloc(7770600577343422540) failed (12: Cannot allocate memory), client: 62.140.137.158, server: www.somehost.com, request: "GET /api/timeline/2014-12-17 HTTP/1.1", host: "www.somehost.com"
2014/12/17 12:55:05 [emerg] 32348#0: *53 malloc(12574651495842054220) failed (12: Cannot allocate memory), client: 62.140.137.158, server: www.somehost.com, request: "GET /api/timeline/2014-12-17 HTTP/1.1", host: "www.somehost.com"
2014/12/17 12:55:06 [alert] 32119#0: worker process 32348 exited on signal 11 (core dumped)
3) Web 应用程序本身的行为不一致。考虑到上述错误,这一点相当明显。但是,对于比实际应用程序简单得多的网站,我似乎无法让模块正常工作。
4) Session-Binding-Proxy 有一个选项可以明确设置“session_binding_proxy_key”。如果省略该选项,模块会在 Nginx 启动时按预期生成一个密钥。如果明确将密钥设置为无效值,启动 Nginx 时会出现错误并拒绝启动(正如预期的那样)。但是,如果将密钥设置为有效密钥,模块似乎不会遵守该设置,仍然使用生成的密钥。
不用说,没有 Session-Binding-Proxy,一切都会按预期运行。但无论我如何配置 SBP 设置,它似乎都不起作用。有人知道哪里出了问题吗?有人让 Session-Binding-Proxy 按预期运行了吗?任何帮助都将不胜感激。
答案1
1) 使用 SBP 时,您是否尝试过清除浏览器中的 cookie?SBP cookie 经过加密和 HMAC 处理。如果您在开始使用 SBP 之前拥有来自会话的 cookie,则这些 cookie 对 SBP 模块无效。如果 cookie 无效,则会将其不加修改地发送到应用程序服务器。应用程序服务器应注销会话并启动新会话。
2) 这些 malloc 错误实际上没什么用。我会尝试重现无效的 cookie,看看是否也能得到它们。也许我可以在这方面改进 SBP。
3)什么样的不一致行为?应用程序会随机将你注销吗?
4) 指定的密钥有效,但日志或启动时没有输出。请检查最新版本。(今天根据同事的评论更新?) (调试) 输出显示您在配置中设置的密钥(如果您未设置 sbp_key 指令,则显示随机密钥)。
希望这能有所帮助。如果您有任何其他问题,请随时在 github 上提出问题,因为我不经常在这里查看。