বিপরীত এসএসএইচ টিউনেলিং পোর্টগুলি কীভাবে সীমাবদ্ধ করবেন?


9

আমাদের একটি সার্বজনীন সার্ভার রয়েছে যা ফায়ারওয়ালের পিছনে একাধিক ক্লায়েন্টের এসএসএইচ সংযোগ গ্রহণ করে।

এই ক্লায়েন্টগুলির প্রত্যেকে ssh -Rআমাদের সার্বজনীন সার্ভারে পোর্ট 80 এ তাদের ওয়েব সার্ভার থেকে কমান্ডটি ব্যবহার করে একটি বিপরীত এসএসএইচ টানেল তৈরি করে ।

বিপরীত এসএসএইচ টানেলের গন্তব্য পোর্টটি (ক্লায়েন্টের পাশে) 80 এবং উত্স বন্দর (পাবলিক সার্ভারের পাশে) ব্যবহারকারীর উপর নির্ভর করে। আমরা প্রতিটি ব্যবহারকারীর জন্য পোর্ট ঠিকানার মানচিত্র বজায় রাখার পরিকল্পনা করছি are

উদাহরণস্বরূপ, ক্লায়েন্ট এ তাদের ওয়েব সার্ভারটি 80 বন্দর থেকে 8000 পোর্টে সুড়ঙ্গ করবে; 80 থেকে 8001 ক্লায়েন্ট বি; 80 থেকে 8002 ক্লায়েন্ট সি।

Client A: ssh -R 8000:internal.webserver:80 clienta@publicserver

Client B: ssh -R 8001:internal.webserver:80 clientb@publicserver

Client C: ssh -R 8002:internal.webserver:80 clientc@publicserver

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

আমরা যদি এসএসএইচের ফরোয়ার্ড টানেলিং বৈশিষ্ট্যটি ব্যবহার করতাম ssh -Lতবে permitopen=host:portকনফিগারেশনটি ব্যবহার করে কোন পোর্টটি টানেল করার অনুমতি দিতে পারতাম । তবে বিপরীত এসএসএইচ টানেলের সমতুল্য নেই।

ব্যবহারকারীর বিপরীত টানেলিং বন্দরগুলিকে সীমাবদ্ধ করার কোনও উপায় আছে কি?


1
কেবল SELinux বা IPTABLES এর মতো সিস্টেম-ব্যাপী নীতি দ্বারা।
অ্যান্ড্রু স্মিথ

উত্তর:


6

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

serverloop.c:

/* check permissions */
if (!options.allow_tcp_forwarding ||
    no_port_forwarding_flag ||
    (!want_reply && listen_port == 0)
#ifndef NO_IPPORT_RESERVED_CONCEPT
    || (listen_port != 0 && listen_port < IPPORT_RESERVED &&
    pw->pw_uid != 0)
#endif
    ) {
        success = 0;
        packet_send_debug("Server has disabled port forwarding.");
} else {
        /* Start listening on the port */
        success = channel_setup_remote_fwd_listener(
            listen_address, listen_port,
            &allocated_listen_port, options.gateway_ports);
}

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

আমি এর mod_ownerমধ্যে ব্যবহারের জন্য একই পরামর্শের প্রস্তাব দিতে যাচ্ছিলাম iptables, কিন্তু জেফ আমাকে এতে মারধর করেছে।

আপনার পরিষ্কার সমাধানটি কেবল এই ফাইলটি সংশোধন করতে পারে (উদাহরণস্বরূপ, আপনি pw->pw_uidব্যবহারকারীর সংযোগ স্থাপনের জন্য এবং সঠিক পোর্টে মানচিত্রটি ব্যবহার করতে পারেন ) এবং আপনার এসএসএইচ সার্ভারটি পুনরায় সংকলন করতে পারেন, তবে এটি নির্ভর করে যে আপনি এটির সাথে কতটা আরামদায়ক রয়েছেন ।


এটা সত্যই খুব ভালো. আমি আসলে -L অপশন (টানেলিং) থেকে একই সিনট্যাক্সটি অনুলিপি করতে পারি এবং এটি কার্যকর করতে পারি। ধন্যবাদ.
উত্কু জিহনিওগলু

3

আমার পরামর্শ এটির জন্য সেলইনক্স ব্যবহার করছে। আপনাকে এমন ব্যবহারকারী প্রোফাইলগুলি কনফিগার করতে হবে যা কোন বন্দরগুলি খোলার অনুমতি দেয়। sshdপ্রক্রিয়া কাটাচামচ এবং ব্যবহারকারীর প্রসেস তাই কিছু আবেদন করেছিলেন, ফরোয়ার্ড করতে পোর্ট খোলার আগে ব্যবহারকারীর বিশেষাধিকার জন্য ঝরিয়া উপর প্রয়োগ করা হবে sshd। সচেতন হোন যে আপনাকে অন্য ব্যবহারকারীর প্রক্রিয়াগুলিতে সীমাবদ্ধ করতে হবে যেহেতু একবার netcatঅন্য পোর্ট ফরওয়ার্ড করার জন্য একবার ব্যবহার করা যেতে পারে । আমি পরে আপনার জন্য যথাযথ বাক্য গঠন বাছাই করার চেষ্টা করব (বা অন্য কোনও ব্যবহারকারী এটি আমার জন্য সম্পাদনা করতে স্বাগত)।

বিকল্পভাবে, আপনি ব্যবহার করার চেষ্টা করতে পারেন iptables

iptables -m owner --add-owner $user -p tcp --sport 8000 -j ACCEPT
iptables -m owner --add-owner $user -p tcp --tcp-flags SYN,ACK SYN,ACK -j REJECT

তবে এটি তাদের পোর্ট খোলার এবং অন্য ব্যবহারকারীকে অস্বীকার করা থেকে বিরত রাখবে না।


দুর্দান্ত উত্তরের জন্য ধন্যবাদ। আমি SELinux / ব্যবহারকারীর প্রোফাইল কনফিগারেশন চেষ্টা করব। এটা আমার প্রশ্নের সমাধান মত শোনাচ্ছে।
উত্কু জিহনিওগলু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.