LDAP kullanarak SSH anahtar doğrulaması


59

Kısacası:

LDAP üzerinden SSH anahtar doğrulaması yapmak için bir yol istiyorum.

Sorun:

Dizin hizmetleri için LDAP (tokat) kullanıyoruz ve kısa süre önce kendi AMI'imizi bina örnekleri için kullanmaya başladık. AMI bitinin önemli olmasının nedeni, ideal olarak, örnek çalışırken en kısa sürede anahtar kimlik doğrulaması yoluyla SSH ile oturum açmak istediğimiz ve biraz yavaş bir yapılandırma yönetimi aracımızın eklenmesi için bir komut dosyası başlatmasını beklemek zorunda kalmamamızdır. örneğe doğru tuşlar.

İdeal senaryo, LDAP'ye bir kullanıcı eklerken anahtarını da eklediğimiz ve hemen giriş yapabilecek olmalarıdır.

Anahtar kimlik doğrulaması bir zorunluluktur çünkü parola tabanlı oturum açma hem daha az güvenli hem de rahatsız edicidir.

OpenSSH için OpenSSH-lpk adında bir yama olduğunu öne süren bu soruyu okudum , ancak bu artık OpenSSH sunucusunda gerekli değil> = 6.2

Bir sshd_config (5) seçeneği AuthorizedKeysCommand, dosya sisteminden (ya da yerine) ek olarak bir komuttan yetkili_ anahtarların alınmasını desteklemek için eklendi. Komut, AuthorizedKeysCommandUser sshd_config (5) seçeneği tarafından belirtilen bir hesap altında çalıştırılır.

OpenSSH ve LDAP'yi bunu uygulamak için nasıl yapılandırabilirim?

Yanıtlar:


64

OpenSSH-LPK şemasını eklemek için LDAP'yi güncelleyin

sshPublicKeyKullanıcılara özellik eklemek için önce LDAP'yi bir şema ile güncellememiz gerekir :

dn: cn=openssh-lpk,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: openssh-lpk
olcAttributeTypes: ( 1.3.6.1.4.1.24552.500.1.1.1.13 NAME 'sshPublicKey'
    DESC 'MANDATORY: OpenSSH Public key'
    EQUALITY octetStringMatch
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )
olcObjectClasses: ( 1.3.6.1.4.1.24552.500.1.1.2.0 NAME 'ldapPublicKey' SUP top AUXILIARY
    DESC 'MANDATORY: OpenSSH LPK objectclass'
    MAY ( sshPublicKey $ uid )
    )

Bir kullanıcının genel anahtarı için LDAP'yi sorgulayan bir komut dosyası oluşturun:

Betik, o kullanıcının ortak anahtarlarını çıkarmalıdır, örneğin:

ldapsearch '(&(objectClass=posixAccount)(uid='"$1"'))' 'sshPublicKey' | sed -n '/^ /{H;d};/sshPublicKey:/x;$g;s/\n *//g;s/sshPublicKey: //gp'

sshd_configÖnceki adımdan komut dosyasına işaret etmek için güncelleme

  • AuthorizedKeysCommand /path/to/script
  • AuthorizedKeysCommandUser nobody

Bonus : sshd_configBu soruda görüldüğü gibi dahili RFC1918 ağlarından şifre doğrulamaya izin vermek için güncelleme :

Yalnızca SSH sunucusuna dahili ağdan şifre doğrulama izni verin

Kullanışlı bağlantılar:

EDIT: nobodyÖnerilen TRS-80 kullanıcı eklendi


6
AuthorizedKeysCommandUser nobodyKök yerine önerebilirim rağmen bu harika .
TRS-80

Ldapsearch veya sed ile ilgili farklı bir şeyler olmalı çünkü çıktıyı elde ettiğiniz sed black magic komutuna yönlendirmek, düz ldapsearch komutumun verileri döndürmesine rağmen bana hiçbir çıktı vermiyor. Sed kullanmak yerine çıktıyı temizlemek için bir komut dosyası yazmam gerekecek.
Chris L,

1
Önceki yorumumu dikkate almayın. Benim sorunum, sshPublicKey mülkünde izleyen bir yeni hatta sahip olmaktan kaynaklanıyordu; Tho komutunu basitleştirdim tho:ldapsearch -u -LLL -o ldif-wrap=no '(&(objectClass=posixAccount)(uid='"$1"'))' 'sshPublicKey' | sed -n 's/^[ \t]*sshPublicKey:[ \t]*\(.*\)/\1/p'
Chris L

