Setuid বিট একটি এক্সিকিউটেবল ফাইল সেট করা যাবে, যাতে যখন চালানো, প্রোগ্রাম যদি তারা ভিন্ন ফাইল পরিবর্তে প্রকৃত ব্যবহারকারী মালিকের বিশেষাধিকার অধিকারী হবে না। এটি কার্যকর uid (ব্যবহারকারী আইডি) এবং বাস্তব uid এর মধ্যে পার্থক্য ।
কিছু সাধারণ ইউটিলিটিগুলি যেমন passwd
মূলের মালিকানাধীন এবং প্রয়োজনীয়তার বাইরে এইভাবে কনফিগার করা হয়েছে ( passwd
অ্যাক্সেসের প্রয়োজন /etc/shadow
যা কেবল রুট দ্বারা পড়া যায়)।
এটি করার সময় সর্বোত্তম কৌশল হ'ল এখনই সুপারভাইজার হিসাবে যা যা করা দরকার তা হ'ল তত কম সুযোগসুবিধা যাতে রুট চলাকালীন বাগ বা অপব্যবহারের সম্ভাবনা কম থাকে। এটি করার জন্য, আপনি প্রক্রিয়াটির কার্যকর uidটিকে তার আসল uid তে সেট করেছেন । পসিক্স সি তে:
#define _POSIX_C_SOURCE 200112L // Needed with glibc (e.g., linux).
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
void report (uid_t real) {
printf (
"Real UID: %d Effective UID: %d\n",
real,
geteuid()
);
}
int main (void) {
uid_t real = getuid();
report(real);
seteuid(real);
report(real);
return 0;
}
প্রাসঙ্গিক ক্রিয়াকলাপগুলির, যার বেশিরভাগ উচ্চ স্তরের ভাষাগুলিতে POSIX সিস্টেমে সাধারণত ব্যবহৃত হয়:
getuid()
: আসল uid পান ।
geteuid()
: কার্যকর uid পান ।
seteuid()
: কার্যকর uid সেট করুন ।
যতক্ষণ না এক্সিকিউটেবলের উপর সেটুইড বিট সেট করা হয়েছিল কেবল ব্যতীত আপনি রিয়েল ইউডের সাথে শেষেরটি অনুপযুক্ত কিছু করতে পারবেন না । সুতরাং এটি চেষ্টা করতে, সংকলন gcc test.c -o testuid
। তারপরে আপনার বিশেষ সুবিধাগুলি সহ দরকার:
chown root testuid
chmod u+s testuid
শেষটি সেটুইড বিট সেট করে। আপনি যদি এখন ./testuid
সাধারণ ব্যবহারকারীরূপে চালনা করেন তবে কার্যকর ইউড 0, মূল দিয়ে ডিফল্টরূপে প্রক্রিয়াটি চালিত হয়।
লিপি সম্পর্কে কি?
এটি প্ল্যাটফর্ম থেকে প্ল্যাটফর্মের ক্ষেত্রে পরিবর্তিত হয় , তবে লিনাক্সে, বাইটোকোড সহ যে সমস্ত ইন্টারপ্রেটারের প্রয়োজন হয় সেগুলি সেপুইড বিটের ব্যবহার করতে পারবেন না যদি না এটি ইন্টারপ্রেটারে সেট করা থাকে (যা খুব বোকামি হবে)। এখানে একটি সহজ পার্ল স্ক্রিপ্ট যা উপরের সি কোডটি নকল করে:
#!/usr/bin/perl
use strict;
use warnings FATAL => qw(all);
print "Real UID: $< Effective UID: $>\n";
$> = $<; # Not an ASCII art greedy face, but genuine perl...
print "Real UID: $< Effective UID: $>\n";
এটি * নিক্সীয় শিকড়গুলির পক্ষে সত্য, পার্ল কার্যকর uid ( $>
) এবং বাস্তব uid ( $<
) এর জন্য বিশেষ ভেরিয়েবল তৈরি করে । তবে আপনি যদি একইটি চেষ্টা করেন chown
এবং chmod
সংকলিত (সি, পূর্ববর্তী উদাহরণ থেকে) এক্সিকিউটেবলের সাথে ব্যবহার করেন তবে এতে কোনও তফাত হবে না। স্ক্রিপ্ট সুবিধা পেতে পারে না।
এর উত্তর হ'ল স্ক্রিপ্টটি কার্যকর করতে একটি সেটুইড বাইনারি ব্যবহার করা:
#include <stdio.h>
#include <unistd.h>
int main (int argc, char *argv[]) {
if (argc < 2) {
puts("Path to perl script required.");
return 1;
}
const char *perl = "perl";
argv[0] = (char*)perl;
return execv("/usr/bin/perl", argv);
}
এটি gcc --std=c99 whatever.c -o perlsuid
তারপর সংকলন করুন chown root perlsuid && chmod u+s perlsuid
। আপনি এখন যে কোনও পার্ল স্ক্রিপ্ট 0 এর কার্যকর uid সহ কার্যকর করতে পারেন , যার মালিক তা নির্বিশেষে।
অনুরূপ কৌশল পিএইচপি, পাইথন ইত্যাদির সাথে কাজ করবে তবে ...
# Think hard, very important:
>_< # Genuine ASCII art "Oh tish!" face
দয়া করে দয়া করে এই জাতীয় জিনিসটি প্রায় পড়ে থাকবেন না । সম্ভবত, আপনি আসলে স্ক্রিপ্টের নামে একটি নিরঙ্কুশ পথ হিসাবে সংকলন করতে চান , অর্থাত্, সমস্ত কোড এর main()
সাথে প্রতিস্থাপন করুন :
const char *args[] = { "perl", "/opt/suid_scripts/whatever.pl" }
return execv("/usr/bin/perl", (char * const*)args);
/opt/suid_scripts
এগুলি নিশ্চিত করুন এবং এতে থাকা সমস্ত কিছুই কেবল অ-রুট ব্যবহারকারীদের জন্য পঠনযোগ্য। অন্যথায়, কেউ যে কোনও কিছুতে বদল করতে পারে whatever.pl
।
এছাড়াও, সাবধান থাকুন যে অনেক স্ক্রিপ্টিং ভাষা পরিবেশের ভেরিয়েবলগুলিকে স্ক্রিপ্ট কার্যকর করার পদ্ধতি পরিবর্তন করতে দেয় । উদাহরণস্বরূপ, পরিবেশের পরিবর্তনশীল কলারের সরবরাহকারী একটি লাইব্রেরির কারণ হতে পারে, কলকারীকে রুট হিসাবে স্বেচ্ছাসেবক কোড চালানোর অনুমতি দেয়। সুতরাং, আপনি যদি না জানেন যে দোভাষী এবং স্ক্রিপ্ট উভয়ই সম্ভাব্য পরিবেশের ভেরিয়েবলের বিরুদ্ধে দৃ are়, এটি করবেন না ।
তার পরিবর্তে আমার কী করা উচিত?
কোনও রুটহীন ব্যবহারকারীকে মূল হিসাবে স্ক্রিপ্ট চালানোর অনুমতি দেওয়ার একটি নিরাপদ উপায় হল একটি সুডো নিয়ম যুক্ত করা এবং ব্যবহারকারীর চালনা sudo /path/to/script
। সুডো বেশিরভাগ পরিবেশের ভেরিয়েবলগুলি পৃথক করে এবং প্রশাসককে কমান্ডটি চালাতে পারে এবং কোন যুক্তি দিয়ে সঠিকভাবে নির্বাচন করতে দেয় select পাসওয়ার্ড প্রম্পট ছাড়াই কীভাবে কোনও নির্দিষ্ট প্রোগ্রামটিকে রুট হিসাবে চালানো যায় দেখুন ? একটি উদাহরণ জন্য।
-privileged
শেল হিসাবে ডাকা হয় এবং যদি কোনও দায়িত্বশীল স্ক্রিপ্ট থেকে কল করা হয় তবে সেভাবেও নিরাপদে আহবান করা যেতে পারেsuid root
। আমি আশঙ্কা করি যে যদিও দায়বদ্ধ স্ক্রিপ্টের ধারণাটি সত্যিকারের বিশ্বে কিছুটা পাইপড্রিম is যাইহোক, অনুমতিগুলি উন্নত করার সময় যদি সম্ভব হয় তবে সমস্ত ধরণের