প্রাইভেট ভল্ট: অ্যালয়ডিবি রো-লেভেল সিকিউরিটির মাধ্যমে 'জিরো ট্রাস্ট ইন্টেলিজেন্স' তৈরি করা

১. সংক্ষিপ্ত বিবরণ

GenAI অ্যাপ্লিকেশন তৈরির তাড়াহুড়োতে আমরা প্রায়শই সবচেয়ে গুরুত্বপূর্ণ উপাদানটি ভুলে যাই: নিরাপত্তা।

ধরুন আপনি একটি এইচআর চ্যাটবট তৈরি করছেন। আপনি চান এটি "আমার বেতন কত?" বা "আমার টিম কেমন কাজ করছে?"- এর মতো প্রশ্নের উত্তর দিক।

  • যদি অ্যালিস (একজন সাধারণ কর্মচারী) অনুরোধ করে, তবে তার শুধু নিজের তথ্যই দেখা উচিত।
  • যদি বব (একজন ম্যানেজার) জিজ্ঞাসা করেন, তাহলে তার দলের ডেটা দেখা উচিত।

সমস্যাটি

বেশিরভাগ RAG (Retrieval Augmented Generation) আর্কিটেকচার অ্যাপ্লিকেশন লেয়ারেই এটি সামলানোর চেষ্টা করে। তারা ডেটা পুনরুদ্ধার করার পর সেগুলোকে ফিল্টার করে, অথবা LLM-এর 'সঠিকভাবে কাজ করার' উপর নির্ভর করে। এই ব্যবস্থাটি বেশ ভঙ্গুর। যদি অ্যাপের লজিক ব্যর্থ হয়, তাহলে ডেটা ফাঁস হয়ে যায়।

সমাধান

নিরাপত্তাকে ডাটাবেস লেয়ার পর্যন্ত পৌঁছে দিন। AlloyDB- তে PostgreSQL রো-লেভেল সিকিউরিটি (RLS) ব্যবহার করে আমরা নিশ্চিত করি যে, AI যা-ই অনুরোধ করুক না কেন, ব্যবহারকারীর দেখার অনুমতি নেই এমন ডেটা ডাটাবেস শারীরিকভাবে ফেরত দিতে অস্বীকার করে

এই নির্দেশিকায়, আমরা "দ্য প্রাইভেট ভল্ট" তৈরি করব: একটি সুরক্ষিত এইচআর অ্যাসিস্ট্যান্ট যা কে লগ ইন করেছেন তার উপর ভিত্তি করে গতিশীলভাবে তার উত্তর পরিবর্তন করে।

1e095ac5fe069bb6.png

স্থাপত্য

আমরা পাইথনে জটিল পারমিশন লজিক তৈরি করছি না। আমরা সরাসরি ডাটাবেস ইঞ্জিনটিই ব্যবহার করছি।

  1. ইন্টারফেস: একটি সাধারণ স্ট্রিমলিট অ্যাপ যা লগইন অনুকরণ করে।
  2. মস্তিষ্ক: অ্যালয়ডিবি এআই (পোস্টগ্রেসকিউএল সামঞ্জস্যপূর্ণ)।
  3. কার্যপ্রণালী: আমরা প্রতিটি লেনদেনের শুরুতে একটি সেশন ভেরিয়েবল ( app.active_user ) সেট করি। ডাটাবেস পলিসিগুলো সারিগুলো ফিল্টার করার জন্য স্বয়ংক্রিয়ভাবে user_roles টেবিলটি (যা আমাদের আইডেন্টিটি প্রোভাইডার হিসেবে কাজ করে) পরীক্ষা করে।

আপনি যা তৈরি করবেন

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

আপনি যা শিখবেন

আপনি শিখবেন:

  • RLS-এর জন্য কীভাবে একটি স্কিমা ডিজাইন করবেন (ডেটা এবং আইডেন্টিটি পৃথক করে)।
  • কিভাবে PostgreSQL পলিসি লিখতে হয় ( CREATE POLICY )।
  • FORCE ROW LEVEL SECURITY ব্যবহার করে কীভাবে "টেবিল ওনার" ছাড়টি বাইপাস করা যায়।
  • কীভাবে এমন একটি পাইথন অ্যাপ তৈরি করবেন যা ব্যবহারকারীদের জন্য "কন্টেক্সট সুইচিং" করতে পারে।

