보안 업로드

완전히 비공개인 포럼(익명 접근 불가)의 경우, 기본 로컬 저장소 구성에 보안이 강화된 미디어 옵션이 없다는 것은 나에게 큰 실수로 보입니다. 비공개 포럼을 운영하는 많은 사람들이 자신의 게시글 첨부 파일이 모두 공개적으로 접근 가능하다는 사실(URL를 알면)을 인지하지 못하고 있을 것이라고 놀라지 않을 것입니다. 내 게시글의 텍스트가 익명으로 접근할 수 없다면, 직관적으로 첨부 파일도 익명으로 접근할 수 없을 것이라고 생각할 것입니다.

이러한 요청에 대한 지지를 확인해 보기 위해 이슈를 제출하는 것이 가치가 있을까요? 이미 존재하는 이슈가 있나요? 이 문제는 이미 자체 호스팅 하드웨어를 소유하고 있으며, 클라우드 저장소(특히 AWS S3 가격)에 비용을 지불하고 싶지 않은 우리처럼 작고 가난한 그룹에게 현재 치명적인 장애 요인입니다. 왜냐하면 미디어가 익명으로 열람되지 않도록 보장하기 위해 그렇게 해야 하기 때문입니다.

또한, 이 질문의 순진함이 용서되기를 바랍니다. 하지만 업로드와 백업을 위한 개별 버킷에 대한 지원이 이미 존재하나요? 보안 업로드를 위한 세 번째 버킷을 지원하는 것이 어려운 일일까요? 공개 업로드는 공개 버킷에, 보안 업로드는 보안 버킷에 저장되고, 개별 객체 ACL은 필요하지 않습니다. 그리고 객체의 보안 상태가 변경되면 버킷 간에 이동시키면 되지 않을까요?

5개의 좋아요

꽤나 많은 작업량이 될 것 같습니다. 최소 하루 정도의 작업이겠지만, 일주일 정도 걸릴 수도 있겠네요.

개발 비용을 부담하는 Cdck 호스팅은 S3에 업로드하는 방식으로 운영되므로, S3 예산이 없는 자가 호스팅 사이트 중 로그인만 필요한 경우에만 관심이 있을 것 같습니다.

사용자가 자산에 대한 공유 링크를 볼 수 있다면, 공유하기 위해 다운로드하는 것과 사실상 동일한 것이므로 큰 문제가 되지 않을 것 같습니다.

3개의 좋아요

게시글 본문은 보호되는데 첨부파일은 보호되지 않는다는 점이 이상하다고 생각하는 게 미친 짓은 아니지 않나요?

하지만 의도적인 공유와 우발적인 공유 사이에는 큰 차이가 있습니다. 당연히 전자를 막을 실질적인 방법은 없습니다. 하지만 후자는 현재 사람들이 기반 기술에 대해 이해하지 못하기 때문에 쉽게 발생할 수 있습니다. 예를 들어 첨부 이미지가 포함된 게시글의 이메일 알림이 비회원에게 무심코 전달되는 경우가 그렇습니다. 보안 미디어 기능과 분리된 이메일 내 첨부파일 비공개(마스킹) 옵션이 좋은 대안이 될 수 있을 것입니다.

사람들이 의도적으로 첨부파일 링크를 공유하더라도, 그것이 보호된 카테고리에서 온 것임을 단순히 잊었을 수 있습니다. 이상적인 상황에서는 해당 카테고리에 접근 권한이 없는 사람에게 첨부파일 링크는 무용지물이 되어야 합니다.

또한 S3 구현체 중 하나에 현재 또는 향후 버그가 있을 경우, 버킷 내 리소스의 익명 열거나 객체 URL의 추측 및 무차별 대입 공격이 가능해질 수도 있습니다. 이상적인 상황에서는 온프레미스 S3 인터페이스가 인터넷 전체와 방화벽으로 격리되어, Discourse 서버만 직접 접근할 수 있기를 원합니다.

4개의 좋아요

미친 짓이 아닙니다. S3가 아닌 환경에서 안전한 업로드를 구현하는 것은 제가 구축에 반대하는 것이 아닙니다. 다만 해당 기능을 구축할 시급성이나 추진력이 없을 뿐이며, 변경 사항이 그리 자명하지 않기 때문입니다.

우리는 가끔 인턴이나 오디션 프로젝트를 진행하는데, 이 프로젝트는 분명 그 범주에 들어갈 수 있는 유형입니다.

