کنترل های سرویس VPC - BigQuery Protection Codelab I

1. مقدمه

در این کد لبه، نحوه محافظت از BigQuery API با استفاده از کنترل‌های سرویس VPC را خواهید آموخت. کد لبه با هیچ سرویس API محافظت شده توسط محیط سرویس شروع می شود و اجازه می دهد پرس و جوها بر روی مجموعه داده های عمومی اجرا شوند و نتایج در جدول پروژه ذخیره شوند. پرس و جو در یک پروژه اجرا می شود و جدول (جایی که نتایج ذخیره می شوند) در پروژه دیگری ایجاد می شود، با تقلید از تنظیماتی که در آن داده ها می توانند در یک پروژه ذخیره شوند اما باید با استفاده از پروژه دیگری به آنها دسترسی داشت.

در مرحله بعد، یک محیط سرویس برای محافظت از پروژه داده معرفی می کنیم. شما یاد خواهید گرفت که چگونه با استفاده از قوانین ورودی و قوانین خروج، نقض های مشاهده شده را برطرف کنید و بعداً یک سطح دسترسی برای محدود کردن دسترسی با استفاده از آدرس های IP داخلی اضافه کنید. اهداف این کد لبه عبارتند از:

  • نحوه رفع تخلفات ورود و خروج را با استفاده از قوانین ورود و خروج به ترتیب درک کنید.
  • درک کنید که چرا یک تخلف خاص رخ داده است.
  • دامنه رفع تخلف اعمال شده را تجزیه و تحلیل کنید.
  • اصلاح (قاعده ورود/خروج) را تغییر دهید تا دامنه آن را با اعمال اهرمی برای اجازه دادن به ترافیک از آدرس‌های IP داخلی در شبکه VPC با استفاده از سطوح دسترسی تغییر دهید.

2. راه اندازی منابع و الزامات

قبل از شروع

در این کد لبه فرض می کنیم که شما قبلاً می دانید:

راه اندازی

راه اندازی اولیه ما به شرح زیر طراحی شده است:

طراحی اولیه با محیط سرویس بدون API محافظت می کند.

یک محیط سرویس منظم ایجاد کنید

در این کد لبه، از یک سرویس معمولی محافظت از محیط project-1 استفاده خواهیم کرد.

ایجاد ماشین مجازی کامپیوتری

در این کد لبه، از 1 نمونه Compute Engine در project-2 استفاده خواهیم کرد که در us-central1 قرار دارد و از شبکه پیش‌فرض VPC با نام default استفاده می‌کنیم.

هزینه

برای استفاده از منابع/APIهای ابری باید صورتحساب را در کنسول Google Cloud فعال کنید. توصیه می کنیم برای جلوگیری از تحمیل صورتحساب فراتر از این کد، منابع استفاده شده را خاموش کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان 300 دلاری هستند.

منابعی که هزینه دارند عبارتند از BigQuery و Compute Engine. می‌توانید با استفاده از ماشین‌حساب قیمت‌گذاری BigQuery و محاسبه‌گر قیمت‌گذاری Compute Engine، هزینه را تخمین بزنید.

3. دسترسی به BigQuery بدون محدودیت های کنترل سرویس VPC

مجموعه داده های عمومی را پرس و جو کنید و نتایج را در project-1 ذخیره کنید

  1. با مراجعه به صفحه BigQuery Studio، به project-2 و project-1 دسترسی پیدا کنید تا بررسی کنید که آیا می توانید به BigQuery API دسترسی پیدا کنید. شما باید بتوانید این کار را انجام دهید زیرا حتی اگر project-1 در یک محیط سرویس باشد، محیط هنوز از هیچ سرویسی محافظت نمی کند.
  2. از project-2 ، پرس و جوی زیر را برای پرس و جو از یک مجموعه داده عمومی اجرا کنید.
SELECT  name, SUM(number) AS total
FROM  `bigquery-public-data.usa_names.usa_1910_2013`
GROUP BY   name
ORDER BY total DESC
LIMIT 10;

