লিনাক্সের "সুবিধাযুক্ত" পোর্টগুলিতে আবদ্ধ থাকার জন্য নন-রুট প্রক্রিয়াগুলির কী উপায় আছে?


389

আমার বিকাশ বাক্সে এই সীমাবদ্ধতাটি রাখা খুব বিরক্তিকর, যখন আমার ব্যতীত অন্য কোনও ব্যবহারকারী কখনও পাবেন না।

আমি স্ট্যান্ডার্ড কাজের দিক সম্পর্কে অবহিত , তবে তাদের কেউই আমি যা চাই তা ঠিক তেমন করে না:

  1. অ্যাথবাইন্ড ( দেবিয়ান পরীক্ষার সংস্করণ, 1.0, কেবল আইপিভি 4 সমর্থন করে)
  2. কম বন্দরকে একটি উচ্চ বন্দরটিতে পুনর্নির্দেশের জন্য আইপটিবলস রেডিরেক্ট লক্ষ্য ব্যবহার করে ((tables এর আইপিভি 6 সংস্করণ ip6tables জন্য "নাট" টেবিলটি এখনও প্রয়োগ করা হয়নি)
  3. sudo (মূল হিসাবে চালানো আমি এড়াতে চাইছি)
  4. সেলিনাক্স (বা অনুরূপ)। (এটি কেবল আমার দেব বাক্স, আমি অতিরিক্ত কোনও জটিলতার পরিচয় দিতে চাই না))

sysctlলিনাক্সে "সুবিধাযুক্ত" বন্দরগুলি (1024 এর চেয়ে কম বন্দর) আবদ্ধ করার জন্য নন-রুট প্রক্রিয়াগুলিকে আবদ্ধ করার জন্য কি কিছু সাধারণ পরিবর্তনশীল আছে, বা আমি কি ভাগ্যের বাইরে?

সম্পাদনা: কিছু ক্ষেত্রে, আপনি এটি করার জন্য দক্ষতা ব্যবহার করতে পারেন


5
আমার অভিজ্ঞতায় এটি চেষ্টা করার একটি কারণ হ'ল অ্যাপাচি (বা লাইটটিপিডি) ব্যবহার না করে একটি ওয়েব সার্ভার লিখতে।
এস .লট

আমি setcap কাপড় আমার উত্তর প্রায় অভিন্ন জুড়েছেন stackoverflow.com/questions/277991/...
পল Tomblin

15
কারণ এই উদাহরণে, আমি আইপিভি 6 ব্যবহার করছিলাম, এজন্য কিছু "স্বাভাবিক" ওয়ার্কআরাউন্ডস (লেখক এবং iptables পুনর্নির্মাণ) আমার পক্ষে কাজ করেনি।
জেসন ক্রেইটন


1
এটি করার কয়েকটি উপায় রয়েছে। দেখুন root- ব্যতীত প্রক্রিয়া বন্দর 80 443 জুড়তে অনুমতি দেবেন? সুপার ব্যবহারকারী।
jww

উত্তর:


392

ঠিক আছে, সেই সমস্ত লোকদের ধন্যবাদ যারা দক্ষতা সিস্টেম এবং CAP_NET_BIND_SERVICEসক্ষমতা নির্দেশ করেছেন । আপনার যদি সাম্প্রতিক কার্নেল থাকে তবে এটি অ-রুট হিসাবে কম সার্ভিস শুরু করার জন্য কম বন্দরগুলি আবদ্ধ করার জন্য এটি ব্যবহার করা সম্ভব। সংক্ষিপ্ত উত্তরটি হ'ল আপনি:

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

এবং তারপরে যে কোনও সময় programমৃত্যুদন্ড কার্যকর করা হলে এর CAP_NET_BIND_SERVICEসক্ষমতা থাকবে। setcapডিবিয়ান প্যাকেজে রয়েছে libcap2-bin

