Bagaimana menjalankan program tertentu sebagai root tanpa kata sandi?

169

Saya perlu menjalankan sesuatu sebagai sudo tanpa kata sandi, jadi saya menggunakan visudodan menambahkan ini ke sudoersfile saya :

MYUSERNAME ALL = NOPASSWD: /path/to/my/program

Lalu saya mencobanya:

$ sudo /path/to/my/program
[sudo] password for MYUSERNAME: 

Mengapa ia meminta kata sandi? Bagaimana saya bisa menjalankan / menggunakan perintah sebagai root dengan pengguna non-root, tanpa meminta kata sandi?

LanceBaynes
sumber

Jawaban:

91

Anda memiliki entri lain dalam sudoersfile yang juga cocok dengan pengguna Anda. The NOPASSWDrule perlu setelah itu satu dalam rangka untuk itu untuk didahulukan.

Setelah melakukan itu, biasanya sudoakan meminta kata sandi untuk semua perintah kecuali /path/to/my/program, yang akan selalu membiarkan Anda berjalan tanpa meminta kata sandi Anda.

Warren Young
sumber
6
apakah ini masih berfungsi jika /path/to/my/programitu adalah skrip python?
sadmicrowave
Bisakah program ini menjadi alias, ditetapkan untuk bash (yaitu di .bashrc)? Atau bahkan skrip shell di dalamnya /usr/local/sbin? Untuk mencoba.
Nikos Alexandris
Nikos - tidak, itu bukan alias. Itu harus menunjuk ke jalan nyata.
Paul Hedderly
sudoers? dimana? heawy menggunakan jawaban Anda (
Vasilii Suricov
@VasiliiSuricov: Biasanya ada /etc, tetapi beberapa sistem meletakkannya di tempat lain. Jika Anda tidak dapat menemukannya, cobalah man sudoers. Lokasi lokal untuk file itu harus diganti ke manhalaman pada saat sudoitu dibangun untuk sistem itu.
Warren Young
135

Jika ada beberapa entri yang cocok /etc/sudoers, sudo menggunakan yang terakhir. Oleh karena itu, jika Anda dapat menjalankan perintah apa pun dengan prompt kata sandi, dan Anda ingin dapat menjalankan perintah tertentu tanpa prompt kata sandi, Anda memerlukan pengecualian yang terakhir.

myusername ALL = (ALL) ALL
myusername ALL = (root) NOPASSWD: /path/to/my/program

Perhatikan penggunaan (root), untuk memungkinkan program dijalankan sebagai root tetapi tidak sebagai pengguna lain. (Jangan memberikan izin lebih dari minimum yang diminta kecuali Anda sudah memikirkan implikasinya.)

Catatan untuk pembaca yang tidak menjalankan Ubuntu atau yang telah mengubah konfigurasi sudo default (sudo Ubuntu ok secara default) : Menjalankan skrip shell dengan hak akses tinggi berisiko, Anda harus mulai dari lingkungan yang bersih (setelah shell sudah dimulai, sudah terlambat (lihat Izinkan setuid pada skrip shell ), jadi Anda perlu sudo untuk mengurusnya). Pastikan bahwa Anda memiliki Defaults env_resetdi /etc/sudoersatau bahwa pilihan ini adalah kompilasi-waktu default ( sudo sudo -V | grep envharus mencakup Reset the environment to a default set of variables).

Gilles
sumber
3
ex untuk me-root dari jhon dengan sudo su no pass -----> john ALL = (ALL) NOPASSWD: / bin / su
bortunac
5
@adrian Jika Anda ingin mengizinkan perintah sewenang-wenang sebagai root, buatlah itu john ALL=(ALL) NOPASSWD: all. Tidak ada gunanya melalui su.
Gilles
Pertanyaan: apakah saya harus mengubah izin skrip shell saya agar bisa dimodifikasi dan dibaca oleh pengguna root saja, untuk keamanan? Saya sedang memikirkan penyerang memodifikasi skrip, yang memiliki semua izin yang diberikan tanpa perlu kata sandi, sehingga ia melakukan apa yang dia inginkan. Jelas, penyerang bahkan tidak bisa membaca file sudoers untuk mengetahui skrip mana yang memiliki hak istimewa ini, tetapi masih dapat mencoba dengan semua skrip kustom saya setelah ia menemukan folder di mana mereka disimpan dengan harapan ada yang diizinkan, atau sesuatu seperti itu .
Jeffrey Lebowski
1
@JeffreyLebowski Jika Anda memiliki aturan sudo yang menjalankan skrip (langsung atau tidak langsung) maka sangat penting bahwa hanya root (atau orang yang memiliki hak akses root) yang dapat menulis ke file skrip, dan ke direktori yang berisi file skrip, dan untuk direktori induknya dan seterusnya. Tidak masalah bahwa siapa pun dapat membaca file skrip (kecuali jika berisi kata sandi atau sesuatu, tapi itu ide yang buruk, jika ada kata sandi, file itu harus ada dalam file sendiri, jika tidak, ada terlalu banyak risiko bocor secara tidak sengaja, misalnya dengan copy-paste bagian kode dalam pertanyaan di situs ini).
Gilles
1
@ alper Tidak. Sangat sedikit hal yang membutuhkan reboot. Setelah berubah sudoers, Anda tidak perlu melakukan sesuatu yang istimewa: sudoperiksa setiap kali.
Gilles
24

PERINGATAN : Jawaban ini dianggap tidak aman. Lihat komentar di bawah

Solusi Lengkap: Langkah-langkah berikut akan membantu Anda mencapai hasil yang diinginkan:

  1. Buat file skrip baru (ganti create_dir.shdengan nama skrip yang Anda inginkan):

    vim ~/create_dir.sh
    

    Script akan dibuat di direktori home pengguna

  2. Tambahkan beberapa perintah yang hanya dapat dijalankan oleh rootatau sudopengguna seperti membuat folder di tingkat direktori root:

    mkdir /abc
    

    Catatan: Jangan tambahkan sudoperintah ini. Simpan dan keluar (menggunakan :wq!)

  3. Tetapkan eksekusi untuk menggunakan itu:

    sudo chmod u+x create_dir.sh
    
  4. Buat perubahan agar skrip ini tidak memerlukan kata sandi.

    1. Buka sudoersfile:

      sudo visudo -f /etc/sudoers
      
    2. Tambahkan baris berikut di akhir:

      ahmad ALL=(root) NOPASSWD: /home/ahmad/create_dir.sh
      

      Ganti ahmaddengan apa pun nama pengguna Anda. Pastikan juga ini adalah baris terakhir. Simpan dan keluar.

  5. Sekarang ketika menjalankan perintah tambahkan sudosebelum itu seperti:

    sudo ./create_dir.sh
    

    Ini akan menjalankan perintah di dalam file skrip tanpa meminta kata sandi.

Ikuti langkah-langkah mudah yang disebutkan di sini http://step4wd.com/2013/09/14/run-root-commands-in-linux-ubuntu-without-password/

M. Ahmad Zafar
sumber
Akan lebih baik jika Anda memberikan langkah-langkah yang relevan di sini dan menggunakan tautan itu sebagai cadangan untuk informasi yang lebih terperinci. Dengan cara itu jawaban Anda mempertahankan nilai yang mungkin bahkan jika tautan itu tidak berlaku lagi.
Anthon
15
Nasihat ini tidak aman. Bagian sudodari sudo chmod u+x create_dir.shtidak perlu karena pengguna memiliki (mungkin) kepemilikan atas dir rumahnya. Karena pengguna dapat menulis create_dir.sh, Anda telah secara efektif memberikan shell root gratis kepada pengguna tersebut.
Lekensteyn
1
@Lekensteyn Yang berarti juga untuk program apa pun yang berjalan sebagai pengguna. Mungkin juga hanya memungkinkan pengguna untuk menjalankan apa pun dengan sudo tanpa kata sandi.
pydsigner
2
Apakah saya melewatkan sesuatu? Saya percaya bahwa keseluruhan chmodtidak perlu, karena Anda mengandalkan sudountuk meningkatkan hak istimewa Anda.
G-Man
10

Saya pikir sintaks Anda salah. Setidaknya saya menggunakan yang berikut ini yang berfungsi untuk saya:

myusername ALL=(ALL) NOPASSWD: /path/to/executable
muskK
sumber
6
Bagian (ALL)ini opsional, meninggalkannya memiliki efek yang persis sama. Memiliki (root)akan lebih baik, tetapi ketidakhadirannya tidak menjelaskan masalahnya.
Gilles
+1 untuk sudo untuk perintah ini dan tidak ada yang lain! Tidak ada alasan untuk menghancurkan seluruh sistem ...
Johan
3
@ Johan: Itu sudah dalam pertanyaan.
Gilles
5

Jika Anda ingin menghindari penggunaan sudo atau mengubah file konfigurasi sudoers, Anda dapat menggunakan:

sudo chown root:root path/to/command/COMMAND_NAME
sudo chmod 4775 path/to/command/COMMAND_NAME

Ini akan membuat perintah dijalankan sebagai root tanpa perlu sudo.

linuxgnuru
sumber
Wow, saya belum pernah mendengar solusi ini sebelumnya, pikiran membingungkan
sesuatu yang terjadi
Mengapa saya harus menggulir ke bawah hal-hal ini untuk menemukan jawaban terbaik? Terima kasih atas solusi aman sederhana ini.
RyanNerd
5

Jika Anda memiliki distro seperti Manjaro, Anda harus berurusan dengan file yang mengesampingkan definisi / etc / sudoers, Anda dapat menghapusnya atau bekerja secara langsung dengan file itu untuk menambahkan konfigurasi baru Anda.

File ini adalah:

sudo cat /etc/sudoers.d/10-installer

Cara HANYA untuk melihatnya di bawah hak akses root, Anda tidak dapat mendaftar direktori ini tanpa itu, file ini spesifik Manjaro, Anda mungkin menemukan konfigurasi ini dengan nama lain, tetapi dalam direktori yang sama.

Dalam file pilihan Anda, Anda dapat menambahkan baris berikut untuk mendapatkan konfigurasi yang Anda inginkan:

Abaikan otentikasi untuk grup

%group ALL=(ALL) NOPASSWD: ALL

atau Abaikan otentikasi untuk pengguna

youruser ALL=(ALL) NOPASSWD: ALL

atau Abaikan otentikasi yang dapat dieksekusi untuk pengguna tertentu

youruser ALL=(ALL) NOPASSWD: /path/to/executable

CATATAN CEPAT: Anda membuka pintu untuk menggunakan SUDO tanpa otentikasi, itu berarti Anda dapat menjalankan semuanya memodifikasi segala sesuatu dari sistem Anda, menggunakannya dengan responsabilitas.

Lyoneel
sumber
4

Pastikan sudo tidak alias. Jalankan seperti ini

/usr/bin/sudo /path/to/my/program

Misalnya shell alias seperti ini:

alias sudo="sudo env PATH=$PATH"

dapat menyebabkan perilaku ini.

Sepero
sumber
Anda benar, komentar saya rusak di sini , maaf untuk itu. Meskipun demikian saya tertarik - bagaimana Anda berharap alias mengubah pemrosesan sudoersoleh sudo. Atau apakah Anda berbicara tentang pengalihan sudoke sesuatu yang selalu mencetak pesan kesalahan ini untuk mengambil kata sandi? Itu tidak mungkin terjadi di sini ...
peterph
2
Saya mengalami masalah yang sama dengan OP. Ternyata disebabkan oleh ada alias sudo="sudo env PATH=$PATH"di saya ~/.bashrc. Daripada hanya menyelesaikannya untuk diri saya sendiri dan secara membabi buta hanya tentang bisnis saya, saya mengirimkan jawaban saya sebagai solusi yang mungkin untuk siapa pun yang datang di thread ini.
Sepero
1
Tidak apa-apa, tetapi ketika itu tidak jelas (yang dalam hal ini tidak setidaknya bagi sebagian orang) ada baiknya untuk memberikan penjelasan pada jawaban untuk memberikan beberapa konteks dan mencegah orang dari membabi buta menggunakan mantra sihir. +2 (- (- 1) + +1). :)
peterph
2

