ADR-006: การใช้การรับรองความถูกต้องด้วยสองปัจจัย
เสนอ
XOOPS ต้องการการรักษาความปลอดภัยที่ได้รับการปรับปรุงสำหรับการตรวจสอบสิทธิ์ผู้ใช้ การตรวจสอบสิทธิ์แบบสองปัจจัย (2FA) มอบการรักษาความปลอดภัยอีกชั้นหนึ่งนอกเหนือจากรหัสผ่าน ปกป้องบัญชีแม้ว่ารหัสผ่านจะถูกบุกรุกก็ตาม
ข้อควรพิจารณาที่สำคัญ:
- ความเข้ากันได้แบบย้อนหลังกับการรับรองความถูกต้องที่มีอยู่
- รองรับวิธีการ 2FA หลายวิธี
- ประสบการณ์ผู้ใช้ระหว่างการตั้งค่าและเข้าสู่ระบบ
- กลไกการกู้คืนอุปกรณ์ที่สูญหาย
- บูรณาการกับระบบการอนุญาตที่มีอยู่
การตัดสินใจ
หัวข้อที่มีชื่อว่า “การตัดสินใจ”เราจะใช้ TOTP (รหัสผ่านแบบใช้ครั้งเดียวตามเวลา) เป็นวิธีการ 2FA หลักพร้อมรองรับรหัสสำรอง
แนวทางการนำไปปฏิบัติ
หัวข้อที่มีชื่อว่า “แนวทางการนำไปปฏิบัติ”mermaidsequenceDiagram participant U as User participant X as XOOPS participant T as TOTP Library participant D as Database
U->>X: Login with password X->>D: Validate password D-->>X: Password valid X->>D: Check 2FA enabled D-->>X: 2FA required X->>U: Request 2FA code U->>X: Submit TOTP code X->>T: Validate code T-->>X: Code valid X->>U: Login successfulสคีมาฐานข้อมูล
หัวข้อที่มีชื่อว่า “สคีมาฐานข้อมูล”CREATE TABLE `{PREFIX}_users_2fa` ( `user_id` INT(11) NOT NULL, `secret` VARCHAR(32) NOT NULL, `enabled` TINYINT(1) DEFAULT 0, `backup_codes` TEXT, `last_used` INT(11), `created` INT(11) NOT NULL, PRIMARY KEY (`user_id`), FOREIGN KEY (`user_id`) REFERENCES `{PREFIX}_users`(`uid`));อินเทอร์เฟซบริการ
หัวข้อที่มีชื่อว่า “อินเทอร์เฟซบริการ”interface TwoFactorAuthInterface{ public function enable(int $userId): TwoFactorSetup; public function disable(int $userId): void; public function verify(int $userId, string $code): bool; public function generateBackupCodes(int $userId): array; public function isEnabled(int $userId): bool;}บูรณาการมิดเดิลแวร์
หัวข้อที่มีชื่อว่า “บูรณาการมิดเดิลแวร์”class TwoFactorMiddleware implements MiddlewareInterface{ public function process( ServerRequestInterface $request, RequestHandlerInterface $handler ): ResponseInterface { $session = $request->getAttribute('session');
if ($session->has('pending_2fa_user_id')) { // User needs to complete 2FA if ($this->isVerificationRequest($request)) { return $handler->handle($request); } return new RedirectResponse('/2fa/verify'); }
return $handler->handle($request); }}ผลที่ตามมา
หัวข้อที่มีชื่อว่า “ผลที่ตามมา”- ปรับปรุงความปลอดภัยของบัญชีอย่างมีนัยสำคัญ
- ความเข้ากันได้ตามมาตรฐานอุตสาหกรรม TOTP (Google Authenticator, Authy ฯลฯ)
- รหัสสำรองป้องกันการล็อคบัญชี
- ตัวเลือกต่อผู้ใช้ - ไม่บังคับให้นำไปใช้
- PSR-15 มิดเดิลแวร์ช่วยให้สามารถบูรณาการได้อย่างสมบูรณ์
- ขั้นตอนการเข้าสู่ระบบเพิ่มเติมส่งผลต่อประสบการณ์ผู้ใช้
- ผู้ใช้จะต้องจัดการแอปตรวจสอบความถูกต้อง
- อุปกรณ์ที่สูญหายต้องมีกระบวนการกู้คืน
- พื้นที่จัดเก็บฐานข้อมูลและการสืบค้นเพิ่มเติม
- ต้องการการพึ่งพาไลบรารีการเข้ารหัส
เส้นทางการอพยพ
หัวข้อที่มีชื่อว่า “เส้นทางการอพยพ”- เพิ่มตารางฐานข้อมูลสำหรับข้อมูล 2FA
- ใช้บริการ TOTP ที่มีการพึ่งพาห้องสมุด
- เพิ่มมิดเดิลแวร์ให้กับห่วงโซ่การตรวจสอบความถูกต้อง
- สร้างการตั้งค่าและการยืนยัน UI
- ตัวเลือกผู้ดูแลระบบเพื่อกำหนด 2FA สำหรับกลุ่มเฉพาะ
พิจารณาทางเลือกอื่นแล้ว
หัวข้อที่มีชื่อว่า “พิจารณาทางเลือกอื่นแล้ว”SMS ตาม OTP
หัวข้อที่มีชื่อว่า “SMS ตาม OTP”ถูกปฏิเสธเนื่องจาก:
- SIM การแลกเปลี่ยนช่องโหว่
- ค่าใช้จ่ายของเกตเวย์ SMS
- ความซับซ้อนในการยืนยันหมายเลขโทรศัพท์
- ข้อกังวลเรื่องความเป็นส่วนตัว
คีย์ความปลอดภัยของฮาร์ดแวร์ (WebAuthn)
หัวข้อที่มีชื่อว่า “คีย์ความปลอดภัยของฮาร์ดแวร์ (WebAuthn)”เลื่อนออกไปสำหรับอนาคต ADR:
- การใช้งานที่ซับซ้อนมากขึ้น
- การสนับสนุนเบราว์เซอร์ที่จำกัดในอดีต
- ต้นทุนผู้ใช้ที่สูงขึ้น
- สามารถเพิ่มควบคู่ไปกับ TOTP ได้ในภายหลัง
ทางอีเมล OTP
หัวข้อที่มีชื่อว่า “ทางอีเมล OTP”ถูกปฏิเสธเนื่องจาก:
- การประนีประนอมบัญชีอีเมลเอาชนะวัตถุประสงค์
- ความล่าช้าในการจัดส่งส่งผลกระทบต่อ UX
- ปัญหาตัวกรองสแปม
อ้างอิง
หัวข้อที่มีชื่อว่า “อ้างอิง”- RFC 6238 - TOTP
- รูปแบบคีย์ Google Authenticator
- ../../02-Core-Concepts/Security/Security-Best-Practices - แนวทางปฏิบัติด้านความปลอดภัย
- ../../02-Core-Concepts/Users-Permissions/Authentication - เอกสารระบบการตรวจสอบสิทธิ์