Osticket: μ—­λ°©ν–₯ ν”„λ‘μ‹œ 뒀에 μžˆμ„ λ•Œ CSRF 토큰이 손상됨

에 λ§Œλ“  2014λ…„ 03μ›” 28일  Β·  6μ½”λ©˜νŠΈ  Β·  좜처: osTicket/osTicket

μ—­ ν”„λ‘μ‹œ λ’€μ—μ„œ osTicket(v1.8.1-dpr)을 μ‚¬μš©ν•˜λ €κ³  ν•˜λ©΄ μ•ˆμ •μ μœΌλ‘œ

 Invalid CSRF Token __CSRFToken__
Invalid CSRF token [b4cab350cfce13ee10a8cd27445e7f4466db039e] on
(redacted)

원인은 λΈŒλΌμš°μ € IPλ₯Ό 기반으둜 토큰을 μƒμ„±ν•˜λŠ” osticket μžλ°”μŠ€ν¬λ¦½νŠΈμΈ κ²ƒμœΌλ‘œ 보이며, μ΄λŠ” λ¬Όλ‘  토큰이 μ„œλ²„ μΈ‘μ—μ„œ 확인될 λ•Œ μ—­λ°©ν–₯ ν”„λ‘μ‹œ IP와 λ‹€λ¦…λ‹ˆλ‹€.

μ—­λ°©ν–₯ ν”„λ‘μ‹œλŠ” ec2의 Apache μΈμŠ€ν„΄μŠ€μž…λ‹ˆλ‹€.

question

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

이 κ²Œμ‹œλ¬Όμ΄ 1년이 λ„˜μ—ˆλ‹€λŠ” 것을 μ•Œκ³  μžˆμ§€λ§Œ osTicket으둜 μ—­λ°©ν–₯ ν”„λ‘μ‹œλ₯Ό μ„€μ •ν•˜λ €κ³  μ‹œλ„ν•˜λŠ” λ™μ•ˆ μ—¬λŸ¬ 번 λ‚˜νƒ€λ‚¬μŠ΅λ‹ˆλ‹€. NginXλ₯Ό μ—­ ν”„λ‘μ‹œλ‘œ μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€(μ•Œκ³  있음, μ§€μ›λ˜μ§€ μ•ŠμŒ λ“±). "잘λͺ»λœ CSRF 토큰" 였λ₯˜λ₯Ό 전달할 수 μžˆμ—ˆλ˜ λͺ‡ 가지 μ‘°μ • μž‘μ—…μ΄ μžˆμŠ΅λ‹ˆλ‹€.

λ‚΄ μœ„μΉ˜ λΈ”λ‘μ—μ„œ λͺ‡ 가지 헀더 섀정을 μΆ”κ°€ν•΄μ•Ό ν–ˆμŠ΅λ‹ˆλ‹€.

 location / {
            proxy_set_header        Host            $host;
            proxy_set_header        X-Real-IP       $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass_header       Set-Cookie;
            proxy_pass <Backend osTicket location>;
        }

pass_headerλŠ” μž‘λ™ν•˜λŠ” κ²ƒμ²˜λŸΌ λ³΄μ˜€μ§€λ§Œ λ‹€λ₯Έ 섀정은 μ„œλ²„κ°€ μ˜¬λ°”λ₯Έ IP μ£Όμ†Œλ₯Ό μˆ˜μ‹ ν•˜λ„λ‘ ν•©λ‹ˆλ‹€. μ„œλ²„ λ˜λŠ” http λΈ”λ‘μ—μ„œλ„ ν•΄λ‹Ή 섀정을 지정할 수 μžˆλ‹€κ³  μƒκ°ν•˜μ§€λ§Œ 이것이 제 μš”κ΅¬ 사항에 λΆ€ν•©ν–ˆμŠ΅λ‹ˆλ‹€.

λͺ¨λ“  6 λŒ“κΈ€

μ—­λ°©ν–₯ ν”„λ‘μ‹œλŠ” X-Forwarded-For 보내야 ν•©λ‹ˆλ‹€. κ·Έκ²ƒμ€ν•©λ‹ˆκΉŒ?

예, μ—­λ°©ν–₯ ν”„λ‘μ‹œκ°€ X-Forwarded-Forλ₯Ό μ˜¬λ°”λ₯Έ μ£Όμ†Œλ‘œ μ„€μ •ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. ν΄λΌμ΄μ–ΈνŠΈλŠ” NAT 뒀에 μžˆμœΌλ―€λ‘œ λ°”μΈλ”©λœ μΈν„°νŽ˜μ΄μŠ€ μ£Όμ†Œλ₯Ό λ°›λŠ” 경우 Javascriptκ°€ 잠재적으둜 RFC1918 μ£Όμ†Œλ₯Ό 얻을 수 μžˆμŠ΅λ‹ˆλ‹€(λ°œμƒν•˜λŠ” 경우 λΆˆλΆ„λͺ…).

