Menjalankan pekerjaan pemula sebagai pengguna yang tidak memiliki hak

142

Apa cara kanonikal untuk memiliki pekerjaan pemula mengubah userid-nya dan menjalankan skrip sebagai pengguna yang tidak memiliki hak pribadi?

Jelas seseorang dapat menggunakan suatau sudo, tapi ini kelihatannya hacky (dan dapat menghasilkan baris log yang tidak perlu).

aaronsw
sumber

Jawaban:

108

Dengan pemula v1.4, setuid dan setgid didukung secara native dalam file konfigurasi.

qsun
sumber
7
Lihat buku resep untuk lebih spesifik tentang ini: upstart.ubuntu.com/cookbook/#run-a-job-as-a-different-user
Jason Navarrete
10
Dengan kata lain, didukung di Precise (12.04) dan yang lebih baru.
Edward Anderson
8
Dengan kata lain, tidak didukung dalam centos 6
socketpair
5
Sebagai catatan, initctl --versionuntuk menemukan versi pemula Anda saat ini.
Mahn
4
Yang mengherankan, distro Amazon Linux di AWS menggunakan versi pemula RHEL 6 (0.6.5 !!!!) sehingga siapa pun yang menggunakannya harus menggunakan solusi 'su'.
Asfand Qazi
86

Bertanya di saluran #upstart di freenode, pejabat yang menangani masalah ini adalah:

Rilis Upstart di masa mendatang akan memiliki dukungan asli untuk itu, tetapi untuk sekarang, Anda dapat menggunakan sesuatu seperti:

exec su -s /bin/sh -c 'exec "$0" "$@"' username -- /path/to/command [parameters...]
Roman Gaufman
sumber
7
Ini adalah satu-satunya jawaban yang berfungsi di Amazon Linue EC2 (Saya mencoba semua variasi sudo dan su, termasuk --session-command, -c, ad nauseum); tak satu pun dari mereka membiarkan proses dihentikan begitu dimulai; terima kasih banyak untuk ini.
Kato
Itu beberapa sihir shell mewah, +1.
Steve Kehlet
6
Ini tidak berhasil untuk saya di CentOS 6 (Upstart 0.6.5). Ada serangkaian garpu (4 kedalaman saya pikir) diprakarsai oleh suitu berarti expect forkdan bahkan expect daemontidak menangkap PID terakhir.
Mark Lakata
2
Saya menggunakan ini di Amazon Linux (Upstart 0.6.5) untuk mem-boot proses Jenkins (untungnya, tidak daemonize sendiri, untungnya) dan berhasil! Saya harus mengubahnya sedikit untuk mengarahkan output standar ke file log dan mengatur beberapa variabel lingkungan, tetapi berhasil! Versi saya terlihat seperti:exec su -s /bin/sh -c 'HOME=/foo/bar exec "$0" "$@" &>/var/log/foobar.log' username -- /path/to/command [parameters...]
Asfand Qazi
17

Bagaimana dengan menggunakan start-stop-daemon?

exec start-stop-daemon --start --chuid daemonuser --exec /bin/server_cmd

Dari buku masak pemula :

Metode yang disarankan untuk sistem Debian dan Ubuntu adalah dengan menggunakan utilitas helper start-stop-daemon. […] start-stop-daemonTidak memaksakan batasan PAM ("Modul Otentikasi Pluggable") pada proses yang dimulai.

Catatan: start-stop-daemontidak didukung di RHEL.

Jason R. Coombs
sumber
2
Anda juga dapat menggunakan grup, jika Anda membutuhkannya. Dengan --chuid daemonuser: daemongroup
Evgeny
13

Ada beberapa cara untuk melakukannya, semua dengan semantik yang sedikit berbeda, terutama yang berkaitan dengan keanggotaan grup:

  • setuidgid akan menempatkan Anda dalam grup yang Anda tentukan.

    • Daemontools asli hanyasetuidgid akan menempatkan Anda dalam grup itu, sehingga Anda tidak akan dapat mengakses file milik grup lain yang menjadi anggota Anda.
    • The setuidgidfrom daemontools-encore dan setuidgiddari nosh toolset keduanya memiliki opsi -s(alias --supplementary) yang akan menempatkan Anda dalam grup itu, dan juga menempatkan Anda di semua grup tambahan untuk pengguna yang Anda tentukan.
  • Menggunakan newgrpsetelah Anda menjadi pengguna yang kurang beruntung akan menambahkan satu grup ke set grup Anda, tetapi juga membuat subkulit baru, membuatnya sulit untuk menggunakan skrip dalam.

  • start-stop-daemon mempertahankan keanggotaan grup Anda, dan melakukan banyak hal lebih dari sekadar setuid / setgid.

  • chpst -u username:group1:group2:group3... commandnameakan memungkinkan Anda menentukan dengan tepat keanggotaan grup apa yang akan diadopsi, tetapi (dalam Ubuntu ) hanya disertakan dengan runitpaket, yang merupakan alternatif upstart.

  • su -c commandname usernamemengambil semua keanggotaan grup nama pengguna, seperti halnya sudo -u username commandname, jadi mereka mungkin rute yang paling tidak mengejutkan.