پس از اجرای پرس و جو در مجموعه داده عمومی (در حالی که در project-2 باقی مانده است):

  1. روی Save Results کلیک کنید و جدول BigQuery را انتخاب کنید. (به اسکرین شات زیر مراجعه کنید). نتایج BigQuery را ذخیره کنید.
  2. project-1 به عنوان پروژه مقصد انتخاب کنید.
  3. مجموعه داده را codelab_dataset نامگذاری کنید. ( CREATE NEW DATASET را انتخاب کنید، مگر اینکه از یک مجموعه داده موجود استفاده کنید). انتخاب پروژه مقصد در حین ذخیره نتایج BigQuery.
  4. نام جدول را به این صورت بگذارید: codelab-table .
  5. روی ذخیره کلیک کنید.

داده های مجموعه عمومی با موفقیت در project-1 در نتیجه اجرای پرس و جو از project-2 ذخیره شده است.

Query Dataset در project-1 از project-2 ذخیره شده است

در حین باقی ماندن در project-2 BigQuery Studio، کوئری زیر را برای انتخاب داده ها اجرا کنید:

  • پروژه: project-1
  • مجموعه داده: codelab_dataset
  • جدول: codelab-table
SELECT name, total
FROM `project-1.codelab_dataset.codelab-table`
ORDER BY total DESC
LIMIT 10;

پرس و جو باید با موفقیت اجرا شود، زیرا نه project-2 و نه project-1 محدود به استفاده از BigQuery نیستند. دسترسی به BigQuery از و به هر جایی مجاز است تا زمانی که کاربر دارای مجوزهای IAM مناسب باشد.

راه اندازی Codelab بدون سرویس VPC محیط های سرویس را کنترل می کند. این نمودار فرآیندی را نشان می دهد که یک مدیر یک مجموعه داده BigQuery را پرس و جو می کند. هر کوئری BigQuery یک کار BigQuery را آغاز می کند، که سپس عملیات واقعی را در این سناریو انجام می دهد و داده ها را بازیابی می کند. دسترسی اصلی از یک نمونه Compute Engine و از اینترنت نشان داده می شود، در حالی که پرس و جو از یک مجموعه داده عمومی و از یک پروژه Google Cloud جداگانه انجام می شود. فرآیند جستجوی داده ها ( GetData ) بدون مسدود شدن توسط کنترل های سرویس VPC موفقیت آمیز است.

4. از BigQuery API در پروژه مجموعه داده منبع محافظت کنید

پیکربندی perimeter-1 را تغییر دهید و سرویس BigQuery API را به همراه منبع محافظت شده project-1 محدود کنید.

پیکربندی محیط سرویس

بررسی اجرای محیطی سرویس

از project-2 ، پرس و جوی زیر را مانند مرحله قبل در BigQuery Studio اجرا کنید:

SELECT name, total
FROM `project-1.codelab_dataset.codelab-table`
ORDER BY total DESC
LIMIT 10;

نقض RESOURCES_NOT_IN_SAME_SERVICE_PERIMETER در کنترل های سرویس VPC رخ خواهد داد

نقض کنترل های سرویس VPC Egress

گزارش حسابرسی تخلف در project-1 قرار خواهد گرفت، زیرا در آنجا تخلف برای عبور از محیط رخ داده است. گزارش ها را می توان با vpcServiceControlsUniqueId مشاهده شده فیلتر کرد (شناسه منحصر به فرد مشاهده شده را جایگزین VPC_SC_DENIAL_UNIQUE_ID کنید).

severity=ERROR
resource.type="audited_resource"
protoPayload.metadata.@type="type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata"
protoPayload.metadata.vpcServiceControlsUniqueId="[*VPC_SC_DENIAL_UNIQUE_ID*]"

نقض یک egressViolations است با:

  • principalEmail : [حساب کاربری که درخواست را اجرا می کند]
  • callerIp : [آدرس IP عامل کاربر که پرس و جو را اجرا می کند]
     "egressViolations": [
       {
         "targetResource": "projects/project-2",
         "sourceType": "Resource",
         "source": "projects/project-1",
         "servicePerimeter": "accessPolicies/REDACTED/servicePerimeters/perimeter-1",
         "targetResourcePermissions": [ "bigquery.jobs.create"]
       }      ],

5. رفع تخلف برای ایجاد کار BigQuery

