pfaffman
(Jay Pfaffman)
2월 6, 2020, 9:51오후
1
내가 어디서 실수를 하고 있는지 모르겠습니다. 왜 나 혼자 이런 버그처럼 보이는 문제를 겪고 있는지 이해가 되지 않습니다.
다중 사이트(multisite) 구성에서 비교적 표준적인 yml 파일의 env: 섹션에 다음을 정의합니다.
DISCOURSE_CDN_URL: https://lcsupport-92e2.kxcdn.com
그러면 브라우저가 CSP 오류로 인해 모든 CDN URL을 거부합니다.
content security policy script src는 "추가 허용 스크립트 소스. 현재 호스트와 CDN은 기본적으로 포함됩니다. Content Security Policy를 사용하여 XSS 공격 완화하기 를 참조하세요."라고 설명하고 있지만, 이 값을 정의하거나(discourse.conf에 추가/제거하고 sv restart unicorn를 실행하면) 다음과 같은 오류가 발생합니다:
content security policy report only를 true로 설정해도 사이트가 로드되지 않습니다.
브라우저가 에셋을 로드하려면 content_security_policy를 끄거나 CDN URL을 content security policy script src에 추가하는 것 같습니다.
제 yml 파일은 여기 있습니다.
CDN URL은 기본적으로 계산되어 CSP에 포함되어야 합니다. 헤더에서 제공되는 실제 CSP와 차단된 리소스의 출처를 제공해 주시거나(또는 비교해 보시거나) 할 수 있을까요?
pfaffman
(Jay Pfaffman)
2월 6, 2020, 10:45오후
3
다음은 헤더입니다:
content-security-policy-report-only: base-uri 'none'; object-src 'none'; script-src 'report-sample'
https://support.literatecomputing.com/logs/
https://support.literatecomputing.com/sidekiq/
https://support.literatecomputing.com/mini-profiler-resources/
https://abedmulti-92e2.kxcdn.com/uploads/assets/
https://abedmulti-92e2.kxcdn.com/uploads/brotli_asset/
https://support.literatecomputing.com/extra-locales/
https://lcsupport-92e2.kxcdn.com/highlight-js/
https://lcsupport-92e2.kxcdn.com/javascripts/
https://lcsupport-92e2.kxcdn.com/plugins/
https://lcsupport-92e2.kxcdn.com/theme-javascripts/
https://lcsupport-92e2.kxcdn.com/svg-sprite/
https://www.google-analytics.com/analytics.js
https://tagmanager.google.com/
https://www.googletagmanager.com/; worker-src 'self' blob:
컨테이너 내부의 ENV 변수는 다음과 같습니다:
root@support-multi:/var/www/discourse# echo $DISCOURSE_S3_UPLOAD_BUCKET
abed-multi/uploads
root@support-multi:/var/www/discourse# echo $DISCOURSE_S3_CDN_URL
https://abedmulti-92e2.kxcdn.com/uploads
discourse.conf의 CDN URL은 다음과 같습니다:
cdn_url = 'https://lcsupport-92e2.kxcdn.com'
그리고 rails:
[1] pry(main)> GlobalSetting.cdn_url
=> "https://lcsupport-92e2.kxcdn.com"
그리고 로드되지 않는 자산 중 하나의 URL은 다음과 같습니다: https://lcsupport-92e2.kxcdn.com/brotli_asset/preload-store-d32dcf974dddcac742f8a7a6aa7fcd686185920b201029d0ecb2b85527ef9034.js
CSP에 다음과 같은 설정이 있습니다
https://abedmulti-92e2.kxcdn.com/uploads/assets/
https://abedmulti-92e2.kxcdn.com/uploads/brotli_asset/
# 즉, DISCOURSE_S3_CDN_URL + /brotli_asset/
하지만 실제 주소는 다음과 같습니다
https://lcsupport-92e2.kxcdn.com/brotli_asset/preload-store-d32dcf974dddcac742f8a7a6aa7fcd686185920b201029d0ecb2b85527ef9034.js
# 즉, DISCOURSE_CDN_URL + /brotli_asset/...
관련 CSP 코드:
# [dir, can_use_s3_cdn, can_use_cdn]
['/assets/', true, true],
['/brotli_asset/', true, true],
['/extra-locales/', false, false],
['/highlight-js/', false, true],
['/javascripts/', false, true],
['/plugins/', false, true],
['/theme-javascripts/', false, true],
['/svg-sprite/', false, true],
]
def script_assets(base = base_url, s3_cdn = GlobalSetting.s3_cdn_url, cdn = GlobalSetting.cdn_url)
SCRIPT_ASSET_DIRECTORIES.map do |dir, can_use_s3_cdn, can_use_cdn|
if can_use_s3_cdn && s3_cdn
s3_cdn + dir
elsif can_use_cdn && cdn
cdn + dir
else
base + dir
end
가능한 경우 에셋에 DISCOURSE_S3_CDN_URL을 우선적으로 사용하도록 하고 있습니다. 이는 CDN 에셋 URL 생성 방식과 일치합니다.
@pfaffman 님의 사이트에서 GlobalSetting.use_s3?가 true를 반환합니까?
여기서 GlobalSetting.use_s3?에 대한 추가 체크가 필요한지 궁금합니다. GlobalSetting.s3_cdn_url이 설정되어 있다는 것이 반드시 GlobalSetting.use_s3?가 true임을 의미합니까? 요즘 에셋 생성 / S3 CDN 관련해서 조금 헷갈립니다 이 분야에 더 익숙한 분도 한번 봐 주실 수 있을까요? 감사합니다!
pfaffman
(Jay Pfaffman)
2월 6, 2020, 11:23오후
5
음, use_s3를 설정하고 rake assets:precompile을 실행해 봤는데 아무 변화가 없어요.
어디선가 자원이 S3에 있는지 로컬에 있는지(또는 CDN 미러에 있는지)에 대한 혼란으로 같은 문제를 겪은 적이 있어요.