shell script: gunakan sudo di dalamnya vs jalankan dengan sudo?

13

Saat menulis skrip shell, di mana beberapa tapi tidak semua perintah di dalamnya membutuhkan hak superuser, haruskah saya

  • tambahkan sudo ke perintah-perintah yang membutuhkan hak superuser, dan jalankan skrip shell tanpa sudo, atau

  • jangan menambahkan sudo ke perintah-perintah yang membutuhkan hak superuser, tetapi jalankan skrip shell dengan sudo?

Dengan cara kedua saya hanya perlu memberikan kata sandi saya sekali, tetapi semua perintah dalam skrip akan dijalankan dengan supervilleges superuser, termasuk perintah-perintah yang tidak perlu.

Dengan cara pertama saya mungkin perlu memberikan kata sandi saya beberapa kali untuk perintah sudo yang berbeda, sedangkan hak superuser hanya diberikan kepada perintah yang membutuhkannya.

Dari masalah keamanan, cara pertama lebih baik. Untuk kenyamanan, cara kedua lebih baik.

  1. Saya telah berpikir untuk mengadopsi cara pertama. Jadi saya harus berurusan dengan ketidaknyamanan dalam memberikan kata sandi saya ke beberapa perintah sudo dalam skrip shell.

  2. Stephen Harris menulis :

    Skrip yang ditulis dengan baik akan mendeteksi apakah itu berjalan dengan izin yang tepat dan tidak memanggil sudo sama sekali, tapi ada banyak skrip yang buruk

    Jadi haruskah saya menggunakan cara kedua? Jika begitu,

    • bagaimana saya bisa menulis "skrip akan mendeteksi jika sedang berjalan dengan izin yang tepat dan tidak memanggil sudo sama sekali"?

    • bagaimana saya bisa meningkatkan keamanannya untuk menghindari masalah memberikan hak superuser ke perintah yang tidak membutuhkannya saat menjalankan skrip dengan sudo?

  3. Apakah pendekatan sederhana ini memiliki yang terbaik dari kedua pendekatan: tambahkan sudo ke perintah yang hanya membutuhkannya, dan jalankan skrip dengan atau tanpa sudo tergantung pada apakah saya menginginkan kenyamanan atau keamanan? Apakah pendekatan ini memiliki beberapa masalah?

Terima kasih.

Tim
sumber
Saya pikir sudomemiliki cache kredensial default. Apakah ini dinonaktifkan pada platform Anda?
pipa
@pipe Naskahnya mungkin tertidur selama beberapa kali misalnya, dan dengan demikian cache mungkin tidak berfungsi.
LinuxSecurityFreak

Jawaban:

15

Untuk mengatasi masalah pertama Anda:

bagaimana saya bisa menulis "skrip akan mendeteksi jika sedang berjalan dengan izin yang tepat dan tidak memanggil sudo sama sekali"?

Ada pemeriksaan sederhana dan POSIX untuk root:

#!/bin/sh
is_user_root ()
{
    [ "$(id -u)" -eq 0 ]
}

Atau, di Bash, lebih banyak coder yang didorong oleh kinerja mungkin ingin menggunakan:

#!/bin/bash
is_user_root ()
{
    [ ${EUID:-$(id -u)} -eq 0 ]
}

Perhatikan bahwa saya sengaja membungkus kode dalam fungsi untuk digunakan kembali.

Untuk mengatasi masalah kedua Anda:

bagaimana saya bisa meningkatkan keamanannya untuk menghindari masalah memberikan hak superuser ke perintah yang tidak membutuhkannya saat menjalankan skrip dengan sudo?

Anda tidak bisa berbuat banyak tentang ini. Setidaknya tidak ada yang terlintas di pikiran saya. Jika saya melihat skrip, saya mungkin punya saran. Tetapi karena Anda tidak memasukkannya dalam pertanyaan Anda ... Jika Anda menjalankan seluruh skrip dengan sudoatau sebagai root, saya tidak melihat cara untuk mengontrol ini.

Untuk menanggapi komentar:

Apa pendapat Anda tentang "gunakan sudo di dalamnya vs jalankan dengan sudo"

Dalam skrip saya, saya biasanya melanjutkan dengan pendekatan yang terakhir, tetapi itu tidak berarti saya merekomendasikannya kepada Anda. Karena itu tergantung pada siapa skrip dimaksudkan untuk - roothanya; untuk pengguna sebagian besar dengan pengecualian memiliki beberapa pengguna yang memiliki sudohak; Anda harus benar-benar memasukkan skrip Anda ke dalam pertanyaan agar saya dapat menjawab dengan nilai apa pun.

