flow 채용과제
- 어떤 파일들은 첨부시 보안에 문제가 될 수 있다 ex) exe, sh ... 등 실행파일이 존재할 경우 서버에 올려서 실행될 위험이 있음(해킹가능성)
- 따라서 파일 확장자 차단을 해야한다
- 고정 확장자는 차단을 자주하는 확장자의 리스트 기본은 unchk되어 있으나 chk할 경우 DB에 차단된 확장자명이 저장
- 차단된 고정확장자는 새로고침되어도 chk상태를 유지
- 커스텀 확장자는 사용자가 직접 차단할 확장자명을 입력하는 것
- 커스텀 확장자는 최대 입력 자릿수는 20자리, 추가버튼 클릭시 DB에 저장
- 마찬가지로 새로고침시에도 차단시킨 확장자명이 고정되어야 할 것 같다.
- 최대 200개 추가 가능, x버튼 클릭시 db에 삭제
- 커스텀 확장자 중복 체크 - 고정 확장명을 커스텀 확장자로 추가하려할 때 오류발생
- 같은 이름의 파일이 들어갈 경우 구분해야함 - 파일 업로드시 랜덤숫자와 업로드시간을 조합해 업로드 되게 함
- 업로드하는 파일크기 제한, 파일명 제한 - 비용의 문제, 시스템 과부하 방지
- 파일 업로드시 확장자명 수정해서 업로드 할 수 있다 - 파일의 시그니처를 파싱한다, 파싱 후 db에 저장된 확장자명일 경우 업로드 차단
-
multer, AWS S3
- AWS S3는 여러 개의 AWS시설에서 관리하기 때문에 데이터 유실이 99.99% 의 내구성을 가진다 한다 따라서 혹여나 사용자의 중요한 파일이 유실될 가능성이 거의 없다
- 거의 무제한에 가까운 확장성, 뛰어난 보안
- AWS는 전 세계 여러 지역에 데이터 센터를 운영하므로 사용자의 데이터를 저장할 지역을 선택가능 사용자에게 더 빠른 업로드,다운로드 엑세스 속도 향상
- 하지만 비용문제가 있을 수 있음 이러한 서비스를 제공하는데에는 이유가 있음
-
확장자명을 DB에 저장한다
- sequlize 문법으로 간단하게 추가,조회,삭제가능
-
고정확장자와 커스텀확장자를 분리된 컬럼에서 관리하려했으나 고정확장자는 자주사용하는 차단확장자이므로 그럴 필요가 없다 판단, 인터페이스에서 차단시키는 과정 (check박스, input박스)의 차이로 나눌예정이라 따로 구분은 하지않음
-
파일 업로드 차단시키기
- 파일업로드시 DB에 해당 파일의 확장자명과 동일한 차단확장자명이 존재한다면 업로드 차단
- 단점
- 보안 이슈 : 사용자가 파일의 확장자를 조작 "파일명.jpg"로 저장하면서 내용은 스크립트 코드를 구성해서 업로드할 가능성
- 해결 방법 : 파일 시그니처 검사 - 파일의 시그니처(매직 넘버)를 확인하여 파일의 실제 형식을 파악할 수 있다 예) 'ffd8ffe0': 'jpg', '89504e47': 'png'
고민 : 파일 업로드시 확장자명 수정해서 업로드 할 수 있다 이유 : exe 파일은 서버에서 실행되게 된다면 큰 영향을 줄 수 있다.
-
file-type 라이브러리를 사용하여 파일이 업로드 전 파일의 시그니처를 검사하여 파일의 본래 확장자를 파악 후 DB에 저장된 차단할 확장자명과 같은 확장자일 경우 업로드 차단 1-1. S3에 파일을 바로 저장하기 때문에 파일의 시그니처를 검사 못함 - multerMemoryStorage를 사용해서 메모리에 파일의 내용을 저장 후 시그니처 검토
-
mmmagic 라이브러리를 사용해서 파일의 매직 바이트(파일의 내용에서 특정 위치에 있는 일련의 바이트로, 해당 파일의 형식이나 데이터 형식을 식별하는 데 사용된다. 파일이 어떤 유형인지 빠르게 식별하는 데 사용되는 간단하고 효과적인 방법) 를 읽어 파일의 내용을 기반으로 그 파일이 어떤 종류의 파일인지 식별
-
UUID와 같은 라이브러리를 사용하여 정말로 고유한 ID를 생성하는 것을 고려
- UUID는 전역적으로 고유하다 따라서 어떤 DB나 다른 시스템과 충돌 가능성이 거의 없다, 예측할 수 없는 고유번호를 발급하기 때문에 보안강화
- 하지만 순차적인 번호가 아니므로 효율적으로 데이터를 정렬하기 어렵다 ( 파일원본이름과 등록시간을 앞쪽에 배치하여 등록된 이름을 설정 경우에 따라 배치순서를 바꿔서 순차적 정렬가능)
- file-type과 mmagic 라이브러리를 사용하여 파일의 본질적인 확장자를 판별하여 사용자가 임의로 파일의 확장자명을 변경해서 업로드 차단을 피해 업로드하는 일을 차단하기 위해 해당 라이브러리를 사용하여 파일의 시그니처, 매직바이트를 판단해서 처리
- 두개의 라이브러리를 사용해서 모두 진행해보았지만 둘다 파일의 본질적인 확장자명은 판단이 되어 console.log에 표시되긴했지만, 파일을 임시로 저장하는 메모리는 항상 undifined로 표시
- s3로 바로 저장되기때문에 파일의 내용을 열어보고 처리할 메모리를 할당시켜(multerMemoryStorage) 중간에 저장하여 처리하게끔 실행하였지만, 계속 undifined로 뜨게된다
- 하지만 파일의 확장자명을 바꿔서 올려도 해당 라이브러리로 파일의 내용을 판독하는 것에는 성공하였다
- 결국 시간상 해당 라이브러리를 사용하여 변조된 파일확장자를 필터링하는 것에는 실패하게 되었다. 하지만 해당 필터링은 필요없을 수도 있다.
- 예를 들어 exe파일을 txt로 변경해서 업로드하여도 S3 자체에서 자동으로 실행될 경우는 없다고 알게되었다. 또한 aws의 서비스보안 덕에 그럴 걱정이 없다고 한다.
- 결국엔 100% 안전할 순 없다할수있다. 후에 더 공부하고 알아본다면 반드시 완성시킬 수 있다 생각한다.