ব্যবহারকারীকে 1024 এর নীচে একটি পোর্ট শুনতে দেওয়া হচ্ছে


63

আমার কোনও ব্যবহারকারীকে (মূল থেকে পৃথক) পোর্ট ৮০ এ একটি সার্ভার শোনার অনুমতি দেওয়া দরকার।

এই কাজ করতে কোন উপায় আছে কি?


1
এই প্রশ্নটি ব্যাখ্যার জন্য উন্মুক্ত। আমি প্রত্যাশা করছি যে আপনি "আপনি একটি নতুন সিস্টেম পরিষেবা তৈরি করেছেন যা আপনি (মূল হিসাবে) সুরক্ষার কারণে একটি অনিবদ্ধ অ্যাকাউন্টে চালনা করতে চান" (ভাল অনুশীলন হিসাবে বিবেচিত) এবং "আমার কাছে এমন একজন ব্যবহারকারী নেই যা জিজ্ঞাসা করতে পারে কিনা আমার সিস্টেমে তাদের নিজস্ব ওয়েব সার্ভার চালান, আমি কীভাবে তাদের অ্যাক্সেসের অনুমতি দেব? " (বরং খারাপ অনুশীলন হিসাবে বিবেচিত)
মাইকেল শ '

3
@ টলেমি, আসল কারণটি হ'ল: আমার মেশিনটি একটি ফায়ারওয়ালের পিছনে রয়েছে যা কোনও বন্দর ছাড়া ৮০ টি ব্লক করে। আমি একটি সার্ভার হোস্ট করতে চাই (যা সুযোগ-সুবিধাগুলি হ্রাস করে না!), তাই এটি পোর্ট ৮০ এ শুনতে হবে, তবে ডন এটি রুট হিসাবে চালানোর জন্য বিশ্বাস করবেন না (স্পষ্ট সুরক্ষা কারণে)। আপনি যদি যত্ন নেন তবে আমাকে এটি করার অনুমতি দেওয়া হচ্ছে।
পেরো

উত্তর:


50

setcap 'cap_net_bind_service=+ep' /path/to/program

এটি নির্দিষ্ট প্রক্রিয়াগুলির জন্য কাজ করবে। তবে কোনও নির্দিষ্ট ব্যবহারকারীর 1024 এর নীচে বন্দরে বাঁধতে অনুমতি দিতে আপনাকে তাকে sudoers এ যুক্ত করতে হবে।

আরও জন্য এই আলোচনা তাকান ।


31

(এর কয়েকটি পদ্ধতির অন্যান্য জবাবগুলিতে উল্লেখ করা হয়েছে; আমি মোটামুটি পছন্দ অনুসারে বেশ কয়েকটি সম্ভাব্য পছন্দ দিচ্ছি।)

আপনি নিম্ন বন্দরটিকে একটি উচ্চ বন্দরটিতে পুনর্নির্দেশ করতে পারেন এবং উচ্চ বন্দরটিতে শুনতে পারেন।

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 1080

সুবিধাপ্রাপ্ত বন্দরে শুনতে শুরু করার পরে আপনি আপনার সার্ভারটি রুট হিসাবে শুরু করতে এবং সুবিধাগুলি ছাড়তে পারেন। সাধারণত, নিজের কোডিংয়ের পরিবর্তে আপনার সার্ভারটি এমন একটি মোড়ক থেকে শুরু করুন যা আপনার পক্ষে কাজ করে। যদি আপনার সার্ভারটি প্রতি সংযোগের জন্য একটি উদাহরণ শুরু করে, এটিকে inetd(বা এর মতো কোনও প্রোগ্রাম xinetd) থেকে শুরু করুন। এর জন্য inetd, এর মতো একটি লাইন ব্যবহার করুন /etc/inetd.conf:

http  stream  tcp  nowait  username:groupname  /path/to/server/executable  argv[0] argv[1]…

