[TR] Ubuntu Server’da SSH Servisini Tamamen Kapatmak

[TR] Ubuntu Server’da SSH Servisini Tamamen Kapatmak

Ubuntu Server üzerinde SSH erişimini kapatmak çoğu zaman yalnızca ssh.service servisini durdurmak kadar basit görünür. Ancak bazı Ubuntu sürümlerinde ve OpenSSH yapılandırmalarında systemd socket activation mekanizması devrede olabilir.

Bu durumda SSH servisini durdurmuş olsanız bile sistem 22 numaralı portu dinlemeye devam edebilir ve yeni bir bağlantı geldiğinde SSH servisini tekrar başlatabilir.

Bu nedenle SSH erişimini gerçekten tamamen kapatmak için yalnızca ssh.service değil ssh.socket biriminin de kontrol edilmesi gerekir.

Bu makalemde ssh.service ile ssh.socket arasındaki farkı, karşılaşılan uyarıların nedenini ve SSH erişiminin güvenli şekilde nasıl tamamen devre dışı bırakılacağını ele alacağız.

Karşılaşılan Durum

SSH servisini kapatmak için aşağıdaki komutları çalıştırdığımızı düşünelim.

sudo systemctl stop ssh
sudo systemctl disable ssh.service

Bu işlemler sonrasında aşağıdaki uyarıyla karşılaşabiliriz:

Stopping 'ssh.service', but its triggering units are still active:
ssh.socket

Benzer şekilde:

sudo systemctl stop sshd

komutunda da şu mesaj görülebilir:

Stopping 'sshd.service', but its triggering units are still active:
ssh.socket

Bu mesajın anlamı oldukça nettir. SSH servisi durdurulmuştur ancak onu yeniden başlatabilecek olan ssh.socket hâlâ aktiftir. Yani yeni bir SSH bağlantısı geldiğinde systemd, ssh.service servisini yeniden devreye alabilir.

ssh.service ve ssh.socket Arasındaki Fark Nedir?

SSH erişimini doğru şekilde yönetebilmek için öncelikle bu iki systemd biriminin görevini anlamak gerekir.

ssh.service

ssh.service OpenSSH sunucusunun asıl servisidir.

Durumunu kontrol etmek için:

systemctl status ssh.service

Servisi durdurmak için:

sudo systemctl stop ssh.service

komutu kullanılabilir. Ancak sistemde socket activation aktifse yalnızca ssh.service servisini durdurmak yeterli değildir.

ssh.socket

ssh.socket, SSH bağlantılarını dinleyen systemd socket birimidir.

Durumunu görmek için:

systemctl status ssh.socket

Eğer aşağıdakine benzer bir durum görüyorsanız:

Active: active (listening)

sistem SSH bağlantılarını hâlâ dinliyor demektir.

Yeni bir SSH bağlantısı geldiğinde ssh.socket, gerekli olması durumunda ssh.service servisini otomatik olarak başlatabilir. Bu nedenle yalnızca SSH servisini durdurup socket birimini açık bırakmak SSH erişimini tamamen kapatmak anlamına gelmez.

SSH Erişimini Tamamen Kapatma

SSH’nin hem mevcut durumda durdurulmasını hem de yeniden başlatılmasının engellenmesini istiyorsak en etkili yöntem şudur:

sudo systemctl mask --now ssh.socket ssh.service

Bu komutta iki önemli işlem gerçekleştirilir:

  • --now parametresi aktif olan servisi ve socket birimini hemen durdurur.
  • mask işlemi ise bu birimlerin systemd tarafından tekrar başlatılmasını engeller.

İşlem sonrasında durumu kontrol edebiliriz:

systemctl status ssh.socket ssh.service

Beklenen durum genel olarak şu şekilde olmalıdır:

Loaded: masked
Active: inactive (dead)

Bu durumda SSH hem durdurulmuş hem de yeniden başlatılması engellenmiş olur.

TCP 22 Portunun Gerçekten Kapandığını Kontrol Etme

SSH servisini kapattıktan sonra yapılması gereken en önemli kontrollerden biri, TCP 22 portunun gerçekten dinlenmediğini doğrulamaktır.

Bunun için:

sudo ss -lntp | grep ':22'

komutunu kullanabiliriz.

