Gần đây tôi được tặng một thiết bị Yubikey 5 từ một người bạn, sau một thời gian tìm tòi, nghiên cứu các kiểu, nay tôi quyết định làm một bài viết giới thiệu thiết bị USB này cho các bạn muốn tìm hiểu về sản phẩm xác thực nổi tiếng từ thương hiệu Yubico. Thông qua giới thiệu thiết bị này, tôi sẽ đề cập một số phương pháp xác thực và mã hóa được áp dụng trong các chuẩn xác thực bảo mật ngày nay.

Giới thiệu công ty Yubico

Yubico được thành lập từ năm 2007 với mong muốn tạo ra phương pháp xác thực dễ dàng cho mọi người. Năm 2011, nhóm phát riển đã chuyển đến thung lũng Silicon để nghiên cứu và cho ra những sản phẩm Yubikey giúp cho hàng tỉ người dùng internet được bảo vệ an toàn hơn. Đến thời điểm hiện tại, Yubico đã có chi nhánh trên 25 nước trên thế giới và đằng sau là các quỹ đầu tư cũng như các chuyên gia tư vấn kỹ thuật, giáo sư chuyên mật mã học đến từ nhiều viện nghiên cứu, tập đoàn lớn như Đại học Standford, Oxford, UC Berkeley, Salesforce.com… Để được sự phát triển rộng khắp và thành nhà cung cấp thiết bị phần cứng xác thực hàng đầu thế giới, Yubico đã tích hợp liên tục các sản phẩm của mình với những dịch vụ mạng có nhiều người dùng nhất thế giới như Google, Facebook, Github, Bitbucket, Gitlab, … và một danh sách dài các ứng dụng tương thích Yubikey.

Các sản phẩm của Yubico được chế tạo tại Mỹ và Thụy Điển nhẳm đảm bảo có thể kiểm soát chặt chẽ các quy trình sản xuất các thiết bị mã hóa key. Sau hơn một thập kỷ phát triển, Yubico hiện đang là công ty đang có nhiều đóng góp cho các chuẩn xác thực mới được công nhận bởi W3C, IETF, FIDO AllianceOpenID. Có nhiều hơn các thông tin cũng như các sản phẩm được cung cấp tại trang web chính thức tại www.yubico.com, bạn có thể tìm thấy những thông tin hữu ích từ nhà cung cấp thiết bị phần cứng bảo mật hàng đầu này.

Sơ lược xác thực đa nhân tố

Xác thực đa nhân tố là phương pháp cho phép các dịch vụ máy tính và người dùng sử dụng nhiều phương pháp xác thực đề định danh cũng như bảo vệ tài khoản. Phương pháp xác thực phổ biến nhất hiện nay là sử dụng tài khoản và mật khẩu, tuy nhiên với sự tấn công liên tục từ tin tặc vào các nhà cung cấp dịch vụ mạng cũng như lừa đảo, đánh cắp thông tin,… thì phương pháp mật khẩu đã không còn an toàn nữa. Đây là lúc xác thực đa nhân tố được sử dụng nhằm bảo vệ người dùng cuối trong trường hợp mật khẩu bị lộ lọt ra bên ngoài.

Tính chất đa nhân tố trong an toàn thông tin được chia thành 3 nhóm chính:

  • Cái bạn có (something that you have): được biết đến như là thẻ từ, điện thoại di động, thiết bị bảo mật OTP.
  • Các yếu tố về sinh trắc học của người dùng (something that you are): dấu vân tay, giọng nói, móng mắt,… của người dùng.
  • Cái mà bạn biết (something that you know): là những thông tin mà chỉ có người dùng biết, ví dụ như mật khẩu, tài khoản cũng như các câu hỏi bảo mật.

Việc kết hợp các dạng xác thực của 3 nhóm trên sẽ giúp bạn tăng cường bảo mật cho tài khoản cũng như các dịch vụ trực tuyến ngày nay.

Thiết bị OTP và Yubikey

