* 이 글은 SK Infosec의 오픈소스 소프트웨어 보안가이드를 참조하여 작성하였습니다.
Node.js Security
1. 데몬 관리
1.1 root 권한 실행 금지
Node.js로 서버를 구동시켰을 때, root 권한으로 실행하면 안된다. root 권한으로 구동된 서버의 경우 취약점으로 인해 Exploit 당해 실행 권한을 넘겨주었을 때 그 권한이 root일 경우 상황이 심각해지기 때문이다.
1.2 요청을 전달할 HTTP 서버/proxy 형태로 구성
Apache, nginx 등과 같은 HTTP 서버를 통해 요청을 받아 전달하도록 구성해야한다.
1.3 NODE_ENV 설정을 production으로 설정
개발 당시 develpoment로 설정하여 개발 할 수 있는데, 서비스를 시작할 때 이를 깜빡하여 그대로 서비스를 구동하는 경우가 있다. 이럴 경우 에러에 관해 상세한 정보가 출력되기 때문에 이를 이용해 공격자들이 활용할 수 있다.
* 진단 방법
# ps -ef | grep node |
2. 로그 디렉토리/파일 권한 설정
로그 파일에 공격자에게 유용한 정보가 들어있다. 그래서 권한관리가 필요하며 일반 사용자들이 접근하지 못하도록 권한을 설정한다.
2.1 권한 설정
# chown nodeapp:node /[구동중인 Node 어플리케이션 로그 디렉토리] # chmod 750 /[ 구동중인 Node 어플리케이션 로그 디렉토리] # chown nodeapp:node /[구동중인 Node 어플리케이션 로그 디렉토리]/* # chmod 640 /[ 구동중인 Node 어플리케이션 로그 디렉토리]/* |
권한은 WAS 서버 계정 소유여야하며, 디렉토리는 750(drwxr-x---) 파일은 640(-rw-r-----) 권한으로 설정해야한다.
* 진단 방법
# ls –lad /[Node 어플리케이션 로그 디렉토리] # ls –la /[Node 어플리케이션 로그 디렉토리]/* |
3. 로그 포맷 설정
로그 포맷을 설정하지 않으면 침해사고 발생 시 공격 여부 파악, 공격자 사용 툴 파악, 공격자 위치 파악이 불가능하다. 그러므로 필요한 정보들로 로그 포맷을 설정해두어야한다.
* Node의 기본 console.log 또는 Express 4.x 이전 버전으로 지원 가능한 로그 출력 기능 외 morgan 등의 추가 로거 모듈을 사용하는 경우 해당되며, 파일의 형태가 아닌 콘솔 출력을 의미함. 어플리케이션 코드 내에서 제어하는 형태로 사용.
3.1 모든 요청에 대해 combined 포맷의 로그를 출력하도록 설정
var express = require('express') var morgan = require('morgan') var app = express() app.use(morgan('combined')) app.get('/', function (req, res) { res.send('hello, world!') }) |
combined : 표준 Apache combined 로그 출력
:remote-addr - :remote-user [:date[clf]] ":method :url HTTP/:http-version" :status :res[content-length] ":referrer" ":user-agent" |
common : 표준 Apache common 로그 출력
:remote-addr - :remote-user [:date[clf]] ":method :url HTTP/:http-version" :status :res[content-length] |
dev : 개발을 위해 response에 따라 색상이 입혀진 축약 로그 출력
:method :url :status :response-time ms - :res[content-length] |
short : 기본 설정보다 짧은 로그 출력, 응답 시간 포함
:remote-addr :remote-user :method :url HTTP/:http-version :status :res[content-length] - :response-time ms |
tiny : 최소화된 로그 출력
:method :url :status :res[content-length] - :response-time ms |
* 사전에 morgan 모듈을 설치했다고 가정했다.
* 진단 방법
소스 코드 내 log 내용 확인 또는 개발자 인터뷰
로그포맷 설정 값이 combined가 아니거나 그에 준하지 않는 포맷 토큰 조함으로 설정되어 있는 경우 취약함.
4. 로그 저장 주기
‘정보통신망이용촉진및정보보호등에관한법률’, ‘개인정보보호법’, ‘회사사규’ 등에 따라 로그 파일은 최소 6개월 이상의 기간은 보관해야한다. 또한 담당자는 로그 기록을 정기적으로 백업 및 확인 감독!
4.1 정보 보호 관련 법 및 개인정보보호법 등에 따라 최소 아래 기간 이상은 보관해야한다.
1) 사용자접속 기록
사용자 로그인/로그아웃/정보변경 등 -> 6개월 이상
2) 개인정보취급자의개인정보처리시스템접속기록
정보주체 식별정보/개인정보취급자 식별정보/ 접속일시/접속지 정보/ 부여된 권한 유형에 따른 수행업무 등 -> 2년 이상
3) 개인정보취급자권한변경기록
개인정보취급자 권한 생성/변경/삭제 등 -> 5년 이상
4.2 담당자는 접속 기록을 월 1회 이상 정기적으로 확인·감독하여, 접속과 관련 된 오류 및 부정행위가 발생하거나 예상 되는 경우 즉각적인 보고 조치가 되도록 해야 한다.
4.3 접속 기록이 위·변조 되지 않도록 별도의 물리적인 저장 장치에 보관하여야 하며 정기적인 백업을 수행 해야 한다.
* 진단 방법
서버 운영 또는 담장자 인터뷰
5. 헤더 노출 정보 방지
HTTP 요청에 대한 응답 시 헤더에 서버 이름, 버전 등의 정보가 포함되어 공격자가 해당 정보를 공격에 이용할 수 있다.
* Node의 헤더 관련 개별 설정 방법 외 helmet과 보안 관련 HTTP 헤더 모듈을 사용한 경우엥 해당된다.
5.1 Node 어플리케이션 코드 내에 모듈 사용 설정
var express = require('express'); var helmet = require('helmet');
var app = express();
app.use(helmet()); |
위 설정은 Apache, nginx 등의 웹 서버 환경 설정을 통해서도 같은 설정이 가능하다.
* 진단 방법
소스 코드 내 헤더 설정 관련 확인 또는 개발자 인터뷰
* 보안 패치
최신의 보안 패치 필요. Node.js 뿐 아니라 추가한 Express 모듈 또한 패치에 신경 써야한다. 주기적으로 보안 패치를 적용하지 않으면 exploit 공격, 제로데이 공격 등의 서버 침해가 발생할 수 있다.
* Node.js 0.10.42 이전 0.10.x, 0.12.10 이전 0.12.x, 4.3.0 이전 4.x, 5.6.0 이전 5.x 버전들에서 원격 공격자의 조작된 Content-Length HTTP 헤더를 통한 HTTP request smuggling 공격을 허용할 수 있다.
(* HTTP Request Smuggling 공격은 Web Hacking 카테고리에 글을 포스팅 하였다. )
'Hacking > Web Hacking' 카테고리의 다른 글
WebHacking - HTTP Request Smuggling (0) | 2018.07.11 |
---|---|
WebHacking - Command Injection 우회 (0) | 2017.03.09 |
WebHacking - SQL Injection (Login 우회) (1) | 2017.02.28 |
WebHacking - Information_schema이용 SQL Injection (0) | 2017.02.27 |
WebHacking - SQL Injection(우회), Blind SQL Injection (0) | 2017.02.24 |