Mencoba mendapatkan SSH dengan kunci publik (tanpa kata sandi) + google authenticator bekerja di Ubuntu 14.04.1

20

Saya menggunakan Ubuntu 14.04.1 (dengan OpenSSH 6.6 dan libpam-google-authenticator 20130529-2).

Saya mencoba menyiapkan login SSH di mana kunci publik mengotentikasi (tanpa kata sandi) dan pengguna diminta untuk kode dari Google Authenticator.

Mengikuti / mengadaptasi instruksi ini telah memberi saya prompt kata sandi serta prompt Google Auth:

Saya telah menginstal paket, mengedit file /etc/ssh/sshd_configdan saya/etc/pam.d/ssh

Dalam /etc/ssh/sshd_config:

ChallengeResponseAuthentication yes
AuthenticationMethods  publickey,keyboard-interactive
UsePAM yes

dan di bagian bawah /etc/pam.d/ssh:

auth required pam_google_authenticator.so nullok # (I want to give everyone a chance to set up their 2FA before removing "nullok")

Saya tahu PAM tergantung pesanan, tetapi sshd_configjuga?

Apa yang saya lakukan salah? Bantuan apa pun akan dihargai.

JT.
sumber

Jawaban:

28

Sudah bekerja dengan baik, pertama lakukan:

apt-get install libpam-google-authenticator

Di /etc/pam.d/sshdSaya telah mengubah / menambahkan baris berikut (di atas):

# @include common-auth
auth required pam_google_authenticator.so

Dan di /etc/ssh/sshd_config:

ChallengeResponseAuthentication yes
UsePAM yes
AuthenticationMethods publickey,keyboard-interactive
PasswordAuthentication no

Bekerja dengan baik dan saya sekarang menerima prompt "Kode verifikasi" setelah otentikasi dengan kunci publik. Saya tidak yakin bagaimana saya akan mengizinkan otentikasi dengan kata sandi + token ATAU kunci + token, karena saya sekarang telah secara efektif menghapus metode otentikasi kata sandi dari PAM.

Menggunakan Ubuntu 14.04.1 LTS (GNU / Linux 3.8.0-19-generik x86_64) dengan ssh -v: OpenSSH_6.6.1p1 Ubuntu-2ubuntu2, OpenSSL 1.0.1f 6 Jan 2014

Linus Kendall
sumber
Jadi, demi anak cucu, saya menyadari masalah saya. Saya juga sudah mencoba PasswordAuthentication no, tetapi bukan itu. Masalahnya adalah apakah saya memiliki / memiliki ControlMaster autodan ControlPatharahan dalam file ~ / .ssh / config saya. Saya ingin memastikan saya tidak mengunci diri, jadi saya akan selalu membiarkan sesi SSH terbuka. Karena komputer saya hanya akan menggunakan kembali, saya selalu masuk tanpa sistem meminta token. Saya menandai jawaban Anda sebagai benar, karena seseorang yang mengikutinya memang akan mendapatkan pengaturan yang berfungsi. Terima kasih!
JT.
2
Saya menggunakan CentOS 7. Saya memiliki PasswordAuthentication no, ChallengeResponseAuthentication yes, AuthenticationMethods publickey,keyboard-interactive, dan UsePAM yesdi sshd_config. Ini memvalidasi kunci saya dan kemudian meminta saya untuk token Google Authenticator saya dan kemudian juga meminta kata sandi saya. Buat saya melakukan ketiganya — tidak bisa melewati mereka. Saya juga sudah mencoba AuthenticationMethods publickey,keyboard-interactive:pamseperti yang disarankan oleh halaman manual, tetapi itu tidak mengubah apa pun. Ada ide?
Nick Williams
6
@NickWilliams Saya mengalami masalah yang sama. Yang memperbaikinya bagi saya adalah bahwa saya perlu memuji @include common-authgaris yang ditunjukkan oleh jawaban. Saya hanya berpikir itu adalah komentar untuk pam_google_authenticatorbaris di /etc/pam.d/sshd pada awalnya.
freb
5
Terima kasih! Solusi saya tidak persis sama (saya perlu berkomentar auth substack password-auth), tetapi komentar Anda menyelesaikan masalah saya!
Nick Williams
7

