কমন এক্সপ্রেশন ল্যাঙ্গুয়েজ (সিইএল)

কমন এক্সপ্রেশন ল্যাঙ্গুয়েজ (CEL) হলো একটি সাধারণ-উদ্দেশ্যমূলক এক্সপ্রেশন ল্যাঙ্গুয়েজ, যা দ্রুত, বহনযোগ্য এবং নিরাপদে কার্যকর করার জন্য ডিজাইন করা হয়েছে। আপনি CEL নিজে ব্যবহার করতে পারেন অথবা এটিকে কোনো বৃহত্তর পণ্যের মধ্যে অন্তর্ভুক্ত করতে পারেন। রিমোট প্রসিডিউর কল (RPC) রাউটিং থেকে শুরু করে নিরাপত্তা নীতি নির্ধারণ পর্যন্ত বিভিন্ন ধরনের অ্যাপ্লিকেশনের জন্য CEL অত্যন্ত উপযোগী। CEL সম্প্রসারণযোগ্য, প্ল্যাটফর্ম-নিরপেক্ষ, আনুষ্ঠানিকভাবে যাচাইযোগ্য এবং একবার কম্পাইল করে বহুবার মূল্যায়নের কর্মপ্রবাহের জন্য বিশেষভাবে উপযোগী।

ব্যবহারকারীর কোড নিরাপদে চালানোর জন্য CEL বিশেষভাবে ডিজাইন করা হয়েছে। যদিও কোনো ব্যবহারকারীর পাইথন কোডে নির্বিচারে eval() কল করা বিপজ্জনক, আপনি ব্যবহারকারীর CEL কোড নিরাপদে চালাতে পারেন। এবং যেহেতু CEL এমন আচরণ প্রতিরোধ করে যা এর পারফরম্যান্স কমিয়ে দিতে পারে, তাই এটি ন্যানোসেকেন্ড বা মাইক্রোসেকেন্ডের মধ্যে নিরাপদে ইভ্যালুয়েট হয়। CEL-এর এই গতি এবং নিরাপত্তা এটিকে পারফরম্যান্স-নির্ভর অ্যাপ্লিকেশনগুলোর জন্য আদর্শ করে তোলে।

CEL এমন সব এক্সপ্রেশন মূল্যায়ন করে যা এক-লাইনের ফাংশন বা ল্যাম্বডা এক্সপ্রেশনের অনুরূপ। যদিও CEL সাধারণত বুলিয়ান সিদ্ধান্তের জন্য ব্যবহৃত হয়, তবে এটি ব্যবহার করে JSON বা প্রোটোকল বাফার মেসেজের মতো আরও জটিল অবজেক্টও তৈরি করা যায়।

কেন CEL?

অনেক পরিষেবা এবং অ্যাপ্লিকেশন ডিক্লারেটিভ কনফিগারেশন মূল্যায়ন করে। উদাহরণস্বরূপ, রোল-বেসড অ্যাক্সেস কন্ট্রোল (RBAC) হলো একটি ডিক্লারেটিভ কনফিগারেশন যা একজন ব্যবহারকারীর ভূমিকা এবং একদল ব্যবহারকারীর উপর ভিত্তি করে অ্যাক্সেসের সিদ্ধান্ত তৈরি করে। যদিও বেশিরভাগ ক্ষেত্রে ডিক্লারেটিভ কনফিগারেশনই যথেষ্ট, কখনও কখনও আরও বেশি প্রকাশক্ষমতার প্রয়োজন হয়। আর এখানেই CEL-এর ভূমিকা আসে।

CEL ব্যবহার করে একটি ডিক্লারেটিভ কনফিগারেশন সম্প্রসারণের উদাহরণ হিসেবে, গুগল ক্লাউড আইডেন্টিটি অ্যান্ড অ্যাক্সেস ম্যানেজমেন্ট (IAM)- এর সক্ষমতাগুলো বিবেচনা করুন। যদিও RBAC একটি সাধারণ পদ্ধতি, IAM ব্যবহারকারীদের অনুরোধের প্রোটো মেসেজ প্রোপার্টি বা অ্যাক্সেস করা রিসোর্স অনুযায়ী রোল-ভিত্তিক গ্রান্টের পরিধি আরও সীমাবদ্ধ করার জন্য CEL এক্সপ্রেশন প্রদান করে। ডেটা মডেলের মাধ্যমে এই ধরনের শর্ত বর্ণনা করলে একটি জটিল API সারফেস তৈরি হবে, যা নিয়ে কাজ করা কঠিন। এর পরিবর্তে, অ্যাট্রিবিউট-ভিত্তিক অ্যাক্সেস কন্ট্রোল (ABAC)-এর সাথে CEL ব্যবহার করা RBAC-এর একটি এক্সপ্রেসিভ এবং শক্তিশালী সম্প্রসারণ।

CEL-এর মূল ধারণাগুলি

CEL-এ, একটি এক্সপ্রেশনকে একটি এনভায়রনমেন্টের সাপেক্ষে কম্পাইল করা হয়। কম্পাইলেশন ধাপটি প্রোটোকল বাফার ফরম্যাটে একটি অ্যাবস্ট্রাক্ট সিনট্যাক্স ট্রি (AST) তৈরি করে। ইভ্যালুয়েশনকে যথাসম্ভব দ্রুত রাখার জন্য কম্পাইল করা এক্সপ্রেশনগুলো ভবিষ্যতের ব্যবহারের জন্য সংরক্ষণ করা হয়। একটিমাত্র কম্পাইল করা এক্সপ্রেশনকে বিভিন্ন ইনপুট দিয়ে ইভ্যালুয়েট করা যেতে পারে।

এখানে এই ধারণাগুলোর কয়েকটি আরও বিশদভাবে আলোচনা করা হলো।

অভিব্যক্তি

এক্সপ্রেশন ব্যবহারকারীরা লিখে থাকেন। এক্সপ্রেশনগুলো এক-লাইনের ফাংশন বডি বা ল্যাম্বডা এক্সপ্রেশনের অনুরূপ। যে ফাংশন সিগনেচারটি ইনপুট ঘোষণা করে, তা CEL এক্সপ্রেশনের বাইরে লেখা হয় এবং CEL-এর জন্য উপলব্ধ ফাংশন লাইব্রেরিটি স্বয়ংক্রিয়ভাবে ইম্পোর্ট হয়ে যায়।

উদাহরণস্বরূপ, নিম্নলিখিত CEL এক্সপ্রেশনটি একটি রিকোয়েস্ট অবজেক্ট গ্রহণ করে, এবং রিকোয়েস্টটিতে একটি claims টোকেন অন্তর্ভুক্ত থাকে। এক্সপ্রেশনটি একটি বুলিয়ান ভ্যালু রিটার্ন করে যা নির্দেশ করে যে claims টোকেনটি এখনও বৈধ কিনা।

একটি ক্লেইমস টোকেন প্রমাণীকরণের জন্য CEL এক্সপ্রেশনের উদাহরণ

// Check whether a JSON Web Token has expired by inspecting the 'exp' claim.
//
// Args:
//   claims - authentication claims.
//   now    - timestamp indicating the current system time.
// Returns: true if the token has expired.
//
timestamp(claims["exp"]) < now

ব্যবহারকারীরা CEL এক্সপ্রেশন নির্ধারণ করলেও, সার্ভিস এবং অ্যাপ্লিকেশনগুলো সেই পরিবেশ নির্ধারণ করে যেখানে এটি চলে।

পরিবেশ

এনভায়রনমেন্ট সার্ভিস দ্বারা সংজ্ঞায়িত হয় । যে সকল সার্ভিস ও অ্যাপ্লিকেশন CEL অন্তর্ভুক্ত করে, তারা ‘এনভায়রনমেন্ট’ এক্সপ্রেশনটি ঘোষণা করে। এনভায়রনমেন্ট হলো ভেরিয়েবল ও ফাংশনগুলোর একটি সংগ্রহ যা CEL এক্সপ্রেশনে ব্যবহার করা যায়।

