CloudNative BLOGsの連載「認証認可入門」で使う、実習・自動採点付きの教材です。ひとつのMini Project Appを題材に、認証、セッション、認可、フェデレーション、委任認可を順番に学びます。
このREADMEは、初めてcloneする受講者の開始地点です。上から順に実行してください。
講師として授業を準備する場合は講師ガイド、初学者検証には無支援pilot観察票、エラーから安全に復旧する場合は共通トラブルシュートも参照してください。
| Lesson | 内容 | 状態 | 実行証拠の範囲 |
|---|---|---|---|
| setup | 環境診断、state lifecycle、復旧 | candidate | doctor、setup、reset、purge |
| 01 | 5つの責任境界と10事例の分類 | candidate | provided caseの分類。SAML、OIDC、OAuthのruntime evidenceではありません |
| 02 | password保存、照合、rate limit | experimental | loopback上の実HTTPとfresh scenario |
| 03 | Cookie、rotation、expiry、logout、失効 | experimental | 実Set-Cookie / Cookie。browserの属性強制は未検証 |
| 04 | Cookie sessionからのproject認可 | experimental | 実HTTP、403/404、BOLA拒否、atomic audit |
| 05 | HTTP Basic challenge-response | experimental | 実401/200とWWW-Authenticate。TLSはtraining deviation |
| 06 | LDAP bind、search、DN、group | experimental | runner所有の実OpenLDAP、実HTTP fresh scenario、ACL拒否、lifecycle。TLSはtraining deviation |
| 07 | Kerberos V5、HTTP Negotiate | experimental | 実MIT KDC、kinit / klist / kvno、GSSAPI acceptor、誤SPN・clock skew・旧keytab拒否 |
| 08 | AD互換ID基盤、JML | experimental | 実Samba AD互換DC、verified LDAPS、opaque ID、role mapping、Joiner / Mover / Leaver |
| 09 | SAML 2.0 Web Browser SSO | experimental | 実Keycloak loginから署名済みPOST Response、strict ACS、app session、11件の拒否境界 |
| 10 | OAuth 2.0 Authorization Code + PKCE | experimental | 分離した三originの実HTTP、opaque token、introspection、六つの拒否境界 |
| 11 | OpenID Connect | experimental | 実Discovery/JWKS/RS256 ID Token、全条件検証後のapp session、六つの一条件拒否 |
| 12 | TOTPによるMFA | experimental | RFC 6238 TOTP、登録確認、pre-auth、replay・rate limit、single-use recovery code |
| 13 | FIDO / WebAuthn | experimental | 実Chromium create/get、RP検証、失敗時非保存、challenge・origin・RP ID・署名・replay・userHandle拒否 |
| 14 | Passkey lifecycle | experimental | discoverable login、RP側失効、第二credential復旧、BE/BS、account・session失効 |
| 15 | OAuth API認可 | experimental | RFC 8707 resource、RFC 9068 JWT Access Token、JWKS、scope、tenant・object認可 |
| capstone | 統合設計・運用演習 | experimental | developer / IAM operationsの2 track、7 check、重大拒否test、講師rubric |
candidateとexperimentalはどちらも正式releaseではありません。自動test済みでも、人間pilot、固定revision、全support profileの実機確認は未完了です。授業や公開教材として採用する前に、curriculum/manifest.jsonとcurriculum/support-matrix.jsonの状態を確認してください。
curriculum/manifest.jsonでplannedのLessonは、現時点では開始しません。個別のintegration testが成功しても、対応Lessonが完成したことにはなりません。
| 経路 | 順序 | 標準時間 | 修了範囲 |
|---|---|---|---|
| 完全コース(推奨) | 準備ラボ→各記事を上から読みながら記事内実習を1回→読了後に5問で4問以上→Capstone | 1935分 | 読解と実行の両方 |
| 読解のみ | 記事01〜15→各回5問で4問以上 | 695分 | 概念理解。実行技能は認定しない |
| 実習のみ | 準備ラボ→Lesson 01〜15→Capstone | 1240分 | lab submissionとrequired checkで確認する実行技能 |
完全コースと実習のみの経路では、60分の準備ラボとAA-SETUP-C1〜AA-SETUP-C3を省略できません。完全コースでは各記事を上から読み、記事内の予測、lab lifecycle、required checkを一度だけ実行します。記事を読み終えた後に読解5問で4問以上を確認し、最後にCapstoneを完了します。Lesson guideは同じ実習の詳細版であり、完全コースで記事とguideを二重実行しません。発展課題765分はどの標準時間にも含めません。
完全コース1935分は、準備60分、記事455分、読解5問240分、実習700分、実習採点240分、Capstone 240分の合計です。実習のみ1240分は、準備とCapstoneを含みます。各活動を一度だけ数えた人間pilot前の設計見積もりであり、pilot後に補正します。授業配布前に完全commit SHAまたはrelease tagへ固定し、course-lock.jsonのsourceRevisionが未設定のまま配布しません。
読解評価の一覧から第01回の記事を読み、各回5問へ回答します。4問以上でその回は合格です。不正解は指定された記事見出しへ戻ります。この経路は概念理解の形成的評価であり、実習checkや実行技能の修了を認定しません。
学校・社内研修では公開済みの解答だけを修了試験にせず、講師が解答を開く時刻を決め、説明と実習checkを併用します。
共通で必要なものはGit、Node.js 24.x、約1 GiB以上の空き容量です。Lesson 01〜05、10〜12、15にDockerは不要です。Lesson 06〜09はDocker DesktopまたはDocker EngineとCompose v2、初回image build用のnetwork、Docker用に少なくとも8 GiBの空き容量を用意してください。Lesson 09はscripted HTTP User Agentをcontainer内で動かすためGUI browserは不要です。Lesson 10、11、15は手動flowを追う場合だけbrowserを使います。Lesson 13、14はPlaywright用Chromiumが必要です。
対応候補は次の環境です。
- macOS arm64 / x64
- Linux arm64 / x64
- WSL2 x64のLinux filesystem
Windows nativeは安全なprocess所有確認が未完成なので使いません。support matrixには検出対象として記録しますが、各lessonのprofileIdsからは除外し、runnerもfail closedで拒否します。WSL2では/mnt/c/...ではなく、~/...のようなLinux側のhome directoryへcloneします。
Lessonごとの検証済みprofileはcurriculum/support-matrix.jsonを確認してください。共通doctorがpassしても、個別Lessonや未記載profileの対応を意味しません。
まずversionを確認します。
git --versionGitのversionが表示されたことを確認してから、Node.jsを確認します。見つからない場合は次へ進まず、下記の公式手順で導入します。
node --versionv24.で始まることを確認してから、同梱されたnpmを確認します。23以前または25以降では教材を実行しません。
npm --version期待する結果は、3コマンドがすべてversionを表示し、node --versionがv24.から始まることです。
- Gitが見つからない場合は、OSに対応するGit公式手順(macOS、Linux、Windows)で導入し、terminalを開き直して
git --versionを再実行します。Windows nativeは教材対象外ですが、WSL2でcloneするためにWindows側Gitを使う必要はありません。 - Node.jsがない、またはmajor versionが違う場合は、Node.js公式ダウンロードページでv24.x LTSを導入し、terminalを開き直して
node --versionとnpm --versionを再実行します。npmはこのNode.js配布物に含まれるものを使い、別途導入しません。
Lesson 06〜09を行うmacOS利用者は、CPUに合うDocker Desktop for Mac公式手順で導入し、Docker Desktopを起動してから次を1つずつ確認します。
docker --versiondocker compose versiondocker info3コマンドが成功するまでDocker回へ進みません。LinuxはDocker Engine公式のOS別手順、WSL2はDocker Desktop WSL 2公式手順を入口にしますが、現時点のprofileはすべてcandidateで人間pilot未完了です。授業では講師が対象profileを事前検証し、受講者へ導入済み環境を渡します。
git clone https://github.com/cloudnative-co/auth-authz-sample-app.gitcloneが終了code 0で完了したことを確認してから、取得したrepositoryへ移動します。失敗した場合は、同名directoryの有無、network、Gitのerrorを解消してから再実行します。
cd auth-authz-sample-apppackage-lock.jsonとcourse.mjsが見えるrepository rootへ移動できたことを確認してから、依存関係を入れます。
npm cinpm ciはchecked-inのpackage-lock.jsonどおりに依存関係を入れます。npm installへ置き換えません。失敗した場合は、最初のerrorまで戻り、Node.js version、network、書込権限、空き容量を確認します。
node course.mjs doctor該当する成功結果(終了code 0、[PASS]、safe-noop)を確認してから次へ進みます。失敗時はerrorを解消し、同じcommandを再実行します。
node course.mjs setup該当する成功結果(終了code 0、[PASS]、safe-noop)を確認してから次へ進みます。失敗時はerrorを解消し、同じcommandを再実行します。
node course.mjs diagnose各コマンドの先頭行が[PASS]なら次へ進めます。[BLOCKED]または[FAIL]なら、表示されたreasonCodeとrecoveryを読み、原因を直して同じコマンドを再実行します。
教材はrepository直下の.lab/だけを学習stateとして使います。.lab/を手作業で作成・削除したり、自分のメモを置いたりしません。
完全コースまたは実習のみの経路では、ここで必ず準備ラボの受講者ガイドの「2. stateの変化を予測する」から進みます。repository取得とnpm ciはこのREADMEで完了しているため、準備ラボ内でcloneし直しません。AA-SETUP-C1〜AA-SETUP-C3、安全なpurge、Lesson開始用の再setupまで完了します。これは任意の診断ではありません。読解のみの経路では実行しません。
完全コースでは記事を主教材として各lessonを同じ順序で進めます。実習のみの経路では記事を開かず、Lesson guideを主教材にします。
- 対応する連載記事を上から読む
- 記事の実習節で、正常系と拒否系のstatus、検証者、state変化を予測する
- 記事の指示どおり
doctor、setup、demo、observeを1回だけ進める submission.jsonのTODOを許可値へ置き換え、checkへ合格する- 合格後だけ
stopし、記事を最後まで読む - 読解5問へ回答し、4問以上正解してから次の回へ進む
以下はLesson別ガイドの索引です。完全コースでは記事内の同じ実習を一度だけ行い、実習のみではリンク先のガイドを上から進めます。このREADMEには二重管理になるcommand列を置きません。
標準実習はsetup、全15回、Capstoneを含む1240分です。Lesson 02〜15には、標準check合格後だけ進む任意のextension.yamlがあります。発展課題は計765分で標準時間と修了条件には含めません。各受講者ガイドの「任意の発展課題」から進み、実環境のsecret、hostname、個人情報は提出しません。
10事例を5つの責任境界へ分類します。Lesson 01受講者ガイド
保存形式、salt差、generic 422、rate limitを確認します。Lesson 02受講者ガイド
Cookie、Session ID、server-side record、rotation、失効を分けます。Lesson 03受講者ガイド
403、秘匿404、204とatomic auditを区別します。Lesson 04受講者ガイド
401 challenge、Authorization header、毎requestの再認証を追います。Lesson 05受講者ガイド
実OpenLDAPでbind、search、user bind、group searchを分けます。Lesson 06受講者ガイド
実MIT KerberosでTGT、service ticket、GSSAPI拒否位置を追います。Lesson 07受講者ガイド
Samba AD互換DCでverified LDAPS、opaque ID、JMLを確認します。Lesson 08受講者ガイド
実KeycloakでAuthnRequestからstrict ACS、app sessionまで追います。Lesson 09受講者ガイド
Authorization Code + PKCE、opaque token、introspectionを追います。Lesson 10受講者ガイド
Discovery、JWKS、ID Token検証後だけのapp sessionを確認します。Lesson 11受講者ガイド
TOTP登録、pre-auth、replay、rate limit、recoveryを追います。Lesson 12受講者ガイド
実browser APIと仮想認証器でWebAuthnのRP検証を追います。Lesson 13受講者ガイド
discoverable login、RP失効、第二credential、BE / BSを確認します。Lesson 14受講者ガイド
必須前提04、10、11の後、JWT Access Tokenと3段階のAPI gateを追います。Lesson 15受講者ガイド
架空組織をdeveloperまたはiam-operationsのtrackで立て直します。自動7 checkに加えて講師rubricも使います。Capstone受講者ガイド
checkのchecks欄でfailしたIDを確認し、observeと受講者ガイドの該当箇所へ戻ります。回答ファイルでは、field名、階層、lesson IDを変えず、TODOだけをexercise.jsonまたはガイドに記載された許可値へ置き換えます。全required checkがpassになるまでは教材processを保持し、observe→回答修正→checkを繰り返します。stopは全required checkのpassを確認した後だけ実行します。
自習では、予測、observe、自分での再回答を終えても根拠を説明できない場合に限り、course/lessons/<id>/answer-key.mdで正答と根拠を確認します。講師付き研修では、講師が指定した時刻までanswer keyを開きません。
JSONが壊れた場合は、まずカンマ、二重引用符、TODO、未知の値を確認します。回答を破棄してよい場合だけresetします。
node course.mjs lesson 02 reset上の02は対象lesson IDへ置き換えます。resetはそのlessonの回答を初期状態へ戻し、processを新しい実行世代で起動し直します。
原因が分からない場合は、手作業でstateやprocessを消さずに診断します。
node course.mjs lesson 02 diagnoselesson診断に表示されたreasonCodeとrecoveryを先に確認します。lesson外のcourse stateも調べる必要がある場合だけ、次のcourse全体診断を追加で実行します。どちらもstateやprocessを変更しません。
node course.mjs diagnose| Command | 何をするか | 回答・evidence |
|---|---|---|
node course.mjs lesson <id> stop |
所有確認できた教材processだけ止める | 残す |
node course.mjs lesson <id> reset |
対象lessonを初期状態へ戻す | 対象回答は破棄、既存evidenceは保持 |
node course.mjs reset |
course全体の実行世代を進める | evidenceは保持 |
node course.mjs purge --yes --json |
教材が所有する全stateを削除する | 削除する |
purgeは取り消せません。実行前に回答とevidenceを削除してよいか確認します。
node course.mjs purge --yes --json成功時はJSONのdiagnostics[]内で、id: "resources.remaining"である要素のactualが文字列"0"です。未知のfile、symlink、所有者を確認できないprocessがある場合は、安全のため削除を拒否します。
- 実在する組織、個人、ほかのserviceで使うpassword、Cookie、tokenを入力しない
- project-appは
127.0.0.1:3000だけで待ち受ける - Lesson 06のOpenLDAPは
127.0.0.1:1389だけへpublishし、平文LDAPをproduction承認しない - Lesson 07〜09の認証基盤は教材所有の隔離Docker network内だけで動かし、host portを公開しない
- Lesson 10、11、15の三originは
127.0.0.1:4100〜:4102だけで待ち受け、loopback HTTPをproduction承認しない - Lesson 12のTOTP secret、code、recovery code、transaction / session tokenをevidenceや質問文へ貼り付けない
- Lesson 13、14の仮想認証器を、実hardware、OS統合、cloud同期、実user gestureの検証結果として扱わない
- 未知のport利用processや、所有確認できないprocessを教材から停止しない
- raw password、Cookie、Session ID、control handle、完全なdigestをruntime、journal、evidence、logへ保存しない
checkは保存済みruntimeを信用せず、毎回fresh scenarioで再実行する- このrepositoryの実装、固定credential、parameterを本番へ転用しない
Lesson 01のSAML、OpenID Connect、OAuthは分類用provided caseです。Lesson 02以降の実HTTPや実LDAPも、それぞれの受講者ガイドに書かれた未検証境界を超えて「安全性を証明した」と解釈しません。
機械処理では--jsonを付けます。現行runnerは入力待ちしませんが、--non-interactiveでその前提を明示できます。
| Exit code | 意味 |
|---|---|
| 0 | 成功、または安全な変更なし |
| 2 | commandの使い方が不正 |
| 10 | check不合格 |
| 20 | 前提不足・未対応環境 |
| 21 | lock競合 |
| 30 | state、process、基盤の異常 |
| 31 | timeout |
schema、course contract、support matrixの正はcurriculum/、固定hashのindexはcourse-lock.jsonです。