প্রয়োজনীয়তা

  • একটি ব্রাউজার, যেমন ক্রোম বা ফায়ারফক্স
  • বিলিং সক্ষম একটি গুগল ক্লাউড প্রজেক্ট।
  • ক্লাউড শেল অথবা এমন একটি টার্মিনালে অ্যাক্সেস, যেখানে gcloud এবং psql ইনস্টল করা আছে।

২. শুরু করার আগে

একটি প্রকল্প তৈরি করুন

  1. গুগল ক্লাউড কনসোলের প্রজেক্ট সিলেক্টর পেজে, একটি গুগল ক্লাউড প্রজেক্ট নির্বাচন করুন বা তৈরি করুন।
  2. আপনার ক্লাউড প্রোজেক্টের জন্য বিলিং চালু আছে কিনা তা নিশ্চিত করুন। কোনো প্রোজেক্টে বিলিং চালু আছে কিনা তা কীভাবে পরীক্ষা করবেন, তা জেনে নিন
  1. আপনি ক্লাউড শেল ব্যবহার করবেন, যা গুগল ক্লাউডে চালিত একটি কমান্ড-লাইন পরিবেশ। গুগল ক্লাউড কনসোলের শীর্ষে থাকা ‘Activate Cloud Shell’-এ ক্লিক করুন।

ক্লাউড শেল সক্রিয় করুন বোতামের ছবি

  1. ক্লাউড শেলে সংযুক্ত হওয়ার পর, আপনি নিম্নলিখিত কমান্ডটি ব্যবহার করে যাচাই করে নিন যে আপনি ইতিমধ্যেই প্রমাণীকৃত এবং প্রজেক্টটি আপনার প্রজেক্ট আইডিতে সেট করা আছে:
gcloud auth list
  1. gcloud কমান্ডটি আপনার প্রজেক্ট সম্পর্কে অবগত আছে কিনা, তা নিশ্চিত করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান।
gcloud config list project
  1. আপনার প্রজেক্টটি সেট করা না থাকলে, এটি সেট করতে নিম্নলিখিত কমান্ডটি ব্যবহার করুন:
gcloud config set project <YOUR_PROJECT_ID>
  1. প্রয়োজনীয় এপিআইগুলো সক্রিয় করুন: লিঙ্কটি অনুসরণ করুন এবং এপিআইগুলো সক্রিয় করুন।

বিকল্পভাবে আপনি এর জন্য gcloud কমান্ড ব্যবহার করতে পারেন। gcloud কমান্ড এবং এর ব্যবহার সম্পর্কে জানতে ডকুমেন্টেশন দেখুন।

gcloud services enable \
  alloydb.googleapis.com \
  compute.googleapis.com \
  cloudresourcemanager.googleapis.com \
  servicenetworking.googleapis.com \
  aiplatform.googleapis.com

অপ্রত্যাশিত সমস্যা ও সমাধান

"ঘোস্ট প্রজেক্ট" সিন্ড্রোম

আপনি gcloud config set project চালিয়েছেন, কিন্তু কনসোল UI-তে আপনি আসলে একটি ভিন্ন প্রজেক্ট দেখছেন। উপরের বাম দিকের ড্রপডাউনে প্রজেক্ট আইডিটি যাচাই করুন!

বিলিং ব্যারিকেড

আপনি প্রজেক্টটি চালু করেছেন, কিন্তু বিলিং অ্যাকাউন্টটি দিতে ভুলে গেছেন। AlloyDB একটি উচ্চ-ক্ষমতাসম্পন্ন ইঞ্জিন; এর 'গ্যাস ট্যাঙ্ক' (বিলিং) খালি থাকলে এটি চালু হবে না।

এপিআই প্রচার বিলম্ব

আপনি "এপিআই সক্ষম করুন" এ ক্লিক করেছেন, কিন্তু কমান্ড লাইনে এখনও Service Not Enabled দেখাচ্ছে। ৬০ সেকেন্ড অপেক্ষা করুন। ক্লাউডের তার নিউরনগুলোকে সজাগ হতে কিছুটা সময় লাগে।

কোটা কোয়াগস

আপনি যদি একটি একেবারে নতুন ট্রায়াল অ্যাকাউন্ট ব্যবহার করেন, তাহলে AlloyDB ইনস্ট্যান্সের জন্য আপনার আঞ্চলিক কোটা শেষ হয়ে যেতে পারে। যদি us-central1 কাজ না করে, তাহলে us-east1 চেষ্টা করুন।