উদাহরণস্বরূপ, নিম্নলিখিত textproto কোডটি একটি CEL পরিষেবা থেকে CompileRequest বার্তা ব্যবহার করে request এবং now ভেরিয়েবল ধারণকারী একটি এনভায়রনমেন্ট ঘোষণা করে।

CEL পরিবেশ ঘোষণার উদাহরণ

# Format: $SOURCE_PATH/service.proto#CompileRequest
declarations {
  name: "request"
  ident {
    type { message_type: "google.rpc.context.AttributeContext.Request" }
  }
}
declarations {
  name: "now"
  ident {
    type { well_known: "TIMESTAMP" }
  }
}

একটি এক্সপ্রেশনের মধ্যে থাকা সমস্ত আইডেন্টিফায়ার এবং ফাংশন রেফারেন্স সঠিকভাবে ডিক্লেয়ার ও ব্যবহার করা হয়েছে কিনা, তা নিশ্চিত করতে CEL টাইপ-চেকার প্রোটো-ভিত্তিক ডিক্লারেশনগুলো ব্যবহার করে।

অভিব্যক্তি প্রক্রিয়াকরণের পর্যায়গুলি

CEL এক্সপ্রেশন তিনটি ধাপে প্রক্রিয়াজাত করা হয়:

  1. পার্স
  2. চেক
  3. মূল্যায়ন করুন

CEL ব্যবহারের সবচেয়ে প্রচলিত ধরণ হলো কনফিগারেশনের সময় এক্সপ্রেশনগুলো পার্স ও চেক করা, AST সংরক্ষণ করা এবং তারপর রানটাইমে বারবার সেই AST পুনরুদ্ধার ও মূল্যায়ন করা।

সিইএল প্রক্রিয়াকরণের পর্যায়গুলির চিত্রণ

এক্সপ্রেশনগুলো কনফিগারেশন পাথে পার্স ও চেক করা হয়, সংরক্ষণ করা হয় এবং তারপর রিড পাথে এক বা একাধিক কনটেক্সটের সাপেক্ষে মূল্যায়ন করা হয়।

একটি ANTLR লেক্সার এবং পার্সার গ্রামার ব্যবহার করে CEL-কে মানুষের পাঠযোগ্য এক্সপ্রেশন থেকে একটি AST-তে পার্স করা হয়। পার্সিং পর্যায়টি একটি প্রোটো-ভিত্তিক AST তৈরি করে, যেখানে AST-এর প্রতিটি Expr নোডে একটি পূর্ণসংখ্যা ID থাকে যা পার্সিং এবং চেকিংয়ের সময় তৈরি হওয়া মেটাডেটাকে ইনডেক্স করতে ব্যবহৃত হয়। পার্সিংয়ের সময় তৈরি হওয়া syntax.proto ফাইলটি এক্সপ্রেশনটির স্ট্রিং আকারে টাইপ করা বিষয়বস্তুর বিমূর্ত উপস্থাপনা করে।

একটি এক্সপ্রেশন পার্স করার পর, সেটির মধ্যে থাকা সমস্ত ভেরিয়েবল এবং ফাংশন আইডেন্টিফায়ার ডিক্লেয়ার করা হয়েছে এবং সঠিকভাবে ব্যবহৃত হচ্ছে কিনা তা নিশ্চিত করার জন্য সেটিকে এনভায়রনমেন্টের সাথে টাইপ-চেক করা হয়। টাইপ-চেকার একটি checked.proto ফাইল তৈরি করে, যাতে টাইপ, ভেরিয়েবল এবং ফাংশন রেজোলিউশন মেটাডেটা অন্তর্ভুক্ত থাকে, যা ইভ্যালুয়েশন দক্ষতা ব্যাপকভাবে উন্নত করতে পারে।

অবশেষে, কোনো এক্সপ্রেশন পার্স ও যাচাই করার পর, সংরক্ষিত AST-টি মূল্যায়ন করা হয়।

সিইএল মূল্যায়নকারীর তিনটি জিনিস প্রয়োজন:

  • যেকোনো কাস্টম এক্সটেনশনের জন্য ফাংশন বাইন্ডিং
  • পরিবর্তনশীল বাইন্ডিং
  • মূল্যায়ন করার জন্য একটি AST

ফাংশন এবং ভেরিয়েবল বাইন্ডিং অবশ্যই AST কম্পাইল করার সময় ব্যবহৃত বাইন্ডিংয়ের সাথে মিলতে হবে। এই ইনপুটগুলোর যেকোনোটি একাধিক ইভ্যালুয়েশনের ক্ষেত্রে পুনরায় ব্যবহার করা যেতে পারে; যেমন, একটি AST-কে একাধিক ভেরিয়েবল বাইন্ডিং সেটের মাধ্যমে ইভ্যালুয়েট করা, একই ভেরিয়েবল একাধিক AST-এর ক্ষেত্রে ব্যবহার করা, অথবা একটি প্রসেসের জীবনকাল জুড়ে ফাংশন বাইন্ডিংগুলো ব্যবহার করা (যা একটি সাধারণ ঘটনা)।

আনুষ্ঠানিক যাচাইকরণ

রানটাইম মূল্যায়নের পাশাপাশি, সমস্ত সম্ভাব্য ইনপুটের ক্ষেত্রে CEL এক্সপ্রেশন এবং পলিসিগুলোর সঠিকতা গাণিতিকভাবে প্রমাণ করার জন্য সেগুলোকে আনুষ্ঠানিকভাবে যাচাই করা যেতে পারে।

Z3 থিওরেম প্রুভার দ্বারা চালিত, CEL-Java-এর CEL ফর্মাল ভেরিফিকেশন ফ্রেমওয়ার্ক এক্সপ্রেশন এবং CEL পলিসিসমূহকে স্যাটিসফায়াবিলিটি মডিউলো থিওরিজ (SMT) ফর্মুলায় অনুবাদ করে:

  • নিরাপত্তা অপরিবর্তনীয়তা প্রমাণ করুন: assume এবং assert স্পেসিফিকেশন ব্যবহার করে যাচাই করুন যে, ইনপুটের যেকোনো সমন্বয়ের অধীনে গুরুত্বপূর্ণ পলিসিগুলো বাইপাস করা যায় না।
  • যৌক্তিক সমতুল্যতা যাচাই করুন: গাণিতিকভাবে প্রমাণ করুন যে পুনর্গঠিত বা এআই-দ্বারা তৈরি এক্সপ্রেশনগুলো মূল নিয়মটির মতোই হুবহু আচরণ করে।
  • পুঙ্খানুপুঙ্খ বৈধতা নিশ্চিত করুন: গ্যারান্টি দিন যে রক্ষাকবচগুলি (যেমন Kubernetes Validating Admission Policies) সমস্ত ইনপুটের ক্ষেত্রে প্রযোজ্য, অথবা লঙ্ঘিত হলে সুনির্দিষ্ট পাল্টা-উদাহরণ তৈরি করুন।
  • ভুল শনাক্তকরণ দূর করুন: আনম্যাপড কাস্টম ফাংশনগুলোকে আলাদা করতে থ্রি-পাস টেইন্ট ট্র্যাকিং ব্যবহার করুন, যা নিশ্চিত করে যে রিপোর্ট করা লঙ্ঘনগুলো সর্বদা পুনরুৎপাদনযোগ্য বাগ।

ভূমিকা এবং বাস্তব-জগতের উদাহরণের জন্য, গুগল ওপেন সোর্স ব্লগ পোস্টটি দেখুন: Securing the agentic era: Introducing formal verification for CEL

