Bagaimana cara saya menghentikan Ubuntu dari memulai daemon Saya tidak secara eksplisit diminta untuk menjalankan?

8

Salah satu prinsip dasar keamanan komputer adalah tidak pernah menjalankan apa pun yang tidak Anda butuhkan.

Saya melakukan pgrepping untuk suatu proses hari ini ketika saya perhatikan bahwa mesin Ubuntu 9.04 (desktop) saya menjalankan daemon git server. Setelah bersumpah cepat, saya menemukan bahwa git-daemon-runpaket itu telah (mungkin tidak sengaja) diinstal, dan menghapusnya menghilangkan proses itu (dan memastikan bahwa itu tidak akan dimulai lagi nanti).

Tetapi dalam kasus lain, saya ingin paket server diinstal, tetapi tidak ingin server daemon berjalan. Sebagai contoh, saya gunakan lighttpduntuk pengujian internal (dimulai dengan skrip pengujian khusus untuk beberapa aplikasi, dan hanya mendengarkan pada localhost dalam konfigurasi tersebut) tetapi saya tidak ingin mendengarkan koneksi luar dengan beberapa file konfigurasi acak. (Jika saya ingin menjalankan satu mendengarkan untuk koneksi luar, saya akan mengkonfigurasi dan menjalankannya sendiri.)

Saya benar-benar tidak suka menjalankan semua jenis server acak yang tidak saya butuhkan pada mesin yang terpajan Internet, karena siapa yang tahu lubang keamanan apa yang mereka buka. Dan saya lebih memilih untuk tidak perlu mempermasalahkan firewall, karena itu merupakan sumber kesalahan dan kesalahan konfigurasi yang dapat membuka celah keamanan. Tidak terlalu sulit untuk memiliki mesin Unix yang dikonfigurasi untuk tidak memulai server apa pun kecuali diminta secara khusus oleh admin; NetBSD (dan OpenBSD, juga, saya pikir) datang dengan cara ini secara default.

Bagaimana cara mengkonfigurasi sistem Ubuntu saya untuk tidak memulai daemon server apa pun kecuali saya secara khusus memberi tahu bahwa saya ingin memulai?

(Meminta untuk menginstal paket tidak, dalam buku saya, meminta untuk memulai server. Jika memang seharusnya, itu adalah antarmuka pengguna yang mengerikan, karena banyak instalasi paket bahkan tidak memiliki server untuk memulai, sehingga membuat terlalu mudah untuk secara tidak sengaja memulai server tanpa menyadari Anda telah melakukannya.)

EDIT: Hanya untuk memperjelas, masalahnya bukan bahwa saya ingin dapat menghentikan server yang ada. Masalahnya adalah saya tidak ingin server baru dimulai tanpa permintaan eksplisit. Ini berarti saya harus dapat melakukan tugas sysadmin, seperti menginstal paket, dan yakin bahwa tidak ada server yang telah dimulai. Sebagian besar tanggapan tidak membahas hal ini.

cjs
sumber
3
Saya telah menyodok ke dalam paket deb. Sekitar 10 menit. Mereka menyertakan skrip "postinst" yang dijalankan setelah paket diinstal. Perintah terakhir yang mereka jalankan seringkali "invoke-rc.d <servicename> start" yang menyebabkan layanan untuk memulai sendiri. Panggilan untuk memanggil-rc.d biasanya terprogram tanpa pemeriksaan variabel konfigurasi global untuk mengontrol apakah benar-benar memulai layanan. Dengan demikian, akan tergantung pada-rc.d untuk membuat keputusan tentang apakah akan memulai layanan. Di situlah penyelidikan saya berakhir.
Barry Brown
2
seperti yang dijelaskan Barry, Ubuntu jelas bukan untuk Anda. Maaf, tetapi Anda harus 1) mengubah distro, atau 2) mengawasi baik-baik apa yang sedang dilakukan ubuntu.
elcuco
Alasan Ubuntu / Debian berbeda dari Fedora dalam hal ini, adalah Debian hanya menginstal apa yang Anda minta, sedangkan Fedora menginstal kitchen sink. Jadi di Fedora itu umum untuk memiliki paket diinstal yang Anda tidak minta, jadi defaultnya adalah tidak berjalan. Di Debian, Anda menginstal paket secara eksplisit, sehingga diharapkan Anda ingin server segera berjalan.
TRS-80
pembaruan apa pun. Yang mana yang kamu coba? dan apa yang berhasil? a
Nandhini Anand
Sedih untuk mengatakan, tampaknya tidak ada solusi selain, "hati-hati memeriksa perangkat lunak apa yang berjalan pada sistem Anda setelah ada perubahan paket," jelas proses yang rawan kesalahan.
cjs