এখন সাবধানতার জন্য:

  1. আপনার কমপক্ষে একটি 2.6.24 কার্নেল লাগবে
  2. আপনার ফাইলটি স্ক্রিপ্ট হলে এটি কাজ করবে না। (অর্থাত্, দোভাষী চালু করতে একটি # লাইন ব্যবহার করে)। এই ক্ষেত্রে, আমি যতদূর বুঝতে পেরেছি, আপনাকে নিজেই অনুবাদককে নির্বাহযোগ্য হিসাবে প্রয়োগ করতে হবে, যেটি অবশ্যই একটি সুরক্ষা দুঃস্বপ্ন, যেহেতু সেই দোভাষীটি ব্যবহার করে যে কোনও প্রোগ্রামের সক্ষমতা থাকবে। আমি এই সমস্যাটি ঘিরে কাজ করার কোনও পরিষ্কার, সহজ উপায় খুঁজে পাচ্ছিলাম না।
  3. লিনাক্স কোনো LD_LIBRARY_PATH নিষ্ক্রিয় করা হবে programযে ভালো বিশেষাধিকার উঁচু করেছে setcapবা suid। সুতরাং আপনার যদি programএটির নিজস্ব ব্যবহার হয় তবে .../lib/আপনাকে পোর্ট ফরওয়ার্ডিংয়ের মতো অন্য কোনও বিকল্পটি সন্ধান করতে হবে।

সম্পদ:

নোট: RHEL প্রথম V6 এই যোগ


3
স্ক্রিপ্টগুলির জন্য আংশিক কাজ অবশ্যই, সেই ব্যবহারকারীদের অবশ্যই বিশ্বাসযোগ্য হতে হবে তবে তারা স্ক্রিপ্টটি যেভাবেই পরিবর্তন করতে পারে।
এরিচ কিটজমুয়েলার 12

3
পূর্বোক্ত ডেবিয়ান (বাইনারি) প্যাকেজ বাদে , বিকাশকারীর সাইট হ'ল friedhoff.org/posixfilecaps.html সম্পর্কিত কাগজপত্র / উপস্থাপনা / ইত্যাদি ...
র্যান্ডমনিঙ্কনাম 42

1
suse SLES 11.1 এ কাজ করার জন্য আমাকে মেনু গ্রাব করতে কার্নেল প্যারাম ফাইল_ক্যাপস = 1 যুক্ত করতে হয়েছিল stএটি কাজ করার জন্য।
শয়ে

2
হ্যাঁ @ সি। রোস যেহেতু এটি প্রয়োগ করতে হবে /usr/bin/javaএবং তারপরে সিস্টেমে চলমান যে কোনও জাভা অ্যাপ্লিকেশনটির সক্ষমতা উন্মুক্ত করবে। খুব খারাপ ক্ষমতাগুলি প্রতি ব্যবহারকারীকেও সেট করা যায় না।
জোয়েটউইল

5
রিবুটগুলি জুড়ে কী সেটক্যাপ সেটিংস অবিচল থাকে; যদি এই নিয়মটি রাখার কোনও মানক স্থান না থাকে তবে এটি কি সিস্টেম স্টার্টআপের সময় চালিত হয়? কি /etc/security/capability.confকোন সাহায্যের Debian / Ubuntu- উপর?
জোয়েটউইল

34

আপনি একটি পোর্ট পুনর্নির্দেশ করতে পারেন। লিনাক্স বাক্সে চলমান সিলভারলাইট নীতি সার্ভারের জন্য আমি এটি করি

iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 943 -j REDIRECT --to-port 1300

5
দুর্ভাগ্যক্রমে এটি কেবল রাউটেড সংযোগগুলির জন্য কাজ করবে, যেমন স্থানীয় মেশিন থেকে নয়।
zbyszek

@ জোয়েটউইলড আমি মনে করি এটি স্ক্রিপ্টে আছে যা আপনার সার্ভারটি চালায় (শুরু), তবে আমি ভুল হতে পারি। আমি আরও জানতে চাই: পি
ক্যামিলো মার্টিন

@ ক্যামিলোমার্টিন আবার সন্ধান করছেন, ডাবিয়ান ডকুমেন্টেশন যা প্রশ্ন থেকে যুক্ত হয়েছিল তা আপনার ফায়ারওয়াল স্ক্রিপ্টে রাখার বা একটি তৈরি করার পরামর্শ দেয় /etc/network/if-up.d/firewall
জোয়েটউইডল

8
@zbyszek স্থানীয় মেশিন সংযোগ, একটি অতিরিক্ত iptables- র সঙ্গে এই করতে পারেন কাজ নিয়ম: stackoverflow.com/a/31795603/1356953
00500005

পুরানো কার্নেলগুলিতে মনে হয় এটি আইপিভি 6 এর জন্য সমর্থিত নয় । তবে দৃশ্যত এটি ip6tables v1.4.18 এবং লিনাক্স কার্নেল v3.8 তে সমর্থিত।
ক্রেগ ম্যাককুইন

31

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

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


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

রুট গোপনীয়তা বাদ দেওয়া এটি করার সঠিক উপায়। যদিও আপনি সার্ভিসটি শুরু / আপস্টার্ট / সিস্টেমে চালু করেছেন সেটআপ করার প্রয়োজন নেই।
মাইকেল হ্যাম্পটন

2
প্রোগ্রামটি যদি কোনও ব্যাখ্যামূলক ভাষায় বা বাইকোড দোভাষী যেমন সি # (মনো), জাভা, পাইথনের লিখিত হয় তবে এটি কঠিন। (স্পষ্টতই পার্ল এটির মাধ্যমে binfmt_miscএবং এর 'সি' পতাকাটি দিয়ে কাজটি করেছেন ; আমি অন্যের বিষয়ে নিশ্চিত নই))
ক্রেগ ম্যাকউউইন

এমিট বাইট ব্যতীত খুব কম, এটি খুব কম করছে না।
রায়ান

আপনি যদি বাইনারি সেটুইড সেট করেন তবে এটি রুট প্রক্রিয়া হিসাবে চলবে। প্রশ্ন, তবে, আপনার বাইনারিকে রুট প্রক্রিয়া হিসাবে চালনা না করে কীভাবে এটি সম্পাদন করা যায় তা জিজ্ঞাসা করে। এই সমাধানটি একটি পৃথক প্রশ্নের উত্তর, যথা: "কোনও বেসরকারী ব্যবহারকারী কোনও প্রাইভেলজিড বন্দরে কীভাবে একটি প্রক্রিয়া বাঁধতে পারে", তবে এই প্রশ্নটি উত্থাপিত নয়, আইএমএইচও?
মাইকেল বিয়ার

24

অথবা আপনার কার্নেলটি প্যাচ করুন এবং চেকটি সরিয়ে ফেলুন।

(সর্বশেষ রিসর্টের বিকল্প, প্রস্তাবিত নয়)।

মধ্যে net/ipv4/af_inet.c, পড়া দুটি লাইন সরান

      if (snum && snum < PROT_SOCK && !capable(CAP_NET_BIND_SERVICE))
              goto out;

এবং কার্নেল সুবিধাযুক্ত বন্দরগুলি আর পরীক্ষা করবে না।


22
প্রচুর কারণে অনেক খারাপ ধারণা।
অ্যাডাম লাসেক

24
এটি খারাপ ধারণা। কিন্তু আসলে কাজ করবে। এবং নিশ্চিতভাবে আমাকে হাসিয়েছে।
ওটো ব্র্লেজ

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

18
আমি নিশ্চিত না যে আপনি কেন নিম্নচাপে ছিলেন। ম্যালওয়্যার লেখকরা কোন পোর্টটি শুনেন সেগুলি সেয়ার করে না এবং তারা 1024 এর চেয়ে বেশি বন্দরটি খুলে খুশি হয়। এটি আমার কাছে মনে হয় যে সমস্ত বন্দরগুলির জন্য বিশেষাধিকার প্রয়োজন, বা কোনও বন্দরকে সুবিধার দরকার নেই। এবং 1024 এর নীচে একটি বন্দর খোলার জন্য রুটের প্রয়োজনের অর্থ হ'ল রুট হিসাবে আপনার উচ্চ ঝুঁকির প্রয়োগ রয়েছে। এটি আমার কাছে সত্যিই বোবা ধারণা বলে মনে হচ্ছে । সম্ভবত আমি এখানে কিছু মিস করছি ...
jw

9
আগের দিন, ইউএসএক্স থেকে ইউএনআইএক্স প্রোটোকলগুলিতে <1024 বন্দরটি ব্যবহার করা হয়েছিল অন্য প্রান্তে চলমান কোডটি রুট হিসাবে চলছে তা প্রমাণ করার জন্য। এটি সাধারণ সুরক্ষার সাথে ইউনিক্স সার্ভারের একটি সেটের জন্য যুক্তিসঙ্গতভাবে কার্যকর ছিল।
জোশুয়া

22

আপনি একটি স্থানীয় এসএসএইচ টানেল সেটআপ করতে পারেন, উদাহরণস্বরূপ, আপনি যদি আপনার অ্যাপ্লিকেশনটি 3000 এর সাথে আবদ্ধ করতে পোর্ট 80 চান তবে:

sudo ssh $USERNAME@localhost -L 80:localhost:3000 -N

এটিতে স্ক্রিপ্ট সার্ভারগুলির সাথে কাজ করার সুবিধা রয়েছে এবং খুব সহজ।


1
আমার ব্যক্তিগত প্রিয়। চালু এবং বন্ধ করা খুব সহজ এবং কোনও সিস্টেম-ব্যাপী কোনও পরিবর্তন প্রয়োজন। ভালো বুদ্ধি!
ড্যান প্যাসারো

এটা চমৎকার. এখন পর্যন্ত সহজ উত্তর।
মাইকেলসনোদ্দিন

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

3
এটি কোনও sudo nc -l 80 | nc localhost 3000
স্ট্যাশ

1
আপনি একই মেশিনে ডেটা অন্য পোর্টে স্থানান্তরিত করার জন্য + এনক্রিপ্ট করছেন? এছাড়াও, এটি ইউডিপি ট্র্যাফিকের জন্য কাজ করে না।
ড্যানিয়েল এফ

19

আপডেট 2017:

অ্যাথবাইন্ড ব্যবহার করুন


CAP_NET_BIND_SERVICE বা একটি কাস্টম কার্নেলের চেয়ে অনেক বেশি ভাল।

  • CAP_NET_BIND_SERVICE বাইনারিটিকে বিশ্বাস দেয় তবে প্রতি বন্দর অ্যাক্সেসের জন্য কোনও নিয়ন্ত্রণ সরবরাহ করে না।
  • অ্যাথবাইন্ড ব্যবহারকারী / গোষ্ঠীকে আস্থা প্রদান করে এবং প্রতি বন্দর অ্যাক্সেসের উপর নিয়ন্ত্রণ সরবরাহ করে এবং আইপিভি 4 এবং আইপিভি 6 উভয়কেই সমর্থন করে (আইপিভি 6 সমর্থন দেরী হিসাবে যুক্ত করা হয়েছে)।

    1. ইনস্টল করুন: apt-get install authbind

    2. প্রাসঙ্গিক পোর্টগুলিতে অ্যাক্সেস কনফিগার করুন, যেমন সমস্ত ব্যবহারকারী এবং গোষ্ঠীর জন্য 80 এবং 443:

      সুডো টাচ / ইত্যাদি / অ্যাথবাইন্ড / বাইপোর্ট / 80
      সুডো টাচ / ইত্যাদি / অ্যাথবাইন্ড / বাইপোর্ট / 443
      সুডো চিডোড 777 / ইত্যাদি / অ্যাথবাইন্ড / বাইপোর্ট / 80
      সুডো চিডোড 777 / ইত্যাদি / অ্যাথবাইন্ড / বাইপোর্ট / 443

    3. আপনার আদেশটি কার্যকর করুন authbind
      (allyচ্ছিকভাবে নির্দিষ্টকরণ --deepবা অন্যান্য যুক্তি, ম্যান পৃষ্ঠাটি দেখুন):

      authbind --deep /path/to/binary command line args
      

      যেমন

      authbind --deep java -jar SomeServer.jar
      

জোশুয়ার কল্পিত (যেমন আপনি কী করবেন তা না জানলে প্রস্তাবিত নয়) অনুসরণ করে কার্নেলটি হ্যাক করার পরামর্শ দেওয়া হয়েছে:

আমি এখানে প্রথম পোস্ট করেছি ।

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

sudo /sbin/setcap 'cap_net_bind_service=ep' /usr/lib/jvm/java-8-openjdk/jre/bin/java

স্পষ্টতই, এর অর্থ কোনও জাভা প্রোগ্রাম সিস্টেম বন্দরগুলিকে আবদ্ধ করতে পারে।
মনো / .NET এর জন্য ডিটো।

আমি আরও নিশ্চিত যে xinetd আইডিয়া সেরা না।
তবে যেহেতু উভয় পদ্ধতিই হ্যাক, কেবলমাত্র সীমাবদ্ধতা তুলে নিয়ে সীমাটি তোলেন না কেন?
কেউ আপনাকে বলেনি যে আপনাকে একটি সাধারণ কার্নেল চালাতে হবে, সুতরাং আপনি কেবল নিজের চালাতে পারেন।

আপনি কেবল সর্বশেষতম কার্নেলটির (বা আপনার কাছে বর্তমানে একই) উত্সটি ডাউনলোড করুন। এরপরে, আপনি এখানে যান:

/usr/src/linux-<version_number>/include/net/sock.h:

আপনি এই লাইন জন্য সন্ধান করুন

/* Sockets 0-1023 can't be bound to unless you are superuser */
#define PROT_SOCK       1024

এবং এটিকে পরিবর্তন করুন

#define PROT_SOCK 0

যদি আপনি কোনও সুরক্ষিত ssh পরিস্থিতি না পেতে চান তবে আপনি এটিতে এটি পরিবর্তন করুন: # নির্দিষ্ট করুন PROT_SOCK 24

সাধারণত, আমি আপনার প্রয়োজন সবচেয়ে কম সেটিংটি ব্যবহার করতাম, যেমন HTTP- র জন্য 79, বা 25 পোর্টে এসএমটিপি ব্যবহার করার সময় 24।

ইতিমধ্যে সব।
কার্নেলটি কম্পাইল করে ইনস্টল করুন।
পুনরায় বুট করুন।
সমাপ্ত - যে নির্বোধ সীমা GONE, এবং এটি স্ক্রিপ্টগুলির জন্যও কাজ করে।

আপনি কীভাবে কার্নেলটি সংকলন করছেন তা এখানে:

https://help.ubuntu.com/community/Kernel/Compile

# You can get the kernel-source via package linux-source, no manual download required
apt-get install linux-source fakeroot

mkdir ~/src
cd ~/src
tar xjvf /usr/src/linux-source-<version>.tar.bz2
cd linux-source-<version>

# Apply the changes to PROT_SOCK define in /include/net/sock.h

# Copy the kernel config file you are currently using
cp -vi /boot/config-`uname -r` .config

# Install ncurses libary, if you want to run menuconfig
apt-get install libncurses5 libncurses5-dev

# Run menuconfig (optional)
make menuconfig

# Define the number of threads you wanna use when compiling (should be <number CPU cores> - 1), e.g. for quad-core
export CONCURRENCY_LEVEL=3
# Now compile the custom kernel
fakeroot make-kpkg --initrd --append-to-version=custom kernel-image kernel-headers

# And wait a long long time

cd ..

সংক্ষেপে, আপনি সুরক্ষিত থাকতে চাইলে iptables ব্যবহার করুন, আপনি যদি নিশ্চিত হন যে এই বিধিনিষেধ আপনাকে আর বিরক্ত করবে না তখন কার্নেলটি সঙ্কলন করুন।


ডাউনভোটের কোনও কারণ? রুট-হেইটার, বা কার্নেল-সংকলনের নির্দেশাবলী কার্যকর হয়নি?
স্টিফান স্টেইগার

4
কার্নেলটি পরিবর্তন করা ভবিষ্যতের আপডেটগুলি আরও বেদনাদায়ক করে তোলে। আমি এটি করব না, কারণ আমি জানি যে আমার কর্নেলটি নিয়মিত আপডেট করা আমার পক্ষে খুব অলস হবে। এটি তাত্ত্বিকভাবে সম্ভব এটি চমৎকার, তবে এটি অনেক পরিস্থিতিতে একটি কার্যকর বিকল্প নয়।
kritzikratzi

সম্ভবত এটির আরও সুরক্ষিত উপায় হ'ল chmod 777 / etc / authbind / byport / 80 দ্বারা chmod 544 / etc / authbind / byport / 23 chown লগইন ছাড়াই: গ্রুপ / ইত্যাদি / authbind / byport / 23
Jérôme বি

18

ফাইলের ক্ষমতাগুলি আদর্শ নয়, কারণ তারা প্যাকেজ আপডেটের পরে ব্রেক করতে পারে।

আদর্শ সমাধান, আইএমএইচও, উত্তরাধিকারসূত্রে CAP_NET_BIND_SERVICEসেট সহ একটি শেল তৈরির দক্ষতা হওয়া উচিত ।

এটি করার জন্য এখানে কিছুটা সংশ্লেষিত উপায়:

sg $DAEMONUSER "capsh --keep=1 --uid=`id -u $DAEMONUSER` \
     --caps='cap_net_bind_service+pei' -- \
     YOUR_COMMAND_GOES_HERE"

capshইউটিলিটি ডিবিয়ান / উবুন্টু বিতরণে libcap2-bin প্যাকেজে পাওয়া যাবে। যা চলছে তা এখানে:

  • sgডিমন ব্যবহারকারীদের কার্যকর গ্রুপ আইডি পরিবর্তন করে। এটি প্রয়োজনীয় কারণ capshপাতার জিআইডি অপরিবর্তিত রয়েছে এবং আমরা অবশ্যই এটি চাই না।
  • বিট সেট করে 'ইউআইডি পরিবর্তনে দক্ষতা রাখুন'।
  • ইউআইডি পরিবর্তন করে $DAEMONUSER
  • --keep=1উত্তরাধিকারসূত্রে ব্যতীত সমস্ত ক্যাপ ফেলে (এই মুহুর্তে সমস্ত ক্যাপগুলি এখনও উপস্থিত রয়েছে )cap_net_bind_service
  • আপনার আদেশটি কার্যকর করে ('-' পৃথককারী)

ফলাফলটি নির্দিষ্ট ব্যবহারকারী এবং গোষ্ঠী এবং cap_net_bind_serviceঅধিকার সহ একটি প্রক্রিয়া ।

উদাহরণস্বরূপ, ejabberdপ্রারম্ভিক স্ক্রিপ্টের একটি লাইন :

sg $EJABBERDUSER "capsh --keep=1 --uid=`id -u $EJABBERDUSER` --caps='cap_net_bind_service+pei' -- $EJABBERD --noshell -detached"

এবং এটি আসলে কাজ করে না। ক্যাপগুলি ব্যবহারকারীর আইডি স্যুইচের উপরে সংরক্ষণ করা হয় না। আপনি রুট হিসাবে চালাতে চাইলে এটি কাজ করবে তবে সমস্ত ক্ষমতা বাদ দিয়ে।
সাইবারেক্স

আমি যদি এটি চেষ্টা করি তবে আমি "বাইনারি ফাইল চালাতে পারব না" পেতে পারি। আসলে, বিকল্পগুলি বা বিকল্পগুলি ব্যবহার করার সময় আমি "বাইনারি ফাইল চালাতে পারি না" ব্যতীত অন্য কিছুcapsh করতে পারি না । আমি অবাক হয়ে যাচ্ছি আমি কী মিস করছি। --==
ক্রেগ ম্যাককুইন

@ ক্রেইগম্যাকিউইন, তার পরে সমস্ত কিছু দেওয়া --হয়েছে /bin/bash, যাতে আপনি চেষ্টা করে দেখতে পারেন -c 'your command'। হায়রে, আমি @Cyberax হিসাবে একই সমস্যা সম্মুখীন হতে কারণ আমি পেতে "এর অনুমতি অস্বীকার করেছেন" যখন বের করার চেষ্টা বলে মনে হচ্ছে bind
আমির

ফাইল সক্ষমতা (বা মূল হিসাবে চলমান) সেট না করে এটি কাজ করার জন্য, আপনাকে এই ইউনিক্স.এসই উত্তরে বর্ণিত পরিবেশন ক্ষমতাগুলি ব্যবহার করতে হবে । এছাড়াও আপনি ব্যবহার করতে পারে পরিবর্তে (বা যা সেট , এবং ): --gidsg--user--uid--gid--groupssudo capsh --caps='cap_net_bind_service+eip cap_setpcap,cap_setuid,cap_setgid+ep' --keep=1 --user="$service_user" --addamb=cap_net_bind_service -- -c 'exec $service $service_args'
Kevinoid

18

কোনও কারণে সাইক্লট নেট.আইপিভি 4.ip_unprivileged_port_start আপনার প্রয়োজনীয় মান হ্রাস করার বিষয়ে কেউ উল্লেখ করেনি। উদাহরণ: আমাদের অ্যাপ্লিকেশনটি 443 বন্দরে আবদ্ধ করা দরকার।

sysctl net.ipv4.ip_unprivileged_port_start=443

কেউ কেউ বলতে পারেন, একটি সম্ভাব্য সুরক্ষা সমস্যা রয়েছে: অবাঞ্ছিত ব্যবহারকারীরা এখন অন্য সুবিধাযুক্ত বন্দরগুলিতে আবদ্ধ হতে পারেন (444-1024)। তবে আপনি অন্যান্য বন্দরগুলি অবরুদ্ধ করে iptables দিয়ে সহজেই এই সমস্যাটি সমাধান করতে পারেন:

iptables -I INPUT -p tcp --dport 444:1024 -j DROP
iptables -I INPUT -p udp --dport 444:1024 -j DROP

অন্যান্য পদ্ধতির সাথে তুলনা। এই পদ্ধতি:

  • কিছু দিক থেকে (আইএমও) CAP_NET_BIND_SERVICE / setuid সেট করার চেয়েও বেশি সুরক্ষিত, যেহেতু কোনও অ্যাপ্লিকেশন মোটেও সেট করে না, এমনকি আংশিকভাবে (ক্ষমতাগুলি আসলে)। উদাহরণস্বরূপ, সক্ষমতা-সক্ষম অ্যাপ্লিকেশনটির সর্দাম্প ধরার জন্য আপনাকে সিস্টেস্টল fs.suid_dumpable (যা অন্য সম্ভাব্য সুরক্ষা সমস্যার দিকে নিয়ে যায়) পরিবর্তন করতে হবে এছাড়াও, যখন সিএপি / স্যুড সেট করা থাকে, / প্রোক / পিআইডি ডিরেক্টরিটি রুটের মালিকানাধীন থাকে, সুতরাং আপনার অ-রুট ব্যবহারকারীর চলমান প্রক্রিয়া সম্পর্কিত সম্পূর্ণ তথ্য / নিয়ন্ত্রণ থাকবে না, উদাহরণস্বরূপ, ব্যবহারকারী / প্রোক / পিআইডি / এফডি / (নেটস্যাট-আপ্টেন | গ্রেপ) এর মাধ্যমে কোন সংযোগ প্রয়োগের সাথে সম্পর্কিত তা নির্ধারণ করতে সক্ষম হবে না (সাধারণ ক্ষেত্রে) PID,)।
  • সুরক্ষা অসুবিধা আছে: আপনার অ্যাপ্লিকেশন (বা কোনও অ্যাপ্লিকেশন যা পোর্টগুলি ব্যবহার করে 443-1024) কিছু কারণে বন্ধ রয়েছে, অন্য অ্যাপটি বন্দরটি নিতে পারে। তবে এই সমস্যাটি সিএপি / স্যুডেও প্রয়োগ করা যেতে পারে (যদি আপনি এটি দোভাষীর উপর সেট করে থাকেন, যেমন জাভা / নোডেজ) এবং iptables-redirect। এই সমস্যাটি বাদ দিতে সিস্টেমেড-সকেট পদ্ধতিটি ব্যবহার করুন। কেবলমাত্র বিশেষ ব্যবহারকারীকে বাধ্য করার অনুমতি দেওয়ার জন্য অথথবাইন্ড পদ্ধতিটি ব্যবহার করুন।
  • প্রতিবার আপনি অ্যাপ্লিকেশনটির নতুন সংস্করণ স্থাপন করার সময় সিএপি / স্যুড সেট করার প্রয়োজন হয় না।
  • সিস্টেমড-সকেট পদ্ধতির মতো অ্যাপ্লিকেশন সমর্থন / পরিবর্তন প্রয়োজন হয় না।
  • কার্নেল পুনর্নির্মাণের প্রয়োজন নেই (চলমান সংস্করণ যদি এই সিস্টেটিং সেটিং সমর্থন করে)
  • এলডিপ্রেলড যেমন লেখক / বেসবাইন্ড পদ্ধতির মতো করে না, এটি সম্ভবত কার্য সম্পাদন, সুরক্ষা, আচরণকে প্রভাবিত করতে পারে (এটি কি পরীক্ষিত হয়নি)? বাকী লেখকগুলিতে সত্যই নমনীয় এবং সুরক্ষিত পদ্ধতি।
  • অতিরিক্ত সম্পাদনা করা iptables REDIRECT / DNAT পদ্ধতি, যেহেতু এটিতে ঠিকানা অনুবাদ, সংযোগের স্থিতি ট্র্যাকিং ইত্যাদির প্রয়োজন হয় না, এটি কেবল উচ্চ-লোড সিস্টেমে লক্ষণীয়।