,

কমন এক্সপ্রেশন ল্যাঙ্গুয়েজ (CEL) হলো একটি সাধারণ-উদ্দেশ্যমূলক এক্সপ্রেশন ল্যাঙ্গুয়েজ, যা দ্রুত, বহনযোগ্য এবং নিরাপদে কার্যকর করার জন্য ডিজাইন করা হয়েছে। আপনি CEL নিজে ব্যবহার করতে পারেন অথবা এটিকে কোনো বৃহত্তর পণ্যের মধ্যে অন্তর্ভুক্ত করতে পারেন। রিমোট প্রসিডিউর কল (RPC) রাউটিং থেকে শুরু করে নিরাপত্তা নীতি নির্ধারণ পর্যন্ত বিভিন্ন ধরনের অ্যাপ্লিকেশনের জন্য CEL অত্যন্ত উপযোগী। CEL সম্প্রসারণযোগ্য, প্ল্যাটফর্ম-নিরপেক্ষ, আনুষ্ঠানিকভাবে যাচাইযোগ্য এবং একবার কম্পাইল করে বহুবার মূল্যায়নের কর্মপ্রবাহের জন্য বিশেষভাবে উপযোগী।

ব্যবহারকারীর কোড নিরাপদে চালানোর জন্য CEL বিশেষভাবে ডিজাইন করা হয়েছে। যদিও কোনো ব্যবহারকারীর পাইথন কোডে নির্বিচারে eval() কল করা বিপজ্জনক, আপনি ব্যবহারকারীর CEL কোড নিরাপদে চালাতে পারেন। এবং যেহেতু CEL এমন আচরণ প্রতিরোধ করে যা এর পারফরম্যান্স কমিয়ে দিতে পারে, তাই এটি ন্যানোসেকেন্ড বা মাইক্রোসেকেন্ডের মধ্যে নিরাপদে ইভ্যালুয়েট হয়। CEL-এর এই গতি এবং নিরাপত্তা এটিকে পারফরম্যান্স-নির্ভর অ্যাপ্লিকেশনগুলোর জন্য আদর্শ করে তোলে।

CEL এমন সব এক্সপ্রেশন মূল্যায়ন করে যা এক-লাইনের ফাংশন বা ল্যাম্বডা এক্সপ্রেশনের অনুরূপ। যদিও CEL সাধারণত বুলিয়ান সিদ্ধান্তের জন্য ব্যবহৃত হয়, তবে এটি ব্যবহার করে JSON বা প্রোটোকল বাফার মেসেজের মতো আরও জটিল অবজেক্টও তৈরি করা যায়।

কেন CEL?

অনেক পরিষেবা এবং অ্যাপ্লিকেশন ডিক্লারেটিভ কনফিগারেশন মূল্যায়ন করে। উদাহরণস্বরূপ, রোল-বেসড অ্যাক্সেস কন্ট্রোল (RBAC) হলো একটি ডিক্লারেটিভ কনফিগারেশন যা একজন ব্যবহারকারীর ভূমিকা এবং একদল ব্যবহারকারীর উপর ভিত্তি করে অ্যাক্সেসের সিদ্ধান্ত তৈরি করে। যদিও বেশিরভাগ ক্ষেত্রে ডিক্লারেটিভ কনফিগারেশনই যথেষ্ট, কখনও কখনও আরও বেশি প্রকাশক্ষমতার প্রয়োজন হয়। আর এখানেই CEL-এর ভূমিকা আসে।

CEL ব্যবহার করে একটি ডিক্লারেটিভ কনফিগারেশন সম্প্রসারণের উদাহরণ হিসেবে, গুগল ক্লাউড আইডেন্টিটি অ্যান্ড অ্যাক্সেস ম্যানেজমেন্ট (IAM)- এর সক্ষমতাগুলো বিবেচনা করুন। যদিও RBAC একটি সাধারণ পদ্ধতি, IAM ব্যবহারকারীদের অনুরোধের প্রোটো মেসেজ প্রোপার্টি বা অ্যাক্সেস করা রিসোর্স অনুযায়ী রোল-ভিত্তিক গ্রান্টের পরিধি আরও সীমাবদ্ধ করার জন্য CEL এক্সপ্রেশন প্রদান করে। ডেটা মডেলের মাধ্যমে এই ধরনের শর্ত বর্ণনা করলে একটি জটিল API সারফেস তৈরি হবে, যা নিয়ে কাজ করা কঠিন। এর পরিবর্তে, অ্যাট্রিবিউট-ভিত্তিক অ্যাক্সেস কন্ট্রোল (ABAC)-এর সাথে CEL ব্যবহার করা RBAC-এর একটি এক্সপ্রেসিভ এবং শক্তিশালী সম্প্রসারণ।

CEL-এর মূল ধারণাগুলি

CEL-এ, একটি এক্সপ্রেশনকে একটি এনভায়রনমেন্টের সাপেক্ষে কম্পাইল করা হয়। কম্পাইলেশন ধাপটি প্রোটোকল বাফার ফরম্যাটে একটি অ্যাবস্ট্রাক্ট সিনট্যাক্স ট্রি (AST) তৈরি করে। ইভ্যালুয়েশনকে যথাসম্ভব দ্রুত রাখার জন্য কম্পাইল করা এক্সপ্রেশনগুলো ভবিষ্যতের ব্যবহারের জন্য সংরক্ষণ করা হয়। একটিমাত্র কম্পাইল করা এক্সপ্রেশনকে বিভিন্ন ইনপুট দিয়ে ইভ্যালুয়েট করা যেতে পারে।

এখানে এই ধারণাগুলোর কয়েকটি আরও বিশদভাবে আলোচনা করা হলো।

অভিব্যক্তি

এক্সপ্রেশন ব্যবহারকারীরা লিখে থাকেন। এক্সপ্রেশনগুলো এক-লাইনের ফাংশন বডি বা ল্যাম্বডা এক্সপ্রেশনের অনুরূপ। যে ফাংশন সিগনেচারটি ইনপুট ঘোষণা করে, তা CEL এক্সপ্রেশনের বাইরে লেখা হয় এবং CEL-এর জন্য উপলব্ধ ফাংশন লাইব্রেরিটি স্বয়ংক্রিয়ভাবে ইম্পোর্ট হয়ে যায়।

উদাহরণস্বরূপ, নিম্নলিখিত CEL এক্সপ্রেশনটি একটি রিকোয়েস্ট অবজেক্ট গ্রহণ করে, এবং রিকোয়েস্টটিতে একটি claims টোকেন অন্তর্ভুক্ত থাকে। এক্সপ্রেশনটি একটি বুলিয়ান ভ্যালু রিটার্ন করে যা নির্দেশ করে যে claims টোকেনটি এখনও বৈধ কিনা।

একটি ক্লেইমস টোকেন প্রমাণীকরণের জন্য CEL এক্সপ্রেশনের উদাহরণ

// Check whether a JSON Web Token has expired by inspecting the 'exp' claim.
//
// Args:
//   claims - authentication claims.
//   now    - timestamp indicating the current system time.
// Returns: true if the token has expired.
//
timestamp(claims["exp"]) < now

ব্যবহারকারীরা CEL এক্সপ্রেশন নির্ধারণ করলেও, সার্ভিস এবং অ্যাপ্লিকেশনগুলো সেই পরিবেশ নির্ধারণ করে যেখানে এটি চলে।

পরিবেশ

এনভায়রনমেন্ট সার্ভিস দ্বারা সংজ্ঞায়িত হয় । যে সকল সার্ভিস ও অ্যাপ্লিকেশন CEL অন্তর্ভুক্ত করে, তারা ‘এনভায়রনমেন্ট’ এক্সপ্রেশনটি ঘোষণা করে। এনভায়রনমেন্ট হলো ভেরিয়েবল ও ফাংশনগুলোর একটি সংগ্রহ যা CEL এক্সপ্রেশনে ব্যবহার করা যায়।

