Yubico Ile Kişisel Uygulamalarınızda 2 Aşamalı Doğrulama Entegrasyonu

Geçtiğimiz günlerde blogum için kullandığım WordPress’ten vazgeçtiğimi, Laravel ile kişisel bir blog yazmaya başladığımı şu yazıda dile getirmiştim. Şimdi ise Yubico’dan ve geliştirdiğiniz projelere nasıl entegre edebileceğinizden bahsedeceğim.

Aslında Yubico’nun nasıl kullanılacağını adım adım detaylıca Türkçe anlatan bir medium.com serisi var. Arda Kılıçdağı tarafından kaleme alınmış olan seri, yubico’yu nelerle birlikte nasıl kullanabilirim ? sorusuna çok güzel cevap veriyor.

“Yubi…Ney?” Yubikey hakkında ilk deneyimlerim

Yubikey’i Smart Card olarak kullanmak ve GPG anahtarı ile SSH doğrulaması yapmak

Dediğim üzere, bu iki makale Yubico’yu nasıl kullanabileceğinizi anlatıyor. Benim bu yazıda değineceğim nokta ise Yubico anahtarlara web uygulamamızı nasıl entegre debiliriz ? kısmı olacak.

OTP ve Implementasyon Senaryoları ?

Yubico temelde One-Time-Password üreteci olarak kullanılır. Doğru kullanıcı adı ve parola ile gelen kişinin ayrıca tek seferliğine geçerli olacak özel bir anahtar üretmesi beklenir. Üretilen anahtar kontrol edilir. En başta giriş sağlayan kullanıcıya ait olması ve doğru olması en önemli iki aşamadır. Bu temel yaklaşımda Yubico’yu aşağıdaki senaryolarda kullanabiliriz

Kullanıcı adı, parola ve Yubico OTP’nin aynı form’da alınması

Önce kullanıcı adı ve parola, ardından OTP geçerliliği kontrol edilebilir. Benim düşünceme göre bu doğru bir yaklaşım olmayacaktır. Çünkü bu yaklaşım ile tüm kullanıcılara Yubico kullanma zorunluluğu sunmak gerekir. Her ne kadar 2 aşamalı doğrulama günümüzde en elzem özelliklerden biri olsada, insanlar belkide SMS doğrulamayı kullanmak isteyecektir.

Kullanıcı adı, parola sonrası Yubico OTP Kontrolü

Bu yaklaşım bahsettiğim nedenlerden ötürü daha doğru bir yaklaşımdır lakin başka bir problemi ortaya koyar. Hangi kullanıcı hangi Yubico cihazını kullanıyor ? Kontrol neye göre yapılacaktır ?

Bu problem Yubico cihazının sunduğu bir özellikle çözülebilir. Aşağıda sizler için 10 adet OTP değeri ürettim. Sonuçları yakından analiz edelim.

Fark ettiğiniz şey ilk 12 karakterin sürekli sabit olması değil mi ? Evet cccccceihkjf değeri, Yubico tarafından sabit olarak gelir. Bu sayede OTP üretimi sonucu oluşan string üzerinden giriş sağlamak isteyen kullanıcı arasında ilişki kurulabilir.

Şöyle ki;

Kullanıcı 2 aşamalı doğrulamayı aktifleştirmek istedi. SMS, Email vb gibi sunulan ikincil doğrulama opsiyonlarından Yubico’yu kullanmaya karar verdi. Sizde karşısına bir form çıkartıp, buyrun! yubico anahtarınız ile OTP string’i oluşturun dediniz. Gelen OTP değerini, YubiCloud (sonra değineceğiz) üzerinden kontrol ettiniz ve doğruluğundan emin oldunuz. OTP değerinin ilk 12 karakterini alıp, kullanıcı tablosunda yeni bir kolon üzerinde kayıt ettiniz

Aksi halde ?

Var sayalım ki bir kullanıcının oturum bilgileri saldırgan tarafından ele geçirildi. Sisteme oturum sağlanırken ikinci doğrulama ekranı çıktı. Saldırgan kendi Yubico cihazı ile OTP değeri üretti. Eğer gelen değerin ilk 12 karakteri ile sisteme giriş yapmaya çalışan kullanıcı için daha önce kayıt edilmiş 12 karakter karşılaştırılmaz ise, doğru ve geçerli olan herhangi bir OTP değeri iki aşamalı doğrulamayı atlatır olacaktır.

