Melewati PATH melalui sudo

13

Singkatnya : bagaimana membuat sudo agar tidak menyiram PATH setiap kali?

Saya memiliki beberapa situs web yang digunakan di server saya (pengujian Debian) yang ditulis dengan Ruby on Rails. Saya menggunakan Mongrel + Nginx untuk meng-host mereka, tetapi ada satu masalah yang muncul ketika saya harus me-restart Mongrel (misalnya setelah membuat beberapa perubahan).

Semua situs diperiksa dalam VCS (git, tetapi tidak penting) dan memiliki pemilik dan grup diatur untuk pengguna saya, sedangkan Mongrel berjalan di bawah, ya, pengguna mongrel yang sangat dibatasi hak-haknya. Jadi Mongrel harus dimulai di bawah root (secara otomatis dapat mengubah UID) atau mongrel.

Untuk mengelola mongrel saya menggunakan permata mongrel_cluster karena memungkinkan memulai atau menghentikan sejumlah server Mongrel dengan hanya satu perintah. Tetapi perlu direktori /var/lib/gems/1.8/bin berada di PATH: ini tidak cukup untuk memulainya dengan path absolut .

Memodifikasi PATH di root .bashrc tidak mengubah apa pun, men-tweak sudo env_reset dan env_keep juga tidak.

Jadi pertanyaannya: bagaimana cara menambahkan direktori ke PATH atau mempertahankan PATH pengguna di sudo?

Perbarui: beberapa contoh

$ env | grep PATH
PATH=/usr/local/bin:/usr/bin:/bin:/usr/games:/var/lib/gems/1.8/bin
$ sudo cat /etc/sudoers | egrep -v '^$|^#'
Defaults    env_keep = "PATH"
root    ALL=(ALL) ALL
%sudo ALL=NOPASSWD: ALL
$ sudo env | grep PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

Saya juga dapat mengatakan bahwa cara kerjanya persis seperti ini di stabil Debian (lenny) juga.

whitequark
sumber

Jawaban:

12

Berjuang dengan masalah yang sama selama beberapa jam. Di debian lenny, Anda dapat memperbaikinya dengan menambahkan

Defaults        exempt_group=<your group> 

ke file sudoers.

Ini adalah satu-satunya cara untuk berkeliling opsi --secure-path terkompilasi, (sejauh yang saya tahu).

Khususnya, ini juga akan membebaskan pengguna dari perlu memasukkan kata sandi mereka ketika mereka sudo.

rampok
sumber
3

Jika sudah secure_pathdiatur /etc/sudoers, Anda dapat bermain dengan env_reset/ env_keepsemua yang Anda suka dan itu tidak akan membuat perbedaan apa pun pada jalur. Jika Anda melihat sesuatu seperti ini, beri komentar.

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
Draemon
sumber
Tidak, tentu saja itu tidak diatur.
whitequark
0

Saya akan mengatakan melihat opsi env_reset dan env_keep di man sudo . Tapi sepertinya Anda sudah melakukan itu (Anda salah memanggil env_keep "keepenv"). Jika Anda menonaktifkan pilihan env_reset (default diaktifkan), saya pikir itu tidak seharusnya menghapus setiap variabel env. Tapi ini kurang aman.

Ada juga opsi secure_path untuk sudo; Saya pikir ini diaktifkan secara default. Anda dapat mencoba menonaktifkannya.

Opsi-opsi sebelumnya diatur dalam file / etc / sudoers Anda. Ada juga -iopsi baris perintah untuk sudo. Itu akan menyebabkan sudo menjalankan /root/.profile atau /root/.login. Anda dapat mengatur jalur yang Anda inginkan di sana.

dubiousjim
sumber
1
Tidak, ketika env_reset dimatikan, masih berubah (tidak menghapus) PATH. Mungkin ini dilakukan untuk menambahkan dir / * / sbin. Tidak, opsi -i tidak cocok karena memulai shell interaktif, dan saya hanya perlu menjalankan perintah.
whitequark
Oke, masalah hilang setelah menginstal ulang Debian (karena bermigrasi ke LVM) dan juga RubyGems; jawaban Anda adalah yang paling berguna dari semuanya sehingga dapat diterima sekarang.
whitequark
-1

Nah, Anda melakukan sesuatu yang salah. Juga, Anda tidak menentukan apa yang Anda lakukan dengan file / etc / sudoers Anda. Inilah yang harus Anda lakukan - ini adalah sistem CentOS, BTW:

Pertama, ini dengan pengaturan env_keep yang tepat (perhatikan PATH ada di sana):

sudo grep -5 PATH / etc / sudoers Default env_keep = "WARNA DISPLAY HOSTNAME HISTSIZE inputrc KDEDIR \ LS_COLORS MAIL PS1 PS2 QTDIR USERNAME \ LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC \ LC_PAPER LC_TELEPHONE LC_TIME LC_ALL BAHASA LINGUAS \ _XKB_CHARSET XAUTHORITY PATH"

Defaults   timestamp_timeout = 15 

## Next comes the main part: which users can run what software on 
## which machines (the sudoers file can be shared between multiple

-> export PATH=$PATH:hithere
-> sudo sh -c 'echo $PATH'
/sbin:/bin:/usr/sbin:/usr/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/bin:hithere

Kelihatan bagus. Sekarang mari kita hapus pengaturan env_keep dan coba lagi:

-> sudo visudo
-> sudo grep -5 PATH /etc/sudoers
                    LS_COLORS MAIL PS1 PS2 QTDIR USERNAME \
                    LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION \
                    LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC \
                    LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS \
                    _XKB_CHARSET XAUTHORITY"
 #_XKB_CHARSET XAUTHORITY PATH"

PATH yang menyedihkan:

 -> sudo sh -c 'echo $PATH'
 /usr/bin:/bin
Emmel
sumber
1
Saya memeriksa LEBIH dari dua kali! Periksa pembaruan di pos.
whitequark
Saya memiliki masalah yang sama, saya pasti memiliki pengaturan yang tepat yang Anda sebutkan
Draemon