ডি-বাস প্রমাণীকরণ এবং অনুমোদন


13

আমি ডি-বাসে দূরবর্তী অ্যাক্সেস সেট আপ করার চেষ্টা করছি এবং প্রমাণীকরণ এবং অনুমোদন কীভাবে কাজ করছে না (তা নয়) আমি বুঝতে পারি না।

আমি একটি বিমূর্ত সকেটে একটি ডি-বাস সার্ভার শুনছি।

$ echo $DBUS_SESSION_BUS_ADDRESS 
unix:abstract=/tmp/dbus-g5sxxvDlmz,guid=49bd93b893fe40d83604952155190c31

আমি দৌড়ে dbus-monitorযাচ্ছি তা কি চলছে। আমার পরীক্ষার কেসটি notify-send hello, যা স্থানীয় মেশিন থেকে মৃত্যুদন্ড কার্যকর করার সময় কাজ করে।

একই মেশিনের অন্য অ্যাকাউন্ট থেকে, আমি সেই বাসের সাথে সংযোগ করতে পারি না।

otheraccount$ DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-g5sxxvDlmz,guid=49bd93b893fe40d83604952155190c31 dbus-monitor
Failed to open connection to session bus: Did not receive a reply. Possible causes include: the remote application did not send a reply, the message bus security policy blocked the reply, the reply timeout expired, or the network connection was broken.
otheraccount$ DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-g5sxxvDlmz,guid=49bd93b893fe40d83604952155190c31 notify-send hello

ডি-বাস স্পেসিফিকেশন ব্রাউজ করার পরে , আমি ~/.dbus-keyrings/org_freedesktop_generalঅন্য অ্যাকাউন্টে অনুলিপি করেছি , তবে এটি কোনও লাভ করে না।

আমি ফরওয়ার্ডিং TCP উপর ডিকপ সকেট দ্বারা অনুপ্রাণিত চেষ্টা schedar এর অ্যাক্সেস ডিকপ দূরবর্তী অবস্থান থেকে socat ব্যবহার

socat TCP-LISTEN:8004,reuseaddr,fork,range=127.0.0.1/32 ABSTRACT-CONNECT:/tmp/dbus-g5sxxvDlmz

আমি আমার অ্যাকাউন্ট থেকে টিসিপি সকেটে সংযোগ করতে পারি।

DBUS_SESSION_BUS_ADDRESS=tcp:host=127.0.0.1,port=8004 notify-send hello

তবে অন্য অ্যাকাউন্ট থেকে নয়, সাথেও ছিল dbus-monitorনা বা নেইও notify-senddbus-monitorবিমূর্ত সকেটের সাথে উপরে হিসাবে একই ত্রুটি বার্তা ; notify-sendএখন একটি ট্রেস প্রকাশ করে:

otheraccount$ DBUS_SESSION_BUS_ADDRESS=tcp:host=127.0.0.1,port=8004 notify-send hello

** (notify-send:2952): WARNING **: The connection is closed

স্ট্রাকিং থেকে প্রকাশিত হয় যে এই সংস্করণটি notify-sendকুকি ফাইলটি পড়ার চেষ্টা করে না, তাই আমি কেন এটি সংযোগ করতে সক্ষম হব তা আমি বুঝতে পারি।

আমি অন্য মেশিনে এসএসএইচিং চেষ্টা করে টিসিপি সংযোগটি ফরোয়ার্ড করেছি।

ssh -R 8004:localhost:8004 remotehost

আশ্চর্যজনকভাবে, dbus-monitorকোনও কুকি ফাইল ছাড়াই কাজ করে! আমি দূরবর্তী হোস্ট থেকে ডি-বাস ট্র্যাফিক দেখতে পারি। আমি আমার স্থানীয় dbus-monitorউদাহরণে শ্রুতিমধুরতা সম্পর্কে একটি বিজ্ঞপ্তি দেখতে পাচ্ছি ।

remotehost$ DBUS_SESSION_BUS_ADDRESS=tcp:host=127.0.0.1,port=8004 dbus-monitor
signal sender=org.freedesktop.DBus -> dest=:1.58 serial=2 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameAcquired
   string ":1.58"