Tìm hiểu thiết bị Yubikey 5

Giá thành của một thiết bị Yubikey 5 cung cấp tại website https://www.yubico.com/products/yubikey-hardware/ là 45 USD, thiết bị được vận chuyển từ Thụy Điển về Việt Nam thông qua dịch vụ chuyển phát UPS nên giá thành sẽ đội lên khá cao (+75 USD phí vận chuyển), do vậy bạn nên mua chung nhiều thiết bị để tiết kiệm hơn.

Bìa bên ngoài của sản phẩm không chứa nhiều thông tin cũng không bao gồm tài liệu hướng dẫn, người dùng có thể truy cập trực tiếp liên kết https://www.yubico.com/start/ để thiết lập sản phẩm với các dịch vụ cần xác thực. Cần chú ý các dịch vụ sử dụng qua trình duyệt web hiện nay hỗ trợ tốt trên Google Chrome.

Bao bì sản phẩm khá đơn giản và không nhiều thông tin cho người dùng

Phiên bản Yubico 5 hỗ trợ kết nối qua cổng USB hoặc NFC. Khi kết nối Yubikey vào máy tính qua cổng USB, nó sẽ hoạt động như một thiết bị HID (Human Interface Device) , hoặc nôm na có thể hiểu như một thiết bị bàn phím cho phép gởi các ký tự đến máy tính. Các chuỗi ký tự này được sinh ra ngẫu nhiên theo thuật toán mã hóa mạnh hoặc chuỗi cố định do người dùng thiết lập. Các phương pháp tạo khóa mà Yubikey hỗ trợ bao gồm: Fido U2F, Fido2, Yubico OTP, OATH-HOTP, OATH-TOTP, Chanllenge-Response (HMAC-SHA1, Yubico OTP), PIV-Compatible Smart Card (Personal Identity and Verification Card), OpenPGP, và Static password.

Thông tin thiết bị Yubikey hiển thị khi sử dụng phần mềm USBDeview.

Thiết bị Yubikey kết nối qua cổng USB hoạt động theo giao thức HID Keyboard

Nút nhấn trên thiết bị Yubikey có 2 chế độ cấu hình là: Short press (chạm và nhả trong 0.3 đến 1.5 giây) và Long press  (chạm và nhả trong 2 đến 5 giây). Chế độ giữ nhanh (short press) được dùng chính thức cho các dịch vụ xác thực (người dùng có thể tùy biến lại) và chế độ giữ lâu được dùng cho mục đích nghiên cứu phát triển hoặc dùng cho thử nghiệm. Mỗi chế độ người dùng có thể tạo ra các khóa bảo vệ riêng biệt cho từng loại xác thực và có thể phân biệt thông qua 2 ký tự đầu là cc hoặc vv.

Hai chế độ nhấn trên thiết bị cho phép tạo ra các nhóm khóa bảo mật khác nhau

Kết nối thử nghiệm Google

Trong phần này, tôi tiến hành đăng ký thiết bị và đăng nhập thử nghiệm xác thực 2 bước trên dịch vụ Google, việc thiết lập khá đơn giản thông qua giao diện Google Account 2-Step Authentication.

Giao diện đăng ký thiết bị xác thực tại Google Account

Xác thực 2 nhân tố sử dụng mật khẩu khóa phần cứng tại Google

Phân tích thuật toán sử dụng trong Yubikey

Xác thực sử dụng phương thức OTP

One-Time Password là phương pháp được sử dụng rộng rãi ngày nay, phía người dùng sở hữu Yubikey sẽ tạo ra các mật khẩu có tính chất “gần ngẫu nhiên” khó đoán, và chỉ được sử dụng duy nhất một lần. Trong phần này tôi sẽ mô tả phương pháp tạo khóa mà Yubikey sử dụng, đồng thời có thể tùy biến các khoá này theo yêu cầu của người dùng.

Sơ đồ xác thực giữa người dùng, máy chủ ứng dụng và máy chủ Yubico được thực hiện theo lưu đồ sau:

