Izinkan user1 untuk “su - user2” tanpa kata sandi

51

Saya perlu mengizinkan pengguna martinuntuk beralih ke pengguna martin-testtanpa kata sandi

su - martin-test

Saya pikir ini dapat dikonfigurasi dalam /etc/pam.d/su. Sudah ada beberapa baris dalam file itu yang bisa dibatalkan komentarnya. Namun, saya tidak suka ide menambahkan pengguna martinke grup wheel. Saya tidak ingin memberikan martinlebih banyak hak istimewa selain untuk dapat beralih ke martin-test. Saya juga tidak ingin menggunakan sudo.

Apa yang akan menjadi cara terbaik untuk melakukannya, sambil menjaga hak pengguna martinminimal?

Martin Vegter
sumber
2
Ini lebih mudah dilakukan dengan sudomis sudo -u martin-test -i. Apakah ada alasan yang Anda tanyakan secara spesifik su?
jordanm
Saya tidak ingin menginstal sudohanya karena ini (saya biasanya tidak menggunakan sudodan saya tidak terlalu suka). Dan saya pikir menggunakan pamlebih bersih dan lebih transparan untuk melakukannya.
Martin Vegter
3
@ MartinVegter Seperti yang Anda lihat dari jawaban skrip, melakukan ini melalui semacam mekanisme pam sangat jelek. Sungguh inilah yang sudodimaksudkan untuk itu. Selain tidak biasa menggunakannya, apa keberatannya?
Patrick
1
Jika solusi bersih memungkinkan pam, saya lebih suka itu sudo. Jika sudosatu-satunya kemungkinan, maka itu juga baik-baik saja. Keberatan saya sudosebagian besar ideologis: Saya tidak suka ide pengguna melakukan administrasi dengan sudo foo. Ketika saya perlu melakukan administrasi, saya masuk sebagai root. Kalau tidak saya login sebagai pengguna, dua peran yang berbeda ini tidak boleh dicampur. Saya juga sudah pammenginstal infrastruktur. Saya tidak ingin menginstal setuidprogram lain yang mungkin dapat memperkenalkan bug keamanan.
Martin Vegter
5
@ MartinVegter Anda tidak perlu melakukan sudo fooperintah tertentu. Sudo memiliki sudo -syang akan meluncurkan shell. sudo adalah utilitas yang sangat umum yang berarti keamanannya telah diperiksa secara menyeluruh, jauh lebih dari beberapa tipu daya pam. Saya juga berpendapat bahwa mendapatkan root shell untuk tugas-tugas jauh lebih tidak aman daripada meluncurkan perintah tertentu. Saat Anda meluncurkan shell, Anda menjalankan semuanya sebagai root. Jika salah satu dari hal-hal itu (seperti sederhana ls) memiliki kerentanan keamanan, maka Anda baru saja membuka lubang keamanan.
Patrick

Jawaban:

61

Tambahkan baris berikut tepat di bawah pam_rootok.sogaris di /etc/pam.d/su:

auth  [success=ignore default=1] pam_succeed_if.so user = martin-test
auth  sufficient                 pam_succeed_if.so use_uid user = martin

Baris-baris ini melakukan pemeriksaan menggunakan pam_succeed_if.somodul. Lihat juga sintaksis file konfigurasi Linux-PAM untuk mempelajari lebih lanjut tentang authbaris.

  • Cek baris pertama apakah target pengguna adalah martin-test. Jika ya, tidak ada yang terjadi ( success=ignore) dan kami melanjutkan di baris berikutnya untuk memeriksa pengguna saat ini . Jika tidak, baris berikutnya akan dilewati ( default=1) dan kami melanjutkan baris berikutnya dengan langkah otentikasi biasa.
  • Baris kedua memeriksa apakah pengguna saat ini martin. Jika ya, sistem menganggap proses otentikasi sebagai berhasil dan mengembalikan ( sufficient). Jika tidak, tidak ada yang terjadi dan kami melanjutkan baris berikutnya dengan langkah otentikasi biasa.

Anda juga dapat membatasi suke grup, di sini grup allowedpeopledapat sutanpa kata sandi:

auth sufficient pam_succeed_if.so use_uid user ingroup allowedpeople
GnP
sumber
1
Jika Anda ingin mengotorisasi jika mereka berada dalam grup tertentu: auth cukup pam_succeed_if.so pengguna ingroup GROUP
shrimpwagon
@gnp Super Terima kasih !! Bekerja pada iCinga dengan nrpe, harus menjalankan beberapa perintah sebagai pengguna yang berbeda !! Banyak membantu !!!!!! Terima kasih!!!!!
saravanakumar
@GnP Tolong bantu saya di askubuntu.com/questions/821793/…
Nullpointer
Akan menyenangkan untuk menambahkan info tentang cara menerapkan perubahan juga.
Kyslik
@Kyslik apa maksudmu? Petunjuk tentang cara mengedit file yang diperlukan ada di jawaban ...
GnP
12