Jason Holt
sumber
8

Gunakan setuidgiddari paket daemontools.

Dokumentasi di sini: http://cr.yp.to/daemontools/setuidgid.html

aaronsw
sumber
7
daemontools bukanlah prasyarat pemula, jadi ini sepertinya bukan jawaban 'kanonik'
Adam Nelson
2
Lebih jauh, daemontools ada di jagat raya (ubuntu 10.04), dan pemula adalah yang utama.
jtimberman
4

Pada contoh Ubuntu 10.10 di Amazon EC2, saya lebih beruntung dengan start-stop-daemonperintah itu.

Saya juga berjuang dengan beberapa bait pemula lainnya . Saya memanggil aplikasi python dengan virtualenvparameter tertentu dan beberapa untuk program saya yang dijalankan.

Berikut ini yang berhasil bagi saya.

script
  export PYTHONPATH=.:/home/ubuntu/.local/lib/python2.7/site-packages/:/home/ubuntu/python/lib/python2.7/site-packages/
  exec start-stop-daemon --start  --chuid ubuntu --exec /home/ubuntu/python_envs/MyProj/bin/python /home/ubuntu/www/MyProj/MyProj.py -- --config-file-dir=/home/ubuntu/www/MyProj/config/ >> /home/ubuntu/startup.log 2>&1 &
end script

The PYTHONPATHadalah untuk mendapatkan beberapa paket diinstal dari sumber ke PYTHON jalan modul saat pekerjaan pemula ini berjalan. Saya harus melakukan segalanya di jalur absolut karena chdirbait tampaknya tidak bekerja.

Jesse Smith
sumber
Saya juga punya masalah dengan variabel env yang digunakan dengan exec start-stop-daemon .
Thomas Bratt
3

Saya menggunakan CentOS 6, dan saya tidak bisa mendapatkan retasan yang disarankan (untuk Upstart 0.6.5) bekerja untuk saya, juga trik 'su' karena jumlah garpu yang terlibat (4 saya pikir) tidak dilacak oleh 'fork fork 'atau' harapkan daemon '.

Saya akhirnya hanya melakukannya

chown user:group executable
chmod +s executable

(Yaitu mengatur bit setuid dan mengubah kepemilikan).

Ini mungkin bukan metode yang paling aman, tetapi untuk proyek R&D internal, itu tidak masalah dalam kasus kami.

Mark Lakata
sumber
Jika Anda melakukan chmod 1700atau setidaknya chmod u+sx,go-xdi sana, bukan hanya +s, itu akan memenuhi syarat sebagai "cukup aman." :)
dannysauer
0

Ada kemungkinan ketiga tergantung pada apa yang ingin Anda capai. Anda mungkin dapat melonggarkan kontrol akses pada file / perangkat yang dimaksud . Ini dapat memungkinkan pengguna yang tidak berkepentingan untuk memasang atau mengakses item yang biasanya tidak diizinkan. Pastikan Anda tidak memberikan kunci kerajaan dalam prosesnya.

Anda juga dapat mengubah batas waktu cache kata sandi sudo . Tetapi saya tidak merekomendasikannya kecuali mesin Anda secara fisik aman (yaitu, Anda yakin bahwa orang yang lewat tidak akan berusaha mendapatkan akses sudo).

Ada alasan bagus bahwa ada sangat sedikit cara untuk melakukan tindakan istimewa dan bahwa mereka melakukan penebangan yang tidak perlu . Pembatasan longgar akan menjadi bahaya keamanan untuk sistem Anda, dan kurangnya pencatatan berarti tidak ada cara untuk mengetahui apa yang terjadi ketika Anda telah dikompromikan.

Jika ukuran file log Anda mengkhawatirkan maka ada sesuatu yang mungkin salah. Sudo hanya menghasilkan satu baris per penggunaan dalam kondisi normal.

Chris Nava
sumber
0

Di CentOS 6, pemula 0.6.5, berikut ini yang berhasil bagi saya.

script

    exec su user_name << EOF
        exec /path/to/command [parameters...]
EOF

end script

atau :

script

    exec su user_name << EOF
       ..... what you want to do ....
EOF

end script

Saat digunakan

exec su -s /bin/sh -c 'exec "$0" "$@"' username -- /path/to/command [parameters...]

proses pekerjaan tidak bisa dihentikan initclt stop. Saya pikir alasannya adalah:

1. the job forked and the main process is not tracked.
2. the main process changed its process group,because of `su -c`
hxysayhi
sumber