গ্রুপ সদস্যতা এবং সেটুইড / সেটজিড প্রক্রিয়া


10

প্রসেসগুলি যেগুলির মাধ্যমে সুবিধাগুলি ডি-এসকেল করেsetuid() এবং setgid()তারা নির্ধারিত ইউআইডি / গিডের গোষ্ঠী সদস্যতার উত্তরাধিকারী বলে মনে হয় না।

আমার কাছে একটি সার্ভার প্রক্রিয়া রয়েছে যা কোনও অধিকারযুক্ত বন্দর খোলার জন্য অবশ্যই রুট হিসাবে কার্যকর করতে হবে; তারপরে এটি নির্দিষ্ট-অ-প্রিভিলিজযুক্ত ইউআইডি / গিডে ডি-এস্কেল্ট হয়, 1 - যেমন, ব্যবহারকারীর foo(ইউআইডি 73)। ব্যবহারকারী fooগোষ্ঠীর সদস্য bar:

> cat /etc/group | grep bar
bar:x:54:foo

সুতরাং আমি যদি লগইন করি তবে আমি এই বৈশিষ্ট্যগুলি সহ fooএকটি ফাইল পড়তে পারি /test.txt:

> ls -l /test.txt
-rw-r----- 1 root bar 10 Mar  8 16:22 /test.txt

তবে, নিম্নলিখিত সি প্রোগ্রাম (সংকলন std=gnu99), যখন রুট চালান:

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>

int main (void) {
    setgid(73);
    setuid(73);
    int fd = open("/test.txt", O_RDONLY);
    fprintf(stderr,"%d\n", fd);
    return 0;
}   

সর্বদা অনুমতি অস্বীকার রিপোর্ট । আমি ভাবছি এটি একটি লগ-ইন না করা প্রক্রিয়া হওয়ার সাথে সাথে করাতে পারে তবে অনুমতিগুলি যেভাবে কাজ করবে বলে মনে করা হচ্ছে এটি হ্যামস্ট্রিংয়ের মতো।


1. প্রায়ই সার্ভারের জন্য দেশ কোনটি, এবং আমি মনে করি একটি উপায় হিসেবে আমি দেখেছি এই সমস্যা এড়ানোর হতে হবে একটি রিপোর্ট কাউকে Apache সঙ্গে এরকম - Apache অডিও গোষ্ঠীতে যুক্ত করা হয়েছে এবং দৃশ্যত তারপর সাউন্ড সিস্টেম ব্যবহার করতে পারেন। অবশ্যই, এটি সম্ভবত একটি কাঁটাচামচে ঘটবে এবং মূল প্রক্রিয়া নয়, তবে প্রকৃতপক্ষে ঘটনাটি আমার প্রসঙ্গে একই (এটি একটি শিশু প্রক্রিয়াটি সেটুইড কলের পরে কাঁটাযুক্ত)।


চারপাশে setuid()/ setgid()কলগুলি স্যুইচ করুন ।
ভনব্র্যান্ড

@vonbrand ROTFL আমি সেখানে একটি facepalm জন্য ছিল - কিন্তু একই ফলাফল, তাই আমি প্রশ্ন লাল হেরিং নিষ্কাশন সম্পাদনা করব।
স্বর্ণলোকস

1
আপনি যদি এর setgid(54)পরিবর্তে ব্যবহার করেন setgid(73)(যেমন হিসাবে /etc/groups, গ্রুপে barগিড রয়েছে 54) তবে এটি কি কাজ করে?
লার্জ

@ লার্জরেট নিশ্চিত, তবে এটি উদ্দেশ্যকে পরাস্ত করে। প্রক্রিয়াটির অন্যান্য কারণেও তার নিজস্ব জিআইডি প্রয়োজন, এবং তেমনি, এই ফাইলগুলির অবশ্যই তাদের অনুমতি থাকতে হবে। এজন্য গোষ্ঠীগুলিতে বহুবচন সদস্যতা প্রয়োজনীয় - উদাহরণস্বরূপ, আপনার যদি এমন দুটি ব্যবহারকারী থাকে তবে এটি করা দরকার what নোট করুন আপনি setuid()এটি করার পরে আপনি আর পারবেন না ... তবে, হুম ... আমি মনে করি আপনি এটি দিয়ে করতে পারবেন seteuid()...
স্বর্ণলোকস