ترافیک خروجی برای ایجاد شغل BigQuery ناموفق است. این نمودار زمانی را نشان می دهد که یک اصلی یک پرس و جو از project-2 برای یک مجموعه داده در project-1 اجرا می کند. عملیات ایجاد یک کار BigQuery، از پروژه مجموعه داده ( project-1 ) در پروژه‌ای که پرس‌وجو از آن اجرا می‌شود ( project-2 ) با نقض خروجی کنترل‌های سرویس VPC به دلیل محافظت از BigQuery API از perimeter-1 پیرامونی سرویس با شکست مواجه می‌شود. با در نظر گرفتن محیط، هیچ درخواست BigQuery API را نمی توان از project-1 به خارج از محیط یا خارج از محیط به سمت پروژه محافظت شده آغاز کرد. مگر اینکه توسط تنظیمات محیطی سرویس مجاز باشد.

نقض خروج را می توان با ایجاد یک قانون خروج برطرف کرد که بر اساس موارد زیر است:

  • منبع (FROM): یعنی آدرس ایمیل کاربر و زمینه (به عنوان مثال: آدرس IP تماس گیرنده، وضعیت دستگاه، مکان و غیره)
  • مقصد (TO): یعنی منبع، سرویس و روش یا مجوز هدف.

برای رفع نقض خروج مشاهده شده، یک قانون خروج ایجاد کنید که اجازه می دهد تا ترافیک به سمت targetResource ( project-2 ) توسط حساب کاربری که پرس و جو ( user@example.com ) را در سرویس BigQuery و روش/مجوز bigquery.jobs.create اجرا می کند، ایجاد کنید. .

نقض خروج رفع تنظیمات.

رفتار مورد انتظار از قانون خروج پیکربندی شده:

  • از | شناسه ها: فقط شناسه مشخص شده user@example.com باید اجازه عبور از مرز محیطی را داشته باشد.
  • به | پروژه ها: هویت مشخص شده تنها در صورتی می تواند از مرزهای محیطی عبور کند که مقصد پروژه مشخص شده project-2 باشد.
  • به | خدمات: هویت مشخص شده تنها در صورتی می تواند ترافیک خارج از محیط را به سمت پروژه مشخص شده آغاز کند که فراخوانی API برای سرویس و روش مشخص شده باشد. در غیر این صورت، به عنوان مثال، اگر سرویس دیگری را امتحان کنند که توسط محیط سرویس محافظت می شود، عملیات مسدود می شود زیرا سایر سرویس ها مجاز نیستند.

ثابت: قانون خروج را آزمایش کنید

پس از برقراری قانون خروج، همان کوئری را اجرا کنید.

SELECT name, total
FROM `project-1.codelab_dataset.codelab-table`
ORDER BY total DESC
LIMIT 10;

نقض دیگری رخ خواهد داد، این بار یک نقض ورودی NO_MATCHING_ACCESS_LEVEL . تخلف جدید از نظر پروژه هدف و روش با تخلف اول متفاوت است.

نقض کنترل های سرویس VPC ورودی

نقض جدید یک نقض ورودی است

  • principalEmail : [حساب کاربری که درخواست را اجرا می کند]
  • callerIp : [آدرس IP عامل کاربر که پرس و جو را اجرا می کند]
ingressViolations: [
0: {
 servicePerimeter: "accessPolicies/REDACTED/servicePerimeters/perimeter-1"
 targetResource: "projects/project-1"
 targetResourcePermissions: [0: "bigquery.tables.getData"]}
 ]

نقض روش bigquery.tables.getData به دلیل تماس API است که توسط کار BigQuery در تلاش برای دریافت داده از جدول BigQuery آغاز شده است.

6. رفع نقض برای دریافت داده های جدول BigQuery

یک قانون ورود، نقض ورود را برطرف می‌کند، در حالی که یک کنترل دقیق در مورد افرادی که مجاز به عبور از مرز محیطی سرویس هستند همراه با زمینه دسترسی مجاز، مانند پروژه منبع/هدف و روش API که می‌توانند به آن دسترسی داشته باشند، ارائه می‌کند.

