バックエンドセキュリティ
認証と認可から、一般的な脆弱性とその防御策まで、バックエンドの基本的なセキュリティ実践を理解する。
バックエンドセキュリティが重要な理由
バックエンドシステムは機密データや重要な処理を扱うため、適切に保護されていないと攻撃の主要な標的になります。
- バックエンドは、認証情報、個人情報、金融情報などの機密データを保存します。
- セキュリティは、不正アクセスを防ぎ、データ漏えいから保護します。
- 攻撃は外部ユーザーだけでなく、内部のシステムコンポーネントも標的にすることがあります。
詳細
バックエンドシステムは、ユーザーの認証情報、個人データ、金融記録、内部サービス間通信など、アプリケーションの中でも特に機密性の高い部分を扱います。これらのシステムが侵害されると、データ漏えいからサービス全体の停止まで、深刻な影響が発生する可能性があります。
セキュリティは、誰がシステムにアクセスできるのか、またどのような操作を許可されているのかを厳格に制御するために存在します。こうした制御がなければ、どのクライアントでも重要なデータにアクセスしたり変更したりできてしまう可能性があります。
一般的な脅威には、不正アクセスの試み、大規模なデータ漏えい、システムの脆弱性を悪用する悪意ある攻撃などがあります。これらの脅威は本番環境では常に存在するため、継続的に防御する必要があります。
高いレベルで見ると、バックエンドセキュリティはクライアントとシステムの間に保護層を追加します。すべてのリクエストは、アプリケーションロジックに到達する前にセキュリティ制御を通過しなければなりません。これらの制御により、有効で許可された操作だけが実行されることが保証されます。
認証
認証は、システムへのアクセスを許可する前に、ユーザーまたはサービスの身元を確認します。
- ユーザーは、パスワードやトークンなどの認証情報を使って身元を証明します。
- システムは、アクセスを許可する前にこれらの認証情報を検証します。
- 認証は、人間のユーザーとサービスの両方に適用されます。
詳細
認証は、バックエンドシステムを保護するための最初のステップです。これは、「このリクエストを送っているのは誰か?」という基本的な問いに答えます。どの操作を許可する前にも、システムはリクエスト送信者の身元を確認しなければなりません。
このプロセスでは通常、認証情報を使用します。ユーザーはパスワードを入力したり、セッショントークンを提示したり、APIキーを使ったりします。より高度な構成では、Google のような ID プロバイダーや企業向け認証システムが、アプリケーションに代わって身元を確認できます。
認証情報が検証されると、システムはその身元が確認されたとみなします。これは、ユーザーが何でもできるという意味ではありません。あくまで「誰であるか」を確認するだけです。何を許可されているかは、認可によって別途扱われます。
認証がなければ、システムは正当なユーザーと悪意のある攻撃者を区別する方法がなくなり、安全なアクセス制御は不可能になります。
認可
認可は、認証済みのユーザーやサービスがシステム内で何を実行できるかを決定します。
- 認可は、身元が確認された後に権限をチェックします。
- アクセスは、ロールやポリシーに基づいて許可または拒否されます。
- ユーザーごとに、リソースへのアクセス権限のレベルを変えることができます。
詳細
ユーザーが認証されると、システムはそのユーザーが誰であるかを把握しますが、まだどの操作を実行できるかを判断する必要があります。これが認可の役割です。
認可は、権限をチェックすることで機能します。たとえば、一般ユーザーは自分のデータの閲覧だけが許可される一方で、管理者はアカウントの削除やシステム設定の変更ができる場合があります。これらのルールは、ロール、アクセス制御リスト、またはポリシーベースのシステムによって適用されます。
この処理はシンプルな流れで進みます。認証済みのユーザーがリクエストを送信し、システムがその権限を確認し、その後で操作を許可するか拒否します。
適切な認可がなければ、認証済みのユーザーが本来アクセスすべきでないデータにアクセスしたり、変更したりできてしまい、深刻なセキュリティ脆弱性につながります。
OAuth
OAuth は、アプリケーションがユーザーの認証情報を直接扱わずに、別のサービスからユーザーデータへアクセスできるようにします。
- ユーザーは信頼できるサードパーティのプロバイダーを通じて認証します。
- プロバイダーはアプリケーションにアクセストークンを発行します。
- アプリケーションはそのトークンを使ってユーザーデータへ安全にアクセスします。
詳細
OAuth は、委任されたアクセスのために設計されたプロトコルです。パスワードのような認証情報を複数のアプリケーションと共有する代わりに、ユーザーは信頼できるプロバイダー(たとえば Google)で認証し、その後、トークンを通じてアプリケーションに限定的なアクセス権を付与します。
通常、流れは次のようになります。ユーザーがプロバイダーを使ってログインを選択し、プロバイダーがユーザーを認証し、その後アプリケーションにアクセストークンを発行します。このトークンはユーザーの許可を表し、特定のリソースにアクセスするために使用できます。
この方法は、アプリケーションがユーザーの実際の認証情報を見たり保存したりしないため、セキュリティを向上させます。また、アプリケーションがアクセスできるデータをきめ細かく制御できます。
OAuth は、「Login with Google」「Login with Facebook」などの統合で広く使われており、安全なサードパーティ認証と制御されたデータ共有を可能にします。
JSON Web Tokens (JWT)
JWT は、認証済みの ID を保持するコンパクトなトークンで、ユーザーを検証するために各リクエストと一緒に送信されます。
- サーバーは、認証に成功した後に署名付き JWT を発行します。
- クライアントはトークンを保存し、検証のために今後のリクエストに含めます。
- トークンは、サーバー側のセッション保存なしで、ユーザーの ID、権限、有効期限をエンコードします。
詳細
JSON Web Tokens (JWTs) は、ステートレスなシステムで認証を維持するための一般的な方法です。ユーザーがログインすると、サーバーは JWT を生成してクライアントに送信します。クライアントはその後、このトークンを今後のリクエストに含めます。通常は HTTP Authorization ヘッダーに入れます。
JWT には、ユーザー ID、権限、有効期限などのエンコードされた情報が含まれます。このデータはサーバーによって署名されるため、バックエンドはトークンが改ざんされていないことを検証できます。
トークン自体に必要な ID 情報がすべて含まれているため、サーバーはユーザーごとのセッションデータを保存する必要がありません。これにより、JWT は特に分散システムにおいて効率的でスケーラブルになります。
ただし、JWT は慎重に扱う必要があります。トークンが漏えいすると、有効期限が切れるまでユーザーになりすまして使用される可能性があります。適切な有効期限の設定と、クライアント側での安全な保存が重要です。
パスワードのハッシュ化
パスワードはハッシュ値として保存する必要があります。そうすることで、たとえデータが漏えいしても、元のパスワードを直接復元できません。
- パスワードは保存前に一方向のハッシュ関数で変換されます。
- ログイン時には、入力されたパスワードをハッシュ化して保存済みのハッシュと比較します。
- bcrypt、Argon2、PBKDF2 のような安全なアルゴリズムは、攻撃に耐えられるよう設計されています。
詳細
パスワードを平文で保存することは、重大なセキュリティ上の欠陥です。データベースが侵害されると、攻撃者はすべてのユーザーパスワードにすぐアクセスできてしまいます。これを防ぐために、システムは代わりにパスワードのハッシュ化されたバージョンを保存します。
ハッシュ関数は入力(パスワード)を受け取り、固定長の出力(ハッシュ)を生成します。この処理は一方向であり、ハッシュから元のパスワードへ計算上戻すことは現実的に不可能です。
ユーザーがログインすると、システムは入力されたパスワードをハッシュ化し、保存されているハッシュと比較します。一致すれば、元の値を公開することなくパスワードが正しいと確認できます。
bcrypt、Argon2、PBKDF2 などの最新のハッシュアルゴリズムは、意図的に処理を遅くし、ソルトのような機能を含めることで、総当たり攻撃や事前計算攻撃に対抗します。そのため、基本的なハッシュ関数よりも大幅に安全です。
クロスサイトリクエストフォージェリ (CSRF)
CSRF攻撃は、ユーザーの認証済みセッションを悪用して、本人の知らないうちに意図しない操作を実行させます。
ユーザー(ログイン済み)
ブラウザ
サーバー
- 攻撃者は、ログイン中のユーザーのブラウザをだまして、許可されていないリクエストを送信させます。
- サーバーはユーザーのセッションを信頼しているため、そのリクエストを処理します。
- 防御は、リクエストが信頼できる送信元から来たことを検証することに依存します。
詳細
クロスサイトリクエストフォージェリ (CSRF) は、悪意のあるWebサイトが、ユーザーがすでに認証されている別のサイトへブラウザにリクエストを送信させることで発生します。ブラウザはセッションCookieを自動的に含めるため、サーバーはそのリクエストを正当なものだと判断してしまいます。
たとえば、ユーザーが銀行アプリケーションにログインした状態で悪意のあるサイトを訪れると、そのサイトは隠しリクエストを発生させて送金を実行させることができます。サーバーは有効なセッションを確認するため、その操作をユーザーが意図していなくても処理してしまいます。
CSRF攻撃を防ぐために、システムはCSRFトークンや same-site cookies などの手法を使用します。CSRFトークンはリクエストに含める一意の値で、サーバーがそれを検証することで、そのリクエストが正しいアプリケーションから送られたことを確認します。same-site cookies はCookieが送信される条件を制限し、クロスサイトリクエストのリスクを下げます。
適切なCSRF対策がないと、攻撃者は信頼されたユーザーセッションを悪用して、ユーザーの認証情報に直接アクセスすることなく有害な操作を実行できます。
クロスサイトスクリプティング (XSS)
XSS 攻撃は、悪意のあるスクリプトを Web ページに注入し、他のユーザーのブラウザで実行させます。
- 信頼できないユーザー入力が、ブラウザ内でコードとして注入・実行される可能性があります。
- 攻撃者はセッションデータを盗んだり、ユーザー操作を改ざんしたりできます。
- 防御には、ユーザー提供コンテンツをすべて厳密に扱うことが必要です。
詳細
クロスサイトスクリプティング (XSS) は、アプリケーションが信頼できないユーザー入力を、適切に検証またはエスケープせずに Web ページへ含めるときに発生します。これにより、攻撃者は他のユーザーのブラウザで実行されるスクリプトを注入できます。
たとえば、コメント欄が生の HTML や JavaScript を許可している場合、攻撃者は別のユーザーがページを閲覧するたびに実行されるスクリプトを挿入できます。このスクリプトは Cookie を盗んだり、ユーザー入力を取得したり、ユーザーに代わって操作を実行したりする可能性があります。
XSS を防ぐには、システムはすべてのユーザー入力を信頼できないものとして扱う必要があります。入力のサニタイズは潜在的に危険なコンテンツを除去し、出力のエスケープはデータを実行可能なコードではなくテキストとして表示することを保証します。Content Security Policies (CSP) は、実行を許可するスクリプトを制限することで、追加の保護層を提供します。
適切な防御がなければ、XSS の脆弱性はユーザーアカウントを侵害し、アプリケーション全体のセキュリティを損なう可能性があります。
シークレット管理
シークレット管理は、機密性の高い認証情報がコードやシステム内で露出することなく、安全に保存、アクセス、ローテーションされることを保証します。
- シークレットには、APIキー、データベース認証情報、暗号化キーが含まれます。
- それらをハードコードしたり、ソースコード内で公開したりしてはいけません。
- 安全なシステムはアクセスを制御し、シークレットを定期的にローテーションします。
詳細
バックエンドシステムは、データベース、外部サービス、内部コンポーネントと通信するために機密性の高い認証情報に依存しています。これらのシークレットには、APIキー、データベースパスワード、暗号化キーが含まれ、いずれも不正アクセスから保護されなければなりません。
シークレットをコードや設定ファイルに直接保存することは、重大なセキュリティリスクです。コードベースが公開されると、埋め込まれた認証情報はすべて即座に漏えいします。代わりに、シークレットは安全な保存と制御されたアクセスのために設計された専用システムに保存すべきです。
AWS Secrets Manager や HashiCorp Vault のようなシークレットマネージャーは、認証情報の केंद्र化された保存、アクセス制御、自動ローテーションを提供します。環境変数はより簡単な構成で使われることもありますが、それでも慎重な取り扱いが必要です。
適切なシークレット管理は、認証情報漏えいのリスクを減らし、機密情報を公開することなく、システムが必要なリソースへ安全にアクセスできるようにします。
レート制限によるセキュリティ保護
レート制限は、リクエスト量を制限して悪用やサービス拒否攻撃を防ぐことで、セキュリティ制御として機能します。
- 一定の時間枠内でクライアントが送信できるリクエスト数を制限します。
- ログインや API などのエンドポイントをブルートフォース攻撃や悪用から保護します。
- 上限を超えた過剰なリクエストはブロックされるか、遅延されます。
詳細
レート制限は単なるパフォーマンス向上のための仕組みではなく、重要なセキュリティ機構です。クライアントが送信できるリクエスト数を制御することで、システムはブルートフォースによるログイン試行やサービス拒否攻撃のような悪用を防ぐことができます。
たとえば、ログイン試行回数を制限すると、パスワード推測攻撃の効果を下げられます。同様に、API のリクエスト上限を設定することで、1つのクライアントがバックエンドサービスを圧倒するのを防げます。
仕組みはシンプルです。受信したリクエストを定義された上限と照合し、しきい値を超えた場合はそのリクエストを拒否するか遅延させます。これにより、公平な利用を確保し、システムリソースを保護できます。
他のセキュリティ対策と組み合わせることで、レート制限は悪意のあるトラフィックや不正利用に対するシステムの耐性を大幅に高めます。
質問セクション
1 / 5
このレッスンはプレミアムコンテンツです
プレミアムにアップグレードしてぼかしを解除し、全文を読めるようにしましょう。