৩. ডাটাবেস সেটআপ

এই ল্যাবে আমরা পরীক্ষার ডেটার জন্য ডাটাবেস হিসেবে AlloyDB ব্যবহার করব। এটি ডাটাবেস এবং লগের মতো সমস্ত রিসোর্স ধারণ করার জন্য ক্লাস্টার ব্যবহার করে। প্রতিটি ক্লাস্টারে একটি প্রাইমারি ইনস্ট্যান্স থাকে যা ডেটাতে অ্যাক্সেস পয়েন্ট সরবরাহ করে। টেবিলগুলোতে আসল ডেটা থাকবে।

চলুন একটি AlloyDB ক্লাস্টার, ইনস্ট্যান্স এবং টেবিল তৈরি করি যেখানে টেস্ট ডেটাসেটটি লোড করা হবে।

  1. নিচের বোতামটিতে ক্লিক করুন অথবা লিঙ্কটি কপি করে আপনার ব্রাউজারে পেস্ট করুন, যেখানে গুগল ক্লাউড কনসোল ব্যবহারকারী লগ ইন করা আছেন।

  1. এই ধাপটি সম্পন্ন হলে রিপোটি আপনার লোকাল ক্লাউড শেল এডিটরে ক্লোন করা হবে এবং আপনি প্রজেক্ট ফোল্ডার থেকে নিচের কমান্ডটি চালাতে পারবেন (আপনাকে অবশ্যই প্রজেক্ট ডিরেক্টরিতে থাকতে হবে):
sh run.sh
  1. এখন UI ব্যবহার করুন (টার্মিনালে থাকা লিঙ্কে ক্লিক করে অথবা টার্মিনালে থাকা 'preview on web' লিঙ্কে ক্লিক করে)।
  2. শুরু করার জন্য আপনার প্রজেক্ট আইডি, ক্লাস্টার এবং ইনস্ট্যান্সের নামগুলোর বিবরণ লিখুন।
  3. লগগুলো স্ক্রল হতে হতে আপনি এক কাপ কফি নিয়ে আসুন এবং পর্দার আড়ালে এটি কীভাবে কাজ করছে তা এখানে পড়ে নিন। এতে প্রায় ১০-১৫ মিনিট সময় লাগতে পারে।

অপ্রত্যাশিত সমস্যা ও সমাধান

"ধৈর্য" সমস্যা

ডাটাবেস ক্লাস্টার একটি ভারী অবকাঠামো। যদি আপনি পৃষ্ঠাটি রিফ্রেশ করেন বা ক্লাউড শেল সেশনটি "আটকে গেছে" ভেবে বন্ধ করে দেন, তাহলে এর ফলে একটি "ঘোস্ট" ইনস্ট্যান্স তৈরি হতে পারে যা আংশিকভাবে প্রোভিশন করা এবং ম্যানুয়াল হস্তক্ষেপ ছাড়া মুছে ফেলা অসম্ভব।

অঞ্চলের অমিল

আপনি যদি us-central1 এ আপনার API-গুলো সক্রিয় করে asia-south1 এ ক্লাস্টারটি প্রোভিশন করার চেষ্টা করেন, তাহলে আপনি কোটা সংক্রান্ত সমস্যা বা সার্ভিস অ্যাকাউন্টের অনুমতি পেতে বিলম্বের সম্মুখীন হতে পারেন। পুরো ল্যাবের জন্য একটি অঞ্চলেই সীমাবদ্ধ থাকুন!

জম্বি ক্লাস্টার

যদি আপনি আগে কোনো ক্লাস্টারের জন্য একই নাম ব্যবহার করে থাকেন এবং সেটি মুছে না ফেলেন, তাহলে স্ক্রিপ্টটি বলতে পারে যে ক্লাস্টারের নামটি ইতিমধ্যেই বিদ্যমান। একটি প্রোজেক্টের মধ্যে ক্লাস্টারের নাম অবশ্যই অনন্য হতে হবে।

ক্লাউড শেল টাইমআউট

আপনার কফি বিরতি যদি ৩০ মিনিটের হয়, তাহলে ক্লাউড শেল স্লিপ মোডে চলে যেতে পারে এবং sh run.sh প্রসেসটির সংযোগ বিচ্ছিন্ন করে দিতে পারে। ট্যাবটি সক্রিয় রাখুন!

