۱. مقدمه
در این آزمایش، یاد خواهیم گرفت که چگونه با استفاده از کنترلهای سرویس VPC ، هنگام انتقال دادهها از فضای ذخیرهسازی ابری به مجموعه داده BigQuery، از سرویس انتقال داده BigQuery محافظت کنیم. سپس از فضای ذخیرهسازی ابری محافظت میکنیم و این فرآیند را برای انتقال دادهها از فضای ذخیرهسازی ابری به BigQuery تکرار میکنیم. محافظت از فضای ذخیرهسازی ابری باعث نقض کنترلهای سرویس VPC میشود که برای انتقال موفقیتآمیز باید برطرف شود. در نهایت، ما همچنین از BigQuery محافظت میکنیم و سپس سعی میکنیم مجموعه دادهها را بین پروژهها کپی کنیم که این نیز باعث نقضی میشود که باید برطرف شود.
در طول این آزمایش، خواهیم دید که چگونه با استفاده از قوانین ورودی و خروجی، به ترتیب، تخلفات ورودی و خروجی را برطرف کنیم. همچنین از یک سطح دسترسی برای رفع تخلف ورودی BigQuery Data Transfer استفاده خواهیم کرد. اهداف این آزمایشگاه کد عبارتند از:
- نحوه رفع تخلفات ورود و خروج را با استفاده از قوانین ورود و خروج به ترتیب در سرویسهای مختلف، به ویژه Cloud Storage، BigQuery و BigQuery Data Transfer Service، درک کنید.
- بفهمید که چرا یک تخلف خاص رخ داده است.
۲. راهاندازی منابع و الزامات
قبل از اینکه شروع کنی
در این آزمایشگاه کد، فرض میکنیم که شما از قبل موارد زیر را میدانید:
- نحوه ایجاد پوشه
- نحوه ایجاد یک پروژه در یک پوشه یا انتقال پروژه موجود در یک پوشه
- نحوه ایجاد یک سیاست دسترسی محدود
- نحوه ایجاد و پیکربندی محیط سرویس از کنسول Google Cloud
- نحوه یافتن گزارشهای تخلفات از گزارشهای حسابرسی
راهاندازی
تنظیمات اولیه ما به صورت زیر طراحی شده است:
- یک سازمان ابری گوگل.
- یک پوشه در زیر پوشهی Organization. برای این codelab، ما آن را
codelab-folderمینامیم. - دو پروژه گوگل کلود در پوشه
codelab-folder. برای این codelab، ما پروژهها راproject-1وproject-2مینامیم.- اگر پوشه و پروژههای مورد نظر را از قبل ایجاد نکردهاید، در کنسول Google Cloud ، یک پوشه در بخش Organization ایجاد کنید و دو پروژه جدید بسازید .
- مجوزهای مورد نیاز: نقشهای IAM برای مدیریت پوشهها ، نقشهای IAM برای مدیریت پروژهها ، نقشهای IAM مورد نیاز برای پیکربندی کنترلهای سرویس VPC ، نقشهای IAM برای مدیریت BigQuery و نقشهای IAM برای مدیریت فضای ذخیرهسازی ابری .
- حساب صورتحساب برای هر دو پروژه
project-1وproject-2.
یک سیاست محدود و یک محیط سرویس منظم ایجاد کنید
در این آزمایشگاه کد، ما از یک سرویس محیطی معمولی برای محافظت project-2 استفاده خواهیم کرد.
- یک سیاست دسترسی محدود ایجاد کنید که در سطح پوشه
codelab-folderتعریف شده باشد. برای این codelab، فرض میکنیم که سیاست دسترسی ایجاد شده دارای شناسه987654321است. - یک محیط معمولی ایجاد کنید ، ما آن را
perimeter-2مینامیم، و پروژهproject-2اضافه کنید.
در perimeter-2 ، BigQuery Data Transfer API محدود کنید.