Akıllara şu soru gelir bu durumda.

Bana örnek olarak yukarıda Yubico tarafından üretilmiş 10 tane sample verdiniz. Yubico anahtarım olmasa bile pattern’i ve değer kümesini öğrendim… İlk 12 karakteri brute-force yaparak farklı bir kullanıcının Yubico identifier değerini tespit etsem ? Böylece başka kullanıcı hesaplarına erişim sağlayabilmiş olur muyum ?

Soruya doğrudan cevap vermeden önce Yubikey’in ürettiği 44 karakterlik OTP değerini biraz yakından analiz edelim.

yubico-otp-code

Yubikey ürettiği 44 karakterlik OTP değerini modhex ile convert eder. Böylece 44 karakterlik küme, 22 byte’ı ifade etmiş olur. 22 byte’a daha yakından bakıldığında, hangi byte’ların neleri ifade ettiği yukarıdaki grafikte gözükür.

22 byte statik ve dinamik olarak üzere 2 bölüme ayrılır aslında. İlk 6 byte yani OTP string’inde ki 12 karakter Yubikey’e özgü olan public ID değeridir. Sonraki 16 byte ise Secret ID, Session Counter, Timecode, Token counter ve checksum gibi özellikleri içerir. Bahse geçen son 16 byte üretimi sonrası, AES algoritması ile 128 bit’lik bir anahtar ile şifrelenir. Şifrelemede kullanılan AES anahtarı Yubikey’in fabrika üretimi esnasında belirlenmiştir. Bu değeri gözlemlemek mümkün değildir. Ben Yubico firması tarafından üretilmiş AES anahtarını kullanmak istemiyorum dersenizde, Yubikey’iniz için kendiniz AES anahtarı üretip kullanabilirsiniz.

Ara bilgileri verdikten sonra sıra asıl soruya cevap vermeye geldi.

yubikeyotpworkflow

Grafik analiz edildiğinde şu aşamalardan geçtiği görülür.

  1. Kullanıcı Yubikey ile OTP değeri üretir. Uygulamaya giriş sağlamak üzere uygulamaya iletir.
  2. Kullanıcı adı ve parola kontrol edilir.
  3. İlk 12 karakter ve bir önceki adımda tespit edilen kullanıcıya ait değer ile kontrol yapılır.
  4. Bu değer şifrelenerek Yubikey ID ile birlikte validation sunucusuna (veya tercihen kendi doğrulama servisinize!) iletilir.
  5. User ID kontrolü, Verinin deşifre edilmesi ve replay atakların önüne geçmek için counter kontrolü yapılır

Böylece hem Yubikey’in ilgili kullanıcıya aidiyeti kontrol edilmiş olunur. Ayrıca counter değerinin sürekli kontrol ediliyor olması, olası replay attack’larında önüne geçmektedir.

API Kütüphaneleri

Doğrudan Yubico firması tarafından aşağıdaki programlama dilleri için Yubikey kütüphaneleri sağlanmakta.

  • PHP
  • Java
  • C
  • .NET
  • Perl
  • SalesForce/Apex
  • Windows COM Api

Python, Ruby ve NodeJS içinse community tarafından geliştirilmiş 3rd part’i kütüphaneler mevcut.

Tüm yazı boyunca web uygulaması üzerinden örneklerle anlatım yapılmış olmasıi Yubico’nun sadece web uygulamaları için destek verdiği anlamına gelmez. Masa üzeri uygulamalar ile birliktede rahatlıkla kullanılabilir. Tabi bu durumda reverse engineering ile OTP validation fonksiyonlarının true olarak dönecek şekilde patch’lenmesi gibi problemler karşıya çıkacaktır.

Laravel ile Entegrasyonu

Entegrasyonu sağlamak için aslında kendi composer paketimi geliştirmem gerektiğini düşünüyordum. Biraz araştırınca gördüm ki https://github.com/bitbeans/Yubikey çoktan Laravel 5 için hazırlanmış bir composer mevcut. Paket kurulumunu yaptıktan sonra aşağıdaki kod bloğu ile OTP validation’ı yapmak gayet kolaydı.