SSH’la Şifre Girmeden Uzak Bağlantı Kurmak

Cem Topkaya
10 min readJul 23, 2020

--

SSH Anahtarınız ve Uzak Bilgisayar Hazırsa

type $env:USERPROFILE\.ssh\id_rsa.pub | ssh -o StrictHostKeyChecking=no 192.168.13.50 "cat >> .ssh/authorized_keys"

Özetle Tüm Komutlar

Passphrase olmadan key oluşturup sunucuya yüklemek ve bağlantı kurmak.

Sunucu tarafında sshd servisi çalışır ve 22 portuna gelecek bağlantı isteklerini /etc/ssh/sshd_config dosyasındaki ayarlara göre ayaklandırır. Çalışan sshd hizmetinin geçerli ayarlarını görmek için sshd -T komutuyla görürüz.

sshd -T

ssh-keygen komutu parametre vermezseniz varsayılan olarak 2048bit ve sha256 ile gizli ve açık anahtar oluşturmak isteyecek. Eğer parola girmezseniz aşağıdaki ekran çıktısındaki -q -N "" etkiyi yani parola korumasız bir sertifika çifti yaratmanızı sağlayacak. Bunun artısı, sertifikanızı kullanmanız gerektiğinde ayrıca parolanızı girmenize gerek kalmayacak. Eksi tarafı ise güvenliği elden bırakmış olacaksınız.

C:\Users\cem.topkaya\.ssh>ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (C:\Users\cem.topkaya/.ssh/id_rsa): docker_13_183
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in docker_13_183.
Your public key has been saved in docker_13_183.pub.
The key fingerprint is:
SHA256:Z7ZvCL26nLsyf2Q88EZhXLtWj+wofGnudlIvLlJV8jw ulakhaberlesme\cem.topkaya@CEM-TOPKAYA-PC
The key's randomart image is:
+---[RSA 2048]----+
| . .. |
| + .. .|
| . .. .= |
| . . +.Eo|
| S*+ o.o o|
| .=Oo.+. |
| =+==... |
| o. .=*= o .|
| +O* =+=.. |
+----[SHA256]-----+
C:\Users\cem.topkaya\.ssh>dir
%UserProfile%/.ssh/config
vagrant@ubuntu-xenial:~/.ssh$ cat config
Host 192.168.13.137
Hostname 192.168.13.137
IdentityFile ~/.ssh/13_137
StrictHostKeyChecking no

SSH eğer ilk kez bir bilgisayara kuruluyorsa known_hosts dosyasına bir anahtar eklemek için izin isteyecektir. Eğer bu mesajı görüp yes diye onaylamak istemiyor, otomatik olarak eklensin istiyorsak StrictHostKeyChecking değerine no diyeceğiz.

Referans: ssh-automatically-accept-keys

Şifresiz Özetle:

$ ssh-keygen -b 2048 -t rsa -f 33_10 -q -N ""$ cat 33_10.pub | ssh vagrant@192.168.33.10 "chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"# ssh anahtarlarını ssh-agent uygulaması sunsun diye:
# ssh-agent $SHELL veya eval $(ssh-agent) çalıştırılır
$ eval $(ssh-agent)
# Artık uygulama aktif ve kullanıma hazır anahtarları görüntülemek için:
$ ssh-add -L

# Varsayılan anahtar ikililerini (id_rsa) yüklemek için
$ ssh-add
# Belirli bir anahtarı agent'a yüklemek için
$ ssh-add
33_10
# Agent üstündeki varsayılan anahtarı(~/.ssh/identity.pub) uzak sunucuya yüklemek için:
$ ssh-copy-id -i <uzak-sunucu-adresi>
$ ssh vagrant@192.168.33.10

Kaynak: *

ssh-agent bir hizmet olarak windows’ta çalışır. Bir ssh bağlantısında agent sayesinde ilgili sertifika sunulur. Windows’ta varsayılan olarak yüklü ama çalışmıyor şekilde bekler.

Velev ki yüklü değilse (services.msc) Windows’a ssh-agent kurabilmek için:

https://code.visualstudio.com/docs/remote/troubleshooting#_setting-up-the-ssh-agent