Saat Anda menjalankan skrip, Anda harus menjalankannya sebagai sudo /path/to/my/script.

Sunting: Berdasarkan komentar Anda ke jawaban lain, Anda ingin menjalankan ini dari ikon. Anda perlu membuat .desktopfile yang mengeksekusi program Anda dengan sudo, seperti pada terminal.

Anda juga dapat mempertimbangkan gtk-sudountuk menggunakan prompt kata sandi visual.

Anda mungkin harus mempertimbangkan gagasan bahwa Anda seharusnya tidak menjalankan sesuatu sebagai root dan mengubah sistem lebih jauh sehingga Anda tidak memerlukan izin root sama sekali akan menjadi cara yang lebih baik.

Caleb
sumber
7
Jangan membuat setuid skrip shell . Lihat Izinkan setuid pada skrip shell .
Gilles
Saya bahkan dianggap tidak menyebutkannya karena itu pilihan yang buruk. Saya baru saja menghapusnya karena saya khawatir penanya ini mungkin menggunakan saran itu bahkan dengan peringatan bahwa itu adalah saran yang buruk!
Caleb
2

Ini menyelesaikan masalah bagi saya (juga mencoba beberapa jawaban lain, yang mungkin membantu):

Script yang saya panggil ada di /usr/bin, direktori yang saya tidak punya izin menulis (meskipun saya biasanya dapat membaca file apa pun di sana). Script chmodded + x (permisison yang dapat dieksekusi), tetapi masih tidak berfungsi. Memindahkan file ini ke jalur di direktori home saya, alih-alih /usr/bin, saya akhirnya bisa memanggilnya dengan sudo tanpa memasukkan kata sandi.