نقض ورود توسط یک قانون ورود رفع می شود که با:

  • منبع (FROM): یعنی آدرس ایمیل کاربر و زمینه (به عنوان مثال: آدرس IP تماس گیرنده، وضعیت دستگاه، مکان و غیره)
  • مقصد (TO): یعنی منبع، سرویس و روش یا مجوز هدف.

قانون ورود اجازه می دهد تا ترافیک به سمت project-1 توسط کاربر مشخص شده در سرویس و روش مشخص شده باشد.

رفع تخلف ورود

رفتار مورد انتظار از قانون ورود پیکربندی شده:

  • از | شناسه ها: فقط شناسه مشخص شده user@example.com باید اجازه عبور از مرز محیطی را داشته باشد.
  • به | پروژه ها: هویت مشخص شده تنها در صورتی می تواند از مرزهای محیطی عبور کند که مقصد پروژه مشخص شده project-1 باشد.
  • به | خدمات: هویت مشخص شده تنها در صورتی می تواند ترافیک را در داخل محیط ایجاد کند که فراخوانی API برای BigQuery API و روش مشخص شده bigquery.tables.getData باشد.

اجرای پرس و جوی یکسان باید از این پس به طور مناسب بدون نقض کنترل های سرویس VPC عمل کند.

ما با موفقیت BigQuery API را در project-1 محدود کرده‌ایم تا فقط توسط user@example.com و نه user2@example.com از آن استفاده شود.

سرویس VPC محیطی را کنترل می کند که از BigQuery API محافظت می کند این نمودار نشان می دهد که چگونه دو اصل مختلف سعی می کنند یک مجموعه داده را پرس و جو کنند. دسترسی توسط user2@example.com (خطوط آبی نقطه‌دار) توسط کنترل‌های سرویس VPC ممنوع است، زیرا آنها مجاز به اجرای عملیات BigQuery از یا به سمت project-1 توسط پیکربندی محیطی سرویس نیستند. دسترسی توسط user@example.com (خط جامد سبز) موفقیت آمیز است، زیرا توسط پیکربندی‌های VPC Service Controls مجاز به انجام عملیات از و به سمت project-1 هستند.

7. ترافیک مجاز توسط محیط سرویس را بر اساس آدرس IP داخلی محدود کنید

پیکربندی فعلی به کاربر تعیین‌شده امکان می‌دهد تا از هر مکانی درخواست‌هایی را در BigQuery در project-1 اجرا کند. در هر نقطه از اینترنت، اگر به آنها اجازه IAM داده شود تا داده ها را جستجو کنند، و تا زمانی که از حساب خود استفاده می کنند. از منظر امنیتی، این بدان معناست که اگر حساب به خطر بیفتد، هر فردی که به حساب دسترسی پیدا کند می‌تواند بدون هیچ محدودیت اضافی به داده‌های BigQuery دسترسی داشته باشد.

محدودیت‌های بیشتر را می‌توان با استفاده از سطح دسترسی در قوانین ورودی و خروجی برای مشخص کردن زمینه کاربر اعمال کرد. به عنوان مثال، شما می توانید اجازه دسترسی بر اساس IP منبع را در ارتباط با یک قانون ورودی پیکربندی شده قبلی که اجازه دسترسی بر اساس هویت تماس گیرنده را می دهد، بدهید. دسترسی از طریق IP منبع برای هر دو محدوده IP عمومی CIDR امکان پذیر است، مشروط بر اینکه مشتری کاربر یک IP عمومی به آن اختصاص داده باشد، یا با استفاده از یک آدرس IP داخلی اگر مشتری کاربر از پروژه Google Cloud کار می کند.

سطح دسترسی را با شرایط دسترسی به آدرس IP داخلی ایجاد کنید

در همان پوشه خط مشی دسترسی محدوده، صفحه Access Context Manager را برای ایجاد یک سطح دسترسی باز کنید.

  1. در صفحه Access Context Manager، CREATE ACCESS LEVEL را انتخاب کنید.
  2. در پنجره New Access Level:
    1. عنوانی را ارائه دهید: می توانید از codelab-al استفاده کنید.
    2. در بخش شرایط، روی IP subnetworks کلیک کنید.
    3. تب Private IP را انتخاب کنید و روی SELECT VPC NETWORKS کلیک کنید.
    4. از صفحه افزودن شبکه‌های VPC ، می‌توانید شبکه default را مرور و پیدا کنید یا به صورت دستی نام کامل شبکه را در قالب //compute.googleapis.com/projects/project-2/global/networks/default وارد کنید.
    5. روی ADD VPC Network کلیک کنید.
    6. روی SELECT IP SUBNETs کلیک کنید.
    7. منطقه ای را که نمونه VM در آن قرار دارد انتخاب کنید. برای این کد، us-central1 است.
    8. روی ذخیره کلیک کنید.

