Rocky Linux-ல் SSH port-ஐ மாற்றுவது எப்படி?
Rocky Linux மற்றும் AlmaLinux-ல் SSH port-ஐ மாற்றும்போது firewalld, SELinux மற்றும் sshd_config ஆகியவற்றை எவ்வாறு சரியாக உள்ளமைப்பது என்பதை இந்த வழிகாட்டி விளக்குகிறது.
SSH port-ஐ மாற்றுவதற்கு ஏன் மூன்று நிலைகள் தேவைப்படுகின்றன
Rocky Linux, AlmaLinux, CentOS Stream அல்லது Fedora ஆகியவற்றில் SSH port-ஐ மாற்ற, ஒரு திருத்தம் மட்டும் போதாது. புதிய port-ல் இணைப்பு செயல்படுமா என்பதைத் தீர்மானிப்பதில் மூன்று தனித்தனி அமைப்புகள் பங்கு வகிக்கின்றன. பாக்கெட் கணினியை வந்தடைகிறதா என்பதை firewalld தீர்மானிக்கிறது. அந்த port எண்ணைப் பயன்படுத்த sshd அனுமதிக்கப்படுகிறதா என்பதை SELinux தீர்மானிக்கிறது. daemon எந்த port-ஐக் கேட்க வேண்டும் என்பதை sshd_config தீர்மானிக்கிறது. SELinux நிலையைத் தவறவிட்டால், daemon தொடங்க மறுத்துவிடும். firewalld நிலையைத் தவறவிட்டால், daemon தொடங்கும், port-ல் காத்திருக்கும், ஆனால் யாராலும் அதை அணுக முடியாது.
Ubuntu-வில் இதே பணியைச் செய்ய ஒரு திருத்தம் மற்றும் restart மட்டும் போதும். ஏனெனில், Ubuntu SELinux-க்கு பதிலாக AppArmor-ஐப் பயன்படுத்துகிறது, மேலும் sshd எந்த port-களைப் பயன்படுத்தலாம் என்று கட்டுப்படுத்தும் profile எதையும் அது கொண்டிருக்கவில்லை. அங்கு ufw இயங்கிக்கொண்டிருந்தால், ஒரு விதியை மட்டும் சேர்த்தால் போதும். இதுவே அடிப்படை வித்தியாசம். RHEL குடும்பத்தில் புதிய நிறுவலின்போதே firewalld இயங்கிக்கொண்டிருக்கும் மற்றும் SELinux enforcing நிலையில் இருக்கும்; இவை இரண்டுமே port எண்களைக் கண்காணிக்கும்.
இந்த வரிசையில் பணிகளைச் செய்யுங்கள், அப்போதுதான் ஒவ்வொரு நிலையிலும் உங்கள் தற்போதைய session துண்டிக்கப்படாமல் இருக்கும்:
- firewalld-ல் புதிய port-ஐத் திறக்கவும், தற்போதைக்கு port 22-ஐத் திறந்து வைக்கவும்.
semanageமூலம் புதிய port-க்கு SELinux label-ஐச் சேர்க்கவும்.- sshd configuration-ல் port-ஐ அமைக்கவும்.
sshd-ஐ restart செய்யவும், பின்னர் முதல் terminal-ஐ மூடுவதற்கு முன்பு இரண்டாவது terminal மூலம் புதிய port-ல் login செய்யவும்.
நீங்கள் தொடங்குவதற்கு முன், உங்கள் சேவை வழங்குநரின் 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-ஐத் தேர்ந்தெடுத்து, அது எதற்கும் ஒதுக்கப்படவில்லை என்பதை உறுதிப்படுத்துதல்
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-கள் VPS-க்கு முன்னால், operating system-க்கு வெளியே ஒரு network firewall-ஐ இயக்குகின்றன. எனவே, நீங்கள் firewalld-ல் திறந்த port கூட upstream-ல் தடுக்கப்படலாம். VPS-க்கான firewalld அடிப்படை வழிகாட்டி இந்த முறை உங்களுக்குப் புதியது என்றால், zones மற்றும் runtime-க்கும் permanent-க்கும் இடையிலான வேறுபாடுகளை விளக்குகிறது.
படி 2: SELinux-க்காக port-ஐ லேபிளிடுதல்
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 ports கொண்டிருக்கும் வகையாகும். இரண்டாவது கட்டளை ssh_port_t தற்போது உள்ளடக்கியுள்ள அனைத்தையும் பட்டியலிடுகிறது, எனவே daemon-ஐ மாற்றும் முன் உங்கள் port எண் சேர்க்கப்பட்டதை நீங்கள் உறுதிப்படுத்திக் கொள்ளலாம்.
SELinux ஏன் அந்த port-ஐத் தடுக்கிறது
SELinux (security-enhanced Linux) கணினியில் உள்ள ஒவ்வொரு பொருளுக்கும் ஒரு label-ஐ வழங்குகிறது; TCP port எண்களும் மற்ற பொருட்களைப் போலவே கருதப்படுகின்றன. SSH daemon, sshd_t எனப்படும் domain-க்குள் கட்டுப்படுத்தப்பட்டு இயங்குகிறது. கொள்கையின்படி (policy), sshd_t-க்கு ssh_port_t என label செய்யப்பட்ட TCP port-களில் bind செய்ய அனுமதி உண்டு. இயல்பாக, 22 என்ற port மட்டுமே அந்த label-ஐக் கொண்டுள்ளது. நீங்கள் 2222-ல் bind செய்ய முயற்சிக்கும்போது, kernel அந்த label-ஐச் சரிபார்க்கிறது; அந்த எண்ணிற்கு ஒதுக்கப்பட்ட பொதுவான வகை (generic type) கொள்கையுடன் ஒத்துப்போகாததால், socket-க்கான name_bind அனுமதியை அது மறுக்கிறது.
இதனால்தான் இந்தத் தோல்வி ஒரு firewall சிக்கலைப் போலத் தெரிவதில்லை. Listening socket உருவாவதற்கு முன்பே kernel அதைத் தடுத்துவிடுகிறது; எனவே, sshd பிழையைப் பதிவு செய்துவிட்டு வெளியேறுகிறது. Firewall சிக்கல் இதற்கு நேர்மாறானது: அங்கு daemon இயங்கிக்கொண்டிருக்கும், ஆனால் வரும் packets வழியிலேயே நிராகரிக்கப்படும்.
getenforce உங்கள் கணினி எந்த mode-ல் உள்ளது என்பதைக் காட்டும். Permissive நிலையில், ஒரு மறுப்பு (denial) பதிவு செய்யப்படும், ஆனால் அது அமல்படுத்தப்படாது. இதனால் port மாற்றம் வேலை செய்வது போலத் தோன்றும், ஆனால் யாராவது setenforce 1 கட்டளையை இயக்கும்போதோ அல்லது கணினி reboot ஆகி enforcing mode-க்குச் செல்லும்போதோ அது செயலிழந்துவிடும். எனவே, எந்த நிலையிலும் port-க்கு label இடுவது அவசியம். server-க்கான SELinux அடிப்படை வழிகாட்டி-யில் modes, contexts மற்றும் booleans பற்றிய விரிவான தகவல்கள் உள்ளன.
படி 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 -tRocky Linux 8 மற்றும் பிற பழைய images-ல் இருப்பது போல, grep-ல் Include வரி இல்லை என்றால், Port 2222-ஐ நேரடியாக /etc/ssh/sshd_config-ல் சேர்க்கவும். sshd -t முழு configuration-ஐயும், drop-in கோப்புகளையும் சேர்த்து ஆய்வு செய்து, syntax பிழைகள் ஏதேனும் இருந்தால் தெரிவிக்கும். நீங்கள் restart செய்வதற்கு முன்பே அதில் உள்ள பிழைகளைச் சரிசெய்யவும்; ஏனெனில், configuration-ல் பிழை இருந்தால் daemon மீண்டும் இயங்காது.
Port பலமுறை இடம்பெறலாம், மேலும் பட்டியலிடப்பட்டுள்ள அனைத்து port-களிலும் sshd listening நிலையில் இருக்கும். முதல் நாள் மட்டும் 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 ஆகிய இரண்டு port-களிலும் தொடர்ந்து listen செய்யும். இதை sudo systemctl daemon-reload மூலம் செயல்படுத்தி, பின் sudo systemctl restart sshd.socket-ஐ இயக்கவும். உங்கள் server-ல் இந்த unit முடக்கப்பட்டிருந்தாலோ அல்லது இல்லையென்றாலோ, இந்தப் பகுதி உங்களுக்குப் பொருந்தாது.
படி 4: restart செய்யவும், பின் இரண்டாவது terminal-லிருந்து சோதிக்கவும்
sudo systemctl restart sshd
systemctl status sshd
sudo ss -tlnp | grep sshdஇந்த terminal-ஐ அப்படியே வைத்திருக்கவும். இதிலிருந்து log out செய்ய வேண்டாம். உங்கள் கணினியில் இரண்டாவது terminal-ஐத் திறந்து, புதிய port-ல் connect செய்யவும்:
ssh -p 2222 youruser@203.0.113.10இரண்டாவது login சரியாக வேலை செய்த பிறகு மட்டுமே முதல் session-ஐ மூடவும். ஒருவேளை அது வேலை செய்யவில்லை என்றால், உங்களிடம் இன்னும் shell இருக்கும், அதன் மூலம் நீங்கள் செய்த மாற்றங்களை ரத்து செய்யலாம். இந்த ஒரு பழக்கம் தான், ஐந்து நிமிட வேலையை ஒரு மதிய நேரப் போராட்டமாக மாற்றாமல் தடுக்கும்.
Firewall drop அல்லது SELinux denial? இரண்டையும் வேறுபடுத்துவது எப்படி
உங்கள் laptop-லிருந்து பார்க்கும்போது இந்த இரண்டு தோல்விகளும் ஒரே மாதிரியாகத் தோன்றும். ஆனால் server-ல் இவை முற்றிலும் வேறானவை.
systemctl status sshdகட்டளை service தோல்வியடைந்ததைக் காட்டினால், 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-pagername_bind denial, tcp_socket class-ல், comm="sshd"-ல் உள்ள process-ஐயும், src=-ல் உள்ள port எண்ணையும், tcontext=-ல் அந்த port தற்போது கொண்டுள்ள label-ஐயும் குறிப்பிடும். அந்த கடைசி field-தான் விடை. ssh_port_t என்பதைத் தவிர வேறு எது இருந்தாலும், நீங்கள் பயன்படுத்தும் port-க்கு step 2 பொருந்தவில்லை என்று அர்த்தம். பொதுவாக இது port எண்ணில் உள்ள தட்டச்சுப் பிழையாகவோ அல்லது தவறான protocol-ஆகவோ இருக்கலாம். audit பதிவை வாக்கியமாக மாற்ற sealert-ஐப் பயன்படுத்த விரும்பினால், setroubleshoot-server-ஐ நிறுவவும்.
Kernel bind செய்ய மறுக்கும்போது sshd எழுதும் செய்தி இதோ:
error: Bind to port 2222 on 0.0.0.0 failed: Permission denied.1024-க்கு மேல் உள்ள port-ல் Permission denied ஏற்படுவது, bind செய்ய root privilege தேவையில்லை என்பதால், அது SELinux-ன் அறிகுறியாகும். அதே வரியில் உள்ள Address already in use ஒரு வேறுபட்ட பிழை: வேறொரு process அந்த port-ஐப் பிடித்து வைத்திருக்கிறது என்று அர்த்தம். Client பக்கத்திலிருந்து, connection refused மற்றும் connection timed out ஆகியவற்றுக்கு இடையேயான வேறுபாடு இந்த இரண்டு network சிக்கல்களையும் பிரித்தறிய உதவும். ஏனெனில், connection refused என்றால் உங்கள் packet host-ஐ அடைந்துவிட்டது, ஆனால் அங்கே எந்த service-ம் listening நிலையில் இல்லை என்று பொருள். connection timed out என்றால், எந்த பதிலும் வரவில்லை என்று பொருள்.
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 ஒப்பீடு பகுதியைப் பார்க்கவும். எந்தவொரு பழைய வழிகாட்டியையும் பின்பற்றும் முன், 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 என்ற port-க்கு மாறுகிறது. நீங்கள் மாற்றிய பிறகு, இந்த jail யாரும் தாக்காத ஒரு port-ஐக் கண்காணிக்கும். எனவே, 2222 port-ல் தோல்வியுற்ற 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-ஐ மாற்றுவதை விட patch செய்வது முக்கியம்
SSH port-ஐ மாற்றியமைத்து, நான்கு மாதங்களாக security updates செய்யப்படாத server, port 22-ல் இயங்கி தினமும் தானாகவே patch செய்துகொள்ளும் server-ஐ விட அதிக ஆபத்தில் உள்ளது. நீங்கள் ஏற்கனவே root-ஆக இருக்கும்போதே, அதே session-ல் unattended updates-ஐ இயக்கவும்: Rocky Linux மற்றும் AlmaLinux-ல் தானியங்கி dnf updates என்ற கட்டுரை, இதற்கான timer மற்றும் updates-ஐ பதிவிறக்கம் செய்து நிறுவுவதற்கு இடையிலான தேர்வுகளை விளக்குகிறது.
FAQ
Rocky Linux-ல் port-ஐ மாற்றிய பிறகு sshd ஏன் தொடங்கவில்லை?
பெரும்பாலான நேரங்களில் SELinux port label விடுபட்டிருப்பதே இதற்குக் காரணம். sshd ஆனது sshd_t domain-க்குள் கட்டுப்படுத்தப்பட்ட நிலையில் இயங்குகிறது. கொள்கைப்படி (policy), ssh_port_t என label செய்யப்பட்ட port-களில் மட்டுமே இதை bind செய்ய முடியும்; இயல்பாக இது 22-வது port-க்கு மட்டுமே அனுமதிக்கப்பட்டுள்ளது. 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-ல், அனுமதி மறுக்கப்பட்டாலும் (denial) அந்த 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-ஐத் தவிர்க்கவும், ஏனெனில் scanner-கள் 22-க்கு அடுத்தபடியாக இதையே சோதிக்கும். sudo ss -tlnp மூலம் அந்த எண் காலியாக உள்ளதா என்பதை உறுதிப்படுத்தவும், sudo semanage port -l மூலம் SELinux கொள்கையில் அந்த port ஏற்கனவே ஒதுக்கப்பட்டுள்ளதா எனச் சரிபார்க்கவும். பிற்காலத்தில் நீங்கள் நிறுவக்கூடிய ஏதேனும் service-க்கு ஒதுக்கப்பட்ட port-களைத் தவிர்க்கவும். நினைவில் கொள்ள முடியாத பெரிய எண் இருந்தாலும் பரவாயில்லை, ஏனெனில் அதை ~/.ssh/config-ல் ஒருமுறை மட்டுமே உள்ளிடப் போகிறீர்கள், மீண்டும் தட்டச்சு செய்யத் தேவையில்லை.