Juga sesuatu yang saya ragukan (mengklarifikasi untuk pembaca masa depan): Anda perlu menjalankan skrip Anda sebagai sudo. Ketik sudosaat memanggil skrip. Jangan gunakan sudountuk perintah di dalam skrip Anda yang sebenarnya membutuhkan root (mengubah backlight keyboard dalam kasus saya). Mungkin itu juga berhasil, tetapi Anda tidak perlu, dan sepertinya solusi yang lebih baik untuk tidak melakukannya.

Luc
sumber
Paragraf kedua memiliki jawaban untuk masalah saya
M. Ahmad Zafar
@MuhammadAhmadZafar Senang membantu!
Luc
4
Sebenarnya menggunakan sudobagian dalam skrip sangat baik asalkan Anda memiliki hak yang sesuai (ditetapkan sudoers) untuk menjalankan perintah yang dipermasalahkan tanpa kata sandi. Itu membuat segalanya sedikit lebih aman.
peterph
benar-benar dapat menggunakan jawaban ini ditulis ulang sebagai langkah-demi-langkah 'ini adalah bagaimana Anda melakukannya' daripada sebagai dialog dengan jawaban lain
Walrus the Cat
@ WalustustheCat Poin bagus. Membaca ulang jawaban saya, saya pikir saya mungkin sedikit bingung sendiri. Namun saat ini, saya tidak ingat apa persisnya situasinya sehingga saya tidak bisa melakukan Lup yang lebih baik. Jika Anda mengetahuinya, mungkin kombinasi dari beberapa jawaban, tentu saja kirimkan jawaban baru!
Luc
1

