Siber Güvenlik
Regex ile Gizli Bilgilerin Tespiti
Gizli bilgiler (secrets), genellikle API anahtarları, veri tabanı erişim bilgileri, şifreler, kimlik bilgileri, token’lar gibi kişilere veya kurumlara özel olan verileri ifade eder. Bu tür gizli bilgiler içeren veriler, yanlışlıkla veya kasıtlı olarak kaynak kodlarında, yapılandırma dosyalarında veya Git gibi sürüm kontrol sistemlerinde herkese açık olarak paylaşılabilir ve kötü niyetli kişilere sistemlere, bilgilere izinsiz bir şekilde erişim için fırsatlar doğurabilir. Düzenli ifadeler, statik kod analizi araçları ve manuel yapılan incelemelerle, herkese açık olan gizli bilgilerin tespit edilmesi veya paylaşılmadan önce tespitinin yapılıp bunun önüne geçilmesi sağlanabilir. Bu yazıda, regex ile gizli bilgilerin nasıl etkili bir şekilde tespit edilebileceğine dair temel bir bakış sunulacaktır.
Kaynak: https://twitter.com/DZoneInc/status/1361420207793659904
Regex Nedir ve Ne İşe Yarar?
Metinler, kodlar içerisinde belirli kalıplar barındıran verileri aramak, tespit etmek veya doğrulamak için kullanılan düzenli ifadelere “regex (regular expressions)” denir. Kullanım alanları arasında e-posta, kullanıcı ismi, telefon numaraları gibi kullanıcı bilgilerini doğrulamak, kullanıcıların veya şirketlerin yanlışlıkla halka açık bir şekilde yayımladığı şifre ve kredi kartı numaraları gibi aslında gizli kalması gereken bilgilerinin tespit edilmesini sağlamak, veriyi analiz edip belirli kalıplardaki verileri silmek veya değiştirmek vardır. Aşağıda temel regex yapılarına ait örneklerin bir listesi verilmiştir:
Kaynak: https://www.beyaz.net/tr/yazilim/makaleler/regex_nedir.html
Regex ile Gizli Bilgilerin Tespiti
1. Gizli Bilgilerin Tanımlanması: Regex ile gizli bilgileri tespit etmenin ilk adımı, kullanıcıların veya kurumların kendi sistemleri ve güvenlik ihtiyaçları doğrultusunda hangi tür verilerin gizli bilgi sayılıp sayılmayacağını belirlemeleridir. Gizli verileri genellikle aşağıdaki gibi sınıflandırabiliriz:
- Şifreler: Kullanıcıların hesaplarına güvenli bir şekilde erişim sağlamalarına yarayan verilerdir. Genellikle büyük ve küçük harfler, rakamlar, özel karakterler içerirler. Sistemlerin belirlediği bir uzunluk ve güvenlik kuralına (en az 8, 12 veya daha fazla karakter, bir rakam, bir özel karakter) uygun olurlar.
Örneğin: “P@ssw0rd!2024”.
- API Anahtarları: Yazılımların diğer servislerle güvenli iletişim kurmasını sağlayan, genellikle uzun harf ve rakam dizilerinden oluşan anahtarlardır.
Örneğin: “sk_test_4eC39HqLyjWDarjtT1zdp7dc”.
- Veri Tabanı Erişim Bilgileri: Bir veri tabanına bağlanmak için kullanılan kullanıcı adı, şifre ve sunucu bilgilerini içerir.
Örneğin: “username:admin password:secret123 host:db.example.com port:3306”.
- Token’lar: Kimlik doğrulama ve oturum yönetimi için kullanılan uzun, harf ve rakam dizileridir. Genel olarak kısa süreli geçerliliğe sahip olurlar.
Örneğin:“eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIn0.qR6O5T4jx77uBcm5bM_9ZQ7oF5zkK”.
2. Regex Kalıplarını Tasarlama: Gizli bilgiler, her biri kendine özgü yapılar taşıyan verilerdir. Bu yapıları doğru bir şekilde anlayıp analiz ederek regex ile belirli kalıplar haline getirip onları tespit edebiliriz. Aşağıda farklı gizli bilgiler için kullanılan regex kalıplarına dair bazı örnekler yer almaktadır:
- GitHub API Anahtarı: GitHub API anahtarları, genellikle ghp_ ile başlayıp, ardından 36 karakterlik harf ve rakamlardan oluşan uzun dizilerden oluşur. Bu yapıyı regex kullanarak şu şekilde kalıplaştırabiliriz:
Görüldüğü gibi regex deseni (ghp_[a-zA-Z0-9]{36}) GitHub API anahtarını (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) doğru algılamış, ancak GitHub API anahtarı olmayan veriyi (gp_uTzsHn7ntsbrT3RUE7dsGx3Qq4689V2Jzoq0) algılamamıştır. Bundan şunu çıkarabiliriz ki regex ile kalıplaştırdığımız desen istediğimiz gibi gerçek GitHub API anahtarlarını algılayabiliyor, başka kalıpların desenlerini ise algılamıyor.
- Slack Bot Token: Slack Bot token’larında, xoxb- ile başlayan kısmın ardından gelen 12 rakam, Slack uygulamasına has bir kimlik bilgisini temsil eder. 24 karakterlik alfa numerik kısmı ise token'ın kendisini oluşturur ve Slack API erişimini sağlar. Bu yapıyı regex kullanarak şu şekilde kalıplaştırabiliriz:
Görüldüğü gibi regex deseni (\bxoxb-[0-9]{12}-[A-Za-z0-9]{24}\b) Slack Bot token’ını (xoxb-263594206564-FGqddMF8t08v8N7Oq4i57vs1) doğru algılamış, ancak Slack Bot token’ı olmayan veriyi (xb-263594206564) algılamamıştır. Bundan şunu çıkarabiliriz ki, regex ile kalıplaştırdığımız desen istediğimiz gibi gerçek Slack Bot token’larını algılayabiliyor, başka kalıpların desenlerini ise algılamıyor.
3. Regex ile Tespit Süreci: Gizli bilgilerin regex ile tespiti, güvenlik açısından kritik bir adımdır. Bu süreç, kaynak kodu veya dosyalarda şifreler, API anahtarları, token’lar gibi hassas ve gizli verilerin tespit edilmesini ve güvenlik açıklarının önüne geçilmesini sağlar. Regex, metin içinde belirli kalıpları tanımlayarak, olası gizli bilgilerin saptanmasına yardımcı olur. Bu süreçte dikkat edilmesi gereken birkaç temel adım bulunmaktadır:
- Regex Kalıplarını Uygulama: Regex kalıplarını oluşturduktan sonra, bu kalıpların doğru dosyalarda, kodlarda tespit için uygulanması gereklidir. Örneğin, Python, JavaScript, Java veya konfigürasyon dosyaları gibi dosya türlerinde şifreler, API anahtarları veya token’lar bulunabilir. Regex kalıpları bu dosyalarda metin taramaları yaparak gizli bilgilerin tespit edilmesini sağlar. Böylece potansiyel güvenlik açıkları daha hızlıca belirlenip güvenlik açıklarının önüne geçilmesi sağlanabilir.
Ayrıca, regex desenleri yalnızca mevcut dosyalarda değil, geçmiş sürümler üzerinde de taramalar yapabilir. Örneğin, Git gibi sürüm kontrol sistemlerinde geçmişte yapılan commit’lerde kazara paylaşılmış olabilecek gizli bilgiler olabileceğini düşünüp onları tespit etmek için regex ile düzenli olarak taramalar yapılabilir.
- Regex ile Eşleşen Verilerin İncelenmesi: Regex ile gizli bilgiler tespit edildikten sonra, bu eşleşen verilerin dikkatlice incelenip kontroller yapılması gereklidir. Regex, sadece belirtilen desenlere uyan verileri tespit eder, ancak bu verilerin gerçekten gizli bilgi içerip içermediğini anlamak için ek bir doğrulama gereklidir. Bu aşama, yanlış pozitifleri (gizli bilgi olmayan ama regex desenine uyan verileri) ayırt etmek için önemlidir. Aşağıda bir yanlış pozitif örneği verilmiştir:
Yanlış pozitifleri önlemek için, düzenli bir ifadeyle (regex’ler) eşleşen her metin manuel olarak kontrol edilebilir, ancak çok uzun metinler veya kod içeren büyük projelerde bu işlem zaman alıcı olabilir. İşte bu noktada otomatik araçlar ve filtrelemeler devreye girer. Örneğin, belirli bir yapıdaki şifreleri tespit etmek için yazılan yukarıdaki düzenli ifade kalıbı, 8 ila 20 alfa nümerik ve özel karakter içeren metinlerle eşleşir. Ancak helloWorld_1234 gibi bir metin aslında bir şifre değil, rastgele bir karakter dizisi olabilir. Bu tür yanlış eşleşmeler istenmeyen alarmlara ve yanlış pozitiflere neden olabilir.
GitGuardian ve TruffleHog gibi araçlar, metnin bağlamını otomatik olarak analiz ederek gerçek gizli bilgiler ile yanlış pozitifleri ayırt edebilir; GitGuardian eski commitlerdeki gizli bilgileri tespit eder, TruffleHog yüksek güvenlikli API anahtarlarını iyice tarayarak algılar. Bu araçlar gizli verileri manuel incelemeden çok daha hızlı ve doğru bir şekilde tespit edebilir ve yanlış pozitif oranlarını en aza indirebilir. Ayrıca, bu araçlar genellikle ayrıntılı raporlar sunarak kullanıcıların dosyalarda ve işlem geçmişlerinde hangi verilerin yanlışlıkla ifşa edildiğini ve hangi düzeltici eylemin gerçekleştirilmesi gerektiğini belirlemesini kolaylaştırır.
Yapay zekâ destekli platformlar yanlış pozitifleri tespit etmek için de kullanılabilir. Örneğin, Legit Security gibi yapay zekâ platformları, metnin bağlamını anlamak ve yalnızca gerçek gizli bilgileri tespit etmek için gelişmiş analiz teknikleri kullanır. Bu şekilde yanlış pozitiflerin önüne geçilebilir ve hassas bilgilerin tespit edilme süreci hızlandırılabilir.
- Gizli Bilgilerin Kaldırılması veya Maskelenmesi: Gizli bilgiler tespit edildikten sonra bu bilgilerin sistemden kaldırılması veya uygun şekilde maskelenmesi gereklidir. Bu işlemi hızlı bir şekilde yapmak, güvenlik açıklarını kapatmak ve hassas verilerin kötü niyetli kişilerin erişiminden korunmasını sağlamak için önemlidir.
Veri tabanlarında, dosyalarda veya kodlarda bulunan gizli bilgilerin silinmesi gereklidir. Bu, genellikle kötü niyetli saldırganlardan korunma adına yapılır. Ancak verilerin silinmesi, kalıcı olarak yapıldığında bu bilgilerin geri alınması mümkün olmayabilir.
Maskelenmiş veri, orijinal veri yerine gizli bilgilerin belirli kısımlarını gizlemek için kullanılan bir tekniktir. Örneğin, bir API anahtarı maskelendiğinde, sadece son dört haneleri görünür hale getirilir: sk_test_XXXX-XXXX-XXXX-1234. Bu, dışarıdan bakıldığında anahtarın tamamının görünmesini engeller, ancak yine de sistemdeki yetkili kişiler gerekli bilgilere erişim sağlayabilirler.
Kısacası duruma göre gizli bilgilerin tespitinden sonra gizli verileri tamamen silmek veya maskeleme yapmak tercih edilebilir.
- Sürekli İzleme ve Önleme: Hassas bilgilerin güvenliği tek seferlik tespit ve düzeltme süreçleriyle sınırlandırılmamalıdır. Çünkü hassas verilerin ihlali her an gerçekleşebilir ve bu, bireysel ya da kurumsal bilgileri riske atabilir. Bu nedenle sistemlerin sürekli izlenmesi, hassas bilgilerin kazara veya kasıtlı olarak sızdırılmasının önlenmesinde önemli bir rol oynar. Sürekli izleme, kod tabanları, metinler, commit’ler ve yapılandırma dosyalarındaki yeni değişiklikleri sürekli olarak tarayan otomatik araçlar kullanılarak yapılabilir. Örneğin GitGuardian, TruffleHog ve Detect Secrets gibi araçlar GitHub gibi sürüm kontrol platformlarında yeni commitler öncesinde uyarılar göndererek hassas veri sızıntılarını önler. Bu sayede hassas bilgilerin paylaşımının tespiti yapılıp anında müdahale edilebilir.
- Verileri Güvenli Depolama Yöntemleri: Parolaları ve API anahtarlarını çevrimdışı olarak güvenli bir yerde saklamak için kullanılırlar. HashiCorp Vault, AWS Secrets Manager ve Azure Key Vault gibi araçlar, API anahtarlarını, parolaları ve diğer hassas ve gizli bilgileri güvenli bir şekilde saklamak için kullanılan araçlardandır. Ayrıca, kod tabanında kullanılan hassas bilgiler otomatik olarak maskelenebilir veya şifrelenir ve otomatik olarak güvenli bir şekilde saklanmış olur. Bu amaçla AWS KMS (Key Management Service) veya HashiCorp Vault gibi şifreleme araçları kullanılarak veriler şifrelenebilir. Ayrıca, ağ güvenliği önlemleri yetkisiz erişimi önleyebilir. Güvenlik duvarları ve VPN'ler gibi ağ güvenliği çözümleri, sistemdeki hassas verilere yalnızca yetkili kişilerin erişebilmesini sağlar. Önleme süreçlerini sürekli izleme ile birlikte uygulayarak, hassas bilgilerin korunması daha güçlü ve daha sürdürülebilir hale gelir.
Kaynak: Proactive Secrets Management at Pendo - Pendo Developers
Sonuç olarak, hassas bilgilerin regex’ler kullanılarak tespit edilmesi, güvenlik açıklarının erken tespiti için etkili bir yöntemdir. Ancak, yalnızca düzenli ifadeler kullanılarak tespit edilen verilerin doğru ve güvenli olduğundan emin olmak için daha fazla doğrulama ve analiz yapılması önemlidir. Yanlış pozitifler ve hassas bilgilerin sızması riskleri göz önüne alındığında, sürekli izleme, otomatik araçlar ve güvenli depolama çözümleri ile desteklenen bir yaklaşım benimsenmelidir. Bu, sistemi daha güvenli hale getirecek ve potansiyel tehditlere karşı koruyacaktır.