উদাহরণস্বরূপ, নিম্নলিখিত textproto কোডটি একটি CEL পরিষেবা থেকে CompileRequest বার্তা ব্যবহার করে request এবং now ভেরিয়েবল ধারণকারী একটি এনভায়রনমেন্ট ঘোষণা করে।

CEL পরিবেশ ঘোষণার উদাহরণ

# Format: $SOURCE_PATH/service.proto#CompileRequest
declarations {
  name: "request"
  ident {
    type { message_type: "google.rpc.context.AttributeContext.Request" }
  }
}
declarations {
  name: "now"
  ident {
    type { well_known: "TIMESTAMP" }
  }
}

একটি এক্সপ্রেশনের মধ্যে থাকা সমস্ত আইডেন্টিফায়ার এবং ফাংশন রেফারেন্স সঠিকভাবে ডিক্লেয়ার ও ব্যবহার করা হয়েছে কিনা, তা নিশ্চিত করতে CEL টাইপ-চেকার প্রোটো-ভিত্তিক ডিক্লারেশনগুলো ব্যবহার করে।

অভিব্যক্তি প্রক্রিয়াকরণের পর্যায়গুলি

CEL এক্সপ্রেশন তিনটি ধাপে প্রক্রিয়াজাত করা হয়:

  1. পার্স
  2. চেক
  3. মূল্যায়ন করুন

CEL ব্যবহারের সবচেয়ে প্রচলিত ধরণ হলো কনফিগারেশনের সময় এক্সপ্রেশনগুলো পার্স ও চেক করা, AST সংরক্ষণ করা এবং তারপর রানটাইমে বারবার সেই AST পুনরুদ্ধার ও মূল্যায়ন করা।

সিইএল প্রক্রিয়াকরণের পর্যায়গুলির চিত্রণ

এক্সপ্রেশনগুলো কনফিগারেশন পাথে পার্স ও চেক করা হয়, সংরক্ষণ করা হয় এবং তারপর রিড পাথে এক বা একাধিক কনটেক্সটের সাপেক্ষে মূল্যায়ন করা হয়।

একটি ANTLR লেক্সার এবং পার্সার গ্রামার ব্যবহার করে CEL-কে মানুষের পাঠযোগ্য এক্সপ্রেশন থেকে একটি AST-তে পার্স করা হয়। পার্সিং পর্যায়টি একটি প্রোটো-ভিত্তিক AST তৈরি করে, যেখানে AST-এর প্রতিটি Expr নোডে একটি পূর্ণসংখ্যা ID থাকে যা পার্সিং এবং চেকিংয়ের সময় তৈরি হওয়া মেটাডেটাকে ইনডেক্স করতে ব্যবহৃত হয়। পার্সিংয়ের সময় তৈরি হওয়া syntax.proto ফাইলটি এক্সপ্রেশনটির স্ট্রিং আকারে টাইপ করা বিষয়বস্তুর বিমূর্ত উপস্থাপনা করে।

একটি এক্সপ্রেশন পার্স করার পর, সেটির মধ্যে থাকা সমস্ত ভেরিয়েবল এবং ফাংশন আইডেন্টিফায়ার ডিক্লেয়ার করা হয়েছে এবং সঠিকভাবে ব্যবহৃত হচ্ছে কিনা তা নিশ্চিত করার জন্য সেটিকে এনভায়রনমেন্টের সাথে টাইপ-চেক করা হয়। টাইপ-চেকার একটি checked.proto ফাইল তৈরি করে, যাতে টাইপ, ভেরিয়েবল এবং ফাংশন রেজোলিউশন মেটাডেটা অন্তর্ভুক্ত থাকে, যা ইভ্যালুয়েশন দক্ষতা ব্যাপকভাবে উন্নত করতে পারে।

অবশেষে, কোনো এক্সপ্রেশন পার্স ও যাচাই করার পর, সংরক্ষিত AST-টি মূল্যায়ন করা হয়।

সিইএল মূল্যায়নকারীর তিনটি জিনিস প্রয়োজন:

  • যেকোনো কাস্টম এক্সটেনশনের জন্য ফাংশন বাইন্ডিং
  • পরিবর্তনশীল বাইন্ডিং
  • মূল্যায়ন করার জন্য একটি AST

ফাংশন এবং ভেরিয়েবল বাইন্ডিং অবশ্যই AST কম্পাইল করার সময় ব্যবহৃত বাইন্ডিংয়ের সাথে মিলতে হবে। এই ইনপুটগুলোর যেকোনোটি একাধিক ইভ্যালুয়েশনের ক্ষেত্রে পুনরায় ব্যবহার করা যেতে পারে; যেমন, একটি AST-কে একাধিক ভেরিয়েবল বাইন্ডিং সেটের মাধ্যমে ইভ্যালুয়েট করা, একই ভেরিয়েবল একাধিক AST-এর ক্ষেত্রে ব্যবহার করা, অথবা একটি প্রসেসের জীবনকাল জুড়ে ফাংশন বাইন্ডিংগুলো ব্যবহার করা (যা একটি সাধারণ ঘটনা)।

আনুষ্ঠানিক যাচাইকরণ

রানটাইম মূল্যায়নের পাশাপাশি, সমস্ত সম্ভাব্য ইনপুটের ক্ষেত্রে CEL এক্সপ্রেশন এবং পলিসিগুলোর সঠিকতা গাণিতিকভাবে প্রমাণ করার জন্য সেগুলোকে আনুষ্ঠানিকভাবে যাচাই করা যেতে পারে।

Z3 থিওরেম প্রুভার দ্বারা চালিত, CEL-Java-এর CEL ফর্মাল ভেরিফিকেশন ফ্রেমওয়ার্ক এক্সপ্রেশন এবং CEL পলিসিসমূহকে স্যাটিসফায়াবিলিটি মডিউলো থিওরিজ (SMT) ফর্মুলায় অনুবাদ করে:

  • নিরাপত্তা অপরিবর্তনীয়তা প্রমাণ করুন: assume এবং assert স্পেসিফিকেশন ব্যবহার করে যাচাই করুন যে, ইনপুটের যেকোনো সমন্বয়ের অধীনে গুরুত্বপূর্ণ পলিসিগুলো বাইপাস করা যায় না।
  • যৌক্তিক সমতুল্যতা যাচাই করুন: গাণিতিকভাবে প্রমাণ করুন যে পুনর্গঠিত বা এআই-দ্বারা তৈরি এক্সপ্রেশনগুলো মূল নিয়মটির মতোই হুবহু আচরণ করে।
  • পুঙ্খানুপুঙ্খ বৈধতা নিশ্চিত করুন: গ্যারান্টি দিন যে রক্ষাকবচগুলি (যেমন Kubernetes Validating Admission Policies) সমস্ত ইনপুটের ক্ষেত্রে প্রযোজ্য, অথবা লঙ্ঘিত হলে সুনির্দিষ্ট পাল্টা-উদাহরণ তৈরি করুন।
  • ভুল শনাক্তকরণ দূর করুন: আনম্যাপড কাস্টম ফাংশনগুলোকে আলাদা করতে থ্রি-পাস টেইন্ট ট্র্যাকিং ব্যবহার করুন, যা নিশ্চিত করে যে রিপোর্ট করা লঙ্ঘনগুলো সর্বদা পুনরুৎপাদনযোগ্য বাগ।

ভূমিকা এবং বাস্তব-জগতের উদাহরণের জন্য, গুগল ওপেন সোর্স ব্লগ পোস্টটি দেখুন: Securing the agentic era: Introducing formal verification for CEL