Kemungkinan lain mungkin untuk menginstal, mengkonfigurasi, lalu menggunakan perintah super untuk menjalankan skrip Anda sebagai

super /path/to/your/script

Jika Anda ingin menjalankan beberapa biner yang dapat dieksekusi (mis. Anda telah dikompilasi ke dalam biner ELF dari beberapa kode sumber C) -yang bukan skrip- sebagai root, Anda dapat mempertimbangkan membuatnya setuid (dan sebenarnya /bin/login, /usr/bin/sudodan /bin/sudan supersemuanya menggunakan teknik itu ). Namun, berhati-hatilah, Anda bisa membuka lubang keamanan besar .

Secara konkret, program Anda harus diberi kode paranoik (jadi periksalah semua argumen dan lingkungan dan kondisi di luar sebelum "bertindak", dengan asumsi pengguna yang berpotensi memusuhi), maka Anda dapat menggunakan seteuid (2) dan teman-teman (lihat juga setreuid (2) ) dengan cermat (lihat juga kemampuan (7) & kredensial (7) & laksanakan (2) ...)

Anda akan menggunakan chmod u+s(baca chmod (1) ) saat memasang biner seperti itu.

Tapi berhati-hatilah .

Baca banyak hal tentang setuid , termasuk Pemrograman Linux Lanjut , sebelum mengkode hal semacam itu.

Perhatikan bahwa sebuah skrip, atau hal apa pun yang terkait dengan shebang , tidak dapat disetuid. Tapi Anda bisa membuat kode (dalam C) sebuah set biner-biner kecil yang membungkusnya.

Basile Starynkevitch
sumber
0

Idealnya jika Anda mengkustomisasi perintah apa yang dapat dijalankan melalui sudoAnda harus membuat perubahan ini dalam file terpisah di bawah /etc/sudoers.d/bukannya mengedit sudoersfile secara langsung. Anda juga harus selalu menggunakan visudountuk mengedit file. Anda harus PERNAH memberikan NOPASSWDpada ALLperintah.

Contoh: sudo visudo -f /etc/sudoers.d/mynotriskycommand

Masukkan izin pemberian baris Anda: myuser ALL= NOPASSWD: /path/to/your/program

Kemudian simpan dan keluar dan visudoakan memperingatkan Anda jika Anda memiliki kesalahan sintaksis.

Anda dapat berlari sudo -luntuk melihat izin yang telah diberikan oleh pengguna Anda, jika ada NOPASSWDperintah khusus pengguna yang muncul SEBELUM %groupyouarein ALL=(ALL) ALLperintah apa pun dalam output, Anda akan dimintai kata sandi.