Jika Anda tidak ingin mengubah grup atau menggunakan sudo, gunakan modul pam yang dipanggil pam_execuntuk menjalankan skrip eksternal dalam tahap pam.

Tambahkan baris di Anda /etc/pam.d/susetelah pam_rootok.sobaris:

auth       sufficient pam_exec.so quiet /path/to/script

/path/to/script memiliki izin 755 (rwxr-xr-x) dan konten berikut:

#!/bin/bash
if [ "$PAM_TYPE" == "auth" ] && \
[ "$PAM_USER" == "martin-test" ] && \
[ "$PAM_RUSER" == "martin" ]; then
  exit 0
else
  exit 1
fi

Jadi skrip ini ada dengan sukses jika su:

  • disebut dalam konteks otentikasi,
  • pengguna panggilan adalah martindan
  • pengguna untuk mengotentikasi adalah martin-test.

Lihat:

martin@host:~$ su - martin-test
martin-test@host:~$ exit
martin@host:~$ su - otheruser
Password: ****
otheruser@host:~$ 
kekacauan
sumber
1
pam_access dapat digunakan untuk menyediakan fungsionalitas yang serupa, tanpa bergantung pada skrip. (Inilah yang harus dilakukan
pam_access
1
@ jsbillings Apakah Anda akan membuat (dengan beberapa detail) jawaban lain?
Hauke ​​Laging
1
bagaimana saya perlu memodifikasi saya /etc/pam.d/suuntuk menggunakan pam_accessuntuk situasi saya?
Martin Vegter
3
@ jsbillings Sebenarnya pam_accesstidak bisa melakukan ini. Saat suakan melalui tumpukan pam, ia melakukannya sebagai pengguna yang Anda ubah, bukan pengguna yang Anda ubah. Jadi, jika Anda menambahkan aturan seperti + : martin : ALL, itu akan memungkinkan siapa pun berubah ke martin . Bahkan jika Anda mengubah martinke martin-test, masih akan membiarkan siapa pun melakukannya. Anda perlu menganalisis pengguna yang Anda gunakan, dan pengguna yang ingin Anda ubah. Sungguh, inilah tepatnya sudountuk ...
Patrick
0

Jika Anda tidak memiliki akses ke akun root, tetapi memiliki kata sandi pengguna yang ingin Anda gunakan untuk menjalankan perintah, Anda dapat melakukan hal berikut.

  • Ini akan menanyakan kata sandi toto Anda: su - toto -c whoami
  • Ini tidak akan: ssh toto @ localhost whoami

Cukup instal kunci publik Anda di otor_keys toto

Patrick
sumber
Jawaban bijaksana .. Namun, perintah yang ingin dijalankan seseorang sudah ada di mesin. Jadi tidak ada gunanya ssh'ing ke server yang sama.
Raja Anbazhagan
-1

Solusi sederhana saya adalah:

sudo login -f martin-test

Jika Anda ingin menghindari sudo dengan cara apa pun, saya pikir harus dimungkinkan untuk menempatkan ini dalam skrip:

  1. dimiliki oleh root dan dengan privilege root (menggunakan flag setuid )
  2. dieksekusi oleh semua orang, juga tanpa sudo.

Namun, saya tidak tahu chown rootdan chmod +s ToTest.shsedikit, untuk membuat ini benar-benar berfungsi:

#!/usr/bin/env bash
echo howdy, I am $(whoami)
sudo login -f martin-test

Saya masih berjalan sebagai pengguna normal saya, seperti gema memberitahu saya. Dan itu masih membutuhkan kata sandi sudo. Jika itu berjalan sebagai root, orang bisa menghapusnya dengan sudodi baris terakhir ...

Frank Nocke
sumber
Skrip setuid flag pada shell (atau skrip lain) tidak akan berfungsi di Linux dan untuk alasan yang baik. Perhatikan bahwa skrip di atas dengan bendera suid yang berfungsi akan segera menjadi jebakan: Skrip ini melibatkan bash melalui "env" (cukup dengan mengalahkan diri sendiri, karena jika Anda menganggap Anda tidak tahu di mana bashberada, mengapa Anda menganggap Anda tahu di mana envada atau apakah itu ada?). Tetapi pada akhirnya, Anda tidak tahu bashakan seperti apa tepatnya ini. Itu bisa berasal dari direktori pengguna yang memohon dan telah dikompilasi satu menit lebih awal dari kode sumbernya. Anda lihat kemana saya pergi? Atau pengguna dapat menimpa whoami...
David Tonhofer
Otak saya saat ini terlalu jauh dari masalah ini untuk sepenuhnya dipahami, tetapi masih terlalu banyak untuk penjelasan rinci.
Frank Nocke