۱. مرور کلی
در سازمانهای امروزی، حجم دادهها از منابع مختلف به طور فزایندهای افزایش مییابد. این امر اغلب مستلزم قرنطینه و طبقهبندی دادهها به منظور ذخیره و محافظت استراتژیک از آنها است - کاری که اگر به صورت دستی انجام شود، به سرعت پرهزینه و غیرممکن خواهد شد.
در این آزمایشگاه کد، خواهیم دید که چگونه میتوانیم دادههای آپلود شده در فضای ابری را به طور خودکار طبقهبندی کرده و آن را به یک مخزن ذخیرهسازی مربوطه منتقل کنیم. ما این کار را با استفاده از Cloud Pub/Sub، Cloud Functions، Cloud Data Loss Prevention و Cloud Storage انجام خواهیم داد.
کاری که انجام خواهید داد
- ایجاد سطلهای ذخیرهسازی ابری برای استفاده به عنوان بخشی از خط لوله قرنطینه و طبقهبندی.
- یک تابع ابری ساده ایجاد کنید که هنگام آپلود فایلها، DLP API را فراخوانی کند.
- یک موضوع انتشار/زیرموضوع و اشتراک ایجاد کنید تا پس از اتمام پردازش فایل، به شما اطلاع داده شود.
- فایلهای نمونه را برای فراخوانی یک تابع ابری به سطل قرنطینه آپلود کنید
- از DLP API برای بررسی و طبقهبندی فایلها و انتقال آنها به سطل مناسب استفاده کنید.
آنچه نیاز دارید
- یک پروژه گوگل کلود با تنظیمات صورتحساب. اگر ندارید، باید یکی ایجاد کنید .
۲. راهاندازی
در طول این آزمایشگاه کد، ما منابع و سرویسهای ابری مختلف را با استفاده از خط فرمان از طریق Cloud Shell فراهم و مدیریت خواهیم کرد. دستور زیر Cloud Shell را به همراه ویرایشگر Cloud Shell باز کرده و مخزن پروژه همراه را کلون میکند:
با تنظیم آن با gcloud config set project [PROJECT_ID] مطمئن شوید که از پروژه صحیح استفاده میکنید.
فعال کردن APIها
API های مورد نیاز را در پروژه Google Cloud خود فعال کنید:
- API توابع ابری - توابع سبک ارائه شده توسط کاربر را که در پاسخ به رویدادها اجرا میشوند، مدیریت میکند.
- رابط برنامهنویسی کاربردی پیشگیری از نشت دادههای ابری (DLP) - روشهایی را برای تشخیص، تحلیل ریسک و شناساییزدایی قطعات حساس به حریم خصوصی در متن، تصاویر و مخازن ذخیرهسازی پلتفرم ابری گوگل ارائه میدهد.
- فضای ذخیرهسازی ابری - فضای ذخیرهسازی ابری گوگل یک سرویس RESTful برای ذخیره و دسترسی به دادههای شما در زیرساخت گوگل است.
مجوزهای حسابهای سرویس
حساب کاربری سرویس، نوع خاصی از حساب کاربری است که توسط برنامهها و ماشینهای مجازی برای برقراری تماسهای API مجاز استفاده میشود.
حساب سرویس پیشفرض موتور برنامه
حساب سرویس پیشفرض App Engine برای اجرای وظایف در پروژه Cloud شما به نمایندگی از برنامههایی که در App Engine اجرا میشوند، استفاده میشود. این حساب سرویس به طور پیشفرض در پروژه شما با نقش ویرایشگر اختصاص داده شده وجود دارد.
ابتدا، به حساب کاربری سرویس خود، نقش مدیر DLP را اعطا میکنیم که برای مدیریت وظایف پیشگیری از دست رفتن دادهها لازم است:
gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \ --member serviceAccount:$GOOGLE_CLOUD_PROJECT@appspot.gserviceaccount.com \ --role roles/dlp.admin
و در نهایت، نقش DLP API Service Agent را اعطا کنید که مجوزهای حساب سرویس را برای bigquery، storage، datastore، pubsub و سرویس مدیریت کلید فراهم میکند:
gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \ --member serviceAccount:$GOOGLE_CLOUD_PROJECT@appspot.gserviceaccount.com \ --role roles/dlp.serviceAgent
حساب کاربری سرویس DLP
علاوه بر حساب کاربری سرویس App Engine، از یک حساب کاربری سرویس DLP نیز استفاده خواهیم کرد. این حساب کاربری سرویس به طور خودکار هنگام فعال شدن DLP API ایجاد شده است و در ابتدا هیچ نقشی به آن اعطا نشده است. بیایید به آن نقش بیننده (viewer) بدهیم:
gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \ --member serviceAccount:service-`gcloud projects list --filter="PROJECT_ID:$GOOGLE_CLOUD_PROJECT" --format="value(PROJECT_NUMBER)"`@dlp-api.iam.gserviceaccount.com \ --role roles/viewer
۳. سطلهای ذخیرهسازی ابری
حالا باید ۳ فضای ذخیرهسازی ابری برای ذخیره دادههایمان ایجاد کنیم:
- سطل قرنطینه: دادههای ما ابتدا اینجا آپلود میشوند.
- سطل دادههای حساس: دادههایی که توسط DLP API حساس تشخیص داده میشوند، به اینجا منتقل میشوند.
- سطل دادههای غیرحساس: دادههایی که توسط DLP API حساس تشخیص داده نمیشوند، به اینجا منتقل میشوند.
میتوانیم از دستور gsutil برای ایجاد هر سه سطل خود در یک مرحله استفاده کنیم:
gsutil mb gs://[YOUR_QUARANTINE_BUCKET] \ gs://[YOUR_SENSITIVE_DATA_BUCKET] \ gs://[YOUR_NON_SENSITIVE_DATA_BUCKET]
نام سطلهایی که ایجاد کردهاید را یادداشت کنید - بعداً به آنها نیاز خواهیم داشت.
۴. انتشار/زیرموضوع و اشتراک
Cloud Pub/Sub پیامرسانی ناهمزمان چند به چند را بین برنامهها فراهم میکند. یک ناشر پیامی ایجاد میکند و آن را در فیدی از پیامها به نام موضوع منتشر میکند. یک مشترک این پیامها را از طریق اشتراک دریافت میکند. بر اساس آن اشتراک، در مورد ما، یک تابع ابری خواهیم داشت که پس از اجرای یک کار DLP، فایلها را به سطلهای مربوطه منتقل میکند.
ابتدا، بیایید یک موضوع (topic) ایجاد کنیم. هر بار که فایلی به سطل ذخیرهسازی قرنطینه ما اضافه میشود، پیامی در اینجا منتشر میشود. ما آن را «classify-topic» نامگذاری خواهیم کرد.
gcloud pubsub topics create classify-topic
وقتی تاپیک پیامی منتشر میکند، به اشتراک اطلاع داده میشود. بیایید یک اشتراک pubsub با نام 'classify-sub' ایجاد کنیم:
gcloud pubsub subscriptions create classify-sub --topic classify-topic
این اشتراک، یک تابع ابری دوم را فعال میکند که یک کار DLP را آغاز میکند که فایل را بررسی کرده و آن را به مکان مناسب خود منتقل میکند.
۵. عملکردهای ابری
توابع ابری به ما این امکان را میدهند که توابع تکمنظوره سبک، مبتنی بر رویداد و غیرهمزمان را بدون نیاز به مدیریت سرور یا محیط زمان اجرا، پیادهسازی کنیم. ما قصد داریم دو تابع ابری را با استفاده از فایل main.py ارائه شده، واقع در dlp-cloud-functions-tutorials/gcs-dlp-classification-python/ پیادهسازی کنیم.
جایگزینی متغیرها
قبل از اینکه بتوانیم توابع خود را ایجاد کنیم، باید برخی از متغیرها را در فایل main.py خود جایگزین کنیم.
در ویرایشگر Cloud Shell، فایل main.py را با جایگزینی مقادیر شناسه پروژه و متغیرهای سطل در خطوط ۲۸ تا ۳۴ با استفاده از سطلهای مربوطه که قبلاً ایجاد شدهاند، تنظیم کنید:
فایل اصلی.py
PROJECT_ID = '[PROJECT_ID_HOSTING_STAGING_BUCKET]'
"""The bucket the to-be-scanned files are uploaded to."""
STAGING_BUCKET = '[YOUR_QUARANTINE_BUCKET]'
"""The bucket to move "sensitive" files to."""
SENSITIVE_BUCKET = '[YOUR_SENSITIVE_DATA_BUCKET]'
"""The bucket to move "non sensitive" files to."""
NONSENSITIVE_BUCKET = '[YOUR_NON_SENSITIVE_DATA_BUCKET]'
علاوه بر این، مقدار متغیر pub/sub topic را با pub/sub topic ایجاد شده در مرحله قبل جایگزین کنید:
""" Pub/Sub topic to notify once the DLP job completes."""
PUB_SUB_TOPIC = 'classify-topic'
توابع را مستقر کنید
در Cloud Shell خود، دایرکتوریها را به gcs-dlp-classification-python که فایل main.py در آن قرار دارد، تغییر دهید:
cd ~/cloudshell_open/dlp-cloud-functions-tutorials/gcs-dlp-classification-python
وقت آن رسیده که برخی از توابع را مستقر کنیم.
ابتدا، تابع create_DLP_job را پیادهسازی کنید و [YOUR_QUARANTINE_BUCKET] را با نام صحیح سطل جایگزین کنید. این تابع زمانی فعال میشود که فایلهای جدید در سطل قرنطینه تعیینشده Cloud Storage آپلود شوند و برای هر فایل آپلود شده یک DLP job ایجاد میکند:
gcloud functions deploy create_DLP_job --runtime python37 \ --trigger-event google.storage.object.finalize \ --trigger-resource [YOUR_QUARANTINE_BUCKET]
در مرحله بعد، تابع resolve_DLP را مستقر کنید و موضوع خود را به عنوان محرک آن مشخص کنید. این تابع به اعلان pub/sub که از کار DLP بعدی از تابع بالا آغاز شده است، گوش میدهد. به محض دریافت اعلان pub/sub، نتایج کار DLP را دریافت میکند و فایل را به ترتیب به سطل حساس یا سطل غیر حساس منتقل میکند:
gcloud functions deploy resolve_DLP --runtime python37 \ --trigger-topic classify-topic
تأیید
تأیید کنید که هر دو تابع ابری ما با موفقیت با دستور gcloud functions describe مستقر شدهاند:
gcloud functions describe create_DLP_job
gcloud functions describe resolve_DLP
خروجی، وضعیت ACTIVE را در صورت موفقیتآمیز بودن استقرار، نشان میدهد.
۶. با دادههای نمونه آزمایش کنید
با قرار گرفتن همه قطعات در جای خود، اکنون میتوانیم موارد را با چند فایل نمونه آزمایش کنیم. در Cloud Shell خود، دایرکتوری کاری فعلی خود را به sample_data تغییر دهید:
cd ~/cloudshell_open/dlp-cloud-functions-tutorials/sample_data
فایلهای نمونه ما شامل فایلهای txt و csv هستند که حاوی دادههای مختلفی میباشند. فایلهایی که با پیشوند 'sample_s' هستند حاوی دادههای حساس هستند در حالی که فایلهایی که با پیشوند 'sample_n' هستند حاوی این دادهها نیستند. به عنوان مثال، sample_s20.csv شامل چیزی است که به گونهای قالببندی شده است که شبیه شمارههای تأمین اجتماعی ایالات متحده باشد:
sample_s20.csv
Name,SSN,metric 1,metric 2
Maria Johnson,284-73-5110,5,43
Tyler Parker,284-73-5110,8,17
Maria Johnson,284-73-5110,54,63
Maria Johnson,245-25-8698,53,19
Tyler Parker,475-15-8499,6,67
Maria Johnson,719-12-6560,75,83
Maria Johnson,616-69-3226,91,13
Tzvika Roberts,245-25-8698,94,61
از سوی دیگر، دادههای موجود در sample_n15.csv حساس تلقی نمیشوند:
sample_n15.csv
record id,metric 1,metric 2,metric 3
1,59,93,100
2,53,13,17
3,59,67,53
4,52,93,34
5,14,22,88
6,18,88,3
7,32,49,5
8,93,46,14
برای اینکه ببینیم تنظیمات ما چگونه با فایلهایمان رفتار خواهد کرد، بیایید تمام فایلهای آزمایشی خود را در قرنطینه آپلود کنیم.
سطل:
gsutil -m cp * gs://[YOUR_QUARANTINE_BUCKET]
در ابتدا، فایلهای ما در سطل قرنطینهای که آنها را در آن آپلود کردهایم، قرار میگیرند. برای تأیید این موضوع، بلافاصله پس از آپلود فایلها، محتوای سطل قرنطینه را فهرست کنید:
gsutil ls gs://[YOUR_QUARANTINE_BUCKET]
برای بررسی مجموعه رویدادهایی که آغاز کردهایم، با رفتن به صفحه توابع ابری شروع کنید:
روی منوی Actions برای تابع create_DLP_job کلیک کنید و View Logs را انتخاب کنید:

در گزارش این تابع، حداقل ۴ ورودی برای هر یک از فایلهایمان میبینیم که نشان میدهد:
- اجرای تابع آغاز شد
- این تابع برای یک فایل خاص فعال شده بود.
- شغلی ایجاد شده بود
- اجرای تابع به پایان رسیده بود

پس از اتمام تابع create_DLP_job برای هر فایل، یک کار DLP مربوطه آغاز میشود. برای مشاهده لیستی از کارهای DLP در صف، به صفحه کارهای DLP بروید:
لیستی از کارهای در حال انتظار، در حال اجرا یا انجام شده را مشاهده خواهید کرد. هر یک از آنها مربوط به یکی از فایلهایی است که آپلود کردهایم:

برای مشاهده جزئیات بیشتر میتوانید روی شناسه هر یک از این مشاغل کلیک کنید.
اگر به صفحه توابع ابری برگردید و گزارشهای مربوط به تابع resolve_DLP را بررسی کنید، حداقل ۸ ورودی برای هر فایل مشاهده خواهید کرد که نشان میدهد:
- اجرای تابع آغاز شد
- یک اعلان مربوط به میخانه/ساب دریافت شد
- نام کار DLP مربوطه
- یک کد وضعیت
- تعداد نمونههای دادههای حساس (در صورت وجود)
- باکتی که فایل به آن منتقل خواهد شد
- کار DLP تجزیه فایل را به پایان رسانده است.
- اجرای تابع به پایان رسیده بود