,

কমন এক্সপ্রেশন ল্যাঙ্গুয়েজ (CEL) হলো একটি সাধারণ-উদ্দেশ্যমূলক এক্সপ্রেশন ল্যাঙ্গুয়েজ, যা দ্রুত, বহনযোগ্য এবং নিরাপদে কার্যকর করার জন্য ডিজাইন করা হয়েছে। আপনি CEL নিজে ব্যবহার করতে পারেন অথবা এটিকে কোনো বৃহত্তর পণ্যের মধ্যে অন্তর্ভুক্ত করতে পারেন। রিমোট প্রসিডিউর কল (RPC) রাউটিং থেকে শুরু করে নিরাপত্তা নীতি নির্ধারণ পর্যন্ত বিভিন্ন ধরনের অ্যাপ্লিকেশনের জন্য CEL অত্যন্ত উপযোগী। CEL সম্প্রসারণযোগ্য, প্ল্যাটফর্ম-নিরপেক্ষ, আনুষ্ঠানিকভাবে যাচাইযোগ্য এবং একবার কম্পাইল করে বহুবার মূল্যায়নের কর্মপ্রবাহের জন্য বিশেষভাবে উপযোগী।

ব্যবহারকারীর কোড নিরাপদে চালানোর জন্য CEL বিশেষভাবে ডিজাইন করা হয়েছে। যদিও কোনো ব্যবহারকারীর পাইথন কোডে নির্বিচারে eval() কল করা বিপজ্জনক, আপনি ব্যবহারকারীর CEL কোড নিরাপদে চালাতে পারেন। এবং যেহেতু CEL এমন আচরণ প্রতিরোধ করে যা এর পারফরম্যান্স কমিয়ে দিতে পারে, তাই এটি ন্যানোসেকেন্ড বা মাইক্রোসেকেন্ডের মধ্যে নিরাপদে ইভ্যালুয়েট হয়। CEL-এর এই গতি এবং নিরাপত্তা এটিকে পারফরম্যান্স-নির্ভর অ্যাপ্লিকেশনগুলোর জন্য আদর্শ করে তোলে।

CEL এমন সব এক্সপ্রেশন মূল্যায়ন করে যা এক-লাইনের ফাংশন বা ল্যাম্বডা এক্সপ্রেশনের অনুরূপ। যদিও CEL সাধারণত বুলিয়ান সিদ্ধান্তের জন্য ব্যবহৃত হয়, তবে এটি ব্যবহার করে JSON বা প্রোটোকল বাফার মেসেজের মতো আরও জটিল অবজেক্টও তৈরি করা যায়।

কেন CEL?

অনেক পরিষেবা এবং অ্যাপ্লিকেশন ডিক্লারেটিভ কনফিগারেশন মূল্যায়ন করে। উদাহরণস্বরূপ, রোল-বেসড অ্যাক্সেস কন্ট্রোল (RBAC) হলো একটি ডিক্লারেটিভ কনফিগারেশন যা একজন ব্যবহারকারীর ভূমিকা এবং একদল ব্যবহারকারীর উপর ভিত্তি করে অ্যাক্সেসের সিদ্ধান্ত তৈরি করে। যদিও বেশিরভাগ ক্ষেত্রে ডিক্লারেটিভ কনফিগারেশনই যথেষ্ট, কখনও কখনও আরও বেশি প্রকাশক্ষমতার প্রয়োজন হয়। আর এখানেই CEL-এর ভূমিকা আসে।

CEL ব্যবহার করে একটি ডিক্লারেটিভ কনফিগারেশন সম্প্রসারণের উদাহরণ হিসেবে, গুগল ক্লাউড আইডেন্টিটি অ্যান্ড অ্যাক্সেস ম্যানেজমেন্ট (IAM)- এর সক্ষমতাগুলো বিবেচনা করুন। যদিও RBAC একটি সাধারণ পদ্ধতি, IAM ব্যবহারকারীদের অনুরোধের প্রোটো মেসেজ প্রোপার্টি বা অ্যাক্সেস করা রিসোর্স অনুযায়ী রোল-ভিত্তিক গ্রান্টের পরিধি আরও সীমাবদ্ধ করার জন্য CEL এক্সপ্রেশন প্রদান করে। ডেটা মডেলের মাধ্যমে এই ধরনের শর্ত বর্ণনা করলে একটি জটিল API সারফেস তৈরি হবে, যা নিয়ে কাজ করা কঠিন। এর পরিবর্তে, অ্যাট্রিবিউট-ভিত্তিক অ্যাক্সেস কন্ট্রোল (ABAC)-এর সাথে CEL ব্যবহার করা RBAC-এর একটি এক্সপ্রেসিভ এবং শক্তিশালী সম্প্রসারণ।

CEL-এর মূল ধারণাগুলি

CEL-এ, একটি এক্সপ্রেশনকে একটি এনভায়রনমেন্টের সাপেক্ষে কম্পাইল করা হয়। কম্পাইলেশন ধাপটি প্রোটোকল বাফার ফরম্যাটে একটি অ্যাবস্ট্রাক্ট সিনট্যাক্স ট্রি (AST) তৈরি করে। ইভ্যালুয়েশনকে যথাসম্ভব দ্রুত রাখার জন্য কম্পাইল করা এক্সপ্রেশনগুলো ভবিষ্যতের ব্যবহারের জন্য সংরক্ষণ করা হয়। একটিমাত্র কম্পাইল করা এক্সপ্রেশনকে বিভিন্ন ইনপুট দিয়ে ইভ্যালুয়েট করা যেতে পারে।

এখানে এই ধারণাগুলোর কয়েকটি আরও বিশদভাবে আলোচনা করা হলো।

অভিব্যক্তি

এক্সপ্রেশন ব্যবহারকারীরা লিখে থাকেন। এক্সপ্রেশনগুলো এক-লাইনের ফাংশন বডি বা ল্যাম্বডা এক্সপ্রেশনের অনুরূপ। যে ফাংশন সিগনেচারটি ইনপুট ঘোষণা করে, তা CEL এক্সপ্রেশনের বাইরে লেখা হয় এবং CEL-এর জন্য উপলব্ধ ফাংশন লাইব্রেরিটি স্বয়ংক্রিয়ভাবে ইম্পোর্ট হয়ে যায়।

উদাহরণস্বরূপ, নিম্নলিখিত CEL এক্সপ্রেশনটি একটি রিকোয়েস্ট অবজেক্ট গ্রহণ করে, এবং রিকোয়েস্টটিতে একটি claims টোকেন অন্তর্ভুক্ত থাকে। এক্সপ্রেশনটি একটি বুলিয়ান ভ্যালু রিটার্ন করে যা নির্দেশ করে যে claims টোকেনটি এখনও বৈধ কিনা।

একটি ক্লেইমস টোকেন প্রমাণীকরণের জন্য CEL এক্সপ্রেশনের উদাহরণ

// Check whether a JSON Web Token has expired by inspecting the 'exp' claim.
//
// Args:
//   claims - authentication claims.
//   now    - timestamp indicating the current system time.
// Returns: true if the token has expired.
//
timestamp(claims["exp"]) < now

ব্যবহারকারীরা CEL এক্সপ্রেশন নির্ধারণ করলেও, সার্ভিস এবং অ্যাপ্লিকেশনগুলো সেই পরিবেশ নির্ধারণ করে যেখানে এটি চলে।

পরিবেশ

এনভায়রনমেন্ট সার্ভিস দ্বারা সংজ্ঞায়িত হয় । যে সকল সার্ভিস ও অ্যাপ্লিকেশন CEL অন্তর্ভুক্ত করে, তারা ‘এনভায়রনমেন্ট’ এক্সপ্রেশনটি ঘোষণা করে। এনভায়রনমেন্ট হলো ভেরিয়েবল ও ফাংশনগুলোর একটি সংগ্রহ যা CEL এক্সপ্রেশনে ব্যবহার করা যায়।

