0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ゼロトラストセキュリティ入門:Webサービスで考えるアクセス制御の基本

0
Posted at

従来のシステムでは、「社内ネットワークに接続しているから安全」「VPNを通過しているから信頼できる」という考え方が一般的でした。

しかし、クラウドサービス、リモートワーク、モバイル端末、外部APIなどが広く利用される現在では、ネットワークの内側と外側だけで安全性を判断することが難しくなっています。

そこで注目されているのが Zero Trust(ゼロトラスト) というセキュリティモデルです。

本記事では、ゼロトラストの基本的な考え方と、Webサービスへ取り入れる際の実践ポイントを紹介します。

Zero Trustとは?

Zero Trustは、簡単に言えば、

「最初から信頼せず、アクセスごとに確認する」

という考え方です。

よく知られている原則として、

Never Trust
Always Verify

があります。

つまり、ユーザーや端末がどこからアクセスしているかだけで信頼するのではなく、

  • 誰がアクセスしているのか
  • どの端末を利用しているのか
  • どのリソースへアクセスするのか
  • どの権限を持っているのか

を継続的に確認します。


従来型セキュリティとの違い

従来型のネットワークでは、境界防御を中心に考えることが多くありました。

Internet
   ↓
Firewall
   ↓
Internal Network
   ↓
Applications

Firewallの内側に入れば、比較的信頼された状態として扱われる設計です。

一方、Zero Trustでは、

User
 ↓
Identity Check
 ↓
Device Check
 ↓
Authorization
 ↓
Application

というように、各アクセスごとに確認します。

ネットワークの場所ではなく、IdentityとContextを中心に判断する点が大きな違いです。


1. Identityを中心に考える

Zero Trustでは、ユーザーIDが非常に重要になります。

単純なユーザー名とパスワードだけではなく、

  • Multi-Factor Authentication
  • Session Management
  • Identity Provider
  • Risk-Based Authentication

などを組み合わせます。

例えば、重要な管理画面へアクセスする場合は、通常ログインに加えてMFAを要求する設計が考えられます。

Password
   +
One-Time Code
   ↓
Access

1つの認証要素だけに依存しないことが重要です。


2. 最小権限を適用する

Zero Trustでは、ユーザーへ必要以上の権限を与えません。

これは Least Privilege(最小権限) と呼ばれます。

例えば、

Viewer
→ Read

Editor
→ Read / Write

Admin
→ Read / Write / User Management

のように役割ごとに権限を分けます。

全ユーザーへAdmin権限を与えるような設計は避けます。

WebアプリケーションではRBAC(Role-Based Access Control)を利用すると管理しやすくなります。


RBACの簡単な実装例

Node.jsでは、次のようなMiddlewareを作れます。

function requireRole(role) {
  return (req, res, next) => {
    if (!req.user) {
      return res.status(401).json({
        error: "Authentication required"
      });
    }

    if (req.user.role !== role) {
      return res.status(403).json({
        error: "Access denied"
      });
    }

    next();
  };
}

管理画面で利用する場合:

app.get(
  "/admin",
  requireRole("admin"),
  (req, res) => {
    res.json({
      message: "Admin area"
    });
  }
);

重要なのは、フロントエンド側でボタンを非表示にするだけではなく、サーバー側でも権限チェックを行うことです。


3. Sessionを継続的に確認する

一度ログインしたからといって、永続的に信頼するべきではありません。

Sessionには適切な有効期限を設定します。

例えば、

Access Token
→ 15分

Refresh Token
→ より長い有効期限

のように役割を分ける方法があります。

重要な操作では再認証を要求する設計も有効です。

例えば、

通常閲覧
→ Session確認

メール変更
→ Password再入力

権限変更
→ MFA再認証

のように、操作の重要度によって認証レベルを変えられます。


4. デバイス情報も判断材料にする

Zero Trustでは、IdentityだけでなくDeviceも重要です。

例えば、

  • OS
  • Browser
  • Device Status
  • Security Update
  • Login History

などを確認します。

通常と大きく異なる環境からアクセスされた場合は、追加確認を行うことができます。

ただし、デバイス情報だけでユーザーを完全に識別することはできません。

複数の情報を組み合わせて判断することが重要です。


5. APIごとに認可を行う

モダンなWebサービスでは、フロントエンドとバックエンドがAPIで通信するケースが一般的です。

Zero Trustの考え方では、

「ログイン済みだからすべてのAPIへアクセスできる」

という設計は避けます。

例えば、

GET /api/profile

と

DELETE /api/users/123

では必要な権限が異なります。

そのため、API単位で、

Authentication
+
Authorization

を確認します。


6. JWTを利用する場合の注意点

JWTはAPI認証でよく利用されます。

例えばPayloadには、

{
  "sub": "user123",
  "role": "editor",
  "exp": 1760000000
}

のような情報を含められます。

サーバーでは、

  • Signature
  • Expiration
  • Issuer
  • Audience
  • Role

などを検証します。

単にJWTをデコードできたからといって、安全とは限りません。

署名検証を必ず行う必要があります。


7. ネットワークだけを信用しない

Zero Trustでは、JLPH

192.168.x.x

のような内部IPだから安全、という判断だけ

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?