Otentikasi kunci SSH menggunakan LDAP

59

Pendeknya:

Ingin cara untuk melakukan otentikasi kunci SSH melalui LDAP.

Masalah:

Kami menggunakan LDAP (slapd) untuk layanan direktori dan kami baru saja pindah untuk menggunakan AMI kami sendiri untuk membuat instance. Alasan bit AMI penting adalah bahwa, idealnya , kami ingin dapat masuk dengan SSH melalui otentikasi kunci segera setelah instance berjalan dan tidak harus menunggu alat manajemen konfigurasi yang agak lambat untuk memulai skrip untuk menambahkan skrip untuk menambahkan kunci yang benar untuk instance.

Skenario yang ideal adalah bahwa, ketika menambahkan pengguna ke LDAP, kami juga menambahkan kunci mereka dan mereka akan segera dapat masuk.

Otentikasi kunci adalah suatu keharusan karena login berbasis kata sandi kurang aman dan menyusahkan.

Saya sudah membaca pertanyaan ini yang menunjukkan ada patch untuk OpenSSH yang disebut OpenSSH-lpk untuk melakukan ini tetapi ini tidak lagi diperlukan dengan server OpenSSH> = 6.2

Menambahkan opsi sshd_config (5) AuthorizedKeysCommand untuk mendukung pengambilan otor_keys dari perintah selain (atau bukan) dari sistem file. Perintah dijalankan di bawah akun yang ditentukan oleh opsi AuthorizedKeysCommandUser sshd_config (5)

Bagaimana saya bisa mengkonfigurasi OpenSSH dan LDAP untuk mengimplementasikan ini?

kita sendiri
sumber

Jawaban:

64

Perbarui LDAP untuk memasukkan skema OpenSSH-LPK

Pertama-tama kita perlu memperbarui LDAP dengan skema untuk menambahkan sshPublicKeyatribut untuk pengguna:

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 )
    )

Buat skrip yang menanyakan LDAP untuk kunci publik pengguna:

Script harus menampilkan kunci publik untuk pengguna itu, contoh:

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

Perbarui sshd_configuntuk menunjuk ke skrip dari langkah sebelumnya

  • AuthorizedKeysCommand /path/to/script
  • AuthorizedKeysCommandUser nobody

Bonus : Perbarui sshd_configuntuk mengizinkan otentikasi kata sandi dari jaringan RFC1918 internal seperti yang terlihat dalam pertanyaan ini:

Hanya izinkan otentikasi kata sandi ke server SSH dari jaringan internal

Tautan yang bermanfaat:

EDIT: Menambahkan pengguna nobodyseperti yang disarankan TRS-80

kita sendiri
sumber
6
Ini luar biasa, meskipun saya sarankan AuthorizedKeysCommandUser nobodydaripada root.
TRS-80
Pasti ada sesuatu yang berbeda tentang ldapsearch saya atau sed karena mem-piping output ke perintah black magic sed yang Anda miliki tidak memberikan saya output, meskipun perintah plain ldapsearch saya mengembalikan data. Saya harus menulis skrip untuk membersihkan output daripada menggunakan sed.
Chris L
1
Abaikan komentar saya sebelumnya. Masalah saya disebabkan oleh memiliki baris baru di properti sshPublicKey, yang pada gilirannya menyebabkan ldapsearch ke base64 menyandikan semuanya. Saya menyederhanakan perintah sed 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 memang kurang sihir hitam, tetapi sed masih fungsi hashing menulis-sekali, 1-arah;)
Froyke
1
Pada versi OpenSSH saya (5.3p1-122.el6) ada AuthorizedKeysCommandRunAsdan tidakAuthorizedKeysCommandUser
mveroone
5

Bagi siapa saja yang mendapatkan kesalahan saat menjalankan pencarian ldaps:

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

seperti saya (pada FreeBSD), perbaikannya adalah mengubah perintah sed pertama menjadi:

/^ /{H;d;};

(menambahkan titik koma setelah 'd').

Scott
sumber
4

Hanya ingin berbagi "metode" saya, sisi klien saya adalah Khusus Debian / Ubuntu, tetapi sisi Server saya pada dasarnya sama seperti di atas, tetapi dengan sedikit lebih "HowTo:"

Server:

Aktifkan Atribut Kunci Publik:

Kredit:

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

Sekarang gunakan ini untuk menambahkan ldif:

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

Menambahkan pengguna dengan kunci publik SSH di phpLDAPadmin

Pertama, buat pengguna dengan templat "Generik: Akun Pengguna". Lalu, buka bagian atribut "objectClass", klik "tambah nilai", dan pilih atribut "ldapPublicKey". Setelah Anda kirim, kembali ke halaman edit pengguna, klik "Tambah atribut baru" di bagian atas, dan pilih "sshPublicKey", tempelkan kunci publik ke area teks, dan akhirnya klik "Perbarui Objek". "

Atribut sshPublicKey tidak muncul - OpenLDAP PHPLDAP SSH Key Auth

Klien Ubuntu:

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

Buat Kunci Tes:

ssh-keygen -t rsa
FreeSoftwareServers
sumber
3

Ini bukan jawaban lengkap, hanya tambahan jawaban c4urself . Saya akan menambahkan ini sebagai komentar, tetapi saya tidak memiliki reputasi yang cukup untuk berkomentar, jadi tolong jangan downvote!

Ini adalah skrip yang saya gunakan untuk AuthorizedKeysCommand(berdasarkan versi c4urself). Ini berfungsi terlepas dari apakah nilai dikembalikan dalam pengkodean base64 atau tidak. Ini bisa sangat berguna jika Anda ingin menyimpan beberapa kunci yang diotorisasi dalam LDAP - cukup pisahkan kunci dengan karakter baris baru, mirip dengan file yang diotorisasi.

#!/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
mbrgm
sumber