আমার কোনও ব্যবহারকারীকে (মূল থেকে পৃথক) পোর্ট ৮০ এ একটি সার্ভার শোনার অনুমতি দেওয়া দরকার।
এই কাজ করতে কোন উপায় আছে কি?
আমার কোনও ব্যবহারকারীকে (মূল থেকে পৃথক) পোর্ট ৮০ এ একটি সার্ভার শোনার অনুমতি দেওয়া দরকার।
এই কাজ করতে কোন উপায় আছে কি?
উত্তর:
setcap 'cap_net_bind_service=+ep' /path/to/program
এটি নির্দিষ্ট প্রক্রিয়াগুলির জন্য কাজ করবে। তবে কোনও নির্দিষ্ট ব্যবহারকারীর 1024 এর নীচে বন্দরে বাঁধতে অনুমতি দিতে আপনাকে তাকে sudoers এ যুক্ত করতে হবে।
আরও জন্য এই আলোচনা তাকান ।
(এর কয়েকটি পদ্ধতির অন্যান্য জবাবগুলিতে উল্লেখ করা হয়েছে; আমি মোটামুটি পছন্দ অনুসারে বেশ কয়েকটি সম্ভাব্য পছন্দ দিচ্ছি।)
আপনি নিম্ন বন্দরটিকে একটি উচ্চ বন্দরটিতে পুনর্নির্দেশ করতে পারেন এবং উচ্চ বন্দরটিতে শুনতে পারেন।
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
-A INPUT -p tcp --dport 1080 -j ACCEPT
নিয়মও যুক্ত করতে হবে অন্যথায় এটি কাজ করবে না (আমার কাছে একটি -j DROP
ক্যাচ-অলও রয়েছে)) সুতরাং আমি দুটি শ্রোতা সকেট রেখেছি।
সংক্ষিপ্ত উত্তরটি হ'ল নকশা দ্বারা এটি সম্ভব নয়।
দীর্ঘ উত্তরটি হ'ল ওপেন সোর্স ওয়ার্ল্ডে প্রচুর লোক ডিজাইন নিয়ে খেলছেন এবং বিকল্প পদ্ধতি নিয়ে আসছেন। সাধারণভাবে এটি বহুলভাবে গ্রহণযোগ্য অনুশীলন যে এটি সম্ভব না হওয়া উচিত। আপনি যে চেষ্টা করছেন তা সম্ভবত সম্ভবত আপনার সিস্টেমে অন্য ডিজাইনের ত্রুটি রয়েছে এবং আপনার সম্পূর্ণ সিস্টেমের আর্কিটেকচারকে * নিক্স সর্বোত্তম অনুশীলন এবং সুরক্ষা সম্পর্কিত প্রভাবের আলোকে পুনর্বিবেচনা করা উচিত।
এটি বলেছে, স্বল্প বন্দরগুলিতে অ-রুট অ্যাক্সেসের অনুমোদনের জন্য একটি প্রোগ্রাম হ'ল অ্যাথবাইন্ড । উভয় SELinux এবং grsecurity যেমন জরিমানা টিউন অথেন্টিকেশন ব্যবস্থা জন্য অবকাঠামো প্রদান।
শেষ অবধি, আপনি যদি নির্দিষ্ট ব্যবহারকারীদের নির্দিষ্ট প্রোগ্রামগুলি মূল হিসাবে চালিত করতে চান এবং আপনার যা প্রয়োজন তা কেবল কোনও ব্যবহারকারীকে অ্যাপাচি বা এর মতো কিছু পুনরায় চালু করার অনুমতি দেওয়া, sudo
আপনার বন্ধু কি!
আপনি নেটকাট বা জিনেটড বা আইপটিবল পোর্ট ফরওয়ার্ডিং ব্যবহার করতে পারেন , বা ফ্রাচ এন্ড প্রক্সি হিসাবে অ্যাপাচি ব্যবহার করতে পারেন এবং অ-সুবিধাযুক্ত পোর্টে প্রক্রিয়াটি চালাতে পারেন।
অথবাইন্ড , @ গিলস ইতিমধ্যে এটি উল্লেখ করেছে, তবে আমি এটির কিছুটা প্রসারিত করতে চাই।
এটিতে সুবিধাজনক অ্যাক্সেস নিয়ন্ত্রণ রয়েছে (ম্যান পৃষ্ঠায় বিশদ): আপনি পোর্ট, ইন্টারফেস ঠিকানা, ইউআইডি, ঠিকানা বা পোর্টের ব্যাপ্তি এবং এগুলির সংমিশ্রণ দ্বারা অ্যাক্সেস ফিল্টার করতে পারেন।
এটিতে খুব দরকারী প্যারামিটার রয়েছে --depth
:
--depth স্তর
কলিং গ্রাফের স্তরের গভীরতর প্রোগ্রামগুলিকে প্রভাবিত করতে লেখককে বাধা দেয়। ডিফল্ট 1।
"স্তরগুলি গভীর" এর অর্থ যখন কোনও স্ক্রিপ্ট (বা প্রোগ্রাম), অন্য স্ক্রিপ্টটি চালায় এটি কোনও স্তরে নেমে আসে। সুতরাং আপনার যদি --depth 5
5 এর মধ্য দিয়ে 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
যাচ্ছেন।
আমি iptables PREROUTING REDIRECT পদ্ধতিটি চেষ্টা করেছি, কিন্তু দেখেছি এটি ফরোয়ার্ড করা প্যাকেটগুলিকেও প্রভাবিত করে। এটি হ'ল, যদি মেশিনটি ইন্টারফেসগুলির মধ্যে প্যাকেটগুলিও ফরোয়ার্ড করে (যেমন এটি যদি কোনও ইথারনেট নেটওয়ার্কের সাথে সংযুক্ত ওয়াই-ফাই অ্যাক্সেস পয়েন্ট হিসাবে কাজ করে), তবে iptables নিয়মটি ইন্টারনেট গন্তব্যের সাথে সংযুক্ত ক্লায়েন্টদের সংযোগগুলিও ধরবে এবং এগুলিতে পুনর্নির্দেশ করবে যন্ত্র. আমি যা চাইছিলাম তা নয় - আমি কেবল মেশিনে পরিচালিত সংযোগগুলি পুনর্নির্দেশ করতে চেয়েছিলাম।
একটি সম্ভাবনা টিসিপি পোর্ট ফরওয়ার্ডিং ব্যবহার করা হয়। উদাহরণস্বরূপ socat
:
socat TCP4-LISTEN:www,reuseaddr,fork TCP4:localhost:8080
তবে এই পদ্ধতির একটি অসুবিধা হ'ল 8080 পোর্টে যে অ্যাপ্লিকেশনটি শোনা যাচ্ছে তা আগত সংযোগগুলির উত্স ঠিকানা জানে না (যেমন লগিং বা অন্যান্য সনাক্তকরণের উদ্দেশ্যে)।