ایجاد مخزن ذخیرهسازی ابری و مجموعه داده BigQuery
برای اهداف این آزمایشگاه کد، هر فایل csv صرف نظر از محتوا کافی است. محدودیت اصلی مربوط به الزام هممکانی است که موارد زیر را الزامی میکند:
- اگر مجموعه دادههای BigQuery شما در یک منطقه چند ناحیهای قرار دارد، سطل ذخیرهسازی ابری حاوی دادههایی که منتقل میکنید باید در همان منطقه چند ناحیهای یا در مکانی باشد که در داخل آن منطقه چند ناحیهای قرار دارد.
- اگر مجموعه دادههای شما در یک منطقه قرار دارد، مخزن ذخیرهسازی ابری شما نیز باید در همان منطقه باشد.
از این پس، برای این آزمایشگاه کد، اطمینان حاصل خواهیم کرد که هم Cloud Storage Bucket و هم مجموعه داده BigQuery در یک منطقه یا چند منطقه قرار دارند.
ایجاد یک مخزن ذخیرهسازی ابری جدید در پروژه project-1
برای ایجاد یک سطل ذخیرهسازی ابری جدید، مراحل مستند شده برای ایجاد یک سطل جدید را دنبال کنید.
- برای نام سطل، نامی را وارد کنید که الزامات نام سطل را برآورده کند. برای این codelab، سطل را
codelab-bqtransfer-bucketمینامیم. - برای محل ذخیره دادهها، مکان سطل، نوع مکان و مکانی که دادههای سطل به طور دائم در آن ذخیره میشوند را انتخاب کنید. برای این آزمایشگاه کد، ما از (مناطق مختلف در ایالات متحده) استفاده خواهیم کرد.

ایجاد فایل CSV
از دستگاه محلی شما یا با استفاده از Cloud Shell ، میتوانیم با استفاده از دستورات زیر، با استفاده از دستور echo یک فایل csv نمونه به نام codelab-test-file.csv ایجاد کنیم:
echo "name,age" > codelab-test-file.csv; \
echo "Alice,10" >> codelab-test-file.csv; \
echo "Bob,20" >> codelab-test-file.csv; \
echo "Carol,30" >> codelab-test-file.csv; \
echo "Dan,40" >> codelab-test-file.csv; \
echo "Eve,50" >> codelab-test-file.csv; \
echo "Frank,60" >> codelab-test-file.csv; \
echo "Grace,70" >> codelab-test-file.csv; \
echo "Heidi,80" >> codelab-test-file.csv;
فایل CSV را در فضای ذخیرهسازی ابری آپلود کنید
پس از ایجاد فایل csv، دستور زیر را برای آپلود شیء فایل به سطل ایجاد شده اجرا کنید:
gcloud storage cp codelab-test-file.csv gs://codelab-bqtransfer-bucket

شما میتوانید با فهرست کردن اشیاء موجود در سطل یا اجرای دستور زیر، تأیید کنید که فایل در سطل ایجاد شده آپلود شده است:
gcloud storage ls --recursive gs://codelab-bqtransfer-bucket/**
ایجاد مجموعه داده و جدول BigQuery در project-2
- با دنبال کردن مراحل زیر ، یک مجموعه داده BigQuery در پروژه
project-2ایجاد کنید.- برای Dataset ID ، یک نام منحصر به فرد برای مجموعه داده وارد کنید. برای این codelab، ما از
codelab_bqtransfer_datasetاستفاده میکنیم. - برای نوع مکان ، یک موقعیت جغرافیایی برای مجموعه داده انتخاب کنید. برای این آزمایشگاه کد، ما از همان موقعیت مکانی باکت ذخیرهسازی ابری استفاده میکنیم: ایالات متحده (مناطق متعدد در ایالات متحده) .