ν”„λ‘μ‹œ μ„œλ²„(osTicket이 μ‹€ν–‰λ˜λŠ” μœ„μΉ˜μ™€ ν΄λΌμ΄μ–ΈνŠΈ) κ°„μ˜ μΏ ν‚€ 섀정을 확인할 수 μžˆμŠ΅λ‹ˆκΉŒ? λ°˜ν™˜λœ μΏ ν‚€μ˜ μΏ ν‚€ 도메인 및 μΏ ν‚€ 경둜λ₯Ό ν™•μΈν•˜κ³  κ·Έ 사이에 μžˆλŠ” μ„œλ²„κ°€ μΏ ν‚€ λ˜λŠ” μΏ ν‚€ 섀정을 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.

확인해 λ³΄κ² μŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ λ¬Έμ œκ°€ μžˆλŠ” 곳이 λ°”λ‘œ 문제일 수 μžˆμŠ΅λ‹ˆλ‹€(λ‚΄λΆ€ 호슀트 도메인과 ν”„λ‘μ‹œλœ 도메인은 크게 닀름). λͺ‡ μ‹œκ°„ 후에 μ—…λ°μ΄νŠΈν•˜κ² μŠ΅λ‹ˆλ‹€.

이 κ²Œμ‹œλ¬Όμ΄ 1년이 λ„˜μ—ˆλ‹€λŠ” 것을 μ•Œκ³  μžˆμ§€λ§Œ osTicket으둜 μ—­λ°©ν–₯ ν”„λ‘μ‹œλ₯Ό μ„€μ •ν•˜λ €κ³  μ‹œλ„ν•˜λŠ” λ™μ•ˆ μ—¬λŸ¬ 번 λ‚˜νƒ€λ‚¬μŠ΅λ‹ˆλ‹€. NginXλ₯Ό μ—­ ν”„λ‘μ‹œλ‘œ μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€(μ•Œκ³  있음, μ§€μ›λ˜μ§€ μ•ŠμŒ λ“±). "잘λͺ»λœ CSRF 토큰" 였λ₯˜λ₯Ό 전달할 수 μžˆμ—ˆλ˜ λͺ‡ 가지 μ‘°μ • μž‘μ—…μ΄ μžˆμŠ΅λ‹ˆλ‹€.

λ‚΄ μœ„μΉ˜ λΈ”λ‘μ—μ„œ λͺ‡ 가지 헀더 섀정을 μΆ”κ°€ν•΄μ•Ό ν–ˆμŠ΅λ‹ˆλ‹€.

 location / {
            proxy_set_header        Host            $host;
            proxy_set_header        X-Real-IP       $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass_header       Set-Cookie;
            proxy_pass <Backend osTicket location>;
        }

pass_headerλŠ” μž‘λ™ν•˜λŠ” κ²ƒμ²˜λŸΌ λ³΄μ˜€μ§€λ§Œ λ‹€λ₯Έ 섀정은 μ„œλ²„κ°€ μ˜¬λ°”λ₯Έ IP μ£Όμ†Œλ₯Ό μˆ˜μ‹ ν•˜λ„λ‘ ν•©λ‹ˆλ‹€. μ„œλ²„ λ˜λŠ” http λΈ”λ‘μ—μ„œλ„ ν•΄λ‹Ή 섀정을 지정할 수 μžˆλ‹€κ³  μƒκ°ν•˜μ§€λ§Œ 이것이 제 μš”κ΅¬ 사항에 λΆ€ν•©ν–ˆμŠ΅λ‹ˆλ‹€.

@webbe μš°λ¦¬λŠ” κ³΅μ‹μ μœΌλ‘œ nginxλ₯Ό osTicket용 μ„œλ²„λ‘œ μ§€μ›ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ¦¬λ²„μŠ€ ν”„λ‘μ‹œμ— λŒ€ν•΄ μ›ν•˜λŠ” 것을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 개인적으둜 HAProxyλ₯Ό μ„ ν˜Έν•©λ‹ˆλ‹€. ꡬ성 정보λ₯Ό κ²Œμ‹œν•΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. 섀정이 μ œλŒ€λ‘œ μž‘λ™ν•˜κ²Œ λ˜μ–΄ κΈ°μ©λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