1
@Chris gerçekten daha az kara büyü, ancak sed hala bir kez yazmak, 1 yönlü karma işlevidir;)
Froyke 24:15

1
OpenSSH sürümünde (5.3p1-122.el6) var AuthorizedKeysCommandRunAsve yokAuthorizedKeysCommandUser
mveroone

5

Ldapsearch'ü çalıştırırken hata alan herkes için:

sed: 1: "/^ /{H;d};": extra characters at the end of d command

Olduğum gibi (FreeBSD'de), ilk sed komutunu şu şekilde değiştirmek gerekiyor:

/^ /{H;d;};

('d' den sonra noktalı virgül ekleyerek).


4

Sadece "yöntemimi" paylaşmak istedim, müşteri tarafım Debian / Ubuntu Specific, ancak Sunucu tarafım temelde yukarıdakiyle aynı, ancak biraz daha "HowTo:" ile aynı

Sunucu:

Genel Anahtar Özelliğini Etkinleştir:

Kredi:

https://blog.shichao.io/2015/04/17/setup_openldap_server_with_openssh_lpk_on_ubuntu.html

cat << EOL >~/openssh-lpk.ldif
dn: cn=openssh-lpk,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: openssh-lpk
olcAttributeTypes: ( 1.3.6.1.4.1.24552.500.1.1.1.13 NAME 'sshPublicKey'
  DESC 'MANDATORY: OpenSSH Public key'
  EQUALITY octetStringMatch
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )
olcObjectClasses: ( 1.3.6.1.4.1.24552.500.1.1.2.0 NAME 'ldapPublicKey' SUP top AUXILIARY
  DESC 'MANDATORY: OpenSSH LPK objectclass'
  MAY ( sshPublicKey $ uid )
  )
EOL

Şimdi bunu ldif eklemek için kullanın:

ldapadd -Y EXTERNAL -H ldapi:/// -f ~/openssh-lpk.ldif

PhpLDAPadmin'de SSH ortak anahtarı olan bir kullanıcı ekleme

İlk önce “Genel: Kullanıcı Hesabı” şablonuyla bir kullanıcı oluşturun. Sonra “objectClass” nitelik bölümüne gidin, “değer ekle” ye tıklayın ve “ldapPublicKey” niteliğini seçin. Gönderdikten sonra, kullanıcı düzenleme sayfasına geri dönün, üst kısımdaki "Yeni özellik ekle" yi tıklayın ve "sshPublicKey" i seçin, genel anahtarı metin alanına yapıştırın ve son olarak "Nesneyi Güncelle" yi tıklayın.

sshPublicKey Özniteliği gösterilmiyor - OpenLDAP PHPLDAP SSH Key Auth

Ubuntu İstemcisi:

apt-get -y install python-pip python-ldap
pip install ssh-ldap-pubkey
sh -c 'echo "AuthorizedKeysCommand /usr/local/bin/ssh-ldap-pubkey-wrapper\nAuthorizedKeysCommandUser nobody" >> /etc/ssh/sshd_config' && service ssh restart

Test Anahtarları Oluştur:

ssh-keygen -t rsa

3

Bu tam bir cevap değil, sadece c4urself'ın cevabına bir ek . Bunu yorum olarak eklerdim, ancak yorum yapmak için yeterli itibarım yok, bu yüzden lütfen aşağı oylama yapmayın!

Bu kullandığım betiği AuthorizedKeysCommand(c4urself sürümüne göre). Değerin base64 kodlamasında döndürülüp döndürülmediğine bakılmaksızın çalışır. Bu, LDAP'da birden fazla yetkili anahtarı saklamak istiyorsanız, özellikle tuşları kullanmanız yararlı olabilir - anahtarları yalnızca yetkili_keys dosyasına benzer şekilde yeni satır karakterleriyle ayırın.

#!/bin/bash
set -eou pipefail
IFS=$'\n\t'

result=$(ldapsearch '(&(objectClass=posixAccount)(uid='"$1"'))' 'sshPublicKey')
attrLine=$(echo "$result" | sed -n '/^ /{H;d};/sshPublicKey:/x;$g;s/\n *//g;/sshPublicKey:/p')

if [[ "$attrLine" == sshPublicKey::* ]]; then
  echo "$attrLine" | sed 's/sshPublicKey:: //' | base64 -d
elif [[ "$attrLine" == sshPublicKey:* ]]; then
  echo "$attrLine" | sed 's/sshPublicKey: //'
else
  exit 1
fi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.