Cara memasukkan kata sandi hanya sekali dalam skrip bash yang membutuhkan sudo

21

Data

  • Saya ingin pengguna operator di mesin ini untuk memasang saham cif mereka sendiri
  • The sudoersfile sudah berisi /bin/mount -t cifs //*/* /media/* -o username=*perintah untuk semua operator
  • Saya ingin pengguna me-mount cifsshare melalui skrip mengetik kata sandi hanya sekali, tidak dua kali.
  • Kata sandi sudo dan kata sandi cif identik.

Apa yang sudah saya miliki

Script ini berfungsi:

#!/bin/bash
sudo 'mount -t cifs //192.168.1.1/home /media/$USER/home -o username=$USER'

... tetapi mengharuskan pengguna untuk mengetikkan kata sandi yang sama dua kali!

  • Sekali untuk sudo
  • Sekali untuk mount itu sendiri

Ini juga akan berfungsi:

#!/bin/bash
echo -n Password: 
read -s szPassword
echo $szPassword | sudo -S sh -c 'echo $szPassword | mount -t cifs //192.168.1.1/home /media/$USER/home -o username=$USER'

... tetapi ini akan mengharuskan saya untuk memungkinkan semua pengguna operator untuk dapatsudo sh (masalah keamanan utama)

Pertanyaan

Bagaimana me-mount saham cifs di bash ¹ tanpa menempatkan shdalam sudoersberkas atau membuat file permanen / sementara ???

Catatan 1: tidak ada python, perl, C, Go, ... tolong?
Catatan 2: Saya tahu saya hanya bisa menghapus kata sandi melalui sudoersfile, tapi saya mencoba untuk memperketat keamanan, tidak melonggarkannya, tanpa melepaskan kenyamanan ...

Fabby
sumber
2
Bagaimana dengan printf "%s\n" "$szPassword" "$szPassword" | sudo -S mount -t cifs / ...?
muru
Coba itu sekarang! @Muru
Fabby

Jawaban:

24

Anda seharusnya membuat pengguna melakukan panggilan menggunakan sudo sebagai sudo script. cukup periksa apakah skrip dijalankan sebagai root, jika tidak memintanya

if [[ $EUID -ne 0 ]]; then
   echo "This script must be run as root, use sudo "$0" instead" 1>&2
   exit 1
fi

Jangan mencoba menangkap kata sandi pengguna Anda.

Braiam
sumber
1
Mungkin saya kehilangan sesuatu, tetapi bisakah Anda menjelaskan bagaimana ini mengurangi jumlah kata sandi yang diminta dari dua menjadi satu? Kalau tidak, saya tidak melihat bagaimana ini menjawab pertanyaan.
Oliphaunt - mengembalikan Monica
@Oliphaunt Saya tidak melihat dua permintaan kata sandi, bisakah Anda menjelaskannya? Juga, jawaban ini bukan yang diinginkan OP, tetapi apa yang dibutuhkannya. Apakah solusi bersih dan tepat ketika Anda perlu menjalankan perintah sebagai root, dan bagaimana utilitas lain lakukan (periksa apakah root, jika tidak bail out)
Braiam
1
Masalah OP (seperti yang saya mengerti) adalah bahwa pengguna diminta kata sandi mereka sudodan kemudian (setelah berhasil mengautentikasi) lagi oleh mount. Dalam kasus penggunaannya, kata sandi ini identik sehingga saya dapat melihat mengapa OP ingin pengguna hanya perlu memasukkan kata sandi ini sekali. Saya tidak percaya solusi Anda membantu dalam hal ini. Saya setuju bahwa seseorang tidak boleh menangkap kata sandi.
Oliphaunt - mengembalikan Monica
Terima kasih, tapi saya mungkin telah sedikit menyederhanakan pertanyaan: Ini adalah skrip, sudah berisi tes itu (kecuali 1>&2), ada di autostart dan dulu hanya satu cif berbagi, tapi sekarang tiga, jadi benar-benar satu kata sandi dibutuhkan. (Sudah berisi tes itu kalau-kalau ada orang lain, bukan anggota grup operator, mencoba menjalankannya)
Fabby
@ Fabby Saya masih berpikir Anda mendekati masalah dengan tidak benar. Untuk kasus ini ada penolong untuk "mengingat" kata sandi berbagi CIFS / SMB dengan aman (mengedit ~/.smbcredentialsmisalnya), dan bahkan tanpa perlu sudo (jika Anda menggunakan gvfs, umount atau polkit).
Braiam
7

Saya bodoh!

Script berikut:

#!/bin/bash
read -p "Password: " -s szPassword
printf "%s\n" "$szPassword" | sudo --stdin mount -t cifs //192.168.1.1/home /media/$USER/home -o username=$USER,password="$szPassword"

hanya bekerja dan:

  1. Tidak membuat file yang berisi kata sandi
  2. Mengizinkan pengguna mengetik hanya satu kata sandi untuk banyak bagian (termasuk yang Windows)
  3. Tidak perlu hak istimewa ekstra diberikan. :-)
Fabby
sumber
1
1 pertanyaan: apakah itu menggemakan perintah ke dalam daftar proses?
Rinzwind
3
@Rinzwind sebagai built-in, seharusnya tidak dalam bash atau zsh. Perintah mount bisa.
muru
<<<bisa juga digunakan sebagai pengganti printf , tetapi pendekatan yang lebih baik adalah dengan menghapus readsemuanya dan hanya menggunakan sudo --stdinsemuanya dengan sendirinya. Sesuatu seperti $ printf "Type out your password\n" && sudo --stdin apt-get update Pengguna masih dapat mengetikkan kata sandi sudo. dan itu tidak akan memasukkannya ke dalam daftar proses. Tapi tentu saja ada kemungkinan tak terbatas masalah keamanan lainnya, seperti keyloggers, potensi kerentanan dalam sudo, dan bla, dan bla, dan bla hingga tak terbatas
Sergiy Kolodyazhnyy
@SergiyKolodyazhnyy: Silakan diedit , bung!
Fabby
3