- برای Dataset ID ، یک نام منحصر به فرد برای مجموعه داده وارد کنید. برای این codelab، ما از
- با دنبال کردن مراحل زیر ، یک جدول BigQuery در زیر مجموعه داده ایجاد شده
codelab_bqtransfer_datasetایجاد کنید.- در بخش منبع (Source )، در فهرست «ایجاد جدول از» (Create table from) ، گزینه «جدول خالی» (Empty table) را انتخاب کنید.
- در فیلد جدول ، نام جدولی را که میخواهید ایجاد کنید وارد کنید. برای این codelab، ما از نام
codelab-bqtransfer-tableاستفاده میکنیم. - تأیید کنید که فیلد نوع جدول (Table type) روی جدول بومی (Native table) تنظیم شده باشد.
- در بخش Schema ، تعریف طرحواره را وارد کنید. میتوانید با کلیک روی «ویرایش به عنوان متن» اطلاعات طرحواره را وارد کنید و طرحواره زیر را که مطابق با قالب فایل csv ایجاد شده است، وارد کنید.
[{ "name": "name", "type": "STRING", "mode": "NULLABLE", "description": "The name" }, { "name": "age", "type": "INTEGER", "mode": "NULLABLE", "description": "The age" }]
هزینه
برای استفاده از منابع/APIهای ابری، باید امکان پرداخت صورتحساب را در پروژههای project-2 و project-1 فعال کنید. توصیه میکنیم منابع استفادهشده را غیرفعال کنید تا از پرداخت صورتحساب فراتر از این codelab جلوگیری شود.
منابعی که هزینه را متحمل میشوند BigQuery و Cloud Storage هستند. هزینه تخمینی را میتوان در ماشین حساب قیمت گذاری BigQuery و ماشین حساب Cloud Storage یافت.
۳. پیکربندی انتقال دادهها از شیء ذخیرهسازی ابری به جدول BigQuery
اکنون سعی خواهیم کرد یک سرویس انتقال داده (در project-2 ) ایجاد کنیم تا از Cloud Storage (واقع در project-1 ) به BigQuery (واقع در project-2 ) منتقل شود، در حالی که کنترلهای سرویس VPC از سرویس انتقال داده BigQuery در project-2 محافظت میکنند. محافظت فقط از سرویس انتقال داده BigQuery (بدون محافظت از BigQuery و Cloud Storage) مدیران را فقط به ایجاد و مدیریت انتقال دادهها (مانند شروع دستی انتقال داده) محدود میکند.
تنظیم انتقال داده از فضای ذخیرهسازی ابری
برای ایجاد یک انتقال داده، مراحل زیر را دنبال کنید:
- به صفحه BigQuery در کنسول Google Cloud مربوط به
project-2بروید. - روی انتقال دادهها کلیک کنید.

هنگام دسترسی به صفحه انتقال داده، تخلف را بررسی کنید
در کنسول Google Cloud، میتوانیم شناسه منحصر به فرد VPC Service Controls را ببینیم. از همین شناسه برای فیلتر کردن گزارشها و شناسایی جزئیات تخلف استفاده کنید ( OBSERVED_VPCSC_DENIAL_UNIQUE_ID را با شناسه رد درخواست مشاهده شده جایگزین کنید):
protoPayload.metadata.@type="type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata"
protoPayload.metadata.vpcServiceControlsUniqueId="OBSERVED_VPCSC_DENIAL_UNIQUE_ID"
تخلف مشاهده شده NO_MATCHING_ACCESS_LEVEL است که یک تخلف ورودی با جزئیاتی مشابه موارد زیر است:
ingressViolations: [
0: {
servicePerimeter: "accessPolicies/987654321/servicePerimeters/perimeter-2"
targetResource: "projects/[PROJECT2_NUMBER]"
}]
violationReason: "NO_MATCHING_ACCESS_LEVEL"
callerIp: "USER_PUBLIC_IP_ADDRESS"
resource: {
labels: {
method: "google.cloud.bigquery.datatransfer.v1.DataTransferService.ListTransferConfigs"
project_id: "project-2"
service: "bigquerydatatransfer.googleapis.com"
}
type: "audited_resource"
}
دسترسی به صفحه انتقال داده، تلاش میکند هرگونه انتقال داده پیکربندیشده را فهرست کند؛ بنابراین، نقض متد ListTransferConfigs محسوب میشود.
رفع تخلف برای سرویس bigquerydatatransfer.googleapis.com
میتوان از یک سطح دسترسی یا یک قانون ورود برای رفع نقض ورود استفاده کرد. در این آزمایشگاه کد، بیایید از یک قانون ورود پیکربندی شده با هویت کاربر رد شده استفاده کنیم که امکان دسترسی به سرویس bigquerydatatransfer.googleapis.com و همه متدها را فراهم میکند.

