Rocky Linux-ல் SSH port-ஐ மாற்றுவது எப்படி?
Rocky Linux மற்றும் AlmaLinux-ல் SSH port மாற்றும்போது SELinux, firewalld மற்றும் sshd_config ஆகிய மூன்றையும் சரியாக உள்ளமைக்க வேண்டும். இணைப்பு துண்டிக்கப்படாமல் இதைச் செய்வது எப்படி?
SSH port-ஐ மாற்றும்போது ஏன் மூன்று நிலைகள் தேவைப்படுகின்றன
Rocky Linux, AlmaLinux, CentOS Stream அல்லது Fedora ஆகியவற்றில் SSH port-ஐ மாற்ற, ஒரு திருத்தம் மட்டும் போதாது. புதிய port-ல் இணைப்பு வேலை செய்ய வேண்டுமா என்பதைத் தீர்மானிப்பதில் மூன்று தனித்தனி அமைப்புகள் பங்கு வகிக்கின்றன. பாக்கெட் கணினியை வந்தடைகிறதா என்பதை firewalld தீர்மானிக்கிறது. அந்த port எண்ணில் sshd-ஐ இணைக்க (bind) அனுமதி உள்ளதா என்பதை SELinux தீர்மானிக்கிறது. sshd_config எந்த port-ஐ daemon பயன்படுத்த வேண்டும் என்பதைத் தீர்மானிக்கிறது. SELinux நிலையைத் தவறவிட்டால், daemon தொடங்க மறுத்துவிடும். firewalld நிலையைத் தவறவிட்டால், daemon தொடங்கும், port-ஐக் கவனிக்கும் (listen), ஆனால் யாராலும் அதை அணுக முடியாது.
Ubuntu-வில் இதே வேலையை ஒரு திருத்தம் மற்றும் restart மூலம் செய்துவிடலாம். ஏனெனில், Ubuntu SELinux-க்கு பதிலாக AppArmor-ஐப் பயன்படுத்துகிறது மற்றும் sshd எந்த port-ஐப் பயன்படுத்தலாம் என்று கட்டுப்படுத்தும் எந்த profile-உம் அதில் இல்லை. அங்கே ufw இயங்கிக்கொண்டிருந்தால், ஒரு விதியை (rule) மட்டும் சேர்த்தால் போதும். இதுவே அடிப்படை வித்தியாசம். RHEL குடும்பத்தைச் சேர்ந்த OS-களில், புதிய நிறுவலில் firewalld இயங்கிக்கொண்டிருக்கும் மற்றும் SELinux enforcing நிலையில் இருக்கும். இவை இரண்டுமே port எண்களைக் கண்காணிக்கும்.
இந்த வரிசையில் பணிகளைச் செய்யுங்கள், அப்போதுதான் ஒவ்வொரு நிலையிலும் உங்கள் தற்போதைய session துண்டிக்கப்படாமல் இருக்கும்:
- firewalld-ல் புதிய port-ஐத் திறக்கவும், தற்போதைக்கு port 22-ஐயும் திறந்து வைக்கவும்.
semanage-ஐப் பயன்படுத்தி புதிய port-க்கு SELinux label-ஐச் சேர்க்கவும்.- sshd configuration-ல் புதிய port-ஐ அமைக்கவும்.
sshd-ஐ restart செய்யவும், பின்னர் முதல் terminal-ஐ மூடுவதற்கு முன்பு இரண்டாவது terminal மூலம் புதிய port-ல் login செய்யவும்.
பணியைத் தொடங்குவதற்கு முன் உங்கள் service provider-ன் web console-ஐ (VNC அல்லது serial) கண்டறிந்து, அதன் மூலம் உங்களால் login செய்ய முடிகிறதா என்று சரிபார்க்கவும். மாற்றம் தவறாக நடந்தால், மீண்டும் உள்ளே நுழைய அந்த console-தான் உங்களுக்கு உதவும். ஒரு பயனர் தான் பணம் செலுத்தி வாங்கிய server-லேயே நுழைய முடியாமல் போவதற்கு, port மாற்றம் ஒரு பொதுவான காரணமாகும்.
முதலில், semanage-ஐ நிறுவவும்
semanage என்பது SELinux policy அமைப்புகளைத் திருத்தும் கருவியாகும். Rocky Linux அல்லது AlmaLinux-ன் குறைந்தபட்ச நிறுவலில் (minimal install) இது இடம்பெறாது. இது policycoreutils-python-utils தொகுப்பில் உள்ளது.
sudo dnf install -y policycoreutils-python-utilsஅந்தத் தொகுப்பை நிறுவுவதற்கு முன்பே கட்டளையை இயக்கினால் sudo: semanage: command not found பிழை வரும். அந்த இடத்தில் பல பயனர்கள் SELinux நிறுவப்படவில்லை என்று தவறாகக் கருதி, அந்தப் படியைத் தவிர்த்துவிடுவார்கள். SELinux நிறுவப்பட்டே உள்ளது. நிர்வாகக் கருவி மட்டுமே விடுபட்டுள்ளது. dnf கட்டளை அமைப்பு உங்களுக்குப் புதியது என்றால், dnf மற்றும் apt கட்டளைகளின் ஒப்பீட்டை பார்த்து உங்களுக்குத் தெரிந்தவற்றுடன் ஒப்பிட்டுக்கொள்ளுங்கள்.
ஒரு port-ஐத் தேர்ந்தெடுத்து, அதை எந்த process-ம் பயன்படுத்தவில்லை என்பதை உறுதிப்படுத்தவும்
1024 முதல் 65535 வரையிலான எந்தவொரு இலவச TCP port-ம் இதற்குப் பொருந்தும். ஒரு port-ஐத் தேர்ந்தெடுக்கும் முன் இரண்டு சோதனைகளைச் செய்யவும்:
sudo ss -tlnp | grep -w 2222
sudo semanage port -l | grep -w 2222முதல் கட்டளை, ஒரு process ஏற்கனவே அந்த port-ல் listening நிலையில் உள்ளதா என்பதைக் காட்டும். இரண்டாவது கட்டளை, SELinux policy அந்த port-ஐ ஏற்கனவே வேறு ஏதேனும் service வகைக்கு ஒதுக்கியுள்ளதா என்பதைக் காட்டும். ஒரு port இலவசமாக இருந்தால், இந்த இரண்டு கட்டளைகளும் எந்த வெளியீட்டையும் தராது. ஒருவேளை policy ஏற்கனவே அந்த port-ஐக் கொண்டிருந்தால், 2-வது படியில் உள்ள semanage port -a கட்டளை ValueError: Port tcp/2222 already defined பிழையுடன் தோல்வியடையும்; இதற்குத் தீர்வாக வேறொரு port எண்ணைத் தேர்ந்தெடுக்க வேண்டும்.
இந்த வழிகாட்டி முழுவதும் உதாரணத்திற்கு 2222 பயன்படுத்தப்பட்டுள்ளது. ஒரு scanner, 22-க்கு அடுத்தபடியாக முயற்சிக்கும் முதல் port இதுவாகும், எனவே உண்மையான server-ல் இதைக் காட்டிலும் எளிதில் யூகிக்க முடியாத ஒரு port-ஐத் தேர்ந்தெடுக்கவும்.
படி 1: firewalld-ல் port-ஐத் திறக்கவும்
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reload
sudo firewall-cmd --list-ports--permanent கட்டளையானது விதியை disk-ல் உள்ள zone file-ல் எழுதும், ஆனால் இயங்கிக்கொண்டிருக்கும் firewall-ஐ மாற்றாது. --reload கட்டளையானது disk-ல் உள்ள configuration-ஐ இயங்கும் firewall-க்கு ஏற்றும். reload செய்யத் தவறினால், விதி இருக்கும் ஆனால் firewalld அடுத்த முறை restart ஆகும் வரை அது செயல்படாது; இந்த நடைமுறை தோல்வியடைவதாகத் தோன்றுவதற்கு இதுவே மிக முக்கியமான காரணங்களில் ஒன்றாகும்.
தற்போதைக்கு ssh service entry-ஐ மாற்ற வேண்டாம். அந்த entry தான் port 22-ஐத் திறந்து வைத்திருக்கிறது, நீங்கள் சோதனைகளைச் செய்யும்போது அதுவே உங்கள் பாதுகாப்பு அரண்.
உங்கள் service provider-ன் control panel-ஐயும் சரிபார்க்கவும். பல host-கள் operating system-க்கு வெளியே, VPS-க்கு முன்னால் ஒரு network firewall-ஐ இயக்குகின்றன. எனவே, நீங்கள் firewalld-ல் திறந்த port, upstream-ல் தடுக்கப்படலாம். VPS-க்கான firewalld அடிப்படை வழிகாட்டி இந்த model உங்களுக்குப் புதியது என்றால், zones மற்றும் runtime-க்கும் permanent-க்கும் இடையிலான வேறுபாடுகளை விளக்குகிறது.
படி 2: SELinux-க்காக port-ஐ label செய்தல்
sudo semanage port -a -t ssh_port_t -p tcp 2222
sudo semanage port -l | grep ssh_port_t-a ஒரு புதிய port ஒதுக்கீட்டைச் சேர்க்கிறது. -t ssh_port_t என்பது SSH port-கள் கொண்டிருக்கும் வகையாகும் (type). இரண்டாவது கட்டளை ssh_port_t தற்போது உள்ளடக்கியுள்ள அனைத்தையும் பட்டியலிடுகிறது; எனவே, daemon-ஐ மாற்றும் முன் உங்கள் port எண் சரியாகச் சேர்க்கப்பட்டுள்ளதா என்பதை உறுதிப்படுத்திக்கொள்ளலாம்.
SELinux ஏன் அந்த port-ஐ முழுமையாகத் தடுக்கிறது
SELinux (Security-Enhanced Linux) கணினியில் உள்ள ஒவ்வொரு பொருளுக்கும் ஒரு லேபிளை (label) வழங்குகிறது; TCP port எண்களும் மற்ற பொருட்களைப் போலவே கருதப்படுகின்றன. SSH daemon, sshd_t எனப்படும் டொமைனில் கட்டுப்படுத்தப்பட்டு இயங்குகிறது. கொள்கை (policy) அடிப்படையில், ssh_port_t என லேபிளிடப்பட்ட TCP port-களில் மட்டுமே sshd_t-ஐ bind செய்ய அனுமதி உண்டு. இயல்பாகவே, 22 என்ற port மட்டுமே அந்த லேபிளைக் கொண்டுள்ளது. நீங்கள் 2222-ல் bind செய்ய முயற்சிக்கும்போது, kernel அந்த லேபிளைச் சரிபார்க்கிறது; அந்த எண்ணிற்கு ஒதுக்கப்பட்ட பொதுவான வகை (generic type) கொள்கையைச் சரிபார்த்து, socket-க்கான name_bind அனுமதியை மறுக்கிறது.
இதனால்தான் இந்தத் தோல்வி ஒரு firewall சிக்கலைப் போலத் தெரிவதில்லை. Listening socket உருவாவதற்கு முன்பே kernel இதை மறுத்துவிடுகிறது; எனவே sshd பிழையைப் பதிவு செய்துவிட்டு வெளியேறுகிறது. Firewall சிக்கல் இதற்கு நேர்மாறானது: daemon இயங்கிக்கொண்டிருக்கும், ஆனால் வரும் packets வழியிலேயே நிராகரிக்கப்படும்.
getenforce உங்கள் கணினி எந்த பயன்முறையில் (mode) உள்ளது என்பதைக் காட்டும். Permissive பயன்முறையில், ஒரு மறுப்பு (denial) பதிவு செய்யப்படும் ஆனால் செயல்படுத்தப்படாது; எனவே port மாற்றம் வேலை செய்வது போலத் தோன்றும், ஆனால் யாராவது setenforce 1-ஐ இயக்கும்போதோ அல்லது கணினி மறுதொடக்கம் (reboot) செய்யப்பட்டு enforcing பயன்முறைக்கு வரும்போதோ அது செயலிழந்துவிடும். எப்படி இருந்தாலும் port-க்கு லேபிளிடுவது அவசியம். சர்வர்களுக்கான SELinux அடிப்படைகள் வழிகாட்டி பயன்முறைகள், சூழல்கள் (contexts) மற்றும் பூலியன்கள் (booleans) பற்றி விரிவாக விளக்குகிறது. இது port-களில் மட்டும் ஏற்படும் சிக்கல் அல்ல; அதே கொள்கை, ஒரு container-ஐ host directory-யிலிருந்து படிக்க விடாமல் தடுக்கும். அந்தப் பாதைக்கு (path) மீண்டும் லேபிளிடும் வரை இந்தத் தடை நீடிக்கும். இதனால்தான் Rocky Linux அல்லது AlmaLinux-ல் Docker நிறுவுதல் வழிகாட்டிகளில் SELinux-க்கான ஒரு படிநிலை உள்ளது, இது Ubuntu வழிகாட்டிகளில் குறிப்பிடப்படுவதில்லை.
படி 3: sshd configuration-ல் port-ஐ அமைத்தல்
Rocky Linux 9 மற்றும் 10, AlmaLinux 9 மற்றும் 10, மற்றும் தற்போதைய Fedora பதிப்புகளில், /etc/ssh/sshd_config ஒரு include வரியுடன் தொடங்குகிறது. எனவே, உங்கள் மாற்றத்தைச் செய்வதற்கு ஒரு drop-in கோப்பைப் பயன்படுத்துவதே சரியான முறையாகும். இது package updates-ன் போது உங்கள் மாற்றங்கள் பாதிக்கப்படாமல் இருப்பதை உறுதி செய்யும்.
grep -n '^Include' /etc/ssh/sshd_config
echo 'Port 2222' | sudo tee /etc/ssh/sshd_config.d/10-port.conf
sudo sshd -tgrep-ல் Include வரி இல்லை என்றால் (இது Rocky Linux 8 மற்றும் பிற பழைய பதிப்புகளில் நிகழும்), Port 2222-ஐ நேரடியாக /etc/ssh/sshd_config-ல் சேர்க்கவும். sshd -t முழு configuration-ஐயும், drop-in கோப்புகளையும் சேர்த்து ஆய்வு செய்து, ஏதேனும் syntax பிழைகள் இருந்தால் தெரிவிக்கும். நீங்கள் restart செய்வதற்கு முன்பே பிழைகளைச் சரிசெய்யவும்; ஏனெனில், configuration-ல் பிழை இருந்தால் daemon மீண்டும் இயங்காது.
Port பலமுறை இடம்பெறலாம், மேலும் பட்டியலிடப்பட்ட அனைத்து port-களிலும் sshd இயங்கும். முதல் நாள் மட்டும் Port 22-ஐ Port 2222-உடன் சேர்த்து வைத்திருப்பது ஒரு பாதுகாப்பான வழியாகும், ஆனால் அதை நீக்க மறக்காதீர்கள்.
உங்கள் sshd ஒரு socket unit மூலம் தொடங்கப்படுகிறதா?
சில images, SSH-ஐ நீண்ட நேரம் இயங்கும் service-ஆக இல்லாமல், systemd socket activation மூலம் தொடங்குகின்றன. அவ்வாறு அமைக்கப்பட்டிருக்கும்போது, listening socket-ஐ systemd நிர்வகிக்கும்; அதுவே இணைப்புகளை sshd-க்கு வழங்கும். எனவே, sshd_config-ல் உள்ள Port வரி முற்றிலும் புறக்கணிக்கப்படும். எதையும் restart செய்வதற்கு முன் இதைச் சரிபார்க்கவும்:
systemctl is-enabled sshd.socketenabled என்ற பதில் கிடைத்தால், port எண் sshd_config-ல் இல்லாமல், socket unit-ல் அமைக்கப்பட்டுள்ளது என்று பொருள்:
sudo systemctl edit sshd.socket[Socket]
ListenStream=
ListenStream=2222வெற்று ListenStream= கட்டாயம் தேவை. மதிப்புகள் drop-in கோப்புகள் வழியாக ஒன்றன் பின் ஒன்றாகச் சேரும். எனவே, பட்டியலை முதலில் காலி செய்ய ஒரு வெற்று assignment கொடுக்காவிட்டால், socket ஆனது 22 மற்றும் 2222 ஆகிய இரண்டு ports-களிலும் தொடர்ந்து listen செய்யும். இதை sudo systemctl daemon-reload மூலம் செயல்படுத்தி, பின் sudo systemctl restart sshd.socket-ஐ இயக்கவும். உங்கள் server-ல் இந்த unit disabled நிலையில் இருந்தாலோ அல்லது இல்லையென்றாலோ, இந்தப் பகுதி உங்களுக்குப் பொருந்தாது.
படி 4: restart செய்யவும், பின்னர் இரண்டாவது terminal-லிருந்து சோதிக்கவும்
sudo systemctl restart sshd
systemctl status sshd
sudo ss -tlnp | grep sshdஇந்த terminal-ஐ மூடிவிடாதீர்கள். இதிலிருந்து வெளியேறவும் வேண்டாம். உங்கள் கணினியில் இரண்டாவது terminal-ஐத் திறந்து, புதிய port-ல் connect செய்யவும்:
ssh -p 2222 youruser@203.0.113.10இரண்டாவது login வெற்றிகரமாக முடிந்த பிறகு மட்டுமே முதல் session-ஐ மூடவும். ஒருவேளை அது வேலை செய்யவில்லை என்றால், நீங்கள் செய்த மாற்றங்களை நீக்குவதற்குத் தேவையான shell access உங்களிடம் இருக்கும். இந்த ஒரு பழக்கம் தான், ஐந்து நிமிட வேலையை ஒரு மதிய நேரப் போராட்டமாக மாற்றாமல் தடுக்கும்.
Firewall drop அல்லது SELinux denial? இரண்டையும் வேறுபடுத்தி அறிவது எப்படி
உங்கள் லேப்டாப்பில் இருந்து பார்க்கும்போது, இந்த இரண்டு தோல்விகளும் ஒரே மாதிரியாகத் தோன்றும். ஆனால் server-ல் இவை முற்றிலும் வேறானவை.
systemctl status sshdகட்டளை ஒரு unit தோல்வியடைந்ததைக் காட்டினால், daemon-ஆல் அதன் socket-ஐப் பெற முடியவில்லை என்று அர்த்தம். இது ஒரு configuration பிழை அல்லது SELinux denial ஆகும்.- unit active நிலையில் இருந்து,
ss -tlnpகட்டளை sshd புதிய port-ல் bound ஆகியிருப்பதைக் காட்டினால், daemon சரியாக இயங்குகிறது என்று அர்த்தம். சிக்கல் network பாதையில் உள்ளது: firewalld, service provider-ன் தனி firewall, அல்லது நீங்கள் குறிப்பிட்ட முகவரி மற்றும் port ஆகியவற்றில் ஏதேனும் பிழை இருக்கலாம்.
SELinux சிக்கலுக்கு, யூகிக்காமல் audit பதிவை வாசிக்கவும்:
sudo ausearch -m AVC -ts recent
sudo journalctl -u sshd -n 50 --no-pagerஒரு name_bind denial, tcp_socket class-ல், comm="sshd"-ல் உள்ள process-ஐயும், src=-ல் உள்ள port எண்ணையும், tcontext=-ல் அந்த port உண்மையில் கொண்டுள்ள label-ஐயும் குறிப்பிடும். அந்த கடைசி field-தான் விடை. ssh_port_t என்பதைத் தவிர வேறு எதுவாக இருந்தாலும், நீங்கள் பயன்படுத்தும் port-க்கு step 2 பொருந்தவில்லை என்று அர்த்தம். பெரும்பாலும் இது port எண்ணில் உள்ள தட்டச்சுப் பிழையாகவோ அல்லது தவறான protocol-ஆகவோ இருக்கலாம். பதிவுகளை வாக்கியங்களாக மாற்ற sealert-ஐப் பயன்படுத்த விரும்பினால், setroubleshoot-server-ஐ நிறுவவும்.
Kernel bind செய்ய மறுக்கும்போது sshd எழுதும் செய்தி இதோ:
error: Bind to port 2222 on 0.0.0.0 failed: Permission denied.1024-க்கு மேல் உள்ள port-ல் Permission denied ஏற்படுவது SELinux-ன் அறிகுறியாகும், ஏனெனில் அங்கு bind செய்ய root அதிகாரம் தேவையில்லை. அதே வரியில் உள்ள Address already in use ஒரு மாறுபட்ட பிழை: வேறொரு process அந்த port-ஐப் பிடித்து வைத்திருக்கிறது. Client பக்கத்திலிருந்து, connection refused மற்றும் connection timed out ஆகியவற்றுக்கு இடையேயான வேறுபாடு இந்த இரண்டு network சிக்கல்களையும் பிரித்தறிய உதவும். ஏனெனில், refusal என்பது உங்கள் packet host-ஐ அடைந்துவிட்டது, ஆனால் அங்கு எதையும் கேட்க (listen) ஆளில்லை என்று பொருள்; timeout என்பது எந்த பதிலும் வரவில்லை என்று பொருள்.
port 22-ஐ மூடி, உங்கள் clients-ஐப் புதுப்பிக்கவும்
புதிய port-ல் பலமுறை login செய்த பிறகு, port 22-ஐ நீக்கவும்:
sudo firewall-cmd --permanent --remove-service=ssh
sudo firewall-cmd --reload
sudo firewall-cmd --list-allport 22-ல் உள்ள SELinux label-ஐ மாற்ற வேண்டாம். இது base policy-லிருந்து வருகிறது. firewall பாக்கெட்டுகளை அனுமதிப்பதை நிறுத்திய பிறகு, இந்த label எதையும் வழங்காது.
பிறகு, clients-ஐச் சரிசெய்யவும். ஏனெனில், default port-ஐப் பயன்படுத்திய அனைத்து கருவிகளுக்கும் இப்போது புதிய port-ஐத் தெரிவிக்க வேண்டும். ஒவ்வொரு முறையும் -p என்று தட்டச்சு செய்வதற்குப் பதிலாக, உங்கள் கணினியில் உள்ள ~/.ssh/config கோப்பில் ஒருமுறை இதைப் பதிவிடவும்:
Host myvps
HostName 203.0.113.10
Port 2222
User youruserscp, sftp, rsync மற்றும் Ansible ஆகிய அனைத்தும் அந்தக் கோப்பைப் படிக்கின்றன. ஆனால், port 22-ஐ hardcode செய்துள்ள backup jobs, monitoring checks மற்றும் cron scripts போன்றவை இதைப் படிக்காது. எனவே, இந்த மாற்றம் உங்கள் நினைவில் இருக்கும்போதே அவற்றைக் கண்டறிந்து சரிசெய்யவும்.
போர்ட் மாற்றத்தினால் கிடைக்கும் மற்றும் கிடைக்காத நன்மைகள்
இது log-ல் ஏற்படும் தேவையற்ற இரைச்சலைக் குறைக்கிறது. தானியங்கி ஸ்கேனர்கள் (automated scanners) தொடர்ந்து port 22-ஐத் தாக்குகின்றன. போர்ட்டை மாற்றுவதன் மூலம், அந்தப் பதிவுகள் பெரும்பாலானவை journal-லிருந்து நீக்கப்படும், இதனால் உண்மையான நிகழ்வுகளைக் கண்டறிவது எளிதாகும். இது ஒரு பாதுகாப்பு நடவடிக்கை அல்ல. முழு போர்ட் வரம்பையும் ஸ்கேன் செய்யும் எந்தவொரு ஸ்கேனரும் உங்கள் daemon-ஐக் கண்டறிந்து அதன் version banner-ஐப் படித்துவிடும். போர்ட் மாற்றத்தை ஒரு பராமரிப்புப் பணியாகக் கருதுங்கள். உண்மையான பாதுகாப்பிற்கு, password login-ஐ முடக்கிவிட்டு, key-only authentication-ஐப் பயன்படுத்துங்கள். இதை VPS-க்கான SSH பாதுகாப்பு வழிகாட்டி படிப்படியாக விளக்குகிறது.
மேலே உள்ள அனைத்தும் இரண்டு முக்கிய RHEL rebuild-களிலும் ஒரே மாதிரியாகச் செயல்படும், ஏனெனில் அவை ஒரே மூலங்களிலிருந்து உருவாக்கப்படுகின்றன. நீங்கள் இன்னும் எதைத் தேர்ந்தெடுப்பது என்று குழப்பத்தில் இருந்தால், Rocky Linux மற்றும் AlmaLinux ஒப்பீடு பகுதியைப் பார்க்கவும். 2020-ல் CentOS தனது பழைய வடிவத்தை நிறுத்தியதால், தற்போது இரண்டு ஒத்த rebuild-கள் உள்ளன. இது குறித்த முழு விவரங்களை Red Hat-லிருந்து CentOS, Rocky மற்றும் AlmaLinux வரையிலான வரலாறு பகுதியில் காணலாம். ஏதேனும் பழைய வழிகாட்டியைப் பின்பற்றும் முன், cat /etc/os-release மூலம் உங்களுக்கு வழங்கப்பட்ட release எது என்பதைச் சரிபார்க்கவும். Rocky Linux 8-க்காக எழுதப்பட்ட வழிகாட்டிகள் இன்னும் தேடுபொறிகளில் முன்னணியில் உள்ளன, அவற்றின் semanage மற்றும் firewall-cmd படிகள் இப்போதும் சரியாகவே இருக்கும். ஆனால், Rocky 8-ல் sshd_config.d include வரி கிடையாது மற்றும் socket unit பற்றிய கவலையும் இல்லை, எனவே அந்த வழிகாட்டிகளின் sshd பகுதி தற்போதைய கணினிகளுடன் ஒத்துப்போகாது.
புதிய port குறித்து fail2ban-க்கு தெரிவிக்க வேண்டும்
fail2ban அடிப்படை repositories-ல் இல்லை. இது EPEL (extra packages for enterprise Linux)-லிருந்து கிடைக்கிறது:
sudo dnf install -y epel-release
sudo dnf install -y fail2ban fail2ban-firewalldfail2ban-firewalld subpackage, fail2ban-ன் தடைகளை (bans) firewalld வழியாக எழுதச் செய்கிறது. firewalld விதிகளை நிர்வகிக்கும் ஒரு server-ல் இதுவே சரியான முறையாகும்.
இயல்பான sshd jail, port = ssh-ஐ அமைக்கிறது. அந்தப் பெயர் /etc/services வழியாக 22-க்கு மாறுகிறது. நீங்கள் மாற்றிய பிறகு, இந்த jail யாரும் தாக்காத ஒரு port-ஐக் கண்காணிக்கும். இதனால் 2222-ல் தோல்வியுற்ற login முயற்சிகள் குவிந்தாலும், யாரையும் தடை செய்யாது. /etc/fail2ban/jail.local-ல் port எண்ணை நேரடியாகக் குறிப்பிடவும்:
[sshd]
enabled = true
port = 2222
backend = systemd
maxretry = 5
bantime = 3600backend = systemd, /var/log/secure-க்கு பதிலாக journal-லிருந்து தோல்விகளைப் படிக்கிறது. rsyslog இல்லாத minimal install-ல் இதுவே பாதுகாப்பான தேர்வாகும். sudo systemctl enable --now fail2ban மூலம் இதைத் தொடங்கவும், sudo fail2ban-client status sshd மூலம் jail-ன் நிலையைச் சரிபார்க்கவும். jail syntax, Ubuntu 24.04-ல் SSH-க்கான fail2ban அமைப்பு முறையில் உள்ளது போலவே இருக்கும். package source மற்றும் ban action மட்டுமே மாறுபடும்.
Port-ஐ மாற்றுவதை விட Patching முக்கியமானது
SSH port-ஐ மாற்றியமைத்து, நான்கு மாதங்களாக பாதுகாப்பு மேம்படுத்தல்களை (security updates) மேற்கொள்ளாத server, port 22-ல் இயங்கி தினமும் தானாகவே patch செய்துகொள்ளும் server-ஐ விட அதிக ஆபத்தில் உள்ளது. நீங்கள் root-ஆக இருக்கும்போதே, அதே session-ல் unattended updates-ஐ இயக்கவும்: Rocky Linux மற்றும் AlmaLinux-ல் தானியங்கி dnf மேம்படுத்தல்கள் கட்டுரை, timer அமைப்பது மற்றும் மேம்படுத்தல்களைப் பதிவிறக்கம் செய்து நிறுவுவது குறித்த தேர்வுகளை விளக்குகிறது. ஒரு மேம்படுத்தலை நிறுவியவுடன், பழைய code-ல் இயங்கிக்கொண்டிருக்கும் daemons தானாகவே restart ஆகாது. எனவே, openssh-server அல்லது அது சார்ந்த library-கள் மேம்படுத்தப்படும்போது, எந்தெந்த சேவைகளுக்கு restart அல்லது reboot தேவை என்பதைச் சரிபார்த்தல் என்ற செயல்முறைக்கு ஒரு நிமிடம் ஒதுக்குவது அவசியமாகும்.
FAQ
Rocky Linux-ல் port-ஐ மாற்றிய பிறகு sshd ஏன் தொடங்கவில்லை?
பெரும்பாலான நேரங்களில் SELinux port label விடுபட்டிருப்பதே இதற்குக் காரணம். sshd என்பது sshd_t domain-ல் கட்டுப்படுத்தப்பட்ட நிலையில் இயங்குகிறது. கொள்கையின்படி, ssh_port_t என label செய்யப்பட்ட port-களில் மட்டுமே அது bind செய்ய அனுமதிக்கப்படும்; இயல்பாக இது port 22-க்கு மட்டுமே பொருந்தும். Kernel இந்த bind-ஐ மறுப்பதால், daemon listening நிலைக்குச் செல்லாமல் வெளியேறிவிடும். அப்போது journalctl -u sshd-ல் error: Bind to port 2222 on 0.0.0.0 failed: Permission denied. என்ற வடிவிலான வரி பதிவாகியிருக்கும். உங்கள் port எண்ணைப் பயன்படுத்தி sudo semanage port -a -t ssh_port_t -p tcp 2222 கட்டளையை இயக்கவும், பின் service-ஐ restart செய்யவும். semanage கட்டளை கிடைக்கவில்லை எனில், முதலில் policycoreutils-python-utils-ஐ நிறுவவும்.
SELinux permissive mode-ல் இருந்தால் எனக்கு இன்னும் semanage தேவையா?
ஆம், தேவை. Permissive mode-ல், அனுமதி மறுக்கப்பட்டாலும் அது பதிவாகுமே தவிர, bind செய்ய அனுமதிக்கப்படும். எனவே, மாற்றம் சரியாக வேலை செய்வது போலத் தோன்றும். ஆனால், label இன்னும் விடுபட்டே இருக்கும். யாராவது setenforce 1 கட்டளையை இயக்கும்போதோ, அல்லது /etc/selinux/config-ல் SELINUX=enforcing என அமைத்து கணினி reboot செய்யப்படும்போதோ, sshd அந்த port-ல் இயங்குவதை நிறுத்திவிடும். Label-ஐச் சேர்ப்பது ஒரு கட்டளை மட்டுமே; இது பல வாரங்களுக்குப் பிறகு எந்தக் காரணமும் தெரியாமல் ஏற்படும் தோல்வியைத் தவிர்க்கும்.
Port label செய்யப்பட்டு sshd இயங்குகிறது, பின் ஏன் connection time out ஆகிறது?
Daemon இயங்குகிறது என்றால் SELinux-ன் நிபந்தனைகள் பூர்த்தியாகிவிட்டன என்று பொருள். எனவே, packet உள்ளே வரும் வழியில் தடுக்கப்படுகிறது. உங்கள் port-க்காக sudo firewall-cmd --list-ports-ஐச் சரிபார்க்கவும். --permanent விதியைச் சேர்த்த பிறகு firewall-cmd --reload கட்டளையை இயக்கினீர்களா என்பதை உறுதிப்படுத்தவும்; ஏனெனில், நிரந்தர விதி (permanent rule) மட்டும் இயங்கும் firewall-ல் உடனடியாகச் செயல்படாது. அதன் பிறகு, VPS-க்கு முன்னால் ஏதேனும் network firewall உள்ளதா என உங்கள் host-ன் control panel-ல் சரிபார்க்கவும். இதுவே பயனர்கள் தடுக்கப்படும் இரண்டாவது பொதுவான இடம்; இதை operating system-க்குள் இருந்து பார்க்க முடியாது.
22-க்கு பதிலாக நான் எந்த port-ஐப் பயன்படுத்த வேண்டும்?
1024 முதல் 65535 வரையிலான எந்தவொரு இலவச TCP port-ஐயும் பயன்படுத்தலாம். உண்மையான server-களில் 2222 மற்றும் 22222-ஐத் தவிர்க்கவும், ஏனெனில் scanners 22-க்கு அடுத்தபடியாக இதையே சோதிக்கும். sudo ss -tlnp மூலம் அந்த எண் காலியாக உள்ளதா என்பதை உறுதிப்படுத்தவும். sudo semanage port -l மூலம் SELinux கொள்கை ஏற்கனவே அதை ஒதுக்கிவிட்டதா எனச் சரிபார்க்கவும். எதிர்காலத்தில் நீங்கள் நிறுவக்கூடிய எந்தவொரு service-க்கும் ஒதுக்கப்பட்ட port-ஐத் தவிர்க்கவும். நினைவில் கொள்ள முடியாத பெரிய எண் சிறந்தது, ஏனெனில் அதை ஒருமுறை ~/.ssh/config-ல் எழுதிவிட்டால், மீண்டும் நீங்கள் தட்டச்சு செய்ய வேண்டியிருக்காது.