RDP Monster

Ubuntu'da SSH Etkinleştirme: OpenSSH Kurulumu ve Sıkılaştırma

Ubuntu'da SSH Etkinleştirme: OpenSSH Kurulumu ve Sıkılaştırma

Ubuntu'da SSH'ı etkinleştirin: kurun, başlatın, güvenlik duvarını açın

Ubuntu'da SSH openssh-server paketinden gelir. Ubuntu Server kurulum sırasında bunu yüklemeyi önerir ve neredeyse her bulut veya VPS imajı zaten dinleyen bir sshd ile gelir; Ubuntu Desktop ise onu hiç kurmaz.

1. openssh-server paketini kurun

sudo apt update
sudo apt install -y openssh-server

Paket zaten kuruluysa apt bunu bildirir ve hiçbir şeyi değiştirmez. Kurulum ayrıca 3. adımda kullanılan OpenSSH adlı bir UFW uygulama profili kaydeder.

2. Servisi etkinleştirin ve başlatın

sudo systemctl enable --now ssh
systemctl status ssh

Ubuntu'da birimin adı ssh'tır; sshd bir takma addır. enable --now arka plan servisini hem şimdi hem de her açılışta başlatır. Ubuntu 22.10'dan bu yana sshd soket ile etkinleştirilir: portu 22 ssh.socket sahiplenir ve ilk gelen bağlantıda ssh.service başlatılır; bu yüzden kurulumun hemen ardından TriggeredBy: ssh.socket ile birlikte görülen inactive (dead) durumu normaldir, port açıktır. Genel görünüm için systemctl ile servisleri listeleme yazısına bakın.

3. UFW üzerinden SSH'a izin verin

Ubuntu UFW'yi devre dışı olarak gönderir. Etkinleştirecekseniz önce SSH'a izin verin; kural yokken güvenlik duvarını açmak, uzak bir makinede kendinizi dışarıda bırakmanın klasik yoludur.

sudo ufw allow OpenSSH
sudo ufw enable
sudo ufw status

ufw allow OpenSSH uygulama profilini kullanır ve 22/tcp portunu açar. Daha sonra sshd'yi taşırsanız yeni porta sudo ufw allow 2222/tcp ile izin verin ve eski kuralı silin. Sunucunun adresini hostname -I ile bulun.

Windows, macOS veya Linux'tan bağlanın

Güncel tüm masaüstü işletim sistemlerinde yerleşik bir OpenSSH istemcisi vardır ve söz dizimi her yerde aynıdır:

ssh username@SERVER_IP
ssh -p 2222 username@SERVER_IP      # non-default port
  • Windows 10 ve 11: PowerShell veya Windows Terminal açıp komutu yazın; OpenSSH istemcisi 2018'den (sürüm 1809) beri Windows ile birlikte gelir. ssh tanınmıyorsa Ayarlar > Uygulamalar > İsteğe bağlı özellikler altından ekleyin.
  • macOS: Terminal, aynı komut.
  • Linux: herhangi bir terminal; openssh-client Ubuntu'da varsayılan olarak kuruludur.

İlk bağlantıda sunucunun host anahtarı parmak izini yes yazarak kabul edin; bu bilgi ~/.ssh/known_hosts dosyasında saklanır ve değişirse uyarılırsınız. Ardından hesap parolasını girin. Sonraki bölüm onun yerine bir anahtar koyuyor.

Anahtar tabanlı kimlik doğrulamaya geçin

Botnetlerin gece gündüz kaba kuvvetle denediği şey parola girişleridir; anahtarlar bu denemeleri anlamsız kılar. Kendi bilgisayarınızda, asla sunucuda değil, bir Ed25519 anahtar çifti üretin:

ssh-keygen -t ed25519 -C "laptop-2026"

Varsayılan yolu (~/.ssh/id_ed25519) kabul edin ve bir parola cümlesi belirleyin; bu, özel anahtarı diskte şifreler ve bir SSH agent sayesinde oturum başına yalnızca bir kez yazarsınız. Makinenizden yalnızca .pub dosyası çıkar.