পরিস্থিতির উপর নির্ভর করে আমি সিস্টেস্টল, সিএপি, লেখক এবং iptables- পুনর্নির্দেশের মধ্যে নির্বাচন করব। এবং এটি দুর্দান্ত যে আমাদের কাছে অনেকগুলি বিকল্প রয়েছে।


2
মহান উত্তরের জন্য ধন্যবাদ! দেখা যাচ্ছে যে এপ্রিল 2017লিনাক্স 4.11 এ এই কার্যকারিতাটি প্রথম প্রদর্শিত হয়েছিল , সুতরাং আমি যখন প্রথম প্রশ্নটি জিজ্ঞাসা করেছি তখন এটি ২০০৯ সালে ছিল না। আমি একটি দ্রুত পরীক্ষাও করেছি, এবং এটি আইপিভি 6-র জন্যও কাজ করবে বলে মনে হচ্ছে, যদিও "আইপিভি 4" সিস্কটেল নামে রয়েছে।
জেসন ক্রেইটন

15

আরও দুটি সহজ সম্ভাবনা:

"একটি ডেমন যা নীচে বন্দরে বাঁধে এবং আপনার ডিমনকে নিয়ন্ত্রণ করে" এর একটি পুরানো (ফ্যাশনেবল) সমাধান রয়েছে। একে ইনটেড (বা xinetd) বলা হয়। কনসগুলি হ'ল:

  • আপনার ডিমনকে স্টাডিন / স্টাডআউটে কথা বলা দরকার (যদি আপনি ডেমনটি নিয়ন্ত্রণ না করেন - যদি আপনার উত্স না থাকে - তবে এটি সম্ভবত শোস্টোপার, যদিও কিছু পরিষেবাদিতে অবিচ্ছিন্ন সামঞ্জস্যের পতাকা থাকতে পারে)
  • প্রতিটি সংযোগের জন্য একটি নতুন ডেমন প্রক্রিয়া তৈরি করা হয়
  • এটি চেইনের একটি অতিরিক্ত লিঙ্ক