SSH tamamen kapalıysa bu komutun herhangi bir çıktı üretmemesi gerekir. Tüm dinlenen TCP portlarını görmek için ise:

sudo ss -lntp

komutu kullanılabilir. Eğer aşağıdakine benzer bir satır görüyorsanız:

LISTEN 0 4096 0.0.0.0:22 0.0.0.0:*

TCP 22 portu hâlâ dinleniyor demektir. Bu durumda 22 numaralı portu hangi process’in kullandığını ayrıca incelemek gerekir.

Mevcut SSH Oturumları Devam Edebilir

ssh.service ve ssh.socket kapatılmış olsa bile daha önceden kurulmuş bazı SSH oturumları açık kalabilir.

Aktif SSH process’lerini görmek için:

ps -ef | grep sshd

veya daha temiz bir çıktı için:

pgrep -a sshd

komutunu kullanabiliriz. Eğer mevcut SSH oturumlarının da tamamen kapatılması isteniyorsa:

sudo pkill -KILL sshd

komutu kullanılabilir.

Kritik Uyarı

Bu komut mevcut SSH bağlantılarını anında sonlandırır. Eğer sunucuya o anda SSH üzerinden bağlıysanız, kendi bağlantınız da kesilecektir. Ayrıca SSH servisini öncesinde mask ettiyseniz tekrar SSH bağlantısı kuramazsınız. Bu nedenle böyle bir işlem yapılacaksa sunucuya alternatif bir erişim yöntemi bulunması önerilir.

Örneğin:

  • VMware Console
  • Hyper-V Console
  • Proxmox Console
  • iLO
  • iDRAC
  • IPMI
  • Fiziksel konsol
  • Cloud Provider Console

Önerilen Güvenli Kapatma Sırası

SSH erişimini tamamen kapatmak için aşağıdaki işlem sırası uygulanabilir.

Öncelikle socket ve servis maskelenir:

sudo systemctl mask --now ssh.socket
sudo systemctl mask --now ssh.service

Ardından durum kontrol edilir:

systemctl status ssh.socket
systemctl status ssh.service

Sonrasında TCP 22 portunun dinlenip dinlenmediği kontrol edilir:

sudo ss -lntp | grep ':22'

Mevcut SSH oturumlarının da kapatılması gerekiyorsa:

sudo pkill -KILL sshd

Son olarak port tekrar doğrulanabilir:

sudo ss -lntp | grep ':22'

Komut herhangi bir çıktı üretmiyorsa TCP 22 portunda dinleyen bir SSH servisi bulunmuyor demektir.

stop, disable ve mask Arasındaki Fark

Systemd tarafında en çok karıştırılan konulardan biri stop, disable ve mask komutlarının farkıdır.

systemctl stop

sudo systemctl stop ssh.service

Bu komut servisi o anda durdurur.

Ancak servisin daha sonra başka bir servis, socket veya yönetici tarafından yeniden başlatılmasını engellemez.

Örneğin ssh.socket aktifse SSH yeniden devreye girebilir.

systemctl disable

sudo systemctl disable ssh.service

Bu işlem SSH servisinin normal sistem açılışında otomatik olarak başlamasını engeller. Ancak servis yine manuel olarak veya başka bir systemd unit tarafından başlatılabilir. Bu nedenle;

systemctl disable ssh.service

komutu tek başına SSH erişimini tamamen kapatmak için yeterli değildir.

systemctl mask

sudo systemctl mask ssh.service

mask, servisin systemd tarafından başlatılmasını engelleyen daha güçlü bir işlemdir.

Maskelenmiş bir servis doğrudan:

sudo systemctl start ssh.service

komutuyla dahi normal şekilde başlatılamaz. Bu nedenle bir servisin güvenlik gereksinimleri nedeniyle kesin olarak devre dışı bırakılması gerekiyorsa mask kullanımı daha uygun bir yöntemdir.

Neden ssh.services Komutu Çalışmadı?

Aşağıdaki gibi bir komut kullanıldığında:

sudo systemctl disable ssh.services

şu hata alınabilir:

Failed to disable unit: Unit ssh.services.service does not exist

Buradaki problem servis adının yanlış yazılmasıdır.

Doğru systemd unit adı:

ssh.service