method call sender=:1.58 -> dest=org.freedesktop.DBus serial=2 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=AddMatch
   string "eavesdrop=true"

আমি যদি notify-sendলোকাল মেশিনে চালিত করি dbus-monitorতবে রিমোট হোস্টে বিজ্ঞপ্তিটি দেখতে পাওয়া যায়। এটি অবশ্যই অ্যাক্সেসের এমন একটি স্তরে পৌঁছেছে যাতে প্রমাণীকরণের প্রয়োজন হয়।

notify-sendএকটি কুকি না পাওয়া সম্পর্কে অভিযোগ। কুকি ফাইলটি অনুলিপি করার পরে, notify-sendরিমোট মেশিন থেকে কাজ করে।

লোকাল মেশিনটি দেবিয়ান হুইজি চালায়। রিমোট মেশিনটি ফ্রিবিএসডি 10.1 চালায়।

আমি বুঝতে পারি না ডি-বাস প্রমাণীকরণ এবং অনুমোদন কীভাবে কাজ করে।

  1. রিমোট মেশিনের শংসাপত্র না রেখে কেন আমি যতদূর বলতে পারি শ্রবণশক্তি? আমি যখন টিসিপি সংযোগে ডি-বাস ফরোয়ার্ড করি তখন আমি কী প্রকাশ করব? কেন অনুমোদনের জন্য dbus-monitorএবং notify-sendপৃথক হয়?
  2. আমি কেন একই মেশিনের অন্য অ্যাকাউন্ট থেকে ছদ্মবেশটি পারি না, বিমূর্ত সকেটের উপর দিয়ে বা টিসিপি সংযোগের উপরে কেন?
  3. আমি লক্ষ্য করেছি যে কুকি ফাইলটি প্রতি কয়েক মিনিটে পরিবর্তিত হয় (এটি নিয়মিত বিরতিতে হয় কিনা তা আমি বুঝতে পারি না)। কেন?

