۲۹ شهریور ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

چگونه Steampipe KPI ها را به عنوان کد فعال می کند

CMD Solutions با استفاده از Steampipe منبع باز ابزارهایی را برای تضمین کنترل مستمر ایجاد کرد تا معیارهای عملکرد امنیت اطلاعات را به عنوان عبارات SQL تعریف کند.

CMD Solutions با استفاده از Steampipe منبع باز ابزارهایی را برای تضمین کنترل مستمر ایجاد کرد تا معیارهای عملکرد امنیت اطلاعات را به عنوان عبارات SQL تعریف کند.

Ciaran Finnegan رهبر عمل امنیت سایبری در CMD Solutions استرالیا است و فیل ماسین یک مشاور ارشد امنیتی در آنجا است. . حدود یک سال پیش آنها شروع به استفاده از Steampipe و افزونه CrowdStrike برای اسکن محیط AWS مشتریان خود.

اکنون Finnegan و Massyn در حال ساختن یک سیستم داخلی برای آنچه آنها “تضمین کنترل مستمر” می نامند. راه دیگری برای گفتن آن ممکن است «KPI به عنوان کد» باشد. مثالی از KPI (شاخص عملکرد کلیدی):

آسیب‌پذیری‌های بحرانی یا با شدت بالا در چارچوب زمانی خط‌مشی سازمان اصلاح می‌شوند.

چگونه آن هدف را به کد ترجمه می کنید؟ با Steampipe، این کار را با نوشتن پرسش‌های SQL انجام می‌دهید که می‌توانند به API‌های متنوعی که پشته نرم‌افزار شما نشان می‌دهد بپیوندند. در این مورد، این بدان معناست که از یک سیستم مدیریت نقطه پایانی، CrowdStrike، پرس و جو کنید، سپس با اطلاعات یک سیستم مدیریت نیروی کار، Salesforce ملحق شوید – با درک این که یکی یا هر دوی اینها ممکن است تغییر کنند – برای تولید نتایج پرس و جو که از یک آسیب پذیری به یک دستگاه نگاشت می شود. یک شخص.

پرسمان اینجاست.


SELECT
    ZTA.system_serial_number || ' (' || salesforce_krow__project_resources__c.name || ')' as resource,
    CASE
        WHEN ZTA.assessment ->> 'os' = '100' THEN 'ok'
        ELSE 'alarm'
    END AS status,
    ZTA.system_serial_number || ' (' || salesforce_krow__project_resources__c.name || ' has a score of ' || (ZTA.assessment ->> 'os') as reason,
    jsonb_path_query_array(ZTA.assessment_items['os_signals'], '$[*] ? (@.meets_criteria != "yes").criteria') #>> '{}' as detail
FROM   
    crowdstrike_zta_assessment ZTA
-- Link the serial number to the Salesforce data, so we can find the owner
-- LEFT JOIN is important, in case there isn't a link, we still want to see the data
LEFT JOIN salesforce_fixed_asset__c
    ON ZTA.system_serial_number = serial_number__c
-- Here an INNER JOIN is necessary.  If the serial number exists in Krow, but no owner, that could indicate a
-- a data inconsistency in Krow, which will break the query.  We want an INNER JOIN, because both entries must exist
INNER JOIN salesforce_krow__project_resources__c
    ON salesforce_fixed_asset__c.project_resource__c = salesforce_krow__project_resources__c.id

جدول‌های موجود در بازی توسط CrowdStrike و Salesforce. هیچ یک از جداول Salesforce از پیش تعریف شده نیاز را برآورده نمی کرد، اما این مهم نبود زیرا CMD Solutions از اشیاء Salesforce سفارشی خود استفاده می کرد و افزونه Salesforce می تواند به صورت پویا اشیاء سفارشی را بدست آورید.

وقتی هزینه های ابری از سیستم های سنتی پیشی می گیرد چه اتفاقی می افتد

شما می توانید پرس و جو را به هر یک از روش هایی اجرا کنید که پرس و جوهای Steampipe اجرا می شوند: با Steampipe CLI، با psql (یا هر Postgres CLI)، با Metabase (یا هر ابزار BI سازگار با Postgres)، با پایتون (یا هر زبان برنامه نویسی). یا همانطور که CMD Solutions انجام داده است، می توانید یک پرس و جو را در یک کنترل Steampipe قرار دهید که بخشی از یک معیار است که در خط فرمان اجرا می شود با بررسی steampipe، یا به عنوان داشبورد با داشبورد steampipe.

