1. সংক্ষিপ্ত বিবরণ
এই কোডল্যাবে, আপনি পাইথনে সিক্রেট ম্যানেজার ব্যবহারের উপর মনোযোগ দেবেন।
সিক্রেট ম্যানেজার আপনাকে বাইনারি ব্লব বা টেক্সট স্ট্রিং হিসেবে সিক্রেট সংরক্ষণ, পরিচালনা এবং অ্যাক্সেস করার অনুমতি দেয়। উপযুক্ত অনুমতির মাধ্যমে, আপনি সিক্রেটের বিষয়বস্তু দেখতে পারেন।
সিক্রেট ম্যানেজার রানটাইমের সময় কোনও অ্যাপ্লিকেশনের জন্য প্রয়োজনীয় ডাটাবেস পাসওয়ার্ড, API কী, অথবা TLS সার্টিফিকেটের মতো কনফিগারেশন তথ্য সংরক্ষণের জন্য ভালো কাজ করে।
তুমি কি শিখবে
- ক্লাউড শেল কীভাবে ব্যবহার করবেন
- পাইথনের জন্য সিক্রেট ম্যানেজার ক্লায়েন্ট লাইব্রেরি কীভাবে ইনস্টল করবেন
- পাইথন ক্লায়েন্ট লাইব্রেরি ব্যবহার করে কীভাবে গোপন তথ্য তৈরি এবং অ্যাক্সেস করবেন
- পাইথন ক্লায়েন্ট লাইব্রেরি ব্যবহার করে ক্লাউড ফাংশনে গোপন তথ্য কীভাবে অ্যাক্সেস করবেন
তোমার যা লাগবে
- একটি গুগল ক্লাউড প্রকল্প
- একটি ব্রাউজার, যেমন ক্রোম বা ফায়ারফক্স
- পাইথন ৩ ব্যবহার সম্পর্কে জানা
জরিপ
আপনি এই টিউটোরিয়ালটি কীভাবে ব্যবহার করবেন?
পাইথনের সাথে আপনার অভিজ্ঞতাকে আপনি কীভাবে মূল্যায়ন করবেন?
গুগল ক্লাউড পরিষেবা ব্যবহারের অভিজ্ঞতাকে আপনি কীভাবে মূল্যায়ন করবেন?
2. সেটআপ এবং প্রয়োজনীয়তা
স্ব-গতিসম্পন্ন পরিবেশ সেটআপ
- গুগল ক্লাউড কনসোলে সাইন-ইন করুন এবং একটি নতুন প্রকল্প তৈরি করুন অথবা বিদ্যমান একটি পুনরায় ব্যবহার করুন। যদি আপনার ইতিমধ্যেই একটি জিমেইল বা গুগল ওয়ার্কস্পেস অ্যাকাউন্ট না থাকে, তাহলে আপনাকে অবশ্যই একটি তৈরি করতে হবে।