পেশাদাররা:

  • যে কোনও পুরানো ইউনিক্সে উপলব্ধ
  • একবার আপনার সিসাদমিন কনফিগারেশন সেটআপ করলে আপনি আপনার বিকাশ সম্পর্কে ভাল হন (আপনি যখন আপনার ডেমন পুনর্নির্মাণ করেন, তখন আপনি সেটক্যাপের ক্ষমতা হারাবেন? এবং তারপরে আপনাকে আপনার প্রশাসনে ফিরে যেতে হবে "দয়া করে স্যার .. । ")
  • ডিমনকে সেই নেটওয়ার্কিং স্টাফ সম্পর্কে চিন্তা করতে হবে না, কেবল স্টিডিন / স্টাডআউটে কথা বলতে হবে
  • অনুরোধ অনুসারে আপনার ডেমনকে একটি অ-রুট ব্যবহারকারী হিসাবে চালিত করার জন্য কনফিগার করতে পারে

অন্য বিকল্প: হ্যাকড-আপ প্রক্সি (নেটক্যাট বা আরও কিছু শক্তিশালী ) সুবিধা বন্দর থেকে কিছু স্বেচ্ছাসেবী উচ্চ-নম্বরযুক্ত বন্দর যেখানে আপনি আপনার টার্গেট ডিমন চালাতে পারেন run (নেটকাট স্পষ্টতই কোনও উত্পাদন সমাধান নয়, তবে "কেবল আমার দেব বাক্স", তাই না?)। আপনি নিজের সার্ভারের নেটওয়ার্ক-সক্ষম সংস্করণটি ব্যবহার চালিয়ে যেতে পারেন, প্রক্সি শুরু করার জন্য কেবল রুট / সুডোর প্রয়োজন হবে (বুটে), জটিল / সম্ভাব্য ভঙ্গুর ক্ষমতার উপর নির্ভর করবে না।