Linux üstünde ssh-agent’ı her login olduğunuzda otomatik çalıştırmak için ~/.bash_profile dosyasında aşağıdaki gibi değişiklikleri yapabilirsiniz:

https://code.visualstudio.com/docs/remote/troubleshooting#_setting-up-the-ssh-agent

Bu satırı biraz irdeleyelim:

# cat 33_10.pub | ssh vagrant@192.168.33.10 "chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

Az önce şifre girmeden giriş yapabileceğimiz şekilde (passphrase olmadan oluşturduğumuz) gizli ve açık anahtarlardan public anahtarın içeriğini sunucuda authorized_keys dosyasının içine yazacağız. İstemci ssh bağlantısı kurmak istediğinde ssh sunucusu açık anahtar bilgisiyle kullanıcı doğrulaması yapmış olacak.

Unutmayın anahtar dosyalarınızı bir kez yarattıktan sonra muhakkak sadece okunabilir (read-only) yapmalısınız. Ayrıca remote makinedeki .ssh dizininde başkaları tarafından değiştirilemez olacak şekilde düzenlenmeli.

İstemcide anahtar dosyalarını readonly yapın. Gizli anahtarı ise sadece siz okuyabilin

Sunucuda ise .ssh dizininin sadece kullanıcı tarafından yetkilendirildiğine ve authorized_keys dosyasının ise yine sadece kullanıcı tarafından okunup yazılabildiğine dikkat ediniz.

ctopkaya@jenkins-cinar-box:~/.ssh$ ll
drwx------ 2 ctopkaya ctopkaya 4096 Jul 27 14:43 ./
drwxr-xr-x 4 ctopkaya ctopkaya 4096 Jul 23 18:15 ../
-rw------- 1 ctopkaya ctopkaya 806 Jul 27 16:55 authorized_keys

Özetle:

# Ev dizini altında .ssh dizini yoksa oluşturup içinde açık ve gizli anahtarlar oluşturmak için ssh-keygen kullanırız:
$ ssh-keygen
# Açık anahtarı uzak sunucuda authorized_keys dosyasına kopyalamak:
$ ssh-copy-id -i <anahtarın_adı> kullanıcı_adı@uzak_makine_ip
# sunucuya ssh bağlantısı kurmak istenirse anahtar doğrulaması için:
$ eval $(ssh-agent)
$ ssh-add [anahtarın_adı]

