Express 애플리케이션의 보안 유지
24621 단어 nodesecurityjavascript
개술
본고의 중점은 노드를 어떻게 보호하는지 이해하는 것이다.js 및 Express 응용 프로그램
소개하다.
안전은 디지털 세계의 큰 우려다.만약 응용 프로그램이 안전하지 않다면, 만약 당신이 해커에게 공격을 당한다면, 이것은 문제가 아니라, 당신이 해커에게 공격을 당할 때이다.다음은 야외에서 프로그램을 보호할 수 있는 방법들입니다.
보안 모범 사례
우선 Express 중 가장 좋은 실천들을 소개해 드리겠습니다.Express는 공격자에게 사이트 작동 방식에 대한 정보를 제공하기 때문에 X-Powered-By 헤더를 비활성화해야 한다고 알려 줍니다.간단한 복구 방법은 이 패키지helmet를 설치하는 것이다.헬멧은 응용 프로그램에 공격을 받지 않도록 기존의 보안 변경 사항을 추가했다.
const express = require("express");
const helmet = require("helmet");
const app = express();
app.use(helmet());
또 다른 권장 사항은 기본 설정 쿠키를 사용하지 않고 쿠키 세션을 사용하는 것입니다.Set Cookie는 전체 세션 대상을 저장하고 쿠키세션은 세션 ID만 저장합니다. 예를 들어 노드에서 쿠키세션을 사용하여 쿠키를 설정할 수 있습니다.js 자체:const express = require('express')
const cookieSession = require('cookie-session')
const app = express()
const expiryDate = new Date(Date.now() + 60 * 60 * 1000) // 1 hour
app.use(cookieSession({
name: 'trusted cookie', // Don't use Set-Cookie
path: '/',
expires: expiryDate,
keys: ['some random key']
}))
...
쿠키에 추가 보안층을 추가하려면sameSite 속성을 변경할 수 있습니다.기본적으로 '엄격' 으로 변경하면sameSite는 lax로 설정됩니다. 쿠키의 사용은 쿠키를 발표하는 영역에만 한정됩니다.const express = require('express')
const cookieSession = require('cookie-session')
const app = express()
const expiryDate = new Date(Date.now() + 60 * 60 * 1000) // 1 hour
app.use(cookieSession({
name: 'trusted cookie', // Don't use Set-Cookie
path: '/',
expires: expiryDate,
keys: ['some random key'],
sameSite: 'strict'
}))
...
다음으로, 우리는 우리의 의존항에 안전 문제가 없다는 것을 확보해야 한다.우리는 npm 감사를 실행하거나 snyk 의존항의 안전 문제를 검사할 수 있습니다.예를 들어 snyk 테스트 의존항을 사용하면 다음과 같은 출력이 발생합니다.Testing /Users/meddy/projects/demo...
Organization: creativethoughtz.team
Package manager: npm
Target file: package-lock.json
Project name: demo
Open source: no
Project path: /Users/meddy/projects/demo
Licenses: enabled
✓ Tested 56 dependencies for known issues, no vulnerable paths found.
Synk는 옵션이지만 일반 npm만 사용할 수 있습니다.npm가 있으면 프로젝트의 빈틈을 스캔하고 빈틈 의존 항목과 호환되는 업데이트를 자동으로 설치할 수 있습니다.빠른 팀 액세스Security Best Practices에 대한 전체 권장 사항 목록을 검토합니다.이때 프로그램의 방어력이 가장 낮다.응용 프로그램의 안전성을 어떻게 향상시키는지 봅시다.사이트 전반에 걸쳐 CSRF(위조 요청)
Cross-Site Request Forgery는 웹 응용 프로그램에서 가장 흔히 볼 수 있는 공격 중의 하나이다.웹 서버가 사용자에게 특정한 유형의 접근 키 (쿠키나 영패일 수도 있음) 를 제공할 때 공격이 발생하기 때문에 사용자는 재인증을 피할 수 있습니다.사용자가 CSRF 공격이 설정된 다른 사이트를 방문하면 악성 사이트는 사용자를 대표하여 서버에 요청을 할 수 있다.CSRF 공격을 방지하려면 csurf 패키지를 사용합니다.csurf 패키지는 서버에 보내는 모든 요청이 웹 사이트에서 온 것을 확보합니다.csurf 패키지는 사이트의 폼에 암호화 카드를 저장할 수 있습니다.서버에 요청을 할 때, 유효 부하에는 표에 저장된 영패가 포함되어야 합니다.
샘플 서버
const express = require('express')
const cookieSession = require('cookie-session');
const csrf = require('csurf')
const expressHandlebars = require('express-handlebars');
const bodyParser = require('body-parser')
// setup csrf Protection middleware
const csrfProtection = csrf();
const parseForm = bodyParser.urlencoded({ extended: false })
const app = express()
app.engine('handlebars', expressHandlebars({ defaultLayout: 'main' }));
app.set('view engine', 'handlebars')
const expiryDate = new Date(Date.now() + 60 * 60 * 1000) // 1 hour
app.use(cookieSession({
name: 'session',
path: '/',
expires: expiryDate,
sameSite: 'strict',
keys: ['some random key']
}))
app.get('/form', csrfProtection, function (req, res) {
// pass the csrfToken to the view
res.render('send', { csrfToken: req.csrfToken() })
})
// when a post is made verify the token
app.post('/process', parseForm, csrfProtection, function (req, res) {
res.send('data is being processed')
})
csrf 토큰이 있는 기본 양식
<form action="/process" method="POST">
<input type="hidden" name="_csrf" value="{{csrfToken}}">
Favorite color: <input type="text" name="favoriteColor">
<button type="submit">Submit</button>
</form>
CSRF 보호를 제공하는 또 다른 방법은 출처와 참고headers를 검사하는 것이다. 이를 금지 헤더라고 부른다.금지된 헤더는 프로그래밍 방식으로 수정할 수 없는 헤더입니다. 사용자 에이전트가 완전히 제어하기 때문입니다.이 헤더는 요청한 호스트를 포함하고 있으며, 우리는 이 정보를 사용하여 응용 프로그램의 호스트와 비교할 수 있다.이를 통해 CSRF 공격에 대한 추가 보안 계층을 제공할 수 있습니다.응용 프로그램의 다른 보안 옵션을 계속 탐색합시다.
사이트 간 스크립트(XSS)
Cross-Site Scripting는 공격자가 응용 프로그램에 악성코드를 주입할 수 있는 것을 말한다.좋은 소식은 Angular, React, Pug 등 전방 프레임워크를 사용하면 데이터가 XSS 공격으로부터 보호됩니다.그러나 데이터베이스에서 데이터가 정리되는 것을 확보하는 유일한 방법은 서버의 데이터를 정리하는 것이다.우리는 소프트웨어 패키지sanitize-html를 사용하여 데이터를 정리할 수 있다.
const sanitizeHtml = require('sanitize-html');
const dirty = 'some really tacky <script>alert("Hi")</script>';
const clean = sanitizeHtml(dirty);
만약에 프레임워크를 사용하지 않고 앞부분을 나타내거나 데이터베이스에 어떤 html 표시를 저장하기를 원한다면 이런 방법을 사용할 수 있다.다양한 유형의 XSS 공격과 이를 방지하는 방법에 대해 자세히 알아보십시오OWASP Cheat Sheet.속도 제한
Rate Limiting는 우리가 배치할 수 있는 또 다른 방어 메커니즘으로 우리의 자원을 착취로부터 보호한다.속도 제한은 서버에 요청할 수 있는 수량을 제한합니다.최대 요청 수에 도달하면 서버에서 이 원본으로부터의 요청을 제한합니다.
권한을 부여하다
권한을 부여하는 것은 사용자의 시스템에서의 권한을 대표한다.특권은 이니셜 CRUD로 정의된 특정 리소스로, CRUD는 생성, 읽기, 업데이트 및 삭제를 나타냅니다.사용자의 권한을 확정할 때 경험법은 최소 권한 원칙이다.이것은 필요할 때만 시스템 사용자에게 특권을 부여해야 한다는 것을 의미합니다.
인증
Password Authentication Protocol (PAP)는 가장 약한 신분 검증 방안 중 하나이지만 가장 많이 사용된다.암호는 해커에게 쉽게 침입되고, 더 심각한 것은 그들의 국화 사슬이다.이 문제는 평균 사용자가 90여 개의 온라인 계정을 가지고 있기 때문이다.따라서 만약에 우리 프로그램이 비밀번호를 인증해야 한다면 프로그램은 강력한 비밀번호 요구를 강제로 실행해야 한다.이것은 우리의 신분 검증 방안이 체인에서 가장 약한 것이 아니라는 것을 확보하는 데 도움이 될 것이다.그 밖에 우리는 암호의 암호화 알고리즘을 고려하여 암호의 해독을 방지해야 한다.산열 알고리즘을 선택할 때 우리는 sha2 산열 알고리즘의 암호화 방법을 사용하지 않고 argon2 산열 알고리즘을 사용하는 방법을 사용해야 한다. 왜냐하면 더욱 안전하기 때문이다.
해싱 코드 세그먼트
const argon2 = require('argon2');
try {
const hash = await argon2.hash("password");
} catch (err) {
//...
}
암호 코드 세그먼트 확인
try {
if (await argon2.verify("<big long hash>", "password")) {
// password match
} else {
// password did not match
}
} catch (err) {
// internal failure
}
가능하다면 우리는 자신의 신분 검증 시스템을 구축하는 것을 피하고 기존의 신분 검증 시스템을 활용해야 한다.유행하는 신분 검증 시스템은passport이다.Passport에서 인증 옵션을 제공합니다.OAuth나SAML 표준을 사용하는 사람에게 전체 인증 과정을 의뢰하거나, 인증을 직접 관리하려면 로컬 정책을 사용할 수 있습니다.passport.use(new LocalStrategy(
function(username, password, done) {
User.findOne({ username: username }, function (err, user) {
if (err) { return done(err); }
if (!user) { return done(null, false); }
if (!user.verifyPassword(password)) { return done(null, false); }
return done(null, user);
});
}
));
또 다른 점점 유행하는 개념은 passwordless 신분 검증이다.암호 인증이 없으면 사용자가 암호를 기억하지 않고 로그인할 수 있습니다.반면 사용자는 휴대전화 번호나 이메일 주소를 입력하고 일회용 코드나 링크를 받은 뒤 이 코드나 링크로 로그인할 수 있다.우리는 현재 인터넷에서 사용자를 검증하는 옵션이 생겨서 응용 프로그램의 안전성을 계속 향상시킬 수 있다.HTTPS(전송 중인 데이터)
HTTPS는 데이터 무결성을 보호하는 데 사용할 수 있는 가장 간단한 보안 메커니즘 중 하나일 수 있습니다.Https는 데이터 전송 과정에서 이를 암호화하여 해커가 클라이언트와 서버 간에 교환하고 있는 정보를 접근하기 매우 어렵다.
AES-256(정적 데이터)
응용 프로그램과 자원을 보호하는 데 사용할 수 있는 또 다른 보안 기능은 데이터가 데이터베이스에 저장되거나 정지될 때 암호화하는 것이다.AES-256 등 강력한 암호화 알고리즘을 사용하여 정적 데이터를 암호화할 수 있다.AES-256을 사용하여 정적 데이터를 암호화하는 가장 유행하는 방법은 AWS KMS Envelope Encryption Strategy입니다.이 방안은 주 키로 데이터 키를 암호화한 다음에 이 키 키로 정지 데이터를 암호화할 수 있습니다.데이터를 복호화하려면 정지 데이터를 암호화하는 데 사용할 같은 데이터 키를 사용해야 합니다.
계획 있어요?
하나의 안전 계획은 안전 계획과 응용 프로그램 생존의 최종 결정 요소가 될 것이다.보안 계획에는 무엇을 해야 할지, 누구에게 통지해야 하는지, 공격 유형과 어떻게 응답해야 하는지 개술되어 있다.안전 계획은 통상적으로 안전팀에서 제정한 것으로 본고의 범위를 넘어섰다.그러나 AWS Security Whitepapers는 업계에서 가장 좋은 안전 실천을 개술했는데 그 중 많은 것이 그들이 자신의 소프트웨어 프로젝트에서 사용한 것이다.
결론
예전과 같이 몸조심하십시오. 본문을 읽어 주셔서 감사합니다.만약 이 글이 도움이 된다고 생각한다면 평가나 평론을 남기거나 문제가 있다면 주저하지 않고 질문하세요.
Reference
이 문제에 관하여(Express 애플리케이션의 보안 유지), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/meddy672/securing-an-express-application-43m1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)