アイデンティティは「新たな境界」である
クラウド化が進む現代において、従来のネットワーク境界(ファイアウォール)はもはや絶対的な防御線ではありません。VPNで繋がった先のシステムも、クラウド上のSaaSも、従業員の手元のデバイスも——これらはすべて「境界の外」にあると考える必要があります。
現在のサイバー防御の最前線は、ユーザーやデバイスの**「アイデンティティ(ID)」**そのものに移っています。「誰が、何のリソースに、どの状況下でアクセスしようとしているか」を正確に把握し制御することが、現代のセキュリティの核心です。
認証(AuthN)と認可(AuthZ)の決定的な違い
この2つの概念は「Auth」と略されて混同されがちですが、システム設計において明確に分離(Decoupling)して実装する必要があります。混同すると設計上の重大な穴が生まれます。
| 概念 | 略称 | 問いかけ | プロの実務における適用例 |
|---|---|---|---|
| 認証 | AuthN (Authentication) | 「あなたは本当にその人か?」 | ログイン画面でパスワードとFIDO2セキュリティキーを要求し、本人性を暗号学的に確認するフェーズ。 |
| 認可 | AuthZ (Authorization) | 「あなたは何を読み書きできるか?」 | 認証済みのユーザーに対し、IAMポリシーに基づき「S3バケットへのReadOnly権限」のみを付与するフェーズ。 |
「本人だと確認できた(認証)」ことと「何でもできる(認可)」は全く別の話です。この分離を徹底することが、最小権限の原則の基礎となります。
認証:パスワードの限界とMFAの進化
パスワードハッシュの厳格な要件
認証情報(パスワード)をデータベースに保存する際、平文はもちろん、単純なハッシュ化(MD5、SHA-256)も絶対的な禁忌です。現代のGPUクラスタを用いた総当たり攻撃では、MD5ハッシュは1秒間に数百億回を超える速度で解析できます。
| アルゴリズム | 評価 | プロフェッショナルの見解 |
|---|---|---|
| Argon2id | 最推奨 | メモリ・並列性・反復回数を細かく調整可能。パスワードハッシュコンペティション(PHC)の勝者であり、現在最もGPUクラックに強い。新規システムではこれ一択。 |
| bcrypt / scrypt | 推奨 | 実績があり多くのフレームワークのデフォルト。Argon2が利用できない環境での安定した選択肢。 |
| PBKDF2 | 条件付き推奨 | FIPS準拠が厳格に求められる政府系・金融系システム向け(NIST SP 800-63B準拠)。 |
| SHA-256 / SHA-512 | 直ちに使用停止 | ソルト(Salt)を付与しても計算が高速すぎるため、専用クラッキングリグの攻撃に対して脆弱。パスワード保存への使用は禁止。 |
多要素認証(MFA)の落とし穴とFIDO2
「MFAを導入すれば安全」という認識は、AiTM(Adversary-in-The-Middle)を用いるフィッシングキットの台頭によって崩れています。
SMSによるOTP(ワンタイムパスワード)はSIMスワッピングに弱く、認証アプリ(TOTP)の6桁コードも、偽サイトを経由してリアルタイムに奪取されます。精巧なフィッシングサイトがユーザーから盗んだTOTPコードを瞬時に本物のサイトへ転送することで、MFAをバイパスするのです。
これに対抗できる唯一の認証手段が、Phishing-Resistant MFA(耐フィッシングMFA) と呼ばれる規格です。
認可・委譲:OAuth 2.0 と OpenID Connect (OIDC)
OAuth 2.0(権限委譲フレームワーク)
OAuth 2.0は「アプリAに、ユーザーのパスワードを教えることなく、アプリB(例:Googleドライブ)上のデータへのアクセス権を部分的に渡す(委譲する)」ための仕組みです。
たとえば「Notionを使い始める際にGoogleアカウントで連携する」という操作がOAuth 2.0です。あなたはGoogleのパスワードをNotionに教えていません。Googleが「NotionにGドライブの読み取り権限だけを渡すことを許可しますか?」と確認し、承認した分だけのトークンを発行します。
※OAuthは「認証」プロトコルではなく、「権限委譲」のプロトコルです。
かつて多用された「インプリシットグラント(Implicit Grant)」は、トークンがURLフラグメントに露出し漏洩リスクが高いため非推奨となりました。フロントエンドSPAであっても**「PKCE(Proof Key for Code Exchange)を伴う認可コードグラント」**を使用することが現在の世界標準です。
OpenID Connect(OIDC)による認証の標準化
OAuth 2.0の仕組みの上に「ユーザーの身元確認(認証)」の機能を追加したのがOIDCです。JWTフォーマットの「IDトークン」を発行することで、SSO(シングルサインオン)のデファクトスタンダードとなっています。「Google/GitHubでログイン」はすべてOIDCで実現されています。
アクセス制御モデル(AuthZ)の設計戦略
誰がどのリソースにアクセスできるかを決める認可モデルの設計は、情報漏洩を防ぐ最後の砦です。
RBAC(ロールベースアクセス制御)
ユーザーに「ロール(役割)」を付与し、そのロールに対して権限を割り当てます。
- 利点: 初期導入がシンプルで管理しやすい。
- 限界: 組織がスケールすると「プロジェクトAの読み取り・プロジェクトBの書き込み権限を持つロール」など、ロール数がユーザー数を上回る「ロール爆発問題」が起きます。100人の組織で200種類のロールが生まれた時点で、管理は破綻します。
ABAC(属性ベースアクセス制御)とゼロトラスト
現在の**ゼロトラストネットワークアーキテクチャ(ZTNA)**で採用されているのがABACです。「ユーザーの属性(所属、クリアランスレベル)」「リソースの属性(機密度)」「環境の属性(接続元IP、会社支給デバイスか、時間帯の妥当性)」という複数の変数を、動的なポリシーエンジン(例: OPA / AWS IAM)でリアルタイムに評価します。
- 実装例: 「たとえ管理者(ロール)であっても、未パッチの個人スマホから、休日に、本番DB(リソース)へのアクセスを試みた場合は拒否する」——RBACではこのような文脈依存の判断はできません。
JWT(JSON Web Token)の正しい扱い方
マイクロサービス間の認可トークンとして広く使われるJWTですが、実装ミスによる脆弱性が後を絶ちません。現場で実際に見てきた問題点を挙げます。
- alg:none 攻撃: ヘッダーのアルゴリズム(alg)を「none」に書き換えて署名検証を突破する古典的な攻撃です。バックエンドで許可するアルゴリズム(例:
HS256,RS256)をコードにハードコードして縛ること。ライブラリが「alg=none」を受け入れてはなりません。 - 情報の透明性: JWTはBase64エンコードされているだけで**暗号化されていません**。ペイロードは誰でもデコードして読めます。内部パスや個人情報、機密データをペイロードに入れることは重大なミスです。
- 失効(Revocation)の難しさ: JWTはステートレスなため、一度発行したトークンは有効期限(
exp)まで生き続けます。クリティカルな操作には、DBへの状態確認(ブラックリスト/Redis)と、アクセストークンの寿命を5分程度に設定する短命トークン戦略を組み合わせる必要があります。
【確認問題】現代の認証・認可におけるベストプラクティスとして「誤っているもの」はどれですか?