Yazılım Güvenliği: Core Security Concepts Part-1

SWB
10 min readDec 16, 2020

--

Ülkemizde ve dünyada güvenliğe bakış açısı hızla ofansif tarafa yönelmeye devam ediyor. Ancak güvenlik ofansif taraftan ibaret değildir. Aksine, güvenliğin en önemli unsuru “Güvenlik Mimarileri”dir.

Güvenlik ile ilgili yaptığım çalışmalarda direkt olarak güvenlik alanında çalışan personeller ile development süreçlerinde yer alan yazılım/test personellerinin yazılım güvenliği ve mimarisi hakkında daha fazla bilgi sahibi olmaya ihtiyacı olduğunu gözlemledim. Bu amaçla hem tecrübelerimi hem de “Yazılım Güvenliği Mimarisi”nin best practise’lerini konu alan bir seri başlatmaya karar verdim. Ayrıca bu seri içerisinde tüm terimleri İngilizce olarak kullanacağım. Yanlarında parantez içerisinde Türkçe anlamlarını da paylaşacağım.

Neden yazılım/uygulama güvenliği çok önemli? Çünkü kullandığımız tüm uygulamalar structure’ın (yapının) en üstünde yer alırlar. Kullanıcıların ve saldırganların ilk ulaştığı, karşılaştığı yer uygulama katmanıdır. Yani saldırganların ilk atak yüzeyidir.

Aynı zamanda uygulamaların neredeyse çoğu zaman data (veri) ve data structure’a (veri yapılarına) erişimi vardır. Bu erişim doğru kurgulanmadı ise data (veri) sızıntıları gerçekleşebilir.

Yazılım güvenliğini anlayabilmek için öncelikle bu alanda literatüre giren “Core Security Concepts” (Temel Güvenlik Konseptleri) konusunu anlamak gerekiyor.

Core Security Concepts bazı kaynaklarda 6 alana ayrılıyor:

  • Confidentiality
  • Integrity
  • Availability
  • Authentication
  • Authorization
  • Accountability

Bazı kaynaklarda ise yukarıdakilere ek olarak Biometrics, Single Sign-on, Credential Management, None-repudiation ve Digital Signature da dahil ediliyor. Biz tamamını core concepts içerisinde ele alıp inceleyeceğiz. Bu core concept’lerin içerisinde birçok alt alan ve konu var ancak onları ilerleyen yazılarımızda inceleyeceğiz.

Peki Core Security Concepts anlamları ile birlikte nelerdir?

  1. Confidentiality (Gizlilik)
  2. Integrity (Bütünlük)
  3. Availability (Uygunluk, erişilebilirlik)
  4. Authentication (Kimlik doğrulama)
  5. Biometrics (Biyometri) [Part-2]
  6. Single Sign-on (Tekli oturum açma) [Part-2]
  7. Authorization (Yetkilendirme) [Part-2]
  8. Credential Management (Hassas veri yönetimi*) [Part-2]
  9. Accountability (Hesap verebilirlik) [Part-2]
  10. Non-repudiation (İnkar Etmeme) [Part-2]
  11. Digital Signature (Dijital İmza) [Part-2]

Confidentiality (Gizlilik)

Confidentiality, Türkçe karşılığı ile gizlilik, bilgi güvenliği konseptlerinden CIA’in (Confidentiality, Integrity ve Availability) ilk ayağıdır. Burada amaç sensitive data (hassas veri) denilen tüm verilerin korunmasıdır. Aynı zamanda bu verilerin unauthorized disclosure (yetkisiz ifşa) ile yetkisi olmayan kişilerin eline geçmesini engellenme amacı güdülür.

Burada bilmemiz gereken bir diğer kavram da Secrecy yani veri mahremiyeti. Gelin birlikte Secrecy kapsamına giren verilere örnekler verelim:

  • Trade Secrets (Ticari sırlar)
  • Intellectual Property (Fikri Mülkiyet Hakları)
  • Business Plans (İş planları)
  • Military Strategy (Askeri Stratejiler)

Apple’ın yeni çıkaracağı ürünün satış ve pazarlama planlarının sızdırılması trade secrets alanına girer. Bu ürünün teknik olarak fonksiyonlarının ele geçirilmesi ve sızdırılması Intellectual Property alanına girer. Tüm projenin sızdırılması Business Plan alanına girerken, bir ülkenin geliştirmekte olduğu savunma sanayi planlarının sızdırılması da Military Strategy alanına girer.