LinuxSecurityFreak
sumber
sudo -u "$SUDO_USER" command...?
Michael Homer
Terima kasih. Apa pendapat Anda tentang "gunakan sudo di dalamnya vs jalankan dengan sudo"?
Tim
Terima kasih. Apakah pendekatan sederhana ini memiliki yang terbaik dari kedua pendekatan: tambahkan sudo ke perintah yang hanya membutuhkannya, dan jalankan skrip dengan atau tanpa sudo tergantung pada apakah saya menginginkan kenyamanan atau keamanan? Apakah pendekatan ini memiliki beberapa masalah?
Tim
@MichaelHomer Saya bertanya-tanya apa sudo -u "$SUDO_USER" commandyang dimaksudkan di sini?
Tim
@ Tim Meskipun saya tidak menemukan masalah dengan pendekatan itu, seseorang mungkin keberatan dengan argumen yang masuk akal. Ini benar-benar di luar cakupan pertanyaan awal Anda. Saya perlu melakukan backup M-Disc bulanan saya sekarang, jadi saya pikir belum tersedia hari ini, maaf untuk itu. Saya harap saya menjawab setidaknya poin utama. Sampai jumpa besok.
LinuxSecurityFreak
-4

Saya pikir saya bisa menjawab ini.

Jadi haruskah saya menggunakan cara kedua?

Tidak ada alasan mengapa Anda memiliki masalah di sini, inilah sebabnya:

Jika hanya ada satu perintah yang perlu dijalankan sebagai root, maka runprogram Anda sebagai rootatau sudokarena sudodi dalam skrip Anda adalah jalan yang lebih panjang. Apakah Anda lupa bahwa pemrogram malas?

Jika Anda perlu banyak perintah runsebagai rootkemudian menjalankannya sebagai rootatau sudo.

bagaimana saya bisa meningkatkan keamanannya untuk menghindari masalah memberikan hak superuser ke perintah yang tidak membutuhkannya saat menjalankan skrip dengan sudo?

Jika pengguna lain perlu runprogram Anda, maka pengaturan sudountuk mereka karena sudobanyak disesuaikan dan akan memenuhi kebutuhan Anda.

Ini sebuah contoh dengan sudo:

Selalu gunakan visudosaat mengedit file sudoers .....

kate ALL=(ALL) NOPASSWD: /usr/local/bin/script ARG1 ARG2

sudo juga bagus untuk mengubah pengguna di dalam program / skrip Anda di sini adalah baris dari salah satu skrip tambang:

sudo -i -u "$user" user="$user" CURRENTDIR="$CURRENTDIR" BASHRC="$BASHRC" bash <<'EOF'

bagaimana saya bisa menulis "skrip akan mendeteksi jika sedang berjalan dengan izin yang tepat dan tidak memanggil sudo sama sekali"?

https://www.cyberciti.biz/tips/shell-root-user-check-script.html
how-do-i-menentukan-jika-a-shell-script-sedang berjalan dengan izin root

bash/sh:

#!/bin/bash
# (Use #!/bin/sh for sh)
if [ `id -u` = 0 ] 
then
        echo "I AM ROOT, HEAR ME ROAR"
fi

csh:

#!/bin/csh
if ( `id -u` == "0" ) 
then
        echo "I AM ROOT, HEAR ME ROAR"
endif

#!/bin/bash
if [[ $EUID -ne 0 ]]; then
  echo "You must be a root user" 2>&1
  exit 1
else
  mount /dev/sdb1 /mnt/disk2
fi

EDIT atas permintaan dari gentleman @terdon:

Pikirkan skrip Anda dengan cara ini ....

Apakah ini skrip publik (selain Anda akan menggunakannya) Apa yang dilakukan skrip? Apakah ini memberi tahu Anda waktu? Atau apakah itu memperbarui iptables di 200 sistem? Jika hanya Anda menggunakannya, apakah itu terkait dengan pekerjaan / profesional atau apakah untuk penggunaan pribadi?

Anda hanya perlu tahu sebelumnya apa yang terdiri dari grup pengguna Anda, itu saja.

Jika itu writtenuntuk memberi atau menjual kepada admin, bahkan kemudian, mengapa tidak scriptboleh dibiarkan berjalan seperti root?? Apa salahnya?

Script / program nyata sering dijalankan sebagai pengguna istimewa dan tidak ada yang menyebutkan bahwa itu tidak masalah, tetapi ketika programmer, kebanyakan pemula seperti saya berbicara tentang hal-hal ini, maka itu adalah ancaman keamanan nyata ..... apa yang orang dalam posting Anda, Anda lihat sedang mencoba untuk mengatakan sementara tidak elegan adalah bahwa beberapa orang melihat kontrol yang Anda miliki systemdan kode Anda .... apakah Anda mengatur file ke izin lebih banyak daripada yang akan Anda gunakan, apakah Anda memiliki semua cek di Anda logika atau programmer berbakat akan melihat bahaya dalam kode Anda hanya meliriknya?

Jika Anda code needs root, penggunaan sudo, dan jika ada banyak hanya menjalankannya sebagai root....... jawaban saya berakhir di sini Fiuh

sesuatu Sesuatu
sumber
2
@somethingSomething dapatkah Anda menjelaskan mengapa Anda merekomendasikan untuk selalu menjalankan skrip sebagai root, bahkan ketika hanya ada satu perintah yang membutuhkan root privilege? Anda memberikan dua kemungkinan dalam jawaban Anda (satu perintah yang membutuhkan hak akses root atau multipel) tetapi Anda menyarankan hal yang sama untuk keduanya.
terdon
2
Saya telah memikirkan masalah ini dan membaca diskusi serupa lainnya. Jawaban ini membingungkan saya. (Tapi, Anda sudah memiliki cukup banyak suara.)
Joe