Github’a SSH’la Şifre Girmeden Erişmek

Cem Topkaya
7 min readApr 20, 2020

--

Özetle Komutlar

# SSH iletişiminde kullanılacak anahtarları yaratmak için
$ ssh-keygen
# SSH isteklerinde anahtarlara erişmek için agent'ı çalıştırmak
$ eval ($ssh-agent)
# Agent tarafından yönetilecek anahtarlara bir yenisini eklemek
$ ssh-add anahtarınAdı
# Agent tarafından yönetilen tüm anahtarları listeler
$ ssh-add -l

Hızlı Çözümler > Hata Giderme

Could not open a connection to your authentication agent.

Agent çalışmıyordu! $ eval ($ssh-agent) ile başlattık ve şimdi sıra key eklemekte. $ ssh-add anahtarınAdı

ssh id@host : Permission denied (publickey).

Uzak sunucuya bağlanmak için arka planda anahtar alış verişi yapılıyor ve ancak sunucu tarafında bir karşılığı olmayınca bu hata alınıyor. Eğer kullanıcı adıyla doğrulama yapmak isterseniz aşağıdaki ayarlarda olduğu gibi (/etc/ssh/sshd_config) dosyasında PasswordAuthentication anahtarına yes değeri atamamız gerekir. Aksi halde public anahtarı sunucu tarafında authorized_keys dosyasında kayıtlı olmayan istemciler giriş yapamaz.

Eğer sunucu tarafında ayar yes diye yapılandırılmışsa bu kez istemciyi password ile girişe zorlamak için:

$ ssh -o PreferredAuthentications=password \
-o PubkeyAuthentication=no example.com

İndirilecekler

Kurulacaklar

Git for Windows

Putty

Buradan indireceğiniz putty ile birlikte ihtiyacımız olan şu uygulamalar gelecek

  1. puttygen.exe
  2. plink.exe
  3. pageant.exe

Önce Temel Bilgiler

Windows’a girerken kullandığınız kullanıcıya ait dizin ve dosyalarını sakladığınız dizin yoluna %USERPROFILE% ile ulaşabilirsiniz.

Windows Tuşu + R harfiyle çalıştır ekranını açalım ve %UserProfile% yazarak kullanıcının dizinine (linux üstünde $HOME ile) erişelim.

Windowsta pagent.exe uygulaması (lünüxte sshagent ;) key bilgisini tutan ve gerektiğinde sunan bir uygulamadır ve sürekli çalışması gerekir. Sürekli çalışsın diye startup dizinine (%UserProfile%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup) uygulamanın kısayolunu ekleyelim.

SSH Anahtarlarını Saklayacağımız Dizini Ayarlayalım

Anahtarları saklayacağımız dizin kullanıcı profilinin altındaki .ssh dizini olacak (yoksa yaratın lütfen).

%UserProfile%\.ssh

PuTTYgen

Anahtları oluşturmak için PuTTYgen uygulamasını çalıştıralım

Generate düğmesine basalım ve biraz zaman alacak olan anahtar üretme aşamalarını yaşayalım

RSA ile üreteceğiz çünkü geçerli şifreleme olan rsa algoritmasıyla üretmeliyiz anahtarları
  1. Herkese gönderilebilecek public (açık, umumi, halka açık) anahtarın private anahtarıyla arasında sadece bizim bildiğimiz bir şifre (passphrase) atayalım
  2. ve .ssh dizinine public (açık) anahtarı kaydedelim (Save public key)
  3. ve Save private key düğmesiyle private (gizli) anahtarı kaydedelim

pagent

Anahatarların sürekli kullanılabilmesi için pagent uygulamasını kullanıyoruz. Anahtarları pagent uygulamasına veriyor ve isteyene kullanılması için sürekli çalışır hale getiriyoruz.

Tabi pagent.exe nin çalışıyor olması gerekiyor:

Şimdi oluşturduğumuz SSH anahtarlarını (açık ve gizli -public, private-) putty’nin agent uygulamasına verelim. Kaydettiğimiz bu anahtarları pagent.exe uygulamasına ekleyeceğiz

Ve görelim ekleyebilmiş miyiz?

plink.exe

Ortam değişkenlerine GIT_SSH diye bir anahtar tanımlamalıyız ki bu anahtara erişen uygulama plink.exe’yi çalıştırabilsin. Yani GIT_SSH anahtarına plink.exe’nin dosya yolunu vereceğiz.

Github Ayarları

Okları takip et ve yeni anahtarı oluştur

New SSH key düğmesine bastıktan sonra şu şekilde bilgileri gir ve ekle

Bilgisayarda Son Rötuşlar

Git’e isim ve eposta adresimizle bilgilerimizi tanımlayalım

$ git config --global user.name "Cem Topkaya"
$ git config --global user.email cem.topkaya@hotmail.com

plink.exe ile anahtarlarımız Github üstünde çalışıyor mu diye kontrol edelim

$ plink.exe -v git@github.com

Docker Konteyner Üstünde SSH Anahatarları

Benim Jenkins slave olarak kullandığım konteynerin bitbucket reposuyla bağlantısını ssh anahtarları üstünden halletmem gerekti.

SSH Kurulumu

Linux üstünde ssh kurulu değilse aşağıdaki komutlarla yükleriz yüklüyse doğrudan anahtar ayarlarına geçebiliriz.