1
ভাল পরামর্শ। কিছু কারণে আমি ইনসেড ব্যবহার করার কথা ভাবিও নি। প্রশ্নে থাকা পরিষেবাটি ইউডিপি-ভিত্তিক, তাই এটি টিসিপি পরিষেবাদির চেয়ে কিছুটা জটিল। আমার এখনই সেটক্যাপ নিয়ে কাজ করার একটি সমাধান রয়েছে, তবে আমাকে এই কিছু চিন্তা করতে হবে।
জেসন ক্রেইটন

দ্বিতীয় বিকল্পের জন্য, আপনি সম্ভবত ইনডড ব্যবহার করেও প্রক্সি শুরু করতে পারেন ... (তবে আইপি টেবিলগুলি সম্ভবত কম ওভারহেড ...)
ভ্যান ডান বার্গ

14

আমার "স্ট্যান্ডার্ড ওয়ার্কারআউন্ড" ব্যবহারকারী-স্থান পুনর্নির্দেশক হিসাবে সকেট ব্যবহার করে:

socat tcp6-listen:80,fork tcp6:8080

সাবধান থাকুন যে এটি স্কেল করবে না, কাঁটাচামচ ব্যয়বহুল তবে এটি সকেট কাজ করে।


13

লিনাক্স কেবল "এই অ্যাপ্লিকেশনটিকে রুট হিসাবে চালানো হয়" এর চেয়ে আরও সূক্ষ্ম অনুমোদনের জন্য ক্ষমতাগুলি সমর্থন করে । এই ক্ষমতাগুলির মধ্যে একটি হ'ল CAP_NET_BIND_SERVICEযা কোনও সুবিধাযুক্ত বন্দরে আবদ্ধ হয় (<1024)।

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


স্ক্রিপ্ট, বা পৃথক জেভিএম / মনো প্রোগ্রামগুলির জন্য কাজ করবে না।
স্টিফান স্টেইগার

13

আমি জানি এটি একটি পুরানো প্রশ্ন, তবে এখনকার সাম্প্রতিক (> = 4.3) কার্নেলগুলির সাথে অবশেষে এর একটি ভাল উত্তর পাওয়া যাবে - পরিবেশনীয় ক্ষমতা।

দ্রুত উত্তরটি হ'ল গিট থেকে লিবক্যাপের সর্বশেষ (হিসাবে এখনও অপ্রকাশিত) সংস্করণটির একটি অনুলিপি গ্রহণ এবং এটি সংকলন করা। ফলস্বরূপ progs/capshবাইনারি কোথাও অনুলিপি করুন ( /usr/local/binভাল পছন্দ)। তারপরে, রুট হিসাবে আপনার প্রোগ্রামটি শুরু করুন