1
আমার প্রশ্নটি নিশ্চিত হওয়া উচিত ছিল কোথাও কোনও লুকানো সূক্ষ্ম সমস্যা নেই। :-)
আট বছর বয়সী

উত্তর:


14

সমস্যাটি হ'ল setuidএবং setgid আপনার প্রক্রিয়াটির জন্য প্রয়োজনীয় সমস্ত শংসাপত্র দেওয়ার জন্য এটি যথেষ্ট নয়। একটি প্রক্রিয়া অনুমোদন উপর নির্ভর করে

  • এটির ইউআইডি
  • তার জিআইডি
  • এর পরিপূরক গোষ্ঠীগুলি
  • তার ক্ষমতা।

man 7 credentialsআরও বিস্তারিত ওভারভিউ পেতে দেখুন । সুতরাং, আপনার ক্ষেত্রে, সমস্যাটি হ'ল আপনি সঠিকভাবে ইউআইডি এবং জিআইডি সেট করেছেন তবে আপনি প্রক্রিয়াটির পরিপূরক গোষ্ঠীগুলি সেট করেন না। এবং গোষ্ঠীর barজিআইডি 54 রয়েছে, 73 নাই তাই এটি আপনার প্রক্রিয়াধীন একটি গোষ্ঠী হিসাবে স্বীকৃত নয়।

আপনাকে যা করতে হবে

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <grp.h>

int main (void) {
    gid_t supplementary_groups[] = {54};

    setgroups(1, supplementary_groups);
    setgid(73);
    setuid(73);
    int fd = open("/test.txt", O_RDONLY);
    fprintf(stderr,"%d\n", fd);
    return 0;
}  

1
এটি একটি আকর্ষণীয় প্রশ্ন যা আরও উত্সাহের দাবি রাখে কারণ এটি আসলে সেখানে প্রচুর লোকের পক্ষে কার্যকর হতে পারে। :-)
লার্জ

সিরিয়াল পোর্টগুলির সাথে আমারও একই সমস্যা ছিল। আমি এই dialoutগোষ্ঠীর জন্য এটি বাস্তবায়ন করেছি এবং এটি প্রথমবার কাজ করেছে।
tl8

0

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

আমি যে সামান্য সংস্থান পেয়েছি (গুগল "ডেইমন রাইটিং ইউনিক্স" এর জন্য) সমস্ত গুরুত্বপূর্ণ পদক্ষেপের বিষয়ে আলোচনা করে, যেমন টিটিটি থেকে কীভাবে বিচ্ছিন্ন করা যায় ইত্যাদি ইত্যাদি তবে ইউআইডি / জিআইডি সম্পর্কে কিছুই নয়। স্ট্রেঞ্জলি, না এমনকি ব্যাপক হাওটুর সংগ্রহ http://tldp.org বিবরণ আছে বলে মনে হয়। কেবল এক্সেসেশন হ'ল জেসন শর্টের আসুন একটি লিনাক্স ডিমন লিখি - প্রথম অংশ । কীভাবে এসইউডি / এসজিআইডি এবং সেই সমস্ত জগাখিচুড়ি কাজ করে তার সম্পূর্ণ বিবরণ হ'ল চেন, ওয়াগনার এবং ডিনের এসইউডি ডিমেসাইডেড (ইউএসএনআইএক্স 2002-এ একটি কাগজ)। তবে সাবধানতা অবলম্বন করুন, লিনাক্সের একটি অতিরিক্ত ইউআইডি রয়েছে, এফএসইউডিউড (দেখুন ওল্টারের ইউনিক্স অসঙ্গতি নোটগুলি: আলোচনার জন্য ইউআইডি সেটিং ফাংশন )।

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


1
প্রশ্নটি ডিমনাইজেশন সম্পর্কে নয়। আপনি এসআইডি বিটকে বিভ্রান্ত করেছেন (কোনও প্রক্রিয়াটিকে তার নির্বাহযোগ্যের মালিকের অনুমতি প্রদান করে) setuid(), যা প্রক্রিয়াটিকে এটির ইউআইডি পরিবর্তন করতে দেয়। এর SUID সাধারণত একটি করার অনুমতি দেয়ার উদ্দেশ্যে করা হচ্ছে উদ্দীপন (অ-privilleged -> privilleged) অনুমতি, যেহেতু setuid()শুধুমাত্র বিপরীত করতে পারেন।
স্বর্ণলোকস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.