Dropbox Security, Tehdit Algılama İçin Nasıl Araçlar Geliştiriyor?

Dropbox Security, Tehdit Algılama İçin Nasıl Araçlar Geliştiriyor?

Dropbox Algılama ve Yanıt Ekibi (DART), çalışanlarımıza, altyapımıza ve müşteri verilerimize yönelik bilgi güvenliği tehditlerini algılar ve azaltır. DART, bina tespiti, tehdit avı ve potansiyel olaylara müdahale etme konusunda güvenlikle ilgili günlükleri alıyor. Günlük hacmimiz çok büyük, günde ortalama on terabayt.

DART’ın uyarı ve yanıt hattı, yeni araçlar oluşturmak için Python ve Jupyter dizüstü bilgisayarlarını kullanıyor.

Şüpheli davranışları ve olayları tetiklemek için tespitler oluşturmanın yanı sıra, zamanımızın büyük bir bölümünü yanlış pozitif uyarıları izlemek ve bireysel uyarılar etrafında bağlam oluşturmak için harcıyoruz. Bu, saldırganları avlamaya harcanan zaman değildi. Sonuç olarak, triyaj prosesi verimliliğini otomatikleştirmenin veya iyileştirmenin herhangi bir yolu çekici idi.

Büyük kütük hacmimiz de bazı kısıtlamalar getirdi. Bu tür bir kısıtlama, tüm kayıtlarımızı tek bir yerde tutamamamızdır. Şu anda, logların hacmi ve kaynağı hangi veri deposuna girdiklerini belirler. Ortaya çıkan bir diğer faktör, o log türüne karşı yazmak istediğimiz sorgular türüdür. Ne yazık ki, bu veri analizine bir yük getirdi. Örneğin, araştırmalar sırasında, tam resmi anlamak için birden fazla veri deposunda depolanan günlükleri aramak zorunda kalacağız.

Farklı veri depolarının kullanılması, ekibi farklı özelliklere ve arayüzlere sahip birden fazla sorgu dilini öğrenmeye zorladı. Bu, yeni ekip üyelerini daha da zorlaştırdı. Verilerin bu parçalanması aynı zamanda kurallarımızı kolayca bağlamamamız anlamına da geliyordu. Bir kural bazı olayları tetiklerse, bağlamı diğer veri depoları arasında çekmek zordur.

İşleri kolaylaştırmak için ekibimiz farklı veri depolarında depolanan günlükleri sorgulamak için ortak bir dil ve arayüz istedi. Ayrıca, Olay Müdahale döngüsünün çeşitli aşamaları için aynı temel araçlar setini istedik tespitler oluşturma, uyarıları bağlamlaştırma, tehdit avlama ve gerçek tepki.

Uyarıları Bağlamsallaştırmak İçin Uyarı Kutusu Oluşturma

Alertbox triyaj süremizi kısaltan ilk proje oldu. Amaç, uyarı yanıtı runbook’larımızı koda taşımak ve triyaj işlemine başlamadan önce çalıştırmalarını sağlamaktı.

Uyarı çalışma defterlerimizdeki ilk adımlar genellikle başlangıç ​​bağlamı kazanmaya yönelikti uyarıda yer alan kullanıcılar, ana bilgisayarlar ve işlemler hakkında bilgiler. Bu gerekli içeriği almak için, DART çoğu zaman bir veritabanını veya özel dahili servisi sorgulamak zorunda kalır. Bu sorguları, uyarıların çoğunun ateşlendiği SIEM’imizde Güvenlik Bilgileri ve Etkinlik Yönetimi kolayca uygulayamadık, çünkü istediğimiz veriler başka bir yerde yaşamaktaydı.

İhtiyacımız olan, bu uyarılara cevap olarak kod çalıştırmanın bir yoluydu; bu, çeşitli veri kaynaklarımızla arayüz oluşturmamızı ve özel mantık ya da bağlam içinde oluşturmamızı sağlayacaktı.

Alertbox’ı, belirli bir uyarıya eşleyen bir Python sınıfı olan İş Akışı kavramı etrafında oluşturduk. Python, Dropbox dile yoğun bir şekilde yatırım yaptığı ve güvenlik ve veri bilimi topluluklarındaki en popüler dil olduğu için Alertbox için bariz bir seçimdi.

Aşağıdaki kod parçasında, Varsayılan İş Akışı, kendi iş akışına sahip olmayan tüm uyarılar için bir araya getirme görevi görür.