به محض اینکه اجرای تمام فراخوانیهای تابع resolve_DLP به پایان رسید، محتویات سطل قرنطینه را یک بار دیگر بررسی کنید:
gsutil ls gs://[YOUR_QUARANTINE_BUCKET]
این بار، باید کاملاً خالی باشد. با این حال، اگر همین دستور بالا را برای سایر سطلها اجرا کنید، خواهید دید که فایلهای ما کاملاً در سطلهای مربوطهشان جدا شدهاند!
۷. پاکسازی
حالا که دیدیم چگونه میتوان از DLP API در کنار Cloud Functions برای طبقهبندی دادهها استفاده کرد، بیایید پروژه خود را از تمام منابعی که ایجاد کردهایم، پاکسازی کنیم.
حذف پروژه
اگر ترجیح میدهید، میتوانید کل پروژه را حذف کنید. در کنسول GCP، به صفحه Cloud Resource Manager بروید:
در لیست پروژهها، پروژهای را که روی آن کار میکردیم انتخاب کرده و روی «حذف» کلیک کنید. از شما خواسته میشود شناسه پروژه را وارد کنید. آن را وارد کرده و روی «خاموش کردن» کلیک کنید.
از طرف دیگر، میتوانید کل پروژه را مستقیماً از Cloud Shell با gcloud حذف کنید:
gcloud projects delete [PROJECT_ID]
اگر ترجیح میدهید اجزای مختلف را یکی یکی حذف کنید، به بخش بعدی بروید.
توابع ابری
هر دو تابع ابری ما را با gcloud حذف کنید:
gcloud functions delete -q create_DLP_job && gcloud functions delete -q resolve_DLP
سطلهای ذخیرهسازی
تمام فایلهای آپلود شده را حذف کنید و باکتها را با gsutil حذف کنید:
gsutil rm -r gs://[YOUR_QUARANTINE_BUCKET] \ gs://[YOUR_SENSITIVE_DATA_BUCKET] \ gs://[YOUR_NON_SENSITIVE_DATA_BUCKET]
میخانه/ساب
ابتدا اشتراک pub/sub را با gcloud حذف کنید:
gcloud pubsub subscriptions delete classify-sub
و در آخر، موضوع pub/sub را با gcloud حذف کنید:
gcloud pubsub topics delete classify-topic
۸. تبریک میگویم!
هورا! شما موفق شدید. شما یاد گرفتید که چگونه از DLP API به همراه توابع ابری برای خودکارسازی طبقهبندی فایلها استفاده کنید!
آنچه ما پوشش دادهایم
- ما سطلهای ذخیرهسازی ابری را برای ذخیره دادههای حساس و غیرحساس خود ایجاد کردیم
- ما یک موضوع Pub/Sub و اشتراک ایجاد کردیم تا یک عملکرد ابری را فعال کنیم.
- ما توابع ابری را ایجاد کردیم که برای شروع یک کار DLP طراحی شدهاند و فایلها را بر اساس دادههای حساس موجود در آنها دستهبندی میکنند.
- ما دادههای آزمایشی را آپلود کردیم و لاگهای Stackdriver مربوط به Cloud Functions خود را بررسی کردیم تا روند کار را در عمل مشاهده کنیم.