login dan su internal

10

Saya mencoba memahami bagaimana izin pengguna bekerja di Linux. Kernel boot dan mulai initsebagai root, kan? Init kemudian menjalankan skrip startup dan menjalankan getty( agetty), lagi sebagai root. Agetty hanya membaca nama pengguna dan menjalankan login, masih sebagai root, saya pikir. Belum ada yang menarik. Tapi apa yang dilakukan login ? Saya tidak dapat menemukan yang lebih baik daripada "ini mencoba masuk". Misalkan login menemukan kata sandi cocok (dan kami mencoba masuk seperti biasa), bagaimana cara mengubah id pengguna? Saya pikir harus ada system call untuk itu tetapi saya tidak dapat menemukannya (mungkin saya hanya buta?)


Juga tentang su. sumemiliki set bit 'setuid' sehingga ketika kita menjalankannya, ia selalu berjalan sebagai root. Tetapi ketika kami memintanya untuk masuk sebagai pengguna biasa, sekali lagi perlu mengubah id pengguna. Apakah saya mengerti benar bahwa "sihir" yang sama terjadi di sudan loginketika mereka perlu mengubah pengguna? Jika demikian, mengapa ada dua program yang berbeda? Apakah ada jenis bisnis serius lain yang terjadi saat menjalankan login?

Anton Barkovsky
sumber

Jawaban:

9

Ada beberapa bagian yang dapat dilakukan oleh program login. Program masuk berbeda dalam cara mereka berinteraksi dengan pengguna yang mencoba masuk. Berikut adalah beberapa contoh:

  • login: membaca input pada terminal teks
  • su: dipanggil oleh pengguna yang sudah masuk, mendapatkan sebagian besar data dari argumen baris perintahnya, ditambah data otentikasi (kata sandi) dari terminal
  • gksu: mirip dengan su, tetapi membaca data otentikasi dalam X
  • rlogind: memperoleh input melalui koneksi TCP melalui protokol rlogin
  • sshd: memperoleh input melalui koneksi TCP melalui protokol SSH
  • Manajer tampilan X (xdm, gdm, kdm, ...): mirip dengan login, tetapi baca input pada layar X

Program-program ini beroperasi dengan cara yang serupa.

  1. Bagian pertama adalah otentikasi : program membaca beberapa input dari pengguna dan memutuskan apakah pengguna berwenang untuk login. Metode tradisional adalah membaca nama pengguna dan kata sandi, dan memeriksa apakah pengguna disebutkan dalam basis data pengguna sistem dan kata sandi yang diketik pengguna adalah yang ada di database. Tetapi ada banyak kemungkinan lain (kata sandi satu kali, otentikasi biometrik, transfer otorisasi, ...).

  2. Setelah ditetapkan bahwa pengguna diizinkan untuk masuk dan dalam akun apa, program login menetapkan otorisasi pengguna, misalnya grup apa yang akan menjadi milik pengguna dalam sesi ini.

  3. Program login juga dapat memeriksa batasan akun. Misalnya, ini dapat memberlakukan waktu login, atau jumlah maksimum pengguna yang masuk, atau menolak pengguna tertentu pada koneksi tertentu.

  4. Akhirnya program login mengatur sesi pengguna. Ada beberapa subteps:

    1. Tetapkan izin proses untuk apa yang telah diputuskan dalam otorisasi: pengguna, grup, batas, ... Anda dapat melihat contoh sederhana dari subtep ini di sini (hanya menangani pengguna dan grup). Ide dasarnya adalah bahwa program login masih berjalan sebagai root pada saat ini, sehingga memiliki hak akses maksimum; pertama-tama menghapus semua hak istimewa selain sebagai pengguna root, dan akhirnya panggilan setuiduntuk membatalkan hak istimewa terakhir.
    2. Mungkin me-mount direktori home pengguna, menampilkan pesan "Anda memiliki surat", dll.
    3. Aktifkan beberapa program sebagai pengguna, biasanya shell pengguna (untuk logindan su, atau sshdjika tidak ada perintah yang ditentukan; manajer tampilan X memanggil manajer sesi X atau manajer jendela).

Sebagian besar unites saat ini menggunakan PAM (Pluggable Authentication Module) untuk menyediakan cara yang seragam dalam mengelola layanan login. PAM membagi fungsinya menjadi 4 bagian : "auth" meliputi otentikasi (1 di atas) dan otorisasi (2 di atas); "Akun" dan "sesi" adalah seperti 3 dan 4 di atas; dan ada juga "kata sandi", yang tidak digunakan untuk login tetapi untuk memperbarui token otentikasi (misalnya kata sandi).

Gilles 'SANGAT berhenti menjadi jahat'
sumber
4

Sistem panggilan yang Anda cari disebut hal-hal seperti setuiddan seteuidmeskipun sebenarnya ada seluruh keluarga hem tergantung pada varian identitas pengguna yang Anda coba ubah.

Ada juga panggilan paralel seperti setgiduntuk mengubah grup yang menjalankan proses.

TomH
sumber
4

loginakan menghapus hak akses root bila perlu. Banyak program yang membutuhkan hak akses root hanya pada awalnya akan mulai sebagai root, melakukan apa yang perlu mereka lakukan, dan kemudian turun ke akun pengguna normal sehingga mereka tidak perlu khawatir tentang seseorang yang menggunakan bug dalam biner untuk mendapatkan akses ke shell root. loginsecara alami memiliki hak istimewa lebih lama, tetapi prinsipnya sama.

Sebenarnya menjatuhkan hak root cukup sepele. POSIX mendefinisikan setuid()dan setgid()fungsinya, yang masing-masing mengubah ID pengguna dan grup Anda (nyata dan efektif, jika Anda memulai sebagai root). loginpanggilan kedua ini, serta initgroups()untuk mengatur grup tambahan yang mungkin Anda miliki (karena setgidhanya untuk menetapkan ID grup utama Anda)

Secara alami itu adalah kernel yang sebenarnya menangani perubahan proses 'UID / GID. Bagaimana saya bisa menemukan implementasi panggilan sistem kernel Linux? menjelaskan banyak tentang syscalls; di sumber kernel saya, saya punya:

#define __NR_setgid 144
__SYSCALL(__NR_setgid, sys_setgid)
#define __NR_setuid 146
__SYSCALL(__NR_setuid, sys_setuid)

jadi 144 dan 146 adalah nomor panggilan sistem untuk fungsi-fungsi pada mesin saya


Saya tidak memeriksa susumbernya untuk melihat fungsinya, tetapi saya curiga ia juga menjatuhkan hak akses root sebelum exec()menggunakan shell, menggunakan metode yang sama

Michael Mrozek
sumber