class DefaultSIEMEventWorkflow(Workflow[SIEMEvent]):
    def __init__(self, siem_client, jira, forerunner):
        # type: (SIEMClient, JiraAPI, ForeRunnerAPI) -> None
        self.jira = jira
        self.siem_client = siem_client
        self.forerunner = forerunner

    @classmethod
    def create_instance(cls):
        # type: () -> DefaultSIEMEventWorkflow
        jira = JiraAPI('dart-bot')
        siem_client = create_siem_client()
        forerunner = ForeRunnerAPI()
        return DefaultSIEMEventWorkflow(siem_client, jira, forerunner)

    def process_event(self, workflow_context):
        # type: (WorkflowContext[SIEMEvent]) -> None
        alert_name = workflow_context.event.name

        event = workflow_context.event
        url = event.url

        runbook = extract_runbook_url(event.logs[0])

        jupyter_notebook_url = self.forerunner.generate_jupyter_notebook_url(
            alert_name=alert_name, alert_content=event.logs[0]
        )

        tags = extract_tags(event.logs)
        table = Table.convert_to_table('Raw Logs', event.logs)

        try_create_jira_ticket(self.jira, alert_name, url, jupyter_notebook_url, tags, runbook, table)

Alertbox, yanıt kapasitemizi geliştirmek için varsayılan ana içeriğin biletlerimize eklenmesine izin veren ilk büyük yapı taşını sağlar.

Veri Kaynaklarının Çıkarılması ve Kapsama Mantığı

Uyarı kutusu, uyarılara yanıt olarak özel kod yazmamızı sağlayan düzenleme ve iş akışı soyutlamasını bize verdi. Bir sonraki adım, iş akışlarından yararlanmak üzere kütüphaneler oluşturmaya başlamak, bağlamı daha kolay çekmemize, iş akışlarını daha hızlı yazmamıza ve verilerimizin yaşadığı yer gibi uygulama ayrıntılarını düşünmemeye izin vermekti.

Bu amaçla bir veri kaynakları kütüphanesi oluşturduk umursamadığımız ayrıntıları soyutlayabilecek modül gruplarına sahip bir Python kütüphanesi.

class AuditExecLog(Log):
    def __init__(
            self,
            auid, # type: int
            node,  # type: str
            uid, # type: int
            pid, # type: int
            ppid, # type: int
            comm, # type: str
            euid,  # type: str
            proctitle,  # type: str
            timestamp,  # type: int
            username,  # type: str
    ):
        pass

    def get_children(self):
        # type: () -> List[AuditExecLog]
        """
            Find execution of processes where the parent process is `self`
        :return: List of AuditExecLog, representing child processes
        """@cached
def get_machine_profile(client, hostname):
    # type: (MPClient, str) -> Optional[MachineProfileEntry]
    query = build_mp_query(hostname)
    response = MachineProfileEntry.query(client, query)
    return response or None

Doğrudan altta yatan veri depolarımıza eşleyen çok düşük seviyeli soyutlamalar oluşturmaya başladık. Buna bir örnek AuditExecLog, Linux denetim alt sisteminin log formatı için bir Python sarıcısıdır.

Şüpheli bir yürütme günlüğü verildiğinde, çoğu zaman alt işlemler gibi ilgili yürütmeleri de çekmek isteriz. İlgili yürütmeleri çekmek, PID çarpışmaları gibi sorunların ele alınması gibi ham sorgularla çalışırken aslında biraz karmaşıktır. Veri kaynakları kütüphanemiz, bu karmaşıklığı, basit bir yöntem çağrısı içine alır get_children, aksi halde karmaşık bir sorguyu önemsiz kılar.

Ayrıca araştırmalarımıza dahil olan sistemleri de anlamamız gerekiyor. DART, Dropbox’ın sistemdeki takımın durumu, ilgili tüm sahipler veya ekipler, ip adresleri, ana bilgisayar adları vb. Gibi çeşitli ortamlardaki her varlık hakkındaki bilgileri izler ve saklar. Bu toplu bilgi, Makine Profili adı verilen bir varlıkta depolanır.

Aşağıda, yalnızca bir ana bilgisayar adını girerek MachineProfileEntry dosyasını aramak için basit bir yardımcı işlevdir. Bu yardımcı sonuçları önbelleğe ham sorgu dışarı bina ve bir Python nesnesine sonucu dışarı ayrıştırmak için mantığını kapsüller: MachineProfileEntry.