Tidak memerlukan sudokata sandi untuk menjalankan perintah ini; kata sandi meminta untuk mounttetap.

Dalam sudoers, sertakan sesuatu seperti

ALL        ALL = NOPASSWD: /bin/mount -t cifs //*/* /media/* -o username=*

Setelah memasukkan ini, sudotidak akan lagi meminta kata sandi untuk perintah khusus ini; pengguna masih perlu memberikan kata sandi untuk mountperintah tersebut.

Catatan : Saya mengambil perintah kata demi kata dari apa yang Anda sertakan dalam pertanyaan; Saya tidak memeriksa apakah wildcard-nya memungkinkan pengguna melakukan sesuatu yang jahat. Baca halaman sudoersmanual untuk contoh-contoh kekejian. Secara khusus, perhatikan bahwa baris ini sudoersmemungkinkan pengguna untuk menambahkan sejumlah -oswitch atau argumen lain mount. Anda mungkin ingin memikirkan kembali pendekatan Anda, misalnya dengan menambahkan skrip seperti @Braiam usulkan dan izinkan menjalankannya sudotanpa otentikasi tambahan. Script kemudian memastikan bahwa pengguna hanya dapat menjalankan bentuk spesifik mountyang Anda inginkan untuk dijalankan.

Selain itu, alih-alih membolehkan ini untuk semua pengguna, Anda juga dapat membatasi ini untuk anggota grup tertentu, misalnya Anda dapat membuat grup cifsmountdan kemudian memiliki

%cifsmount ALL = NOPASSWD: /bin/mount -t cifs //*/* /media/* -o username=*
Oliphaunt - mengembalikan Monica
sumber
@ Fabby Maaf, tapi apa yang sangat berbahaya tentang ini? Juga saya mungkin mendeteksi sedikit sarkasme, tidak yakin.
Oliphaunt - mengembalikan Monica
baik, bahkan jika sudo tidak memerlukan kata sandi, mount mungkin masih memerlukan kata sandi. File / etc / sudoers dapat digunakan hanya untuk membuat sudo tidak memerlukan kata sandi. Itu tidak akan memengaruhi apakah mount meminta kata sandi. Jika seseorang gagal untuk me-mount, maka sudo hanya akan berakhir menjalankan perintah yang gagal, yang kemungkinan tidak menjadi masalah.
TOOGAM
@TOOGAM Itu adalah niat saya. Satu kata sandi, bukan dua kata sandi.
Oliphaunt - mengembalikan Monica
Maksud saya adalah untuk menyimpan satu grup "operator" di file sudoers jadi jika operator mencoba untuk me-mount barang-barangnya sendiri, mereka masih harus mengetikkan kata sandi, tetapi untuk me-mount mount operator "standar", mereka hanya perlu mengetikkan kata sandi sekali bukannya 5 kali ... Tapi solusi Anda mungkin bekerja untuk orang lain, jadi terunggul ... (dan komentar asli dihapus)
Fabby
1

Solusi umum untuk masalah ini adalah dengan menempatkan pembukaan berikut di atas sudo Anda yang membutuhkan skrip:

#!/bin/bash
case $EUID in
   0) : cool we are already root - fall through ;;
   *) # not root, become root for the rest of this session
      # (and ask for the sudo password only once)
      sudo $0 "$@" ;;
esac
# now the present process is effective-UID  (root)
# so there's no need to put sudo in front of commands

any more commands here will run as superuser ...

Jelas, ini memiliki kelemahan karena jika beberapa perintah dalam skrip tidak perlu sudodijalankan, ada peningkatan hak istimewa yang tidak perlu di sini.

Ngomong-ngomong, kupikir aku akan membagikan tip kecil ini. Hal terbaik tentang hal itu, adalah bahwa jika Anda sudah berhasil-root root (misalnya jika Anda sudah memanggilnya dengan sudo) anggun melakukan hal yang benar. Juga memberikan kesalahan dan memaksa Anda mengetik ulang / menjalankan kembali (dengan sudo) kurang ramah.

Anda mungkin juga ingin memeriksa timestamp_timeoutvariabel man 5 sudoersyang memberitahu sudountuk mengingat kredensial pengguna selama beberapa menit (dan bisa pecahan).

diri sendiri
sumber
Saya menyederhanakan skrip untuk mendapatkan jawaban yang mudah: skrip sudah berisi: #test if root: if not: bail out if [[ $EUID -ne 0 ]]; then echo "This script must be run as root, use sudo "$0" instead" 1>&2 exit 1 fi Intinya adalah skrip itu juga berisi banyak tunggakan semua dengan kata sandi yang sama (sekali lagi: dihapus), tapi terima kasih ...
Fabby
1
Intinya adalah bahwa solusi di atas hanya membutuhkan satu pengetikan kata sandi (untuk sudo). Seharusnya tidak memerlukan yang lain. Plus itu adalah umum (dan lebih elegan daripada memberikan kesalahan dan harus mengetik ulang perintah dengan sudo) untuk semua masalah yang sama, bahkan ketika mereka memerlukan beberapa (lebih dari dua) perintah istimewa.
arielf
Ini harus tetapi tidak ! ;-) Itu karena setiap mount cifs berbagi memerlukan kata sandi juga. (karena dapat berbeda dari kata sandi Ubuntu, tetapi dalam kasus ini bukan karena operator menjaga kata sandi Windows dan Ubuntu mereka disinkronkan)
Fabby