مواد پر جائیں

اجازت — کون کیا کر سکتا ہے، اور آپ یہ کیسے ثابت کرتے ہیں

Control Center اجازت کے دو سوالوں کا جواب دیتا ہے، اور یہ واقعی الگ الگ ہیں۔ “کیا یہ شخص یہ آپریشن کال کر سکتا ہے؟” کا تعلق لوگوں، کرداروں اور ریپوزٹریز سے ہے۔ “کیا یہ ایجنٹ یہ اثر پیدا کر سکتا ہے؟” کا تعلق اقدامات، دلائل اور اثر کے دائرے سے ہے — وہ سوال گارڈریلز میں ہے۔

یہ صفحہ پہلے سوال کے بارے میں ہے، نیز اُس ریکارڈ کے بارے میں جو دونوں پیچھے چھوڑتے ہیں۔

انسانی طرف کا ہر اجازت کا فیصلہ ایک واحد فنکشن سے طے ہوتا ہے:

can(principal, permission, resource) → allow | deny + why

ایک اجازت <domain>:<tier> ہوتی ہے — tickets:write، members:administer، repos:read۔ فہرست اخذ کی جاتی ہے، ہاتھ سے نہیں لکھی جاتی: یہ خود آپریشن کی سطح سے شمار ہوتی ہے (آپریشن کے نام کا سابقہ ڈومین دیتا ہے، اور جو کردار کی کم سے کم حد وہ پہلے ہی نافذ کرتا ہے وہ ٹیئر دیتی ہے)، اس لیے تمام ~550 آپریشنز کو کوئی ایک بھی اجازت ٹائپ کیے بغیر ایک اجازت مل جاتی ہے۔

اخذ کرنے کا یہی عمل وہ خوبی ہے جس کی حفاظت کی جانی چاہیے۔ اس کا مطلب ہے کہ ایک نیا آپریشن بطور ڈیفالٹ گیٹڈ ہوتا ہے — ہاتھ سے تشریح شدہ ماڈل کی ناکامی کی صورت یہ ہے کہ کوئی بھول جاتا ہے، اور جو چیز بھولی جاتی ہے وہی گیٹ ہے۔ ایک ریچٹ ٹیسٹ نتیجے میں بننے والا ڈومین سیٹ پن کرتا ہے، اس لیے کسی نئے سابقے کے تحت آپریشن شامل کرنا حادثہ نہیں بلکہ ایک نام دینے کا فیصلہ ہوتا ہے جو کوئی انسان کرتا ہے۔

چاروں ٹیئر بلٹ اِن کرداروں کے عین مطابق ہیں:

ٹیئر کردار کی کم سے کم حد مثال
read مہمان tickets:read
write رکن tickets:write
administer ایڈمن members:administer
own مالک workspace:own

پانچ بلٹ اِن کردار — مالک، ایڈمن، رکن، ناظر، مہمان — اسی فہرست کے اوپر پریسیٹ ہیں۔ ملکیت فی ورک اسپیس ایک واحد نشست ہے، جو ملکیت منتقل کریں کے ذریعے واضح طور پر منتقل کی جاتی ہے (ورنہ چھوڑ کر جانے والا مالک ناقابلِ ہٹاؤ ہوتا ہے: SCIM ڈی پروویژننگ کسی بھی ورک اسپیس مالک سے انکار کرتی ہے — پہلے منتقلی کریں)۔

حسب ضرورت کردار گھٹاؤ کے اصول پر بنتے ہیں۔ ایک حسب ضرورت کردار ایک بنیادی پریسیٹ (admin، member، viewer یا guest — کبھی owner نہیں) اور اُن اجازتوں کا مجموعہ بتاتا ہے جو اُس سے ہٹائی جاتی ہیں — ”ایڈمن، مگر ارکان کا نظم نہیں کر سکتا“۔ یہ اپنی بنیاد سے زیادہ کبھی اجازت نہیں دے سکتا، اور یہی چیز اُنہیں کسی موجودہ انسٹال میں شامل کرنے کو محفوظ بناتی ہے: ہر موجودہ جانچ ایک درست بالائی حد رہتی ہے۔ ارکان اُنہیں custom:<id> کے طور پر رکھتے ہیں، اور اِس قدر کو سمجھنے سے قاصر بہت پرانا کلائنٹ اندازہ لگانے کے بجائے مہمان پر واپس چلا جاتا ہے۔

کرداروں کے نیچے فی ریپو گرانٹس (none / read / review / write) بیٹھتے ہیں: ورک اسپیس کی رکنیت کبھی خاموشی سے forge کے اختیارات سے آگے نہیں بڑھتی۔ کوڈ کو سامنے لانے والی ہر سطح اُنہیں جانچتی ہے — بشمول اُن سطحوں کے جو کوڈ تک بالواسطہ پہنچتی ہیں، جیسے کسی اسپیس کے worktree پر کھولا گیا ٹرمنل یا ایڈیٹر سیشن۔

کچھ آپریشنز کا تعلق کسی ورک اسپیس سے ہی نہیں ہوتا: انسٹال بھر کی ترتیبات، SSO کنفیگریشن، فراہم کنندہ کی اسناد، ماڈل کا نظم، اور پورے انسٹال کے بیک اپ۔ یہ سرور کا اختیار قرار دیتے ہیں اور انسٹال کے آپریٹر (ریکارڈ شدہ سرور مالک) کے سوا سب کے لیے مسترد ہو جاتے ہیں۔ جان بوجھ کر ایک ہی آپریٹر شناخت اور اُس کی ایک ہی تعریف رکھی گئی ہے۔