ما یک سطح دسترسی ایجاد کرده‌ایم که هنوز در هیچ محیطی یا سیاست ورودی/خروجی اعمال نمی‌شود.

سطح دسترسی با زیرشبکه های IP پیکربندی شده است

سطح دسترسی را به قانون ورود اضافه کنید

برای اینکه کاربر مجاز توسط قانون ورود نیز در برابر سطح دسترسی تأیید شود، لازم است سطح دسترسی را در قانون ورود پیکربندی کنید. قانون ورود که دسترسی به داده های پرس و جو را مجاز می کند در perimeter-1 است. قانون ورود را تغییر دهید تا منبع را به عنوان سطح دسترسی codelab-al تعریف کنید.

سطح دسترسی با شبکه VPC

تست تنظیمات جدید

پس از اضافه شدن سطح دسترسی در قانون ورود، همان کوئری BigQuery با شکست مواجه خواهد شد مگر اینکه از کلاینت در شبکه VPC default پروژه پروژه project-2 اجرا شود. برای تأیید این رفتار، در حالی که دستگاه نقطه پایانی به اینترنت متصل است، پرس و جو را از کنسول Google Cloud اجرا کنید. پرس و جو به طور ناموفق خاتمه می یابد، همراه با نشانه ای از نقض ورود.

همان پرس و جو را می توان از شبکه default VPC که در project-2 قرار دارد اجرا کرد. به طور مشابه، اجرای همان کوئری BigQuery از یک نمونه Compute Engine واقع در project-2 با استفاده از default شبکه VPC نیز با شکست مواجه خواهد شد. این به این دلیل است که قانون ورود همچنان به گونه‌ای پیکربندی شده است که فقط به user@example.com اصلی اجازه دهد. با این حال، VM از حساب خدمات پیش فرض Compute Engine استفاده می کند.

برای اجرای موفقیت آمیز همان فرمان از نمونه Compute Engine در project-2 ، اطمینان حاصل کنید که:

  • VM دارای دامنه دسترسی برای استفاده از BigQuery API است. این را می توان با انتخاب Allow full access to all Cloud APIs به عنوان محدوده دسترسی VM انجام داد.
  • حساب سرویس متصل به VM به مجوزهای IAM نیاز دارد تا:
    • ایجاد مشاغل BigQuery در project-2
    • داده های BigQuery را از جدول BigQuery واقع در project-1 دریافت کنید
  • حساب پیش فرض خدمات Compute Engine باید توسط قانون ورود و خروج مجاز باشد.

اکنون باید حساب سرویس پیش‌فرض Compute Engine را در قوانین ورودی (برای اجازه گرفتن داده‌ها از جدول BigQuery) و به قانون خروج (برای ایجاد مشاغل BigQuery) اضافه کنیم.

سرویس VPC پیکربندی محیطی سرویس را با سطوح دسترسی کنترل می کند

از یک نمونه Compute Engine در project-2 در شبکه default VPC، دستور bq query زیر را اجرا کنید:

bq query --nouse_legacy_sql \
'SELECT name, total
FROM `project-1.codelab_dataset.codelab-table`
ORDER BY total DESC
LIMIT 10;'

با پیکربندی فعلی، فرمان BigQuery تنها در صورتی موفق خواهد شد که:

  • با استفاده از شبکه پیش‌فرض VPC در project-2 ، روی ماشین مجازی اجرا شود
  • واقع در منطقه مشخص شده us-central1 (زیر شبکه IP)، و
  • با استفاده از حساب پیش فرض سرویس Compute Engine پیکربندی شده در محیط سرویس اجرا شود.

