Merhaba makale yazmaya bir süre ara verdikten sonra aslında 1. serinin devam niteliğinde olan yeni bir makale yazmaya karar verdim. Bu makalede genel olarak Node JS uygulamalarında “Security” konusunu ele almaya çalışacağım tabi ki bir geliştiricinin gözünden :) Hangi paketleri kullanmalıyız, hangi pratikler uygulamalarımızı daha güvenli hale getirebilir, bu tarz konularda öğrendiklerimi sizlerle paylaşmaya çalışacağım.
Giriş: Node.js uygulamaları ve güvenliğin önemi?
Bir uygulama hayal edelim. Bütün kullanıcılarımızın çok önemli bilgileri bizim tasarladığımız sistemin içerisinde, kredi kartı bilgiler, iş, ev adresleri, iletişim numaraları vs aklınıza daha ne gelirse bu liste uzayabilir. Çağımızda artık her türlü datanın dijitale taşındığını da düşünürsek özellikle güvenli yazılım geliştirme konusunda biz yazılımcılara en az siber güvenlik uzmanları kadar çok iş düştüğüne eminim. Node.js’in büyük, orta ölçekli projelerde çok yaygın bir şekilde kullanılması da güvenlik konularına vereceğimiz hassasiyetin artması ve geliştiricilerin bu konuda daha fazla sorumluluk alması demek. Peki lafı çok uzatmadan ve kısa bir giriş yaptıktan sonra isterseniz uygulamalarımızı saldırganlara nasıl daha güvenli hale getirebiliriz bunun üstünde konuşmaya başlayabiliriz dilerseniz.
Uygulamalarımızda kullandığımız paketler ne kadar güvenli?
Özellikle Node.js geliştiriciler olarak “npm” paketlerinin nimetlerinden faydalanmamak kesinlikle mümkün değil. Bir çoğumuz çok uzun vakitler alacak işlerimizi sadece bir kaç “npm install” komutu ile diğer geliştiriciler tarafından geliştirilen paketleri kullanarak halledebiliyoruz. Bu durum bize geliştirme açısından bir büyük kolaylık sağlıyor orası kesin. Fakat olaya birazda farklı bir pencereden mi baksak? Node.js uygulamalarının bir çoğu üçüncü taraf paketler ve modüller kullanılarak geliştiriliyor. Bu paketlerin oluştura bilecekleri güvenlik açıkları ve uygulamamızda yaratabileceği zafiyetleri nasıl ön görebiliriz ki? Bu noktada hepimizin kafasının karıştığını hissedebiliyorum. Böyle bir güvenlik açığı ve zafiyet olması durumunda tabi ki bizi nihai koruyacak durum paketlerimizi sürekli güncel tutmak olacaktır eminim ki. Yazımızın ilerisi kısımlarında uygulama düzeyinde de alabileceğimiz güvenlik önemlerini anlatacağım ama öncesinde “npm audit” komutundan biraz bahsetmeden olmaz.
Nedir bu “npm audit” ne işimize yarar?
Özetlemek gerekirse “npm audit” komutu NPM paket yöneticimizle gelen bir güvenlik analiz aracıdır. “npm audit” komutu projemizin bütün bağımlıklarını inceleyerek bilinen güvenlik açıkları ve riskleri tespit etmeye yardımcı olur. Bu komut projemizin “package.json” ve “package-lock.json” dosyalarımızı analiz eder ve bu analiz sonucunda bize potansiyel güvenlik açıklarına sahip paketler hakkında rapor sunar. Tercih olarak hocam ben “yarn” tercih ediyorum diyorsanız da “yarn audit” isimli bir komut bulunmakta bilginize..
npm audit komutlarını ise özetlememiz gerekirse
- npm audit : Bütün projeniz de ki paketleri tarar ve güvenlik açıkları için size bir rapor sunar.
- npm audit fix : Otomatik olarak düzeltilebilecek güvenlik açıklarını düzeltir
- npm audit fix — force : Otomatik düzeltme önerilerini zorla uygular uyumsuz güncellemelere yol açabilir. Dikkatli kullanılması tavsiye edilir.
Bu komutlar hakkında daha detaylı bir bilgi almak isterseniz kendi npm’in kendi dökümantasyonunu bırakalım.
Uygulama düzeyinde güvenlik önemleri neler?
Evet gelelim makalemizin ve konumuzun aslında en can alıcı noktasına. Node.js uygulamalarımızda güvenlik açısından kullanabileceğimiz paketler neler? Hangi popüler paketler uygulamalarımızı sihirli bir çözüm olmasa bile bir tık daha güvenli kılar isterseniz bunları konuşmaya başlayalım
Kendi adıma söylemeliyim ki bütün Express.js uygulamalarımda aktif bir şekilde kullandığım bir pakettir efenim kendileri. Temelde bir dizi daha küçük middlewareleri kullanarak uygulamanızın HTTP yanıtlarını belirli başlıklara ayarlar. Geliştiricisinin de belirttiği gibi “Not a Bulletproof solution” fakat bütün Node.js uygulamalarımızda olması gerektiği düşüncesindeyim.
CORS (Cross-Origin Resource Sharing) uygulamamızın başka bir kaynaktan veri isteyebilmesine izin veren mekanizmadır. Örnek vermek gerekirse Backend API’ımızın tek bir Frontend uygulamasından gelen isteklere cevap vermesini sağlar. Böylelikle API’larımız güvenli bir şekilde ön taraf ile konuşabilirler. CORS ayarlarımızı doğru bir şekilde yapılandırmak önemlidir.
Rate Limiting bir kullanıcının belirli bir zaman diliminde gönderebileceği maksimum isteği sınırlamak için kullanılan bir güvenlik paketidir. Örnek vermek gerekirse bu paket saldırganın uygulamamıza sürekli erişmesini sınırlar DDoS, Brute Force gibi saldırı yöntemlerini IP bazlı olarak engeller ve kabul edilecek istek sayısını sınırlamamıza olanarak sağlar.
Gene kendimin nerdeyse bütün uygulamalarımda kullandığım validation paketi “Joi” kullanıcılarınızdan aldığınız girdileri doğrulamak, temizlemek ve kullanıcılarınız güvenli bir şekilde sisteminize datalar girmesini sağlamak için kullanılan en popüler paketlerden biridir. Çok geniş bir dökümantasyona sahip olup Joi ile validation konusunda yapamayacağınız iş yoktur kısaca bütün Node.js geliştiricilerin kullanması gereken bir pakettir.
Joi ile beraber kullandığım kullanıcılarınızın sistem şifrelerini dilediğiniz gibi şekillendirebildiğiniz (Büyük küçük harf olsun minimum karakter : 7 olsun vs..) çok yararlı olduğunu düşündüğüm bir npm paketi.
Bunlar sadece benim kullandıklarım bu paketleri oldukça çeşitlendirip bir çok alternatifi kullanmak sadece size kalmış. Kullanmadan önce lütfen dökümantasyonlara göz atmayı unutmayalım :)
Password Hash, Salt yöntemi
Password Hasleme vs Saltlama’nın tam olarak ne olduğunu açıklamamız gerekirse sistemimize kayıt olan kullanıcıların parolalarını kayıt oldukları şekilde açık ve yalın bir şekilde tutmak herhalde yapabileceğimiz en kötü pratiklerden biri olurdu sanırım. Bunu önlemek için işe “Bcrypt ” isimli paketi kullanıyoruz. Bir kullanıcının parolası, bir hash fonksiyonu aracılığıyla “hash” adı verilen bir karakter dizisine dönüştürülür. Hash fonksiyonları, aynı girdi için her zaman aynı çıktıyı verir, fakat çıktıdan girdiyi tespit etmek mümkün değildir. Kullanıcı kimlik doğrulaması yaptığında girilen parola hashlenir ve hash ile veritabanın da tutulan parola ile karşılaştırılır. Eğer eşleşme sağlanırsa kullanıcı sisteme giriş sağlayabilir.
Salting (Tuzlama): Salting ise parolanın hashlenmesi öncesinde rastgele bir karakter dizisi eklenmesini sağlar. Bu ekstra karakter dizi hash çıktısını tahmin etmeyi zorlaştırır ve rainbow table saldırılarına karşı önlem alınmasını sağlar.
Kimlik Doğrulama ve Oturum Yönetimi
Kimlik doğrulama denildiğinizde aklınızda ne canlanıyor bilmiyorum ama benim aklımda ilk canlanan durum. Her Türk vatandaşının bir Unique ID’ye sahip olması bu durumu uygulamalarımızda kullandığımız “JSON Web Token” yapısı ile sanırım benzetebiliriz :) Örnek vermek gerekirse kullanıcımız. Email ve şifresi ile sisteme giriş yaptıktan sonra özel bir token ile sistemde hangi işlere yetkisi olup olmadığını kontrol edebiliriz. Bu yöntemde kullanıcı başarılı bir şekilde kimliğini doğruladığı taktirde kullanıcıya özel bir token oluşturulur. Tarayıcı her istekte bu tokeni sunucuya gönderir. Token genellikle kullanıcının bilgilerini, expression date gibi bilgiler içerebilir. Bu yazımda “JSON Web Token” yapısının implemantasyonundan bahsetmeyeceğim açıkcası. Sadece “Jwt” gibi konuları her geliştiricinin bilmesi ve uygulaması gerektiği düşüncesindeyim. Ayrıca resmi dökümantasyon için göz atabilirsiniz.
Snyk, uygulamalarınız da ki bağımlıklarını kontrol edebileceğiniz sizin için uygulamanın güvenliğini ve güncelliğini izleyen bir analiz aracıdır. Bilinen güvenlik açıklarını tespit eder bu açıkları düzeltmek için otomatik fixler ve pull requestler oluşturur. Özellikle büyük çaplı uygulamalarda gözden kaçan potansiyel risk oluşturabilecek açıkları size bildirmesi açısından oldukça yararlı bir araç diyebiliriz. Ayrıca Snyk Advisor sayesinde kullanılan npm paketlerinin güvenliği konusunda da bir fikir sahibi olabilirsiniz.
OWASP
OWASP (Open Web Application Security Project) web uygulamalarımız için en kritik 10 güvenlik riskini belirleyen ve bilgilendirme amaçlı mutlaka her developerin okuması gereken bilgilendirme amaçlı bir dökümandır. Bu web sitesi (https://owasp.org/) uygulama geliştiricilerine, uygulamalarını olası güvenlik açıklarına karşı korumaları için yol göstermektedir.
2021 Yılı itibariyle OWASP Top Ten listesi aşağıda ki gibidir
- Broken Access Control
- Cryptographic Failures
- Injection
- Insecure Design
- Security Misconfiguration
- Vulnerable and Outdated Components
- Identification and Authentication Failures
- Software and Data Integrity Failures
- Security Logging and Monitoring Failures
- Server-Side Request Forgery
Detaylı bilgi için owasp.org web sitesini ziyaret edebilirsiniz.
Sonuç
Bu yazımda Node.js geliştiricilere temel düzey de olsa güvenlik konusundan bahsettiğimi düşünüyorum tabi ki bu makalede anlattıklarımız sadece buz dağının görünen kısmı özellikle “Security” alanında en azından bir Web Geliştiricinin bilmesi gereken daha bir çok kavram olduğunu düşünüyorum. Belki ilerleyen yazılımlarımda işin detayını biraz daha kod örnekleri vererek anlatırım. Bu makale umarım size iyi bir başlangıç sağlar konunun detayına inmek ve derinlere yolculuk etmek tabi ki bizim elimizde :) Tarık burası olmamış dediğiniz yerleri lütfen bana iletin. İyi günler dilerim..