৪. স্কিমা প্রোভিশনিং

এই ধাপে আমরা নিম্নলিখিত বিষয়গুলো আলোচনা করব:

d05d7d2706c689dc.png

এখানে বিস্তারিত ধাপে ধাপে করণীয় কাজগুলো দেওয়া হলো:

আপনার AlloyDB ক্লাস্টার এবং ইনস্ট্যান্স চালু হয়ে গেলে, AI এক্সটেনশনগুলি সক্রিয় করতে এবং স্কিমাটি প্রোভিশন করতে AlloyDB Studio SQL এডিটরে যান।

1e3ac974b18a8113.png

আপনার ইনস্ট্যান্সটি তৈরি হওয়া শেষ না হওয়া পর্যন্ত আপনাকে অপেক্ষা করতে হতে পারে। এটি তৈরি হয়ে গেলে, ক্লাস্টার তৈরির সময় আপনি যে ক্রেডেনশিয়ালগুলো তৈরি করেছিলেন, সেগুলো ব্যবহার করে AlloyDB-তে সাইন ইন করুন। PostgreSQL-এ প্রমাণীকরণের জন্য নিম্নলিখিত ডেটা ব্যবহার করুন:

  • ব্যবহারকারীর নাম : " postgres "
  • ডাটাবেস : " postgres "
  • পাসওয়ার্ড : " alloydb " (অথবা তৈরির সময় আপনি যা সেট করেছিলেন)

AlloyDB Studio-তে সফলভাবে প্রমাণীকরণের পর, এডিটর-এ SQL কমান্ডগুলো প্রবেশ করানো হয়। শেষ উইন্ডোটির ডানদিকে থাকা প্লাস চিহ্নটি ব্যবহার করে আপনি একাধিক এডিটর উইন্ডো যোগ করতে পারেন।

28cb9a8b6aa0789f.png

আপনি এডিটর উইন্ডোতে AlloyDB-এর জন্য কমান্ড লিখবেন এবং প্রয়োজন অনুযায়ী Run, Format ও Clear অপশনগুলো ব্যবহার করবেন।

একটি টেবিল তৈরি করুন

আমাদের দুটি টেবিল প্রয়োজন: একটি সংবেদনশীল ডেটার (কর্মচারী) জন্য এবং অন্যটি পরিচয় বিধিগুলির (ব্যবহারকারীর ভূমিকা) জন্য। পলিসিতে "অসীম পুনরাবৃত্তি" ত্রুটি এড়ানোর জন্য এগুলিকে আলাদা করা অত্যন্ত গুরুত্বপূর্ণ।

আপনি AlloyDB Studio-তে নিচের DDL স্টেটমেন্টটি ব্যবহার করে একটি টেবিল তৈরি করতে পারেন:

-- 1. Create User Roles (The Identity Provider)
CREATE TABLE user_roles (
    username TEXT PRIMARY KEY,
    role TEXT -- 'employee', 'manager', 'admin'
);

INSERT INTO user_roles (username, role) VALUES
('Alice', 'employee'),
('Bob', 'manager'),
('Charlie', 'employee');

-- 2. Create the Data Table
CREATE TABLE employees (
    id SERIAL PRIMARY KEY,
    name TEXT,
    salary INTEGER,
    performance_review TEXT
);

INSERT INTO employees (name, salary, performance_review) VALUES
('Alice', 80000, 'Alice meets expectations but needs to improve punctuality.'),
('Bob', 120000, 'Bob is a strong leader. Team morale is high.'),
('Charlie', 85000, 'Charlie exceeds expectations. Ready for promotion.');

অপ্রত্যাশিত সমস্যা ও সমাধান

কর্মচারী টেবিলের ভিতরে ভূমিকা নির্ধারণ করার সময় অসীম পুনরাবৃত্তি সনাক্ত করা হয়েছে।

ব্যর্থতার কারণ: যদি আপনার পলিসিতে বলা থাকে "আমি ম্যানেজার কিনা তা দেখতে এমপ্লয়ি টেবিল চেক করুন," তাহলে পলিসিটি যাচাই করার জন্য ডাটাবেসকে টেবিলটি কোয়েরি করতে হয়, যা পলিসিটিকে আবার সক্রিয় করে তোলে। ফলাফল: অসীম পুনরাবৃত্তি (Infinite recursion) শনাক্ত হয়। সমাধান: সর্বদা একটি পৃথক লুকআপ টেবিল (user_roles) রাখুন অথবা রোলের জন্য প্রকৃত ডাটাবেস ইউজার ব্যবহার করুন।