যদি আপনার সার্ভারটি একক দৃষ্টিতে শুনে তবে এটি কোনও প্রোগ্রাম থেকে শুরু করুন authbind। হয় একটি খালি ফাইল তৈরি করুন /etc/authbind/byport/80এবং এটি সার্ভারে চলমান ব্যবহারকারীর জন্য নির্বাহযোগ্য করুন; বা তৈরি করুন /etc/authbind/byuid/1234, যেখানে 1234 টি ইউআইডি হ'ল লাইনটি সহ সার্ভারটি চালাচ্ছে 0.0.0.0/0:80,80

আপনার সার্ভার এক্সিকিউটেবল যদি এমন কোনও ফাইল সিস্টেমে সক্ষমিত থাকে যা ক্ষমতাগুলি সমর্থন করে তবে আপনি এটিকে সক্ষমতা দিতে পারেন । সতর্ক থাকুন যে ক্ষমতা এখনও অপেক্ষাকৃত নতুন এবং এখনও কয়েক kinks আছেcap_net_bind_service

setcap cap_net_bind_service=ep /path/to/server/executable

4
প্রতিটি ক্ষেত্রেই আমাকে মোকাবেলা করতে হয়েছে, এক্সিকিউটেবল হ'ল স্ক্রিপ্ট যা জাভা বা পাইথন চালু করেছিল। সূক্ষ্ম পয়েন্টগুলিতে 10 ঘন্টা ব্যয় করার মতো লোক হিসাবে, আপনার iptables সমাধান এটিকে ব্যথাহীনভাবে কাভার করে।
srking

Iptables সমাধানের জন্য, আমাকে একটি ফিল্টার -A INPUT -p tcp --dport 1080 -j ACCEPTনিয়মও যুক্ত করতে হবে অন্যথায় এটি কাজ করবে না (আমার কাছে একটি -j DROPক্যাচ-অলও রয়েছে)) সুতরাং আমি দুটি শ্রোতা সকেট রেখেছি।
thom_nic

4

সংক্ষিপ্ত উত্তরটি হ'ল নকশা দ্বারা এটি সম্ভব নয়।

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

এটি বলেছে, স্বল্প বন্দরগুলিতে অ-রুট অ্যাক্সেসের অনুমোদনের জন্য একটি প্রোগ্রাম হ'ল অ্যাথবাইন্ড । উভয় SELinux এবং grsecurity যেমন জরিমানা টিউন অথেন্টিকেশন ব্যবস্থা জন্য অবকাঠামো প্রদান।

শেষ অবধি, আপনি যদি নির্দিষ্ট ব্যবহারকারীদের নির্দিষ্ট প্রোগ্রামগুলি মূল হিসাবে চালিত করতে চান এবং আপনার যা প্রয়োজন তা কেবল কোনও ব্যবহারকারীকে অ্যাপাচি বা এর মতো কিছু পুনরায় চালু করার অনুমতি দেওয়া, sudoআপনার বন্ধু কি!


8
আধুনিক বিশ্বে পোর্ট "সুরক্ষা" আপনাকে সত্যিকার অর্থে খুব একটা দেয় না।
pjc50

3
@ পিজেসি 50: হ্যাঁ তা করে। এটি নিহিত বিশ্বাস সম্পর্কে। নিম্ন বন্দর সংখ্যা উচ্চ বিশ্বাস বোঝায়। এসএসএইচ, পিওপি, এফটিপি এবং অন্যান্য ডেমনগুলি যখন তাদের বন্দরগুলি চালু হবে তখন সিস্টেম স্তরের পাসওয়ার্ড এবং অন্যান্য শংসাপত্রগুলির জন্য জিজ্ঞাসা করবে। যদি ব্যবহারকারীদের কোনও বাক্সে কম বন্দরগুলিতে শোনার অনুমতি দেওয়া হয়, তবে তারা অব্যবহৃত (বা ক্র্যাশ) পোর্টগুলিতে ফনি ডেমোন শুরু করতে এবং সন্দেহাতীত ব্যবহারকারীদের কাছ থেকে পাসওয়ার্ড সংগ্রহ করতে পারে। সেই পাসওয়ার্ডগুলি তখন সেই বাক্সে মূল সহ অন্যান্য অ্যাকাউন্টগুলিতে আপস করার জন্য ব্যবহার করা যেতে পারে।
কালেব