şeklindedir.

Dolayısıyla doğru kullanım:

sudo systemctl disable ssh.service

olmalıdır.

Systemd servislerinde .service ifadesi tekil olarak kullanılır. Standart olarak ssh.services isimli bir unit bulunmaz.

SSH’yi Tekrar Aktif Etme

SSH erişimine daha sonra yeniden ihtiyaç duyulursa önce servis ve socket üzerindeki mask kaldırılmalıdır.

sudo systemctl unmask ssh.service ssh.socket

Ardından SSH servisi tekrar aktif edilebilir:

sudo systemctl enable --now ssh.service

Durumu doğrulamak için:

systemctl status ssh.service

ve port kontrolü için:

sudo ss -lntp | grep ':22'

komutları kullanılabilir.

SSH tekrar dinlemeye başladıysa aşağıdakine benzer bir çıktı görülebilir:

LISTEN 0 4096 0.0.0.0:22 0.0.0.0:*

SSH Socket Activation Kullanılıyor mu?

Sunucuda SSH ile ilişkili systemd birimlerini görmek için:

systemctl list-units --all | grep -E 'ssh|sshd'

komutu kullanılabilir.

Socket birimlerini ayrıca kontrol etmek için:

systemctl list-sockets | grep ssh

komutu kullanılabilir. Eğer çıktıda:

ssh.socket

görülüyorsa SSH tarafında socket activation mekanizması kullanılabiliyor demektir.

Güvenlik Açısından Değerlendirme

Bir sunucuda SSH erişimine ihtiyaç bulunmuyorsa servisin tamamen kapatılması saldırı yüzeyini azaltmak açısından doğru bir yaklaşım olabilir.

Ancak her durumda SSH’yi tamamen kapatmak zorunlu değildir.

Bazı ortamlarda daha uygun yaklaşım, SSH erişimini yalnızca belirli yönetim ağlarıyla sınırlandırmaktır.

Örneğin yalnızca 10.10.10.0/24 yönetim ağından SSH erişimine izin vermek için UFW üzerinde şu şekilde bir kural uygulanabilir:

sudo ufw allow from 10.10.10.0/24 to any port 22 proto tcp

Bu senaryoda SSH servisi çalışmaya devam eder ancak yalnızca yetkilendirilmiş ağlardan bağlantı kabul edilir.

Dolayısıyla uygulanacak yöntem, kurumun güvenlik politikasına ve sunucunun kullanım amacına göre belirlenmelidir.

GereksinimKullanılabilecek yöntem
SSH geçici olarak durdurulsunsystemctl stop ssh.service
Sistem açılışında SSH başlamasınsystemctl disable ssh.service
SSH’nin başlatılması tamamen engellensinsystemctl mask ssh.service
Socket activation kapatılsınsystemctl mask ssh.socket
SSH tamamen kapatılsınsystemctl mask --now ssh.socket ssh.service
Yalnızca belirli ağlardan erişim olsunFirewall kuralı
Mevcut SSH oturumları da kapatılsınpkill -KILL sshd

Ubuntu Server üzerinde SSH erişimini tamamen kapatmak istediğimizde yalnızca:

sudo systemctl stop ssh

komutunu çalıştırmak her zaman yeterli değildir.

Bunun temel nedeni, ssh.socket biriminin aktif kalabilmesi ve yeni bir bağlantı geldiğinde SSH servisini yeniden başlatabilmesidir.

SSH’nin hem çalışmasını hem de otomatik olarak yeniden başlatılmasını engellemek için kullanılabilecek en net yöntem:

sudo systemctl mask --now ssh.socket ssh.service

komutudur.

İşlem sonrasında mutlaka TCP 22 portunun gerçekten kapanıp kapanmadığı doğrulanmalıdır:

sudo ss -lntp | grep ':22'

Herhangi bir çıktı alınmıyorsa SSH artık TCP 22 portunda dinlemiyor demektir.

Özellikle CIS hardening, güvenlik sıkılaştırma, saldırı yüzeyinin azaltılması ve kullanılmayan servislerin kapatılması gibi çalışmalarda yalnızca servisin durumuna bakmak yerine, ilgili socket birimlerinin ve dinlenen ağ portlarının da kontrol edilmesi önemlidir.