Bunlara kısaca örnek verdikten sonra konunun biraz daha anlaşılabilir hale geldiğini düşünüyorum.

Uygulamalar ve yazılımlar çoğunlukla bir çok privacy data dediğimiz özel verilere erişmek durumunda kalırlar. Bu hassas veriler genellikle üç ana kategoride incelenir:

  • Personally Identifiable Informations (PII)

PII, bir kişinin cep telefonu numarasından, konum bilgisine, T.C. Kimlik numarasından sosyal medya hesap bilgilerine kadar bir kişinin teşhis edilebilmesini sağlayan hassas verilerdir.

  • Protected Health Informations (PHI)

PHI, bir kişinin tüm gizli sağlık verileridir. Bunlar bir hastanedeki tahlillerden telefonunuzdaki sağlık uygulamasındaki kalp atış ritimlerinizin bilgisine kadar uzanabilir.

  • Payment Card Data (PCI-DSS)

PCI-DSS, aynı zamanda bir güvenlik standartı olup, insanların ödeme için kullandığı yöntemlerin (kredi kartı vb.) bilgileridir. Bu bir banka kartının bilgisinden kredi kartına ve hatta paypal kartın bilgisine kadar geniş bir yelpazeyi kapsayabilir.

Peki yazılım güvenliği söz konusu olduğunda Confidentiality nasıl korunur?

Temelde bu da üçe ayrılır ancak ileride bunları detaylandıracağız:

  • Masking/Obfuscation (Veri maskeleme ve gizleme)
  • View based access controls (Görünüm tabanlı erişim kontrolü)
  • Encryption (Şifreleme/Veri şifreleme)

Bu üç konseptte şuan için göz aşinalığı kazanmanız yeterli. İlerleyen yazılarda bolca detaylara değineceğiz.

Sonuç olarak Confidentiality’nin amacı sensitive data’ların (hassas verilerin) korunmasını sağlamak ve yasal regülasyonların ihtiyaçlarının karşılanmasını sağlamaktır.

Integrity (Bütünlük)

Az önce CIA’den bahsettik. Bu üçlü, güvenlik söz konusu olunca eşit öneme sahiptir ancak eşit önceliğe sahip olmak zorunda değildir. Öncelikler, içinde bulunduğunuz “bağlam”a ve sektöre göre değişebilir. Örneğin yedeklerinizi güvenli şekilde saklamak için anlaştığınız bir yedek yönetim sistemi firması için Confidentiality ve Integrity daha öncelikli olabilir. Ancak hala üçü de eşit öneme sahiptir. Veya bir kriptopara borsası için Availability hepsinden daha öncelikli olabilir.

Bu bilgileri de cebimize koyduktan sonra devam edelim. Integrity yani bütünlük, verilerin bozulmadan/değiştirilmeden tüm yolculuğunu yapabilmesi anlamına gelir. ATM’den para çekeceğinizi düşünün. Hesabınızda 1.000,00₺ varsa maksimum çekebileceğiniz para 1.000,00₺ olacaktır. Birisi bu verinin bütünlüğünü bozabilirse ATM’nin sahibi olan bankayı ciddi anlamda zarara uğratabilir, kendisine ait olmayan paraları çalabilir.

Integrity’nin amacı tüm verilerin bozulmadan, değiştirilmeden ve manipüle edilmeden kalmasını sağlamaktır. Peki bu neden bu kadar önemlidir? Hadi biraz daha somut bir hale getirelim. Düşünün ki ben dolar alım satımına izin veren bir borsanın sahibiyim. Ve bu borsanın yazılımında ciddi güvenlik sorunları var. Ve bir hacker bu yazılımda race condition (ileride detaylı olarak açıklayacağız) denilen bir zafiyet keşfetti. Bu zafiyet sayesinde dolar satım isteklerini bir kaç milisaniye içinde binlerce kez göndererek olmayan dolarlarını da satabileceğini fark etti. Hesabında 100 dolar olmasına rağmen 100.000 kez 100 dolarlık dolar satışı emri verdiğini ve bunu yaklaşık 10.000 kişinin borsadan çeşitli fiyatlarla satın aldığını düşünelim. Bu durumda üzülerek söylemem gerekiyor ki borsam batar. Çünkü aslında birinin sahip olmadığı 10.000.000,00$ satıldı ve bunu 10.000 farklı kişi çeşitli oranlarda satın aldı. Ve bu 10.000 kişinin o paraları çekmeye çalıştığını düşünün. Bu para borsadan çıkacaktır. O yüzden integraty çok önemlidir.