Sơ đồ kết nối kiểm tra người dùng hợp lệ giữa máy chủ ứng dụng và máy chủ Yubi Cloud.

Khi người dùng đăng nhập vào ứng dụng web hỗ trợ Yubikey, trình duyệt sẽ gởi tài khoản, mật khẩu và chuỗi OTP được sinh ra từ thiết bị. Sau đó tại máy chủ ứng dụng kiểm tra tính hợp lệ tài khoản và mật khẩu, nếu các thông tin chính xác thì sẽ tiếp tục kiểm tra mã xác thực OTP giữa máy chủ ứng dụng và máy chủ xác thực (trong trường hợp này là máy chủ Yubi Cloud). Việc kiểm tra chuỗi OTP được tạo ra có hợp lệ hay không được mô tả tiếp tục trong sơ đồ sau:

Theo sơ đồ, ta có thể thấy phía thiết bị Yubikey và máy chủ Yubico sử dụng chung một khóa mã hóa dữ liệu sử dụng thuật toán AES-128, do vậy khi người dùng thay đổi khóa mã hóa tại thiết bị thì cần cập nhật lại khóa này đến máy chủ Yubico để có thể giải mã dữ liệu. Tóm lại, quá trình này sử dụng thuật toán mã hóa đối xứng mạnh (AES-128) kết hợp với dữ liệu tạo ra ngẫu nhiên để bảo đảm tính bí mật của dữ liệu.

Cấu trúc khóa OTP tạo ra bởi Yubico

Như phần giới thiệu trên, khi tôi nhấn vào thiết bị sẽ tạo ra mỗi chuỗi ký tự có độ dài cố định và có nhiều ký tự thay đổi không thể đoán trước. Chuỗi này bao gồm 22 bytes (44 ký tự/ chữ cái) bao gồm 12 ký tự đầu là dãy ký tự đặc trưng dùng cho định danh thiết bị phần cứng, hoặc có thể hiểu đây chính là Serial Number của thiết bị đã được chuyển đổi sử dụng thuật toán ModHex (Modified Hex) của Yubico.

Mã định danh thiết bị Yubikey được sử dụng cho việc quản lý phần cứng và khóa mã hóa tại máy chủ Yubico. Mã định danh sẽ được ánh xạ với khóa mã hóa Symetric AES-128 lưu trữ tại máy chủ.

Để sinh ra một khóa OTP ngẫu nhiên an toàn và chỉ sử dụng được một lần, chúng ta sẽ xem xét phương pháp sinh key như sau:

Cấu trúc tạo khóa Yubikey (dạng HEX/ cleartext) và độ dài thành phần dữ liệu.