$ apt-get update
$ apt-get -y install git

Eğer docker yansısı hazırlıyorsak yansının üstünde ssh kurulumu için Dockerfile şöyle olmalı:

FROM ubuntuRUN apt-get update && \
apt-get -y install git && \
eval `ssh-agent -s` && \
mkdir ~/.ssh \
echo "StrictHostKeyChecking no" >> /etc/ssh/ssh_config &&

SSH Anahtar Ayarları

Konteynerin konsoluna bağlanıp, makina üstünde yüklü olan ssh-keygen komutu çalıştırıyoruz.

# ssh-keygen
ssh-keygen
  • Bize anahtarın adı olmazsa /root/.ssh/ dizini içinde id_rsa adıyla bir gizli anahtar yaratacağını söyler
  • Örnek olsun deyyu bir anahtar yaratalım adıda “yeni_anahtar” olsun
  • Sadece yeni oluşturduğumuz anahtarı görmek için | grep ‘anahtar’ diyoruz ve dizindeki dosyaları ls ile listeliyoruz:
  • .pub uzantılı dosya açık (public) anahtarımız ve diğeri gizli (private) anahtarımız oluyor.
  • Oluşturduğumuz anahtarı ssh-agent ile istenildiğinde erişilebilir hale getirmek için ssh-add ile anahtarı ekleyeceğiz. Dikkat etmemiz gereken ssh-agent’ın çalıştığından emin olmak!
Could not open a connection to your authentication agent.
  • ssh-agent bir Process ID almışsa “çalışıyor” demektir.
    Bunun için eval $(ssh-agent) komutunu kullanacağız
eval $(ssh-agent)
  • Artık ssh-add ile anahtarımızı ekleyebiliriz
ssh-add yeni_anahtar

SSH Anahtarı ayarları bittiğine göre tekrar Jenkins-Bitbucket ayarlarına dönebiliriz.

SSH Ayarlarıı görmek için /etc/ssh/ssh_config dosyasına bakabiliriz:

# cat /etc/ssh/ssh_config# This is the ssh client system-wide configuration file.  See
# ssh_config(5) for more information. This file provides defaults for
# users, and the values can be changed in per-user configuration files
# or on the command line.
# Configuration data is parsed as follows:
# 1. command line options
# 2. user-specific file
# 3. system-wide file
# Any configuration value is only changed the first time it is set.
# Thus, host-specific definitions should be at the beginning of the
# configuration file, and defaults at the end.
# Site-wide defaults for some commonly used options. For a comprehensive
# list of available options, their meanings and defaults, please see the
# ssh_config(5) man page.
Host *
# ForwardAgent no
# ForwardX11 no
# ForwardX11Trusted yes
# PasswordAuthentication yes
# HostbasedAuthentication no
# GSSAPIAuthentication no
# GSSAPIDelegateCredentials no
# GSSAPIKeyExchange no
# GSSAPITrustDNS no
# BatchMode no
# CheckHostIP yes
# AddressFamily any
# ConnectTimeout 0
# StrictHostKeyChecking ask
# IdentityFile ~/.ssh/id_rsa
# IdentityFile ~/.ssh/id_dsa
# IdentityFile ~/.ssh/id_ecdsa
# IdentityFile ~/.ssh/id_ed25519
# Port 22
# Protocol 2
# Ciphers aes128-ctr,aes192-ctr,aes256-ctr,aes128-cbc,3des-cbc
# MACs hmac-md5,hmac-sha1,umac-64@openssh.com
# EscapeChar ~
# Tunnel no
# TunnelDevice any:any
# PermitLocalCommand no
# VisualHostKey no
# ProxyCommand ssh -q -W %h:%p gateway.example.com
# RekeyLimit 1G 1h
SendEnv LANG LC_*
HashKnownHosts yes
GSSAPIAuthentication yes

Jenkins-Bitbucket Ayarları

Sırasıyla gizli, açık anahtarlar oluşunca

  1. açık anahtarı bitbucket adresine tanımlayacak,
  2. Bitbucket kullanıcı adıyla Jenkins üstünde gizli anahtarı, bir credential tanımladıktan sonra
  3. yeni Jenkins görevinde bitbucket repo adresini yarattığınız credential ile ayarlayıp kullanabiliriz
Gizli anahtarı Jenkins üstüne, açık anahtarı bitbucket üstüne
Add Key düğmesiyle yeni bir anahtar giriyoruz
Açık anahtar (public key) bitbucket üstünde tanımlanacak
son boşluktan sonraki kısım ssh anahtarının etiketi oluyor
en son anahtar docker_jenkins_ssh_etiketi olacaktı ama tabi bu görüntü daha önceden çekildi ;)

Tekrar Tekrar Şifre Sormasın Diye

Önce ssh-agent çalışsın diye $ eval ‘ssh-agent -s’ komutunu çalıştırırız.

Ardından yarattığımız ssh anahtarlarını ssh-add komutuyla ekleyebiliriz. -k Anahtarını sadece “anahtarları yükleyip, sertifikaları yüklememek” için kullanacağız.

ssh-agent Tarafından yönetilen anahtarları listelemek için ssh-add -l komutu çalıştırdığımızda:

Referanslar:

--

--

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