- এই প্রকল্পের অংশগ্রহণকারীদের জন্য প্রজেক্টের নামটি প্রদর্শন করা হবে। এটি একটি অক্ষর স্ট্রিং যা Google API গুলি ব্যবহার করে না। আপনি যেকোনো সময় এটি আপডেট করতে পারেন।
- সমস্ত Google ক্লাউড প্রোজেক্টে প্রোজেক্ট আইডি অনন্য হতে হবে এবং এটি অপরিবর্তনীয় (সেট করার পরে এটি পরিবর্তন করা যাবে না)। ক্লাউড কনসোল স্বয়ংক্রিয়ভাবে একটি অনন্য স্ট্রিং তৈরি করে; সাধারণত এটি কী তা আপনার বিবেচনার বিষয় নয়। বেশিরভাগ কোডল্যাবে, আপনাকে প্রোজেক্ট আইডি উল্লেখ করতে হবে (এটি সাধারণত
PROJECT_IDহিসাবে চিহ্নিত করা হয়)। যদি আপনি জেনারেট করা আইডি পছন্দ না করেন, তাহলে আপনি অন্য একটি র্যান্ডম তৈরি করতে পারেন। বিকল্পভাবে, আপনি নিজের চেষ্টা করে দেখতে পারেন যে এটি উপলব্ধ কিনা। এই ধাপের পরে এটি পরিবর্তন করা যাবে না এবং প্রকল্পের সময়কালের জন্য থাকবে। - আপনার তথ্যের জন্য, তৃতীয় একটি মান আছে, একটি প্রকল্প নম্বর যা কিছু API ব্যবহার করে। ডকুমেন্টেশনে এই তিনটি মান সম্পর্কে আরও জানুন।
- এরপর, ক্লাউড রিসোর্স/API ব্যবহার করার জন্য আপনাকে ক্লাউড কনসোলে বিলিং সক্ষম করতে হবে। এই কোডল্যাবটি চালানোর জন্য খুব বেশি খরচ হবে না, এমনকি কিছু খরচও হবে না। এই টিউটোরিয়ালের পরে যাতে আপনাকে বিলিং করতে না হয় সেজন্য রিসোর্সগুলি বন্ধ করতে, আপনি আপনার তৈরি রিসোর্সগুলি মুছে ফেলতে পারেন অথবা পুরো প্রকল্পটি মুছে ফেলতে পারেন। গুগল ক্লাউডের নতুন ব্যবহারকারীরা $300 USD ফ্রি ট্রায়াল প্রোগ্রামের জন্য যোগ্য।
ক্লাউড শেল শুরু করুন
যদিও গুগল ক্লাউড আপনার ল্যাপটপ থেকে দূরবর্তীভাবে পরিচালিত হতে পারে, এই কোডল্যাবে আপনি গুগল ক্লাউড শেল ব্যবহার করবেন, যা ক্লাউডে চলমান একটি কমান্ড লাইন পরিবেশ।
ক্লাউড শেল সক্রিয় করুন
- ক্লাউড কনসোল থেকে, ক্লাউড শেল সক্রিয় করুন ক্লিক করুন
.

যদি আপনি আগে কখনও ক্লাউড শেল শুরু না করে থাকেন, তাহলে আপনাকে একটি মধ্যবর্তী স্ক্রিন (ভাঁজের নীচে) দেখানো হবে যেখানে এটি কী তা বর্ণনা করা হবে। যদি তাই হয়, তাহলে Continue এ ক্লিক করুন (এবং আপনি এটি আর কখনও দেখতে পাবেন না)। এই এককালীন স্ক্রিনটি কেমন দেখাবে:

ক্লাউড শেলের সাথে সংযোগ স্থাপন এবং সংযোগ স্থাপন করতে মাত্র কয়েক মুহূর্ত সময় লাগবে।