উদাহরণস্বরূপ, নিম্নলিখিত textproto কোডটি একটি CEL পরিষেবা থেকে CompileRequest বার্তা ব্যবহার করে request এবং now ভেরিয়েবল ধারণকারী একটি এনভায়রনমেন্ট ঘোষণা করে।

CEL পরিবেশ ঘোষণার উদাহরণ

# Format: $SOURCE_PATH/service.proto#CompileRequest
declarations {
  name: "request"
  ident {
    type { message_type: "google.rpc.context.AttributeContext.Request" }
  }
}
declarations {
  name: "now"
  ident {
    type { well_known: "TIMESTAMP" }
  }
}

একটি এক্সপ্রেশনের মধ্যে থাকা সমস্ত আইডেন্টিফায়ার এবং ফাংশন রেফারেন্স সঠিকভাবে ডিক্লেয়ার ও ব্যবহার করা হয়েছে কিনা, তা নিশ্চিত করতে CEL টাইপ-চেকার প্রোটো-ভিত্তিক ডিক্লারেশনগুলো ব্যবহার করে।

অভিব্যক্তি প্রক্রিয়াকরণের পর্যায়গুলি

CEL এক্সপ্রেশন তিনটি ধাপে প্রক্রিয়াজাত করা হয়:

  1. পার্স
  2. চেক
  3. মূল্যায়ন করুন

CEL ব্যবহারের সবচেয়ে প্রচলিত ধরণ হলো কনফিগারেশনের সময় এক্সপ্রেশনগুলো পার্স ও চেক করা, AST সংরক্ষণ করা এবং তারপর রানটাইমে বারবার সেই AST পুনরুদ্ধার ও মূল্যায়ন করা।

সিইএল প্রক্রিয়াকরণের পর্যায়গুলির চিত্রণ

এক্সপ্রেশনগুলো কনফিগারেশন পাথে পার্স ও চেক করা হয়, সংরক্ষণ করা হয় এবং তারপর রিড পাথে এক বা একাধিক কনটেক্সটের সাপেক্ষে মূল্যায়ন করা হয়।

একটি ANTLR লেক্সার এবং পার্সার গ্রামার ব্যবহার করে CEL-কে মানুষের পাঠযোগ্য এক্সপ্রেশন থেকে একটি AST-তে পার্স করা হয়। পার্সিং পর্যায়টি একটি প্রোটো-ভিত্তিক AST তৈরি করে, যেখানে AST-এর প্রতিটি Expr নোডে একটি পূর্ণসংখ্যা ID থাকে যা পার্সিং এবং চেকিংয়ের সময় তৈরি হওয়া মেটাডেটাকে ইনডেক্স করতে ব্যবহৃত হয়। পার্সিংয়ের সময় তৈরি হওয়া syntax.proto ফাইলটি এক্সপ্রেশনটির স্ট্রিং আকারে টাইপ করা বিষয়বস্তুর বিমূর্ত উপস্থাপনা করে।

একটি এক্সপ্রেশন পার্স করার পর, সেটির মধ্যে থাকা সমস্ত ভেরিয়েবল এবং ফাংশন আইডেন্টিফায়ার ডিক্লেয়ার করা হয়েছে এবং সঠিকভাবে ব্যবহৃত হচ্ছে কিনা তা নিশ্চিত করার জন্য সেটিকে এনভায়রনমেন্টের সাথে টাইপ-চেক করা হয়। টাইপ-চেকার একটি checked.proto ফাইল তৈরি করে, যাতে টাইপ, ভেরিয়েবল এবং ফাংশন রেজোলিউশন মেটাডেটা অন্তর্ভুক্ত থাকে, যা ইভ্যালুয়েশন দক্ষতা ব্যাপকভাবে উন্নত করতে পারে।

অবশেষে, কোনো এক্সপ্রেশন পার্স ও যাচাই করার পর, সংরক্ষিত AST-টি মূল্যায়ন করা হয়।

সিইএল মূল্যায়নকারীর তিনটি জিনিস প্রয়োজন:

  • যেকোনো কাস্টম এক্সটেনশনের জন্য ফাংশন বাইন্ডিং
  • পরিবর্তনশীল বাইন্ডিং
  • মূল্যায়ন করার জন্য একটি AST

ফাংশন এবং ভেরিয়েবল বাইন্ডিং অবশ্যই AST কম্পাইল করার সময় ব্যবহৃত বাইন্ডিংয়ের সাথে মিলতে হবে। এই ইনপুটগুলোর যেকোনোটি একাধিক ইভ্যালুয়েশনের ক্ষেত্রে পুনরায় ব্যবহার করা যেতে পারে; যেমন, একটি AST-কে একাধিক ভেরিয়েবল বাইন্ডিং সেটের মাধ্যমে ইভ্যালুয়েট করা, একই ভেরিয়েবল একাধিক AST-এর ক্ষেত্রে ব্যবহার করা, অথবা একটি প্রসেসের জীবনকাল জুড়ে ফাংশন বাইন্ডিংগুলো ব্যবহার করা (যা একটি সাধারণ ঘটনা)।

আনুষ্ঠানিক যাচাইকরণ

রানটাইম মূল্যায়নের পাশাপাশি, সমস্ত সম্ভাব্য ইনপুটের ক্ষেত্রে CEL এক্সপ্রেশন এবং পলিসিগুলোর সঠিকতা গাণিতিকভাবে প্রমাণ করার জন্য সেগুলোকে আনুষ্ঠানিকভাবে যাচাই করা যেতে পারে।

Z3 থিওরেম প্রুভার দ্বারা চালিত, CEL-Java-এর CEL ফর্মাল ভেরিফিকেশন ফ্রেমওয়ার্ক এক্সপ্রেশন এবং CEL পলিসিসমূহকে স্যাটিসফায়াবিলিটি মডিউলো থিওরিজ (SMT) ফর্মুলায় অনুবাদ করে:

  • নিরাপত্তা অপরিবর্তনীয়তা প্রমাণ করুন: assume এবং assert স্পেসিফিকেশন ব্যবহার করে যাচাই করুন যে, ইনপুটের যেকোনো সমন্বয়ের অধীনে গুরুত্বপূর্ণ পলিসিগুলো বাইপাস করা যায় না।
  • যৌক্তিক সমতুল্যতা যাচাই করুন: গাণিতিকভাবে প্রমাণ করুন যে পুনর্গঠিত বা এআই-দ্বারা তৈরি এক্সপ্রেশনগুলো মূল নিয়মটির মতোই হুবহু আচরণ করে।
  • পুঙ্খানুপুঙ্খ বৈধতা নিশ্চিত করুন: গ্যারান্টি দিন যে রক্ষাকবচগুলি (যেমন Kubernetes Validating Admission Policies) সমস্ত ইনপুটের ক্ষেত্রে প্রযোজ্য, অথবা লঙ্ঘিত হলে সুনির্দিষ্ট পাল্টা-উদাহরণ তৈরি করুন।
  • ভুল শনাক্তকরণ দূর করুন: আনম্যাপড কাস্টম ফাংশনগুলোকে আলাদা করতে থ্রি-পাস টেইন্ট ট্র্যাকিং ব্যবহার করুন, যা নিশ্চিত করে যে রিপোর্ট করা লঙ্ঘনগুলো সর্বদা পুনরুৎপাদনযোগ্য বাগ।

ভূমিকা এবং বাস্তব-জগতের উদাহরণের জন্য, গুগল ওপেন সোর্স ব্লগ পোস্টটি দেখুন: Securing the agentic era: Introducing formal verification for CEL