Saya akhirnya bisa mendapatkan ini bekerja dengan menempatkan auth [success=done new_authtok_reqd=done default=die] pam_google_authenticator.so nullokdi atas /etc/pam.d/sshd.

Menurut halaman manual pam.d :

  • success=done berarti bahwa jika Google Authenticator keluar, tidak akan ada lagi otentikasi yang dilakukan, artinya tidak ada prompt kata sandi tambahan.
  • default=die berarti bahwa jika Google Authenticator menolak upaya login, otentikasi akan segera gagal, melompati prompt kata sandi.

Jadi [success=done new_authtok_reqd=done default=die]adalah semacam campuran antara nilai sufficient- requisitenilai kontrol dan , karena kita ingin perilaku dari keduanya: jika sukses, segera berakhir (cukup), dan jika gagal, juga segera berakhir (diperlukan).

Perhatikan bahwa nullokargumen ke pam_google_authenticator.so berarti bahwa jika ~/.google_authenticatorfile tidak ditemukan untuk pengguna, otentikasi kunci publik berjalan seperti biasa. Ini berguna jika saya ingin mengunci hanya sebagian dari akun saya dengan 2FA.

bluegate010
sumber
6

Jawaban Linus Kendall harus bekerja pada sistem yang lebih lama, tetapi pada mesin Linux yang lebih baru itu bermasalah; di webserver berbasis lengkung linux saya yang konfigurasi menghasilkan pam meminta kode authenticator dan kata sandi saya setelah menerima kunci ssh saya (yaitu saya perlu semua 3).

Solusi yang lebih sederhana yang mencegah masalah ini dan yang seharusnya bekerja pada setiap sistem adalah mengubah entri /etc/pam.d/sshdmenjadi:

auth sufficient pam_google_authenticator.so

Kemudian untuk melakukan pengeditan yang sama ke `` / etc / ssh / sshd` yang disebutkan Linus:

ChallengeResponseAuthentication yes
UsePAM yes
AuthenticationMethods publickey,keyboard-interactive
PasswordAuthentication no

Itu akan meminta Anda untuk tanda autentikator Anda setelah server menerima kunci publik Anda. Seharusnya tidak meminta kata sandi Anda.

Sebagai catatan tambahan, jika Anda ingin memiliki akun pengguna sftp, Anda mungkin perlu mem-bypass autentikator google untuk membuatnya berfungsi. Berikut ini adalah saran tentang bagaimana melakukannya dengan aman menggunakan sftp jail. Dalam etc/ssh/sshd_config:

Subsystem sftp internal-sftp
Match User ftp-user
  PasswordAuthentication yes
  AuthenticationMethods password
  ChrootDirectory /path/to/ftp/dir
  ForceCommand internal-sftp

Anda akan perlu untuk membuat hak akses pada / path / ke / ftp / dir akar tulis saja (misalnya chown root:root /path/to/ftp/dir, chmod 755 /path/to/ftp/dir. Semua orang tua di atas direktori yang juga perlu izin aman. Cara saya biasanya melakukan ini adalah dengan membuat direktori chroot /home/shared/user, menciptakan direktori di sana (misalnya 'data') dan kemudian memasang direktori apa pun yang ingin saya bagikan seperti ini:sudo mount -o bind /path/to/ftp/dir /home/shared/user/data

Jika Anda mengikuti semua langkah itu, Anda akan memiliki kunci publik + login autentikator google untuk pengguna ssh Anda, dan akun sftp yang dilindungi kata sandi fungsional untuk transfer data.

Mike Dacre
sumber
Ini sangat bagus. Dan karena beberapa alasan saya merasa tidak nyaman untuk berkomentar bersama-sama, ini lebih ideal daripada solusi Linus.
Luke Sapan
Terima kasih banyak! menyia-nyiakan debugging malam ssh, bertanya-tanya mengapa saya masih harus mengetik kata sandi setelah pubkey + authcode ……
felix021