সেটুইড বিটটি সঠিকভাবে ব্যবহার করা


45

আমার কাছে একটি প্রক্রিয়া রয়েছে যা সাধারণ ব্যবহারকারীর দ্বারা চালিত হওয়ার সময় মূল অধিকারগুলির প্রয়োজন হয়। স্পষ্টতই আমি এটি সম্পাদন করতে "সেটুইড বিট" ব্যবহার করতে পারি। পসিক্স সিস্টেমে এটি করার যথাযথ উপায় কী?

এছাড়াও, আমি কীভাবে এমন স্ক্রিপ্ট দিয়ে এটি করতে পারি যা কোনও দোভাষী ব্যবহার করে (ব্যাশ, পারল, পাইথন, পিএইচপি ইত্যাদি)?

উত্তর:


53

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 পাসওয়ার্ড প্রম্পট ছাড়াই কীভাবে কোনও নির্দিষ্ট প্রোগ্রামটিকে রুট হিসাবে চালানো যায় দেখুন ? একটি উদাহরণ জন্য।


1
অনেকগুলি শাঁস আলাদাভাবে আচরণ করবে যদি তাকে -privilegedশেল হিসাবে ডাকা হয় এবং যদি কোনও দায়িত্বশীল স্ক্রিপ্ট থেকে কল করা হয় তবে সেভাবেও নিরাপদে আহবান করা যেতে পারে suid root। আমি আশঙ্কা করি যে যদিও দায়বদ্ধ স্ক্রিপ্টের ধারণাটি সত্যিকারের বিশ্বে কিছুটা পাইপড্রিম is যাইহোক, অনুমতিগুলি উন্নত করার সময় যদি সম্ভব হয় তবে সমস্ত ধরণের
লেখাগুলি এড়ানো

@ মিমকিজার আমি " -privilegedশেল" এবং "দায়িত্বশীল স্ক্রিপ্ট" এর ধারণাগুলির সাথে পরিচিত নই । আপনি শাঁস সম্পর্কে আরও একটি উত্তর করতে চান? আমি অবশ্যই আপনাকে টিক দেওয়ার প্রতিশ্রুতি দিতে পারি না;) এটি করার অনেকগুলি ভাল কারণ নেই - sudoসম্ভব হলে একটি আরও ভাল বিকল্প - আমি পিএইচপিতে সিস্টেম পাসওয়ার্ড প্রমাণীকরণ সম্পর্কে প্রাথমিক প্রশ্ন থেকে উত্পন্ন একটি জেনেরিক উত্তর হিসাবে এটি লিখেছিলাম ।
স্বর্ণিলকস

1
- আমি না সত্যিই যে কাজ করতে চান দায়ী স্ক্রিপ্ট হয় সত্যিই কঠিন , আমাকে অতিক্রম করিয়া সম্ভবত -। কিন্তু আমি অবশ্যই বলবো আমি আপনার বিশ্লেষণ সঙ্গে মতানৈক্য sudo- আমি বিবেচনা sudoহিসাবে মনোরোগের মধ্যে এটি ভান না হতে root। এমনকি আপনি নিজের মধ্যে শেল গ্লোব লাগাতে পারেন sudoerssuস্ক্রিপ্টিং উদ্দেশ্যে আমার মতে আরও ভাল, যদিও sudoলাইভ অ্যাপ্লিকেশনগুলির পক্ষে ভাল। কিন্তু তন্ন তন্ন একটি সঙ্গে একটি স্ক্রিপ্ট যেমন স্পষ্ট হয় #!/bin/ksh -pbangline বা যাই হোক না কেন suid ksh$PATHনেই।
মাইকজার্ভ

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

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

11

হ্যাঁ আপনি পারেন, তবে এটি সম্ভবত খুব খারাপ ধারণা । সাধারণত, আপনি নিজের এক্সিকিউটেবলের জন্য সরাসরি SID বিট সেট করবেন না, তবে এটি কার্যকর করতে একটি sudo (8) বা su (1) ব্যবহার করবেন (এবং কে এটি কার্যকর করতে পারে সীমাবদ্ধ)

