Sandboxed API (SAPI) সুপ্রতিষ্ঠিত Sandbox2 প্রোজেক্টের উপর ভিত্তি করে তৈরি করা হয়েছে। এই পৃষ্ঠায় SAPI-এর ডিজাইন আর্কিটেকচার ও মূল ধারণা ব্যাখ্যা করা হয়েছে।
এক নজরে
SAPI এমনভাবে ডিজাইন করা হয়েছে যাতে ডেভেলপাররা স্যান্ডবক্সিংয়ের জন্য C/C++ লাইব্রেরি প্রস্তুত করার টুল এবং C/C++ লাইব্রেরির স্যান্ডবক্সড ভার্সনের সাথে যোগাযোগের জন্য প্রয়োজনীয় API পান।
এই ডায়াগ্রাম SAPI স্যান্ডবক্স করা C/C++ লাইব্রেরির আর্কিটেকচার দেখায়:

SAPI লাইব্রেরি এবং হোস্ট কোডের মধ্যে ম্যানুয়াল এবং অটোমেটিক (কাস্টম পয়েন্টার অ্যাট্রিবিউটের উপর ভিত্তি করে) মেমরি সিঙ্ক্রোনাইজেশনের (অ্যারে, স্ট্রাকচার) জন্য SAPI প্রিমিটিভ প্রদান করে।
সবশেষে, একটি হাই-লেভেল ট্রানজ্যাকশন API SAPI লাইব্রেরি মনিটর করার সুবিধা দেয় এবং সেগুলি ব্যর্থ হলে (যেমন, নিরাপত্তা লঙ্ঘন, ক্র্যাশ বা রিসোর্স শেষ হয়ে যাওয়ার কারণে) রিস্টার্ট করে।
Sandbox2
ওপেন-সোর্স প্রোজেক্ট Sandbox2 Google-এর নিরাপত্তা ইঞ্জিনিয়াররা ডেভেলপ ও মেইনটেইন করেন এবং এটি SAPI-এর ব্যবহার করা মূল স্যান্ডবক্সিং প্রযুক্তি। Sandbox2-এর তিনটি প্রধান কম্পোনেন্ট আছে, Sandbox নীতি, Executor এবং Sandboxee।
স্যান্ডবক্স নীতি
স্যান্ডবক্স নীতিতে স্যান্ডবক্স লাইব্রেরির জন্য বিধিনিষেধযুক্ত এক্সিকিউশন এনভায়রনমেন্ট সংজ্ঞায়িত করা হয়। কোন syscall চালানো যাবে তা স্পষ্ট করে এটি করা হয়। SAPI, Sandbox2-এর মতো একই মেকানিজম ব্যবহার করে, স্যান্ডবক্স নীতি কীভাবে ডিজাইন ও সংজ্ঞায়িত করতে হয় সেই সম্পর্কে আরও তথ্যের জন্য স্যান্ডবক্স নীতি বিভাগ এবং Sandbox2-এর জন্য শুরু করার পৃষ্ঠা দেখুন।
সাধারণত, জেনারেট করা SAPI স্যান্ডবক্স ক্লাস
DefaultConfig
(sapi::SandboxConfig::DefaultConfig()) ব্যবহার করে ইনিশিয়ালাইজ করে। DefaultConfig() স্যান্ডবক্সকে
এগুলি দিয়ে কনফিগার করে:
- ডিফল্ট Sandbox2 নীতি
sapi::Sandbox2Config::DefaultPolicyBuilder()-এর সাহায্যে তৈরি করা হয়েছে sapi::Sandbox2Config::DefaultLimits()থেকে ডিফল্ট রিসোর্স এবং সময়সীমা- শেয়ার করা মেমরি কমিউনিকেশন চালু করা হয়েছে (
DefaultPolicyBuilder()-এ শেয়ার করা মেমরি অনুমতির সাথে পেয়ার করা হয়েছে) - ডিফল্ট কমান্ড-লাইন ফ্ল্যাগ (
sapi::SandboxConfig::DefaultFlags()) এবং এনভায়রনমেন্ট ভেরিয়েবল (sapi::SandboxConfig::DefaultEnvironmentVariables()), যা স্যান্ডবক্সিতে বেসলাইন লগিং ও রানটাইম আচরণ কনফিগার করে
স্যান্ডবক্স নীতি বা কনফিগারেশন কাস্টমাইজ করতে, এখান থেকে শুরু করুন
sapi::SandboxConfig::DefaultConfig(), রিটার্ন করা
sapi::SandboxConfig পরিবর্তন করুন এবং জেনারেট করা স্যান্ডবক্স কনস্ট্রাক্টরে (বা
sandbox.h হেডার ফাইলে কাস্টম স্যান্ডবক্স সাবক্লাসকে
sapi_library বিল্ড
নিয়মে) পাস করুন। যেমন, আপনি
sapi::Sandbox2Config::DefaultPolicyBuilder() থেকে শুরু করে একটি নীতি তৈরি করতে পারেন এবং অতিরিক্ত নিয়ম যোগ করতে পারেন (অথবা
আরও বিধিনিষেধমূলক কনফিগারেশনের প্রয়োজন হলে সরাসরি
PolicyBuilder
তৈরি করতে পারেন) এবং
ফ্ল্যাগ বা এনভায়রনমেন্ট ভেরিয়েবল যোগ করার সময়, sapi::SandboxConfig::DefaultFlags()
বা sapi::SandboxConfig::DefaultEnvironmentVariables() থেকে শুরু করুন যাতে বেসলাইন সেটিংস
সংরক্ষিত থাকে।
স্যান্ডবক্স করা লাইব্রেরি
এটি হল স্যান্ডবক্স করা C/C++ লাইব্রেরি যা Sandbox2-এর দেওয়া সীমাবদ্ধ স্যান্ডবক্স এনভায়রনমেন্টে এক্সিকিউট করা হবে। পরিশেষে, Sandboxed Library প্রয়োজনীয় কার্যকারিতা প্রকাশ করে যা হোস্ট কোড ব্যবহার করতে পারে।
স্যান্ডবক্স করা লাইব্রেরি sapi_library বিল্ড নিয়ম মেনে তৈরি করা হয়, যেখানে আপনি কাস্টমাইজ করা স্যান্ডবক্স নীতি নির্দিষ্ট করতে পারেন যা সীমাবদ্ধ এক্সিকিউশন এনভায়রনমেন্টকে সংজ্ঞায়িত করে। লাইব্রেরির উপর নির্ভর করে, আপনাকে হয়ত র্যাপার বা স্টাব কোড লিখতে হবে (দেখুন libcurl), কিন্তু SAPI ভার্সন তৈরি করার সময় আপনাকে C/C++ লাইব্রেরির সোর্স কোড পরিবর্তন করতে হবে না।
SAPI অবজেক্ট ও RPC স্টাব
SAPI অবজেক্ট হল একটি C++ অবজেক্ট যা Sandboxed লাইব্রেরির API প্রকাশ করে। এটি হোস্ট কোড থেকে RPC স্টাবে কল ফরওয়ার্ড করে, যা স্যান্ডবক্সড লাইব্রেরির সাথে SAPI লাইব্রেরিতে এম্বেড করা থাকে।
এই দুটি এলিমেন্ট sapi_library() বিল্ড রুল ব্যবহার করে বিল্ড সিস্টেমের মাধ্যমে অটোমেটিক
জেনারেট করা হয়। SAPI দুটি বিল্ড সিস্টেমকে সাপোর্ট করে, Google-এর
Bazel এবং CMake।
হোস্ট কোড
হোস্ট কোড হল SAPI লাইব্রেরির মাধ্যমে প্রদান করা লজিক প্রয়োগ করার পদ্ধতি। এটি C/C++ লাইব্রেরির আনস্যান্ডবক্সড ভার্সন ব্যবহার করে। সেই কারণে, হোস্ট কোড SAPI লাইব্রেরি দ্বারা এক্সপোর্ট করা ফাংশন কল করে, স্যান্ডবক্সে ডেটা পাঠায় এবং স্যান্ডবক্স থেকে ডেটা গ্রহণ করে।
SAPI লাইব্রেরি ব্যবহার করার জন্য হোস্ট কোড অ্যাডাপ্ট করতে হবে। সবচেয়ে গুরুত্বপূর্ণ বিষয় হল, লাইব্রেরির ফাংশন কল করা সম্ভব নয় কারণ লাইব্রেরি একটি আলাদা স্যান্ডবক্স প্রসেসে থাকে। তাই, SAPI এমন টুল প্রদান করে যা SAPI অবজেক্ট তৈরি করে যা SAPI লাইব্রেরিতে কল প্রক্সি করে।
ধারণা
Bazel বিল্ড সংক্রান্ত নিয়ম
SAPI প্রোজেক্ট, C/C++ লাইব্রেরি স্যান্ডবক্সিং করার জন্য দুটি Bazel বিল্ড নিয়ম প্রদান করে:
sapi_library()– Sandbox2 Sandboxee হিসেবে C/C++ লাইব্রেরি স্যান্ডবক্স করার জন্য প্রয়োজনীয় সব আউটপুট তৈরি করে। বিল্ড আউটপুটকে হোস্ট কোড বাইনারি বিল্ড করার জন্য ব্যবহৃতcc_binary()নিয়মের ডিপেন্ডেন্সি হিসেবে ব্যবহার করা যেতে পারে।sapi_interface()– অটোমেটিক হেডার জেনারেট করে যা হোস্ট কোড বাইনারিতে অন্তর্ভুক্ত করা যেতে পারে।
বিল্ড রুল সম্পর্কে আরও বিস্তারিত ব্যাখ্যার জন্য, বিল্ড রুল দেখুন।
ভেরিয়েবল
SAPI-তে বেশ কিছু বিশেষ ধরনের টাইপ আছে, যেগুলিকে SAPI টাইপ বলা হয়, আমরা হোস্ট কোডে সেগুলি ব্যবহার করার সাজেশন দিই। SAPI Type-এর প্রয়োজন হওয়ার মূল কারণ হল প্রসেস এবং এর ফলে হোস্ট কোড ও স্যান্ডবক্সড লাইব্রেরির মধ্যে মেমরি আইসোলেশন।
এই বিষয়ের আরও বিস্তারিত ব্যাখ্যা এবং সাধারণত ব্যবহৃত কিছু SAPI প্রকারের ওভারভিউয়ের জন্য, ভেরিয়েবল দেখুন।
ট্রানজ্যাকশন
উপরে যেমন ব্যাখ্যা করা হয়েছে, স্যান্ডবক্সড লাইব্রেরিতে যেকোনও API কল RPC লেয়ারের মাধ্যমে পাস করা হয়। এই লেয়ারে কোনও সমস্যা হলে তা সমাধান করার জন্য, আপনাকে উপযুক্ত সমস্যা সমাধান পদ্ধতি প্রয়োগ করতে হবে। SAPI Transaction মডিউল প্রয়োজনীয় মেকানিজম প্রদান করে যাতে নিশ্চিত করা যায় যে Sandboxed Library-তে করা সব কল কোনও RPC-লেভেল সমস্যা ছাড়াই সম্পূর্ণ হয়েছে অথবা প্রাসঙ্গিক সমস্যা সহ ফেরত এসেছে।
এই বিষয়ে আরও বিস্তারিত ব্যাখ্যা পেতে, ট্রানজ্যাকশন দেখুন।
শুরু করা
আপনার প্রথম স্যান্ডবক্স করা API প্রোজেক্ট সেট-আপ করতে আমাদের শুরু করা পৃষ্ঠা পড়ুন।