Apakah `sudo pip install` masih merupakan praktik yang rusak?

38

Saya baru di Ubuntu, jadi mohon ikut saya. Saya telah menginstal pipmenggunakan perintah ini: sudo apt-get -y install python-pip. Lalu aku diinstal NLTK menggunakan perintah pada website mereka, yang: sudo pip install -U nltk. Tetapi kemudian saya menemukan pertanyaan yang mengatakan bahwa semua yang saya lakukan adalah "praktik yang rusak". Garis yang paling mengejutkan saya adalah bahwa penggunaan pada sudo pipdasarnya salah dan memberi pipterlalu banyak kekuatan dapat merusak file sistem operasi. Adakah yang bisa memvalidasi klaim ini?

Catatan - Saya hanya menggunakan sudokarena ketika saya mencoba perintah apt-get -y install python-pipitu memberi saya 2 kesalahan:

E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)
E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?
apa apa apa
sumber
3
Mengatakan instruksi sudo pip installpada dasarnya salah. - dari stackoverflow.com/a/33004920/95735
Piotr Dobrogost
"... secara inheren ...." pshaw
michael
Maaf, sudo pip installsama buruknya dengan curl "some-url" | sudo bashpemasangan. Demikian pula, kami telah beberapa kali di mana beberapa pengembang digunakan sudo pip installuntuk menginstal beberapa dependensi pada workstation mereka, kemudian memeriksa kode yang rusak ke repo karena file requirements.txtatau setup.pyhilang apa pun yang mereka instal, dan semua orang harus mencari tahu apa dependensi yang diperlukan sementara pria itu sedang berlibur.
Mike DeSimone

Jawaban:

52

Kedua sudo pip installdan varian lainnya yang umum yang sudo -H pip installharus tidak didorong karena merupakan risiko keamanan untuk hak penggunaan root untuk menggunakan pipuntuk menginstal paket Python dari PyPI (Python Package Index).

Dari https://stackoverflow.com/a/21056000/486919 (penekanan pada saya):

Ketika Anda menjalankan pipdengansudo , Anda menjalankan setup.pydengan sudo. Dengan kata lain, Anda menjalankan kode Python sewenang-wenang dari Internet sebagai root. Jika seseorang memasang proyek jahat di PyPI dan Anda menginstalnya, Anda memberikan akses root penyerang ke mesin Anda. Sebelum melakukan beberapa perbaikan baru-baru ini ke pipdan PyPI, penyerang juga dapat menjalankan seorang pria di tengah serangan untuk menyuntikkan kode mereka ketika Anda mengunduh proyek yang dapat dipercaya.

Seperti disebutkan di https://security.stackexchange.com/a/79327/8761 , penting untuk dicatat bahwa siapa pun dapat mengunggah paket Python, termasuk yang berbahaya, ke PyPI.

Singkatnya, sesuai dengan prinsip privilege paling tidak , jangan gunakan sudodengan pipmenginstal paket Python dari PyPI kecuali Anda benar-benar perlu. Sebagai gantinya, pertimbangkan untuk menggunakan pip install --user(perhatikan bahwa pip installtanpa sudoflag / opsi tambahan secara default pip install --userdi Ubuntu saat ini) atau lingkungan virtual (seperti virtualenv). Jika Anda melihat orang merekomendasikan sudo pipatau sudo -H pip, tolong beri tahu mereka untuk tidak melakukannya.

edwinksl
sumber
2
Jika saya telah menggunakannya di masa lalu, bagaimana cara saya membersihkan apa yang dilakukannya?
endolith
1
Jadi instruksi ini salah? tensorflow.org/install/install_linux
endolith
5
@endolith Anda dapat menghapus pipo untuk membatalkan. Namun, jika paket tersebut berasal dari pengelola tepercaya, seperti tensorflow, numpy, dll, "aye! Security!" Argumen tidak terlalu masuk akal. (Juga jika Anda menginstal paket jahat, bahkan sebagai "--user", Anda pada dasarnya kacau. Aturan sebenarnya seharusnya: Jangan menginstal kode dari orang yang tidak dikenal / tidak dipercaya ... kecuali dalam wadah - tetapi itupun tidak dianjurkan.)
michael
2
@ endolith Instruksi itu tidak mengatakan untuk menggunakan sudo. Mungkin mereka dulu dan mereka telah melihat kesalahan cara mereka? :)
David Gardner
1
sudo pip installdapat menghapus instalasi "lama" paket Python yang diinstal sistem, yang dapat mempersulit peningkatan atau penghapusan paket OS tersebut. sudo pip uninstalltidak membantu di sini, karena menghapus paket baru tetapi tidak mengembalikan file dari yang lama. (Kolega saya R. Zagar menjelaskan lebih lanjut dalam jawaban lain.)
Mike DeSimone
19

