GNU/Linux >> Belajar Linux >  >> Linux

Otentikasi PAM untuk Aplikasi Lama

Cara informasi standar (seperti kata sandi) diteruskan untuk PAM adalah dengan menggunakan variabel yang disetel di pegangan pam dengan pam_set_item (lihat halaman manual untuk pam_set_item).

Anda dapat mengatur apa pun yang perlu digunakan aplikasi Anda nanti ke dalam pam_stack. Jika Anda ingin memasukkan kata sandi ke dalam pam_stack, Anda harus dapat melakukannya segera setelah memanggil pam_start() dengan menyetel variabel PAM_AUTHTOK ke dalam tumpukan yang serupa dengan kode semu di bawah ini:

pam_handle_t* handle = NULL;
pam_start("common-auth", username, NULL, &handle);
pam_set_item( handle, PAM_AUTHTOK, password);

Ini akan membuat kata sandi tersedia di tumpukan untuk modul apa pun yang ingin menggunakannya, tetapi Anda biasanya harus memberi tahu modul untuk menggunakannya dengan mengatur opsi use_first_pass standar, atau try_first_pass di pam_configuration untuk layanan (dalam hal ini /etc /pam.d/common-auth).

Modul standar pam_unix mendukung try_first_pass, jadi tidak ada salahnya untuk menambahkannya ke dalam konfigurasi pam Anda di sistem Anda (di akhir baris untuk pam_unix).

Setelah Anda melakukan ini, panggil saja pam_authenticate() yang dipanggil dari layanan autentikasi umum harus mengambil kata sandi dan menggunakannya.

Satu catatan kecil tentang perbedaan antara use_first_pass dan try_first_pass:Keduanya memberi tahu modul (dalam hal ini pam_unix) untuk mencoba kata sandi pada pam_stack, tetapi perilaku mereka berbeda ketika kata sandi/AUTHTOK tidak tersedia. Dalam kasus yang hilang, use_first_pass gagal, dan try_first_pass mengizinkan modul untuk meminta kata sandi.


Inilah yang akhirnya saya lakukan. Lihat komentar yang ditandai dengan tiga tanda bintang.

#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <security/pam_appl.h>
#include <unistd.h>

// To build this:
// g++ test.cpp -lpam -o test

// if pam header files missing try:
// sudo apt install libpam0g-dev

struct pam_response *reply;

//function used to get user input
int function_conversation(int num_msg, const struct pam_message **msg, struct pam_response **resp, void *appdata_ptr)
{
  *resp = reply;
  return PAM_SUCCESS;
}

int main(int argc, char** argv)
{
  if(argc != 2) {
      fprintf(stderr, "Usage: check_user <username>\n");
      exit(1);
  }
  const char *username;
  username = argv[1];

  const struct pam_conv local_conversation = { function_conversation, NULL };
  pam_handle_t *local_auth_handle = NULL; // this gets set by pam_start

  int retval;

  // local_auth_handle gets set based on the service
  retval = pam_start("common-auth", username, &local_conversation, &local_auth_handle);

  if (retval != PAM_SUCCESS)
  {
    std::cout << "pam_start returned " << retval << std::endl;
    exit(retval);
  }

  reply = (struct pam_response *)malloc(sizeof(struct pam_response));

  // *** Get the password by any method, or maybe it was passed into this function.
  reply[0].resp = getpass("Password: ");
  reply[0].resp_retcode = 0;

  retval = pam_authenticate(local_auth_handle, 0);

  if (retval != PAM_SUCCESS)
  {
    if (retval == PAM_AUTH_ERR)
    {
      std::cout << "Authentication failure." << std::endl;
    }
    else
    {
      std::cout << "pam_authenticate returned " << retval << std::endl;
    }
    exit(retval);
  }

  std::cout << "Authenticated." << std::endl;

  retval = pam_end(local_auth_handle, retval);

  if (retval != PAM_SUCCESS)
  {
    std::cout << "pam_end returned " << retval << std::endl;
    exit(retval);
  }

  return retval;
}

Linux
  1. 3 pendekatan manajemen rahasia untuk aplikasi Flatpak

  2. Cara mengatur SPF untuk otentikasi email tambahan

  3. tomboy-ng – Aplikasi Pencatat Sederhana untuk Desktop

  1. Menggunakan ssh-keygen dan berbagi untuk otentikasi berbasis kunci di Linux

  2. Otentikasi Pam Vsftpd Gagal?

  3. Membatasi akses syscall untuk aplikasi Linux

  1. Linux – Aplikasi Mana yang Digunakan Untuk Kalender?

  2. Bersiaplah untuk acara dengan lalu lintas tinggi

  3. sshd:Cara mengaktifkan otentikasi PAM untuk pengguna tertentu di bawah