Biraz da literatürü öğrenelim. Temel üç amacı vardır:

  • Sensitive data’nın (hassas verinin) korunması
  • Sistemin bütünlüğünün korunması
  • Yetkisiz veri değişikliklerinin önelenmesi

Bu arada integrity iki şekilde bozulabilir:

  • Accidentally (Kaza ile)
  • Intentional (Bilerek)

Kaza ile olan bütünlük bozulmaları genellikle internal source (iç kaynaklar) tarafından yapılır. Ancak dış kaynaklar tarafından da yapıldığı gözlemlenebilir. Henüz işi konusunda hakimiyet kazanmamış bir yazılımcının hatasından veya dikkatsizliğinden kaynaklı olabilir. Veya canlı sistemde test yapan bir sızma testi uzmanının saldırısının şiddetini ayarlayamamasından dolayı da olabilir.

Bilerek yani Intentional dediğimiz değişiklikler fraud (dolandırıcılık) kaynaklı değişikliklerdir. Bunlar hem iç kaynaklar hem de dış kaynaklar yüzünden olabilir. Burada kötü niyetli bir personel veya dışarıdan birisi verinin veya sistemin bütünlüğünü bozmaya çalışarak haksız kazanç elde etmeye çalışır.

İngilizce’de iki farklı ancak birbirine bir o kadar da yakın terim var. Bunlar Accuracy ve precision. Türkçe’ye çevirdiğimizde bunları kesinlik, hassasiyet ve doğruluk olarak düşünebiliriz. Integrity söz konusu olduğunda hem accuracy’nin hem precision’ın korunması gerekir.

Peki temelde bunlar nasıl korunur? Kısaca başlıklarına değinelim ileride bol bol bunları inceleyeceğiz:

  • Input filtering/validation

Tüm girdi noktalarında alınan verinin mutlaka doğru şekilde filtreden geçirilmesi ve doğrulanması gerekir.

  • Output validation

Alınan input ve istekler sonucunda oluşturulacak output’ların da mutlaka bir kontrolden ve doğrulamadan geçirilmesi gerekir.

  • Error Handling

Error handling bir hata yönetimi konusudur ve çok derindir. Yazılımların düşünüldüğü şeyleri yapmadığı veya yapamadığı durumdaki tüm davranışlarını içermektedir. Ve mutlaka doğru bir error handling yapılması gerekir.

  • Hash totals/check digits

Burada amaç hem validation hem verification yapmaktır. Yani verinin doğru veri olduğundan ve bütünlüğünden emin olmaktır.

  • Completeness check

Burası integrity’den biraz daha farklı bir alan. Tamlığı kontrol etmek diyebileceğimiz bu maddede temel amaç tüm development sürecinin ve adımlarının eksiksiz şekilde yapılıp yapılmadığını kontrol etmektir.

İş, uygulamaların veri bütünlüğüne gelince şu başlıklara da hakim olmak gerekecektir.

  • Network Communications (Ağ iletişimi)
  • Truncation of Data (Veri kesilmesi)
  • Incorrect Rounding or Calculations (Yanlış yuvarlama ve hesaplama)
  • Display Datas (Veri gösterimleri)

Bu yazıda zaman zaman sadece göz aşinalığı olması amacıyla bazı terimlere değiniyoruz. Ancak ileride bunların tüm teknik detaylarını inceleyeceğiz.

