01
誰なのか、何をしてよいのか:認証と認可
会社のビルに入るときを考えてみましょう。入口では社員証で本人かどうかを確認し、各フロアでは、その社員証で入れる場所かどうかをもう一度確認します。前者が認証(Authentication、誰なのかを確認すること)、後者が認可(Authorization、その人がこの操作をしてよいかを決めること)です。クラウドでも、まったく同じように2つの段階を通ります。
リクエストを送る側をセキュリティプリンシパル(principal)、略してプリンシパルと呼びます。プリンシパルは人だけではありません。毎晩バックアップを実行するプログラムや、注文を処理するサーバーも、クラウドのストレージやデータベースを呼び出すので、どちらもプリンシパルです。人にはパスワードと2つ目の確認手段を、プログラムにはキーや一時的な認証情報を渡して、誰なのかを示してもらいます(4章)。下の図で状況を切り替えてみましょう。
- 状況
- 正常
開発者のリクエストが、認証の扉と認可の扉を順番に通る
リクエストは2つの扉を順番に通ります。1つ目の扉では「このリクエストを送ったのは本当に佐藤さんか」(認証)、2つ目の扉では「佐藤さんはこのストレージを読み取ってよいか」(認可)を確認します。
| 認証 | 認可 | |
|---|---|---|
| 確認すること | このリクエストを送ったのは本当にそのプリンシパルか | そのプリンシパルはこの操作をしてよいか |
| 使うもの | パスワード、MFA、キー、トークン | ポリシー、ロール、権限 |
| 失敗したら | 誰なのかわからない → サインインし直す・新しいキー | 誰なのかはわかる → 権限を申請・修正 |
HTTPの標準では、401が認証失敗(誰なのかをもう一度示してください)、403が認可失敗(誰なのかはわかるが、許可しない)を意味します。ところが、クラウドのAPIはこの区別にそのまま従わないこともあります。どちらも403で返すところもあれば、どちらも401で返すところもあります。ここがつまずきやすいところです。ステータスコードよりも、エラーコードとメッセージを見て、どちらの扉で止まったのかを見分けましょう。
いちばん強いアカウントは、使わないアカウント
クラウドのアカウントを最初に作るときにできる最上位のアカウント(ルート・メインアカウント、最上位の管理者)は、何でもできます。決済情報の変更やアカウントの解約までできてしまいます。だからこのアカウントにはMFAをかけて金庫にしまっておき、普段の作業は権限を分けた別のアカウントで行います。このアカウントが乗っ取られたら、どんな権限設定も役に立たないからです。
問題文にこんな表現があれば → これを選ぶ
- “ユーザーが本人であることを証明するプロセス”認証(Authentication)
- “認証されたユーザーがどんな操作をできるかを決める”認可(Authorization)
- “サインインはできるのに、リソースへの操作が拒否される”認可の問題 — 権限(ポリシー)を確認
- “最上位(ルート)アカウントを守る最初の対策”MFAをかけて、日常の作業には使わない
- “サーバーのプログラムがクラウドのAPIを呼び出すときのID”人のアカウントではなく、プログラム用のID(ロール・サービスアカウント)
誰なのかを確認する扉を見てきました。では、社員が使うアプリが何十個もあったら、その扉をアプリごとに別々に建てる必要があるのでしょうか?
02
IDを1つにまとめる:SSO・フェデレーション・MFA・条件付きアクセス
アプリごとにアカウントとパスワードを別々に持つと、パスワードが増え、みんな同じパスワードを使い回すようになります。退職者が出たら、アプリを1つずつ回ってアカウントを削除しなければならず、1つでも漏れると、その扉は開いたままになります。そこでIDはIDプロバイダー(IdP)の1か所にまとめます。サインインはIdPで1回だけ行い、アプリはIdPが発行した証明(トークン)を信頼して中に入れます。これがSSO(シングルサインオン)です。
会社がすでに社内ディレクトリを使っているなら、クラウドに人を新しく作らなくても、そのディレクトリを信頼させることができます。このように、ほかの組織による本人確認を信頼することをフェデレーションといい、その証明をやり取りする標準がSAML 2.0とOIDC(OpenID Connect)です。
- 方式
- IAM Identity Centerでまとめてサインイン(SSO)
- サインインの場所
- いつもの場所・会社の端末
社員が3つのアプリに入る · 紫 = IDプロバイダー
サインインはIDプロバイダーの1か所だけで行い、アプリはIDプロバイダーが発行した証明(トークン)を信頼して中に入れます。退職の手続きも、1か所でアカウントを止めれば、すべてのアプリで完了します。
パスワード1つでは足りない:MFA
パスワードは、フィッシングや、ほかのサイトから漏れたパスワードを通じて、簡単に漏れてしまいます。MFA(多要素認証)は、パスワードに加えて、持っているもの(スマートフォンのアプリ、セキュリティキー)や自分自身(指紋)で、もう一度確認します。ここがつまずきやすいところですが、同じMFAでも強さは違います。SMSや認証アプリの6桁の数字は、偽のサイトにそのまま入力させられて突破されることがありますが、セキュリティキーとパスキー(FIDO2)は本物のサイトでしか動かないので、フィッシングに強いのです。
状況を見て決める:条件付きアクセス
サインインのたびに、同じ強さで確認する必要はありません。会社のノートPCでオフィスから入るならそのまま通し、初めての国や端末から入ってきたらMFAを求めたり、ブロックしたりできます。このように、ユーザー・場所・端末・リスクといったシグナルを見て、「許可 / 追加の確認のうえで許可 / ブロック」を決めるのが条件付きアクセスです。IDが1か所(IdP)にまとまっていてこそ、こうした条件も1か所で設定できます。
| 用語 | やること |
|---|---|
| IdP(IDプロバイダー) | 人のIDを保管し、サインインを処理する |
| SSO | 1回のサインインで、複数のアプリに入れる |
| フェデレーション(SAML・OIDC) | ほかの組織(社内ディレクトリ)の本人確認を信頼する |
| MFA | パスワード以外の2つ目の確認 — フィッシングに強いのはセキュリティキー・パスキー |
| 条件付きアクセス | 場所・端末・リスクに応じて、許可・追加の確認・ブロックを決める |
問題文にこんな表現があれば → これを選ぶ
- “複数のアプリに、1回のサインインでアクセス”SSO
- “社内ディレクトリのアカウントで、クラウドのコンソールにサインイン”フェデレーション(SAML 2.0・OIDC)
- “フィッシングに強いMFAの手段”セキュリティキー・パスキー(FIDO2)
- “知らない国からサインインしたら、追加の認証を求める”条件付きアクセス
- “退職者のアカウントを、すべてのアプリで一度に止める”IDをIdPの1か所にまとめる
誰なのかは、はっきりしました。次は2つ目の扉、「この操作をしてよいか」を決めるポリシーを読んでみましょう。
広告
03
ポリシーの読み方:誰が・何を・どこに・どんな条件で
権限はポリシーで与えます。プロバイダーごとに見た目は違っても、ポリシーに入る項目はほとんど同じです。誰が(プリンシパル)、何を(アクション)、どこに(リソース)、どんな条件で(条件)、そして許可なのか拒否なのかです。
許可 | 誰が:開発者グループ
| 何を:オブジェクトの読み取り、オブジェクトの書き込み
| どこに:開発用バケットのすべてのオブジェクト
| 条件:MFAでサインインしたときだけリクエストが来ると、システムはそのリクエストに当てはまるポリシーをすべて集めて照らし合わせます。判定のルールは3行だけです。
| 順番 | ルール |
|---|---|
| 1 | どのポリシーも許可していなければ拒否する(暗黙的な拒否) |
| 2 | 許可するポリシーがあれば許可する |
| 3 | ただし、拒否するポリシーが1つでもあれば、許可があっても拒否する(明示的な拒否が勝つ) |
下の図で、許可ポリシーと拒否ポリシーを付けたり外したりしてみましょう。
- 結果
- 許可
1つのリクエストを、付いているポリシーと照らし合わせる · オレンジのカード = 拒否、黄緑のカード = 許可
拒否するポリシーはなく、付いている許可ポリシーが「ストレージ全体の削除」を許可しているので通過します。拒否ポリシーを付けてみましょう。
ポリシーを付ける2つの場所:ID側とリソース側
ポリシーは、人・グループ・ロールといったIDに付けることもあれば(「この人は何ができる」)、ストレージのようなリソースに付けることもあります(「このバケットには誰が入れる」)。リソース側のポリシーには、必ず「誰が」の項目が入ります。リソース側のポリシーは、ほかのアカウントや組織のプリンシパルを受け入れるときに特に大事なので、5章でじっくり見ます。
一人ひとりにではなく、まとめて与える:グループとロール
ポリシーを一人ひとりに付けていると、人が増えるほど管理できなくなります。同じ仕事をする人をグループにまとめてグループに付けたり、「読み取り専用」「データベース運用者」のように権限のまとまりをロールとして作って与えたりすることを、ロールベースのアクセス制御(RBAC)といいます。さらに、タグのような属性を条件に使って、「プロジェクトのタグが同じリソースだけ」のように与えることを、属性ベースのアクセス制御(ABAC)といいます。
問題文にこんな表現があれば → これを選ぶ
- “許可ポリシーと拒否ポリシーが同時に適用される”拒否が勝つ(明示的な拒否が優先)
- “新しく作ったユーザーが何もできない”暗黙的な拒否 — 許可を付ける必要がある
- “MFAでサインインしたときだけ削除を許可”ポリシーの条件(Condition)
- “同じ職務の人たちに同じ権限”グループ・ロールにポリシーを付ける(RBAC)
- “タグが同じリソースにだけアクセスを許可”属性ベースのアクセス制御(ABAC)
ポリシーは、人にだけ付けるものではありません。人がいない夜中もずっと動いているプログラムには、どうやって権限を与えるのでしょうか?
Pro限定
ここまでは無料で読めます
残りの5章はPro会員向けです。各章に3D図解と「問題文にこんな表現があれば」の整理が続き、最後の章では実際に解いて確かめられます。
- 04ロールと一時的な認証情報
- 05リソースポリシーと共有
- 06階層とガードレール
- 07最小権限での運用
- 08アクセスが拒否されたとき
PasslyExam
概念をつかんだら、次は試験形式の問題で確かめましょう
PasslyExamは、各資格の出題範囲に合わせて作成したオリジナルの練習問題・解説・本番形式の模擬試験を提供しています。正解の選択肢がなぜ正しく、似た選択肢がなぜ誤りなのかまで解説します。登録すると毎日無料で練習問題に取り組めます。
この概念が出題される試験
- AIF-C01AWS Certified AI Practitioner
- SAA-C03AWS Certified Solutions Architect - Associate
- CLF-C02AWS Certified Cloud Practitioner
- DVA-C02AWS Certified Developer - Associate
- SOA-C03AWS Certified CloudOps Engineer - Associate
- SAP-C02AWS Certified Solutions Architect - Professional
- SY0-701CompTIA Security+
- AZ-900Microsoft Azure Fundamentals
- AZ-104Microsoft Azure Administrator
- ACEGoogle Cloud Associate Cloud Engineer
- CDLGoogle Cloud Digital Leader
- NCA-100NAVER Cloud Platform Certified Associate
- NCP-202NAVER Cloud Platform Certified Professional (Network/Media, Database/Management/Analytics)
- NCP-207NAVER Cloud Platform Certified Professional (Troubleshooting)