ডেটা যাচাই করুন:

SELECT count(*) FROM employees;
-- Output: 3

৫. নিরাপত্তা সক্রিয় ও বলবৎ করুন

এখন আমরা শিল্ডগুলো চালু করব। আমরা একটি জেনেরিক "অ্যাপ ইউজার"ও তৈরি করব, যা আমাদের পাইথন কোড সংযোগ স্থাপনের জন্য ব্যবহার করবে।

AlloyDB কোয়েরি এডিটর থেকে নিচের SQL স্টেটমেন্টটি চালান:

-- 1. Activate RLS
ALTER TABLE employees ENABLE ROW LEVEL SECURITY;


-- 2. CRITICAL: Force RLS for Table Owners
ALTER TABLE employees FORCE ROW LEVEL SECURITY;


-- 3. Create the Application User
DO
$do$
BEGIN
   IF NOT EXISTS (SELECT FROM pg_catalog.pg_roles WHERE rolname = 'app_user') THEN
      CREATE ROLE app_user LOGIN PASSWORD 'password';
   END IF;
END
$do$;


-- 4. Grant Access
GRANT SELECT ON employees TO app_user;
GRANT SELECT ON user_roles TO app_user;

অপ্রত্যাশিত সমস্যা ও সমাধান

পোস্টগ্রেস (সুপারইউজার) হিসেবে পরীক্ষা করে সমস্ত ডেটা দেখতে পাচ্ছি।

কেন এটি ব্যর্থ হয়: ডিফল্টরূপে, RLS টেবিলের মালিক বা সুপারইউজারদের উপর প্রযোজ্য হয় না। তারা সমস্ত পলিসি এড়িয়ে যায়। সমস্যা সমাধান: যদি আপনার পলিসিগুলো "ত্রুটিপূর্ণ" (সবকিছু অনুমোদন করছে) বলে মনে হয়, তবে আপনি postgres হিসেবে লগ ইন করেছেন কিনা তা পরীক্ষা করুন। সমাধান: FORCE ROW LEVEL SECURITY কমান্ডটি নিশ্চিত করে যে এমনকি মালিকও নিয়মগুলোর অধীন থাকবে। পরীক্ষার জন্য এটি অপরিহার্য।

৬. অ্যাক্সেস নীতিগুলি তৈরি করুন

আমরা একটি সেশন ভেরিয়েবল (app.active_user) ব্যবহার করে দুটি নিয়ম নির্ধারণ করব, যা আমরা পরবর্তীতে আমাদের অ্যাপ্লিকেশন কোড থেকে সেট করব।

AlloyDB কোয়েরি এডিটর থেকে নিচের SQL স্টেটমেন্টটি চালান:

-- Policy 1: Self-View
-- Users can see rows where their name matches the session variable
CREATE POLICY "view_own_data" ON employees
FOR SELECT
USING (name = current_setting('app.active_user', true));

-- Policy 2: Manager-View
-- Managers can see ALL rows.
CREATE POLICY "manager_view_all" ON employees
FOR SELECT
USING (
    EXISTS (
        SELECT 1 FROM user_roles
        WHERE username = current_setting('app.active_user', true)
        AND role = 'manager'
    )
);

অপ্রত্যাশিত সমস্যা ও সমাধান

app.active_user-এর পরিবর্তে current_user ব্যবহার করা হচ্ছে।

সমস্যা: Current_user একটি সংরক্ষিত SQL কীওয়ার্ড যা ডাটাবেস রোল (যেমন, app_user) রিটার্ন করে। আমাদের অ্যাপ্লিকেশন ইউজার (যেমন, Alice) প্রয়োজন। সমাধান: সবসময় app.variable_name-এর মতো একটি কাস্টম নেমস্পেস ব্যবহার করুন

current_settingtrue প্যারামিটারটি ভুলে যাওয়া হচ্ছে।

সমস্যা: ভেরিয়েবলটি সেট করা না থাকলে, কোয়েরিটি একটি ত্রুটি দেখিয়ে ক্র্যাশ করে। সমাধান: `current_setting('...', true)` ক্র্যাশ করার পরিবর্তে `NULL` রিটার্ন করে, যার ফলে নিরাপদে ০টি সারি ফেরত আসে।