Genel anahtarı sunucuya kopyalayın

macOS ve Linux'ta ssh-copy-id bunu tek adımda, parolanızı son bir kez kullanarak yapar:

ssh-copy-id -i ~/.ssh/id_ed25519.pub username@SERVER_IP

OpenSSH'ın Windows sürümü ssh-copy-id içermez; anahtarı PowerShell'den boru ile gönderin:

type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh username@SERVER_IP "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

Her iki yöntem de anahtarı ilgili kullanıcının ~/.ssh/authorized_keys dosyasına ekler. İzinler önemlidir: ~/.ssh dizini 700 modunda değilse veya authorized_keys sahibinden başkası tarafından yazılabiliyorsa sshd dosyayı sessizce yok sayar. Yeni bir terminalde ssh username@SERVER_IP artık hesap parolası olmadan giriş yapmalıdır. Bu çalışmadan sonraki bölüme geçmeyin.

sshd_config sıkılaştırma: parola yok, root yok, izin listesindeki kullanıcılar

Düzenleme yaparken mevcut oturumunuzu açık tutun; yeni yapılandırma bir şeyi bozarsa geri dönüş yolunuz odur. /etc/ssh/sshd_config dosyası Include /etc/ssh/sshd_config.d/*.conf ile başlar ve sshd her anahtar sözcük için okuduğu ilk değeri korur; yani bir drop-in, ana dosyada daha aşağıda yer alan her şeyi geçersiz kılar. Ayrıca bulut imajları çoğu zaman PasswordAuthentication yes içeren bir /etc/ssh/sshd_config.d/50-cloud-init.conf dosyasıyla gelir; ana dosyayı düzenlemenin sık sık hiçbir işe yaramamış gibi görünmesinin nedeni budur. Çözüm, adı sıralamada önce gelen bir drop-in dosyasıdır:

sudo nano /etc/ssh/sshd_config.d/00-hardening.conf

Aşağıdakini yapıştırın ve username yerine kendi kullanıcı adınızı yazın:

PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
PermitRootLogin no
AllowUsers username
MaxAuthTries 3
LoginGraceTime 30
X11Forwarding no
ClientAliveInterval 300
ClientAliveCountMax 2

PermitRootLogin no, sudo yetkisi olan yetkisiz bir hesabınız olduğunu varsayar. Şimdiye kadar root olarak çalıştıysanız, dosyayı uygulamadan önce Linux'ta sudo kullanıcısı oluşturun ve anahtarınızı ona kopyalayın. Ardından söz dizimini doğrulayın, yeniden yükleyin ve tüm include'lar birleştirildikten sonra sshd'nin gerçekte kullandığı değerleri kontrol edin. sshd -T tam olarak bunu yazdırır:

sudo sshd -t
sudo systemctl reload ssh
sudo sshd -T | grep -Ei 'passwordauthentication|permitrootlogin|allowusers|port'

İlkini kapatmadan önce ikinci bir terminal açıp anahtarınızla giriş yapın. Her yönergenin işlevi:

YönergeDeğerEtki
PasswordAuthenticationnoYalnızca anahtar; parola kaba kuvveti yavaş değil, imkânsız hale gelir.
KbdInteractiveAuthenticationnoPAM'in parolalar için kullanabileceği soru-cevap yolunu kapatır (eskiden ChallengeResponseAuthentication).
PermitRootLoginnoRoot, anahtarla olsun olmasın SSH üzerinden giriş yapamaz; sudo kullanın.
AllowUserskullanıcı adlarınızListede olmayan kullanıcılar kimlik doğrulamadan önce reddedilir; [email protected]/24 bir kullanıcıyı bir ağa sabitler.
MaxAuthTries3Bağlantı başına üç başarısız deneme, sonra bağlantı kesilir.
LoginGraceTime30Kimliği doğrulanmamış bağlantılar 30 saniye sonra kesilir.
ClientAliveInterval / ClientAliveCountMax300 / 2Sessiz bir istemciyi beş dakikada bir yoklar ve yanıtsız iki yoklamadan sonra bağlantıyı düşürür; canlı istemciler otomatik yanıt verir.
X11ForwardingnoGrafik uygulamaları yönlendirmiyorsanız kapalı.

Keepalive'ın bir de istemci tarafı vardır: kendi makinenizdeki ~/.ssh/config dosyasına eklenen ServerAliveInterval 60, NAT yönlendiricilerinin boşta kalan oturumları düşürmesini engeller.

SSH portunu değiştirmek güvenlik değildir

sshd'yi 22 portundan taşımak yaygın bir tavsiyedir. Kazandırdığı şey daha az log satırıdır. Toplu tarayıcılar 65.535 portun tamamını tarar ve sshd'yi 2222'de saatler içinde bulur; sizi hedefleyen biri nmap ile saniyeler içinde bulur. Güvenliği anahtarlar, root girişinin kapalı olması, bir izin listesi ve fail2ban sağlar; port kozmetiktir. Yine de yoğun bir sunucuda kimlik doğrulama logunu okunabilir tutarak işe yarar, ama asla bir savunma katmanı saymayın.

Değiştirecekseniz şu sırayı koruyun: yeni portu UFW'de açın, portu değiştirin, yeniden başlatın, ikinci bir terminalden test edin, sonra eski kuralı kaldırın. /etc/ssh/sshd_config dosyasındaki #Port 22 satırının yorumunu kaldırın, yeni portu yazın ve ardından:

sudo ufw allow 2222/tcp
sudo sshd -t
sudo systemctl daemon-reload
sudo systemctl restart ssh.socket    # Ubuntu 22.10 and later
sudo systemctl restart ssh           # Ubuntu 22.04 and earlier

Soket ile etkinleştirilen sürümlerde hangi portun bağlanacağına sshd değil soket birimi karar verir; Ubuntu, daemon-reload sırasında sshd yapılandırmasından Port değerini okuyup ssh.socket birimini güncelleyen bir systemd üreteci ile gelir. sudo ss -tlnp | grep sshd ile doğrulayın. Çıktıyı Linux'ta açık portları kontrol etme rehberi açıklıyor. sshd inatla hâlâ 22'deyse soket etkinleştirmesini kapatın ve portu servisin kendisi bağlasın: sudo systemctl disable --now ssh.socket && sudo systemctl enable --now ssh.service. Yeni bir terminalde ssh -p 2222 çalıştığında sudo ufw delete allow OpenSSH komutunu çalıştırın.

fail2ban ekleyin ve iki faktörlü kimlik doğrulamayı düşünün

Parolalar kapalıyken kaba kuvvet başarılı olamaz, ama her deneme yine de bir fork ve bir log satırına mal olur. fail2ban kimlik doğrulama logunu izler ve tekrar tekrar başarısız olan adresleri yasaklar:

sudo apt install -y fail2ban
sudo nano /etc/fail2ban/jail.local

Dosyaya şunu koyun:

[sshd]
enabled = true
port = ssh
backend = systemd
maxretry = 5
findtime = 10m
bantime = 1h
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd

jail.conf dosyasını asla düzenlemeyin; yükseltmelerde değiştirilir ve jail.local onu geçersiz kılar. port = ssh değeri /etc/services üzerinden çözülür, bu nedenle arka plan servisini taşıdıysanız port = 2222 yazın. backend = systemd journal'ı doğrudan okur ve imajınız /var/log/auth.log yazsa da yazmasa da çalışır. fail2ban-client status sshd yasaklı adresleri listeler; sudo fail2ban-client set sshd unbanip 203.0.113.7 birini serbest bırakır. Varsayılan olarak fail2ban'ın kuralları UFW'ninkilerden önce değerlendirilir, dolayısıyla ikisi bir arada çalışır.

İki faktörlü kimlik doğrulama

Anahtar artı parola cümlesinin yetmediği durumlarda libpam-google-authenticator anahtarın üstüne zaman tabanlı bir kod ekler: paketi kurun, giriş yapan kullanıcı olarak google-authenticator komutunu çalıştırın, /etc/pam.d/sshd dosyasına auth required pam_google_authenticator.so satırını ekleyin (ve oradaki @include common-auth satırını yoruma alın), ardından sshd'de KbdInteractiveAuthentication yes ve AuthenticationMethods publickey,keyboard-interactive ayarlayın. Çalınan bir dizüstü bilgisayara karşı gerçek bir kazanç ve kaybedilecek bir şey daha: yedek kodları sunucuda tutmayın.

Sorun giderme: connection refused, timed out, permission denied

Connection refused

Sunucu yanıt verdi ama o portta hiçbir şey dinlemiyor: sshd durdurulmuş, başka bir yere bağlanmış ya da yanlış port yazmışsınızdır. Sağlayıcının konsolundan systemctl status ssh ve sudo ss -tlnp | grep ssh komutlarını çalıştırın. Bir söz dizimi hatası sshd'nin hiç başlamamasına yol açar; sudo sshd -t hatalı satırı yazdırır ve journalctl -u ssh -n 50 son başlatmayı gösterir.

Connection timed out

Paketler reddedilmiyor, düşürülüyor; bu neredeyse her zaman bir güvenlik duvarı demektir: izin kuralı olmayan UFW (sudo ufw status verbose), sağlayıcı panelindeki bir güvenlik grubu ya da giden 22 portunu engelleyen kendi ağınız. Telefon hotspot'u bunu eler. ssh -v username@SERVER_IP el sıkışmanın nerede takıldığını gösterir.

Permission denied (publickey)

Sunucuya erişiliyor ama sizi reddediyor. Sırayla kontrol edin: kullanıcı adı, o kullanıcının authorized_keys dosyasının sunduğunuz anahtarı içerip içermediği (ssh -i ~/.ssh/id_ed25519 -v belirli bir anahtarı zorlar), ~/.ssh izinleri ve kullanıcı adının AllowUsers listesinde eksik olup olmadığı. Sunucuda journalctl -u ssh -n 30 nedeni söyler; Authentication refused: bad ownership or modes yukarıda anlatılan izin sorunudur.

Host anahtarı uyarısı

Bir yeniden kurulumun ardından görülen WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED beklenen bir durumdur: ssh-keygen -R SERVER_IP komutunu çalıştırıp yeniden bağlanın. Hiçbir şey yeniden kurmadıysanız, herhangi bir yere parola yazmadan önce nedenini öğrenin. Tamamen dışarıda mı kaldınız? Geri dönüş yolu sağlayıcının konsoludur.

Yukarıdakilerin tamamı, root yetkisine sahip olduğunuz ve sshd'yi bozup bir konsoldan onarmayı göze alabileceğiniz bir makineyi varsayar. rdp.monster'dan bir Linux VPS tam olarak böyle bir makinedir: tam root erişimi, ayrılmış CPU ve RAM, sınırsız (adil kullanım) bant genişliği, KYC yok, kripto veya fiat ile ödeme, aylık $8.99'dan başlayan fiyatlar ve sunucu ödeme onaylandıktan yaklaşık 10 saniye sonra çevrimiçi. Bu, ilk tarayıcı 22 portunu bulmadan anahtarlarınızı yerleştirmek için fazlasıyla yeterli.

Sık sorulan sorular

Ubuntu varsayılan olarak SSH etkin mi gelir?

Ubuntu Desktop gelmez; Ubuntu Server ve çoğu bulut imajı gelir.
Ubuntu Desktop yalnızca SSH istemcisini kurar, dolayısıyla sudo apt install openssh-server komutunu çalıştırana kadar 22 portunda hiçbir şey dinlemez. Ubuntu Server kurulum sırasında OpenSSH sunucusunun kurulup kurulmayacağını sorar ve aynı anda GitHub veya Launchpad anahtarlarınızı içe aktarabilir. Bulut ve VPS imajları neredeyse her zaman openssh-server kurulu, etkin ve bağlantı kabul eder halde gelir, çünkü sağlayıcının makineyi size teslim etmesinin tek yolu budur. systemctl status ssh ile kontrol edin.

Ubuntu'da SSH'ın çalışıp çalışmadığını nasıl kontrol ederim?

systemctl status ssh komutunu çalıştırın, ardından 22 portunun dinlendiğini ss ile doğrulayın.
systemctl status ssh servisin etkin veya açılışta başlatılıyor olup olmadığını söyler. Ubuntu 22.10 ve sonrası soket etkinleştirmesi kullandığından, kimse bağlı değilken servis haklı olarak TriggeredBy: ssh.socket ile birlikte inactive (dead) görünebilir; bu yüzden daha güvenilir test sudo ss -tlnp | grep ssh komutudur: 0.0.0.0:22 veya [::]:22 gösteren bir satır SSH'ın dinlediği anlamına gelir. Başka bir makineden ssh -v username@SERVER_IP bunu uçtan uca doğrular.

SSH'ı 22 portunda bırakmak güvenli mi?

Parolalar kapalıysa ve anahtar kullanılıyorsa evet; port numarası ek koruma sağlamaz.
22 portu sürekli otomatik giriş denemeleri çeker, ancak bu denemeler PasswordAuthentication no ayarına ve bir anahtar çiftine sahip bir sunucuda başarılı olamaz; fail2ban da gürültünün çoğunu temizler. sshd'yi 2222 veya 22222'ye taşımak onu yalnızca en tembel tarayıcılardan gizler; nmap ve masscan gibi port tarayıcıları dakikalar içinde bulur ve internet çapındaki dizinler onu zaten listeler. Varsayılan olmayan bir portu bir güvenlik denetimi değil, log hijyeni önlemi olarak görün ve portu değiştirdiniz diye asla anahtarları atlamayın.

Ubuntu'da ssh ile sshd arasındaki fark nedir?

ssh istemci programıdır; sshd ise sunucu arka plan servisidir ve Ubuntu birimi ssh adını, sshd ise takma adı taşır.
ssh bağlantı açmak için dizüstü bilgisayarınızda çalıştırdığınız istemcidir; openssh-client paketinden gelir. sshd ise sunucuda yanıt veren arka plan servisidir, openssh-server paketinden gelir ve /etc/ssh/sshd_config dosyasında yapılandırılır (istemci ssh_config dosyasını okur). Ubuntu ve Debian systemd birimini ssh.service olarak adlandırır ve sshd.service adını takma ad olarak tanımlar; bu yüzden systemctl restart ssh ile systemctl restart sshd aynı işi yapar. Fedora, RHEL ve Arch'ta ise birimin adı yalnızca sshd'dir.

Adrien Roche, Altyapı ve Hosting Editörü

Windows Server ve Linux filolarını 10+ yıldır işleten sistem mühendisi. Adrien, rdp.monster altyapı dokümantasyonunu yönetir ve RDP, VPS hosting, sunucu yönetimi, ağ ve gizlilik araçları üzerine rehberlerimizi yazar.

Bayilik programımıza kaydolun

Bilgileriniz

Ad Soyad(Zorunlu)
E-posta adresinizi girin, şu adreste bir hesabınız olmalı: manager.rdp.monster !

Şirketiniz

Varsa web sitenizin adresini girin
Hizmetleri müşterilerinize nasıl satacağınızı kısaca anlatın; örneğin forumlarda insanlarla konuşarak.

Canavarlar bile çerezlere bayılır!

Tarama deneyiminizi geliştirmek, kişiselleştirilmiş reklam veya içerik sunmak ve trafiğimizi analiz etmek için çerez kullanıyoruz. «Kabul Et»'e tıklayarak çerez kullanımımızı onaylarsınız.