(আমি জানি যে আমি একটি ডিসি-বাস ডেমন চালু করতে পারি যা টিসিপিতে শুনবে That's এটি আমার প্রশ্নের উদ্দেশ্য নয়, আমি বুঝতে চাই যে আমি কী করেছিলাম এবং কী করে কাজ করে নি))

উত্তর:


7

ডি-বাস এখানে যাদু কুকি ফাইলটি ব্যবহার করছে না; এটি ইউনিক্স ডোমেন সকেটে ( SCM_CREDENTIALS) এর শংসাপত্রগুলি পাস করছে ।

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

ডি-বাস স্পেস থেকে:

বিশেষ শংসাপত্রগুলি নুল বাইট পাস করে

সার্ভারের সাথে সংযুক্ত হওয়ার সাথে সাথে ক্লায়েন্টকে অবশ্যই একটি একক নুল বাইট পাঠাতে হবে। এই বাইটটি ইউনিক্স ডোমেন সকেটে শংসাপত্রগুলি প্রেরণের জন্য এসসিএম_সিআরডিএস বা এসসিএম_সিআরডিএনটিএলএস সহ প্রেরণসেমি () ব্যবহার করে এমন কয়েকটি অপারেটিং সিস্টেমের শংসাপত্রের তথ্য সহ থাকতে পারে। তবে নুল বাইট অবশ্যই অন্যান্য ধরণের সকেটে এবং এমনকি অপারেটিং সিস্টেমগুলিতেও প্রেরণ করতে হবে যা শংসাপত্র প্রেরণের জন্য বাইট প্রেরণের প্রয়োজন হয় না। এই নথিতে বর্ণিত পাঠ্য প্রোটোকলটি একক নুল বাইটের পরে শুরু হয়। ক্লায়েন্টের কাছ থেকে প্রাপ্ত প্রথম বাইটটি যদি নুল বাইট না হয় তবে সার্ভার সেই ক্লায়েন্টকে সংযোগ বিচ্ছিন্ন করতে পারে।

প্রাথমিক বাইট ব্যতীত অন্য যে কোনও প্রসঙ্গে একটি নুল বাইট একটি ত্রুটি; প্রোটোকলটি কেবলমাত্র ASCII।

নুল বাইট সহ প্রেরিত শংসাপত্রগুলি এসএএসএল প্রক্রিয়া এক্সটার্নাল ব্যবহার করা যেতে পারে।

আপনি যদি কোনও উদাহরণ আঁকেন dbus-daemon, আপনি দেখতে পাচ্ছেন যে আপনি যখন এটিতে সংযুক্ত হন, এটি সংযোগকারী ব্যবহারকারীর শংসাপত্রগুলি পরীক্ষা করে:

$ strace dbus-daemon --session --nofork
...
accept4(4, {sa_family=AF_LOCAL, NULL}, [2], SOCK_CLOEXEC) = 8
...
recvmsg(8, {msg_name(0)=NULL, msg_iov(1)=[{"\0", 1}], msg_controllen=0, msg_flags=0}, 0) = 1
getsockopt(8, SOL_SOCKET, SO_PEERCRED, {pid=6694, uid=1000, gid=1000}, [12]) = 0

সুতরাং আপনার প্রশ্নের উত্তর দিতে:

  1. ডি-বাস ডিমন আপনার পরিচয় যাচাই করতে আপনার কর্নেল-যাচাই করা ব্যবহারকারী আইডি ব্যবহার করছে। socatপ্রক্সি সংযোগগুলি ব্যবহার করে, আপনি আপনার ইউআইডি ব্যবহার করে যে কাউকে ডি-বাস ডিমন সাথে সংযুক্ত হতে দিচ্ছেন।

  2. আপনি যদি অন্য কোনও ইউআইডি থেকে সরাসরি সকেটে সংযোগ করার চেষ্টা করেন, ডিমন স্বীকৃতি জানায় যে সংযোগকারী ইউআইডি কোনও ইউআইডি নয় যা সংযোগ করার অনুমতি দেওয়ার কথা বলে মনে করা হচ্ছে। আমি বিশ্বাস করি যে ডিফল্টটি হ'ল কেবল ডেমনের নিজস্ব ইউআইডি অনুমোদিত, তবে এটি আনুষ্ঠানিকভাবে যাচাই করা হয়নি। আপনি অন্য ব্যবহারকারীদের, যদিও অনুমতি দিতে পারেন: এ কনফিগারেশন ফাইল দেখতে /etc/dbus-1/, এবং এছাড়াও man dbus-daemon

  3. এটি ডি-বাস সার্ভার পুরানো / মেয়াদোত্তীর্ণ কুকিজকে নতুনের সাথে প্রতিস্থাপন করছে। ডি-বাস স্পেসের DBUS_COOKIE_SHA1 বিভাগ অনুসারে , একটি কুকি তৈরির সময় সহ সংরক্ষণ করা হয় এবং সার্ভারের কুকিজ মুছে ফেলার কথা যে এটি সিদ্ধান্ত নেয় যে এটি খুব পুরানো। স্পষ্টতই আজীবন "মোটামুটি সংক্ষিপ্ত হতে পারে"।


ডি-বাসের রেফারেন্স বাস্তবায়ন SCM_CREDENTIALSবিশেষভাবে ব্যবহার করে না । লিনাক্সে এটি SO_PEERCREDপরিবর্তে সকেট বিকল্প ব্যবহার করে।
ভাসিলি ফারোনভ

@ ভ্যাসিলিফারনভ ঠিক বলেছেন - কতটা আকর্ষণীয়! আরও মনে হচ্ছে, ব্যবহারের SCM_CREDENTIALSফলে এ জাতীয় সরল প্রক্সিটি আটকাতে পারত, যেহেতু প্রেরকের সক্রিয়ভাবে তার শংসাপত্রগুলি উপস্থাপন করা দরকার, তবে SO_PEERCREDসংযোগটি কে করেছে তা কেবল পরীক্ষা করে। আমি অবাক হয়েছি কেন তারা এই পছন্দটি করেছে।
জান্ডার

স্পষ্টতই কারণ এটি "পিয়ারের সহযোগিতার প্রয়োজন হয় না", সুতরাং "এটি অনেক কম ভঙ্গুর" (মন্তব্য থেকে dbus-sysdeps-unix.c)।
ভাসিলি ফারোনভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.