Anda harus menggunakan sudountuk menginstal pip dengan apt ( sudo apt install python-pip), tetapi seperti yang dinyatakan dalam jawaban edwinksl Anda tidak boleh menggunakan sudountuk menginstal paket dengan pip , Anda harus menggunakanpip install --user <package> untuk menginstal hanya untuk pengguna Anda, atau menggunakan virtualenv untuk lebih jauh membatasi ruang lingkup paket .

Apt menginstal paket dari repositori Ubuntu, sedangkan pip menginstal paket yang diunggah pengguna dari PyPi yang mungkin berbahaya.

pizzapants184
sumber
7

Dan untuk jawaban yang lebih mudah:

  1. Anda memang harus selalu melakukannya sudo apt-get install ... , begitulah cara alat itu dirancang untuk bekerja.
  2. Penggunaan sudo [-H]dengan pip installadalah mungkin & opsional, tergantung pada apa yang ingin Anda lakukan (dan karenanya, "kontroversi").

Salah satu motto Python adalah "Seharusnya ada satu - dan lebih disukai hanya satu - cara yang jelas untuk melakukannya." Dan seperti kebanyakan moto, itu rusak dengan gembira sinis yang tampaknya pada setiap kesempatan. (Itu sebabnya ada motto, saya kira.) Sayangnya, dalam pendapat saya yang paling sederhana, ekosistem Python terdiri dari banyak aturan "keras & cepat" yang saling bertentangan , tidak pernah dilanggar ... kecuali ketika "yada yada yada" (iblis, detail, dll). Dalam hampir semua kasus, ini disebabkan oleh evolusi historis dari bahasa & alat (dan yang ingin / membutuhkan pelajaran sejarah ketika mereka hanya ingin melanjutkan pekerjaan mereka) - tetapi juga dapat disebabkan oleh perbedaan dalam Mac / Win / * Platform Nix (mis. Unix / Linux memiliki mentalitas yang sama,ambil semua "praktik yang rusak" & "yang secara inheren salah ini" kultus kargo dengan sedikit garam. Beberapa sebenarnya sangat berarti. (Lainnya adil, yah, berarti.)

Pertama-tama, daripada "instalasi per-pengguna" dasar, Anda hampir selalu lebih suka virtualenv, karena sungguh, itu mungkin yang akhirnya Anda perlukan. Jadi sebaiknya Anda mulai dengan itu sekarang. Bagaimana ini dilakukan, tepatnya, "tergantung" (lihat motto Python, di atas). Jika Anda menggunakan Conda (kebanyakan untuk Mac & Windows), itu akan diatur menggunakan Conda . Jika menggunakan "pure" Python [sic] , itu tergantung pada versi mana & apa yang Anda miliki, tetapi virtualenvwrapper cukup berguna.

Kedua, seperti contoh tandingan pada aturan "tidak pernah sudo", Anda dapat memilih sudo -H pip install -U numpy, yang sangat baik, bahkan menguntungkan, karena dapat memungkinkan seseorang untuk menghindari mengunduh / menginstal ulang / memelihara perpustakaan besar, di mana Anda hanya ingin / perlu satu versi, ke dalam setiap virtualenv secara terpisah. Kerangka kerja besar dan populer seperti scikit-learn, NumPy, matplotlib, SciPy, panda, dll., Dapat dipasang sekali & selesai dan digunakan kembali di seluruh lingkungan . Lebih lanjut, sys-admin Anda yang ramah mungkin dapat menginstal ini untuk setiap pengguna pada suatu sistem - dan jelas mereka akan melakukan ini melalui sudo, juga, misalnya, untuk instalasi yang lebih rumit, seperti TensorFlow.

Dan, terakhir, jika Anda menginstal beberapa pustaka pihak ke-3 acak yang melakukan ini-dan-itu (Twitter API, teks munging, pemformatan kode, dll), maka saya sepenuhnya setuju - jangan menginstalnya sebagai root via sudo. Tentu, instal sebagai pengguna Anda saat ini. Tapi ingat, akun pengguna Anda memiliki semua hal yang sangat penting .

michael
sumber
2
Di mana "marah" = "meremas-remas meremas tangan kontraproduktif mengundang demi mencoba untuk tidak melukai perasaan siapa pun". Bersikaplah jelas dan eksplisit untuk menghindari kebingungan: tidak pernah perlu melakukan ini sebagai garis dasar, termasuk contoh Anda. Unix memang "menggulung konfigurasi dan risiko Anda sendiri", ini benar-benar pola pikir C, tetapi seperti di sana, jangan gunakan di mallocmana Anda tidak perlu melakukannya. The --userflag melakukan apa OP itu meminta dan tidak memerlukan izin khusus. Anda merusak poin baik Anda tentang virtualenv dalam proses ... tidak ada "kargo-kultus" tentang semua ini.
Benjamin R
Saya sudah memasukkan perspektif ini dalam survei saya tentang tanggapan & pendapat umum (jika orang membaca dengan cermat).
michael
1

Menggunakan "sudo pip install" dapat dan akan menimpa konten python yang disediakan oleh vendor OS Anda. Ketika itu terjadi, semua paket vendor yang terkena dampak ini tidak akan lulus "rpm --verify" dan paket Anda tampaknya rusak.

Apakah Anda ingin menggunakan alat administrasi sistem yang telah diuji oleh vendor OS Anda , atau apakah boleh menggunakan komponen yang belum diuji yang Anda unduh dari internet?

Ketika, bukan jika, paket jahat diunggah ke PyPI ... orang yang menggunakan "sudo pip install" akan akhirnya menjalankan muatan berbahaya itu dengan hak istimewa sistem penuh. Apakah kamu menginginkan itu? (#principleofleastprivilege)

Jika itu hanya laptop Anda, dan Anda hanya mempertaruhkan beberapa gambar kucing, maka risikonya mungkin rendah ... tetapi jika itu adalah sistem multi-pengguna, maka risikonya sekarang dikalikan dengan N. Jika Anda memiliki data pada sistem yang memiliki nilai, atau ketersediaan atau keandalan sistem memiliki nilai, maka risikonya juga naik.

Jangan ragu untuk memilih petualangan Anda sendiri, tetapi silakan dapatkan persetujuan dari pengguna lain yang dapat dipengaruhi oleh pilihan Anda. Mereka mungkin tidak nyaman dengan tingkat risiko yang sama seperti Anda.

Randy Zagar
sumber
0

Untuk menambah jawaban ini: Saya tidak tahu tentang Ubuntu, tetapi pada Fedora saya dapat menggunakan sudo dnf install python3-numpyformat untuk menginstal paket BANYAK berguna bagi saya. Ini tidak memiliki kelemahan menjadi tidak aman (distro repo maintainer telah memvalidasi paket), tetapi juga memungkinkan Anda untuk menginstal seluruh sistem. Hanya kekurangannya adalah bahwa versi repro distro mungkin sedikit tertinggal paket-paket di PyPI.

Milind R
sumber
-1

Tidak, ini benar. Saya tidak dapat memvalidasi klaim ini. Saya selalu menggunakan sudo -Hdengan pip. piphanya dapat merusak file sistem operasi sebanyak apt. Hanya tidak digunakan sudodengan pipketika Anda ingin menginstal hanya untuk pengguna itu.

fosslinux
sumber
1
Di komputer pribadi Anda, kapan Anda perlu menginstal seluruh pipsistem? Jika Anda seorang sysadmin, mungkin itu cerita yang berbeda.
Benjamin R