Giải thích phương pháp tạo dữ liệu OTP (đây là dữ liệu dạng bảng rõ và được trình diễn dạng mã HEX):

  • uid (Private ID): có kích thước dữ liệu là 6 byte, đây là mã định danh duy nhất thiết bị phần cứng Yubikey, được giữ bí mật. Dựa trên độ dài của uid, ta có thể xác định được số thiết bị tối đa mà Yubico có thể tạo ra là khoảng 2(6*8) = 281,474,976,710,656 mã định danh thiết bị phần cứng. Dựa vào số lượng uid này thì Yubico có thể sử dụng dư thừa trong thời gian tiếp theo mà không cần phải suy nghĩ đến việc thay đổi độ dài khóa.
  • Session Counter: vị trí byte thứ 7 và 8, được sử dụng lưu trữ bộ đếm phiên mà người dùng đã sử dụng ở lần cuối cùng. Giá trị bộ đếm được thiết lập mặc định là zero và sẽ gia tăng lên sau mỗi lần cắm thiết bị vào sử dụng. Kích thước 2 byte cho phép người dùng có thể tạo ra 2(2*8) = 65,536 phiên làm việc, nếu tính trung bình mỗi ngày người dùng xác thực 3 lần thì phải mất 60 năm mới sử dụng hết bộ đếm phiên của một thiết bị Yubikey. Các giá trị phiên được lưu trữ trong bộ nhớ NVRAM và không bị mất khi tháo khỏi thiết bị máy tính.
  • Timestamp: vị trí byte thứ 9 đến 11, được dùng để tạo ra giá trị thời gian và được lưu trữ trong bộ nhớ tạm của mỗi phiên làm việc (dữ liệu sẽ mất khi không cấp nguồn). Khi thiết bị được kết nối đến máy tính, bộ thời gian sẽ từ zero và gia tăng liên tục. Bên trong thiết bị Yubikey sử dụng một xung đồng hồ 8Hz, giá trị timestamp sẽ tăng giá trị cực đại trong thời gian là 24 ngày cắm thiết bị liên tục. Để tái tạo lại giá trị timestamp, người dùng chỉ cần ngắt thiết bị Yubikey ra khỏi nguồn cấp điện và giá trị sẽ được khởi tạo lại. Giá trị này được định dạng theo little-endian.
  • Session Token Counter: vị trí byte thứ 12, được sử dụng cho mục đích tạo một giá trị bộ đếm tăng lên 1 sau mỗi lần tạo ra khóa, giá trị này sẽ chạy từ 0 đến 255 và xoay vòng khi đạt cực đại.
  • Pseudo Random Nunber: vị trí byte thứ 13 và 14, đây là giá trị được tạo ra hoàn toàn ngẫu nhiên bằng mạch tạo xung trong thiết bị. Giá trị này được thêm vào chuỗi plantext trước khi mã hóa nhằm đảm bảo tính ngẫu nhiên khó đoán cho OTP.
  • Checksum: vị trí byte thứ 15 và 16 là giá trị kiểm tra checksum các phần dữ liệu trước đó. Checksum sử dụng thuật toán CRC-16, nhiệm vụ của mã này là bảo đảm tính toàn vẹn của dữ liệu.

Giải thích phương pháp tạo khóa OTP (đây là dữ liệu dạng đã mã hóa):

Mỗi lần tạo khóa OTP, thiết bị Yubikey sẽ tạo 16 byte (32 ký tự) dữ liệu như trên dưới dạng bảng rõ (dạng Hex). Tuy nhiên, bạn có thể thấy một khóa OTP tạo ra có đến 22 byte (44 ký tự). Để có được chuỗi 12 ký tự còn lại, thiết bị thực hiện thêm 3 bước:

  1. Yubikey sử dụng khóa mã hóa AES-128 được lưu trữ trong phần cứng để mã hóa 16 byte dữ liệu dạng bảng rõ trước đó.
  2. Dữ liệu đã được mã hóa có kích thước 16 byte sẽ được bổ sung thêm 6 byte Public ID dạng bảng rõ (dạng HEX) vào đầu dãy ký tự đã mã hóa. Cần nhớ rằng, Public ID được thêm vào ở giai đoạn này hoàn toàn khác với UID dùng đã tạo ra thành phần OTP phía trên. Quy trình thực hiện như sau PublicID + AES-128(uid,session counter, timestampe, session token counter, random valued, checksum).
  3. Toàn bộ 22 byte ký tự dạng HEX trên sẽ được chuyển đổi sang dạng ModHex nhằm bảo đảm khả năng tương thích với các dạng bàn phím máy tính. Tại bước này, Yubikey đã hoàn thành tòa bộ quy trình tạo một khóa OTP có tính bí mật và chỉ sử dụng được một lần.
Sơ đồ sinh khóa OTP tại thiết bị Yubikey (nhấn vào ảnh để phóng to)