ہر اجازت کا فیصلہ — اجازت اور انکار دونوں — فی ورک اسپیس، ہیش سے زنجیر بنے آڈٹ ٹریل میں شامل کیا جاتا ہے۔

صرف انکار کا لاگ ”ہم نے کیا روکا؟“ کا جواب دیتا ہے، مگر ”اِس ایجنٹ نے اصل میں کیا کیا، اور کس نے اِس کی اجازت دی؟“ کا نہیں، اور واقعے کے جائزے کی شروعات اسی سوال سے ہوتی ہے۔ اس لیے ہر اندراج مکمل انتساب زنجیر ریکارڈ کرتا ہے: عمل کرنے والا پرنسپل، وہ انسان جس کی طرف سے اُس نے عمل کیا، وہ تفویض جس کے ذریعے وہ پہنچا، عمل اور اُس کے دلائل (ایک ڈائجسٹ کے طور پر)، فیصلہ، اور وہ اصول جس نے فیصلہ کیا۔

اندراجات زنجیر میں جڑے ہیں: ہر ایک کا ہیش پچھلے کو ڈھانپتا ہے، اس لیے کسی بھی قطار میں ترمیم، حذف یا ترتیب کی تبدیلی اُس کے بعد کے ہر ہیش کو توڑ دیتی ہے۔ چین تصدیق کریں پورے ڈھانچے کو دوبارہ اخذ کرتا ہے اور پہلی کڑی کا نام دیتا ہے جو قائم نہ رہے۔ ایک آڈٹ لاگ جسے آپ جانچ نہ سکیں، ایک لاگ ہے؛ جسے آپ دوبارہ اخذ کر سکیں، وہ ثبوت ہے۔

دو نتائج قابلِ جان ہیں:

  • آڈٹ ٹیبل عمر کی بنیاد پر تراش سے مستثنیٰ ہے۔ ہیش زنجیر کو درمیان سے تراشا نہیں جا سکتا۔ برقراری ایکسپورٹ کے بعد تراش ہے، اور تراش ایک چیک پوائنٹ چھوڑتی ہے جو ہٹائے گئے حصے کا آخری ہیش اُٹھائے رکھتا ہے، اس لیے جو بچتا ہے وہ اب بھی شروع تک تصدیق کرتا ہے۔
  • یہ سرگرمی کی ٹائم لائن کے پہلو میں بیٹھتا ہے، اُس کے اوپر نہیں۔ ٹائم لائن یہ ہے کہ لوگوں نے کیا کیا؛ یہ یہ ہے کہ کس چیز کی اجازت دی گئی اور کس سے انکار ہوا۔ ایک مشترکہ correlation id ایک ہی کال کو دونوں میں پڑھنے دیتا ہے۔

یہ نئی لائن سے جدا JSON کے طور پر ایکسپورٹ ہوتا ہے اور SIEM (Splunk، Elastic، Sentinel — bearer ٹوکن والا ایک HTTP اینڈ پوائنٹ) کو اسٹریم ہو سکتا ہے۔ اسٹریمنگ جان بوجھ کر بہترین کوشش کی بنیاد پر ہے: SIEM کا بند ہونا کبھی ایجنٹ کی ٹول کال کو نہیں روکنا چاہیے، اور پائیدار، قابلِ تصدیق نقل بہر صورت ڈسک پر موجود رہتی ہے۔

ایک انسٹال زیادہ سے زیادہ سیشن عمر اور بیکار رہنے کی ٹائم آؤٹ مقرر کر سکتا ہے۔ دونوں اُس ڈیوائس اسناد کی جانچ پر نافذ ہوتے ہیں جس سے ہر تصدیق شدہ راستہ گزرتا ہے — ایسی سیشن جو کوئی کلائنٹ نظر انداز کر سکے، حملہ آور کے بجائے ایک سوالنامے کا جواب ہے۔ ایک انسٹال SSO لازمی بھی کر سکتا ہے، جو نئے ڈیوائسز کے لیے دستی پیئرنگ بند کر دیتا ہے (لاک آؤٹ گارڈ کے ساتھ: کوئی فعال SSO کنیکشن موجود نہ ہو تو یہ انکار کر دیتا ہے)۔

  • فی آبجیکٹ ACLs نہیں۔ جان بوجھ کر فی ٹکٹ یا فی پیغام اجازت نہیں ہے۔ ریپوزٹری کی سطح کی علیحدگی وہی ہے جو ٹیمیں واقعی مانگتی ہیں اور وہ موجود ہے؛ فی آبجیکٹ اشتراک امکانات کے بہت بڑے پھیلاؤ والی سطح ہے جس کی یہاں کوئی ثابت شدہ مانگ نہیں۔
  • ایسا پالیسی انجن نہیں جسے آپ DSL میں کنفیگر کریں۔ الفاظ کا دائرہ جان بوجھ کر بند ہے، اس لیے پوری پالیسی پیش، بیان اور گنوائی جا سکتی ہے۔
  • سرور کے سوا کہیں نافذ نہیں۔ کلائنٹ کی طرف کی جانچیں صرف اِس لیے ہیں کہ کوئی ایسا کنٹرول پیش نہ ہو جسے مسترد کیا جائے گا۔ حتمی فیصلہ ہمیشہ سرور کا ہوتا ہے۔