14개의 좋아요

AWS S3가 아닌 스토리지에서 보안 미디어를 위한 더 쉬운 경로로 이 방식의 실행 가능성에 대해 어떤 의견이 있으신가요?

1개의 좋아요

로그인이 필요한 사이트에서 업로드를 안전하게 처리할 수 있는 간단한 해킹 방법을 하나 알게 되었습니다.

기본적으로 업로드를 위해 Authentication Based on Subrequest Result | NGINX Documentation 를 설정하면 됩니다. 유일한 문제는 로그인 요구가 활성화되어 있을 때 403/401을 반환하는 URL을 찾을 수 없다는 점입니다. 그래서 로그인하지 않은 상태에서 업로드에 접근하면 500 에러가 발생합니다. 이는 누군가 업로드 URL을 가지고 있고 로그인하지 않은 상태에서 접근을 시도할 때만 발생하는 일이므로, 그렇게 심각한 문제는 아닌 것 같습니다.

대략 다음과 같은 구조입니다:

# JP
    location = /auth {
        internal;
        proxy_pass http://discourse/categories;
        proxy_pass_request_body off;
        proxy_set_header Content-Length "";
        proxy_set_header X-Original-URI $request_uri;
    } 
    # END JP
    location ~ ^/uploads/ {

      auth_request /auth; #$JP
      # 참고: 헤더를 최상위 레벨에서 정의하여 상속할 수 없다는 점이 정말 번거롭습니다.
      #
2개의 좋아요

보안 업로드를 위한 별도의 버킷 기능을 구현할 계획이 없으며, S3가 아닌 환경이나 ACL이 없는 환경에서 보안 업로드를 작동하도록 할 계획도 없습니다. 향후 이러한 작업에 대한 충분한 수요가 발생하여 시간과 자원을 투입하는 것이 합리적이라고 판단될 경우, 해당 작업을 검토할 수 있습니다.

5개의 좋아요

CDN URL을 올바르게 입력했는데도 불구하고,
https://forum.cdn.hashhackers.com/optimized/2X/3/3204e85df407adfce19e105308248aee8b3b3f57_2_690x424.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAU5WBGG5Z7FNHQEIS%2F20210415%2Fus-east-2%2Fs3%2Faws4_request&X-Amz-Date=20210415T025617Z&X-Amz-Expires=300&X-Amz-SignedHeaders=host&X-Amz-Signature=15c9118929ccd9c24a9594ab02a47e900269b9d921d41679a317e29d6174c2bc
대신에 왜 https://hashhackersforum.s3.us-east-2.amazonaws.com/optimized/2X/3/3204e85df407adfce19e105308248aee8b3b3f57_2_690x424.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAU5WBGG5Z7FNHQEIS%2F20210415%2Fus-east-2%2Fs3%2Faws4_request&X-Amz-Date=20210415T025617Z&X-Amz-Expires=300&X-Amz-SignedHeaders=host&X-Amz-Signature=15c9118929ccd9c24a9594ab02a47e900269b9d921d41679a317e29d6174c2bc
을 사용하고 있나요?

"보안 미디어 업로드"를 활성화하면 CDN을 사용하지 않습니다.

5개의 좋아요

내가 알아본 바로는, 관리자 섹션에서 다음과 같은 경고가 표시됩니다.

서버는 파일을 S3로 업로드하도록 설정되어 있지만, S3 CDN이 구성되지 않았습니다. 이로 인해 S3 비용이 높아지고 사이트 성능이 저하될 수 있습니다. 자세한 내용은 "업로드용 객체 저장소 사용"을 참고하세요.

이 경고를 무시하는 것은 괜찮지만, 우리는 secure media가 활성화되어 있어 CDN을 사용할 수 없습니다. secure_media가 활성화된 사이트에서는 이 메시지가 표시되지 않는 것이 더 적절할 것 같습니다.

1개의 좋아요

JS 에셋에는 여전히 CDN을 사용할 수 있으며, 이를 통해 전 세계 사용자의 사이트 렌더링 속도를 훨씬 빠르게 만들 수 있습니다.

3개의 좋아요

그렇군요. discourse가 정적 자산을 다르게 처리하는 줄은 몰랐어요. 여기서 모든 스레드를 다시 읽어봐야 할 것 같아요.

2개의 좋아요

2.8.0.beta1 버전으로 업그레이드한 후, 인증된 S3 URL을 사용하는 배지가 작동하지 않습니다. 업그레이드 전에는 정상적으로 작동했습니다.

uploads 테이블을 확인해 보니 secure 열의 값이 true로 설정되어 있습니다.

새 배지 옵션을 사용하여 파일을 업로드해도 이미지 미리보기가 여전히 비어 있었습니다.

그 외 S3 URL을 사용하는 다른 파일들은 문제없이 작동하고 있습니다.

도움 주실 수 있나요? 감사합니다! :wink:

2개의 좋아요

아… 또 보안 업로드를 해야 할 이유가 없는 곳에서 그렇게 하고 있네요. 배지는 아바타, 카테고리 로고, 기타 항목과 기본적으로 공개된 이미지이므로 보안으로 표시되어서는 안 됩니다. 배지 이미지가 보안으로 표시되지 않도록 수정하고, 이미 보안으로 설정된 항목을 수정하는 마이그레이션 스크립트가 필요합니다.

이 기능이 아예 동작하지 않았을 줄 알았는데, 2.8.0에서 이 부분에 영향을 줄 만한 내용은 아무것도 없었어야 합니다.

5개의 좋아요

안녕하세요 @martin

답변해 주셔서 감사합니다. Ruby를 처음 사용해 보는데, 이 언어가 얼마나 명확할 수 있는지 정말 놀랐습니다. 몇 시간 동안 디버깅을 해 본 결과, 어디를 봐야 할지 찾은 것 같습니다. 말씀하신 것과 정반대로 한 것 같습니다 :slight_smile: Badge 모델에 몇 줄을 추가했고, 이제 이미지 로딩이 됩니다. 또한 for_site_setting이라는 플래그가 있다는 것도 확인했습니다. S3의 객체에 대한 ACL을 조정하기 위해 이 정보를 기반으로 한다고 생각하며, 해당 컬럼에 false를 설정했습니다.

app/models/badge.rb

  def image_url
    if image_upload_id.present?
      return upload_cdn_path(image_upload.url) if !image_upload.url.include?(SiteSetting.Upload.absolute_base_url)
      uri = URI.parse(image_upload.url)
      Rails.application.routes.url_for(
        controller: "uploads",
        action: "show_secure",
        path: uri.path[1..-1],
        only_path: true
      )
    end
  end

다음 업그레이드에서 무엇이 변경되는지 확인하여 더 자세히 알아보겠습니다.
프로덕션 환경에서 사용해야 할 최적의 버전을 알려 주실 수 있나요?

감사합니다!

앞으로 코드베이스에 더 기여할 수 있기를 바랍니다.

6개의 좋아요

Hey @danilogit,

badge 모델에 적용하신 변경 사항은 확실히 동작할 것이며, ruby를 처음 사용했는데도 이렇게 잘 만들어 주셨다니 정말 훌륭합니다. 다만, badge가 secure로 표시되어서는 안 되는 핵심 문제를 제가 직접 수정할 예정입니다.

tests-passed 분기가 프로덕션에서 사용하는 데 가장 좋은 버전입니다. 최신 수정 사항이 사용 가능한 즉시 모두 적용받을 수 있기 때문입니다. 다만, 몇 주에 한 번씩 수정 사항과 변경 사항이 반영되는 beta 분기를 선호하는 분들도 있습니다.

badge가 secure로 표시되는 문제의 수정이 완료되면 알려드리겠습니다.

5개의 좋아요

오늘 이 문제를 수정하는 작업을 완료했습니다:

cc @danilogit

8개의 좋아요

방금 이 글을 올렸어요.

…혹시 여기에서의您的评论과 관련이 있을까요?

보안 미디어 업로드가 켜져 있는 상태에서 사용자가 아바타를 업로드하는 것이 지원되나요? 현재 오류가 발생하는데, 아바타가 공개 액세스가 허용되지 않는 동일한 버킷에 업로드되기 때문인 것 같아 궁금합니다…

1개의 좋아요

3개의 게시물이 새 주제로 분리되었습니다: Can I use secure media and page publishing simultaneously in Discourse?

최근에 “secure media” 및 관련 설정을 "secure uploads"로 변경했습니다. 이미지/비디오 등에만 적용되는 것이 아니기 때문이며, 일반적으로 모두 이를 secure uploads라고 부르기 때문입니다. 관련 핵심 커밋은 여기에 있습니다:

이 토픽의 OP가 이제 이 변경 사항을 반영하도록 업데이트되었습니다.

6개의 좋아요