การเปิดใช้การตรวจสอบสิทธิ์แบบเข้มงวดด้วย WebAuthn

ปัญหา

ฟิชชิงเป็นปัญหาด้านความปลอดภัยอันดับต้นๆ บนเว็บ กล่าวคือ 81% ของการละเมิดบัญชีที่เกี่ยวข้องกับการแฮ็กในปีที่แล้วมีการใช้รหัสผ่านที่ไม่รัดกุมหรือถูกขโมย การตอบสนองของอุตสาหกรรมต่อปัญหานี้คือการตรวจสอบสิทธิ์แบบหลายปัจจัย แต่การติดตั้งใช้งานจะกระจัดกระจายและส่วนใหญ่ยังไม่สามารถจัดการกับฟิชชิงได้อย่างเพียงพอ เราร่วมงานกับ FIDO Alliance มาตั้งแต่ปี 2013 และเมื่อเร็วๆ นี้ โดย W3C ได้นำโปรโตคอลป้องกันการฟิชชิงที่ได้มาตรฐานมาปรับใช้กับเว็บแอปพลิเคชันต่างๆ

WebAuthn คืออะไร

Web Authentication API มอบสิทธิ์เข้าถึง Authenticator ที่ใช้สื่อกลาง User Agent สำหรับแอปพลิเคชันเว็บซึ่งมักเป็นโทเค็นฮาร์ดแวร์ที่เข้าถึงได้ผ่าน USB/BLE/NFC หรือโมดูลที่สร้างในแพลตฟอร์มโดยตรง เพื่อจุดประสงค์ในการสร้างและท้าทายข้อมูลเข้าสู่ระบบคีย์สาธารณะที่กำหนดขอบเขตระดับแอปพลิเคชัน (eTLD+k) ทำให้มีกรณีการใช้งานที่หลากหลาย เช่น

  • 2FA มีการรบกวนต่ำและป้องกันฟิชชิง (ใช้ร่วมกับรหัสผ่าน)
  • การให้สิทธิ์ซ้ำโดยใช้ข้อมูลไบโอเมตริกแบบไม่ใช้รหัสผ่าน
  • 2FA ต่างๆ มีความติดขัดต่ำและป้องกันฟิชชิงโดยที่ไม่ต้องใช้รหัสผ่าน (ใช้กับบัญชีที่ไม่ต้องใช้รหัสผ่าน)

เบราว์เซอร์หลักๆ ส่วนใหญ่จะใช้ API นี้ โดยมีจุดมุ่งหมายเพื่อลดความซับซ้อนของ UI ที่พบเมื่อต้องพิสูจน์ตัวตนทางออนไลน์และลดฟิชชิงลงได้อย่างมาก

WebAuthn ขยาย API การจัดการข้อมูลเข้าสู่ระบบและเพิ่มประเภทข้อมูลเข้าสู่ระบบใหม่ชื่อ PublicKeyCredential WebAuthn จะตัดการสื่อสารระหว่างเบราว์เซอร์กับ Authenticator และช่วยให้ผู้ใช้ทำสิ่งต่อไปนี้

  1. สร้างและลงทะเบียนข้อมูลเข้าสู่ระบบคีย์สาธารณะสำหรับเว็บไซต์
  2. ตรวจสอบสิทธิ์ของเว็บไซต์ด้วยการพิสูจน์การครอบครองคีย์ส่วนตัวที่เกี่ยวข้อง

Authenticator เป็นอุปกรณ์ที่สร้างคู่คีย์ส่วนตัว/สาธารณะและรวบรวมความยินยอมได้ คุณให้ความยินยอมในการลงนามได้ด้วยการแตะเพียงครั้งเดียว การอ่านลายนิ้วมือที่สำเร็จ หรือด้วยวิธีการอื่นๆ ตราบเท่าที่เป็นไปตามข้อกำหนดของ FIDO2 (มีโปรแกรมการรับรองสำหรับผู้ตรวจสอบสิทธิ์จาก FIDO Alliance) Authenticator สร้างไว้ในแพลตฟอร์ม (เช่น ตัวสแกนลายนิ้วมือบนสมาร์ทโฟน) หรือเชื่อมต่อผ่าน USB, บลูทูธพลังงานต่ำ (BLE) หรือ Near Field Communication (NFC) ได้

วิธีการทำงาน

การสร้างคู่คีย์และการลงทะเบียนผู้ใช้