Jawaban:

12

Instal sysv-rc-conf dan matikan saja layanan yang tidak ingin Anda jalankan.

sudo apt-get install sysv-rc-conf
DESCRIPTION: sysv-rc-conf memberikan antarmuka yang mudah digunakan untuk mengelola symlink "/etc/rc{runlevel}.d/".

teks alternatif

Jindrich
sumber
Bagaimana ini menjaga server baru agar tidak dinyalakan oleh sistem pengepakan?
cjs
Silakan baca komentar oleh Barry Brown, itu menjelaskan mengapa jawaban ini tidak lengkap.
elcuco
8

Sebagai seseorang dengan masalah yang sama, saya merasa sangat kuat bahwa tidak masuk akal bagi daemon untuk menganggap bahwa pengguna menginginkannya dimulai per default: Ada banyak kasus penggunaan yang benar-benar valid di mana ini bukan masalahnya. (Belum lagi bahwa tidak selalu jelas instalasi mana yang benar-benar menyertakan daemon.) Daemon dapat dimatikan per default, pengguna dapat secara eksplisit ditanyai, atau mungkin ada pengaturan pusat. Yang lainnya adalah alasan Microsoft yang sepenuhnya tidak layak untuk Linux.

Selain itu, saya menemukan beberapa komentar di atas untuk poster asli menjadi kasar, merendahkan, dan kurang konstruktif. Menyarankan, misalnya, bahwa ia harus menerima perilaku default atau mengubah distribusi benar-benar luar biasa. Pertama, tidak ada distribusi yang cocok, dan melompat ke distribusi baru dengan pekerjaan tambahan yang terkait tidak mungkin menjadi solusi realistis atas hal yang satu ini. Kedua, pengguna Linux / Unix yang mahir digunakan untuk setiap perilaku yang dapat diubah: Masalah mungkin membutuhkan waktu dua jam dari penggalian, tetapi kemudian diperbaiki. Hal alami yang harus dilakukan pengguna seperti itu, ketika standarnya tidak sesuai, adalah mengasumsikan adanya solusi dan mencoba mencari tahu apa itu. Ketiga, dalam etiket sumber terbuka dan perangkat lunak bebas, If you don't like it, then patch the source code!'' is an acceptable response; however,..., maka lakukan pendakian! '' Tidak.


sumber
5

Harapan dari sistem pengemasan adalah ketika Anda menginstal paket server, Anda ingin menjalankan server itu. Ini harapan yang masuk akal.

Bagaimana cara mengkonfigurasi sistem Ubuntu saya untuk tidak memulai segala jenis server kecuali saya 
khusus kirim ke saya ingin server dimulai? 

Roy telah menjawab pertanyaan ini untuk Anda. Ketika Anda menginstal paket server baru, Anda menghentikan server itu dan kemudian menggunakan alat seperti sysv-rc-conf untuk mencegah server itu dimulai pada reboot berikutnya atau perubahan runlevel. Ya, Anda harus melakukan beberapa pekerjaan sendiri, dan itu masuk akal karena Anda mengonfigurasi sistem Anda secara berbeda untuk kebanyakan orang yang menggunakan Ubuntu.

Misalnya, saya menggunakan lighttpd untuk pengujian internal (dimulai dengan skrip pengujian khusus 
untuk beberapa aplikasi, dan hanya mendengarkan di localhost) tetapi saya biasanya tidak menginginkannya 
mendengarkan koneksi luar.

Anda harus meluangkan waktu untuk mempelajari cara mengkonfigurasi lighttpd sehingga dikonfigurasi secara permanen untuk hanya mendengarkan di localhost. Kemudian, ketika Anda memulai server, Anda tahu itu sudah dikonfigurasi sesuai dengan keinginan Anda.

Menghukum
sumber
3
Pertama, saya tidak berpikir itu harapan yang masuk akal; bahwa saya telah menginstal biner lighttpd bukan berarti saya ingin menjalankan server publik. Kedua, saya tidak selalu tahu bahwa saya telah menginstal paket server; terkadang mereka ditarik oleh paket lain yang telah saya instal.
cjs
1
Oh, dan saya tahu cara mengonfigurasi lighttpd untuk mendengarkan hanya di localhost, dan saya sering memiliki setengah lusin proyek checkout pada sistem tertentu yang melakukannya.
cjs
5

Saya menemukan hal berikut bermanfaat untuk menginstal Ubuntu di lingkungan chroot, seperti debootstrapping tamu xen baru. Kredit sebenarnya diberikan ke skrip xen-tools untuk mengajari saya ini:

gema '#! / bin / sh'> /usr/sbin/policy-rc.d

gema 'keluar 101' >> /usr/sbin/policy-rc.d

chmod 755 /usr/sbin/policy-rc.d

Dengan skrip ini terpasang, apt tidak akan memulai layanan setelah pemasangan. Namun, ini hanya setengah dari masalah Anda, karena symlink masih diberlakukan, layanan akan mulai setelah boot berikutnya. Saya tidak tahu bagaimana menghentikan secara otomatis :(


sumber
1
itu dapat merusak nginx logrotation karena /etc/logrotate.d/nginx Ubuntu digunakan invoke-rc.d nginx rotatedi bagian postrotate Saya menggunakan versi yang sedikit berbeda gist.github.com/hostmaster/7c25ef4e1e47bc3e2d71
hostmaster
Itu juga mencegah daemon berhenti ketika paket-paket itu dihapus dari sistem. Ini tidak bagus.
hostmaster
4

Barry Brown, dalam komentar tentang pertanyaan itu, memberikan petunjuk untuk kemungkinan jawaban.

Sistem pengemasan menggunakan invoke-rc.dprogram untuk memulai server setelah paket diinstal. [1] Program ini akan berjalan /usr/sbin/policy-rc.duntuk menentukan kebijakan memulai server itu.

Paket policyrcd-script-zg2termasuk policy-rc.dskrip, yang berjalan /etc/policy-rc.ddengan parameternya jika ada, dan keluar dengan kode kesalahan skrip itu, atau keluar dengan 0 (sukses) jika tidak. Antarmuka policy-rc.dyang diharapkan untuk ditawarkan didokumentasikan secara singkat dalam invoke-rc.dpengelolaan, dan jauh lebih luas di /usr/share/doc/sysv-rc/README.policy-rc.d.gz.

Langkah berikutnya, saya kira, adalah bagi saya untuk menguji ini.

Hal-hal yang tersisa untuk dijawab:

[1] Apa bagian lain dari sistem yang digunakan invoke-rc.d? [2] Apakah ini benar-benar berfungsi?

cjs
sumber
3

Bagaimana kalau menonton di direktori di mana skrip init berada? Anda mungkin dapat membuat direktori-direktori itu tidak dapat dimodifikasi dengan perintah chatr.

ojblass
sumber
Hm Saya bertanya-tanya mengapa yang ini diturunkan? Ini peretasan, tapi setidaknya itu mengatasi masalah saya, tidak seperti kebanyakan respons di sini.
cjs
Saya memutakhirkan ini karena ini adalah solusi terdekat yang mungkin Anda dapatkan dengan Ubuntu, meskipun saya pikir membuat direktori init tidak dapat dimodifikasi adalah ide yang buruk (Bayangkan saja mencoba menginstal layanan yang Anda INGIN mulai). Saya tahu bahwa find dapat digunakan untuk memantau perubahan dalam file dan direktori, meskipun saya tidak cukup akrab dengan alat untuk memberi Anda perintah yang tepat. Saya akan meminta salah satu guru untuk menjalankan perintah, memasukkannya ke dalam skrip bash, dan menjalankannya setelah setiap pemasangan, kemudian menggunakan sysv-rc-conf untuk secara manual menonaktifkan layanan yang tidak Anda inginkan.
Babu
2

Idealnya, ini masalah post-instnaskah. Pada awal proyek Ubuntu, upaya yang disengaja dibuat untuk memaksa default waras ke skrip konfigurasi dpkg, sehingga Anda dan saya tidak harus menjawab setiap pertanyaan sialan yang mungkin muncul, atau membuang waktu meneliti opsi. Sekarang Ubuntu telah mengatur ini, banyak orang tidak menyadarinya. Seharusnya dimungkinkan untuk mengajukan pertanyaan tentang apakah menginstal sebagai daemon atau tidak, tetapi saya tidak melihat pertanyaan seperti itu dalam beberapa paket yang saya periksa.

Mungkin Anda harus terlibat dengan Tim Server Ubuntu dan mungkin bahkan Kebijakan Debian untuk memperbaiki keadaan.

jldugger
sumber
1

Anda dapat mencoba membuat skrip yang akan memeriksa daftar layanan yang diinstal dan memverifikasi mereka terhadap beberapa daftar layanan yang diizinkan. Jika layanan tidak ada dalam daftar maka skrip akan mematikannya. Script harus dijalankan pada awal sebelum layanan umum. Dan mungkin berjalan seperti daemon untuk menutup layanan yang baru diinstal. Atau jika memungkinkan untuk berjalan secara otomatis setelah setiap pemasangan untuk memeriksa layanan baru.

PS Saya bisa memikirkan dua kemungkinan penyebab layanan mulai setelah paket diinstal. Itu adalah fitur paket, atau itu adalah fitur manajer paket. Jika itu fitur paket, saya rasa tidak ada cara untuk mengubah perilaku layanan. Jika itu adalah fitur manajer paket, mungkin ada beberapa opsi konfigurasi untuk mencegah layanan dimulai setelah menginstal. Saya tidak tahu sekarang jadi hanya melempar ide.

Lincah
sumber
1

Jika Anda mengatur iptables dengan kebijakan default DROP untuk rantai INPUT, maka Anda tidak perlu terlalu khawatir tentang mendengarkan port karena mereka akan diblokir oleh iptables. Server Ubuntu dilengkapi dengan antarmuka yang ramah pengguna untuk iptables jika Anda baru mengenal iptables.

Dari posting Anda, sepertinya saya lebih senang dengan distribusi Linux yang berbeda seperti CentOS. Proses instalasi default untuk CentOS akan memungkinkan Anda untuk menginstal paket meta yang berbeda, dan dengan memilih tidak ada, Anda mungkin lebih bahagia dengan instalasi basis Anda.

Juga, saya pikir pertanyaan Anda mungkin sedikit lebih jelas jika Anda mengganti 'layanan' atau 'daemon' untuk kata 'server' ketika Anda bermaksud sesuatu yang berjalan di server. Orang-orang cenderung menggunakan 'server' untuk merujuk ke kotak fisik atau VM. Meskipun saya kira itu tidak salah secara teknis.

Kyle Brandt
sumber
0

Lihatlah level run yang Anda <gunakan dengan perintah 'runlevel', dan hapus semua symlink di / etc / rc runlevel> .d /. Anda mungkin ingin beberapa daemon berjalan, tetapi sebagian besar mungkin bisa dihapus.

Anda dapat menambahkannya kembali dengan symlink dari skrip di /etc/init.d.

Saya pikir ada perintah yang akan melakukan trik yang sama, dan menambahkan semua symlink untuk semua runlevel, tetapi saya hanya melakukannya secara manual.

resonator
sumber
Masalahnya adalah, saya tidak tahu kapan symlink mungkin ditambahkan. Saya perlu mencegah apa pun yang menambahkan symlink dan memulai server (sistem pengemasan, terutama, tampaknya) dari melakukannya kecuali saya mengambil beberapa tindakan yang secara khusus meminta untuk melakukannya.
cjs
Mungkin lebih mudah dan lebih dapat diandalkan untuk hanya memasang firewall. Mungkin skrip sesuatu untuk mengambil port dan protokol sebagai argumen untuk menambah / menghapus aturan firewall untuk mempermudah.
resonator
atau jalankan mesin Anda dalam mode pengguna tunggal ... Itu mungkin menimbulkan lebih banyak masalah daripada yang disimpannya.
resonator
Saya baru di Ubuntu, menjadi pengguna lama Fedora / RedHat. Itu satu hal tentang Ubuntu yang menurut saya aneh: layanan aktif secara default. Di bawah Fedora, layanan dinonaktifkan secara default.
Barry Brown
Menjalankan mesin atau server desktop dalam mode pengguna tunggal sangat tidak praktis.
cjs
0

Atau, Anda bisa menggunakan update-rc.dperintah.

Untuk menonaktifkan apache2layanan

# update-rc.d [-f] apache2 remove

EDIT:

Ini berarti saya harus dapat melakukan tugas sysadmin, seperti menginstal paket, dan yakin bahwa tidak ada server yang telah dimulai.

Perilaku ini dikendalikan oleh skrip di dalam paket .deb. Ketika Anda menginstal paket, skrip ini dijalankan secara otomatis. IIRC, kita tidak bisa melewati skrip ini.

Arie K
sumber
0

Pada dasarnya kamu tidak bisa.

Jika Anda menginstal paket dan memulai layanan maka itulah yang terjadi. Jika Anda tidak suka maka ajukan bug di https://launchpad.net/ .

Anda seharusnya tidak main-main dengan paket deb. Hal semacam ini bisa kembali dan menggigitmu keledai nanti.

Jika Anda ingin gaya OpenBSD 'tidak ada yang berjalan secara default', maka jalankan OpenBSD. Tidak semua distro cocok untuk semua orang. Pasti ada hal-hal di Ubuntu yang tidak Anda sukai. Jika Anda masih ingin menjalankan ubuntu, maka Anda harus memeriksa layanan yang berjalan dan mematikannya.

Rory
sumber
-2

Anda dapat mengaktifkan dan menonaktifkan beberapa layanan di menu System> Services di GNOME

dmityugov
sumber