8
এটি সুরক্ষার একটি বেশ দুর্বল রূপ। আপনি যদি কোনও কিছুর সাথে সংযুক্ত হয়ে থাকেন এবং শংসাপত্রের লেনদেন না করেন তবে আপনি কার সাথে কথা বলছেন - অর্থাত্ এমআইটিএম আক্রমণ attacks
pjc50

5
আমি মনে করি যা বন্দরগুলির জন্য প্রয়োজন তা ছড়িয়ে দেওয়া হয়েছে: তারপরে আপনি "মেইন পোর্ট 25 ছুঁড়ে ফেলতে" পারতেন (ক) আপনার মেইল ​​ডেমনটি রুট প্রাইভেস দিয়ে শুরু করার দরকার নেই এবং (খ) অন্য কেউ এটিকে হাইজ্যাক করতে পারবেন না।
pjc50

7
যদিও লিনাক্স শৈশবকালীন সময়ে এটি "ডিজাইনের মাধ্যমে" সত্য হতে পারে, ততক্ষণে এবং এখন এটি খুব কম বোঝায় না। সুরক্ষা হ'ল কোনও ব্যবহারকারী কী করতে পারে এবং কী করতে পারে না সে সম্পর্কে। উদাহরণস্বরূপ, কেবলমাত্র রুট ব্যবহারকারীকে 80 বন্দরটি ব্যবহার করতে দেওয়া হ'ল একটি বিশাল সুরক্ষা ঝুঁকি, কারণ এর অর্থ আপনাকে এমন লোকদের রুট অ্যাক্সেস দিতে হবে যাদের 80 বন্দর ব্যবহার করতে হবে তবে তাদের রুট অ্যাক্সেস থাকা উচিত নয় । আপনি যদি 80 টি পোর্ট ব্যবহার করার জন্য অ-রুট ব্যবহারকারী এক্সকে বিশ্বাস করেন তবে আপনার ওএসের মধ্যে সেই বিশ্বাসটি এনকোড করতে সক্ষম হওয়া উচিত। ভাগ্যক্রমে, আপনি উল্লিখিত মত, এখানে কৃপণ কাজ চারপাশে আছে যা অনুমোদন দেয় যেমন আথবাইন্ডের মতো।
বিটি

3

আপনি নেটকাট বা জিনেটড বা আইপটিবল পোর্ট ফরওয়ার্ডিং ব্যবহার করতে পারেন , বা ফ্রাচ এন্ড প্রক্সি হিসাবে অ্যাপাচি ব্যবহার করতে পারেন এবং অ-সুবিধাযুক্ত পোর্টে প্রক্রিয়াটি চালাতে পারেন।


3

অথবাইন্ড , @ গিলস ইতিমধ্যে এটি উল্লেখ করেছে, তবে আমি এটির কিছুটা প্রসারিত করতে চাই।

এটিতে সুবিধাজনক অ্যাক্সেস নিয়ন্ত্রণ রয়েছে (ম্যান পৃষ্ঠায় বিশদ): আপনি পোর্ট, ইন্টারফেস ঠিকানা, ইউআইডি, ঠিকানা বা পোর্টের ব্যাপ্তি এবং এগুলির সংমিশ্রণ দ্বারা অ্যাক্সেস ফিল্টার করতে পারেন।

এটিতে খুব দরকারী প্যারামিটার রয়েছে --depth:

--depth স্তর

কলিং গ্রাফের স্তরের গভীরতর প্রোগ্রামগুলিকে প্রভাবিত করতে লেখককে বাধা দেয়। ডিফল্ট 1।