/usr/local/bin/capsh --keep=1 --user='your-service-user-name' \
    --inh='cap_net_bind_service' --addamb='cap_net_bind_service' \ 
    -- -c 'your-program'

অর্ডার, আমরা হয়

  • ঘোষণা করছি যে আমরা যখন ব্যবহারকারীদের স্যুইচ করি তখন আমরা আমাদের বর্তমান সক্ষমতার সেটগুলি রাখতে চাই
  • ব্যবহারকারী এবং গোষ্ঠীটিকে 'আপনার পরিষেবা-ব্যবহারকারীর নাম' এ স্যুইচ করছেন
  • যোগ করা হচ্ছে cap_net_bind_serviceউত্তরাধিকারসূত্রে & পরিবেষ্টনকারী সেট করার ক্ষমতা
  • ফোর্কিং bash -c 'your-command'(যেহেতু capshপরে আর্গুমেন্টগুলির সাথে স্বয়ংক্রিয়ভাবে বাশ শুরু হয় --)

এখানে ফণা নীচে অনেক চলছে।

প্রথমত, আমরা রুট হিসাবে চলছি, তাই ডিফল্টরূপে, আমরা সম্পূর্ণ ক্ষমতা অর্জন করি get এর মধ্যে অন্তর্ভুক্ত হ'ল ইউএস setuidsetgidজিড এবং সিস্কলগুলির সাহায্যে স্যুইচ করার ক্ষমতা । যাইহোক, সাধারণত যখন কোনও প্রোগ্রাম এটি করে, তখন এটি তার সামর্থ্যের সেটটি হারিয়ে ফেলে - এটি এমন যে এরপরে setuidএখনও রুট ফেলে দেওয়ার পুরানো পদ্ধতিটি কাজ করে। --keep=1পতাকা বলে capshজারি করার prctl(PR_SET_KEEPCAPS)প্রাপ্ত syscall, যখন ব্যবহারকারী পরিবর্তন যা ক্ষমতা ড্রপ অক্ষম করে। ব্যবহারকারীর আসল পরিবর্তনের capshসাথে --userপতাকাটি ঘটে , যা চলমান setuidএবং setgid

আমাদের পরবর্তী সমস্যাটি সমাধান করার দরকার হ'ল execআমাদের সন্তানদের পরে কীভাবে দক্ষতা সেট করা যায় । দক্ষতা সিস্টেমের সর্বদা একটি 'উত্তরাধিকারসূত্রে' ক্ষমতার সেট থাকে যা "দক্ষতাগুলির একটি সেট যা একটি এক্সিকিউটিভ (2)" জুড়ে সংরক্ষিত হয় [ ক্ষমতা (7) ]। যদিও এই শব্দটি আমাদের সমস্যার সমাধান করে বলে মনে হচ্ছে (কেবল cap_net_bind_serviceউত্তরাধিকার সূত্রে সক্ষমতা নির্ধারণ করুন , তাই না?) এটি আসলে বিশেষাধিকারপ্রাপ্ত প্রক্রিয়াগুলির জন্যই প্রযোজ্য - এবং আমাদের প্রক্রিয়াটি আর বিশেষাধিকারযুক্ত নয়, কারণ আমরা ইতিমধ্যে ব্যবহারকারীকে ( --userপতাকা সহ) পরিবর্তন করেছি ।

নতুন পরিবেষ্টিত সক্ষমতার সেটটি এই সমস্যাটির আশেপাশে কাজ করে - এটি "এমন একটি দক্ষতার সংকলন যা কোনও প্রোগ্রামের এক্সিকিউড (2) জুড়ে সংরক্ষিত থাকে যা সুবিধাযুক্ত নয়।" নির্বাণ দ্বারা cap_net_bind_serviceপরিবেষ্টিত সেটে যখন capshExec আমাদের সার্ভার প্রোগ্রাম, আমাদের প্রোগ্রাম এই বৈশিষ্ট্যটি উত্তরাধিকারী এবং কম পোর্টে বেঁধে শ্রোতারা করতে সক্ষম হবে।

আপনি যদি আরও জানতে আগ্রহী হন তবে দক্ষতার ম্যানুয়াল পৃষ্ঠাটি এটি বিশদভাবে ব্যাখ্যা করে। চলমান capshমাধ্যমে straceখুব তথ্যপূর্ণ হয়!


--addambপতাকা libcap 2.26 সঙ্গে চালু করা হয়। আমার সিস্টেমে 2.25 ছিল এবং আমাকে উত্স থেকে তৈরি করতে হয়েছিল।
ngreen

12

টিএলডিআর: "উত্তর" (যেমনটি আমি এটি দেখছি) জন্য, এই উত্তরের >> টিএলডিআর << অংশে নিচে ঝাঁপুন।

ঠিক আছে, আমি এটিকে জানতে পেরেছি (বাস্তব সময়ের জন্য), এই প্রশ্নের উত্তর এবং আমার এই উত্তরটিও অন্য উত্তরের প্রচারের জন্য ক্ষমা চাওয়ার একটি উপায় (এখানে এবং টুইটারে) যে আমি ভেবেছিলাম "সেরা ", কিন্তু চেষ্টা করার পরে, আবিষ্কার করেছিলাম যে আমি সে সম্পর্কে ভুল ছিল। আমার ভুল বাচ্চাদের কাছ থেকে শিখুন: আপনি নিজেই চেষ্টা না করা অবধি কিছু প্রচার করবেন না!

আবার, আমি এখানে সমস্ত উত্তর পর্যালোচনা। আমি তাদের কয়েকটি চেষ্টা করেছি (এবং অন্যদের চেষ্টা না করা বেছে নিয়েছি কারণ সমাধানগুলি কেবল আমার পছন্দ হয়নি)। আমি ভেবেছিলাম যে সমাধানটি systemdএর Capabilities=এবং CapabilitiesBindingSet=সেটিংস সহ ব্যবহার করা উচিত । এটির সাথে কিছু সময় লড়াই করার পরে আমি আবিষ্কার করেছি যে এটি সমাধান নয় কারণ:

সক্ষমতাগুলি রুট প্রক্রিয়াগুলিকে সীমাবদ্ধ করার উদ্দেশ্যে!

ওপি যেমন বিজ্ঞতার সাথে বলেছে, এটি এড়ানো সর্বদা ভাল (যদি সম্ভব হয় তবে আপনার সমস্ত ডিমনদের জন্য!)।

আপনার সাথে অপশন সম্পর্কিত কেপেবিলিটিস ব্যবহার করতে পারবেন না User=এবং Group=systemd, ইউনিট ফাইল কারণ ক্ষমতা হয় সর্বদা যখন রিসেট execev(অথবা যাই হোক না কেন ফাংশন) বলা হয়। অন্য কথায়, যখন systemdকাঁটাচামচ পড়ে এবং এর পারমস ড্রপ করে, ক্ষমতাগুলি পুনরায় সেট করা হয়। এর আশেপাশে কোনও উপায় নেই এবং কার্নেলের সমস্ত বাধ্যতামূলক যুক্তিগুলি uid = 0 এর আশেপাশের, তবে ক্ষমতা নয়। এর অর্থ হল যে সম্ভাবনাগুলি এই প্রশ্নের সঠিক উত্তর হতে পারে (কমপক্ষে খুব শীঘ্রই যে কোনও সময়)। ঘটনাচক্রে, setcapঅন্যরা যেমন বলেছে, এটি কোনও সমাধান নয়। এটি আমার পক্ষে কাজ করেনি, স্ক্রিপ্টগুলির সাথে এটি দুর্দান্তভাবে কাজ করে না এবং যখনই ফাইল পরিবর্তন হয় সেগুলি পুনরায় সেট করা হয়।