@cached
def get_machine_profile(client, hostname):
    # type: (MPClient, str) -> Optional[MachineProfileEntry]
    query = build_mp_query(hostname)
    response = MachineProfileEntry.query(client, query)
    return response or None

Antlaşma’da Soruşturma ve Tehdit Avcılığı Yapılması

Uyarı kutusu ve veri kaynakları kütüphanesi, uyarılarımıza otomatik yanıtlar oluşturmamızı sağladı, ancak araştırmalar hala verilerin nerede yaşadığını, altta yatan veri soyutlamalarını ve çoklu sorgu dillerini bilmeyi gerektiriyordu. Otomasyon için mevcut olan primitifler ile gerçek araştırmalar için neyin gerekli olduğu arasındaki bağlantı koptu. Bununla baş etmek için, Jupyter Notebook’lar üzerine kurulu araştırma aracımız olan Covenant’ı yaptık.

Jupyter Notebook’lara yabancıysanız, onları süper güçlü Python REPL olarak düşünün. Jupyter notebookların yapı taşları Python kodu veya Markdown ile doldurulabilen hücrelerdir. Daha sonra hücreye yazılan Python kodunu değiştirebilir ve hücreleri istediğiniz gibi yeniden çalıştırabilirsiniz. Jupyter Notebook’lar, veri dilimleme, veri toplama, model oluşturma ve rapor paylaşımı için kullandıkları veri bilimi topluluğu ile çok güçlü ve popüler bir araçtır; DART’ta yaptıklarımızla çok yakından uyumlu çalışma.

Sözleşmenin arkasındaki ana tasarım kararlarından biri, verilerle çalışmak için temel soyutlamaların ve araçların otomasyon ve araştırma platformları arasında ortak olması gerektiğidir.

Covenant kullanarak başarır Bazel, benzer bir açık kaynak oluşturma sistemi Make Python gibi çeşitli programlama dilleri ile çalışır) ve bize bağımlılıkları belirlemenizi sağlar.

Bir vanilya Jupyter ortamı kullanmak yerine, Covenant, veri kaynakları kitaplığına bağımlı olan özel bir Bazel yapımı çekirdeği kullanır. Bu, uyarıları bağlamsallaştırmak / yanıtlamak için kullanılan mevcut ilkelleri kullanarak verilerimizle etkileşime girmemizi ve avcılık alıştırmaları yapmamızı sağlar.

Her Şeyi Forerner İle Bir Araya Getirmek

Kod ve çıktı iç içe geçmiş ve herhangi bir analiz Jupyter not defterlerinde kendiliğinden belgelenmiştir. Yapılan herhangi bir analiz / araştırmayı kaydetmek ve bunları kovulan bireysel uyarılarla ilişkilendirmek için bunu kullanmak istedik.

Forerunner’ı Alertbox ve Covenant arasındaki yapıştırıcı olarak düşünün. Bir uyarı çaldığında, Alertbox Forerunner adında bir RPC servisi çağırır. Bu hizmet, uyarıya karşılık gelen bir Jüpyter not defteri döndürür. Alertbox daha sonra bu Jupyter notebook’un URL’sini uyarı biletine gömer. Arka planda Forerunner, bu uyarı defterini de zaman uyumsuz olarak çalıştırıyor.

Dizüstü bilgisayarlar genellikle bu uyarı için daha fazla bağlam çeken daha ağır sorgular içerir. Daha sonra arama, veri kaynağı kütüphanesinde geliştirilen aynı ilkelleri kullanarak not defterinde araştırma yapabilir. Bu araştırmalar otomatik olarak kaydedilir.

Geleneksel olarak, tehdit tespit ve müdahale araçlarının oluşturulmasında en yaygın yöntem otomasyon ve araştırma parçalarının birbirinden ayrılmasıdır. Tecrübelerimize göre, bu büyük miktarda thrash’e yol açar. Dropbox’ta, Alertbox, Covenant ve Forerunner aracılığıyla Olay Müdahale döngüsünün çeşitli aşamalarında mevcut olan günlüklerimiz için ortak bir temel soyutlamaya yatırım yaptık. Güçlü açık kaynak araçlarını birleştirmek ve kullanmak, verilerimizi hızlı bir şekilde keşfetmemizi ve uyarıları otomatikleştirmemizi sağlayarak daha karmaşık tehditlere odaklanabilmemizi sağlamıştır.

Tavsiye yazı: Android için bir UE4 projesine Uyarlanabilir Simgeler Ekleme

Yorumlar / Düşünceler