ডেল হ্যাগলুন্ড স্পট অন রয়েছে। সুতরাং আমি ঠিক একই জিনিস বলতে যাচ্ছি কিন্তু একটি ভিন্ন উপায়ে, কিছু নির্দিষ্টকরণ এবং উদাহরণ সহ। ☺
ইউনিক্স এবং লিনাক্স ওয়ার্ল্ডে সঠিক কাজটি হ'ল:
- একটি ছোট, সরল, সহজেই শ্রুতিমধুর, একটি প্রোগ্রাম থাকতে পারে যা সুপারভাইজার হিসাবে চলে এবং শ্রোতা সকেটকে আবদ্ধ করে;
- আরেকটি ছোট, সাধারণ, সহজে নিরীক্ষণযোগ্য, প্রথম প্রোগ্রাম দ্বারা উত্সাহিত সুবিধাগুলি হ্রাস করার প্রোগ্রাম রয়েছে;
- একটি আলাদা তৃতীয় প্রোগ্রামে পরিষেবাটির মাংস রাখার জন্য, সকেটের জন্য কেবল একটি উন্মুক্ত ফাইল বর্ণনাকারীর উত্তরাধিকারী হওয়ার প্রত্যাশা করে, একটি নন-সুপারুউসার অ্যাকাউন্টের অধীনে চালানো হবে এবং দ্বিতীয় প্রোগ্রাম দ্বারা লোড করা চেইন থাকবে।
উচ্চ ঝুঁকি কোথায় রয়েছে সে সম্পর্কে আপনার ভুল ধারণা রয়েছে। উচ্চ ঝুঁকি হ'ল নেটওয়ার্ক থেকে পড়া এবং যা পড়া হয় না তার উপর অভিনয় করে সকেট খোলার সাধারণ কাজগুলিতে, এটি একটি বন্দরে আবদ্ধ করে রাখা এবং কল করা listen()
। এটি এমন একটি পরিষেবার অংশ যা প্রকৃত যোগাযোগ করে যা উচ্চ ঝুঁকিপূর্ণ। যে অংশগুলি খোলার, bind()
এবং listen()
এবং এমনকি (কিছুটা হলেও) যে অংশটি accepts()
উচ্চ ঝুঁকি নয় এবং এটি সুপারভাইজারের অধীনে চালানো যেতে পারে। accept()
নেটওয়ার্কে অবিশ্বস্ত অপরিচিতদের নিয়ন্ত্রণে থাকা ডেটা ( ক্ষেত্রে সোর্স আইপি অ্যাড্রেসগুলি বাদ দিয়ে) তারা ব্যবহার করে না এবং কাজ করে না ।
এই কাজ করার অনেক উপায় আছে।
inetd
ডেল হ্যাগলুন্ড যেমন বলেছেন, পুরানো "নেটওয়ার্ক সুপারস্টার" এটি inetd
করে। যে অ্যাকাউন্টের অধীনে পরিষেবা প্রক্রিয়াটি চালিত হয় সেগুলির মধ্যে অন্যতম কলাম inetd.conf
। এটি শ্রবণ অংশ এবং ড্রপিং সুবিধাগুলি পৃথক দুটি পৃথক প্রোগ্রামে ভাগ করে না, ছোট এবং সহজে শ্রুতিমধুর করে তোলে, তবে এটি একটি মূল exec()
প্রক্রিয়া কোডকে একটি পৃথক প্রোগ্রামে পৃথক করে, কোনও পরিষেবা প্রক্রিয়াতে এটি একটি উন্মুক্ত ফাইল বর্ণনাকারীর সাহায্যে প্রসারিত সকেটের জন্য
নিরীক্ষণের অসুবিধা এতটা সমস্যা নয়, যেহেতু কেবলমাত্র একটি প্রোগ্রাম অডিট করতে হয়। inetd
এর বড় সমস্যাটি এত বেশি নিরীক্ষণ করা নয় বরং এটি সাম্প্রতিক সরঞ্জামগুলির তুলনায় এটি সহজ সূক্ষ্ম রানটাইম পরিষেবা নিয়ন্ত্রণ সরবরাহ করে না।
ইউসিএসপিআই-টিসিপি এবং ডিমনটোল
ড্যানিয়েল জে বার্নস্টেইনের ইউসিএসপিআই-টিসিপি এবং ডেমনটোলস প্যাকেজগুলি একযোগে এটি করার জন্য ডিজাইন করা হয়েছিল। বিকল্পভাবে ব্রুস গুয়েন্টারের সমতুল্য সমতুল্য ডিমনটোলস-এনকোয়ার টুলসেট ব্যবহার করতে পারেন ।
সকেট ফাইল বর্ণনাকারী খোলার এবং সুবিধাভোগী স্থানীয় বন্দরটিতে আবদ্ধ করার প্রোগ্রামটি tcpserver
ইউসিএসপিআই-টিসিপি থেকে। এটি listen()
এবং উভয়ই করে accept()
।
tcpserver
তারপরে হয় একটি পরিষেবা প্রোগ্রাম তৈরি করে যা রুট সুবিধাগুলি নিজেই ড্রপ করে (কারণ প্রদত্ত প্রোটোকলটিতে সুপারইউসার হিসাবে শুরু হওয়া এবং তারপরে "লগ ইন" অন্তর্ভুক্ত থাকে যেমন উদাহরণস্বরূপ, কোনও এফটিপি বা এসএসএইচ ডেমন) বা setuidgid
যা একটি স্ব-অন্তর্ভুক্ত ছোট এবং সহজে নিরীক্ষণযোগ্য প্রোগ্রাম যা সম্পূর্ণরূপে সুবিধাগুলি বাদ দেয় এবং তারপরে পরিষেবা প্রোগ্রামে চেইন লোডগুলি যথাযথভাবে (যার কোনও অংশই এইভাবে সুপারউজার সুবিধাগুলি দিয়ে চলে না, যেমনটি বলা যায় qmail-smtpd
)।
একটি সার্ভিস run
স্ক্রিপ্ট যেমন উদাহরণস্বরূপ ( নাল আইডেন্ট পরিষেবা সরবরাহ করার জন্য এটি ডামিআইডেন্টডের জন্য একটি):
#!/bin/sh -e
exec 2>&1
exec \
tcpserver 0 113 \
setuidgid nobody \
dummyidentd.pl
জখলাবার
আমার নশ প্যাকেজটি এটি করার জন্য ডিজাইন করা হয়েছে। setuidgid
অন্যদের মতো এটিরও একটি ছোট্ট ইউটিলিটি রয়েছে। এক সামান্য পার্থক্য হল যে এটি দিয়ে ব্যবহারযোগ্য হয় systemd
-style "LISTEN_FDS" পরিষেবা সেইসাথে সঙ্গে UCSPI-বিভিন্ন TCP সেবা, তাই ঐতিহ্যগত tcpserver
প্রোগ্রাম দুটি পৃথক প্রোগ্রাম দ্বারা প্রতিস্থাপিত হয়: tcp-socket-listen
এবং tcp-socket-accept
।
আবার একক-উদ্দেশ্যমূলক ইউটিলিটিগুলি একে অপরের স্পন এবং চেইন লোড। ডিজাইনের একটি আকর্ষণীয় কীর্তি হ'ল যে কোনওটির পরে listen()
কিন্তু তার আগেও সুপারভাইজার সুবিধাগুলি বাদ দেওয়া যায় accept()
। এখানে এর জন্য একটি run
স্ক্রিপ্ট qmail-smtpd
প্রকৃতপক্ষে ঠিক তা করে:
#!/bin/nosh
fdmove -c 2 1
clearenv --keep-path --keep-locale
envdir env/
softlimit -m 70000000
tcp-socket-listen --combine4and6 --backlog 2 ::0 smtp
setuidgid qmaild
sh -c 'exec \
tcp-socket-accept -v -l "${LOCAL:-0}" -c "${MAXSMTPD:-1}" \
ucspi-socket-rules-check \
qmail-smtpd \
'
প্রোগ্রাম সুপার-ইউজার এর পৃষ্ঠপোষকতায় পরিচালিত ছোট পরিষেবাতে অজ্ঞেয়বাদী শৃঙ্খল-লোড সরঞ্জাম fdmove
, clearenv
, envdir
, softlimit
, tcp-socket-listen
, এবং setuidgid
। যে বিন্দুটি sh
শুরু হয়েছিল, সকেটটি খোলা এবং smtp
বন্দরের সাথে আবদ্ধ এবং প্রক্রিয়াটিতে আর সুপারস সুবিধা নেই।
s6, s6- নেটওয়ার্কিং, এবং সম্পাদনা
লরেন্ট বেরকোটের এস and এবং এস-নেটওয়ার্কিং প্যাকেজগুলি একযোগে এটি করার জন্য ডিজাইন করা হয়েছিল। কমান্ডগুলি কাঠামোগতভাবে daemontools
এবং ইউসিএসপিআই-টিসিপি-র অনুরূপ ।
run
স্ক্রিপ্ট একই হবে, এর প্রতিকল্পন ছাড়া s6-tcpserver
জন্য tcpserver
এবং s6-setuidgid
জন্য setuidgid
। তবে, একইসাথে এম বারকোটের এক্সিলাইন টুলসেট ব্যবহার করাও চয়ন করা যেতে পারে ।
ওয়েইন মার্শালের মূল থেকে হালকাভাবে সংশোধিত এফটিপি পরিষেবার একটি উদাহরণ এখানে দেওয়া হয়েছে, এতে প্রকাশক, এস 6, এস 6-নেটওয়ার্কিং এবং পাবলিক ফাইল থেকে এফটিপি সার্ভার প্রোগ্রাম ব্যবহার করা হয় :
#!/command/execlineb -PW
multisubstitute {
define CONLIMIT 41
define FTP_ARCHIVE "/var/public/ftp"
}
fdmove -c 2 1
s6-envuidgid pubftp
s6-softlimit -o25 -d250000
s6-tcpserver -vDRH -l0 -b50 -c ${CONLIMIT} -B '220 Features: a p .' 0 21
ftpd ${FTP_ARCHIVE}
ipsvd
জেরিট পেপের আইপিএসভিডি হ'ল আরেকটি টুলসেট যা ucspi-tcp এবং s6- নেটওয়ার্কিংয়ের মতো একই লাইন ধরে চলে। সরঞ্জাম chpst
এবং tcpsvd
এই সময়, কিন্তু তারা একই জিনিস করে, অধিক ঝুঁকিসম্পন্ন কোডটি পড়া, প্রক্রিয়াকরণ, এবং অনির্ভরযোগ্য ক্লায়েন্টদের দ্বারা নেটওয়ার্কের মাধ্যমে পাঠানো কিছু লেখার আছে এখনও একটি পৃথক প্রোগ্রাম রয়েছে।
এখানে এম Pape উদাহরণ চলমান fnord
একটি run
স্ক্রিপ্ট:
#!/bin/sh
exec 2>&1
cd /public/10.0.5.4
exec \
chpst -m300000 -Uwwwuser \
tcpsvd -v 10.0.5.4 443 sslio -v -unobody -//etc/fnord/jail -C./cert.pem \
fnord
systemd
systemd
নতুন সেবা তত্ত্বাবধান ও Init সিস্টেম কিছু লিনাক্স ডিস্ট্রিবিউশন খুঁজে পাওয়া যেতে পারে যে, কি করতে দেয়ার উদ্দেশ্যে করা হচ্ছে inetd
কি করতে পারেন । যাইহোক, এটি ছোট স্ব-অন্তর্ভুক্ত প্রোগ্রামগুলির একটি স্যুট ব্যবহার করে না। systemd
দুর্ভাগ্যক্রমে একজনকে পুরোপুরি নিরীক্ষণ করতে হবে ।
সঙ্গে systemd
এক একটি সকেট যে সংজ্ঞায়িত করতে কনফিগারেশন ফাইল তৈরি করে systemd
উপর শোনেন এবং একটি পরিষেবা যা systemd
শুরু হয়। পরিষেবা "ইউনিট" ফাইলটির সেটিংস রয়েছে যা সেটিকে ব্যবহারকারীর হিসাবে চালিত করে সেবার সাথে পরিষেবা প্রসেসকে নিয়ন্ত্রণ করতে পারে great
যে ব্যবহারকারীটি অ-সুপারইউজার হিসাবে সেট করা হয়েছে, systemd
এটি সকেটটি খোলার, একে কোনও বন্দরে আবদ্ধ করার, এবং প্রসেস 1-এ সুপারসউজার হিসাবে কল করার listen()
(এবং, প্রয়োজন হলে accept()
), এবং পরিষেবা প্রক্রিয়াটির সমস্ত কাজ করে it spawns অতি ব্যবহারকারী সুযোগ সুবিধা ব্যতীত চলে।