Ubuntu 24.04-এ Webmin ইনস্টল ও সুরক্ষিত করার নিয়ম
Ubuntu 24.04 সার্ভারে Webmin ইনস্টল করার সঠিক পদ্ধতি জানুন। port 10000 সুরক্ষিত রাখতে SSH tunnel, IP allowlist, Let's Encrypt SSL, 2FA এবং Fail2ban কনফিগার করার পূর্ণ গাইড।
আপনি যা তৈরি করছেন
Webmin হলো একটি ওয়েব কন্ট্রোল প্যানেল যা পুরো Linux সার্ভার, ইউজার, প্যাকেজ, cron job, ফায়ারওয়াল, Apache, BIND, ডিস্ক এবং আরও শত শত মডিউল পরিচালনার জন্য একটি ব্রাউজার-ভিত্তিক ইন্টারফেস প্রদান করে। এটি port 10000-এ HTTPS-এর মাধ্যমে অ্যাক্সেস করা যায়। এর ইনস্টলেশন প্রক্রিয়াটি মাত্র তিনটি কমান্ডের এবং এতে প্রায় এক মিনিট সময় লাগে। এই গাইডের বেশিরভাগ অংশ দ্বিতীয় অর্ধে ব্যয় করার কারণ হলো, Webmin সরাসরি root হিসেবে লগইন করে এবং root ব্যবহারকারীর মতো যেকোনো কাজ করতে সক্ষম। একটি উন্মুক্ত বা অনিরাপদ Webmin কেবল "ব্যবস্থাপনার ঝুঁকি" নয়; এটি একটি লগইন পেজের আড়ালে থাকা সম্পূর্ণ সার্ভার কম্প্রোমাইজ। তাই এটি দশ মিনিটে ইনস্টল করুন এবং পরবর্তী এক ঘণ্টা ব্যয় করুন এটি নিশ্চিত করতে যে শুধুমাত্র আপনিই এটি অ্যাক্সেস করতে পারবেন।
প্রয়োজনীয় শর্তাবলি এবং একটি সতর্কবার্তা
একটি নতুন Ubuntu 24.04 KVM VPS, যেখানে root অথবা sudo ব্যবহারকারীর অ্যাক্সেস আছে। Webmin মূলত Perl-ভিত্তিক এবং হালকা; 1 GB RAM এর জন্য যথেষ্ট এবং এটি এক-চতুর্থাংশ GB-এরও কম মেমোরি ব্যবহার করে অলস অবস্থায় থাকে। এটি নিজস্ব bundled web server (miniserv.pl) এর মাধ্যমে TCP 10000 পোর্টে লিসেন করে, Apache বা nginx-এর ওপর নির্ভরশীল নয়, তাই আগে থেকে অন্য কিছু ইনস্টল করার প্রয়োজন নেই।
শুরু করার আগে দুটি বিষয় সিদ্ধান্ত নিন। প্রথমত, যে অ্যাকাউন্ট দিয়ে লগইন করবেন: Webmin PAM-এর মাধ্যমে Unix অ্যাকাউন্টের সত্যতা যাচাই করে, তাই আপনি root অথবা sudo গ্রুপের কোনো ব্যবহারকারী হিসেবে সেই অ্যাকাউন্টের Unix password ব্যবহার করে লগইন করবেন। ক্লাউড ইমেজগুলোতে সাধারণত শুধুমাত্র SSH key থাকে এবং ডিফল্ট ব্যবহারকারীর কোনো পাসওয়ার্ড সেট করা থাকে না, আর Webmin পাসওয়ার্ডহীন অ্যাকাউন্টে লগইন করতে পারে না। তাই আগে sudo passwd youruser ব্যবহার করে একটি পাসওয়ার্ড সেট করুন, অন্যথায় আপনি যা-ই টাইপ করুন না কেন লগইন ব্যর্থ হবে।
দ্বিতীয়ত, এবং এটিই সতর্কবার্তা: শুধুমাত্র 10000 পোর্টটি ইন্টারনেটের জন্য খুলে দিয়ে নিশ্চিন্ত হবেন না। এখনই সিদ্ধান্ত নিন আপনি SSH tunnel-এর মাধ্যমে Webmin-এ প্রবেশ করবেন (এটি সুপারিশকৃত, এতে কোনো কিছু উন্মুক্ত থাকে না) নাকি শুধুমাত্র আপনার নিজস্ব IP-এর জন্য এটিকে সীমাবদ্ধ রাখবেন। এই একটি সিদ্ধান্তই নিচের প্রতিটি ধাপকে প্রভাবিত করবে, তাই ফায়ারওয়াল স্পর্শ করার আগে উভয় বিকল্পই পড়ে নিন।
অফিসিয়াল রিপোজিটরি থেকে Webmin ইনস্টল করা
Webmin একটি সাইন করা apt রিপোজিটরি প্রকাশ করে। এই সেটআপ স্ক্রিপ্টটি রিপোজিটরি এবং এর GPG সাইনিং কি যুক্ত করে, যাতে ভবিষ্যতের apt upgrade রানগুলো অন্য যেকোনো প্যাকেজের মতোই Webmin-কে আপডেট করতে পারে। এর ফলে আপনি ডাউনলোড করা .deb ফাইলের পরিবর্তে সরাসরি অথেন্টিকেটেড আপডেট পাবেন, যা নিজে থেকে প্যাচ হয় না।
curl -o webmin-setup-repo.sh https://raw.githubusercontent.com/webmin/webmin/master/webmin-setup-repo.sh
sudo sh webmin-setup-repo.shস্ক্রিপ্টটি কী করতে যাচ্ছে তা প্রদর্শন করে এবং Setup repository? (y/N) জানতে চায়, আপনি y উত্তর দিন। এটি শেষ হলে প্যাকেজটি ইনস্টল করুন। --install-recommends ফ্ল্যাগটি সাধারণ Perl এবং SSL মডিউল ডিপেন্ডেন্সিগুলো নিয়ে আসে, যাতে পরবর্তীতে কোনো মডিউল লাইব্রেরি মিসিং হওয়ার কারণে ব্যর্থ না হয়।
sudo apt-get install --install-recommends webminWebmin আগে এই স্ক্রিপ্টের নাম পরিবর্তন করেছে এবং পুরনো গাইডগুলোতে setup-repos.sh-এর উল্লেখ রয়েছে। তাই যদি raw URL থেকে 404 error আসে, তবে কোনো নির্দিষ্ট নামের ওপর নির্ভর না করে সরাসরি webmin.com/download থেকে বর্তমান ওয়ান-লাইনারটি সংগ্রহ করুন। একটি সঠিক ইনস্টলেশন Webmin install complete. You can now login to https://your-host:10000/ as root-এর মতো একটি লাইন দিয়ে শেষ হয়। সার্ভিসটি এনাবল করা থাকে এবং চলতে থাকে, কনফিগারেশন /etc/webmin-এর অধীনে থাকে, রিকোয়েস্টগুলো /var/webmin/miniserv.log-এ লগ করা হয় এবং ব্যর্থ লগইনগুলো syslog-এ যায়; Ubuntu 24.04-এর ক্ষেত্রে এটি systemd journal-এ থাকে।
ব্রাউজার খোলার আগে নিশ্চিত করুন যে এটি চালু আছে এবং লিসেন করছে:
sudo systemctl status webmin --no-pager
sudo ss -tlnp | grep 10000আপনার একটি active (running) স্ট্যাটাস এবং একটি লাইন প্রয়োজন যা দেখাবে miniserv.pl, 0.0.0.0:10000-এ বাউন্ড হয়ে আছে। আপনি নিচের টানেল রুটটি অনুসরণ করলে সেই অ্যাড্রেসটি 127.0.0.1:10000-এ পরিবর্তিত হবে। যদি ss-এ 10000 পোর্টে কিছু না দেখায়, তবে Webmin শুরু হয়নি; আরও এগিয়ে যাওয়ার আগে journalctl -u webmin -n 50 পড়ুন।
প্রথম লগইন এবং সার্টিফিকেট সতর্কতা
আপনার ব্রাউজারকে https://YOUR_SERVER_IP:10000 ঠিকানায় নির্দেশ করুন। একটি নতুন সার্ভারে দুটি বিষয় ঘটতে পারে।
যদি ufw সক্রিয় থাকে (Ubuntu-এর নিজস্ব সার্ভার ইমেজে এটি নিষ্ক্রিয় থাকে, তবে অনেক প্রোভাইডার এটি আগে থেকেই সক্রিয় রাখে), তাহলে পেজটি লোড হবে না, যা নিচের ব্যর্থতার কারণ অংশে আলোচনা করা হয়েছে। যদি পোর্টটি খোলা থাকে, তবে আপনার ব্রাউজার একটি পূর্ণ-পৃষ্ঠা ব্লক প্রদর্শন করবে: Chrome-এ NET::ERR_CERT_AUTHORITY_INVALID কোডসহ "Your connection is not private" অথবা Firefox-এ SEC_ERROR_UNKNOWN_ISSUER / "Warning: Potential Security Risk Ahead" বার্তাটি দেখাবে। এটি প্রত্যাশিত এবং কোনো অনুপ্রবেশের ঘটনা নয়। Webmin ইনস্টল করার সময় একটি self-signed সার্টিফিকেট (/etc/webmin/miniserv.pem) তৈরি করে, এবং কোনো সার্টিফিকেট অথরিটি এর নিশ্চয়তা দেয় না বলে ব্রাউজার এটিকে বিশ্বাস করতে অস্বীকার করে। সংযোগটি এখনও এনক্রিপ্ট করা থাকে; শুধুমাত্র এর কোনো বাহ্যিক নিশ্চয়তা নেই। আপাতত এটি এড়িয়ে এগিয়ে যান (Advanced-এ ক্লিক করে তারপর Proceed করুন), আমরা পরবর্তীতে যথাযথভাবে এই সার্টিফিকেটটি প্রতিস্থাপন করব।
root অথবা আপনার sudo ইউজার এবং তার Unix পাসওয়ার্ড দিয়ে লগইন করুন, এরপর আপনি System Information ড্যাশবোর্ডে পৌঁছাবেন। এখানে একটি সাধারণ ভুল হলো https://-এর পরিবর্তে http:// টাইপ করা। miniserv সেই পোর্টে plain HTTP-এর উত্তরে ঠিক এই টেক্সটটি দেখাবে: "This web server is running in SSL mode. Try the URL https://...", এর সমাধান হলো অ্যাড্রেস বারে http-কে পরিবর্তন করে https করে দেওয়া।
নিরাপত্তা সংক্রান্ত সিদ্ধান্ত: আপনি কীভাবে Webmin-এ প্রবেশ করবেন?
এখন গুরুত্বপূর্ণ অংশে আসা যাক। root-এর সমতুল্য কোনো প্যানেল সরাসরি ইন্টারনেটে উন্মুক্ত রাখা উচিত নয়, কারণ এতে বিশ্বের যেকোনো প্রান্ত থেকে স্ক্যানাররা লগইন করার চেষ্টা করতে পারে। আপনার কাছে দুটি গ্রহণযোগ্য বিকল্প রয়েছে, যা পছন্দের ক্রমানুসারে দেওয়া হলো। প্রতিটি self-hosted অ্যাডমিন ইন্টারফেস এই একই প্রশ্নের সম্মুখীন হয়, আর এই কারণেই Vaultwarden নিরাপদ কি না তা তার এনক্রিপশনের চেয়ে বরং তার অ্যাডমিন এন্ডপয়েন্ট এবং ব্যাকআপ ফাইলের ওপর বেশি নির্ভর করে।
বিকল্প B-তে উল্লিখিত SSH tunnel পদ্ধতিটি অধিকতর ভালো, কারণ এতে কোনো কিছুই উন্মুক্ত থাকে না। যদি আপনার IP address static হয়, তবে বিকল্প A-তে উল্লিখিত IP allowlist পদ্ধতিটিও গ্রহণযোগ্য। এই দুটির কোনোটিই না করা হলো ঠিক সেই ভুল, যা প্রতিরোধ করার জন্যই এই নির্দেশিকাটি লেখা হয়েছে। যদি আপনি এই দুটির পরিবর্তে কোনো private network-এর মাধ্যমে Webmin-এ প্রবেশ করতে চান, তবে সার্ভারটিকে একটি self-hosted WireGuard VPN-এর পেছনে রাখুন এবং Webmin-কে public address-এর পরিবর্তে tunnel address-এ bind করুন।
বিকল্প A: আপনার IP-তে Webmin সীমাবদ্ধ করা
প্যানেলের ভেতর Webmin, তারপর Webmin Configuration, এবং সবশেষে IP Access Control খুলুন। "Only allow from listed addresses" নির্বাচন করুন এবং আপনার পাবলিক IP লিখুন, যা আপনি আপনার ল্যাপটপে curl ifconfig.me চালিয়ে খুঁজে পেতে পারেন। সংরক্ষণ করুন। Webmin এটি /etc/webmin/miniserv.conf ফাইলের allow= লাইনে লিখে রাখে এবং নিজেকে রিস্টার্ট করে।
ফাঁদ: আপনার হোম IP যদি ডাইনামিক হয় এবং পরিবর্তিত হয়, অথবা আপনি যদি ভুল IP টাইপ করেন, তবে আপনি নিজেকেই লক করে ফেলবেন। তখন ব্রাউজারে "Access denied for <your IP>" দেখাবে এবং কোনো লগইন ফর্ম আসবে না, আর ওয়েব ইন্টারফেসে ফিরে আসার কোনো পথ থাকবে না। আপনি সার্ভার কনসোল থেকে SSH বা আপনার প্রোভাইডারের VNC ব্যবহার করে এটি ঠিক করতে পারেন:
sudo nano /etc/webmin/miniserv.conf
# find the line that begins allow=
# correct your IP, or delete the whole line to allow all again
sudo systemctl restart webminallow= লাইনটি মুছে ফেললে পুনরায় সব জায়গা থেকে অ্যাক্সেস পাওয়া যাবে, তাই এটি কেবল পুনরুদ্ধারের জন্য করুন এবং সাথে সাথে সঠিক মান সেট করুন।
বিকল্প B: localhost-এ bind করা এবং SSH-এর মাধ্যমে tunnel করা (সুপারিশকৃত)
allowlist ব্যবহারের চেয়ে পাবলিক ইন্টারফেসে কোনো কিছু listen না করা অনেক বেশি নিরাপদ। miniserv-কে শুধুমাত্র loopback-এ bind করার নির্দেশ দিন, তারপর আপনার বিশ্বস্ত একটি এনক্রিপ্টেড SSH tunnel-এর মাধ্যমে সেখানে প্রবেশ করুন।
/etc/webmin/miniserv.conf এডিট করুন এবং একটি লাইন যোগ করুন বা পরিবর্তন করুন:
bind=127.0.0.1sudo systemctl restart webmin দিয়ে রিস্টার্ট করুন। Webmin এখন ইন্টারনেট থেকে আর অ্যাক্সেস করা যাবে না, পোর্ট স্ক্যান করলে 10000 পোর্টে কিছুই পাওয়া যাবে না এবং আগের ss চেকটি এখন দেখাবে যে এটি 127.0.0.1:10000-এ bind হয়ে আছে। আপনার ল্যাপটপ থেকে একটি tunnel ওপেন করুন:
ssh -L 10000:localhost:10000 youruser@YOUR_SERVER_IPসেই সেশনটি খোলা রাখুন এবং https://localhost:10000 ব্রাউজ করুন। ট্রাফিক SSH-এর ভেতর দিয়ে যায়, যা আপনার কী (key) দ্বারা আগে থেকেই অথেন্টিকেটেড এবং এনক্রিপ্টেড। তাই আপনি এখানে নির্দ্বিধায় self-signed সার্টিফিকেট গ্রহণ করতে পারেন, কারণ SSH লেয়ারটিই প্রকৃত সুরক্ষা প্রদান করছে। SSH সেশন বন্ধ করলেই Webmin অদৃশ্য হয়ে যাবে। কোনো allowlist-এর প্রয়োজন নেই, কোনো কিছু এক্সপোজড নেই, এবং আলাদা করে কোনো সার্ভিস হার্ডেন করার দরকার নেই।
আপনি যদি bind=127.0.0.1 সেট করেন এবং tunnel করতে ভুলে যান, তবে রিমোট অ্যাক্সেস বন্ধ হয়ে যাবে; এটিই এই ফিচারের কাজ, কোনো ত্রুটি নয়। বিকল্প A-এর মতোই এটি পুনরুদ্ধার করুন: কনসোল থেকে bind লাইনটি মুছে ফেলুন অথবা bind=0.0.0.0 সেট করুন, তারপর রিস্টার্ট দিন। এটি সেই একই টানেলিং পদ্ধতি যা আপনি tmux-এ Claude Code চালানো একটি রিমোট ডেভেলপমেন্ট বক্সে প্রবেশের জন্য ব্যবহার করতেন; একটি SSH সেশন, সবকিছু ব্যক্তিগত, এবং পাবলিক ইন্টারফেসে বাড়তি কোনো সার্ভিস listen করছে না।
সেলফ-সাইনড সার্টিফিকেটের পরিবর্তে একটি আসল সার্টিফিকেট ব্যবহার
আপনি যদি Option A-এর অধীনে কোনো হোস্টনামের মাধ্যমে Webmin এক্সপোজ করেন, তবে একটি আসল Let's Encrypt সার্টিফিকেট ব্যবহার করে ব্রাউজারের সতর্কবার্তা দূর করুন। আপনার একটি DNS নাম প্রয়োজন, যেমন panel.example.com, যার একটি A রেকর্ড সার্ভারের দিকে নির্দেশ করা থাকবে এবং ভ্যালিডেশনের সময় port-80 HTTP চ্যালেঞ্জের উত্তর দেওয়ার মতো কিছু থাকতে হবে।
Webmin-এ এটি বিল্ট-ইন রয়েছে: Webmin, তারপর Webmin Configuration, তারপর SSL Encryption, এবং সবশেষে Let's Encrypt ট্যাব-এ যান। হোস্টনামটি লিখুন, "website root directory"-কে এমন একটি পাথে নির্দেশ করুন যা ওই ডোমেইনের জন্য port 80-এ সার্ভ করা হয়, এবং রিকোয়েস্ট করুন। Webmin সার্টিফিকেটটি সংগ্রহ করবে, miniserv.conf ফাইলে certfile= এবং keyfile= লাইনগুলো আপডেট করবে এবং মেয়াদ শেষ হওয়ার আগেই স্বয়ংক্রিয়ভাবে তা রিনিউ করবে। পেজটি রিলোড করুন, এখন প্যাডলক আইকনটি সঠিক দেখাবে।
একটি বাস্তব সমস্যা হলো: Webmin-এর নিজস্ব সার্ভার 10000 পোর্টে চলে, 80 পোর্টে নয়। তাই http-01 চ্যালেঞ্জের জন্য একটি আসল ওয়েব সার্ভার (Apache বা nginx) প্রয়োজন, যা panel.example.com-এর জন্য port 80-এ উত্তর দেবে, অথবা DNS-ভিত্তিক ভ্যালিডেশন ব্যবহার করতে হবে। শুধুমাত্র Webmin আছে এমন বক্সে, যেখানে port 80-এ অন্য কিছু নেই, সেখানে Let's Encrypt-এর কাছে চ্যালেঞ্জ ফাইলটি পৌঁছানোর কোনো উপায় না থাকায় রিকোয়েস্টটি ভ্যালিডেশন এরর দেখাবে। এর মেকানিজম, DNS রেকর্ড, port-80 চ্যালেঞ্জ এবং রিনিউয়াল প্রক্রিয়া যেকোনো ওয়েবসাইটের সার্টিফিকেট ইস্যু করার মতোই। আপনি যদি এই বিষয়ে বিস্তারিত জানতে চান, তবে Let's Encrypt TLS certificates with Certbot and nginx guide-এ ভ্যালিডেশন ফ্লো এবং DNS সেটআপ সম্পর্কে বিস্তারিত আলোচনা করা হয়েছে। আপনি যদি SSH-tunnel রুটটি বেছে নিয়ে থাকেন, তবে এই অংশটি পুরোপুরি এড়িয়ে যেতে পারেন: SSH-এর পেছনে সেলফ-সাইনড সার্টিফিকেট ব্যবহার করা নিরাপদ, এবং https://localhost:10000 ভিজিট করার সময় panel.example.com-এর জন্য ইস্যু করা আসল সার্টিফিকেটও শুধুমাত্র নাম অমিল হওয়ার সতর্কবার্তা দেখাবে।
টু-ফ্যাক্টর অথেন্টিকেশন চালু করা
শুধুমাত্র পাসওয়ার্ড root প্যানেলের জন্য যথেষ্ট সুরক্ষা নয়, তাই একটি দ্বিতীয় ধাপের সুরক্ষা যোগ করুন। Webmin খুলুন, তারপর Webmin Configuration-এ যান এবং Two-Factor Authentication নির্বাচন করুন। Google Authenticator প্রোভাইডারটি বেছে নিন; এটি একটি স্ট্যান্ডার্ড TOTP, তাই এটি Authy, 1Password বা যেকোনো অথেন্টিকেটর অ্যাপের সাথে কাজ করবে। এরপর সেটি সংরক্ষণ করুন। Webmin প্রয়োজনীয় ছোট Perl মডিউলটি (Authen::OATH এবং একটি QR জেনারেটর) ইনস্টল করবে এবং ফিচারটি চালু করবে; তবে এই ধাপটি এখনো কোনো অ্যাকাউন্টকে সুরক্ষিত করবে না।
এরপর প্রতিটি অ্যাকাউন্টকে নিজস্ব ডিভাইস এনরোল করতে হবে। 2FA চালু করার পর, Webmin খুলুন, তারপর Webmin Users-এ যান, নির্দিষ্ট অ্যাকাউন্টটি বেছে নিন এবং Enable Two-Factor For User নির্বাচন করুন। Webmin একটি QR কোড দেখাবে; অ্যাপটি দিয়ে সেটি স্ক্যান করুন এবং নিশ্চিত করার জন্য একটি জেনারেট করা কোড লিখুন। এরপর থেকে, লগইন করার সময় পাসওয়ার্ডের পাশাপাশি ছয় ডিজিটের টোকেনটি চাওয়া হবে। লগ আউট করার আগেই এনরোলমেন্ট সম্পন্ন করুন। যদি 2FA বাধ্যতামূলক করা হয় কিন্তু আপনার অ্যাকাউন্ট কোনো কোড স্ক্যান না করে থাকে, তবে আপনি কনসোল থেকে এই প্রয়োজনীয়তা মুছে ফেলতে পারবেন, কিন্তু আগে থেকে এনরোল করে রাখা অনেক বেশি সুবিধাজনক।
ব্রুট-ফোর্স লগইন ঠেকাতে Fail2ban যোগ করুন
একটি সীমাবদ্ধ লগইন এন্ডপয়েন্ট হলেও বারবার ব্যর্থ লগইন প্রচেষ্টার জন্য শাস্তিমূলক ব্যবস্থা থাকা উচিত। Webmin ব্যর্থ লগইন প্রচেষ্টার তথ্য syslog-এ webmin[12345]: Invalid login as root from 10.0.0.9 ফরম্যাটে অথবা কোনো Unix অ্যাকাউন্ট নয় এমন ইউজারনেমের ক্ষেত্রে Non-existent login as ... ফরম্যাটে পাঠায়। Ubuntu 24.04-এ এই লাইনগুলো systemd journal-এ জমা হয়, কারণ ডিফল্ট ইমেজে কোনো /var/log/auth.log থাকে না। Fail2ban-এ একটি বিল্ট-ইন webmin-auth ফিল্টার আছে যা এই দুটি লাইনকেই শনাক্ত করতে পারে। নিচের জেল (jail) কনফিগারেশনটি নিজেই backend = systemd সেট করে নেয়, তাই আলাদা কোনো regex বা লগ পাথের প্রয়োজন নেই।
/etc/fail2ban/jail.d/webmin.local তৈরি করুন:
[webmin-auth]
enabled = true
port = 10000
filter = webmin-auth
backend = systemd
maxretry = 4
bantime = 1hsudo systemctl restart fail2ban কমান্ড দিয়ে রিলোড করুন এবং জেলটি সক্রিয় হয়েছে কি না নিশ্চিত করুন:
sudo fail2ban-client status webmin-authআপনি জেলটিকে তালিকাভুক্ত অবস্থায় দেখবেন যেখানে শুরুতে ব্যান কাউন্টার শূন্য থাকবে (journal backend-এ কোনো File list: লাইন থাকে না)। সংযোগটি সঠিকভাবে কাজ করছে কি না তা যাচাই করতে, অন্য কোনো নেটওয়ার্ক থেকে ইচ্ছাকৃতভাবে কয়েকবার ভুল লগইন করুন। এরপর স্ট্যাটাস কমান্ডটি পুনরায় চালিয়ে দেখুন Currently banned বাড়ছে কি না। যদি এটি না বাড়ে, তবে নিশ্চিত করুন যে আপনি Fail2ban-এর ignoreip-এ থাকা কোনো অ্যাড্রেস থেকে পরীক্ষা করছেন না। এছাড়া সার্ভারে journalctl SYSLOG_IDENTIFIER=webmin চালিয়ে নিশ্চিত করুন যে Invalid login লাইনগুলো সঠিকভাবে লেখা হচ্ছে। যদি এই বক্সে Fail2ban ইনস্টল করা না থাকে, তবে Ubuntu 24.04-এ SSH-এর জন্য Fail2ban গাইড থেকে ইনস্টলেশন এবং SSH জেলের কনফিগারেশন দেখে নিতে পারেন, যা আপনার এই জেলের পাশাপাশি চালানো উচিত।
প্রতিটি Webmin ব্যবহারকারী কী কী অ্যাক্সেস করতে পারবে তা সীমাবদ্ধ করুন
প্যানেল ব্যবহারকারী প্রত্যেকেরই সবকিছুর ওপর root অ্যাক্সেসের প্রয়োজন নেই। Webmin, then Webmin Users-এ গিয়ে অতিরিক্ত Webmin লগইন তৈরি করুন এবং প্রতিটি ব্যবহারকারীকে শুধুমাত্র প্রয়োজনীয় মডিউলগুলোর অ্যাক্সেস দিন। উদাহরণস্বরূপ, একজন ব্যাকআপ অপারেটরকে শুধুমাত্র cron এবং filesystem মডিউলগুলো দেখার অনুমতি দিন। কোনো ব্যবহারকারীকে এডিট করলে প্রতিটি মডিউলের একটি চেকলিস্ট দেখা যায়; কোনো মডিউল আনচেক করলে তা ওই ব্যবহারকারীর মেনু থেকে মুছে যায় এবং সংশ্লিষ্ট URL-গুলোতে প্রবেশাধিকার বন্ধ হয়ে যায়। এটি defence in depth বা গভীর প্রতিরক্ষা ব্যবস্থা: এমনকি কোনো নিম্ন-প্রিভিলেজ Webmin সেশন চুরি হলেও, ব্যবহারকারীর তালিকায় Users মডিউল না থাকলে তা দিয়ে /etc/shadow পরিবর্তন করা সম্ভব নয়।
Webmin আপডেট রাখা
যেহেতু আপনি apt repository থেকে ইনস্টল করেছেন, তাই sudo apt update && sudo apt upgrade সিস্টেমের অন্যান্য প্যাকেজের সাথে নতুন Webmin রিলিজগুলোও আপডেট করে নেয়। দ্রুত প্যাচ করুন, কারণ কন্ট্রোল প্যানেল হ্যাকারদের পছন্দের লক্ষ্যবস্তু। Webmin নিজেও Webmin, then Webmin Configuration, then Upgrade Webmin মেনু থেকে আপডেট হতে পারে, তবে Ubuntu-তে apt পদ্ধতিটি বেশি কার্যকর কারণ এটি আপনার অন্যান্য প্যাকেজ ম্যানেজমেন্টের সাথে ভার্সন সামঞ্জস্যপূর্ণ রাখে। এটিকে ঐচ্ছিক মনে করবেন না: অতীতে Webmin-এর বেশ কিছু CVE ছিল remote-code-execution বাগ, এবং "প্যাচ করা" ও "breached" হওয়ার মধ্যে পার্থক্য ছিল অ্যাডমিন কত দ্রুত আপডেট সম্পন্ন করেছেন তার ওপর।
ব্যর্থতার ধরন এবং যে বার্তাগুলো আপনি দেখবেন
"Your connection is not private" / NET::ERR_CERT_AUTHORITY_INVALID। প্রথমবার লোড করার সময় এটি দেখা যায়। কারণ: Webmin ইনস্টল করার সময় যে self-signed certificate তৈরি করে, তার কোনো বিশ্বস্ত ইস্যুকারী নেই। এটি কোনো আক্রমণ নয়; চ্যানেলটি এনক্রিপ্ট করা, তবে এর কোনো বৈধতা যাচাই করা হয়নি। সমাধান: আপাতত সতর্কবার্তাটি এড়িয়ে এগিয়ে যান, তারপর একটি আসল Let's Encrypt সার্টিফিকেট ইস্যু করুন, অথবা আপনি যদি SSH tunnel-এর মাধ্যমে Webmin-এ পৌঁছান তবে এটিকে স্থায়ীভাবে গ্রহণ করুন।
"This web server is running in SSL mode. Try the URL https://..." আপনি http://server:10000 টাইপ করেছেন। miniserv ওই পোর্টে শুধুমাত্র TLS-এ কথা বলে এবং সেটিই আপনাকে প্লেইন টেক্সটে জানাচ্ছে। সমাধান: অ্যাড্রেস বারে http পরিবর্তন করে https লিখুন।
পেজ টাইম আউট হয়, ERR_CONNECTION_TIMED_OUT / "This site can't be reached"। অনুরোধটি Webmin-এর কাছে পৌঁছায়নি। Ubuntu-তে এর কারণ প্রায় সবসময়ই ufw-এর পোর্ট 10000 ব্লক করে রাখা। sudo ufw status দিয়ে নিশ্চিত করুন; যদি 10000 তালিকায় না থাকে, তবে হয় sudo ufw allow 10000/tcp দিয়ে এটি খুলুন অথবা, আরও ভালো হয়, এটি বন্ধ রেখে Option B-এর SSH tunnel ব্যবহার করুন। পার্থক্যটি খেয়াল করুন: timeout মানে হলো ফায়ারওয়াল নীরবে প্যাকেট ফেলে দিচ্ছে, অন্যদিকে ERR_CONNECTION_REFUSED মানে হলো পোর্টটি reachable কিন্তু Webmin চলছে না, সেক্ষেত্রে sudo systemctl status webmin চেক করুন।
"Access denied for <your IP>।" আপনি Option A-এর অধীনে IP Access Control সেট করেছেন এবং আপনার বর্তমান অ্যাড্রেসটি অনুমোদিত তালিকায় নেই, অথবা আপনার ডাইনামিক IP পরিবর্তিত হয়েছে, কিংবা কোনো টাইপো আছে। ব্রাউজার থেকে এটি ঠিক করার কোনো উপায় নেই। কনসোল থেকে সমাধান করুন: /etc/webmin/miniserv.conf ফাইলে allow= লাইনটি এডিট করুন, সংশোধন করুন বা মুছে ফেলুন এবং sudo systemctl restart webmin চালান।
"Login failed. Please try again." অথচ আপনার জানা ক্রেডেনশিয়াল সঠিক। অ্যাকাউন্টটির কোনো Unix পাসওয়ার্ড নেই, যা শুধুমাত্র key-based ক্লাউড ইমেজগুলোতে সাধারণ বিষয়। Webmin PAM-এর মাধ্যমে Unix পাসওয়ার্ড যাচাই করে, এবং ওই ইউজারের জন্য সেই পাসওয়ার্ডটি নেই। সমাধান: সার্ভারে sudo passwd youruser চালান, তারপর লগইন করুন। যদি /var/webmin/miniserv.log-এ Non-existent login as ... দেখায়, তবে আপনি এমন একটি ইউজারনেম টাইপ করছেন যা কোনো Unix অ্যাকাউন্টই নয়।
একাধিক সার্ভারের ক্ষেত্রে, প্রতিটি বক্সে কন্ট্রোল প্যানেল ব্যবহারের চেয়ে অটোমেশন বেশি কার্যকর: আপনার প্রথম Ansible playbook থেকে সেই যাত্রা শুরু হয়।
FAQ
Webmin-কে পাবলিক ইন্টারনেটে উন্মুক্ত রাখা কি নিরাপদ?
ইন্টারনেট-মুখী Webmin-কে একটি লগইন পেজসহ root shell হিসেবে বিবেচনা করুন, কারণ এটি ঠিক তাই। এটি কেবল তখনই যথেষ্ট নিরাপদ যখন একাধিক স্তরের নিরাপত্তা থাকে: একটি আসল সার্টিফিকেট, টু-ফ্যাক্টর অথেন্টিকেশন, Fail2ban এবং একটি কঠোর IP allowlist, অথবা আরও ভালো হয় যদি এটি একেবারেই পাবলিক ইন্টারনেটে উন্মুক্ত না থাকে। সবচেয়ে কম ঝুঁকিপূর্ণ সেটআপ হলো Webmin-কে 127.0.0.1-এ bind করা এবং একটি SSH tunnel-এর মাধ্যমে এটি ব্যবহার করা, যাতে 10000 পোর্টটি ওপেন ইন্টারনেটে কারো কাছেই সাড়া না দেয়।
আমি কীভাবে Webmin সার্টিফিকেট ওয়ার্নিং থেকে মুক্তি পাব?
এই ওয়ার্নিংটি (NET::ERR_CERT_AUTHORITY_INVALID) দেখা যায় কারণ Webmin একটি self-signed সার্টিফিকেট নিয়ে আসে। Webmin Configuration, SSL Encryption, Let's Encrypt-এ গিয়ে একটি আসল সার্টিফিকেট ইস্যু করুন। এর জন্য এমন একটি DNS নাম ব্যবহার করুন যা আপনার সার্ভারের দিকে নির্দেশ করে এবং ভ্যালিডেশনের জন্য পোর্ট 80-এর চ্যালেঞ্জ গ্রহণ করতে পারে। আপনি যদি সবসময় SSH tunnel-এর মাধ্যমে localhost-এ Webmin ব্যবহার করেন, তবে এই ওয়ার্নিংটি ক্ষতিকর নয়; SSH ইতিমধ্যেই সংযোগটি এনক্রিপ্ট এবং অথেন্টিকেট করে, তাই আপনি নিরাপদে self-signed সার্টিফিকেট গ্রহণ করতে পারেন।
আমি কীভাবে Webmin-কে শুধুমাত্র আমার IP ঠিকানায় সীমাবদ্ধ করব?
Webmin-এ যান, Webmin Configuration, IP Access Control-এ গিয়ে "Only allow from listed addresses" নির্বাচন করুন এবং curl ifconfig.me থেকে আপনার পাবলিক IP লিখুন। Webmin এটি /etc/webmin/miniserv.conf ফাইলের allow= লাইনে সংরক্ষণ করে। ডাইনামিক হোম IP-এর ক্ষেত্রে সতর্ক থাকুন: যদি IP পরিবর্তিত হয় তবে আপনি লক হয়ে যাবেন এবং সার্ভার কনসোল থেকে allow= লাইনটি ঠিক করতে হবে। তাই বাস্তবে একটি স্ট্যাটিক IP অথবা SSH-tunnel পদ্ধতি ব্যবহার করা বেশি নির্ভরযোগ্য।
সঠিক পাসওয়ার্ড দেওয়া সত্ত্বেও কেন আমার লগইন ব্যর্থ হচ্ছে?
Webmin আপনার Unix পাসওয়ার্ডের বিপরীতে PAM-এর মাধ্যমে অথেন্টিকেট করে। ক্লাউড ইমেজগুলোতে সাধারণত শুধুমাত্র SSH key থাকে এবং ডিফল্ট অ্যাকাউন্টে কোনো পাসওয়ার্ড সেট করা থাকে না, তাই PAM-এর কাছে মেলানোর মতো কিছু থাকে না এবং লগইন প্রত্যাখ্যান করা হয়। পাসওয়ার্ড সেট করতে সার্ভারে sudo passwd youruser চালান, তারপর লগইন করুন। /var/webmin/miniserv.log ফাইলে Non-existent login as ... লাইন থাকার অর্থ হলো ইউজারনেমটি কোনো আসল Unix অ্যাকাউন্ট নয়।
সাধারণ SSH-এর তুলনায় Webmin কী কাজে লাগে?
Webmin হলো আবিষ্কারযোগ্যতা এবং সুবিধার একটি স্তর। লগ ফাইল ব্রাউজ করা, ইউজার ও cron ম্যানেজ করা, ফায়ারওয়াল রুল এডিট করা এবং প্রতিটি কমান্ড মুখস্থ না করেই ডিস্ক ও সার্ভিসের অবস্থা দেখার জন্য এটি সত্যিই কার্যকর। এটি মাঝে মাঝে কাজ করা অ্যাডমিন বা বিভিন্ন দক্ষতার টিমের জন্য সুবিধাজনক। সাধারণ SSH দ্রুততর, স্ক্রিপ্টযোগ্য এবং নিয়মিত কাজের জন্য অনেক কম অ্যাটাক সারফেস উন্মুক্ত করে। অনেক অ্যাডমিন উভয়ই ব্যবহার করেন: প্রতিদিনের কাজের জন্য SSH এবং মাঝে মাঝে point-and-click কাজের জন্য tunnel-এর পেছনে localhost-এ bind করা Webmin। যদি আপনার আসল প্রশ্নটি হয় কোন প্যানেল ব্যবহার করবেন (প্যানেল বনাম শেল নয়), তবে আগে Cockpit বনাম Webmin তুলনা করে দেখা উচিত, কারণ সিস্টেমের কতটুকু পরিবর্তন করা যায় এবং কীভাবে অথেন্টিকেশন হয় তার ওপর ভিত্তি করে এই দুটির মধ্যে পার্থক্য রয়েছে।