ข้ามไปยังเนื้อหา

ADR-006: การใช้การรับรองความถูกต้องด้วยสองปัจจัย

เสนอ

XOOPS ต้องการการรักษาความปลอดภัยที่ได้รับการปรับปรุงสำหรับการตรวจสอบสิทธิ์ผู้ใช้ การตรวจสอบสิทธิ์แบบสองปัจจัย (2FA) มอบการรักษาความปลอดภัยอีกชั้นหนึ่งนอกเหนือจากรหัสผ่าน ปกป้องบัญชีแม้ว่ารหัสผ่านจะถูกบุกรุกก็ตาม

ข้อควรพิจารณาที่สำคัญ:

  • ความเข้ากันได้แบบย้อนหลังกับการรับรองความถูกต้องที่มีอยู่
  • รองรับวิธีการ 2FA หลายวิธี
  • ประสบการณ์ผู้ใช้ระหว่างการตั้งค่าและเข้าสู่ระบบ
  • กลไกการกู้คืนอุปกรณ์ที่สูญหาย
  • บูรณาการกับระบบการอนุญาตที่มีอยู่

เราจะใช้ TOTP (รหัสผ่านแบบใช้ครั้งเดียวตามเวลา) เป็นวิธีการ 2FA หลักพร้อมรองรับรหัสสำรอง

mermaid
sequenceDiagram
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 มิดเดิลแวร์ช่วยให้สามารถบูรณาการได้อย่างสมบูรณ์
  • ขั้นตอนการเข้าสู่ระบบเพิ่มเติมส่งผลต่อประสบการณ์ผู้ใช้
  • ผู้ใช้จะต้องจัดการแอปตรวจสอบความถูกต้อง
  • อุปกรณ์ที่สูญหายต้องมีกระบวนการกู้คืน
  • พื้นที่จัดเก็บฐานข้อมูลและการสืบค้นเพิ่มเติม
  • ต้องการการพึ่งพาไลบรารีการเข้ารหัส
  1. เพิ่มตารางฐานข้อมูลสำหรับข้อมูล 2FA
  2. ใช้บริการ TOTP ที่มีการพึ่งพาห้องสมุด
  3. เพิ่มมิดเดิลแวร์ให้กับห่วงโซ่การตรวจสอบความถูกต้อง
  4. สร้างการตั้งค่าและการยืนยัน UI
  5. ตัวเลือกผู้ดูแลระบบเพื่อกำหนด 2FA สำหรับกลุ่มเฉพาะ

ถูกปฏิเสธเนื่องจาก:

  • SIM การแลกเปลี่ยนช่องโหว่
  • ค่าใช้จ่ายของเกตเวย์ SMS
  • ความซับซ้อนในการยืนยันหมายเลขโทรศัพท์
  • ข้อกังวลเรื่องความเป็นส่วนตัว

เลื่อนออกไปสำหรับอนาคต ADR:

  • การใช้งานที่ซับซ้อนมากขึ้น
  • การสนับสนุนเบราว์เซอร์ที่จำกัดในอดีต
  • ต้นทุนผู้ใช้ที่สูงขึ้น
  • สามารถเพิ่มควบคู่ไปกับ TOTP ได้ในภายหลัง

ถูกปฏิเสธเนื่องจาก:

  • การประนีประนอมบัญชีอีเมลเอาชนะวัตถุประสงค์
  • ความล่าช้าในการจัดส่งส่งผลกระทบต่อ UX
  • ปัญหาตัวกรองสแปม
  • RFC 6238 - TOTP
  • รูปแบบคีย์ Google Authenticator
  • ../../02-Core-Concepts/Security/Security-Best-Practices - แนวทางปฏิบัติด้านความปลอดภัย
  • ../../02-Core-Concepts/Users-Permissions/Authentication - เอกสารระบบการตรวจสอบสิทธิ์