เมื่อผู้ใช้ต้องการลงทะเบียนข้อมูลเข้าสู่ระบบในเว็บไซต์ (ซึ่ง WebAuthn เรียกกันว่า "ฝ่ายที่เกี่ยวข้อง") ให้ทำดังนี้

  1. ฝ่ายที่เชื่อมั่นว่าจะต้องเผชิญกับความท้าทาย
  2. ผู้ให้บริการที่ต้องพึ่งพาเบราว์เซอร์จะต้องสร้างข้อมูลเข้าสู่ระบบใหม่สำหรับฝ่ายที่ต้องพึ่งพาเบราว์เซอร์ผ่านทาง API การจัดการข้อมูลเข้าสู่ระบบ เช่น ระบุความสามารถของอุปกรณ์ เช่น อุปกรณ์มีการตรวจสอบสิทธิ์ผู้ใช้ของตนเองหรือไม่ (ด้วยข้อมูลไบโอเมตริก ฯลฯ)
  3. หลังจากที่ Authenticator ได้รับความยินยอมจากผู้ใช้แล้ว Authenticator จะสร้างคู่คีย์และส่งกลับคีย์สาธารณะและเอกสารรับรองที่ลงนามแล้ว (ไม่บังคับ) ไปยังเว็บไซต์
  4. เว็บแอปจะส่งต่อคีย์สาธารณะไปยังเซิร์ฟเวอร์
  5. เซิร์ฟเวอร์จะจัดเก็บคีย์สาธารณะซึ่งเชื่อมโยงกับข้อมูลประจำตัวของผู้ใช้ เพื่อจดจำข้อมูลเข้าสู่ระบบสำหรับการตรวจสอบสิทธิ์ในอนาคต
let credential = await navigator.credentials.create({ publicKey: {
  challenge: new Uint8Array([117, 61, 252, 231, 191, 241, ...]),
  rp: { id: "acme.com", name: "ACME Corporation" },
  user: {
    id: new Uint8Array([79, 252, 83, 72, 214, 7, 89, 26]),
    name: "jamiedoe",
    displayName: "Jamie Doe"
  },
  pubKeyCredParams: [ {type: "public-key", alg: -7} ]
}});

การตรวจสอบสิทธิ์ผู้ใช้

เมื่อเว็บไซต์ต้องการหลักฐานว่ากำลังโต้ตอบกับผู้ใช้ที่ถูกต้อง จะเป็นดังนี้

  1. ฝ่ายที่ไว้ใจจะตั้งคำถามและจัดเตรียมรายการข้อมูลเข้าสู่ระบบที่ลงทะเบียนไว้กับผู้ใช้ให้กับเบราว์เซอร์ เครื่องมือนี้ยังบอกตำแหน่งที่จะหาเอกสารรับรองได้ด้วย เช่น ใน Authenticator ในเครื่อง หรือในอุปกรณ์ภายนอกผ่าน USB, BLE เป็นต้น
  2. เบราว์เซอร์ขอให้ Authenticator ลงนามในคำท้า
  3. หาก Authenticator มีข้อมูลเข้าสู่ระบบที่ระบุมาให้ Authenticator จะแสดงการยืนยันที่ลงนามไปยังเว็บแอปหลังจากได้รับความยินยอมจากผู้ใช้
  4. โดยเว็บแอปจะส่งต่อการยืนยันที่ลงนามไปยังเซิร์ฟเวอร์ให้บุคคลที่ไว้วางใจเพื่อยืนยัน
  5. เมื่อยืนยันโดยเซิร์ฟเวอร์แล้ว ขั้นตอนการตรวจสอบสิทธิ์จะถือว่าสำเร็จ
let credential = await navigator.credentials.get({ publicKey: {
  challenge: new Uint8Array([139, 66, 181, 87, 7, 203, ...]),
  rpId: "acme.com",
  allowCredentials: [{
    type: "public-key",
    id: new Uint8Array([64, 66, 25, 78, 168, 226, 174, ...])
  }],
  userVerification: "required",
}});

ลองใช้ WebAuthn ด้วยตนเองที่ https://webauthndemo.appspot.com/

สิ่งที่จะเกิดขึ้นต่อไป

Chrome 67 รุ่นเบต้ามาพร้อมกับการรองรับ navigator.credentials.get({publicKey: ...}) และ navigator.credentials.create({publicKey:... }) รวมถึงช่วยให้ใช้ Authenticator ของ U2F/CTAP 1 ผ่านการส่งผ่าน USB บนเดสก์ท็อปได้

รุ่นที่กำลังจะเปิดตัวจะเพิ่มการรองรับการขนส่งเพิ่มเติม เช่น BLE และ NFC รวมถึงโปรโตคอลสาย CTAP 2 ที่ใหม่กว่า นอกจากนี้ เรายังพยายามดำเนินการขั้นตอนขั้นสูงขึ้นที่เปิดใช้โดย CTAP 2 และ WebAuthn เช่น การตรวจสอบสิทธิ์ที่ป้องกันด้วย PIN, การเลือกบัญชีในท้องถิ่น (แทนการพิมพ์ชื่อผู้ใช้หรือรหัสผ่าน) และการลงทะเบียนลายนิ้วมือ

โปรดทราบว่า Microsoft Edge รองรับ API นี้ด้วย และ Firefox รองรับ WebAuthn ใน Firefox 60 ด้วย

แหล่งข้อมูล

เรากำลังดำเนินการเกี่ยวกับเอกสารที่มีรายละเอียดเพิ่มเติมดังต่อไปนี้

เซสชัน "มีอะไรใหม่ในการลงชื่อสมัครใช้และลงชื่อเข้าใช้บนเว็บ" ที่ WebAuthn ใน Google I/O 2018 ครอบคลุม