از پرس و جوها تا کنترل ها و معیارها

در اینجا کنترلی است که پرس و جو را بسته بندی می کند. این فقط یک لفاف نازک است که یک KPI را نامگذاری و تعریف می کند.

 
control "SEC_002" {
    title = "SEC-002 - % of in-scope personnel compute devices with a Crowdstrike Agent Zero Trust Score for OS of 100"
    sql = <<EOT
    -- SQL as above
    EOT
    }

کنترل در یک معیار جمع می‌شود.

 
benchmark "sec" {
    title = "Security"
    children = [
        ...
        control.SEC_002
        ...
    ]
}

بنابراین می توانید SEC_002 را به صورت جداگانه اجرا کنید: steamppipe check control.SEC_002. یا می‌توانید تمام کنترل‌های موجود در معیار را اجرا کنید: steampipe check benchmark.sec. نتایج می‌توانند در فرمت‌های متنوع برای تجزیه و تحلیل پایین‌دستی ارائه شوند. p>

اما ابتدا، کجا و چگونه steamppipe check را به صورت برنامه ریزی شده اجرا کنیم؟ از اسناد آنها:

steampipe-scheduled-job-runner
بررسی های معیار Steampipe برنامه ریزی شده را به صورت ایمن و ارزان در AWS با استفاده از ECS Fargate اجرا کنید. ما از AWS Copilot برای تعریف توابع Step و کارهای برنامه ریزی شده AWS ECS Fargate برای اجرای چک های Steampipe در Docker استفاده می کنیم. معیارها و کنترل‌های Steampipe در زمان اجرا از یک مخزن git برای پشتیبانی از جریان کاری GitOps< بازیابی می‌شوند. /p>

این کار هر شب اجرا می‌شود، درخواست‌ها را از یک مخزن حذف می‌کند، آن‌ها را در برابر اهداف اجرا می‌کند، و خروجی‌ها را به Amazon S3 صادر می‌کند—به‌عنوان Markdown، و به‌عنوان JSON که توسط یک الگوی سفارشی.

6 بهترین روش امنیتی برای برنامه های کاربردی ابری

بررسی پیکربندی DMARC

اینم KPI دیگری:

همه دامنه های ایمیل سازمانی برای DMARC پیکربندی شده اند

و در اینجا جستار مربوطه، دوباره در یک کنترل پیچیده شده است.

 
control "INF_001" {
    title = "INF-001 - Organisational email domains without DMARC configured"
    description = "Protect against spoofing & phishing, and help prevent messages from being marked as spam. See https://support.google.com/a/answer/2466563?hl=en for more details."
    sql = <<EOT
        WITH ASSET_LIST as (
            SELECT
                D.domain,
                concat('_dmarc.',D.domain) as dmarc,
                COUNT(N.*) as MXCount
            FROM
                csv.domains D
            LEFT JOIN net_dns_record N on  N.domain = D.domain and N.type = 'MX'
            GROUP BY
                D.domain,
                concat('_dmarc.',D.domain)
        )
        SELECT
            A.domain as resource,
            CASE
                WHEN A.MXCount = 0 then 'skip'
                WHEN N.value LIKE '%p=reject;%' THEN 'ok'
                WHEN N.value LIKE '%p=quarantine;%' THEN 'ok'
                ELSE 'alarm'
            END as status,
            CASE
                WHEN A.MXCount = 0 then 'No MX record for domain ' || A.domain
                WHEN N.value LIKE '%p=reject;%' THEN 'Domain ' || A.domain || ' has a reject policy.'
                WHEN N.value LIKE '%p=quarantine;%' THEN 'Domain ' || A.domain || ' has a quarantine policy.  Consider making it reject.'
                WHEN N.value IS NULL THEN 'Domain ' || A.domain || ' has no DMARC policy defined.'
                WHEN N.value LIKE '%p=none;%' THEN 'Domain ' || A.domain || ' has a dmarc policy of none.'
                ELSE 'Domain ' || A.domain || ' has no DMARC policy'
            END as reason,
            A.domain as domain
        FROM
            ASSET_LIST A
        LEFT JOIN net_dns_record N on N.domain = A.dmarc and N.type = 'TXT' and N.value like 'v=DMARC1%'
    EOT
}