তবে নোট করুন, নিয়মিত ব্যবহারকারীদের রুট হিসাবে প্রোগ্রামগুলি (এবং বিশেষত স্ক্রিপ্টগুলি) চালানোর অনুমতি দেওয়ার সাথে অনেকগুলি সুরক্ষা সমস্যা রয়েছে। তাদের বেশিরভাগই তা করতে হয় যদি না প্রোগ্রামটি নির্দিষ্টভাবে এবং খুব সতর্কতার সাথে এটি পরিচালনা করতে না লেখা হয় তবে দূষিত ব্যবহারকারীরা সহজেই এটি রুট শেলটি পেতে ব্যবহার করতে পারে।

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

উদাহরণস্বরূপ, আপনি এমন ব্যবহারকারীদের মঞ্জুরি দিতে পারেন যা কেবল সম্পাদকের সাথে কিছু ফাইল সম্পাদনা করে। তবে সম্পাদক বাহ্যিক সহায়ক বা স্থগিতাদেশের কমান্ড কার্যকর করার অনুমতি দেয়, ফলে ব্যবহারকারীরা তাদের ইচ্ছামত রুট শেল দেয়। অথবা আপনি শেল স্ক্রিপ্টগুলি সম্পাদন করছেন যা আপনার কাছে খুব সুরক্ষিত দেখায় তবে ব্যবহারকারী এটির আচরণ পরিবর্তন করে পরিবর্তিত $ আইএফএস বা অন্যান্য পরিবেশের ভেরিয়েবল দিয়ে চালাতে পারে। অথবা এটি পিএইচপি স্ক্রিপ্ট হতে পারে যা "এলএস" চালানোর কথা ছিল, তবে ব্যবহারকারী এটি $ প্যাথ সংশোধিত দিয়ে চালায় এবং এইভাবে এটি একটি শেল চালায় যা তার নাম রাখেন "এলএস"। বা অন্যান্য কয়েক ডজন সুরক্ষা সমস্যা।

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

মনে রাখবেন যে আপনি যদি আপনার সমস্ত স্থানীয় ব্যবহারকারীকে (যেমন, আপনি তাদের মূল পাসওয়ার্ড দিয়ে থাকেন) পুরোপুরি বিশ্বাস করেন তবে সেগুলির মধ্যে যে কোনও অনিচ্ছাকৃত সুরক্ষা তদারকি হিসাবে (যেমন, অনলাইনে পিএইচপি স্ক্রিপ্ট, বা দুর্বল পাসওয়ার্ড, বা যাই হোক না কেন) হঠাৎ দূরবর্তী আক্রমণকারীকে পুরো মেশিনে সম্পূর্ণ আপস করার অনুমতি দেয়।


1
seconded। এর জন্য পসিএক্স প্রোগ্রামার সিরিজের নিরাপদ প্রার্থনার উদাহরণ দেখুন man sh- এবং এটি করতে ব্যর্থ হয় command -p env -i ...। সর্বোপরি এটি করা বেশ কঠিন। তবুও, যদি এটি সঠিকভাবে করা হয়, সুস্পষ্ট উদ্দেশ্যে, এটি suidব্যবহারের চেয়ে দক্ষ দোভাষীর পক্ষে suবা এটির চেয়ে ভাল হতে পারে sudo- যেহেতু একজনের আচরণ সর্বদা স্ক্রিপ্টের নিয়ন্ত্রণের বাইরে থাকবে (যদিও suবক্র বলগুলি ঝুঁকির সাথে ঝুঁকির সম্ভাবনা কম থাকে) একটু কম পাগল হওয়া) । পুরো প্যাকেজটি বান্ডিল করা একমাত্র নিশ্চিত বাজি - এটি নিশ্চিত হওয়া উচিত যে সব কিছু।
মাইকজার্ভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.