এই ভার্চুয়াল মেশিনটি আপনার প্রয়োজনীয় সকল ডেভেলপমেন্ট টুল দিয়ে পূর্ণ। এটি একটি স্থায়ী 5GB হোম ডিরেক্টরি অফার করে এবং Google Cloud-এ চলে, যা নেটওয়ার্ক কর্মক্ষমতা এবং প্রমাণীকরণকে ব্যাপকভাবে উন্নত করে। এই কোডল্যাবে আপনার বেশিরভাগ কাজ, যদি সব না হয়, কেবল একটি ব্রাউজার বা আপনার Chromebook দিয়ে করা যেতে পারে।
একবার ক্লাউড শেলের সাথে সংযুক্ত হয়ে গেলে, আপনি দেখতে পাবেন যে আপনি ইতিমধ্যেই প্রমাণিত এবং প্রকল্পটি ইতিমধ্যেই আপনার প্রকল্প আইডিতে সেট করা আছে।
- আপনি প্রমাণিত কিনা তা নিশ্চিত করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান:
gcloud auth list
কমান্ড আউটপুট
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- gcloud কমান্ড আপনার প্রকল্প সম্পর্কে জানে কিনা তা নিশ্চিত করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান:
gcloud config list project
কমান্ড আউটপুট
[core] project = <PROJECT_ID>
যদি তা না হয়, তাহলে আপনি এই কমান্ড দিয়ে এটি সেট করতে পারেন:
gcloud config set project <PROJECT_ID>
কমান্ড আউটপুট
Updated property [core/project].
৩. সিক্রেট ম্যানেজার API সক্রিয় করুন
সিক্রেট ম্যানেজার API ব্যবহার শুরু করার আগে, আপনাকে API সক্রিয় করতে হবে। ক্লাউড শেল ব্যবহার করে, আপনি নিম্নলিখিত কমান্ড দিয়ে API সক্রিয় করতে পারেন:
gcloud services enable secretmanager.googleapis.com
তুমি এইরকম আউটপুট দেখতে পাবে:
Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.
৪. পাইথনের জন্য সিক্রেট ম্যানেজার ক্লায়েন্ট লাইব্রেরি ইনস্টল করা
সিক্রেট ম্যানেজার ক্লায়েন্ট লাইব্রেরি ইনস্টল করুন:
pip3 install --user google-cloud-secret-manager==2.10.0
৫. ইন্টারেক্টিভ পাইথন শুরু করুন
এই টিউটোরিয়ালের অংশ হিসেবে, আপনি IPython নামক একটি ইন্টারেক্টিভ পাইথন ইন্টারপ্রেটার ব্যবহার করবেন, যা ক্লাউড শেলে আগে থেকে ইনস্টল করা আছে। ক্লাউড শেলে ipython চালিয়ে একটি সেশন শুরু করুন:
ipython
তোমার এরকম কিছু দেখা উচিত:
Python 3.9.2 (default, Feb 28 2021, 17:03:44) Type 'copyright', 'credits' or 'license' for more information IPython 8.3.0 -- An enhanced Interactive Python. Type '?' for help. In [1]:
৬. গোপন তথ্য তৈরি করা
একটি গোপনে এক বা একাধিক গোপন সংস্করণ থাকে। এগুলি gcloud কমান্ড-লাইন ব্যবহার করে তৈরি করা যেতে পারে, তবে এগুলি পাইথন ব্যবহার করেও তৈরি করা যেতে পারে।
একটি গোপনীয়তা ব্যবহার করার জন্য, আপনাকে প্রথমে গোপনীয়তার নাম দিয়ে গোপনীয়তা তৈরি করতে হবে, তারপর আপনি গোপনীয়তার একটি সংস্করণ যোগ করবেন, যা গোপনীয়তার মান ।
IPython-এর মধ্যে আপনার প্রজেক্ট আইডি সেট করুন:
PROJECT_ID = "<PROJECT_ID>"
একটি গোপন তথ্য তৈরি করুন
আপনার আইপিথন সেশনে নিম্নলিখিত কোডটি কপি করুন:
from google.cloud import secretmanager
def create_secret(secret_id):
# Create the Secret Manager client.
client = secretmanager.SecretManagerServiceClient()
# Build the resource name of the parent project.
parent = f"projects/{PROJECT_ID}"
# Build a dict of settings for the secret
secret = {'replication': {'automatic': {}}}
# Create the secret
response = client.create_secret(secret_id=secret_id, parent=parent, secret=secret)
# Print the new secret name.
print(f'Created secret: {response.name}')
my_secret_value নামক একটি নতুন গোপনীয়তা তৈরি করতে ফাংশনটি কল করুন:
create_secret("my_secret_value")
আপনার নিম্নলিখিত আউটপুটটি দেখতে হবে:
Created secret: projects/<PROJECT_NUM>/secrets/my_secret_value
একটি গোপন সংস্করণ যোগ করুন
এখন যেহেতু গোপন রহস্যটি বিদ্যমান, আপনি একটি সংস্করণ তৈরি করে এটির একটি মান নির্ধারণ করতে পারেন।
আপনার আইপিথন সেশনে নিম্নলিখিত কোডটি কপি করুন:
def add_secret_version(secret_id, payload):
# Create the Secret Manager client.
client = secretmanager.SecretManagerServiceClient()
# Build the resource name of the parent secret.
parent = f"projects/{PROJECT_ID}/secrets/{secret_id}"
# Convert the string payload into a bytes. This step can be omitted if you
# pass in bytes instead of a str for the payload argument.
payload = payload.encode('UTF-8')
# Add the secret version.
response = client.add_secret_version(parent=parent, payload={'data': payload})
# Print the new secret version name.
print(f'Added secret version: {response.name}')
একটি নতুন গোপন সংস্করণ যোগ করতে ফাংশনটি কল করুন:
add_secret_version("my_secret_value", "Hello Secret Manager")
আপনার নিম্নলিখিত আউটপুটটি দেখতে হবে:
Added secret version: projects/<PROJECT_NUM>/secrets/my_secret_value/versions/1
Secrets এর একাধিক সংস্করণ থাকতে পারে। ফাংশনটিকে আবার একটি ভিন্ন মান দিয়ে কল করুন:
add_secret_version("my_secret_value", "Hello Again, Secret Manager")
আপনার নিম্নলিখিত আউটপুটটি দেখতে হবে:
Added secret version: projects/<PROJECT_NUM>/secrets/my_secret_value/versions/2
লক্ষ্য করুন, আমাদের গোপন সংস্করণের নতুন সংস্করণটি আমাদের মূল সংস্করণের চেয়ে উল্লেখযোগ্যভাবে দীর্ঘ। এই বৈশিষ্ট্যটি পরে উল্লেখ করা হবে।
৭. গোপন তথ্য অ্যাক্সেস করা
একটি গোপন সংস্করণ অ্যাক্সেস করলে গোপন বিষয়বস্তু, সেইসাথে গোপন সংস্করণ সম্পর্কে অতিরিক্ত মেটাডেটা ফেরত আসে। যখন আপনি একটি গোপন সংস্করণ অ্যাক্সেস করেন, তখন আপনি হয় একটি নির্দিষ্ট সংস্করণ নির্দিষ্ট করতে পারেন, অথবা "সর্বশেষ" উল্লেখ করে কেবল সর্বশেষ সংস্করণের জন্য জিজ্ঞাসা করতে পারেন।
গোপনীয়তা গোপন রাখা উচিত। ডাটাবেস শংসাপত্রগুলিকে গোপনীয়তা হিসাবে সংরক্ষণ করুন এবং তারপরে প্রমাণীকরণের জন্য ব্যবহার করুন, অথবা সার্টিফিকেশন সংরক্ষণ করুন এবং সেগুলি ব্যবহার করুন; কিন্তু আপনার গোপনীয়তা সরাসরি মুদ্রণ করবেন না, কারণ এতে গোপন রাখার উদ্দেশ্য ব্যর্থ হয়।
তুমি আমাদের গোপন তথ্যের উপর অপারেশন করবে, সরাসরি প্রিন্ট না করে এর মূল্য মূল্যায়ন করবে। পরিবর্তে তুমি গোপন তথ্যের মূল্যের একটি হ্যাশ প্রিন্ট করবে।
আপনার আইপিথন সেশনে নিম্নলিখিত কোডটি কপি করুন:
def access_secret_version(secret_id, version_id="latest"):
# Create the Secret Manager client.
client = secretmanager.SecretManagerServiceClient()
# Build the resource name of the secret version.
name = f"projects/{PROJECT_ID}/secrets/{secret_id}/versions/{version_id}"
# Access the secret version.
response = client.access_secret_version(name=name)
# Return the decoded payload.
return response.payload.data.decode('UTF-8')
import hashlib
def secret_hash(secret_value):
# return the sha224 hash of the secret value
return hashlib.sha224(bytes(secret_value, "utf-8")).hexdigest()
ফাংশনটিকে কল করে এর মানের হ্যাশ হিসেবে সিক্রেটটি উদ্ধার করুন:
secret_hash(access_secret_version("my_secret_value"))
আপনার এমন আউটপুট দেখা উচিত যা হ্যাশের মতো (সঠিক মান এই আউটপুটের সাথে নাও মিলতে পারে):
83f8a4edb555cde4271029354395c9f4b7d79706ffa90c746e021d11
যেহেতু আপনি কোনও সংস্করণ নির্দিষ্ট করেননি, তাই সর্বশেষ মানটি পুনরুদ্ধার করা হয়েছে।
নিশ্চিত করার জন্য প্রত্যাশিত সংস্করণ নম্বর যোগ করে ফাংশনটিতে কল করুন:
secret_hash(access_secret_version("my_secret_value", version_id=2))
আপনি শেষ কমান্ডের মতো একই আউটপুট দেখতে পাবেন:
83f8a4edb555cde4271029354395c9f4b7d79706ffa90c746e021d11
ফাংশনটি আবার কল করুন, কিন্তু এবার প্রথম সংস্করণটি উল্লেখ করে:
secret_hash(access_secret_version("my_secret_value", version_id=1))
এবার আপনার একটি ভিন্ন হ্যাশ দেখা উচিত, যা একটি ভিন্ন আউটপুট নির্দেশ করে:
9a3fc8b809ddc611c82aee950c636c7557e220893560ec2c1eeeb177
৮. ক্লাউড ফাংশন সহ সিক্রেট ম্যানেজার ব্যবহার করা
গুগল ক্লাউডের অনেক অংশের গোপন তথ্য ব্যবহার করতে পারেন। এই বিভাগে, আপনি ক্লাউড ফাংশনের উপর আলোকপাত করবেন, যা গুগলের ইভেন্ট-চালিত সার্ভারলেস কম্পিউট অফার।
আপনি যদি ক্লাউড ফাংশনে পাইথন ব্যবহার করতে আগ্রহী হন, তাহলে আপনি পাইথন কোডল্যাবে HTTP গুগল ক্লাউড ফাংশন অনুসরণ করতে পারেন।
exit ফাংশনটি কল করে IPython বন্ধ করুন:
exit
আপনাকে আপনার ক্লাউড শেলে ফিরিয়ে আনা উচিত:
yourname@cloudshell:~ (<PROJECT_ID>)$
ক্লাউড ফাংশন API ব্যবহার শুরু করার আগে, আপনাকে API সক্রিয় করতে হবে। ক্লাউড শেল ব্যবহার করে, আপনি নিম্নলিখিত কমান্ড দিয়ে API সক্রিয় করতে পারেন:
gcloud services enable cloudfunctions.googleapis.com cloudbuild.googleapis.com
আমাদের ফাংশন তৈরি করার জন্য একটি নতুন ফোল্ডার তৈরি করুন, যেখানে লেখার জন্য খালি ফাইল তৈরি করুন:
mkdir secret-manager-api-demo cd secret-manager-api-demo touch main.py touch requirements.txt
ক্লাউড শেলের উপরের ডান দিক থেকে কোড এডিটরটি খুলুন:

secret-manager-api-demo ফোল্ডারের ভিতরে main.py ফাইলে যান। এখানেই আপনি আপনার সমস্ত কোড রাখবেন।
৯. গোপন তথ্য অ্যাক্সেস করার জন্য একটি ক্লাউড ফাংশন লেখা
কমান্ড লাইন বা আইপিথন টার্মিনাল থেকে গোপন মান সংরক্ষণ এবং পুনরুদ্ধার করা কার্যকর হলেও, একটি ফাংশনের মধ্যে এই গোপনীয়তাগুলি অ্যাক্সেস করতে সক্ষম হওয়া অনেক বেশি কার্যকর।
আপনার আগে তৈরি করা access_secret_version ফাংশনটি ব্যবহার করে, আপনি এটিকে আপনার ক্লাউড ফাংশনের ভিত্তি হিসেবে ব্যবহার করতে পারেন।
নিম্নলিখিত কোডটি main.py ফাইলে কপি করুন:
main.py সম্পর্কে
import os
from google.cloud import secretmanager
project_id = os.environ["PROJECT_ID"]
client = secretmanager.SecretManagerServiceClient()
name = f"projects/{project_id}/secrets/my_secret_value/versions/latest"
response = client.access_secret_version(name=name)
my_secret_value = response.payload.data.decode("UTF-8")
def secret_hello(request):
if "Again" in my_secret_value:
return "We meet again!\n"
return "Hello there.\n"
আপনার ফাংশন স্থাপন করার আগে, আপনাকে পরিবেশের সেটআপ চূড়ান্ত করতে হবে। এর জন্য আপনাকে আপনার ফাংশন নির্ভরতা সেট আপ করতে হবে।
requirements.txt নামে একটি নতুন ফাইল তৈরি করুন এবং এতে google-cloud-secret-manager প্যাকেজটি যুক্ত করুন:
requirements.txt ফাইল
google-cloud-secret-manager==2.10.0
এখন আপনার কাছে একটি ফোল্ডার থাকা উচিত যেখানে কেবল একটি main.py এবং একটি requirements.txt থাকবে।
আপনার গোপন তথ্যে অ্যাক্সেসের অনুমতি দেওয়া
আপনার ফাংশন স্থাপন করার আগে, আপনাকে ক্লাউড ফাংশনগুলিকে আপনার গোপনীয়তা অ্যাক্সেস করার ক্ষমতা দিতে হবে।
টার্মিনালে ফিরে যান:

আপনার গোপনীয়তা অ্যাক্সেস করতে ক্লাউড ফাংশন সার্ভিস অ্যাকাউন্টে অ্যাক্সেস দিন:
export PROJECT_ID=$(gcloud config get-value core/project)
gcloud secrets add-iam-policy-binding my_secret_value \
--role roles/secretmanager.secretAccessor \
--member serviceAccount:${PROJECT_ID}@appspot.gserviceaccount.com
আপনার নিম্নলিখিত আউটপুটটি দেখতে হবে:
Updated IAM policy for secret [my_secret_value]. bindings: - members: - serviceAccount:<PROJECT_ID>@appspot.gserviceaccount.com role: roles/secretmanager.secretAccessor etag: BwWiRUt2oB4= version: 1
১০. আপনার ক্লাউড ফাংশন স্থাপন করা
পূর্ববর্তী বিভাগগুলিতে আপনার সেটআপের ভিত্তিতে, আপনি এখন আপনার ক্লাউড ফাংশন স্থাপন এবং পরীক্ষা করতে পারেন।
আপনার তৈরি করা মাত্র দুটি ফাইল সম্বলিত ফোল্ডারের মধ্যে, ফাংশনটি স্থাপন করুন:
gcloud functions deploy secret_hello \
--runtime python39 \
--set-env-vars PROJECT_ID=${PROJECT_ID} \
--trigger-http \
--allow-unauthenticated
আপনি নিম্নলিখিত আউটপুট দেখতে পাবেন (ছাঁটা):
Deploying function (may take a while - up to 2 minutes)...done. ... entryPoint: secret_hello httpsTrigger: url: https://<REGION>-<PROJECT_ID>.cloudfunctions.net/secret_hello ... status: ACTIVE ...
নিম্নলিখিত কমান্ড ব্যবহার করে আপনার ফাংশনের URL ( httpsTrigger.url মেটাডেটা ) পুনরুদ্ধার করুন:
FUNCTION_URL=$(gcloud functions describe secret_hello --format 'value(httpsTrigger.url)')
এখন, ফাংশনটি প্রত্যাশিত রিটার্ন মান দিয়ে অ্যাক্সেস করা যেতে পারে তা পরীক্ষা করুন, আপনার ফাংশনটি কল করে:
curl $FUNCTION_URL
আপনার নিম্নলিখিত আউটপুটটি দেখতে হবে:
We meet again!
এই ফাংশনটি সিক্রেটের সাম্প্রতিকতম সংস্করণটিকে উল্লেখ করে, যা "Again" স্ট্রিং ধারণ করার জন্য সেট করা হয়েছিল, তাই এই ফাংশনটি প্রত্যাশা অনুযায়ী কাজ করছে।
১১. অভিনন্দন!
তুমি পাইথন ব্যবহার করে সিক্রেট ম্যানেজার API ব্যবহার করতে শিখেছো!
পরিষ্কার করা
এই টিউটোরিয়ালে ব্যবহৃত রিসোর্সের জন্য আপনার গুগল ক্লাউড অ্যাকাউন্টে চার্জ এড়াতে:
- ক্লাউড কনসোলে, রিসোর্স পরিচালনা পৃষ্ঠায় যান।
- প্রকল্পের তালিকায়, আপনার প্রকল্পটি নির্বাচন করুন এবং তারপর মুছুন ক্লিক করুন।
- ডায়ালগে, প্রজেক্ট আইডি টাইপ করুন এবং তারপর প্রজেক্টটি মুছে ফেলতে Shut down এ ক্লিক করুন।
আরও জানুন
- সিক্রেট ম্যানেজার: https://cloud.google.com/secret-manager/
- গুগল ক্লাউডে পাইথন: https://cloud.google.com/python/
- পাইথনের জন্য ক্লাউড ক্লায়েন্ট লাইব্রেরি: https://googlecloudplatform.github.io/google-cloud-python/
লাইসেন্স
এই কাজটি ক্রিয়েটিভ কমন্স অ্যাট্রিবিউশন ২.০ জেনেরিক লাইসেন্সের অধীনে লাইসেন্সপ্রাপ্ত।