"স্তরগুলি গভীর" এর অর্থ যখন কোনও স্ক্রিপ্ট (বা প্রোগ্রাম), অন্য স্ক্রিপ্টটি চালায় এটি কোনও স্তরে নেমে আসে। সুতরাং আপনার যদি --depth 55 এর মধ্য দিয়ে 1 (বা এটি 0?) এর অর্থ হয় তবে আপনাকে বেঁধে দেওয়ার অনুমতি রয়েছে, যেখানে level স্তর এবং তারপরেও আপনার নেই। যখন আপনি কোনও স্ক্রিপ্টটি অ্যাক্সেস পেতে চান তখন দরকারী তবে এমন প্রোগ্রামগুলি নয় যা এটি আপনার অজানা বা অজানা ছাড়া চলে।


উদাহরণস্বরূপ, আপনার এর মতো কিছু থাকতে পারে: সুরক্ষার জন্য, আপনার কাছে এমন একটি ব্যবহারকারী রয়েছে javaযা কেবল জাভা চালানো হয় এবং আপনি তাকে 80 বন্দরটিতে অ্যাক্সেস দিতে চান:

echo > /etc/authbind/byport/80
chown root:java /etc/authbind/byport/80
chmod 710 /etc/authbind/byport/80

আমি এটি তৈরি করেছি ../byport/80 file, এটি javaব্যবহারকারীদের গ্রুপকে দিয়েছি (প্রতিটি ব্যবহারকারীর নিজস্ব গ্রুপ রয়েছে) এবং এটি গ্রুপ দ্বারা নির্বাহযোগ্য করে তোলে, যার অর্থ এটি javaব্যবহারকারী দ্বারা নির্বাহযোগ্য। আপনি যদি বন্দরের মাধ্যমে অ্যাক্সেস দিচ্ছেন, ফাইলটি ব্যবহারকারীর দ্বারা এক্সেস করা উচিত যাতে অ্যাক্সেস থাকা উচিত, তাই আমরা এটি করেছি।

এটি গড় জোয়ের পক্ষে যথেষ্ট হতে পারে তবে আপনি কীভাবে --depthপ্যারামিটারটি ব্যবহার করতে জানেন তা আপনি চালিয়ে যান ( javaব্যবহারকারীরূপে) আপনি যেভাবে কাজ করেন না এবং যেটি ব্যবহার করেন না তার ক্ষুদ্রতম গভীরতা না পাওয়া পর্যন্ত আপনি আপনার authbind --depth [depth] my_web_app's_start_scriptপথটি চালিয়ে --depth 1যাচ্ছেন।

বিশদ জন্য ম্যান পৃষ্ঠা পড়ুন


1

আমি iptables PREROUTING REDIRECT পদ্ধতিটি চেষ্টা করেছি, কিন্তু দেখেছি এটি ফরোয়ার্ড করা প্যাকেটগুলিকেও প্রভাবিত করে। এটি হ'ল, যদি মেশিনটি ইন্টারফেসগুলির মধ্যে প্যাকেটগুলিও ফরোয়ার্ড করে (যেমন এটি যদি কোনও ইথারনেট নেটওয়ার্কের সাথে সংযুক্ত ওয়াই-ফাই অ্যাক্সেস পয়েন্ট হিসাবে কাজ করে), তবে iptables নিয়মটি ইন্টারনেট গন্তব্যের সাথে সংযুক্ত ক্লায়েন্টদের সংযোগগুলিও ধরবে এবং এগুলিতে পুনর্নির্দেশ করবে যন্ত্র. আমি যা চাইছিলাম তা নয় - আমি কেবল মেশিনে পরিচালিত সংযোগগুলি পুনর্নির্দেশ করতে চেয়েছিলাম।

একটি সম্ভাবনা টিসিপি পোর্ট ফরওয়ার্ডিং ব্যবহার করা হয়। উদাহরণস্বরূপ socat:

socat TCP4-LISTEN:www,reuseaddr,fork TCP4:localhost:8080

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.