پرس و جو دستور BigQuery اگر از هر جای دیگری اجرا شود شکست خواهد خورد، از جمله:

  • اگر در یک VM با استفاده از شبکه پیش‌فرض VPC در project-2 اجرا شود، اما در منطقه‌ای متفاوت از زیرشبکه اضافه شده در سطح دسترسی قرار دارد، یا
  • اگر توسط user user@example.com با مشتری کاربر در اینترنت اجرا شود.

محیط سرویس اجازه دسترسی به حساب سرویس پیش‌فرض GCE را می‌دهد. این نمودار دسترسی آغاز شده توسط همان مدیر، user@example.com را از دو مکان مختلف نشان می دهد: اینترنت و یک نمونه Compute Engine. دسترسی به BigQuery مستقیماً از اینترنت (خطوط نقطه‌دار آبی) توسط کنترل‌های سرویس VPC مسدود می‌شود، در حالی که دسترسی از VM (خطوط سبز سبز) - در حالی که جعل هویت حساب خدمات پیش‌فرض Compute Engine - مجاز است. دسترسی مجاز به این دلیل است که محیط سرویس برای اجازه دسترسی به منابع محافظت شده از آدرس IP داخلی پیکربندی شده است.

8. پاکسازی

در حالی که هیچ هزینه جداگانه ای برای استفاده از کنترل های سرویس VPC در زمانی که سرویس در حال استفاده نیست، دریافت نمی شود، تمیز کردن تنظیمات مورد استفاده در این آزمایشگاه بهترین روش است. همچنین می‌توانید نمونه VM و مجموعه داده‌های BigQuery یا پروژه‌های Google Cloud را حذف کنید تا از تحمیل هزینه جلوگیری کنید. با حذف پروژه Cloud، صورت‌حساب تمام منابع مورد استفاده در آن پروژه متوقف می‌شود.

  • برای حذف نمونه VM ، مراحل زیر را انجام دهید:
    • در کنسول Google Cloud، به صفحه نمونه‌های VM بروید.
    • چک باکس سمت چپ نام نمونه VM را انتخاب کنید و سپس Delete را انتخاب کنید و سپس برای تایید دوباره روی Delete کلیک کنید. حذف نمونه نمونه Compute Engine.
  • برای حذف محیط سرویس ، مراحل زیر را انجام دهید:
    • در کنسول Google Cloud، Security و سپس VPC Service Controls را در سطحی که خط مشی دسترسی محدوده است، در این مورد، در سطح پوشه انتخاب کنید.
    • در صفحه VPC Service Controls، در ردیف جدول مربوط به محیطی که می خواهید حذف کنید، روی Delete کلیک کنید.
  • برای حذف سطح دسترسی ، مراحل زیر را انجام دهید:
    • در کنسول Google Cloud، صفحه Access Context Manager را در محدوده پوشه باز کنید.
    • در شبکه، ردیفی را برای سطح دسترسی که می‌خواهید حذف کنید مشخص کنید، منوی سه نقطه را انتخاب کنید و سپس حذف را انتخاب کنید.
  • برای خاموش کردن پروژه ها مراحل زیر را انجام دهید:
    • در کنسول Google Cloud، به صفحه IAM & Admin Settings پروژه ای که می خواهید حذف کنید بروید.
    • در صفحه IAM & Admin Settings، Shutdown را انتخاب کنید.
    • شناسه پروژه را وارد کرده و Shutdown anyway را انتخاب کنید.

9. تبریک می گویم!

در این کد لبه، یک محیط VPC Service Controls ایجاد کردید، آن را اجرا کردید و عیب‌یابی کرد.

بیشتر بدانید

می توانید سناریوهای زیر را نیز بررسی کنید:

  • پس از اینکه پروژه توسط کنترل های سرویس VPC محافظت شد، همان پرس و جو را روی مجموعه داده عمومی اجرا کنید.
  • project-2 در همان محیط project-1 اضافه کنید.
  • project-2 را در محیط خودش اضافه کنید و project-1 در محیط فعلی نگه دارید.
  • کوئری ها را برای به روز رسانی داده ها در جدول اجرا کنید، نه فقط برای بازیابی داده ها.

مجوز

این اثر تحت مجوز Creative Commons Attribution 2.0 Generic مجوز دارد.