Apakah aman mengunyah `/ usr / local`?

15

Saya tahu untuk apa /usr/local- menginstal perangkat lunak untuk mesin lokal. Secara default, rootmemiliki direktori. Ini berarti bahwa untuk menginstal di sana, Anda harus menggunakan sudo. Untuk pengguna tunggal atau mesin pengembang, ini sepertinya tidak perlu menggunakan perintah secara ekstra. Karena itu, pertanyaan saya - apakah aman untuk saya miliki /usr/local?

Misalnya, Homebrew untuk OS X "Just Works" karena mereka memiliki /usr/localdan menginstal perangkat lunak mereka dengan aman di sana tanpa menggunakan sudo.

Selain itu, jika Anda telah menginstal perangkat lunak yang dikompilasi secara lokal /usr/local, perangkat lunak saat ini membutuhkan root untuk memodifikasi sendiri atau menginstal plugin. Ini tampaknya tidak aman - Saya hanya ingin menggunakan sudoketika saya tahu PERSIS apa yang akan terjadi.

Pendapat?

PR3x
sumber

Jawaban:

5

Saya tidak bisa merekomendasikan menjadi pemilik /usr/local; untuk sebagian besar situasi, itu mungkin kurang aman daripada menggunakan sudo.

Pertanyaan Anda menyarankan dua alasan yang mungkin Anda inginkan chown /usr/local.

Yang pertama adalah untuk menghindari keharusan menggunakan sudountuk menginstal perangkat lunak. Ini mungkin dibaca oleh beberapa orang (seperti penulis jawaban ini ) yang mengatakan Anda ingin bekerja secara efisien, atau menyimpan penekanan tombol yang diperlukan untuk mengetik sudodan memasukkan kata sandi Anda. Tetapi mungkin ketika Anda mengatakan "tidak perlu," Anda merujuk pada prinsip hak istimewa :

Secara default, rootmemiliki direktori. Ini berarti bahwa untuk menginstal di sana, Anda harus menggunakan sudo. Untuk pengguna tunggal atau mesin pengembang, ini sepertinya tidak perlu menggunakan perintah secara ekstra

Saya cukup sering mendengar / membaca pendapat orang-orang / mengeluh di sepanjang baris "Saya adalah satu-satunya yang menggunakan sistem ini, jadi saya tidak perlu menggunakan sudodan memasukkan kata sandi." Bagi pembaca yang memiliki pandangan itu, dan karena relevan di sini, mari kita mengingatkan diri kita sendiri tentang alasan keamanan dasar untuk root untuk memiliki hal-hal.

Sebagian besar file program yang diinstal pada sistem Ubuntu memiliki mode file 755, atau dalam notasi simbolis rwxr-xr-x, artinya setiap pengguna atau program dapat menjalankannya , tetapi hanya pemilik file, root, yang dapat memodifikasinya. (Secara teknis ini juga mensyaratkan bahwa tidak seorang pun selain root memiliki wizin pada direktori yang berisi mereka, sehingga pengguna lain tidak dapat menghapus atau memindahkannya.)

Ini berarti bahwa Anda, pengguna yang rendah hati, dapat menjalankan program apa pun. Jika Anda mencoba menggunakan program untuk melakukan sesuatu yang Anda tidak memiliki izin untuk melakukannya, seperti melakukan operasi tulis pada file yang dimiliki oleh root, itu akan kesalahan keluar. Ini membuat kesalahan ketik pada beberapa perintah, aplikasi kereta, atau kode berbahaya, kecil kemungkinannya akan mengacaukan sistem Anda - kecuali jika itu dijalankan sebagai root, ia tidak akan memiliki izin untuk melakukannya. Ini sangat berguna saat menjalankan program yang berinteraksi dengan internet.

Jika Anda chown /usr/local, program apa pun yang berjalan dengan hak istimewa Anda dapat menulis file di sana, yang nantinya dapat dieksekusi sebagai root karena beberapa alasan, seperti dengan mengganti perintah lain dengan nama yang sama. /usr/local/binadalah di default $PATH, dan dalam sudo's secure_path, dan itu datang sebelum lokasi lain di kedua. Jadi jika saya memiliki dua file executable

/usr/local/bin/chown
/bin/chown

ketika saya mengeksekusi sudo chown ..., yang chowndi /usr/local/binakan dieksekusi .

Tapi Anda mungkin sudah tahu semua itu, karena alasan kedua adalah tentang keamanan:

Selain itu, jika Anda telah menginstal perangkat lunak yang dikompilasi secara lokal /usr/local, perangkat lunak saat ini membutuhkan root untuk memodifikasi sendiri atau menginstal plugin. Ini tampaknya tidak aman - Saya hanya ingin menggunakan sudoketika saya tahu PERSIS apa yang akan terjadi.

Kalau-kalau perlu menyebutkan ini di sini, itu benar sekali (menurut FHS toh) untuk menginstal perangkat lunak yang dikompilasi secara lokal /usr/local, tetapi kompilasi itu sendiri harus dilakukan di suatu tempat di Anda $HOME, tanpa sudo, sampai langkah terakhir ketika Anda mengetik sudo make installatau setara.

Saya pikir Anda menyarankan bahwa dengan menjalankan program yang diinstal /usr/localsebagai pemiliknya yang tidak terprivasi, Anda dapat menggunakan kesalahan izin khusus yang dilemparkan ketika mencoba memperbarui sendiri untuk melihat bahwa ia mencoba mengubah beberapa lokasi sistem file lain yang tidak Anda miliki dengan cara Anda tidak mau, sehingga Anda bisa menghentikannya.

Ini mungkin bermanfaat. Implikasinya adalah bahwa Anda memercayai program untuk melakukan apa pun yang disukainya /usr/local, tetapi tidak di tempat lain. Jika meminta izin yang ditinggikan, Anda bisa menolak untuk memperbolehkannya, atau mencopotnya. Itu masuk akal bagi saya. Tapi saya pikir mencoba menggunakan /usr/localsemacam kotak pasir dengan cara ini mungkin bukan ide yang baik, atau setidaknya itu bukan solusi yang paling aman. Ini bukan lokasi yang terisolasi dengan baik ( /optsedikit lebih terisolasi, karena tidak dalam pengaturan standar $PATH). Program mungkin menulis atau menghapus sesuatu yang /usr/localdapat menyebabkan kerusakan. Program lain (berpotensi ditulis dengan buruk) yang Anda jalankan dapat menulis dan mengeksekusi kode di sana yang tidak Anda sadari.

Jika Anda khawatir tentang membiarkan suatu program memperbarui dirinya sendiri dengan aman, Anda mungkin harus mencari alternatif (mungkin khusus untuk program tersebut, seperti halnya python misalnya, atau Anda dapat mencari snap atau implementasi serupa yang sesuai dengan kebutuhan Anda, atau menggunakan wadah atau VM untuk menguji perangkat lunak yang berpotensi tidak aman) sebelum memaparkan lokasi sistem (bahkan yang relatif pengguna-y) untuk ditulis oleh program yang dijalankan oleh pengguna normal. Bagi saya itu sepertinya memiliki efek yang tidak terduga seperti memungkinkan program untuk sementara meningkatkan izin sudo.

Zanna
sumber
6

Ini tidak biasa yang /usr/localtidak dimiliki oleh root. Tetapi Anda dapat mengubah pemilik seperti yang Anda inginkan.

Tetapi saya menyarankan untuk memastikan bahwa /usr/local/sbinmasih dimiliki oleh rootuntuk menghindari masalah keamanan. Perintah di sini biasanya dipanggil hanya oleh root.

H.-Dirk Schmitt
sumber
2
Saya melakukan instalasi bower sebelumnya, dan tutorial menyarankan melakukan chown -R $ USER / usr / local jadi saya sekarang menjalankan chown -R root / usr / local / sbin - apakah ada folder lain di / usr / local yang akan lebih baik dengan kepemilikan root? Saya harus memeriksa semua izin sebelum menjalankan perintah. Instan "menyesal setelah kembali".
OnethingSimple
2
Jawaban ini tidak memuaskan dan penjelasannya tidak benar. Jika, untuk alasan keamanan, perlu untuk menjaga perintah root bergantung pada yang dimiliki oleh root, bagaimana dengan perintah di /usr/local/binroot itu (dan juga pengguna lain) yang dapat dijalankan? Tidakkah mereka perlu dimiliki oleh root? Selain itu, perintah penggunaan root - termasuk perintah di /usr/local/sbin--mungkin tergantung pada pustaka bersama di /usr/local/lib. Mengubah pustaka tersebut dapat memperkenalkan perubahan sewenang-wenang pada perilaku perintah yang menggunakannya. Bersikeras bahwa /usr/local/sbintetap dimiliki oleh root tampaknya sepenuhnya arbitrer.
Eliah Kagan
5