৭. "ক্যামেলিয়ন" অ্যাপটি তৈরি করুন।

আমরা অ্যাপ্লিকেশন লজিক সিমুলেট করতে পাইথন এবং স্ট্রিমলিট ব্যবহার করব।

296a980887b5c700.png

ক্লাউড শেল টার্মিনাল এডিটর মোডে খুলুন, আপনার রুট ফোল্ডারে অথবা সেই ডিরেক্টরিতে যান যেখানে আপনি এই অ্যাপ্লিকেশনটি তৈরি করতে চান। একটি নতুন ফোল্ডার তৈরি করুন।

১. নির্ভরশীলতাগুলো ইনস্টল করুন:

আপনার নতুন প্রজেক্ট ডিরেক্টরির ভেতর থেকে ক্লাউড শেল টার্মিনালে নিম্নলিখিত কমান্ডটি চালান:

pip install streamlit psycopg2-binary

২. app.py তৈরি করুন:

app.py নামে একটি নতুন ফাইল তৈরি করুন এবং রিপো ফাইল থেকে কন্টেন্ট কপি করুন।

import streamlit as st
import psycopg2

# CONFIGURATION (Replace with your IP)
DB_HOST = "10.x.x.x"
DB_NAME = "postgres"
DB_USER = "postgres"
DB_PASS = "alloydb"

def get_db_connection():
    return psycopg2.connect(
        host=DB_HOST, database=DB_NAME, user=DB_USER, password=DB_PASS
    )

def query_database(user_name):
    conn = get_db_connection()
    try:
        with conn.cursor() as cur:
            # THE SECURITY HANDSHAKE
            # We tell the database: "For this transaction, I am acting as..."
            cur.execute(f"SET app.active_user = '{user_name}';")
            
            # THE BLIND QUERY
            # We ask for EVERYTHING. The database silently filters it.
            cur.execute("SELECT name, role, salary, performance_review FROM employees;")
            return cur.fetchall()
    finally:
        conn.close()

# UI
st.title("🛡️ The Private Vault")
user = st.sidebar.radio("Act as User:", ["Alice", "Bob", "Charlie", "Eve"])

if st.button("Access Data"):
    results = query_database(user)
    if not results:
        st.error("🚫 Access Denied.")
    else:
        st.success(f"Viewing data as {user}")
        for row in results:
            st.write(row)

৩. অ্যাপটি চালান:

আপনার নতুন প্রজেক্ট ডিরেক্টরির ভেতর থেকে ক্লাউড শেল টার্মিনালে নিম্নলিখিত কমান্ডটি চালান:

streamlit run app.py --server.port 8080 --server.enableCORS false

অপ্রত্যাশিত সমস্যা ও সমাধান

সংযোগ পুলিং।

ঝুঁকি: আপনি যদি কানেকশন পুল ব্যবহার করেন, তাহলে SET app.active_user সেশন ভেরিয়েবলটি কানেকশনে থেকে যেতে পারে এবং পরবর্তী যে ব্যবহারকারী সেই কানেকশনটি গ্রহণ করবে তার কাছে "লিক" হয়ে যেতে পারে। সমাধান: প্রোডাকশনে, পুলে কোনো কানেকশন ফেরত দেওয়ার সময় সর্বদা RESET app.active_user অথবা DISCARD ALL ব্যবহার করুন।

ক্লাউড শেলে ফাঁকা স্ক্রিন।

সমাধান: পোর্ট ৮০৮০-তে 'ওয়েব প্রিভিউ' বাটনটি ব্যবহার করুন। টার্মিনালে লোকালহোস্ট লিঙ্কে ক্লিক করবেন না।

৮. জিরো ট্রাস্ট যাচাই করুন

জিরো ট্রাস্ট বাস্তবায়ন নিশ্চিত করতে অ্যাপটি ব্যবহার করে দেখুন:

'অ্যালিস' নির্বাচন করুন: সে ১টি সারি (নিজেকে) দেখতে পাবে।

b3b7e374fa66ac87.png

'বব' নির্বাচন করুন: তিনি ৩টি সারি (সবাইকে) দেখতে পাবেন।

fdc65cb1acdee8a4.png

এআই এজেন্টদের জন্য এটি কেন গুরুত্বপূর্ণ