Yazılımlar genellikle (Part-2'de inceleyeceğimiz) Digital Signatures (Dijital İmzalar) aracılığıyla verinin bütünlüğünden emin olurlar. Ancak digital signatures bize sadece veri bütünlüğü için yardımcı olmaz. Şu konularda da destek olur:

  • Gelen veya giden paketin bütünlüğünü (integrity) ve yetkilendirmesini (authentication) teyit eder.
  • Göndericinin kim olduğuna dair reddedilemez, inkâr edilemez kanıt sunar (Non-repudation)
  • Ayrıca paketin yoldayken (transit) değişmediğinden (not altered olması) emin olunmasını sağlar.

Toparlayacak olursak yazılımın kod seviyesinde güvenliğini sağlamanın yöntemleri konseptsel olarak şunlardır:

  • Code signing
  • Kodların trusted source üzerinden geldiğine emin olunması
  • Kodların modifiye edilmediğinden emin olunması
  • Infection’dan (zararlı yazılım bulaşması) kaçınma

Hazır yeri gelmişken biraz da reliability yani güvenilirlikten bahsedelim. Bir sistem yukarıdaki dört maddeye uyuyorsa, CIA’in tüm adımları eksiksiz yapılıyorsa artık reliable’dır. Yani güvenilirdir. Eğer gelecekte SRE (System Reliability Engineer) olmak istiyorsanız mutlaka güvenlik de bilmek zorundasınız.

Toparlayacak olursak Integrity’nin amacı sensitive data’ların yetkisiz kişilerce değiştirilmesinden korunmasını sağlamak ve yasal regülasyonların ihtiyaçlarının karşılanmasını sağlamaktır.

Availability (Uygunluk, erişilebilirlik)

Uzun yıllar önce güvenlik sektöründe bir “şaka” olarak nitelendirebileceğimiz söz kulaktan kulağa yayıldı:

“En güvenli sistem fişi çekilmiş sistemdir.” Peki gerçekten böyle midir? Elbette hayır. Available olmayan sistemler ne amacına hizmet edebilir ne de varlığını sürdürebilir. Availability, dilimize uygunluk ve erişebilirlik olarak çevrilebilir. Örneğin her facebook’a girmek istediğinizde girebiliyorsanız o sistem erişilebilir demektir.

Confidentiality ve Integrity verinin hassaslığına odaklanırken, Availability ulaşılabilir/erişilebilir olmasına odaklanır.

Burada başka bir soru daha gündeme geliyor. Sistemimiz ne kadar erişilebilir olmalı? Bu soru sektöre ve bağlama göre yine çok değişkenlik gösterecektir. Bazı sistemlerin saniyelik bile kesintisi çok büyük zararlara sebep olurken, bazı sistemlerin haftasonları erişilemez olması hiçbir zarara sebep olmayabilir. Buna business owner (işin sahibi) ile birlikte karar vermek gerekir.

Daha resmi bir tanım yapacak olursak:

Availability, sistemin ve verinin işin amacına uygun şekilde ulaşılabilir olmasını sağlar. Tekrar belirtmekte fayda var. Sistemin ne kadar erişilebilir olacağına işin niteliklerine ve ihtiyaçlarına göre karar vermek gerekir.

Şimdi de availability için hakim olmamız gereken anahtar kavramlara göz atalım.

  • Single Point of Failure

Tüm sistemin bağlı olduğu ana bir cihazımız olsun. Bu cihazın ve sistemin de bir yedeği olmasın. Eğer bu cihaz arızalanır veya erişilemez olursa sistem çöker. İşte o kritik cihaz SPoF’dir.

Kavram olarak, zarar gördüğünde bütün sistemi durduracak olan noktamız Single Point of Failure olacaktır.

Kurgulanan tüm sistemlerde amaç mümkünse SPoF bırakmamaktır. Eğer mümkün değilse ve SPoF olan bir asset varsa onun çeşitli yöntemlerle yedeklenmesi, çoklanması veya değiştirilebilir hale getirilmesi gerekir. Bu metotlara bu yazıda kavram olarak değineceğiz. İlerleyen yazılarda da detaylı olarak değineceğiz.

  • Failover

Tam anlamıyla yük devretmektir. Eğer bir cihazımız, serverımız, networkümüz vb gibi asset veya sistemlerimiz overload (aşırı yükleme) olursa o asset üzerindeki yükü dağıtmamız gerekir. Bu işleme de kavram olarak failover denilir. Eğer yükü dağıttığımız bir cluster ise o cluster’a “Failover Cluster” denilir.

Failover manuel olarak yapılacak bir iş ya da proses değildir. Failover otomatize edilmiş bir yapıdır. Eğer otomatize çalışmayan bir failover’ınız varsa o failover değildir. Disaster recovery (Felaket durum kurtarma) planı/aksiyonudur.

  • Replication & Clustering

Replication, bir assetin birebir aynısından bir veya daha fazla sayıda oluşturmaktır. Replike etmektir. Mesela bir sunucunuz var. Bu sunucunun replication’ını hazırlarsanız, ortaya çıkan yeni sunucu ilk sunucunun bir kopyasıdır. Bunu kavram olarak aklımızda tutalım.

Clustering’den önce cluster nedir onu tanımlamamız gerekir. Cluster kelime anlamı ile küme demektir. Yani ihtiyacınız olan donanımı (sunucu, network vb) bir küme içerisinde birden fazla olacak şekilde hazırlarsanız bir cluster yani küme oluşturmuş olursunuz.

Replication ve Clustering’in amacı sistemlerin yedekli ve kopyalı olmasını sağlayarak bir otomatize failover hazırlamaktır. Yükün artması durumunda replika veya cluster içerisindeki diğer cihazlar tarafından paylaşılmasını sağlayarak olası bir sistem durması, hizmet verememe veya veri kaybının önüne geçmiş oluruz.

Replication veya Clustering otomatize olursa harika olur. Ancak günümüzde bazı sistemler manuel olarak bu işlemlerin yapılmasını da gerektirebilir. Örneğin yerli bulut bilişim firmalarının birçoğu scaling işlemleri için manuel olarak hizmet vermektedirler. Elbette otomatize scaling’e geçen firmalar da mevcuttur.

  • Scalability

Bu kavramın Türkçe’si konuyu tek başına özetliyor: Ölçeklenebilirlik. Scalability, ekipmanlarımızın anlık olan kapasite ihtiyacını sürekli olarak karşılayabilmek demektir. Örneğin bir derenin karşı tarafından bizim tarafımıza geçen insanlardan sorumlu bir bekçi olalım. Ve elimizde birden fazla portatif hemen kullanılabilir bir köprü olsun. Gözünüzde canlandırın. Bir köprüden aynı anda 5 kişi geçebiliyor. 5 kişiye kadar sorun yok. Derede kurulu bir köprümüz durması yeterli. Gereksiz yere diğer köprüleri kurmaya gerek kalmaz. Ancak aynı anda 25 kişi geldiğinde var olan köprümüzün yanına hemen bir 4 köprü daha kurmalıyız. İşte ölçeklenebilirlik budur.

Scalability’nin en rahat olduğu ortam cloud ortamıdır. (Gerçek cloud ortamı) Bir proje başlarken ne kadar büyüyebileceği kestirmesi zor bir noktaya evrilebilir. Bu nedenle daha minimal kaynaklarla başlayan ihtiyaçları zaman geçtikçe scale etmek mümkündür. Talep arttıkça cloud provider’ınız ile anlaşmanızı genişletebilir ve servislerinizi ölçeklendirebilirsiniz. Ancak on-premises sistemlerde bu bu kadar kolay olmayacak ve ciddi yatırımlara ihtiyacınız olacaktır.

Bu yazının konusu cloud olmadığı için şimdilik bu konuyu burada bırakalım.

  • Resiliency

Bu kavram hem dayanıklılığı hem esnekliği temsil ediyor. Bir para lastiğini düşünün. Hem esnek hem de dayanıklıdır. Kopacağı son noktaya kadar esnetebilirsiniz. Söz konusu software (yazılım) olunca resiliency, sağlamlık (robustness), saldırıya veya ekipmanın fail olmasına karşı dayanıklılığı temsil eder.

Daha da özet hale getirecek olursak Resiliency, sistemimizin olumsuz koşullarda çalışabilme yeteneğini temsil eder.

Toparlayacak olursak Availability’nin amacı işin misyonu ve ihtiyacına uygun şekilde sistemlerin erişilebilir olmasını sağlamaktır. Availability, “prevention of distruction of data”, yani verilerin yok olmasının, erişilemez olmasının önüne geçmeye çalışması demektir. Son olarak da operasyonel kapasitemizin olması gerektiği kadar erişilebilir olmasını sağladığından bahsetmiş olalım.

Authentication (Kimlik doğrulama)

Authentication yani kimlik doğrulama, kendi içinde birden fazla metoda sahip bir konu. Uygulamalar genellikle bir sistemin ön yüzüdür. Ve bu uygulamalarda yine çok yüksek ihtimalle bir kimlik kontrolü ve o kimliğe göre işlemler yer almaktadır.

Kimlik doğrulama IAM diye kısaltılan Identification and Access Management konusu altında incelenir.

Identification and Access Management dört ana kategoriye ayrılır:

  • Identification
  • Authentication
  • Authorization
  • Accounting

Identification, bir şeyi veya kişiyi kimliklendirme işlemidir. Erişim vereceğimiz kişi veya teknolojileri bir şekilde kimliklendirmemiz gerekir. Bu bir ID, telefon numarası, e-posta veya T.C. kimlik numarası bile olabilir. Ancak bu kimliklendirme unsurunun kesinlikle unique (eşsiz/benzersiz) olması gerekir. Eğer bir ID eşsiz olmaz ise orada accountability (hesap verilebilirlik olarak düşünebiliriz) olmaz.

Identification için kişilere bir kayıt olma (registration) süreci sunuyorsak bu sürecin güvenli olduğuna ve bypass edilemediğine veya sahte hesaplar oluşturmak için kullanılmadığına emin olmalıyız. Bunun için de genellikle iki yaklaşım yaygın olarak kullanılır. Proof of Possession (sadece ilgili kişi tarafından bilinen gizli soru ve cevabı gibi) ve CAPTCHA. Elbette bu aşamada kullanılabilecek ekstra güvenlik önlemleri de mevcuttur ancak onları şuan incelemeyeceğiz.

Kimliklendirmenin ana amacı accountability yani hesap verebilme sağlamaktır.

Authentication, bir önceki aşamada oluşturduğumuz kimliklerin doğrulanmasından ve kanıtlanmasından oluşan bir prosestir. Burada temel amaç kimliğe ilişkin unsurun (ID, e-posta vb) verify (doğrulama) ve validate (yasal kılmak) edilmesidir.

Authentication için kullanılan birçok metot mevcuttur ancak bunların hemen hemen hepsi üç başlık altında incelenir:

  • Knowledge- Something you know
  • Ownership- Something you have
  • Characteristic- Something you are

Şimdi bunları biraz daha açalım:

Knowledge yani sadece sizin bildiğiniz bilgilerdir. Bu bir password (parola), passphrase (anahtar parolası), secret question/answer (gizli soru/cevap) veya pin numarası olabilir.

Ownership yani sadece sizin sahip olduğunuz bir şeydir. Bu bir smartcard (akıllı kart), one-time password device (tek seferlik parola oluşturan bir cihaz), badge/ID Card (rozet veya kimlik kartı), token veya keys (anahtar- fiziki bir anahtar da olabilir ya da private/public key de) olabilir.

Charactesticdirekt olarak sizsinizdir. Siz olmadan kimlik doğrulamanızın yapılamayacağı durumları temsil eder.

Toparlayacak olursak Authentication, bir firmanın veya kişinin varlıklarına, ağlarına, binalarına, sistemlerine ve verilerine erişime izin verme sürecinin kendisidir.

Bu yazımızda Core Security Concepts’in birinci bölümünü bitirmiş olduk. İkinci bölüm de ise Biometrics (Biyometri), Single Sign-on (Tekli oturum açma), Authorization (Yetkilendirme), Credential Management (Hassas veri yönetimi*), Accountability (Hesap verebilirlik), Non-repudiation (İnkar Etmeme), Digital Signature (Dijital İmza) başlıklarını inceleyerek bu Core Security Conpsets’i bitireceğiz.

Yazımızın ikinci bölümü:

Notlar:

  • : Türkçe tam karşılığı olmadığı için hassas veri yönetimi olarak belirtildi. Bu kavramı karşılayan daha iyi bir kelime varsa yorumlarınızı bekliyorum.

Kaynaklar:

CSSLP Certification All-in-One Exam Guide, Second Edition 2nd Edition by Wm. Arthur Conklin, Daniel Shoemaker

Official (ISC)2 Guide to the CSSLP CBK ((ISC)2 Press) 2nd Edition by Mano Paul

--

--

SWB

Some Kind of Security Guy | Defender of Digital Privacy & Security 🫡 | #Cybersecurity | #Blockchain Security | Safeguarding the Decentralized Web 🌐