پس از اعمال قانون ورود، دسترسی به صفحه انتقال داده باید بدون مشکل کار کند.
تنظیمات انتقال داده از فضای ذخیرهسازی ابری را از سر بگیرید
از مراحل قبلی، در صفحه انتقال داده (پس از کلیک روی انتقال داده)، مراحل زیر را ادامه دهید:
- روی + ایجاد انتقال کلیک کنید.
- در بخش نوع منبع ، برای منبع ، Google Cloud Storage را انتخاب کنید.
- در بخش Transfer config name ، برای Display name ، نامی برای انتقال مانند
Codelab Transferوارد کنید. - در بخش گزینههای زمانبندی :
- یک فرکانس تکرار مانند ۱۵ دقیقه انتخاب کنید.
- حتماً گزینه «شروع اکنون » را انتخاب کنید؛ در غیر این صورت، انتقال داده فقط پس از فرکانس تکرار پیکربندی شده شروع میشود.
- در بخش تنظیمات مقصد ، برای مجموعه داده مقصد ، مجموعه دادهای را که برای ذخیره دادههای خود ایجاد کردهاید انتخاب کنید:
codelab_bqtransfer_dataset - در بخش جزئیات منبع داده
- برای جدول مقصد (Destination table) ، نام جدول مقصد خود را وارد کنید. جدول مقصد باید از قوانین نامگذاری جدول پیروی کند. برای این codelab، از جدولی که قبلاً ایجاد کردیم استفاده خواهیم کرد:
codelab-bqtransfer-table - برای آدرس ذخیرهسازی ابری (Cloud Storage URI) ، آدرس ذخیرهسازی ابری (Cloud Storage URI) را وارد کنید. برای این codelab، ما از سطل و فایل ایجاد شده استفاده میکنیم:
codelab-bqtransfer-bucket/codelab-test-file.csv - برای اولویت نوشتن ،
APPENDرا نگه دارید (یاMIRROR) را انتخاب کنید). - گزینه حذف فایلها پس از انتقال را انتخاب نکنید (زیرا ما چندین بار از یک فایل استفاده خواهیم کرد. با این حال، میتوانید از چندین فایل استفاده کنید و فایلهای منبع را پس از انتقال حذف کنید)
- برای فرمت فایل ، CSV را انتخاب کنید
- در قسمت Transfer Options ، زیر CSV ، علامت کاما ("") را به عنوان جداکننده فیلد وارد کنید.
- برای جدول مقصد (Destination table) ، نام جدول مقصد خود را وارد کنید. جدول مقصد باید از قوانین نامگذاری جدول پیروی کند. برای این codelab، از جدولی که قبلاً ایجاد کردیم استفاده خواهیم کرد:
- در منوی حساب سرویس ، یک حساب سرویس از حسابهای سرویس مرتبط با پروژه Google Cloud خود انتخاب کنید.
- حساب کاربری سرویس انتخاب شده باید مجوزهای لازم برای هر دو مورد Cloud Storage در پروژه میزبان مخزن ذخیرهسازی؛
project-1در این codelab را داشته باشد. - برای این codelab، ما از یک حساب کاربری سرویس که در
project-2با نامcodelab-sa@project-2.iam.gserviceaccount.comایجاد شده است، استفاده خواهیم کرد.
- حساب کاربری سرویس انتخاب شده باید مجوزهای لازم برای هر دو مورد Cloud Storage در پروژه میزبان مخزن ذخیرهسازی؛
- روی ذخیره کلیک کنید.
از آنجایی که ما گزینه «شروع کن» را به عنوان گزینه زمانبندی انتخاب کردهایم، به محض انتخاب «ذخیره» ، اولین انتقال آغاز خواهد شد.
وضعیت سرویس انتقال داده را تأیید کنید
برای تأیید وضعیت انتقال داده پیکربندی شده:
- به صفحه BigQuery در کنسول Google Cloud بروید
- روی انتقال دادهها کلیک کنید.
- لیست انتقال پیکربندی شده نمایش داده میشود

روی Codelab Transfer (در زیر نام Display) کلیک کنید تا فهرستی از تمام اجراهای انجام شده تاکنون نمایش داده شود.

