আপনি Apigee Edge-এর ডকুমেন্টেশন দেখছেন।
Apigee X ডকুমেন্টেশন .info- তে যান।
কী
- ইনবাউন্ড প্রমাণীকরণ এবং অনুমোদন: SAML অ্যাসারশন নীতি যাচাই করুন
SAML পলিসি টাইপটি API প্রক্সিগুলোকে ইনবাউন্ড SOAP অনুরোধের সাথে সংযুক্ত SAML অ্যাসারশনগুলো যাচাই করতে সক্ষম করে। SAML পলিসিটি ডিজিটালভাবে স্বাক্ষরিত SAML অ্যাসারশনযুক্ত আগত বার্তাগুলো যাচাই করে, সেগুলো অবৈধ হলে প্রত্যাখ্যান করে এবং এমন ভ্যারিয়েবল সেট করে যা অতিরিক্ত পলিসি বা স্বয়ং ব্যাকএন্ড পরিষেবাগুলোকে অ্যাসারশনের তথ্য আরও যাচাই করার সুযোগ দেয়। - আউটবাউন্ড টোকেন তৈরি: SAML অ্যাসারশন পলিসি তৈরি করুন
SAML পলিসি টাইপ এপিআই প্রক্সিগুলোকে বহির্গামী এক্সএমএল অনুরোধের সাথে SAML অ্যাসারশন সংযুক্ত করার সুযোগ দেয়। এরপর সেই অ্যাসারশনগুলো ব্যাকএন্ড সার্ভিসগুলোকে প্রমাণীকরণ এবং অনুমোদনের জন্য অতিরিক্ত নিরাপত্তা প্রক্রিয়াকরণ প্রয়োগ করতে সক্ষম করে।
নমুনা
SAML অ্যাসারশন তৈরি করুন
<GenerateSAMLAssertion name="SAML" ignoreContentType="false"> <CanonicalizationAlgorithm /> <Issuer ref="reference">Issuer name</Issuer> <KeyStore> <Name ref="reference">keystorename</Name> <Alias ref="reference">alias</Alias> </KeyStore> <OutputVariable> <FlowVariable>assertion.content</FlowVariable> <Message name="request"> <Namespaces> <Namespace prefix="test">http://www.example.com/test</Namespace> </Namespaces> <XPath>/envelope/header</XPath> </Message> </OutputVariable> <SignatureAlgorithm /> <Subject ref="reference">Subject name</Subject> <Template ignoreUnresolvedVariables="false"> <!-- A lot of XML goes here, in CDATA, with {} around each variable --> </Template> </GenerateSAMLAssertion>
একটি SAML অ্যাসারশন তৈরি করা
SAML অ্যাসারশন যাচাই করুন
<ValidateSAMLAssertion name="SAML" ignoreContentType="false"> <Source name="request"> <Namespaces> <Namespace prefix='soap'>http://schemas.xmlsoap.org/soap/envelope/</Namespace> <Namespace prefix='wsse'>http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd</Namespace> <Namespace prefix='saml'>urn:oasis:names:tc:SAML:2.0:assertion</Namespace> </Namespaces> <AssertionXPath>/soap:Envelope/soap:Header/wsse:Security/saml:Assertion</AssertionXPath> <SignedElementXPath>/soap:Envelope/soap:Header/wsse:Security/saml:Assertion</SignedElementXPath> </Source> <TrustStore>TrustStoreName</TrustStore> <RemoveAssertion>false</RemoveAssertion> </ValidateSAMLAssertion>
একটি SAML অ্যাসারশন যাচাই করা
উপাদান রেফারেন্স
SAML অ্যাসারশন তৈরি করুন
| ক্ষেত্রের নাম | বর্ণনা | ||
|---|---|---|---|
name অ্যাট্রিবিউট | পলিসি ইনস্ট্যান্সের নাম। নামটি প্রতিষ্ঠানে অবশ্যই অনন্য হতে হবে। নামে আপনি যে অক্ষরগুলো ব্যবহার করতে পারবেন তা A-Z0-9._\-$ % এর মধ্যে সীমাবদ্ধ। তবে, ম্যানেজমেন্ট UI অতিরিক্ত বিধিনিষেধ আরোপ করে, যেমন অ্যালফানিউমেরিক নয় এমন অক্ষর স্বয়ংক্রিয়ভাবে মুছে ফেলা। | ||
ignoreContentType অ্যাট্রিবিউট | একটি বুলিয়ান যা true বা false সেট করা যেতে পারে। ডিফল্টরূপে, যদি মেসেজের কন্টেন্ট টাইপ একটি XML Content-Type না হয়, তাহলে অ্যাসারশনটি তৈরি হবে না। যদি এটি true সেট করা হয়, তাহলে কন্টেন্ট-টাইপ নির্বিশেষে মেসেজটিকে XML হিসেবে গণ্য করা হবে। | ||
Issuer | আইডেন্টিটি প্রোভাইডারের অনন্য শনাক্তকারী। যদি ঐচ্ছিক ref অ্যাট্রিবিউটটি উপস্থিত থাকে, তাহলে নির্দিষ্ট ভেরিয়েবলের উপর ভিত্তি করে রানটাইমে Issuer-এর মান নির্ধারণ করা হবে। যদি ঐচ্ছিক ref অ্যাট্রিবিউটটি উপস্থিত না থাকে, তাহলে Issuer-এর মান ব্যবহার করা হবে। | ||
KeyStore | যে কীস্টোরে প্রাইভেট কী থাকে তার নাম এবং SAML অ্যাসারশন ডিজিটালভাবে স্বাক্ষর করতে ব্যবহৃত প্রাইভেট কী-এর অ্যালিয়াস। | ||
OutputVariable | |||
FlowVariable | |||
Message | পলিসির লক্ষ্য। এর বৈধ মানগুলো হলো message , request , এবং response । যখন message এ সেট করা হয়, তখন পলিসিটি তার অ্যাটাচমেন্ট পয়েন্টের উপর ভিত্তি করে শর্তসাপেক্ষে message অবজেক্টটি পুনরুদ্ধার করে। request ফ্লো-এর সাথে সংযুক্ত থাকলে, পলিসিটি message request-এ রূপান্তর করে, এবং response ফ্লো-এর সাথে সংযুক্ত থাকলে, পলিসিটি message response-এ রূপান্তর করে। | ||
XPath | একটি XPath এক্সপ্রেশন যা আউটবাউন্ড XML ডকুমেন্টের সেই এলিমেন্টকে নির্দেশ করে, যার সাথে পলিসিটি SAML অ্যাসারশনটি সংযুক্ত করবে। | ||
SignatureAlgorithm | SHA1 অথবা SHA256 | ||
Subject | SAML অ্যাসারশনের সাবজেক্টের অনন্য শনাক্তকারী। যদি ঐচ্ছিক ref অ্যাট্রিবিউটটি উপস্থিত থাকে, তাহলে নির্দিষ্ট ভেরিয়েবলের উপর ভিত্তি করে রানটাইমে Subject-এর মান নির্ধারণ করা হবে। যদি ঐচ্ছিক ref অ্যাট্রিবিউটটি উপস্থিত থাকে, তাহলে Subject-এর মানটিই ব্যবহৃত হবে। | ||
Template | যদি উপস্থিত থাকে, তাহলে এই টেমপ্লেটটি চালিয়ে, {} দ্বারা চিহ্নিত সবকিছুকে সংশ্লিষ্ট ভেরিয়েবল দিয়ে প্রতিস্থাপন করে এবং তারপর ফলাফলটিতে ডিজিটাল স্বাক্ষর করে অ্যাসারশনটি তৈরি করা হবে। টেমপ্লেটটি AssignMessage পলিসির নিয়ম অনুসারে প্রক্রিয়াজাত করা হয়। Assign Message পলিসি দেখুন। | ||
SAML অ্যাসারশন যাচাই করুন
| ক্ষেত্রের নাম | বর্ণনা |
|---|---|
name অ্যাট্রিবিউট | পলিসি ইনস্ট্যান্সের নাম। নামটি প্রতিষ্ঠানে অবশ্যই অনন্য হতে হবে। নামে আপনি যে অক্ষরগুলো ব্যবহার করতে পারবেন তা A-Z0-9._\-$ % এর মধ্যে সীমাবদ্ধ। তবে, ম্যানেজমেন্ট UI অতিরিক্ত বিধিনিষেধ আরোপ করে, যেমন অ্যালফানিউমেরিক নয় এমন অক্ষর স্বয়ংক্রিয়ভাবে মুছে ফেলা। |
ignoreContentType অ্যাট্রিবিউট | একটি বুলিয়ান যা true বা false হিসেবে সেট করা যায়। ডিফল্টরূপে, যদি মেসেজের কন্টেন্ট টাইপ একটি এক্সএমএল (XML) কন্টেন্ট-টাইপ না হয়, তাহলে অ্যাসারশনটি তৈরি হবে না। যদি এটি ট্রু ( true হিসেবে সেট করা হয়, তাহলে কন্টেন্ট-টাইপ নির্বিশেষে মেসেজটিকে এক্সএমএল (XML) হিসেবে গণ্য করা হবে। |
Source | পলিসির লক্ষ্য। এর বৈধ মানগুলো হলো message , request , এবং response । যখন message এ সেট করা হয়, তখন পলিসিটি তার অ্যাটাচমেন্ট পয়েন্টের উপর ভিত্তি করে শর্তসাপেক্ষে message অবজেক্টটি পুনরুদ্ধার করে। request ফ্লো-এর সাথে সংযুক্ত থাকলে, পলিসিটি message request-এ রূপান্তর করে, এবং response ফ্লো-এর সাথে সংযুক্ত থাকলে, পলিসিটি message response-এ রূপান্তর করে। |
XPath | অপ্রচলিত। Source এর চাইল্ড। AssertionXPath এবং SignedElementXPath ব্যবহার করুন। |
AssertionXPath | Source চাইল্ড। একটি XPath এক্সপ্রেশন যা ইনবাউন্ড XML ডকুমেন্টের সেই এলিমেন্টকে নির্দেশ করে, যেখান থেকে পলিসিটি SAML অ্যাসারশনটি এক্সট্র্যাক্ট করতে পারে। |
SignedElementXPath | Source চাইল্ড। একটি XPath এক্সপ্রেশন যা ইনবাউন্ড XML ডকুমেন্টের সেই এলিমেন্টকে নির্দেশ করে, যেখান থেকে পলিসিটি স্বাক্ষরিত এলিমেন্টটি এক্সট্র্যাক্ট করতে পারে। এটি AssertionXPath এর XPath থেকে ভিন্ন বা একই হতে পারে। |
TrustStore | সেই ট্রাস্টস্টোরের নাম যেখানে SAML অ্যাসারশনের ডিজিটাল স্বাক্ষর যাচাই করার জন্য ব্যবহৃত বিশ্বস্ত X.509 সার্টিফিকেটগুলো থাকে। |
RemoveAssertion | একটি বুলিয়ান যা true বা false সেট করা যেতে পারে। যখন এর true , তখন বার্তাটি ব্যাকএন্ড সার্ভিসে পাঠানোর আগে অনুরোধ বার্তা থেকে SAML অ্যাসারশনটি বাদ দেওয়া হবে। |
ব্যবহারের নির্দেশাবলী
সিকিউরিটি অ্যাসারশন মার্কআপ ল্যাঙ্গুয়েজ (SAML) স্পেসিফিকেশন এমন ফরম্যাট এবং প্রোটোকল সংজ্ঞায়িত করে, যা অ্যাপ্লিকেশনগুলোকে প্রমাণীকরণ এবং অনুমোদনের জন্য XML-ফরম্যাটে তথ্য আদান-প্রদান করতে সক্ষম করে।
একটি "সিকিউরিটি অ্যাসারশন" হলো একটি বিশ্বস্ত টোকেন যা কোনো অ্যাপ, অ্যাপ ব্যবহারকারী বা লেনদেনের অন্য কোনো অংশগ্রহণকারীর একটি বৈশিষ্ট্য বর্ণনা করে। সিকিউরিটি অ্যাসারশন দুই ধরনের সত্তা দ্বারা পরিচালিত এবং ব্যবহৃত হয়:
- পরিচয় প্রদানকারী: অংশগ্রহণকারীদের পক্ষ থেকে নিরাপত্তা নিশ্চয়তা তৈরি করে।
- পরিষেবা প্রদানকারী: পরিচয় প্রদানকারীদের সাথে বিশ্বস্ত সম্পর্কের মাধ্যমে নিরাপত্তা সংক্রান্ত দাবিগুলো যাচাই করুন।
এপিআই প্ল্যাটফর্মটি আইডেন্টিটি প্রোভাইডার এবং সার্ভিস প্রোভাইডার উভয় হিসেবেই কাজ করতে পারে। এটি অ্যাসারশন তৈরি করে এবং সেগুলোকে রিকোয়েস্ট মেসেজের সাথে সংযুক্ত করার মাধ্যমে আইডেন্টিটি প্রোভাইডার হিসেবে কাজ করে, যার ফলে ব্যাকএন্ড সার্ভিসগুলো সেই অ্যাসারশনগুলো প্রক্রিয়াকরণের জন্য উপলব্ধ করতে পারে। এটি ইনবাউন্ড রিকোয়েস্ট মেসেজের অ্যাসারশনগুলো ভ্যালিডেট করার মাধ্যমে সার্ভিস প্রোভাইডার হিসেবেও কাজ করে।
SAML পলিসি টাইপটি SAML কোর স্পেসিফিকেশনের সংস্করণ ২.০ এবং WS-Security SAML টোকেন প্রোফাইল স্পেসিফিকেশনের সংস্করণ ১.০-এর সাথে মেলে এমন SAML অ্যাসারশন সমর্থন করে।
SAML অ্যাসারশন তৈরি করুন
নীতি প্রক্রিয়াকরণ:
- যদি বার্তাটি XML না হয় এবং IgnoreContentType-এর
trueসেট করা না থাকে, তাহলে একটি ফল্ট (fault) প্রদর্শন করুন। - যদি "টেমপ্লেট" সেট করা থাকে, তাহলে AssignMessage পলিসিতে বর্ণিত পদ্ধতি অনুযায়ী টেমপ্লেটটি প্রসেস করুন। যদি কোনো ভ্যারিয়েবল অনুপস্থিত থাকে এবং IgnoreUnresolvedVariables সেট করা না থাকে, তাহলে একটি ফল্ট প্রদর্শন করুন।
- যদি "টেমপ্লেট" সেট করা না থাকে, তাহলে এমন একটি অ্যাসারশন তৈরি করুন যাতে সাবজেক্ট এবং ইস্যুয়ার প্যারামিটারগুলোর মান বা তাদের রেফারেন্স অন্তর্ভুক্ত থাকে।
- নির্দিষ্ট কী ব্যবহার করে অ্যাসারশনটিতে স্বাক্ষর করুন।
- নির্দিষ্ট XPath-এ মেসেজে অ্যাসারশনটি যোগ করুন।
SAML অ্যাসারশন যাচাই করুন
নীতি প্রক্রিয়াকরণ:
- পলিসিটি আগত মেসেজটি পরীক্ষা করে দেখে যে অনুরোধের মিডিয়া টাইপটি XML কি না। এটি কন্টেন্ট টাইপকে
text/(.*+)?xmlঅথবাapplication/(.*+)?xmlফরম্যাটের সাথে মেলায় কি না, তা যাচাই করার মাধ্যমে করা হয়। যদি মিডিয়া টাইপটি XML না হয় এবং<IgnoreContentType>সেট করা না থাকে, তাহলে পলিসিটি একটি ফল্ট (fault) দেখাবে। - পলিসিটি XML ফাইলটি পার্স করবে। পার্সিং ব্যর্থ হলে এটি একটি ফল্ট প্রদর্শন করবে।
- পলিসিটি নির্দিষ্ট XPath (
<SignedElementXPath>এবং<AssertionXPath>) ব্যবহার করে স্বাক্ষরিত এলিমেন্ট এবং অ্যাসারশনটি বের করবে। যদি এই পাথগুলোর কোনোটি কোনো এলিমেন্ট ফেরত না দেয়, তাহলে পলিসিটি একটি ফল্ট দেখাবে। - পলিসিটি যাচাই করবে যে অ্যাসারশনটি স্বাক্ষরিত এলিমেন্টের অনুরূপ, অথবা এটি স্বাক্ষরিত এলিমেন্টের একটি চাইল্ড। যদি এটি সত্য না হয়, তাহলে পলিসিটি একটি ফল্ট প্রদর্শন করবে।
- যদি অ্যাসারশনটিতে
<NotBefore>অথবা<NotOnOrAfter>উপাদানগুলোর কোনো একটি উপস্থিত থাকে, তাহলে পলিসিটি SAML Core-এর ২.৫.১ অনুচ্ছেদে বর্ণিত পদ্ধতি অনুযায়ী বর্তমান টাইমস্ট্যাম্পটিকে এই মানগুলোর সাথে মিলিয়ে দেখবে। - এই নীতিমালা SAML কোর-এর ২.৫.১.১ অনুচ্ছেদে বর্ণিত 'শর্তাবলী' প্রক্রিয়াকরণের জন্য যেকোনো অতিরিক্ত নিয়ম প্রয়োগ করবে।
- পলিসিটি উপরে বর্ণিত ট্রাস্ট স্টোর ভ্যালু (
<TrustStore>) ব্যবহার করে XML ডিজিটাল সিগনেচারটি যাচাই করে। যাচাইকরণ ব্যর্থ হলে, পলিসিটি একটি ফল্ট প্রদর্শন করে।
পলিসিটি কোনো ত্রুটি না দেখিয়ে সম্পন্ন হয়ে গেলে, প্রক্সির ডেভেলপার নিম্নলিখিত বিষয়গুলো সম্পর্কে নিশ্চিত হতে পারেন:
- অ্যাসারশনের ডিজিটাল স্বাক্ষরটি বৈধ এবং একজন বিশ্বস্ত CA দ্বারা স্বাক্ষরিত হয়েছে।
- এই দাবিটি বর্তমান সময়কালের জন্য বৈধ।
- অ্যাসারশনের সাবজেক্ট এবং ইস্যুকারীকে এক্সট্র্যাক্ট করে ফ্লো ভেরিয়েবলে সেট করা হবে। অতিরিক্ত অথেনটিকেশনের জন্য এই মানগুলো ব্যবহার করা অন্যান্য পলিসির দায়িত্ব, যেমন সাবজেক্ট নামটি বৈধ কিনা তা যাচাই করা, অথবা ভ্যালিডেশনের জন্য এটিকে কোনো টার্গেট সিস্টেমে পাঠানো।
আরও জটিল যাচাইকরণের জন্য অ্যাসারশনের মূল XML পার্স করতে ExtractVariables-এর মতো অন্যান্য পলিসি ব্যবহার করা যেতে পারে।
প্রবাহ পরিবর্তনশীল
একটি SAML অ্যাসারশনে অনেক ধরনের তথ্য নির্দিষ্ট করা থাকতে পারে। SAML অ্যাসারশনটি নিজেই একটি XML ফাইল, যা আরও জটিল ভ্যালিডেশন বাস্তবায়নের জন্য ExtractVariables পলিসি এবং অন্যান্য পদ্ধতি ব্যবহার করে পার্স করা যায়।
| পরিবর্তনশীল | বর্ণনা |
|---|---|
saml.id | SAML অ্যাসারশন আইডি |
saml.issuer | অ্যাসারশনের "ইস্যুকারী", যা তার নিজস্ব XML টাইপ থেকে একটি স্ট্রিং-এ রূপান্তরিত হয়েছে। |
saml.subject | অ্যাসারশনের "সাবজেক্ট", যা তার নিজস্ব XML টাইপ থেকে স্ট্রিং-এ রূপান্তরিত হয়েছে। |
saml.valid | বৈধতা যাচাইয়ের ফলাফলের উপর ভিত্তি করে সত্য বা মিথ্যা ফেরত দেয়। |
saml.issueInstant | ইস্যুইনস্ট্যান্ট |
saml.subjectFormat | বিষয় বিন্যাস |
saml.scmethod | বিষয় নিশ্চিতকরণ পদ্ধতি |
saml.scdaddress | বিষয় নিশ্চিতকরণ ডেটা ঠিকানা |
saml.scdinresponse | বিষয় নিশ্চিতকরণ ডেটার প্রতিক্রিয়া |
saml.scdrcpt | বিষয় নিশ্চিতকরণ ডেটা প্রাপক |
saml.authnSnooa | AuthnStatement SessionNotOnOrAfter |
saml.authnContextClassRef | AuthnStatement AuthnContextClassRef |
saml.authnInstant | AuthnStatement AuthInstant |
saml.authnSessionIndex | প্রমাণীকরণ বিবৃতি সেশন সূচক |
ত্রুটির রেফারেন্স
এই বিভাগটি ফল্ট কোড এবং ত্রুটি বার্তাগুলি বর্ণনা করে যেগুলি ফেরত দেওয়া হয় এবং ত্রুটি ভেরিয়েবলগুলি যেগুলি এজ দ্বারা সেট করা হয় যখন এই নীতিটি একটি ত্রুটি ট্রিগার করে৷ এই তথ্যটি জানা গুরুত্বপূর্ণ যে আপনি ত্রুটিগুলি পরিচালনা করার জন্য ত্রুটির নিয়ম তৈরি করছেন কিনা। আরও জানতে, নীতিগত ত্রুটি এবং হ্যান্ডলিং ফল্ট সম্পর্কে আপনার যা জানা দরকার তা দেখুন৷
স্থাপনার ত্রুটি
আপনি যখন এই নীতি সম্বলিত একটি প্রক্সি স্থাপন করেন তখন এই ত্রুটিগুলি ঘটতে পারে৷
| ত্রুটির নাম | কারণ | ঠিক করুন |
|---|---|---|
SourceNotConfigured | SAML অ্যাসার্শন নীতির যাচাইকরণের নিম্নলিখিত উপাদানগুলির মধ্যে এক বা একাধিক সংজ্ঞায়িত বা খালি নেই: <Source> > , <XPath> , <Namespaces> , <Namespace> । | build |
TrustStoreNotConfigured | যদি <TrustStore> উপাদানটি খালি থাকে বা ValidateSAMLAssertion নীতিতে নির্দিষ্ট করা না থাকে, তাহলে API প্রক্সির স্থাপনা ব্যর্থ হয়। একটি বৈধ ট্রাস্ট স্টোর প্রয়োজন। | build |
NullKeyStoreAlias | যদি চাইল্ড এলিমেন্ট <Alias> খালি থাকে বা জেনারেট SAML Assertion নীতির <Keystore> এলিমেন্টে নির্দিষ্ট করা না থাকে, তাহলে API প্রক্সির স্থাপনা ব্যর্থ হয়। একটি বৈধ কীস্টোর উপনাম প্রয়োজন৷ | build |
NullKeyStore | যদি চাইল্ড এলিমেন্ট <Name> খালি থাকে বা GenerateSAMLAssertion নীতির <Keystore> এলিমেন্টে নির্দিষ্ট করা না থাকে, তাহলে API প্রক্সির স্থাপনা ব্যর্থ হয়। একটি বৈধ কীস্টোর নাম প্রয়োজন৷ | build |
NullIssuer | যদি <Issuer> উপাদানটি খালি থাকে বা জেনারেট SAML অ্যাসারশন নীতিতে নির্দিষ্ট করা না থাকে, তাহলে API প্রক্সির স্থাপনা ব্যর্থ হয়। একটি বৈধ <Issuer> মান প্রয়োজন। | build |
ফল্ট ভেরিয়েবল
রানটাইম ত্রুটি ঘটলে এই ভেরিয়েবলগুলি সেট করা হয়। আরও তথ্যের জন্য, নীতি ত্রুটি সম্পর্কে আপনার যা জানা দরকার তা দেখুন।
| ভেরিয়েবল | যেখানে | উদাহরণ |
|---|---|---|
fault.name=" fault_name " | fault_name হল দোষের নাম . ফল্ট নামটি ফল্ট কোডের শেষ অংশ। | fault.name = "InvalidMediaTpe" |
GenerateSAMLAssertion.failed | একটি বৈধ SAML দাবী নীতি কনফিগারেশনের জন্য, ত্রুটি উপসর্গটি হল ValidateSAMLAssertion । | GenerateSAMLAssertion.failed = true |
উদাহরণ ত্রুটি প্রতিক্রিয়া
{ "fault": { "faultstring": "GenerateSAMLAssertion[GenSAMLAssert]: Invalid media type", "detail": { "errorcode": "steps.saml.generate.InvalidMediaTpe" } } }
উদাহরণ দোষ নিয়ম
<FaultRules>
<FaultRule name="invalid_saml_rule">
<Step>
<Name>invalid-saml</Name>
</Step>
<Condition>(GenerateSAMLAssertion.failed = "true")</Condition>
</FaultRule>
</FaultRules>সম্পর্কিত বিষয়
ভেরিয়েবল নিষ্কাশন: ভেরিয়েবল নিষ্কাশন নীতি