Biraz ayrıntılı:

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/vagrant/.ssh/id_rsa): 192_168_13_137
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in 192_168_13_137.
Your public key has been saved in 192_168_13_137.pub.
The key fingerprint is:
SHA256:ZCuHqCui4XHBMvBlDHz0uq11grDdeoM+6Rt8/QgtGTw vagrant@ubuntu-xenial
The key's randomart image is:
+---[RSA 2048]----+
| .... |
| .o.. |
|. .+ . o |
|...o + + . |
| oooo E S |
| o*.= O |
|..o.*oX + |
|+.o.+*o= o |
|+o.o*+ .. . |
+----[SHA256]-----+
--------------------------------------------------------------------$ ssh-copy-id -i 192_168_13_137 ctopkaya@192.168.13.137
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "192_168_13_137.pub"
The authenticity of host '192.168.13.137 (192.168.13.137)' can't be established.
ECDSA key fingerprint is SHA256:ua8ZkVoOzngeI36RIbyuD/084oivCNc9NtxO7XStJco.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
ctopkaya@192.168.13.137's password:
Number of key(s) added: 1Now try logging into the machine, with: "ssh 'ctopkaya@192.168.13.137'"
and check to make sure that only the key(s) you wanted were added.
--------------------------------------------------------------------$ eval $(ssh-agent)
Agent pid 7341
--------------------------------------------------------------------$ ssh-add 192_168_13_137
Enter passphrase for 192_168_13_137:
Identity added: 192_168_13_137 (192_168_13_137)
vagrant@ubuntu-xenial:~/.ssh$ ssh ctopkaya@192.168.13.137
Welcome to Ubuntu 16.04.6 LTS (GNU/Linux 4.4.0-151-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
6 packages can be updated.
0 updates are security updates.
New release '18.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.
Last login: Thu Jul 23 18:26:38 2020 from 192.168.13.254
$

Tafsilatlı İnceleyelim

Uzak makineye bağlantı kurmak istiyoruz. SSH ile kuracağımız bağlantıda sürekli şifre girmek istemiyoruz çünkü zaten hep kendi makinemizden bağlanıyorsak “neden bir daha bir daha şifre girelim” değil mi?

  • SSH Anahatarı Üretelim
    # ssh-keygen
  • Anahtarı Sunucuya Kopyalayalım
    # ssh-copy-id -i ~/.ssh/mykey user@host
    uzaktaki bilgisayara oluşturduğumuz sertifika bilgilerini kayıt ettiriyoruz
ssh-copy-id -i private_key_dosya_adi kullanici_adi@uzak_makine_ip
  • Anahtarın Çalışmasını Detaylı Test Edelim
    # ssh -i ~/.ssh/ozel_anahtar user@host -v
  • Anahtarın Şifresini Tekrar Tekrar Girmemek İçin Agent’ı Haberdar Etmek
    # eval ($ssh-agent)
    # ssh-add ozel_anahtar_dosya_adi

SSH Anahatarı Üretelim

Gizli/açık anahtarı korumak için bir şifre tayin ederiz (passpharese kısmında iki kez gireriz)

Aşağıda bağlantının arka planında olanları görebiliriz.

  • Uzun bir laf kalabalığından sonra yerelde ve uzaktaki ssh versiyonlarının uyumu kontrol ediliyor
  • ctopkaya kullanıcısının doğrulanması aşamasına geçiliyor
  • veri alış transferini şifrelemek için hangi şifrelemenin kullanılacağında anlaşılır
  • Sunucu kendisine ait olan “ana bilgisayar anahtarını” istemciye gönderir. Burada bir an için durup, “Host Key” nedir bakalım:

Her ana bilgisayarın (yani bilgisayarın) benzersiz bir host key yani ana makine anahtarı olmalıdır. Ana bilgisayar anahtarlarının paylaşılması tavsiye edilmez ve ortadaki adam saldırılarına (man-in-the-middle) açık olabilir. Ancak, ana bilgisayar anahtarlarını paylaşan kümelerde hesaplama bazen kabul edilebilir ve pratik olabilir.

Putty ile bağlandığımızda şöyle bir mesaj kutusu bize ana bilgisayar anahtarını saklamak isteyip istemedeğimizi sorar:

  • Bilinen makineler listesi bulunur C:\Users\cem.topkaya/.ssh/known_hosts

Ana bilgisayar IP adresi known_hosts dosyasında
- bulunursa bağlantıya izin çıkar ve aşağıdaki akış devam eder

- bulunamazsa eklemek için sorar:

Eklemek için yes diyelim ve known_hosts dosyasında değişime bakalım

Satıra dikkat: Warning: Permanently added ‘192.168.13.137’ (ECDSA) to the list of known hosts.

Aşağıda SSH istemcisiyle SSH sunucusu arasındaki konuşmayı görüyoruz. Bir kısmını çevrelim. SSH istemcisi sunucuya bağlantı kurmak istediğinde sunucu diyor ki;

host key ile sana sunucu olarak kendimi tanıtan bir bilgi gönderiyorum. İstemci olarak bu anahtarı -bilinen sunucular listende (known_hosts)- arayarak güvenilir sunucular listeden daha önceden kaydettiysen beni bulabilirsin. Malûm internet güvensiz bir ortam ve başka bir sunucu da bana bağlanmak istediğin IP numarasıyla sanki “benmişim gibi yaparak” seni tufaya düşürmek isteyebilir. Bu saldırıyı “Man-in-the-Middle” adıyla bilirler.

Eminim sana göndereceğim bu bilgiyi sadece ileri doğru bir kodlama yöntemiyle known_hosts dosyasında tutuyorsundur. Sana gönderdiğim host_key bilgisini tekrar kodlayarak çıkan sonuç ile benim IP adresim olan 192.168.13.137 satırı bulup oradaki anahtar ile karşılaştırırsın. Eğer bu iki bilgi örtüşüyorsa “benim gerçekten 192.168.13.137 IP’li makine olduğuma inanırsın ve bağlantıya devam ederek belkide hassas bilgilerini işlersin.

..: Server host key: ecdsa-sha2-nistp256 SHA256:ua8ZkVoOzngeI36RIbyuD/084oivCNc9NtxO7XStJco
..: Host '192.168.13.137' is known and matches the ECDSA host key.
..: Found key in C:\\Users\\cem.topkaya/.ssh/known_hosts:27

Uzun hikaye şöyleydi:

cem.topkaya@CEM-TOPKAYA-PC C:\Users\cem.topkaya\.ssh
# ssh ctopkaya@192.168.13.137 -v
OpenSSH_for_Windows_7.7p1, LibreSSL 2.6.5
..: Connecting to 192.168.13.137 [192.168.13.137] port 22.
..: Connection established.
..: identity file C:\\Users\\cem.topkaya/.ssh/id_rsa type 0
..: key_load_public: No such file or directory
...
....
..: Local version string SSH-2.0-OpenSSH_for_Windows_7.7
..: Remote protocol version 2.0, remote software version OpenSSH_7.2p2 Ubuntu-4ubuntu2.8
..: match: OpenSSH_7.2p2 Ubuntu-4ubuntu2.8 pat OpenSSH* compat 0x04000000
..: Authenticating to 192.168.13.137:22 as 'ctopkaya'
..: SSH2_MSG_KEXINIT sent
..: SSH2_MSG_KEXINIT received
..: kex: algorithm: curve25519-sha256@libssh.org
..: kex: host key algorithm: ecdsa-sha2-nistp256
..: kex: server->client cipher: chacha20-poly1305@openssh.com MAC: <implicit> compression: none
..: kex: client->server cipher: chacha20-poly1305@openssh.com MAC: <implicit> compression: none
..: expecting SSH2_MSG_KEX_ECDH_REPLY
..: Server host key: ecdsa-sha2-nistp256 SHA256:ua8ZkVoOzngeI36RIbyuD/084oivCNc9NtxO7XStJco
..: Host '192.168.13.137' is known and matches the ECDSA host key.
..: Found key in C:\\Users\\cem.topkaya/.ssh/known_hosts:27
..: rekey after 134217728 blocks
..: SSH2_MSG_NEWKEYS sent
..: expecting SSH2_MSG_NEWKEYS
..: SSH2_MSG_NEWKEYS received
..: rekey after 134217728 blocks
..: SSH2_MSG_EXT_INFO received
..: kex_input_ext_info: server-sig-algs=<rsa-sha2-256,rsa-sha2-512>
..: SSH2_MSG_SERVICE_ACCEPT received
..: Authentications that can continue: publickey,password
..: Next authentication method: publickey
..: Offering public key: RSA SHA256:AdNq+FyONn5HPT8M8WjRmuWao/2UGG2S+Z1fpd1co9Y .ssh/id_rsa
..: Authentications that can continue: publickey,password
..: Offering public key: RSA SHA256:moaVGsUmgspaUFd8rk2hQbLDLvNbCBfJJbrLSC4wWoA C:\\Users\\cem.topkaya\\.ssh\\id_rsa
..: Authentications that can continue: publickey,password
..: Offering public key: RSA SHA256:hHTdbxzOWhxTA4ToRDNbC7kvKlE7slVkAbkBQpnNdeQ C:\\Users\\cem.topkaya/.ssh/id_rsa
..: Authentications that can continue: publickey,password
..: Trying private key: C:\\Users\\cem.topkaya/.ssh/id_dsa
..: Trying private key: C:\\Users\\cem.topkaya/.ssh/id_ecdsa
..: Trying private key: C:\\Users\\cem.topkaya/.ssh/id_ed25519
..: Trying private key: C:\\Users\\cem.topkaya/.ssh/id_xmss
..: Next authentication method: password
..: read_passphrase: can't open /dev/tty: No such file or directory
ctopkaya@192.168.13.137's password:
..: Authentication succeeded (password).
Authenticated to 192.168.13.137 ([192.168.13.137]:22).
..: channel 0: new [client-session]
..: Requesting no-more-sessions@openssh.com
..: Entering interactive session.
..: pledge: network
..: console supports the ansi parsing
..: client_input_global_request: rtype hostkeys-00@openssh.com want_reply 0
Welcome to Ubuntu 16.04.6 LTS (GNU/Linux 4.4.0-151-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
6 packages can be updated.
0 updates are security updates.
New release '18.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.
Last login: Thu Jul 23 10:58:54 2020 from 192.168.13.254
$

Eğer ssh-add ile private key eklendiyse artık aşağıdaki gibi bir çıktı göreceksiniz:

vagrant@ubuntu-xenial:~/.ssh$ eval $(ssh-agent)
Agent pid 5467
vagrant@ubuntu-xenial:~/.ssh$ ssh-add 137
Enter passphrase for 137:
Identity added: 137 (137)
vagrant@ubuntu-xenial:~/.ssh$ ssh ctopkaya@192.168.13.137 -v
OpenSSH_7.2p2 Ubuntu-4ubuntu2.8, OpenSSL 1.0.2g 1 Mar 2016
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: Applying options for *
debug1: Connecting to 192.168.13.137 [192.168.13.137] port 22.
debug1: Connection established.
debug1: key_load_public: No such file or directory
debug1: identity file /home/vagrant/.ssh/id_rsa type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/vagrant/.ssh/id_rsa-cert type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/vagrant/.ssh/id_dsa type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/vagrant/.ssh/id_dsa-cert type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/vagrant/.ssh/id_ecdsa type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/vagrant/.ssh/id_ecdsa-cert type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/vagrant/.ssh/id_ed25519 type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/vagrant/.ssh/id_ed25519-cert type -1
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.8
debug1: Remote protocol version 2.0, remote software version OpenSSH_7.2p2 Ubuntu-4ubuntu2.8
debug1: match: OpenSSH_7.2p2 Ubuntu-4ubuntu2.8 pat OpenSSH* compat 0x04000000
debug1: Authenticating to 192.168.13.137:22 as 'ctopkaya'
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: algorithm: curve25519-sha256@libssh.org
debug1: kex: host key algorithm: ecdsa-sha2-nistp256
debug1: kex: server->client cipher: chacha20-poly1305@openssh.com MAC: <implicit> compression: none
debug1: kex: client->server cipher: chacha20-poly1305@openssh.com MAC: <implicit> compression: none
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
debug1: Server host key: ecdsa-sha2-nistp256 SHA256:ua8ZkVoOzngeI36RIbyuD/084oivCNc9NtxO7XStJco
debug1: Host '192.168.13.137' is known and matches the ECDSA host key.

debug1: Found key in /home/vagrant/.ssh/known_hosts:3
debug1: rekey after 134217728 blocks
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: rekey after 134217728 blocks
debug1: SSH2_MSG_EXT_INFO received
debug1: kex_input_ext_info: server-sig-algs=<rsa-sha2-256,rsa-sha2-512>
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey,password
debug1: Next authentication method: publickey
debug1: Offering RSA public key: 137
debug1: Server accepts key: pkalg rsa-sha2-512 blen 279
debug1: Authentication succeeded (publickey).
Authenticated to 192.168.13.137 ([192.168.13.137]:22).
debug1: channel 0: new [client-session]
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
debug1: pledge: network
debug1: client_input_global_request: rtype hostkeys-00@openssh.com want_reply 0
debug1: Sending environment.
debug1: Sending env LANG = en_US.UTF-8
Welcome to Ubuntu 16.04.6 LTS (GNU/Linux 4.4.0-151-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
6 packages can be updated.
0 updates are security updates.
New release '18.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.
Last login: Thu Jul 23 17:46:39 2020 from 192.168.13.254
$

Bilinen Ana Bilgisayarlardan (known_hosts) IP Çıkarmak

Bunu ister komutla isterseniz dosyayı düzenleyip ilgili satırı silerek yapabilirsiniz.

ssh-keygen -R 192.168.13.137
$ ssh-keygen -R 192.168.13.137

Debian Paket Havuzundan Otomatik Dosya İndirip Kurmak

--

--

Cem Topkaya
Cem Topkaya

Written by Cem Topkaya

Evlat, kardeş, ağabey, eş, baba, müzik sever, öğrenmek ister, paylaşmaya can atar, iyi biri olmaya çalışır, hakkı geçenlerden helallik ister vs.

No responses yet