اجرای انتقال داده باید موفقیتآمیز باشد و هیچ تخلفی از کنترلهای سرویس VPC برای انتقال دادهی دستی و برنامهریزیشده رخ ندهد. توجه داشته باشید که فقط انتقال دستی نیاز به قانون ورود دارد تا به مدیر اصلی، که انتقال را به صورت دستی آغاز میکند، دسترسی داده شود.
۴. محدودیتهای آدرس IP برای انتقال دادههای فعالشده دستی
قوانین ورودی پیکربندیشدهی فعلی به هویت پیکربندیشده اجازه میدهد تا انتقال دادهها را به صورت دستی از هر آدرس IP آغاز کند.
با استفاده از سطح دسترسی، کنترلهای سرویس VPC امکان محدود کردن دسترسی مجاز را بر اساس ویژگیهای خاص درخواست API فراهم میکنند، به ویژه:
- زیرشبکههای IP: بررسی میکند که آیا درخواست از یک آدرس IP خاص میآید یا خیر.
- مناطق: بررسی میکند که آیا درخواست از یک منطقه خاص میآید یا خیر، که این منطقه توسط موقعیت جغرافیایی آدرس IP تعیین میشود.
- مدیران: بررسی میکند که آیا درخواست از یک حساب کاربری خاص میآید یا خیر.
- سیاست دستگاه: بررسی میکند که آیا درخواست از دستگاهی میآید که الزامات خاص را برآورده میکند یا خیر.
برای اعمال تأیید این ویژگیها به همراه قانون ورودی از قبل پیکربندی شده، باید یک سطح دسترسی ایجاد کنیم که ویژگیهای مورد نظر را مجاز بداند و سپس سطح دسترسی ایجاد شده را به عنوان منبع در قانون ورودی اضافه کنیم.
این نمودار، دسترسی آغاز شده توسط دو کاربر اصلی (
user@example.com و user2@example.com ) را در سه سناریو نشان میدهد و نشان میدهد که چگونه کنترلهای سرویس VPC منابع (سطح دسترسی ورودی) و ویژگیهای هویت را به عنوان یک شرط AND ارزیابی میکند که در آن هر دو باید مطابقت داشته باشند.
- کاربر user@example.com هنگام تلاش برای دسترسی از یک آدرس IP مجاز توسط سطح دسترسی، مجاز به دسترسی است، زیرا آدرس IP و حساب کاربری آنها با پیکربندیهای موجود در قانون ورود مطابقت دارد.
- دسترسی کاربر user@example.com زمانی مسدود میشود که آدرس IP او با آدرس IP مجاز مطابقت نداشته باشد، علیرغم اینکه حساب کاربری او در قانون ورود پیکربندی شده است.
- کاربر user2@example.com با وجود تلاش برای دسترسی از یک آدرس IP مجاز، دسترسیاش مسدود شده است، زیرا حساب کاربری او طبق قانون ورود مجاز نیست.
ایجاد سطح دسترسی
برای ایجاد سطح دسترسی که دسترسی را بر اساس آدرس IP محدود میکند :
- صفحه Access Context Manager را در کنسول Google Cloud باز کنید.
- اگر از شما خواسته شد، پوشه
codelab-folderانتخاب کنید.
- اگر از شما خواسته شد، پوشه
- در بالای صفحه Access Context Manager ، روی CREATE ACCESS LEVEL کلیک کنید.
- در پنجره New Access Level ، به سطح دسترسی جدید یک عنوان اختصاص دهید. برای این codelab، ما آن را
project_2_alخواهیم نامید. - در بخش شرایط ، روی + در مقابل زیرشبکههای IP کلیک کنید.
- در کادر IP Subnetworks ، گزینه Public IP را انتخاب کنید.
- به عنوان یک جایگزین، میتوانید از IP خصوصی برای استفاده از آدرس IP داخلی در سطوح دسترسی استفاده کنید. با این حال، برای این آزمایشگاه کد، ما از IP عمومی استفاده میکنیم.
- یک یا چند محدوده IPv4 یا IPv6 را که به صورت بلوکهای CIDR قالببندی شدهاند، وارد کنید.
سطح دسترسی را در قانون ورود اضافه کنید
در داخل قانون ورود، سطح دسترسی در فیلد sources ارجاع داده میشود که همانطور که در مرجع قانون ورود مستند شده است، فیلدی الزامی است. برای اجازه ورود به منابع، کنترلهای سرویس VPC sources و ویژگیهای identityType را به عنوان یک شرط AND ارزیابی میکنند. قانون ورود از هویت اصلی که انتقال دادهها را به صورت دستی آغاز میکند استفاده میکند، نه از حساب سرویس مشخص شده در پیکربندی انتقال داده.