Jika Anda menemukan diri Anda membuat banyak file sudoers.d ini, maka mungkin Anda ingin membuatnya bernama per pengguna sehingga lebih mudah untuk divisualisasikan. Perlu diingat bahwa urutan NAMA FILE dan ATURAN dalam file sangat penting, yang TERAKHIR yang dimuat menang, apakah LEBIH atau KURANG permisif daripada entri sebelumnya.

Anda dapat mengontrol urutan nama file dengan menggunakan awalan 00-99 atau aa / bb / cc, meskipun juga perlu diingat bahwa jika Anda memiliki file APA PUN yang tidak memiliki awalan numerik, mereka akan memuat setelah file bernomor, menimpa pengaturan. Ini karena tergantung pada pengaturan bahasa Anda, "pengurutan leksikal" shell menggunakan nomor urut pertama dan kemudian dapat interleave huruf besar dan kecil ketika mengurutkan dalam urutan "naik".

Coba jalankan printf '%s\n' {{0..99},{A-Z},{a-z}} | sortdan printf '%s\n' {{0..99},{A-Z},{a-z}} | LANG=C sortuntuk melihat apakah bahasa Anda saat ini mencetak AaBbCcdll atau ABCkemudian abcuntuk menentukan apa awalan huruf "terakhir" terbaik yang akan digunakan.

dragon788
sumber
0

Agar setiap pengguna dapat menjalankan program sebagai sudo tanpa meminta kata sandi, Anda dapat menambahkan baris berikut

%sudo ALL=(root) NOPASSWD: /path/to/your/program

di /etc/sudoers

Perhatikan bahwa % sudo berhasil.

ultimatex
sumber
Meskipun itu salah satu cara untuk mencapai aturan sudo, itu tidak menjawab pertanyaan tentang mengapa pengaturan flag NOPASSWD pada aturan ini masih menghasilkan prompt kata sandi. Lihat jawaban yang diterima untuk ide mengapa itu terjadi.
Jeff Schaller
0

Berikut ini adalah untuk kasus di mana Anda ingin menjalankan perintah tanpa kata sandi hanya jika memiliki serangkaian opsi tertentu, di mana bagian dari opsi adalah variabel . AFAIK tidak mungkin menggunakan variabel atau rentang nilai dalam deklarasi sudoers, yaitu Anda dapat mengizinkan akses secara eksplisit ke command option1tetapi tidak command option2menggunakan:

user_name ALL=(root) /usr/bin/command option1

tetapi jika strukturnya command option1 value1, di mana value1bisa bervariasi, Anda harus memiliki garis sudoer eksplisit untuk setiap nilai yang mungkin value1. Script shell menyediakan jalan keluar.

Jawaban ini terinspirasi oleh jawaban M. Ahmad Zafar dan memperbaiki masalah keamanan di sana.

  1. Buat skrip shell tempat Anda memanggil perintah tanpa sudo.
  2. Simpan skrip dalam folder istimewa root (mis. /usr/local/bin/), Buat file milik root (mis. chown root:wheel /usr/local/bin/script_name) Tanpa akses tulis untuk orang lain (mis chmod 755 /usr/local/bin/script_name.).
  3. Tambahkan pengecualian ke sudoers menggunakan visudo:

    user_name ALL=(root) NOPASSWD: /usr/local/bin/script_name.

  4. Jalankan skrip Anda sudo script_name.

Sebagai contoh, saya ingin mengubah waktu tidur tampilan pada macOS. Ini dilakukan dengan menggunakan:

sudo pmset displaysleep time_in_minutes

Saya menganggap mengubah batas waktu tidur sebagai tindakan tidak bersalah yang tidak membenarkan kerumitan pengetikan kata sandi, tetapi pmsetdapat melakukan banyak hal dan saya ingin menyimpan hal-hal lain ini di belakang kata sandi sudo.

Jadi saya punya skrip berikut di /usr/local/bin/ds:

#!/bin/bash
if [ $# -eq 0 ]; then
        echo 'To set displaysleep time, run "sudo ds [sleep_time_in_minutes]"'
else
        if [[ $1 =~ ^([0-9]|[1-9][0-9]|1[0-7][0-9]|180)$ ]]; then
                pmset displaysleep $1 
        else
                echo 'Time must be 0..180, where 0 = never, 1..180 = number of minutes'
        fi
fi

Di akhir sudoersfile saya memiliki baris berikut:

user_name ALL=(root) NOPASSWD: /usr/local/bin/ds

Untuk menetapkan batas waktu 3 menit, saya menjalankan skrip saya dari akun pengguna biasa user_name:

sudo ds 3

PS Sebagian besar skrip saya adalah validasi input, yang tidak wajib, jadi yang berikut ini juga berfungsi:

#!/bin/bash
pmset displaysleep $1 
Koit Saarevet
sumber