সার্ভারে বেশিরভাগ সফল সিঁধ কাটা চতুর exploit দিয়ে নয়, বরং এমন দুর্বলতা দিয়ে ঘটে যার প্যাচ কয়েক মাস আগেই বেরিয়েছিল। কারণ সাধারণত আলস্য নয়: কর্মরত সার্ভারে হাতে হালনাগাদ করা ভীতিকর, কারণ apt upgrade কখনও কখনও এমন জিনিস পুনরায় চালু করে যার জন্য কেউ বলেনি। স্বয়ংক্রিয় হালনাগাদ প্রশ্নটা মিটিয়ে দেয়, কিন্তু তাদের সুনাম খারাপ — ঠিক ততটাই প্রাপ্য যতটা তাড়াহুড়ো করে সাজানো হয়।
চলুন এমন একটা ব্যবস্থা দেখি যেখানে নিরাপত্তা প্যাচ নিজে থেকে আসে আর PHP-র সংস্করণ রাতারাতি বদলায় না।
স্থাপন
sudo apt install unattended-upgrades apt-listchanges
sudo dpkg-reconfigure -plow unattended-upgrades
সংলাপটি /etc/apt/apt.conf.d/20auto-upgrades তৈরি করে। দেখে নিন তা থেকে কী দাঁড়াল:
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
এককগুলোর মানে «দৈনিক»। এসব চালায় ক্লাসিক cron নয়, systemd টাইমার:
systemctl list-timers | grep apt
প্রধান কথা: কেবল নিরাপত্তা
মূল ফাইল /etc/apt/apt.conf.d/50unattended-upgrades। তাতে Allowed-Origins-এর তালিকা থাকে (Debian-এ Origins-Pattern), আর ডিফল্টে সেখানে কেবল নিরাপত্তা রিপোজিটরি চালু। সেটিকে তেমনই থাকতে দিন।
-updates লাইনের মন্তব্য তোলার লোভ — «সব হালনাগাদ হোক» — প্রবল। করবেন না: updates রিপোজিটরি কেবল সংশোধন নয়, নতুন সংস্করণ আনে, আর রাতের চমক ঠিক সেখান থেকেই আসে। নিরাপত্তা আর সতেজতা আলাদা কাজ, আর দ্বিতীয়টি আপনি কীবোর্ডের সামনে থাকতে করাই ভালো।
কোনো প্যাকেজ স্বয়ংক্রিয়ভাবে হালনাগাদ হওয়া উচিত না হলে তার জন্য কালো তালিকা আছে:
Unattended-Upgrade::Package-Blacklist {
"mariadb-server";
"php8.3-fpm";
};
এটি ভেবেচিন্তে ব্যবহার করুন: এখানকার প্রতিটি লাইনের মানে «এটি আমি নিজে হালনাগাদ করি» — আর এই প্রতিশ্রুতি রাখতে হবে।
পুনরারম্ভ
মূল লাইনটি:
Unattended-Upgrade::Automatic-Reboot "false";
সাইটসহ সার্ভারের জন্য এটি false-এ রাখা সঠিক: রাত তিনটায় না জানিয়ে পুনরারম্ভ একদিন পিছিয়ে যাওয়া প্যাচের চেয়ে খারাপ। কিন্তু এই সিদ্ধান্তের একটা বাধ্যতামূলক দ্বিতীয় অর্ধেক আছে, আর সেটাই ভুলে যাওয়া হয়।
কার্নেল, libc বা openssl হালনাগাদ হলে সিস্টেম /var/run/reboot-required ফাইলটি তৈরি করে। পুনরারম্ভ না হওয়া পর্যন্ত সংশোধিত সংস্করণ ডিস্কে থাকে আর পুরনোটি মেমরিতে চলতে থাকে — অর্থাৎ দুর্বলতা কোথাও যায়নি, যদিও প্যাকেজ হালনাগাদ বলে গণ্য। এটি স্পষ্ট করে যাচাই করুন:
ls -l /var/run/reboot-required
cat /var/run/reboot-required.pkgs
দ্বিতীয় ফাইলটি ঠিক কী কারণে পুনরারম্ভ দরকার তা বলে। নিয়মটা সরল: পতাকা দেখলেই পরের এক-দুদিনের মধ্যে একটা জানালা ঠিক করুন, «কখনও» নয়।
লাইব্রেরি আলাদা ব্যাপার। openssl হালনাগাদ হয়ে যায় আর nginx ও PHP-FPM পুরনো সংস্করণ নিয়ে মেমরিতে চলতে থাকে, আর পুনরারম্ভের পতাকা আসেই না। কার পুনরারম্ভ দরকার তা দেখায় needrestart:
sudo apt install needrestart
sudo needrestart -b
কেবল এটিকে «জানাও, জিজ্ঞেস কোরো না» মোডে রাখুন — নইলে সে অ-সংলাপী স্থাপনের মাঝখানে প্রশ্ন করতে শুরু করবে আর সেটিকে ঝুলিয়ে দেবে। এর জন্য /etc/needrestart/conf.d/-তে $nrconf{restart} = 'l'; লাইনসহ একটা ফাইল ফেলুন।
যাচাই করুন এটি আদৌ কাজ করে
স্থাপন ছাড়া পরীক্ষামূলক চালানো:
sudo unattended-upgrade --dry-run --debug
ফলাফল দেখায় কোন প্যাকেজ নিয়মের সঙ্গে মেলে আর কোনগুলো কেন প্রত্যাখ্যাত হলো। আসলে কী ঘটেছে তা লগে:
sudo tail -50 /var/log/unattended-upgrades/unattended-upgrades.log
এখন কতগুলো হালনাগাদ অপেক্ষা করছে:
apt list --upgradable 2>/dev/null | grep -i security
এই শেষ কমান্ডটিই সবচেয়ে কাজের। সাজানো স্বয়ংক্রিয় হালনাগাদের নীরবে ভেঙে পড়ার অভ্যাস আছে: /boot-এ জায়গা ফুরিয়েছে, রিপোজিটরি কি বদলেছে, কোনো হাতে-করা সম্পাদনার পরে টাইমার বন্ধ হয়ে গেছে। বাইরে থেকে সব ঠিক, আর মাসের পর মাস প্যাচ বসেনি।
/boot-এ জায়গা
ক্লাসিক পরিস্থিতি: পুরনো কার্নেল সরে না, /boot পার্টিশন ভরে যায়, নতুন কার্নেল বসানো ব্যর্থ হয়, আর হালনাগাদ পুরোপুরি থেমে যায়। কয়েক মাসে একবার দেখে নেওয়া ভালো:
df -h /boot
sudo apt autoremove --purge
অথবা একই 50unattended-upgrades-এ স্বয়ংক্রিয় পরিচ্ছন্নতা চালু করুন: Remove-Unused-Kernel-Packages "true" ও Remove-Unused-Dependencies "true"।
মানুষের জন্য কী থাকে
স্বয়ংক্রিয় হালনাগাদ রোজকার কাজ সরায়, নজরদারি নয়। দুটি প্রশ্ন যার উত্তর আপনার যেকোনো মুহূর্তে দিতে পারা উচিত: কতগুলো নিরাপত্তা হালনাগাদ অপেক্ষা করছে, আর পুনরারম্ভের পতাকা বসানো আছে কি না। দুটি উত্তরই কোনো পাতায় একটি লাইন, আর পুরো ব্যাপারটা এই যে সেই লাইনটা নিজেই চোখে পড়ুক, ত্রৈমাসিকে একবার আপনার উদ্যোগে নয়।