,

কমন এক্সপ্রেশন ল্যাঙ্গুয়েজ (CEL) হলো একটি সাধারণ-উদ্দেশ্যমূলক এক্সপ্রেশন ল্যাঙ্গুয়েজ, যা দ্রুত, বহনযোগ্য এবং নিরাপদে কার্যকর করার জন্য ডিজাইন করা হয়েছে। আপনি CEL নিজে ব্যবহার করতে পারেন অথবা এটিকে কোনো বৃহত্তর পণ্যের মধ্যে অন্তর্ভুক্ত করতে পারেন। রিমোট প্রসিডিউর কল (RPC) রাউটিং থেকে শুরু করে নিরাপত্তা নীতি নির্ধারণ পর্যন্ত বিভিন্ন ধরনের অ্যাপ্লিকেশনের জন্য CEL অত্যন্ত উপযোগী। CEL সম্প্রসারণযোগ্য, প্ল্যাটফর্ম-নিরপেক্ষ, আনুষ্ঠানিকভাবে যাচাইযোগ্য এবং একবার কম্পাইল করে বহুবার মূল্যায়নের কর্মপ্রবাহের জন্য বিশেষভাবে উপযোগী।

ব্যবহারকারীর কোড নিরাপদে চালানোর জন্য CEL বিশেষভাবে ডিজাইন করা হয়েছে। যদিও কোনো ব্যবহারকারীর পাইথন কোডে নির্বিচারে eval() কল করা বিপজ্জনক, আপনি ব্যবহারকারীর CEL কোড নিরাপদে চালাতে পারেন। এবং যেহেতু CEL এমন আচরণ প্রতিরোধ করে যা এর পারফরম্যান্স কমিয়ে দিতে পারে, তাই এটি ন্যানোসেকেন্ড বা মাইক্রোসেকেন্ডের মধ্যে নিরাপদে ইভ্যালুয়েট হয়। CEL-এর এই গতি এবং নিরাপত্তা এটিকে পারফরম্যান্স-নির্ভর অ্যাপ্লিকেশনগুলোর জন্য আদর্শ করে তোলে।

CEL এমন সব এক্সপ্রেশন মূল্যায়ন করে যা এক-লাইনের ফাংশন বা ল্যাম্বডা এক্সপ্রেশনের অনুরূপ। যদিও CEL সাধারণত বুলিয়ান সিদ্ধান্তের জন্য ব্যবহৃত হয়, তবে এটি ব্যবহার করে JSON বা প্রোটোকল বাফার মেসেজের মতো আরও জটিল অবজেক্টও তৈরি করা যায়।

কেন CEL?

অনেক পরিষেবা এবং অ্যাপ্লিকেশন ডিক্লারেটিভ কনফিগারেশন মূল্যায়ন করে। উদাহরণস্বরূপ, রোল-বেসড অ্যাক্সেস কন্ট্রোল (RBAC) হলো একটি ডিক্লারেটিভ কনফিগারেশন যা একজন ব্যবহারকারীর ভূমিকা এবং একদল ব্যবহারকারীর উপর ভিত্তি করে অ্যাক্সেসের সিদ্ধান্ত তৈরি করে। যদিও বেশিরভাগ ক্ষেত্রে ডিক্লারেটিভ কনফিগারেশনই যথেষ্ট, কখনও কখনও আরও বেশি প্রকাশক্ষমতার প্রয়োজন হয়। আর এখানেই CEL-এর ভূমিকা আসে।

CEL ব্যবহার করে একটি ডিক্লারেটিভ কনফিগারেশন সম্প্রসারণের উদাহরণ হিসেবে, গুগল ক্লাউড আইডেন্টিটি অ্যান্ড অ্যাক্সেস ম্যানেজমেন্ট (IAM)- এর সক্ষমতাগুলো বিবেচনা করুন। যদিও RBAC একটি সাধারণ পদ্ধতি, IAM ব্যবহারকারীদের অনুরোধের প্রোটো মেসেজ প্রোপার্টি বা অ্যাক্সেস করা রিসোর্স অনুযায়ী রোল-ভিত্তিক গ্রান্টের পরিধি আরও সীমাবদ্ধ করার জন্য CEL এক্সপ্রেশন প্রদান করে। ডেটা মডেলের মাধ্যমে এই ধরনের শর্ত বর্ণনা করলে একটি জটিল API সারফেস তৈরি হবে, যা নিয়ে কাজ করা কঠিন। এর পরিবর্তে, অ্যাট্রিবিউট-ভিত্তিক অ্যাক্সেস কন্ট্রোল (ABAC)-এর সাথে CEL ব্যবহার করা RBAC-এর একটি এক্সপ্রেসিভ এবং শক্তিশালী সম্প্রসারণ।

CEL-এর মূল ধারণাগুলি

CEL-এ, একটি এক্সপ্রেশনকে একটি এনভায়রনমেন্টের সাপেক্ষে কম্পাইল করা হয়। কম্পাইলেশন ধাপটি প্রোটোকল বাফার ফরম্যাটে একটি অ্যাবস্ট্রাক্ট সিনট্যাক্স ট্রি (AST) তৈরি করে। ইভ্যালুয়েশনকে যথাসম্ভব দ্রুত রাখার জন্য কম্পাইল করা এক্সপ্রেশনগুলো ভবিষ্যতের ব্যবহারের জন্য সংরক্ষণ করা হয়। একটিমাত্র কম্পাইল করা এক্সপ্রেশনকে বিভিন্ন ইনপুট দিয়ে ইভ্যালুয়েট করা যেতে পারে।

এখানে এই ধারণাগুলোর কয়েকটি আরও বিশদভাবে আলোচনা করা হলো।

অভিব্যক্তি

এক্সপ্রেশন ব্যবহারকারীরা লিখে থাকেন। এক্সপ্রেশনগুলো এক-লাইনের ফাংশন বডি বা ল্যাম্বডা এক্সপ্রেশনের অনুরূপ। যে ফাংশন সিগনেচারটি ইনপুট ঘোষণা করে, তা CEL এক্সপ্রেশনের বাইরে লেখা হয় এবং CEL-এর জন্য উপলব্ধ ফাংশন লাইব্রেরিটি স্বয়ংক্রিয়ভাবে ইম্পোর্ট হয়ে যায়।

উদাহরণস্বরূপ, নিম্নলিখিত CEL এক্সপ্রেশনটি একটি রিকোয়েস্ট অবজেক্ট গ্রহণ করে, এবং রিকোয়েস্টটিতে একটি claims টোকেন অন্তর্ভুক্ত থাকে। এক্সপ্রেশনটি একটি বুলিয়ান ভ্যালু রিটার্ন করে যা নির্দেশ করে যে claims টোকেনটি এখনও বৈধ কিনা।

একটি ক্লেইমস টোকেন প্রমাণীকরণের জন্য CEL এক্সপ্রেশনের উদাহরণ

// Check whether a JSON Web Token has expired by inspecting the 'exp' claim.
//
// Args:
//   claims - authentication claims.
//   now    - timestamp indicating the current system time.
// Returns: true if the token has expired.
//
timestamp(claims["exp"]) < now

ব্যবহারকারীরা CEL এক্সপ্রেশন নির্ধারণ করলেও, সার্ভিস এবং অ্যাপ্লিকেশনগুলো সেই পরিবেশ নির্ধারণ করে যেখানে এটি চলে।

পরিবেশ

এনভায়রনমেন্ট সার্ভিস দ্বারা সংজ্ঞায়িত হয় । যে সকল সার্ভিস ও অ্যাপ্লিকেশন CEL অন্তর্ভুক্ত করে, তারা ‘এনভায়রনমেন্ট’ এক্সপ্রেশনটি ঘোষণা করে। এনভায়রনমেন্ট হলো ভেরিয়েবল ও ফাংশনগুলোর একটি সংগ্রহ যা CEL এক্সপ্রেশনে ব্যবহার করা যায়।