انتقال را با تنظیماتی که دسترسی را بر اساس آدرس IP محدود میکنند، دوباره اجرا کنید
برای ارزیابی اثربخشی پیکربندیهای اعمالشده، با استفاده از سناریوهای زیر، انتقال را دوباره آغاز کنید:
- با استفاده از آدرس IP در محدوده مجاز در سطح دسترسی که توسط قانون ورود به آن اشاره شده است.
- استفاده از آدرس IP که توسط تنظیمات مجاز نیست
دسترسی از آدرس IP مجاز باید موفقیتآمیز باشد در حالی که دسترسی از آدرسهای IP غیرمجاز باید ناموفق باشد و منجر به نقض کنترلهای سرویس VPC شود.
یک راه آسان برای آزمایش با استفاده از یک آدرس IP متفاوت، اجازه دادن به اختصاص آدرس IP هنگام استفاده از کنسول Google Cloud و سپس آزمایش هنگام استفاده از Cloud Shell است.
در Cloud Shell، دستور زیر را برای فعال کردن دستی انتقال ، با جایگزینی RUN_TIME و RESOURCE_NAME، اجرا کنید:
bq mk \
--transfer_run \
--run_time='RUN_TIME' \
RESOURCE_NAME
برای مثال، دستور نمونه زیر بلافاصله برای پیکربندی transfer 12345678-90ab-cdef-ghij-klmnopqrstuv در پروژه 1234567890 اجرا میشود.
NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ");
bq mk \
--transfer_run \
--run_time=$NOW \
projects/1234567890/locations/us/transferConfigs/12345678-90ab-cdef-ghij-klmnopqrstuv
خروجی مشاهدهشده، همانطور که انتظار میرود، نقض کنترلهای سرویس VPC را نشان میدهد، زیرا آدرس IP مجاز نیست.

تخلف مشاهده شده در متد DataTransferService.StartManualTransferRuns است.
ingressViolations: [
0: {
servicePerimeter: "accessPolicies/987654321/servicePerimeters/perimeter-2"
targetResource: "projects/[PROJECT2_NUMBER]"
targetResourcePermissions: [0: "vpcsc.permissions.unavailable"]
}]
violationReason: "RESOURCES_NOT_IN_SAME_SERVICE_PERIMETER"
resource: {
labels: {
method: "google.cloud.bigquery.datatransfer.v1.DataTransferService.StartManualTransferRuns"
project_id: "project-2"
service: "bigquerydatatransfer.googleapis.com"
}
type: "audited_resource"
}
severity: "ERROR"
۵. شروع انتقال دادهها ضمن محافظت از سرویس ذخیرهسازی ابری
از آنجایی که ما در حال انجام انتقال از Cloud Storage به BigQuery هستیم، بیایید Cloud Storage را به سرویسهایی که توسط VPC Service Controls محافظت میشوند اضافه کنیم و ببینیم که آیا انتقال با موفقیت انجام میشود یا خیر.
در پیکربندی perimeter-2 ، API ذخیرهسازی ابری (Cloud Storage API) را به عنوان یکی از سرویسهای محدود (Restricted Services) به همراه API انتقال داده BigQuery اضافه کنید.

پس از ایمنسازی API ذخیرهسازی ابری، منتظر انتقال دادهی برنامهریزیشدهی بعدی باشید، یا با استفاده از مراحل زیر ، انتقال را به صورت دستی آغاز کنید :
- به صفحه BigQuery در کنسول Google Cloud بروید.
- روی انتقال دادهها کلیک کنید.
- انتقال خود را از لیست انتخاب کنید: برای این codelab، ما از انتقال Codelab Transfer استفاده میکنیم.
- روی اجرای انتقال کلیک کنید.
- روی تأیید کلیک کنید.
انتقال دیگری آغاز خواهد شد. برای مشاهده آن ممکن است لازم باشد صفحه را رفرش کنید. این بار انتقال به دلیل نقض کنترلهای سرویس VPC با شکست مواجه خواهد شد.

بررسی نقض کنترلهای سرویس VPC در فضای ذخیرهسازی ابری
همانطور که در خلاصه انتقال مشاهده میشود، گزارشهای حسابرسی را با استفاده از vpcServiceControlsUniqueIdentifier فیلتر کنید.
تخلف مشاهده شده، تخلف خروج RESOURCES_NOT_IN_SAME_SERVICE_PERIMETER با جزئیات زیر است:
- حساب اصلی، حساب سرویس پیکربندی شده در سرویس انتقال داده است (چه به صورت دستی فعال شود و چه انتقال داده زمانبندی شده را اجرا کند، حساب اصلی رد شده یکسان خواهد بود.)
- سرویس تحت تأثیر، فضای ذخیرهسازی ابری است
- منبع درخواست، پروژهای است که سرویس انتقال داده در آن پیکربندی شده است:
project-2 - پروژه هدف، پروژهای است که شیء ذخیرهسازی ابری در آن قرار دارد:
project-1
principalEmail: "codelab-sa@project-2.iam.gserviceaccount.com"
egressViolations: [
0: {
servicePerimeter: "accessPolicies/987654321/servicePerimeters/perimeter-2"
source: "projects/[PROJECT2_NUMBER]"
sourceType: "Resource"
targetResource: "projects/[PROJECT1_NUMBER]"
targetResourcePermissions: [0: "storage.objects.get"]
}]
labels: {
method: "google.storage.objects.get"
project_id: "project-2"
service: "storage.googleapis.com"
}
رفع مشکل نقض خروج از فضای ذخیرهسازی ابری
برای رفع نقض خروج، باید از یک قانون خروج استفاده کنیم که به ترافیک از حساب سرویس رد شده به سمت پروژهای که دارای اشیاء ذخیرهسازی ابری است، اجازه عبور میدهد.

