웹 서버는 DB서버로부터 데이터를 사용하기 위해 DB연결 정보를 사용한다. DB서버는 호스트, 서버로 분류되며 데이터를 사용하기 위해 호스트로써 DB에 연결하기 위해 필요한 정보는 아래와 같다.
Host to DB URL
Port
Database 이름
Username
Password, 등
(DB, 호스트 프로그램마다 필요 항목이 다를 수 있음.)
웹 서버는 위와 같은 DB 연결 정보를 사용해 사용자 요청을 처리한다. 이때 DB연결 정보를 탈취당한다면, 이는 심각한 결과를 초래할 것이다. 그렇다면 DB연결 정보를 안전하게 보관해야 한다.
어떻게 보관해야 안전하게 보관할 수 있을까?
모노레포 환경하 가정하고 기술한다.
N개의 서버가 1개의 Tomcat(웹 서버)서버에 존재한다고 가정한다.
DB 연결 정보가 Tomcat server의 conf파일에 위치할때 (취약)
만약 Directory Traversal 취약점으로 인해 내부 파일의 획득이 가능하다면, conf 파일만 탈취해도 N개의 서버가 사용하는 각 DB연결정보가 탈취될 수 있다.
DB 연결정보가 서버 별 개별 폴더(WEB-INF)를 사용해 DB연결 정보 위치 및 암호화
즉, 웹 애플리케이션 컨테이너별 사용 DB 연결 정보를 위치시키고 이를 암호화 해야 한다.
만약 웹 애플리케이션 DB 서버와 통신하는 소스코드 파일별로 DB 연결 정보가 존재한다면 여러 파일이 DB 연결 정보를 가져 취약할 것이다.
모듈 프로젝트에서 DB 연결을 위해 별도의 db.properties라는 파일을 resources 내에 위치시켜 사용했다.
그러나 resources는 여러 프로젝트, 웹 애플리케이션에서 파일을 읽어 사용 가능하다. 물론 해당 프로젝트에서는 단일 웹 애플리케이션만 구동했지만, 여러 프로젝트
만약 개별 웹 애플리케이션 컨테이너 내부의 META-INF 내 위치시킨다면 웹 애플리케이션 실행 환경에서만 접근 가능하도록 보통 설정되어 있다. 또한 외부 접근을 차단하며 웹 애플리케이션 내부에서만 폴더의 리소스에 접근할 수 있다.
물론 내부에서 경로 순회 취약점이 발생한다면 컨테이너별 저장한 DB 연결정보는 더이상 안전하지 않다. 이는 암호화를 통한 방법으로 탈취시간을 조금 더 늦출 순 있으나 완벽하게 막을 수는 없다.