Hanya untuk perangkat lunak yang Anda butuhkan, gunakan direktori home Anda alih-alih /usr/local.

Alih-alih mengubah kepemilikan /usr/localatau harus menjalankan perintah sebagai root ketika Anda tidak ingin, Anda hanya perlu mengkonfigurasi build Anda sehingga mereka menginstal di direktori home Anda alih-alih /usr/local. Ini mengatasi semua masalah potensial dengan mengubah kepemilikan /usr/local, termasuk bagaimana bindan sbinsubdirektori berada di rootjalurnya.

Jika Anda perlu mengizinkan pengguna lain untuk menjalankan perangkat lunak Anda, Anda dapat memberi mereka akses. Bahkan, mereka mungkin sudah bisa, karena secara default direktori home Anda memiliki akses permisif membaca dan mengeksekusi . (Jika Anda tidak menginginkannya, Anda dapat mengubahnya dengan mudah, hanya dengan menggunakan chmodfile atau direktori apa pun yang Anda ingin jadikan pribadi dan mungkin juga mengubah Anda umask.)

Dengan perangkat lunak yang terinstal di direktori home Anda, binari yang sudah masuk /usr/local/binakan masuk . Anda akan mendapatkan subdirektori lain dari direktori home Anda yang sesuai dengan subdirektori yang dibutuhkan perangkat lunak yang Anda instal. Ini biasanya akan terjadi secara otomatis ketika Anda menginstal perangkat lunak dari kode sumber./home/username/bin/usr/local

Mengkonfigurasi Bangunan Anda

Sebagian besar perangkat lunak yang Anda buat dari kode sumber memiliki langkah di mana Anda menjalankan:

./configure

Untuk sebagian besar perangkat lunak yang dikirimkan dengan configureskrip yang dapat dijalankan seperti itu, itu default untuk mengkonfigurasi build untuk instalasi di dalamnya /usr/localketika Anda akhirnya menjalankan sudo make installuntuk menginstalnya. Alasannya adalah secara implisit setara dengan menjalankan:

./configure --prefix=/usr/local

Untuk mengonfigurasi bangunan untuk pemasangan di direktori home Anda, gunakan ini sebagai gantinya:

./configure --prefix="$HOME"

Dalam praktiknya, di Ubuntu, jalur direktori home tidak mengandung spasi, spasi putih lain, atau karakter lain yang akan diperlakukan secara khusus oleh shell seperti *, jadi kecuali Anda telah membuat akun pengguna dengan aneh, Anda bisa mengetik:

./configure --prefix=$HOME

(Saya tidak menyarankan membiasakan diri untuk menulis skrip . Juga, pada beberapa OS lain - seperti macOS - lebih jarang jalur ke direktori home pengguna mengandung ruang.)

Atau jika Anda mau, Anda bisa mengetikkan path direktori home lengkap Anda:

./configure --prefix=/home/username

(Ganti usernamedengan nama pengguna Anda yang sebenarnya, tentu saja. Jika karena alasan tertentu direktori home Anda tidak masuk/home maka Anda harus menyesuaikannya.)

Menginstal Build Anda

Setelah Anda menjalankan make, Anda mungkin terbiasa menjalankannya sudo make install, tetapi ketika Anda menginstal di direktori home Anda sendiri, Anda tidak perlu menjalankannya sebagai root, sehingga Anda dapat - dan harus --omit sudo. Lari saja:

make install

Demikian pula untuk perangkat lunak yang mendukung uninstalltarget:

make uninstall

Ini persis seperti yang Anda minta ... hanya di direktori home Anda, bukan /usr/local.

Menjalankan Program Anda

Mungkin yang binsubdirektori dari direktori home Anda adalah baik:

  • sudah ada di Anda $PATH, atau
  • akan ada di Anda $PATHjika Anda baru saja keluar dan masuk.

Alasannya adalah .profilefile di direktori home Anda, yang berisi perintah yang berjalan saat Anda masuk, berisi ini secara default untuk akun pengguna yang dibuat di sebagian besar versi Ubuntu (termasuk akun administrator awal yang dibuat ketika Anda menginstal OS):

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

Kode itu berjalan ketika Anda masuk (karena ada .profile) dan menempatkan bindirektori pribadi Anda $PATH hanya jika ada pada saat itu. Itu sebabnya Anda mungkin harus keluar dan kembali.

Rilis yang lebih lama seperti Ubuntu 14.04, serta rilis yang lebih baru seperti Ubuntu 17.10, datang dengan itu. Namun, Ubuntu 16.04, yang mungkin merupakan rilis paling populer pada saat penulisan ini, malah memiliki ini:

# set PATH so it includes user's private bin directories
PATH="$HOME/bin:$HOME/.local/bin:$PATH"

Itu hanya menambahkan binsubdirektori dari direktori home Anda --- dan juga .local/binsubdirektori - ke direktori Anda $PATH, tanpa memeriksa apakah direktori tersebut benar-benar ada. Jadi jika Anda menggunakan 16,04, atau jika Anda meningkatkan dari sistem yang 16,04 saat akun pengguna Anda dibuat, maka binsubdirektori dari direktori home Anda kemungkinan sudah ada di Anda$PATH .

.profileFile Anda disalin dari /etc/skeldirektori ketika akun pengguna Anda dibuat. Jika akun pengguna Anda dibuat pada rilis Ubuntu yang lebih lama, ia mendapat versi itu.profile , dan itu tidak diubah - untuk akun pengguna Anda - dengan memutakhirkan ke rilis yang lebih baru.

Setelah binsubdirektori dari direktori home Anda berada di Anda $PATH, Anda akan dapat menjalankan program yang file-file yang dapat dieksekusi diinstal di sana hanya dengan mengetikkan namanya, sama seperti yang dapat Anda lakukan dengan program-program yang diinstal oleh manajer paket Ubuntu atau diinstal di dalam/usr/local .

Itu .local Option

Anda mungkin telah memperhatikan bahwa .profilefile default untuk akun pengguna yang dibuat di beberapa rilis Ubuntu, termasuk di 16.04 seperti dijelaskan di atas, menambahkan tidak hanya $HOME/binke jalur Anda, tetapi juga $HOME/.local/bin. Jika Anda .profiletidak menambahkan itu, tetapi Anda mau , maka Anda cukup mengeditnya.

Meskipun sering digunakan untuk menyimpan pengaturan dan data cache , Anda juga dapat menginstal perangkat lunak di dalam .localsubdirektori direktori home Anda. Anda harus merasa tidak terhalang untuk melakukannya, karena dari sudut pandang kegunaan dan keamanan, --prefix="$HOME/.local"serupa dengan--prefix="$HOME" .

Ingat bahwa file dan direktori yang memulai dengan .tidak ditampilkan secara default di browser file grafis (gunakan Ctrl+ Huntuk menyembunyikan dan menyembunyikannya) atau dengan lsperintah (lulus -Aatau-a bendera untuk menunjukkannya). Ini mungkin bukan yang Anda inginkan, atau mungkin persis apa yang Anda inginkan. Ini adalah masalah pilihan pribadi.

Namun, saya telah mengamati bahwa beberapa manajer paket berbasis sumber otomatis yang membangun dan menginstal perangkat lunak dalam penggunaan direktori home seseorang $HOME/.local. Saya sebenarnya tidak tahu seberapa umum hal ini - saya berharap untuk menyelidiki lebih lanjut dan memperbarui jawaban ini - tetapi Anda mungkin lebih suka menggunakan $HOMEhal-hal yang Anda kompilasi secara manual. Dengan begitu akan jelas dari mana segala sesuatu berasal. Dan jika ada tabrakan, perangkat lunak itu masih mungkin hidup berdampingan secara wajar.

Anda mungkin juga dengan sengaja menginstal beberapa perangkat lunak di $HOME/.localdan perangkat lunak lain di $HOME. Terserah kamu. binDirektori mana pun yang pertama kali muncul di $PATHvariabel lingkungan Anda adalah yang akan dijalankan oleh perintah, jika perintah dengan nama yang sama ada di keduanya.


Penghargaan diberikan kepada Zanna dan Videonauth karena menunjukkan kesalahan dalam versi sebelumnya dari jawaban ini, mengenai rilis Ubuntu mana yang memiliki kode default .profile, dan membantu saya untuk memperbaikinya (lihat juga di sini ).

Eliah Kagan
sumber
0

Jika sudo merepotkan maka cukup perbarui / etc / sudoers sehingga Anda tidak perlu memasukkan kata sandi saat menjalankan sudo. Saya percaya itu adalah solusi yang lebih baik daripada mengubah pemilik / usr / local.

notkevin
sumber
4
Kata sandi bukanlah masalahnya - lebih merupakan gagasan bahwa untuk menginstal modul ke suatu program di /usr/localAnda harus menggunakan sudo, yang berpotensi berbahaya.
PR3x