پس از تغییر service perimeter-2 ، فرآیند را برای شروع مجدد انتقال تکرار کنید. انتقال خطایی نشان نخواهد داد.

۶. کپی کردن مجموعه دادههای BigQuery از پروژه-۲ به پروژه-۱
پس از تأیید اینکه میتوانیم دادهها را از مخزن ذخیرهسازی ابری در project-1 به مجموعه دادههای BigQuery در project-2 منتقل کنیم، بیایید مجموعه دادههای BigQuery را از project-2 به project-1 کپی کنیم؛ در حالی که API BigQuery توسط کنترلهای سرویس VPC محافظت میشود.
برای ایجاد و کپی کردن مجموعه داده، از دستور bq mk استفاده خواهیم کرد که از ابزار bq بهره میبرد.
ایجاد مجموعه داده مقصد در project-1
قبل از کپی کردن مجموعه دادهها، ابتدا باید مجموعه دادههای مقصد ایجاد شود. برای ایجاد مجموعه دادههای مقصد، میتوانیم دستور زیر را اجرا کنیم که یک مجموعه داده با نام copied_dataset در پروژه project-1 با آدرس us ایجاد میکند.
bq mk \
--dataset \
--location=us \
project-1:copied_dataset
محافظت از سرویس BigQuery در project-2 با کنترلهای سرویس VPC
پیکربندی perimeter-2 را تغییر دهید و BigQuery API را به عنوان سرویس محافظتشده، همراه با سرویسهای BigQuery Data Transfer و Cloud Storage اضافه کنید.

شروع کپی مجموعه دادهها
برای کپی کردن مجموعه دادهها، دستور bq mk زیر را اجرا کنید که مجموعه دادههای codelab_bqtransfer_dataset را در پروژه project-2 به سمت مجموعه دادههای copied_dataset در project-1 کپی میکند و در صورت وجود، محتوای مجموعه دادهها را بازنویسی میکند.
bq mk \
--transfer_config \
--project_id=project-1 \
--target_dataset=copied_dataset \
--data_source=cross_region_copy \
--display_name='Dataset from project-2 to project-1' \
--params='{
"source_dataset_id":"codelab_bqtransfer_dataset",
"source_project_id":"project-2",
"overwrite_destination_table":"true"
}'
دستور با موفقیت اجرا خواهد شد؛ در همین حال، پیکربندی انتقال با موفقیت ایجاد شده است تا عملیات کپی کردن مجموعه دادهها آغاز شود. کپی کردن خود مجموعه دادهها با شکست مواجه خواهد شد و نقض کنترلهای سرویس VPC رخ میدهد.
برای یافتن جزئیات مربوط به نقض کنترلهای سرویس VPC، گزارشهای موجود در project-2 (پروژه مجموعه داده منبع) را با استفاده از کوئری گزارش زیر بررسی کنید. کوئری گزارش، گزارشهای مربوط به سرویس BigQuery و نام منبع مجموعه دادهای که کپی میشود ( codelab_bqtransfer_dataset ) را فیلتر میکند.
resource.labels.service="bigquery.googleapis.com"
protoPayload.metadata.resourceNames:"datasets/codelab_bqtransfer_dataset"
نقض مشاهدهشدهی کنترلهای سرویس VPC، یک نقض خروجی از project-2 به project-1 است.
egressViolations: [
0: {
servicePerimeter: "accessPolicies/987654321/servicePerimeters/perimeter-2"
source: "projects/[PROJECT-2-NUMBER]"
sourceType: "Resource"
targetResource: "projects/[PROJECT-1-NUMBER]"
targetResourcePermissions: [
0: "bigquery.transfers.update"
1: "bigquery.transfers.get"
2: "bigquery.jobs.create"
]
}
]
method: "bigquery.tables.getData"
service: "bigquery.googleapis.com"
تمام تخلفات BigQuery را برطرف کنید و دوباره کپی مجموعه دادهها را شروع کنید
برای رفع نقض خروج، باید یک قانون خروج ایجاد کنیم که به مدیر اصلیِ رد شده اجازه اجرا بدهد. مدیر اصلیِ رد شده، همان کسی است که دستور mk را اجرا میکند.