আমার সামান্য প্রতিরক্ষাতে আমি বলেছিলাম (যে মন্তব্যটিতে আমি এখন মুছে ফেলেছি), যে জেমসের iptables পরামর্শ (যা ওপিও উল্লেখ করেছে), ছিল "দ্বিতীয় সেরা সমাধান"। :-P

>> TLDR <<

সমাধানটি হ'ল systemdঅন-দ্য ফ্লাইট iptablesকমান্ডগুলির সাথে একত্রিত করা , এটির ( ডিএনএসচেইন থেকে নেওয়া ):

[Unit]
Description=dnschain
After=network.target
Wants=namecoin.service

[Service]
ExecStart=/usr/local/bin/dnschain
Environment=DNSCHAIN_SYSD_VER=0.0.1
PermissionsStartOnly=true
ExecStartPre=/sbin/sysctl -w net.ipv4.ip_forward=1
ExecStartPre=-/sbin/iptables -D INPUT -p udp --dport 5333 -j ACCEPT
ExecStartPre=-/sbin/iptables -t nat -D PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 5333
ExecStartPre=/sbin/iptables -A INPUT -p udp --dport 5333 -j ACCEPT
ExecStartPre=/sbin/iptables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 5333
ExecStopPost=/sbin/iptables -D INPUT -p udp --dport 5333 -j ACCEPT
ExecStopPost=/sbin/iptables -t nat -D PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 5333
User=dns
Group=dns
Restart=always
RestartSec=5
WorkingDirectory=/home/dns
PrivateTmp=true
NoNewPrivileges=true
ReadOnlyDirectories=/etc

# Unfortunately, capabilities are basically worthless because they're designed to restrict root daemons. Instead, we use iptables to listen on privileged ports.
# Capabilities=cap_net_bind_service+pei
# SecureBits=keep-caps

[Install]
WantedBy=multi-user.target

এখানে আমরা নিম্নলিখিতগুলি সম্পাদন করি:

  • ডিমন 5333 এ শোনে, তবে সংযোগগুলি সফলভাবে 53 টিতে ধন্যবাদ স্বীকার করা হয়েছে iptables
  • আমরা ইউনিট ফাইলের মধ্যেই কমান্ডগুলি অন্তর্ভুক্ত করতে পারি এবং এভাবে আমরা মানুষের মাথা ব্যথা বাঁচায়। systemdআমাদের জন্য ফায়ারওয়াল বিধিগুলি পরিষ্কার করে, ডেমন চলমান না থাকলে সেগুলি সরিয়ে ফেলার বিষয়টি নিশ্চিত করে।
  • আমরা কখনই রুট হিসাবে চলি না, এবং আমরা সুবিধাগুলি বৃদ্ধি অসম্ভব করে তোলে (কমপক্ষে systemdদাবি করে), এমনকি যদি ডেমন আপোস হয় এবং সেট হয়ে যায় uid=0

iptablesদুর্ভাগ্যক্রমে, এখনও ব্যবহার করা বেশ কুৎসিত এবং দুর্ভাগ্যজনক। ডেমন শোনা হয়, তাহলে eth0:0পরিবর্তে eth0, উদাহরণস্বরূপ, কমান্ড হয় কিছুটা ভিন্ন


2
সত্যই প্রাচীন লিনাক্স বিতরণ eth0:0না থাকলে কারওর মতো আর পুরানো স্টাইলের উপকরণ ব্যবহার করা উচিত নয় । তারা বছরের পর বছর ধরে অবহেলিত হয়েছে এবং শেষ পর্যন্ত চলে যাবে।
মাইকেল হ্যাম্পটন

1
আমার মনে হয় আপনি ওপেনজেড (সলিউসভিএম একটি নিয়ন্ত্রণ প্যানেল।) এবং হ্যাঁ, ওপেনভিজেড নেটওয়ার্কিংগুলির মধ্যে একটি হওয়ায় অনেক কিছু ভুল করে।
মাইকেল হ্যাম্পটন

1
নাহ, আমি সলুসভিএম বলতে চাইছি। / ইত্যাদি / নেটওয়ার্ক / ইন্টারফেসগুলি থেকে:# Generated by SolusVM
গ্রেগ স্লেপাক

1
এখনও ওপেনভিজেড নয় ... কমপক্ষে আমি এটি ব্যবহার করছি না, না আমার ভিপিএসও।
গ্রেগ স্লেপাক

7
সিস্টেমডের ক্ষমতা বৈশিষ্ট্যগুলি নির্দেশ করার জন্য আপনাকে ধন্যবাদ। তবে সিস্টেম্ট যখন বাইনারি সরাসরি (স্ক্রিপ্ট নয়) শুরু করে তখন জটিল iptables এর প্রয়োজন নেই। এর AmbientCapabilities=CAP_NET_BIND_SERVICEসাথে সমন্বয় করে আমার জন্য সেটটি পুরোপুরি সূক্ষ্মভাবে কাজ করেছিল User=
রুড 21

11

সিস্টেমড হ'ল সিসভিনিট রিপ্লেসমেন্ট যা নির্দিষ্ট ক্ষমতা সহ ডেমন চালু করার বিকল্প রয়েছে। অপশন ক্যাপিবিলিটিস =, ক্যাপিবিলিটিবাউন্ডিংসেট = সিস্টেমেড.এক্সেক (5) ম্যানপেজে


2
আমি আগে এই উত্তরটি সুপারিশ করেছি, কিন্তু চেষ্টা করার পরে, এখন আমি তা করি না। এমন একটি বিকল্পের জন্য আমার উত্তর দেখুন যা এখনও ব্যবহার করে systemd
গ্রেগ স্লেপাক

10

পোর্ট পুনর্নির্দেশটি আমাদের জন্য সর্বাধিক অর্থবোধ তৈরি করেছে, তবে আমরা এমন একটি সমস্যায় পড়েছিলাম যেখানে আমাদের অ্যাপ্লিকেশন স্থানীয়ভাবে একটি ইউআরএল সমাধান করবে যেটিকে আবারও রুট করা দরকার; (এর অর্থ আপনি শিন্ডিগ )।

স্থানীয় মেশিনে ইউআরএল অ্যাক্সেস করার সময় এটি আপনাকে পুনঃনির্দেশের অনুমতি দেবে।

iptables -A PREROUTING -t nat -p tcp --dport 80 -j REDIRECT --to-port 8080
iptables -A OUTPUT -t nat -p tcp --dport 80 -j REDIRECT --to-port 8080


8

সিস্টেমেড সহ, প্র্যাকটিভেটেড সকেটগুলি গ্রহণ করার জন্য আপনার পরিষেবাটি সামান্য পরিবর্তন করতে হবে।

আপনি পরে সিস্টেমেড সকেট অ্যাক্টিভেট ব্যবহার করতে পারেন ।

কোনও ক্ষমতা, iptables বা অন্যান্য কৌশল প্রয়োজন হয় না।

