Kafayı yemek üzereyim dostlar. Bugün otomasyon ve güvenlik adına yaptığım şey, bana tam bir "seni gidi seni" anı yaşattı.
Botu Yazdım, Her Şey Harika Gidiyordu
Bir iş akışı için, belirli aralıklarla yeni ve güçlü şifreler oluşturup, bunu bana güvenli bir kanaldan (şifreli bir mesajla) iletmesi gereken bir bot yazdım. Python, cryptography kütüphanesi, harika. Rastgele karakter üretimi, mükemmel çalışıyor. Bot çalıştı, terminalde "Şifre başarıyla oluşturuldu ve iletildi" yazdı. Mutlu mesut bilgisayarın başından kalktım.
Peki Şifre Nerede?
Sonra döndüm, "acaba şifreyi ne yaptı" diye bakınmak istedim. Güvenli kanal dediğim şey, botun oluşturduğu şifreyi Fernet ile şifreleyip, şifreli metni bana ait özel bir JSON dosyasına yazmasıydı. Dosyayı açtım. İÇİ BOŞ! Sadece boş bir obje. Terminaldeki o "başarılı" mesajına rağmen. Hemen botun kaynak kodunu açtım kontrol etmek için.
Kodun Son Satırındaki Felaket
Kodu incelerken, en sonda, işlemler bittikten sonra çalışan temizlik fonksiyonuna baktım. Ve orada gördüğüm şey kanımı dondurdu. Adam, şifreyi oluşturup (belki de) geçici bir değişkene attıktan sonra, "logları ve geçici dosyaları temizle" mantığıyla yazdığım fonksiyon, os.remove(__file__) gibi bir şey içeriyordu! Yani bot, işi bitince KENDİ KAYNAK DOSYASINI SİLİYORDU!
Meğerse sorun şuradaymış: Kodda bir kontrol akışı hatası vardı. Şifreleme ve dosyaya yazma işlemi BAŞARILI olsa bile, hemen ardından çalışan bu temizlik fonksiyonu, henüz yazma işlemi tamamen sistem tarafından commit edilmeden dosyayı siliyor ve sonra kendini de siliyordu. Terminale "başarılı" mesajı, fonksiyonlar sırayla çalıştığı için basılıyordu ama arkada her şey yok oluyordu. StackOverflow'da bile böyle bir aptallık aramaya utandım.
Neyse Ki Git Var!
Nihayetinde, proje bir Git reposu altındaydı. Botun kendisini silmesi sorun değildi. Sadece `git checkout -- bot_script.py` yaparak kodu geri getirdim. Tabii oluşturulup da kaybolan o şifre için yeniden bir mekanizma çalıştırmam gerekti. Büyük ders: Kendini silen bir script yazıyorsan, önce işini SAĞLAM yaptığından emin ol, sonra sil.
Siz hiç böyle "fazla otomasyon" yüzünden kendi ayağınıza sıktığınız oldu mu? Bu tarz kendini imha eden scriptler için daha güvenli bir pattern biliyor musunuz?
Bir iş akışı için, belirli aralıklarla yeni ve güçlü şifreler oluşturup, bunu bana güvenli bir kanaldan (şifreli bir mesajla) iletmesi gereken bir bot yazdım. Python, cryptography kütüphanesi, harika. Rastgele karakter üretimi, mükemmel çalışıyor. Bot çalıştı, terminalde "Şifre başarıyla oluşturuldu ve iletildi" yazdı. Mutlu mesut bilgisayarın başından kalktım.
Sonra döndüm, "acaba şifreyi ne yaptı" diye bakınmak istedim. Güvenli kanal dediğim şey, botun oluşturduğu şifreyi Fernet ile şifreleyip, şifreli metni bana ait özel bir JSON dosyasına yazmasıydı. Dosyayı açtım. İÇİ BOŞ! Sadece boş bir obje. Terminaldeki o "başarılı" mesajına rağmen. Hemen botun kaynak kodunu açtım kontrol etmek için.
Kodu incelerken, en sonda, işlemler bittikten sonra çalışan temizlik fonksiyonuna baktım. Ve orada gördüğüm şey kanımı dondurdu. Adam, şifreyi oluşturup (belki de) geçici bir değişkene attıktan sonra, "logları ve geçici dosyaları temizle" mantığıyla yazdığım fonksiyon, os.remove(__file__) gibi bir şey içeriyordu! Yani bot, işi bitince KENDİ KAYNAK DOSYASINI SİLİYORDU!
Python:
# İşte o lanet olası satır (özetle):
def temizlik():
os.remove(gecici_dosya)
os.remove(__file__) # "Güvenlik için kendimi imha ediyorum!"
Meğerse sorun şuradaymış: Kodda bir kontrol akışı hatası vardı. Şifreleme ve dosyaya yazma işlemi BAŞARILI olsa bile, hemen ardından çalışan bu temizlik fonksiyonu, henüz yazma işlemi tamamen sistem tarafından commit edilmeden dosyayı siliyor ve sonra kendini de siliyordu. Terminale "başarılı" mesajı, fonksiyonlar sırayla çalıştığı için basılıyordu ama arkada her şey yok oluyordu. StackOverflow'da bile böyle bir aptallık aramaya utandım.
Nihayetinde, proje bir Git reposu altındaydı. Botun kendisini silmesi sorun değildi. Sadece `git checkout -- bot_script.py` yaparak kodu geri getirdim. Tabii oluşturulup da kaybolan o şifre için yeniden bir mekanizma çalıştırmam gerekti. Büyük ders: Kendini silen bir script yazıyorsan, önce işini SAĞLAM yaptığından emin ol, sonra sil.
Siz hiç böyle "fazla otomasyon" yüzünden kendi ayağınıza sıktığınız oldu mu? Bu tarz kendini imha eden scriptler için daha güvenli bir pattern biliyor musunuz?