SSH-এ ব্রুট-ফোর্স আক্রমণ বিরক্তিকর হওয়ায়...
হ্যালো, আমি অযোগ্য।
Gitea হোস্ট করা /var/log/auth.log-কে tail -f দিয়ে দেখতে গিয়ে কিছু সন্দেহজনক প্রচেষ্টা চোখে পড়ল।
উদাহরণস্বরূপ, এইরকম:
2024-12-07T16:57:39.486624+00:00 hostname sshd[392231]: Received disconnect from WireGuardSrvIP port 42552:11: Bye Bye [preauth]
VPN সার্ভার থেকে SSH লগইন প্রচেষ্টা হচ্ছে। এর কারণ হল, আমি এই Gitea সার্ভারের জন্য Nginx দিয়ে Stream প্রক্সি ব্যবহার করছি।
stream {
server {
listen 2222;
proxy_pass GiteaSrvIP:2222;
proxy_timeout 1m;
proxy_connect_timeout 1s;
}
}
এভাবে পোর্ট 2222-এ প্রাপ্ত IP GiteaSrvIP-এ ফরোয়ার্ড করা হয়, কিন্তু সত্যি বলতে, আমি এখনও বুঝতে পারিনি কেন লগগুলিতে একটি ভিন্ন পোর্ট 42552 দেখানো হচ্ছে। এই অভ্যন্তরীণ IP থেকে এত লগইন প্রচেষ্টা আসাটা অস্বস্তিকর। পদ্ধতিগতভাবে, আমি Gitea-তে SSH প্রোটোকল দিয়ে পুশ করতে চাই, কিন্তু Stream দিয়ে প্রক্সি করার সময়, IP:port দিয়ে প্রক্সি করতে হয়, এবং আমি মনে করি এটি ঘটছে কারণ 2222 পোর্টের সমস্ত SSH প্রচেষ্টা GiteaSrvIP-এ ফরোয়ার্ড করা হচ্ছে।
আমি নিজেই এটা বলতে গিয়ে জগাখিচুড়ি করে ফেলেছি, তাই...
দুষ্টু লোক: আমি git.domain.tld-এর 2222 পোর্টে ssh করব!
WireGuardSrv: ওহ, তুমি 2222 পোর্টে লগইন করার চেষ্টা করছ?
WireGuardSrv: তাহলে 2222 পোর্টের সমস্ত অনুরোধ GiteaSrv-এ ফরোয়ার্ড করা হবে!
GiteaSrv: আরে, আমি তো শুধু WireGuardSrv-এর IP দেখতে পাচ্ছি, আর অনেক SSH লগইন প্রচেষ্টা আসছে...
এই ধরনের প্রবাহ ছাড়া, WireGuardSrvIP থেকে SSH প্রচেষ্টার কোনো ধারণা আমার কাছে নেই...। তবে রহস্যজনক ব্যাপার হলো, আমি শুধু 2222 পোর্টে গ্রহণ করে 2222 পোর্টে ফরোয়ার্ড করার জন্য সেট করেছি, কিন্তু কীভাবে এটি port 42552 হয়ে গেল তা আমি জানি না। যদি এটি এমন হয় যে একটি গ্লোবাল IP থেকে এই পোর্টে SSH করার চেষ্টা করা হচ্ছে এমন একটি IP ঠিকানা দিয়ে যা শুধুমাত্র VPN-এ বিদ্যমান, তাহলে আমি এখনও বুঝতে পারি...। অবশ্যই, SSH লগইন নিজেই root লগইন নিষিদ্ধ করা হয়েছে, এবং শুধুমাত্র পাবলিক কী প্রমাণীকরণ ব্যবহার করা হয়েছে, তাই যদি এটি ভেঙে যায়, তাহলে কীভাবে এটি করা হয়েছিল তা জানতে আমি আগ্রহী।
প্রতিকার হিসেবে
যদি একটি নোংরা auth.log থেকে যায়, তাহলে লগ ফাইলটি দেখতে কঠিন হবে, এবং সবচেয়ে বড় কথা, লগ ফাইলটি খুব বড় হয়ে যাবে, তাই আমি এটিকে আগে থেকেই ব্লক করতে চাই। কারণ, আমি fail2ban দিয়ে একাধিক SSH লগইন প্রচেষ্টা ব্লক করছি, কিন্তু এতে Wireguard এর মাধ্যমে GiteaSrvIP-এর বিরুদ্ধে SSH-ও অন্যান্য লগের সাথে মিশে ব্লক হয়ে যায়। তাই আমি auth.log-এ লেখার আগে এটি আটকাতে চাই।
FreeBSD (WireGuard সার্ভার) দিক
pf-এর ডিফল্ট ব্লক নীতি সেটিং হিসাবে drop ব্যবহার করব।
PF: রানটাইম অপশন
সুতরাং, আমি Drop কে ডিফল্ট নীতি হিসাবে সেট করব।
set block-policy drop
এর ফলে, যদি FreeBSD-এর ব্লক নীতিতে কোনো প্যাকেট ধরা পড়ে, তাহলে সেটি সরাসরি ফেলে দেওয়া হবে।
Debian (WireGuard ক্লায়েন্ট এবং Gitea সার্ভার) দিক
প্রথমত, Gitea-এর HTTP সার্ভার এবং SSH-এর 22 এবং 2222 পোর্টে WireGuardSrvIP থেকে আসা অন্যান্য পোর্ট নম্বর থেকে কোনো অ্যাক্সেস আসাটাই অস্বাভাবিক। বিশেষ করে, 2222-এর উপরের পোর্ট, যেমন 3000, ডিফল্ট লোকাল HTTP পোর্ট হিসাবে কাজ করে, তাই এটিও খোলা উচিত নয়, তবে আমি Gitea-কে 80 পোর্টে শুনতে চাই না, তাই আপাতত পরীক্ষার সময় 3000 পোর্টে খুলে রেখেছি। আমি অনেক কথা বলে ফেলেছি, তাই আমি ufw দিয়ে পোর্ট সীমাবদ্ধ করেছি নিম্নরূপ:
ufw deny proto tcp from WireGuardSrvIP to any port 2223:65535
ufw reload
আমি এটিকে একটি খেলার VPS সার্ভার হিসাবে ব্যবহার করতে চাই, তাই আমি আপাতত 2223:65535 পরিসরে অস্বীকার করেছি এবং আলাদাভাবে 3000/tcp স্পষ্টভাবে খুলে রেখেছি।
অদ্ভুত SSH প্রচেষ্টার লগ আসা বন্ধ হয়েছে
এর ফলে, FreeBSD-এর ব্লক নীতি কার্যকর হয়েছে নাকি ufw দিয়ে স্পষ্টভাবে deny করা হয়েছে, তা আমি জানি না কারণ আমি দুটি কাজ একই সাথে করেছি, তবে auth.log-এ আসা লগইন প্রচেষ্টা, যা ভূতের মতো আসছিল, তা সফলভাবে বন্ধ হয়ে গেছে। সম্ভবত, FreeBSD-এর দিকে কিছু ফায়ারওয়াল আগে থেকেই সেট করা ছিল, তাই ব্লক করা প্যাকেটগুলি REJECT না হয়ে drop হওয়ার কারণে FreeBSD স্তরেই সমস্ত প্যাকেট ফেলে দেওয়া হচ্ছে। আমি এটাই আশা করি।
আবার fail2ban এর সেটিংস
সুতরাং, আমি /etc/fail2ban/jail.conf ফাইলটি এডিট করেছি এবং
পর্যবেক্ষণের ডিফল্ট সেটিংসে বাদ দেওয়া IP সেট করেছি।
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 WireGuardSrvIP
এরপর, আমি sshd-এর সেটিংস পরিবর্তন করেছি।
[sshd]
enabled = true
port = all
logpath = /var/log/auth.log
bantime = 10w
findtime = 1d
maxretry = 2
আমি WireGuardSrv-এর চেয়ে কঠোর সেটিংস চেষ্টা করেছি।
পরিবর্তনের কারণ নিচে দেওয়া হলো:
port = all
maxretry = 2
WireGuardSrv-এ পোর্ট স্পষ্টভাবে শুধুমাত্র ssh হিসাবে সেট করা আছে, তাই এটি শুধুমাত্র ssh-এর জন্য ব্যবহৃত পোর্টগুলিকে পর্যবেক্ষণ করে, কিন্তু এটি সমস্ত পোর্টের জন্য SSH প্রচেষ্টাকে পর্যবেক্ষণ করবে। পুনরায় চেষ্টার ক্ষেত্রেও, এটি কঠোরভাবে 2 বার পর্যন্ত। পরিবর্তনের কারণ হলো আমি দেখতে চাই এটি কতটা ধরা পড়ে, এবং যদি এটি অনেক ধরা পড়ে, তাহলে আমি WireGuardSrv-এর জন্যও একই স্তরের সেটিংস করব।
তাহলে।
ফলাফলের জন্য অপেক্ষা করছি।