프로젝트

프로젝트31. 누군가 내 서비스를 망치려고 한다.. 어떻게 막을까?

dodo4723 2024. 9. 24. 14:31
728x90
반응형

비슷한 차트 검색기

 

비슷한 차트 검색기

전 종목의 최근 10년간 모든 차트를 탐색합니다. 내 종목의 차트는 과연 상승하는 차트일까요?

www.similarchart.com

 



보안에 대한 고민

서비스를 개발하고 운영하기 위해서는 다양한 지식이 필요하지만, 그중에서도 제가 가장 부족하다고 느끼는 부분이 바로 보안입니다.

 

서비스를 설계하고 개발할 때 최대한 보안에 신경 쓰려고 노력했지만, 여전히 놓친 부분이 있을까 걱정되었습니다. 갑자기 서버의 데이터베이스가 초기화된다거나, AWS 요금이 몇백만 원이 청구되거나, 서버가 다운되는 등의 상황이 발생하지 않을까 우려했지만, 다행히 아직까지 그런 일은 없었습니다. 하지만...




공격 멈춰..

서버의 취약점을 찾기 위한 공격 시도

 

SQL Injection

 

OS Injection

 

파일 삭제, 모든 권한 부여 등 무서운 명령어

 

 

서비스 운영을 시작한 2024년 2월부터 매우 다양한 공격을 받아왔습니다. 위 이미지들은 서버의 로그인데요, SQL 인젝션, OS 인젝션, DDoS, 자동화된 스크립트나 봇이 서버의 취약점을 찾기 위한 공격 시도 등 다양한 형태의 공격이 있었습니다.

 

대부분의 공격은 방어가 가능하여 큰 문제는 없었지만, CPU 집약적인 작업이 많은 서버의 특성상 이러한 공격으로 인해 CPU 자원을 소모하는 것이 신경 쓰였습니다. 그래서 최근에 몇 가지 조치를 취했지만, 앞으로 어떻게 될지는 지켜봐야 할 것 같습니다.




서버 안정을 위해 노력한 부분들

1. 입력값 검증

공격 중에는 URL에 특정 중요 파일 경로를 탐색하려는 시도가 있었습니다. 하지만 Flask는 라우팅 데코레이터를 사용하여 URL과 뷰 함수를 명시적으로 매핑합니다. 따라서 정의되지 않은 경로에 대한 요청은 기본적으로 404 Not Found 에러를 반환합니다. 그래서 명시적으로 지정한 URL만 허용하도록 설정했습니다.

@app.route('/', methods=['GET'])
@app.route('/stock', methods=['GET'])
@app.route('/result', methods=['GET'])

 

또한, 사용자가 입력하는 모든 값에 대해 검증을 수행하여 비정상적인 값은 예외 처리하고 있습니다.




2. Nginx로 공격 막기

Nginx는 다양한 기능을 제공합니다. 그중에서 요청 속도 제한, 동시 연결 수 제한, 특정 URL 요청 제한 등을 활용하고 있습니다.

# 요청 속도 제한 설정 (1초에 1번만 허용)
limit_req_zone $binary_remote_addr zone=my_limit:10m rate=1r/s;

# 동시 연결 수 제한 설정 (같은 LAN에 최대 10개 연결 허용)
limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;




3. CloudFlare로 공격 막기

Cloudflare는 무료 버전임에도 불구하고 보안과 관련된 다양한 기능을 제공합니다. HTTPS를 적용할 수 있고, WAF(웹 애플리케이션 방화벽)를 통해 특정 URL을 차단하거나 IP 주소로의 직접 접근을 막을 수 있습니다. 또한 DDoS 공격도 방지한다고 합니다.

WAF에서 특정 URL을 차단하는 룰에 의해 요청이 Block되는 경우가 많습니다.

 




4. 과부하 방지

사용자가 특정 요소를 클릭하면 로딩 바를 표시하여 다른 요소를 클릭하지 못하도록 하거나, Nginx, CDN, Redis, 파일 캐시 등 여러 캐시를 활용하여 응답 속도를 단축함으로써 서버 부하를 최대한 줄이려고 노력했습니다.

 

서비스에 사용중인 로딩바



결론

이외에도 곳곳에 항상 보안을 신경 써 개발한 흔적이 있습니다. 하지만 아직 분명히 허점이 있을 텐데요,

 

서비스가 잘 살아남으면 좋겠네요!

반응형