Để hiểu rõ hơn, bạn có thể xem hình mô tả từ công cụ Yubikey Personalization Tool (https://www.yubico.com/products/services-software/download/yubikey-personalization-tools/):

Công cụ Yubico Personalization Tool cho phép thiết lập các giá trị trên Yubikey
Cấu trúc một khóa OTP được sinh ra từ Yubikey

Để kiểm tra tính chính xác của khóa OTP, phía máy chủ YubiCloud sẽ thực hiện ngược lại quy trình trên như sau:

  1. Xác định thiết bị phần cứng Yubikey thông qua mã Public ID, mã này giúp máy chủ thực hiện lấy khóa giải mã AES-128 được lưu trữ. Đây là 6 byte (12 ký tự) đầu tiên trong chuỗi OTP.
  2. Giải mã khóa OTP (giải mã 16 byte dữ liệu cuối) sử dụng khóa AES-128 được lưu tại máy chủ.
  3. Kiểm tra CRC Checksum của toàn bộ dữ liệu đã giải mã.
  4. Kiểm tra tính chính xác Private ID/UID của OTP.
  5. So sánh các bộ đếm của OTP và giá trị cuối cùng được lưu trữ tại máy chủ.
    • Chấp nhận OTP nếu giá trị session counter của OTP lớn hơn so với giá trị được lưu tại máy chủ, hoặc
    • nếu giá trị session counter không tăng, thì tiếp tục kiểm tra giá trị session usage counter có được tăng lên so với trước đó hay không.

Quy trình trên được thực hiện lần lược và khóa OTP sẽ được xem là không hợp lệ nếu có 1 bước nào đó không thỏa mãn các kiểm tra trên. Việc kiểm tra các bộ đếm giúp xác định các OTP đã được sử dụng trước đó hay chưa, tránh các hành vi sử dụng lại khóa OTP hơn 1 lần.

Tùy biến các khóa OTP:

Để thực hiện thay đổi, tùy biến các khóa OTP trên thiết bị, người dùng có thể sử dụng công cụ Yubikey Personalization Tool (https://www.yubico.com/products/services-software/download/yubikey-personalization-tools/) trên hệ điều hành Windows. Như giới thiệu ở phần trên, Yubico hỗ trợ cho người dùng dùng 2 chế độ và được thể hiện trên công cụ là Short press (Slot 1 dùng cho sử dụng chính thức các dịch vụ bảo mật công cộng như Google, Facebook,…) và Long Press (Slot 2 dùng cho mục đích kiểm tra, thử nghiệm). Để an toàn, tôi tiến hành cấu hình tại Slot 2 như hình sau:

Khởi động phần mềm và chọn tab Yubico OTP > Chọn Quick.

Các bước để sinh ra khóa bí mật mới cho Slot 2

Bạn cần chắc chắn chọn Configuration Slot 2 đề thử nghiệm các khóa có hoạt động chính xác hay không; tiếp theo chọn Regenerate để tạo các chuỗi bí mật > Chọn Write Configuration để lưu lại toàn bộ quá trình thao tác, bước này khá quan trọng, để tránh đánh mất các khóa bảo mật. Cần nhớ rằng, các OTP được mã khóa theo thuật toán Symetric, sử dụng chung 1 khóa mã hóa dữ liệu, do vậy khi tạo khóa mới tại phần cứng người dùng bắt buộc phải cập nhật khóa này đến máy chủ xác thực để có thể giải mã dữ liệu OTP do thiết bị tạo ra. Chọn Upload to Yubico tại bước thiết theo, lúc này sẽ chuyển hướng người dùng đến trang web của Yubico để cập nhật các khóa mới. Tại giá trị OTP from the Yubikey cần chú ý là do ta đang cấu hình ở Slot 2, nên cần giữ nút tạo OTP từ 2 –  5 giây để tạo ra đúng OTP cần thiết.

Cập nhật khóa mới vào hệ thống xác thực của Yubico
Quá trình cập nhật khóa mới thành công, người dùng có thể kiểm tra hoạt động tại trang https://demo.yubico.com/
Trang kiểm tra hoạt động của một khóa OTP có hợp lệ hay không.
Quá trình kiểm tra OTP với khóa tạo mới thành công

Tạm kết phần 1, …