「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Node.js アプリケーションを保護するためのガイド

Node.js アプリケーションを保護するためのガイド

2024 年 11 月 11 日に公開
ブラウズ:241

A Guide for Securing Your Node.js Application

現在、アプリケーションのセキュリティは非常に重要です。 Node.js アプリケーションのセキュリティを確保するには、データ侵害、不正アクセス、その他の脆弱性から保護するためのさまざまな実践が必要です。この記事では、HTTPS、CORS、データ暗号化などをカバーし、Node.js アプリケーションを保護するための主要なセキュリティ対策について説明します。また、これらのテクニックを効果的に実装する方法を示す実践例も詳しく説明します。

  1. Web アプリケーションでセキュリティが重要な理由
  2. Node.js アプリケーションでの HTTPS の使用
  3. CORS (クロスオリジン リソース共有) について
  4. Node.js でのデータ暗号化
  5. 環境変数を使用した機密データの保護
  6. JWT による認証と認可
  7. DDoS 攻撃を防ぐためのレート制限の実装
  8. 実際のユースケース: Node.js でのセキュリティのベスト プラクティスの適用

Web アプリケーションでセキュリティが重要な理由

Web アプリケーションを保護するにはセキュリティが不可欠です:

  • ユーザー データ: ログイン認証情報や個人データなどの機密情報を保護します。
  • システムの整合性: 不正アクセス、データ侵害、インジェクション攻撃を防ぎます。
  • コンプライアンス: GDPR、HIPAA、PCI-DSS などの業界標準に準拠しています。

Node.js アプリケーションでの HTTPS の使用

HTTPS (HyperText Transfer Protocol Secure) は、サーバーとクライアント間で送信されるデータの暗号化を保証します。 Node.js アプリケーションで HTTPS を設定する方法は次のとおりです。

ステップ 1: SSL 証明書を生成する

OpenSSL などのツールを使用して SSL 証明書を生成できます:

openssl req -nodes -new -x509 -keyout server.key -out server.cert

ステップ 2: Node.js で HTTPS を有効にする

Node.js で https モジュールを使用します:

const https = require('https');
const fs = require('fs');
const express = require('express');

const app = express();
const options = {
    key: fs.readFileSync('server.key'),
    cert: fs.readFileSync('server.cert')
};

https.createServer(options, app).listen(3000, () => {
    console.log("HTTPS Server running on port 3000");
});

CORS (クロスオリジンリソース共有) について

CORS は、Web ページがその Web ページを提供したドメイン以外のドメインにリクエストを行うことを制限します。これは、クロスサイト リクエスト フォージェリ (CSRF) 攻撃を防ぐのに役立ちます。

Express での CORS の実装

cors パッケージを使用して CORS ポリシーを設定できます:

const cors = require('cors');
app.use(cors({ origin: 'https://trusted-domain.com' }));

Node.js でのデータ暗号化

機密データを保存または送信する前に暗号化すると、セキュリティがさらに強化されます。 Crypto は、暗号化メソッドを提供する組み込みの Node.js モジュールです。

データの暗号化と復号化

const crypto = require('crypto');
const algorithm = 'aes-256-cbc';
const key = crypto.randomBytes(32);
const iv = crypto.randomBytes(16);

function encrypt(text) {
    let cipher = crypto.createCipheriv(algorithm, Buffer.from(key), iv);
    let encrypted = cipher.update(text);
    encrypted = Buffer.concat([encrypted, cipher.final()]);
    return { iv: iv.toString('hex'), encryptedData: encrypted.toString('hex') };
}

function decrypt(text) {
    let iv = Buffer.from(text.iv, 'hex');
    let encryptedText = Buffer.from(text.encryptedData, 'hex');
    let decipher = crypto.createDecipheriv(algorithm, Buffer.from(key), iv);
    let decrypted = decipher.update(encryptedText);
    decrypted = Buffer.concat([decrypted, decipher.final()]);
    return decrypted.toString();
}

// Example usage
const encrypted = encrypt("Sensitive data");
console.log("Encrypted:", encrypted);
console.log("Decrypted:", decrypt(encrypted));

環境変数を使用して機密データを保護する

API キーやデータベース認証情報などの機密情報をコードに保存することは危険です。代わりに、dotenv.

のような環境変数とライブラリを使用してください。

例:

  1. dotenv をインストールします:
   npm install dotenv
  1. 機密データを .env に追加:
   DB_USER=username
   DB_PASS=password
  1. コード内の変数にアクセスします:
   require('dotenv').config();
   const dbUser = process.env.DB_USER;
   const dbPass = process.env.DB_PASS;

JWT による認証と認可

JWT (JSON Web Token) は、当事者間で情報を送信するためのコンパクトで安全な方法です。 API でのステートレス認証によく使用されます。

JWT認証の設定

  1. jsonwebtokenをインストールします:
   npm install jsonwebtoken
  1. JWT の作成と検証:
   const jwt = require('jsonwebtoken');

   // Generate JWT
   function generateToken(user) {
       return jwt.sign(user, process.env.JWT_SECRET, { expiresIn: '1h' });
   }

   // Verify JWT
   function verifyToken(token) {
       return jwt.verify(token, process.env.JWT_SECRET);
   }

   // Usage
   const token = generateToken({ id: 1, username: 'user1' });
   console.log("Token:", token);

   try {
       const decoded = verifyToken(token);
       console.log("Decoded Token:", decoded);
   } catch (error) {
       console.error("Invalid token");
   }

DDoS 攻撃を防ぐためのレート制限の実装

レート制限は、ユーザーが時間枠内に実行できるリクエストの数を制限し、DDoS 攻撃を軽減します。

エクスプレス レート リミッターの使用

const rateLimit = require('express-rate-limit');

const limiter = rateLimit({
    windowMs: 15 * 60 * 1000, // 15 minutes
    max: 100 // Limit each IP to 100 requests per window
});

app.use(limiter);

実際のユースケース: Node.js でのセキュリティのベスト プラクティスの適用

セキュリティが最優先されるオンライン バンキング アプリケーションを考えてみましょう。これまで説明してきたプラクティスを実装する方法は次のとおりです:

  1. HTTPS: すべてのクライアント/サーバー通信を暗号化して機密データを保護します。
  2. CORS: CSRF を軽減するために、信頼できるドメインからのリクエストを制限します。
  3. 暗号化: 個人データなどの機密情報を暗号化します。
  4. 環境変数: すべての認証情報と機密情報を安全に保存します。
  5. JWT 認証: 安全なステートレス認証のために JWT トークンを発行します。
  6. レート制限: リクエストを制限することで、DDoS 攻撃からエンドポイントを保護します。

これらのベスト プラクティスを実装することで、一般的な脅威に対してアプリケーションの安全性を確保できます。

結論

Node.js アプリケーションのセキュリティ保護は継続的なプロセスです。 HTTPS の使用、CORS の設定、データの暗号化、環境変数の使用、JWT 認証の実装、レート制限の追加など、ここで取り上げる手法は、アプリを不正アクセスやデータ侵害から保護するために不可欠です。これらのメソッドを組み込むことで、Node.js アプリケーションの堅牢なセキュリティ基盤を作成できます。

リリースステートメント この記事は次の場所に転載されています: https://dev.to/imsushant12/a-guide-for-securing-your-nodejs-application-42cj?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3