এটি সাধারণ অজগর HTTP সার্ভারের উদাহরণ থেকে প্রাসঙ্গিক সিস্টেমযুক্ত ফাইলগুলির বিষয়বস্তু

ফাইল httpd-true.service

[Unit]
Description=Httpd true 

[Service]
ExecStart=/usr/local/bin/httpd-true
User=subsonic

PrivateTmp=yes

ফাইল httpd-true.socket

[Unit]
Description=HTTPD true

[Socket]
ListenStream=80

[Install]
WantedBy=default.target

7

শুরুতে:

iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080

তারপরে আপনি যে বন্দরের কাছে পাঠিয়েছেন তাতে বাঁধতে পারেন।


নেই --to-portরয়েছে? man iptablesশুধুমাত্র উল্লেখ --to-ports(বহুবচন)।
আব্দুল

ive কিছু পার্থক্য লক্ষ্য করেছে এবং আমি চারপাশে লাফিয়ে
জেমস

কীভাবে এটি একত্রিত করবেন এই উত্তরটি দেখুন systemd
গ্রেগ স্লেপাক


3

এখানে 'ডিজেবি ওয়ে'ও রয়েছে। Tcpserver এর অধীনে যে কোনও বন্দরে রুট হিসাবে আপনার প্রক্রিয়াটি শুরু করতে আপনি এই পদ্ধতিটি ব্যবহার করতে পারেন, তারপরে প্রক্রিয়াটি শুরু হওয়ার সাথে সাথেই আপনি নির্দিষ্ট করা ব্যবহারকারীর কাছে প্রক্রিয়াটির নিয়ন্ত্রণ হস্তান্তরিত হবে।

#!/bin/sh

UID=$(id -u username)
GID=$(id -g username)
exec tcpserver -u "${UID}" -g "${GID}" -RHl0 0 port /path/to/binary &

আরও তথ্যের জন্য, দেখুন: http://thedjbway.b0llix.net/daemontools/uidgid.html


1

ওপি যেহেতু কেবল উন্নয়ন / পরীক্ষামূলক, তাই মসৃণ সমাধানগুলির চেয়ে কম সমাধান সহায়ক হতে পারে:

স্ক্রিপ্টগুলির ক্ষমতা প্রদানের জন্য স্ক্রিপ্টের দোভাষীতে সেটক্যাপ ব্যবহার করা যেতে পারে। যদি গ্লোবাল ইন্টারপ্রেটার বাইনারিতে সেটক্যাপগুলি গ্রহণযোগ্য না হয় তবে বাইনারিটির স্থানীয় কপি তৈরি করুন (যে কোনও ব্যবহারকারীই পারেন) এবং এই অনুলিপিটিতে সেটক্যাপে রুট করুন। পাইথন 2 (কমপক্ষে) আপনার স্ক্রিপ্ট ডেভেলপমেন্ট ট্রিতে দোভাষীর স্থানীয় কপির সাথে সঠিকভাবে কাজ করে। কোনও মামলা করার প্রয়োজন নেই সুতরাং ব্যবহারকারীরা কী কী ক্ষমতার অ্যাক্সেস পেয়েছে তা রুট ব্যবহারকারীরা নিয়ন্ত্রণ করতে পারে।

আপনার যদি দোভাষীর কাছে সিস্টেম-ব্যাপী আপডেটগুলি ট্র্যাক করতে হয় তবে আপনার স্ক্রিপ্টটি চালানোর জন্য নিম্নলিখিত শেল স্ক্রিপ্টটি ব্যবহার করুন:

#!/bin/sh
#
#  Watch for updates to the Python2 interpreter

PRG=python_net_raw
PRG_ORIG=/usr/bin/python2.7

cmp $PRG_ORIG $PRG || {
    echo ""
    echo "***** $PRG_ORIG has been updated *****"
    echo "Run the following commands to refresh $PRG:"
    echo ""
    echo "    $ cp $PRG_ORIG $PRG"
    echo "    # setcap cap_net_raw+ep $PRG"
    echo ""
    exit
}

./$PRG $*

1

আমি iptables PREROUTING পুনঃনির্মাণ পদ্ধতিটি চেষ্টা করেছি। পুরানো কার্নেলগুলিতে মনে হয় এই ধরণের বিধি আইপিভি 6-র জন্য সমর্থিত নয় । তবে আপাতদৃষ্টিতে এটি এখন ip6tables v1.4.18 এবং লিনাক্স কার্নেল v3.8 এ সমর্থিত।

আমি আরও জানতে পেরেছি যে যন্ত্রের অভ্যন্তরীণ সংযোগগুলির জন্য প্রিরিউটিং রিডিরেক্ট কাজ করে না। স্থানীয় মেশিন থেকে যোগাযোগের জন্য কাজ করতে, একটি OUTPUT বিধিও যুক্ত করুন - iptables পোর্ট পুনর্নির্দেশ দেখুন লোকালহোস্টের জন্য কাজ করছে না । যেমন কিছু:

iptables -t nat -I OUTPUT -o lo -p tcp --dport 80 -j REDIRECT --to-port 8080

আমি আরও দেখতে পেলাম যে পূর্বনির্ধারিত পুনর্নির্মাণও ফরোয়ার্ড করা প্যাকেটগুলিকে প্রভাবিত করে । এটি হ'ল, যদি মেশিনটি ইন্টারফেসের মধ্যেও প্যাকেটগুলি ফরোয়ার্ড করে (যেমন এটি যদি কোনও ইথারনেট নেটওয়ার্কের সাথে সংযুক্ত ওয়াই-ফাই অ্যাক্সেস পয়েন্ট হিসাবে কাজ করে), তবে iptables নিয়মটি ইন্টারনেট গন্তব্যের সাথে সংযুক্ত ক্লায়েন্টদের সংযোগগুলিও ধরবে এবং এগুলিতে পুনর্নির্দেশ করবে যন্ত্র. আমি যা চাইছিলাম তা নয় - আমি কেবল মেশিনে পরিচালিত সংযোগগুলি পুনঃনির্দেশ করতে চেয়েছিলাম। আমি খুঁজে পেয়েছি যে আমি এটি যুক্ত করে বাক্সে সম্বোধন করা প্যাকেটগুলিকে কেবল প্রভাবিত করতে পারি -m addrtype --dst-type LOCAL। যেমন কিছু:

iptables -A PREROUTING -t nat -p tcp --dport 80 -m addrtype --dst-type LOCAL -j REDIRECT --to-port 8080

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

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

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


0

2015 / সেপ্টেম্বর উত্তর:

ip6tables এখন IPV6 NAT সমর্থন করে: http://www.netfilter.org/projects/iptables/files/changes-iptables-1.4.17.txt

আপনার কার্নেল 3.7+ প্রয়োজন হবে

প্রমাণ:

[09:09:23] root@X:~ ip6tables -t nat -vnL
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 REDIRECT   tcp      eth0   *       ::/0                 ::/0                 tcp dpt:80 redir ports 8080
    0     0 REDIRECT   tcp      eth0   *       ::/0                 ::/0                 tcp dpt:443 redir ports 1443

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 6148 packets, 534K bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain POSTROUTING (policy ACCEPT 6148 packets, 534K bytes)
 pkts bytes target     prot opt in     out     source               destination
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.