উদাহরণস্বরূপ, নিম্নলিখিত textproto কোডটি একটি CEL পরিষেবা থেকে CompileRequest বার্তা ব্যবহার করে request এবং now ভেরিয়েবল ধারণকারী একটি এনভায়রনমেন্ট ঘোষণা করে।

CEL পরিবেশ ঘোষণার উদাহরণ

# Format: $SOURCE_PATH/service.proto#CompileRequest
declarations {
  name: "request"
  ident {
    type { message_type: "google.rpc.context.AttributeContext.Request" }
  }
}
declarations {
  name: "now"
  ident {
    type { well_known: "TIMESTAMP" }
  }
}

একটি এক্সপ্রেশনের মধ্যে থাকা সমস্ত আইডেন্টিফায়ার এবং ফাংশন রেফারেন্স সঠিকভাবে ডিক্লেয়ার ও ব্যবহার করা হয়েছে কিনা, তা নিশ্চিত করতে CEL টাইপ-চেকার প্রোটো-ভিত্তিক ডিক্লারেশনগুলো ব্যবহার করে।

অভিব্যক্তি প্রক্রিয়াকরণের পর্যায়গুলি

CEL এক্সপ্রেশন তিনটি ধাপে প্রক্রিয়াজাত করা হয়:

  1. পার্স
  2. চেক
  3. মূল্যায়ন করুন

CEL ব্যবহারের সবচেয়ে প্রচলিত ধরণ হলো কনফিগারেশনের সময় এক্সপ্রেশনগুলো পার্স ও চেক করা, AST সংরক্ষণ করা এবং তারপর রানটাইমে বারবার সেই AST পুনরুদ্ধার ও মূল্যায়ন করা।

সিইএল প্রক্রিয়াকরণের পর্যায়গুলির চিত্রণ

এক্সপ্রেশনগুলো কনফিগারেশন পাথে পার্স ও চেক করা হয়, সংরক্ষণ করা হয় এবং তারপর রিড পাথে এক বা একাধিক কনটেক্সটের সাপেক্ষে মূল্যায়ন করা হয়।

একটি ANTLR লেক্সার এবং পার্সার গ্রামার ব্যবহার করে CEL-কে মানুষের পাঠযোগ্য এক্সপ্রেশন থেকে একটি AST-তে পার্স করা হয়। পার্সিং পর্যায়টি একটি প্রোটো-ভিত্তিক AST তৈরি করে, যেখানে AST-এর প্রতিটি Expr নোডে একটি পূর্ণসংখ্যা ID থাকে যা পার্সিং এবং চেকিংয়ের সময় তৈরি হওয়া মেটাডেটাকে ইনডেক্স করতে ব্যবহৃত হয়। পার্সিংয়ের সময় তৈরি হওয়া syntax.proto ফাইলটি এক্সপ্রেশনটির স্ট্রিং আকারে টাইপ করা বিষয়বস্তুর বিমূর্ত উপস্থাপনা করে।

একটি এক্সপ্রেশন পার্স করার পর, সেটির মধ্যে থাকা সমস্ত ভেরিয়েবল এবং ফাংশন আইডেন্টিফায়ার ডিক্লেয়ার করা হয়েছে এবং সঠিকভাবে ব্যবহৃত হচ্ছে কিনা তা নিশ্চিত করার জন্য সেটিকে এনভায়রনমেন্টের সাথে টাইপ-চেক করা হয়। টাইপ-চেকার একটি checked.proto ফাইল তৈরি করে, যাতে টাইপ, ভেরিয়েবল এবং ফাংশন রেজোলিউশন মেটাডেটা অন্তর্ভুক্ত থাকে, যা ইভ্যালুয়েশন দক্ষতা ব্যাপকভাবে উন্নত করতে পারে।

অবশেষে, কোনো এক্সপ্রেশন পার্স ও যাচাই করার পর, সংরক্ষিত AST-টি মূল্যায়ন করা হয়।

সিইএল মূল্যায়নকারীর তিনটি জিনিস প্রয়োজন:

  • যেকোনো কাস্টম এক্সটেনশনের জন্য ফাংশন বাইন্ডিং
  • পরিবর্তনশীল বাইন্ডিং
  • মূল্যায়ন করার জন্য একটি AST

ফাংশন এবং ভেরিয়েবল বাইন্ডিং অবশ্যই AST কম্পাইল করার সময় ব্যবহৃত বাইন্ডিংয়ের সাথে মিলতে হবে। এই ইনপুটগুলোর যেকোনোটি একাধিক ইভ্যালুয়েশনের ক্ষেত্রে পুনরায় ব্যবহার করা যেতে পারে; যেমন, একটি AST-কে একাধিক ভেরিয়েবল বাইন্ডিং সেটের মাধ্যমে ইভ্যালুয়েট করা, একই ভেরিয়েবল একাধিক AST-এর ক্ষেত্রে ব্যবহার করা, অথবা একটি প্রসেসের জীবনকাল জুড়ে ফাংশন বাইন্ডিংগুলো ব্যবহার করা (যা একটি সাধারণ ঘটনা)।

আনুষ্ঠানিক যাচাইকরণ

রানটাইম মূল্যায়নের পাশাপাশি, সমস্ত সম্ভাব্য ইনপুটের ক্ষেত্রে CEL এক্সপ্রেশন এবং পলিসিগুলোর সঠিকতা গাণিতিকভাবে প্রমাণ করার জন্য সেগুলোকে আনুষ্ঠানিকভাবে যাচাই করা যেতে পারে।

Z3 থিওরেম প্রুভার দ্বারা চালিত, CEL-Java-এর CEL ফর্মাল ভেরিফিকেশন ফ্রেমওয়ার্ক এক্সপ্রেশন এবং CEL পলিসিসমূহকে স্যাটিসফায়াবিলিটি মডিউলো থিওরিজ (SMT) ফর্মুলায় অনুবাদ করে:

  • নিরাপত্তা অপরিবর্তনীয়তা প্রমাণ করুন: assume এবং assert স্পেসিফিকেশন ব্যবহার করে যাচাই করুন যে, ইনপুটের যেকোনো সমন্বয়ের অধীনে গুরুত্বপূর্ণ পলিসিগুলো বাইপাস করা যায় না।
  • যৌক্তিক সমতুল্যতা যাচাই করুন: গাণিতিকভাবে প্রমাণ করুন যে পুনর্গঠিত বা এআই-দ্বারা তৈরি এক্সপ্রেশনগুলো মূল নিয়মটির মতোই হুবহু আচরণ করে।
  • পুঙ্খানুপুঙ্খ বৈধতা নিশ্চিত করুন: গ্যারান্টি দিন যে রক্ষাকবচগুলি (যেমন Kubernetes Validating Admission Policies) সমস্ত ইনপুটের ক্ষেত্রে প্রযোজ্য, অথবা লঙ্ঘিত হলে সুনির্দিষ্ট পাল্টা-উদাহরণ তৈরি করুন।
  • ভুল শনাক্তকরণ দূর করুন: আনম্যাপড কাস্টম ফাংশনগুলোকে আলাদা করতে থ্রি-পাস টেইন্ট ট্র্যাকিং ব্যবহার করুন, যা নিশ্চিত করে যে রিপোর্ট করা লঙ্ঘনগুলো সর্বদা পুনরুৎপাদনযোগ্য বাগ।

ভূমিকা এবং বাস্তব-জগতের উদাহরণের জন্য, গুগল ওপেন সোর্স ব্লগ পোস্টটি দেখুন: Securing the agentic era: Introducing formal verification for CEL