আপনার মডেলটিকে এই ডেটাবেসের সাথে সংযুক্ত করার কথা ভাবুন। যদি কোনো ব্যবহারকারী আপনার মডেলকে জিজ্ঞাসা করে: "সমস্ত পারফরম্যান্স রিভিউর সারসংক্ষেপ দাও", তাহলে এটি SELECT performance_review FROM employees আউটপুটটি তৈরি করবে।

  1. আরএলএস ছাড়া: আপনার মডেল সবার ব্যক্তিগত রিভিউ সংগ্রহ করে অ্যালিসের কাছে ফাঁস করে দেয়।
  2. RLS-এর ক্ষেত্রে: আপনার মডেলটি হুবহু একই কোয়েরি চালায়, কিন্তু ডাটাবেস শুধু অ্যালিসের রিভিউটি ফেরত দেয়।

এটাই হলো জিরো-ট্রাস্ট এআই। আপনি ডেটা ফিল্টার করার জন্য মডেলকে বিশ্বাস করেন না; বরং আপনি ডাটাবেসকে তা গোপন করতে বাধ্য করেন।

এটিকে উৎপাদনে নিয়ে যাওয়া হচ্ছে

এখানে প্রদর্শিত আর্কিটেকচারটি প্রোডাকশন-গ্রেড, কিন্তু শেখার সুবিধার জন্য এর নির্দিষ্ট বাস্তবায়নটি সরল করা হয়েছে। বাস্তব এন্টারপ্রাইজ পরিবেশে এটিকে নিরাপদে স্থাপন করতে, আপনার নিম্নলিখিত বর্ধিতকরণগুলি বাস্তবায়ন করা উচিত:

  1. প্রকৃত প্রমাণীকরণ: "আইডেন্টিটি সুইচার" ড্রপডাউনটি Google Identity Platform, Okta, বা Auth0-এর মতো একটি নির্ভরযোগ্য আইডেন্টিটি প্রোভাইডার (IDP) দিয়ে প্রতিস্থাপন করুন। আপনার অ্যাপ্লিকেশনটি ডেটাবেস সেশন ভেরিয়েবল সেট করার আগে ব্যবহারকারীর টোকেন যাচাই করবে এবং নিরাপদে তাদের পরিচয় বের করে নেবে, যাতে ব্যবহারকারীরা তাদের পরিচয় জাল করতে না পারে।
  2. কানেকশন পুলিং নিরাপত্তা: কানেকশন পুল ব্যবহার করার সময়, সেশন ভেরিয়েবল সঠিকভাবে পরিচালনা করা না হলে তা কখনও কখনও বিভিন্ন ব্যবহারকারীর অনুরোধ জুড়ে থেকে যেতে পারে। ব্যবহারকারীদের মধ্যে ডেটা ফাঁস রোধ করতে, পুলে একটি কানেকশন ফেরত দেওয়ার সময় আপনার অ্যাপ্লিকেশনটি যেন সেশন ভেরিয়েবল রিসেট করে (যেমন, RESET app.active_user) অথবা কানেকশনের অবস্থা পরিষ্কার করে, তা নিশ্চিত করুন।
  3. গোপনীয়তা ব্যবস্থাপনা: ডাটাবেস ক্রেডেনশিয়াল হার্ডকোড করা একটি নিরাপত্তা ঝুঁকি। রানটাইমে আপনার ডাটাবেস পাসওয়ার্ড এবং কানেকশন স্ট্রিং নিরাপদে সংরক্ষণ ও পুনরুদ্ধার করতে গুগল সিক্রেট ম্যানেজারের মতো একটি বিশেষায়িত গোপনীয়তা ব্যবস্থাপনা পরিষেবা ব্যবহার করুন।

৯. পরিষ্কার করুন

এই ল্যাবটি সম্পন্ন হয়ে গেলে, alloyDB ক্লাস্টার এবং ইনস্ট্যান্সটি ডিলিট করতে ভুলবেন না।

এটি ক্লাস্টারটিকে তার ইনস্ট্যান্স(গুলি) সহ পরিষ্কার করে দেবে।

১০. অভিনন্দন

অভিনন্দন! আপনি সফলভাবে ডেটা লেয়ার পর্যন্ত নিরাপত্তা নিশ্চিত করেছেন। এমনকি আপনার পাইথন কোডে যদি print(all_salaries) করার মতো কোনো বাগও থাকতো, তাহলেও ডাটাবেস অ্যালিসকে কিছুই ফেরত দিত না।

পরবর্তী পদক্ষেপ