جدول‌های اینجا از CSV و Net. مانند Salesforce، افزونه CSV جداول را به صورت پویا بدست می آورد. در این مورد، فهرست دامنه‌هایی که باید زندگی‌ها را بررسی کنید در فایلی به نام domains.csv که از یک API مدیریت سیستم نام دامنه بازیابی شده است. نام دامنه‌ها با جدول net_dns_record پیوند می‌دهند. رکوردهای MX، که نام آنها برای DMARC پیکربندی شده است.

مانند همه کنترل‌های Steampipe، اینها نیز ستون‌های مورد نیاز را گزارش می‌کنند. a> منبع، وضعیت و دلیل. این صرفاً یک قرارداد است، زیرا می‌توانید انواع پرسش‌ها را در برابر جداول ارائه‌شده توسط افزونه بنویسید، اما وقتی از این قرارداد پیروی می‌کنید، درخواست‌های شما در اکوسیستم معیار و داشبورد Steampipe پخش می‌شوند.

بررسی حساب های کاربری غیرفعال

این درست است که پیوستن به APIها – با SQL به عنوان روش رایج برای استدلال بر روی آنها – ابرقدرت نهایی Steampipe است. اما شما نباید در میان APIها بپیوندید. بسیاری از کنترل های مفید یک یا چند جدول ارائه شده توسط یک افزونه را پرس و جو می کنند.

چگونه با API های GraphQL موفق شویم

یک KPI دیگر در اینجا آمده است:

حساب‌های غیرفعال Okta در چارچوب‌های زمانی خط‌مشی سازمان بررسی می‌شوند

این کنترل مربوطه است.

 
control "IAM_001" {
    title = "IAM-001 - Dormant Okta accounts are accounts that have not logged on in the last 30 days"
    sql = <<EOT
SELECT
    U.email as resource,
    CASE
        WHEN U.status <> 'ACTIVE' THEN 'skip'
        WHEN date_part('day', CURRENT_TIMESTAMP - U.activated) < 30 OR date_part('day', CURRENT_TIMESTAMP - U.last_login) < 30 THEN 'ok'
        ELSE 'alarm'
    END as status,
    CASE
        WHEN U.status <> 'ACTIVE' THEN 'User ' || u.email || ' is no longer active'
        WHEN U.last_login is null THEN 'User ' || u.email || ' has never logged on'
        WHEN date_part('day', CURRENT_TIMESTAMP - U.activated) < 30 OR date_part('day', CURRENT_TIMESTAMP - U.last_login) < 30 THEN 'Last logon was on ' || U.last_login
        ELSE 'User ' || u.email || ' last logon on ' || U.last_login
    END as reason,
    U.email,
    U.last_login
FROM
    okta_user U
EOT
}

کنترل‌هایی مانند این منطق تجاری را به روشی واضح و خوانا بیان می‌کنند و فقط به مهارت SQL کمی نیاز دارند.

مراحل بعدی

با جمع‌آوری عکس‌های فوری روزانه، Finnegan و Massyn در حال بررسی راه‌هایی برای تجسم آنها و شناسایی روندها و شاخص‌های ریسک کلیدی (KRI) هستند. یک اسکریپت پایتون خروجی سفارشی steampipe check را می خواند و خروجی های JSON و Markdown را می سازد که به S3 می روند. آنها نمونه اولیه داشبورد Steampipe را برای تجسم پرس و جوها و در نظر گرفتن اینکه چگونه یک ابزار تجسم ممکن است به تکمیل تصویر کمک کند، ساخته اند.

چرا این همه کار؟ فینیگان می‌گوید: «محصولاتی در بازار وجود دارد که می‌توانیم آن‌ها را بخریم، اما آنها با تمام خدمات ما یکپارچه نمی‌شوند، و نقشه‌ای دقیق از اهداف تجاری تا بیانیه‌های SQL را به ما نمی‌دهند. این جادوی Steampipe برای ما است.”

برای جزئیات بیشتر، مخزن های Fargate runner و ماژول تضمین کنترل مستمر آنها. اگر داستان مشابهی برای گفتن دارید، لطفا تماس بگیرید. ما همیشه مشتاقیم بدانیم مردم چگونه از Steampipe استفاده می کنند.