پس از اعمال قانون خروج، در محیط perimeter perimeter-2 ، همان دستور را برای کپی کردن مجموعه دادهها اجرا کنید. این بار، باید مجموعه دادهها با موفقیت و بدون نقض کنترلهای سرویس VPC کپی شوند.
۷. پاکسازی
اگرچه هیچ هزینه جداگانهای برای استفاده از کنترلهای سرویس VPC در زمانی که سرویس در حال استفاده نیست، وجود ندارد، اما بهترین روش، پاکسازی تنظیمات مورد استفاده در این آزمایشگاه است. همچنین میتوانید نمونه ماشین مجازی و/یا پروژههای ابری را حذف کنید تا از تحمیل هزینهها جلوگیری شود. حذف پروژه ابری، پرداخت هزینه برای تمام منابع مورد استفاده در آن پروژه را متوقف میکند.
- برای حذف فضای ذخیرهسازی ابری ، مراحل زیر را انجام دهید:
- در کنسول گوگل کلود، به صفحه Cloud Storage Buckets بروید.
- کادر انتخاب سطل مورد نظر برای حذف را علامت بزنید و سپس روی حذف کلیک کنید.
- در پنجرهی رویی که ظاهر میشود، تأیید کنید که میخواهید سطل و محتویات آن را حذف کنید.

- برای حذف مجموعه داده BigQuery ، مراحل زیر را انجام دهید:
- در کنسول گوگل کلود، به صفحه BigQuery بروید.
- در پنجره اکسپلورر ، پروژه خود را گسترش داده و یک مجموعه داده انتخاب کنید.
- منوی سه نقطه را باز کنید و روی «حذف» کلیک کنید.
- در کادر محاورهای حذف مجموعه داده ، عبارت
deleteدر فیلد تایپ کنید و سپس روی حذف کلیک کنید.
- برای حذف سرویس Perimeter مراحل زیر را انجام دهید:
- در کنسول Google Cloud، در سطحی که سیاست دسترسی در آن تعریف شده است، که در این مورد، در سطح پوشه است، گزینه Security و سپس VPC Service Controls را انتخاب کنید.
- در صفحه کنترلهای سرویس VPC، در ردیف جدول مربوط به محیطی که میخواهید حذف کنید، گزینه
Delete Iconانتخاب کنید.
- برای حذف سطح دسترسی ، مراحل زیر را انجام دهید:
- در کنسول گوگل کلود، صفحه Access Context Manager را در محدوده پوشه باز کنید.
- در جدول، ردیف مربوط به سطح دسترسی که میخواهید حذف کنید را مشخص کنید، منوی سه نقطه را انتخاب کنید و سپس حذف را انتخاب کنید.
- برای خاموش کردن پروژهها ، مراحل زیر را انجام دهید:
- در کنسول گوگل کلود، به صفحه تنظیمات مدیریت و دسترسی (IAM & Admin Settings) پروژهای که میخواهید حذف کنید، بروید.
- در صفحه تنظیمات مدیریت و دسترسی (IAM & Admin Settings)، گزینه خاموش کردن (Shutdown) را انتخاب کنید.
- شناسه پروژه را وارد کنید و گزینه «خاموش کردن به هر حال» را انتخاب کنید.
۸. تبریک میگویم!
در این آزمایشگاه کد، شما یک محیط کنترلهای سرویس VPC ایجاد کردید، آن را اجرا کردید و عیبیابی کردید.
بیشتر بدانید
همچنین میتوانید سناریوهای زیر را بررسی کنید:
-
project-1در یک محیط متفاوت اضافه کنید که از BigQuery، سرویس انتقال داده BigQuery و فضای ذخیرهسازی ابری نیز محافظت میکند. - انتقال دادههای BigQuery را از سایر منابع پشتیبانیشده انجام دهید.
- دسترسی کاربر را با ویژگیهای دیگری مانند موقعیت مکانی یا خطمشی دستگاه محدود کنید.
مجوز
این اثر تحت مجوز عمومی Creative Commons Attribution 2.0 منتشر شده است.