Node Hero의 11번째 시리즈로, Node.js 보안 튜토리얼로 가장 일반적인 공격 경로로 부터 애플리케이션 방어를 위한 방법을 설명하고 있다. 
원문: https://blog.risingstack.com/node-hero-node-js-security-tutorial/

칙 1: eval을 사용하지 말것


eval은 코드 인젝션 공격에 취약하다. 
명시적으로 eval을 사용하지 않는것 뿐만 아니라 백그라운드에서 eval을 사용하는 함수들도 사용하지 않는것이 좋다.

setInterval(String,2)
setTimeout(String, 2)
new Function(String)

규칙 2: 항상 'use strict' 모드를 사용하라. 


'use strict'을 사용하면 코드내에 존재하는 몇몇 암묵적인 에러를 제거해주고, 에러로그를 출력해 준다.
'use strict'  
delete Object.prototype
// TypeError
var obj = {
a: 1,
a: 2
}
// syntax error

규칙 3: 에러처리에 주의하라


에러처리를 통해 민감한 정보가 노출될 수 있다.

 ex) X-Powered-By:Express 

출력되는 스택정보는 공격자들에게 흥미로운 정보로 제공될 수 있다. 에러 발생에 관련된 내용을 디버깅 정보로 제공하는 좋지 않은 습관이다.

규칙 4: 코드 정적분석을 통해 코드 보안을 강화할 수 있다. 


ESLint 와 Standard code style 조합으로 코드 정적분석을 수행하게 되면 많은 버그를 개발단계에서 제거할 수 있다. 

규칙 5: 슈퍼유저의 권한으로 프로세스를 실행하지 말라


Node.js 애플리케이션을 superuser권한으로 실행하고 직접적으로 80번이나 443포트를 사용하여 사용자의 요청을 받아서 처리하는 경우, 특정 상황이나 에러, 버그가 발생하는 경우 전체 시스템에 영향을 미칠 수 있다.  HTTP요청을 전달하기 위해 HTTP서버나 프록시 설정을 사용하는것이 좋다.

규칙 6: 보안에 관련된 HTTP 헤더 정보를 설정하라


다음은 보안을 강화할 수 있는 HTTP 헤더 설정이다. Node.js에서는 Helmet 모듈을 사용해 헤더들을 쉽게 설정할 수 있다.

Strict-Transport-Security: 서버에 연결할 때 SSL/TLS 연결을 강제한다.

X-Frame-Options: clickjacking에 대한 보호를 제공한다.

X-XSS-Protection:  크로스사이트스크립팅(XSS) 필터를 대부분의 최신 브라우저에 삽입한다.

X-Content-Type-Options: 선언된 content-type과 다른 응답이 내려오는 경우 브라우저에서 MIME-sniffing 공격을 방지한다.

Content-Security-Policy: 넓은 범위의 공격을 방지한다. 크로스사이트 스크립팅 및 다른 크로스사이트 인젝션들이 포함된다.
var express = require('express')  
var helmet = require('helmet')
var app = express()
app.use(helmet())

규칙 7: 적절한 세션관리를 수행한다.


다음은 각 쿠키에서 설정할수 있는 속성들이다. 

secure : 브라우저에게  HTTPS 요청이 들어왔을 때만 쿠키를 전송하도록 설정한다. 

HttpOnly :  JavaScript에서 쿠키에 접근하는 것을 허용하지 않는다. XSS 공격을 방지하는데 도움이 된다.

규칙 8: 쿠키(cookie)의 유효범위를 설정한다.

domain :  요청한 URL과 서버의 도메인이 동일한지 비교한다. 만약 도메인이 일치하거나 도메인의 서브 도메인인 경우 path 속성 검사로 넘어간다.

path: 덧붙여 도메인에 접근 가능한 쿠키의 URL path(e.g: /article/1)를 명시할 수 있다. 만약 도메인과 URL path가 일치한다면 요청 시 쿠키를 전송한다.

expires :  쿠키를 지속적으로(persistent) 사용하기 위해 설정이다.  민감한 정보가 포함된 쿠키는 세션쿠키로만 사용되도록 설정해야 한다.

규칙 9: Retire.js로 취약점을 찾는다.


Retire.js는 사용하고 있는 모듈 버전들에 대해 알려진 취약점을 탐지하는 모듈이다.  다음과 같이 간단히 설치 할 수 있다. 
npm install -g retire

설치후 retire 명령을 실행하여 mod_modules 디렉토리 내의 모듈들의 취약점을 찾을 수 있다.

규칙 10:  Node Security Platform CLI로 사용하고 있는 module들을 감사한다.


Node Security Platform의 주요 명령어라인 인터페이스인 nsp를 사용하여 프로젝트 디렉토리안의 취약한 모듈을 점검 할 수 있다.
npm install nsp --global  
# From inside your project directory
nsp check


'보안 > 시큐어코딩' 카테고리의 다른 글

BSIMM은 무엇?  (0) 2018.03.05
[Angular JS] 앵귤라JS 시큐어코딩  (0) 2018.01.03
[Node.js] Node.js 시큐어코딩 규칙 10가지  (0) 2018.01.03
SonarQube 설치 및 사용법  (0) 2017.12.12
OWASP TOP 10 2017  (0) 2017.12.12
잘정리된 XXE인젝션  (0) 2017.12.12
블로그 이미지

오픈이지 제로킴

시큐어코딩 교육/컨설팅 전문가 그룹

티스토리 툴바