Apa maksudmu sebenarnya? Apakah Anda mencari sesuatu seperti "blok lunak" untuk mencegah Anda melakukan hal itu secara tidak sengaja?
kos
4
Saya tidak yakin apa gunanya melakukannya, bahkan jika itu mungkin.
muru
4
apa yang akan menjadi logika untuk ini? Itu tidak mencegah pengguna mengetik perintah yang sebenarnya ... jadi saya tidak melihat alasan bagi siapa pun untuk perlu memblokir alias?
Rinzwind
2
Seperti yang dikatakan muru dan Rinzwind, apa gunanya? Alias tidak dapat melakukan hal-hal yang lebih jahat daripada hal-hal yang diizinkan dilakukan oleh pengguna, memblokir alias hanya membuat hidup pengguna lebih sulit. Juga apa pun solusinya (misalnya menggunakan alias / fungsi untuk mengesampingkan built-in) saya tidak bisa memikirkan cara untuk membuatnya tidak dapat dielakkan oleh pengguna itu sendiri, kecuali dengan mengunci mereka ~/.bashrc.
kos
Tidak memblokir semua alias, hanya mencegahnya untuk tidak menggunakan nama perintah default sebagai nama alias. Saya tahu kita dapat melarikan diri alias dengan banyak cara seperti menggunakan \ dengan perintah alias yang sama untuk menjalankan perintah yang sebenarnya. Itu saja
αғsнιη
Jawaban:
24
Tidak mungkin Anda dapat mencegah pengguna menentukan alias apa pun yang mereka inginkan. Mempertimbangkan:
Anda menonaktifkan alias di /etc/bash.bashrc. Mereka mengaktifkannya di mana pun mereka mau.
Anda menghapus semua menyebutkan alias di /etc/bash.bashrc, dan semua ~/.bashrcdan ~/.bash_aliasesmelalui skrip. Mereka memasukkan alias mereka ke file lain dan sumbernya.
Anda menjalankan perintah PROMPT_COMMANDyang menonaktifkan alias tertentu. Mereka mendefinisikan ulang atau tidak mendefinisikan PROMPT_COMMAND.
Anda menjebak DEBUGdan tidak mendefinisikan alias. Mereka menghilangkan jebakan.
Anda menandai semua file yang bersumber dari permintaan untuk melakukan root. Mereka menggunakan file lain dan sumber secara manual sebagai perintah pertama yang mereka jalankan.
Anda menonaktifkan bawaan unset, builtindan enable; membuat aliasfungsi ; declare -rf aliasuntuk mencegah pengguna memodifikasi fungsi; dan ekspor fungsinya. Mereka berjalan /bin/bashdengan --rcfiledan --init-fileuntuk memulai shell baru, di mana kata builtin sekarang diaktifkan.
...
Anda dapat menonaktifkan alias pada waktu kompilasi, maka terserah Anda untuk terus memperbarui bash dan memastikan Anda tidak terpengaruh oleh Shellshock berikutnya. Tentu saja, para pengguna dapat membangun bash mereka sendiri.
Saya punya sedikit ide lucu: Anda dapat alias alias: =)
Rinzwind
4
Dan mereka unalias alias.
muru
4
@muru yakin tetapi Anda juga bisa alias unalias: +
Rinzwind
8
@Rinzwind dan mereka lari \unalias unalias.
muru
10
TL; DR
Satu-satunya cara untuk mencegah pengguna membuat alias adalah dengan memberi mereka shell yang tidak mendukung alias. Ini umumnya merupakan masalah X / Y, di mana X benar-benar model ancaman yang harus diselesaikan dengan kontrol atau arsitektur yang tepat daripada mencoba menyelesaikan masalah post-facto setelah pengguna diberikan shell pada sistem bersama.
Di bawah ini, saya memberikan jawaban yang benar secara teknis, serta beberapa panduan tentang masalah apa yang akan dan tidak akan diselesaikan. Saya juga memberikan beberapa panduan tambahan tentang kontrol alternatif.
Menggunakan Bash Restricted Shell
Anda dapat menggunakan shell terbatas Bash dengan menetapkan rbash sebagai shell login pengguna. Sebagai contoh:
Anda kemudian harus menonaktifkan alias built-in untuk pengguna, lebih disukai tanpa melanggar shell orang lain juga. Sebagai contoh, Anda bisa menambahkan yang berikut ke file seperti /etc/profile.d/rbash.sh :
# Limit effect to users in a specific UID range.if((UID >=2000))&&((UID <3000));then# Check shell options; disable alias builtins when shell is restricted.if[[ $-=~ r ]];then
enable -n alias
enable -n unalias
fifi
Peringatan
Kecuali Anda telah menempatkan pengguna ke dalam chroot jail atau memberi mereka PATH yang dimodifikasi yang tidak menyertakan akses ke shell lain, tidak ada yang menghentikan pengguna dari hanya mengetik bashdi prompt dan mendapatkan shell yang tidak dibatasi.
Selain itu, dengan desain shell yang dibatasi mencegah banyak kegiatan umum seperti mengubah direktori:
$ cd /tmp
rbash: cd: restricted
tetapi tidak mencegah skrip atau program lain dalam PATH dari melakukannya. Ini berarti Anda harus membuat lingkungan pengguna dengan hati-hati, dan secara khusus Anda perlu mencegah mereka agar tidak dapat memodifikasi PATH dalam file startup mereka, karena meskipun rbash membuat PATH hanya-baca hal itu dilakukan setelah inisialisasi.
Pilihan yang lebih baik
Bahkan jika Anda menggunakan rbash, Anda harus melakukannya sebagai bagian dari rangkaian kontrol yang lebih luas. Beberapa contoh mungkin termasuk:
Mencegah non-teknis pengguna dari sengaja memanggil perintah berbahaya dengan memberikan alias bawaan seperti rm -i, mv -i, dan cp -idi /etc/bash.bashrc berkas.
Diberikan contoh asli Anda, ini mungkin solusi yang paling masuk akal.
Anda dapat menggabungkan ini dengan enable -n aliasjika Anda mau.
Ini tidak akan mencegah pengguna yang berpengetahuan untuk mengubah alias, tetapi mungkin cukup untuk mencegah pengguna non-teknis dari melakukan apa pun yang Anda khawatirkan.
Izin Unix Tradisional atau ACL POSIX untuk melindungi file dan direktori.
Login yang melakukan perintah non-interaktif tunggal. Sebagai contoh:
Gunakan virtualisasi seperti Xen, OpenVZ, LXC, VMware, VirtualBox, atau teknologi lainnya untuk menyediakan lingkungan yang terpisah.
Setelah Anda secara akurat mendefinisikan model ancaman Anda, Anda dapat mengidentifikasi kontrol yang paling tepat untuk kasus penggunaan Anda. Tanpa pemahaman yang lebih bermakna tentang mengapa Anda ingin mencegah alias (mis., Masalah dunia nyata apa yang dipecahkannya?), Anda tidak dapat memilih kontrol yang paling tepat.
+1 secara umum, tetapi juga khusus untuk mengklasifikasikan ini sebagai masalah X / Y.
Joe
5
Ini adalah usaha yang sia-sia, seperti yang ditunjukkan oleh jawaban muru. Tetapi ada beberapa opsi, tetapi mereka tidak sempurna.
Menurut bashmanual, fungsi selalu lebih diutamakan daripada alias, sehingga kami dapat melakukan hal berikut:
xieerqi@eagle:~$ function alias { echo "Aliases are no-no";}
xieerqi@eagle:~$ alias TEST='rm'Aliases are no-no
Anda dapat menempatkan definisi fungsi ke seluruh sistem .bashrc, namun seperti yang ditunjukkan muru, pengguna cerdas akan menemukan cara untuk mendapatkan alias dengan sumber bashrcfile yang berbeda misalnya.
Gagasan lain yang saya mainkan adalah enablebawaan.
aliasadalah shell bawaan, dan bashmemiliki enableperintah yang bagus yang memungkinkan mengaktifkan atau menonaktifkan bawaan. Misalnya, inilah saya menonaktifkan alias.
xieerqi@eagle:~$ enable -n alias
xieerqi@eagle:~$ alias
No command 'alias' found, did you mean:Command'0alias' from package 'zeroinstall-injector'(universe)
alias: command not found
xieerqi@eagle:~$ alias TEST='rm'No command 'alias' found, did you mean:Command'0alias' from package 'zeroinstall-injector'(universe)
alias: command not found
xieerqi@eagle:~$ enable alias
xieerqi@eagle:~$ alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'
xieerqi@eagle:~$
Sekali lagi, menggunakan systemwide bashrcadalah opsi di sini.
@ Afshin. Hamedi Yah, apa itu perintah default? Yang datang dengan ubuntu? Itu berarti Anda harus memiliki daftar semua perintah (file biner) yang datang dengan instalasi default. Kemudian setiap kali pengguna memuat shell atau mencoba alias sesuatu rm, ia memeriksa daftar. Mempertimbangkan bahwa daftar akan cukup besar, akan butuh waktu lama untuk memulai, pengguna Anda akan banyak mengeluh kepada Anda dan membenci Anda sebagai admin sistem :)
Sergiy Kolodyazhnyy
Ini pertanyaan yang menyenangkan dan luar biasa, saya suka! Aliasing selektif akan menyenangkan. Tapi saya ragu itu bisa dicapai, kecuali jika pengembang shell menemukan kebutuhan untuk mengimplementasikannya :)
Sergiy Kolodyazhnyy
Gagasan fungsinya bagus. Itu datang paling dekat.
muru
0
Anda bisa mendefinisikan (dalam /etc/profile) fungsi yang disebut aliasyang melakukan validasi yang Anda inginkan (mungkin menggunakan type -p) (setelah semua "perintah default Ubuntu" adalah "executable in $PATH") sebelum memanggil builtin alias, TETAPI, seperti yang ditunjukkan orang lain, pengguna Anda bisa mendapatkan sekitar itu. Mengapa tidak mendapatkan kelompok pengguna yang berbeda, atau mendidik mereka ("Mendefinisikan perintah aliasyang mengabaikan perintah adalah Cara Yang Sangat Baik untuk Menembak Diri Sendiri di Kaki, dan menyebabkan kebingungan (misalnya, Mengapa lsmeminta kata sandi saya?))?
~/.bashrc
.Jawaban:
Tidak mungkin Anda dapat mencegah pengguna menentukan alias apa pun yang mereka inginkan. Mempertimbangkan:
/etc/bash.bashrc
. Mereka mengaktifkannya di mana pun mereka mau./etc/bash.bashrc
, dan semua~/.bashrc
dan~/.bash_aliases
melalui skrip. Mereka memasukkan alias mereka ke file lain dan sumbernya.PROMPT_COMMAND
yang menonaktifkan alias tertentu. Mereka mendefinisikan ulang atau tidak mendefinisikanPROMPT_COMMAND
.DEBUG
dan tidak mendefinisikan alias. Mereka menghilangkan jebakan.unset
,builtin
danenable
; membuatalias
fungsi ;declare -rf alias
untuk mencegah pengguna memodifikasi fungsi; dan ekspor fungsinya. Mereka berjalan/bin/bash
dengan--rcfile
dan--init-file
untuk memulai shell baru, di mana kata builtin sekarang diaktifkan.Anda dapat menonaktifkan alias pada waktu kompilasi, maka terserah Anda untuk terus memperbarui bash dan memastikan Anda tidak terpengaruh oleh Shellshock berikutnya. Tentu saja, para pengguna dapat membangun bash mereka sendiri.
sumber
unalias alias
.\unalias unalias
.TL; DR
Satu-satunya cara untuk mencegah pengguna membuat alias adalah dengan memberi mereka shell yang tidak mendukung alias. Ini umumnya merupakan masalah X / Y, di mana X benar-benar model ancaman yang harus diselesaikan dengan kontrol atau arsitektur yang tepat daripada mencoba menyelesaikan masalah post-facto setelah pengguna diberikan shell pada sistem bersama.
Di bawah ini, saya memberikan jawaban yang benar secara teknis, serta beberapa panduan tentang masalah apa yang akan dan tidak akan diselesaikan. Saya juga memberikan beberapa panduan tambahan tentang kontrol alternatif.
Menggunakan Bash Restricted Shell
Anda dapat menggunakan shell terbatas Bash dengan menetapkan rbash sebagai shell login pengguna. Sebagai contoh:
Anda kemudian harus menonaktifkan alias built-in untuk pengguna, lebih disukai tanpa melanggar shell orang lain juga. Sebagai contoh, Anda bisa menambahkan yang berikut ke file seperti /etc/profile.d/rbash.sh :
Peringatan
Kecuali Anda telah menempatkan pengguna ke dalam chroot jail atau memberi mereka PATH yang dimodifikasi yang tidak menyertakan akses ke shell lain, tidak ada yang menghentikan pengguna dari hanya mengetik
bash
di prompt dan mendapatkan shell yang tidak dibatasi.Selain itu, dengan desain shell yang dibatasi mencegah banyak kegiatan umum seperti mengubah direktori:
tetapi tidak mencegah skrip atau program lain dalam PATH dari melakukannya. Ini berarti Anda harus membuat lingkungan pengguna dengan hati-hati, dan secara khusus Anda perlu mencegah mereka agar tidak dapat memodifikasi PATH dalam file startup mereka, karena meskipun rbash membuat PATH hanya-baca hal itu dilakukan setelah inisialisasi.
Pilihan yang lebih baik
Bahkan jika Anda menggunakan rbash, Anda harus melakukannya sebagai bagian dari rangkaian kontrol yang lebih luas. Beberapa contoh mungkin termasuk:
Mencegah non-teknis pengguna dari sengaja memanggil perintah berbahaya dengan memberikan alias bawaan seperti
rm -i
,mv -i
, dancp -i
di /etc/bash.bashrc berkas.enable -n alias
jika Anda mau.Izin Unix Tradisional atau ACL POSIX untuk melindungi file dan direktori.
Login yang melakukan perintah non-interaktif tunggal. Sebagai contoh:
Gunakan perintah paksa SSH per kunci. Sebagai contoh:
Gunakan opsi OpenSSH ForceCommand dengan blok Match bersyarat.
Menggunakan alat khusus seperti gitolite atau scponly dirancang untuk kasus penggunaan khusus Anda.
Gunakan penjara chroot .
Gunakan virtualisasi seperti Xen, OpenVZ, LXC, VMware, VirtualBox, atau teknologi lainnya untuk menyediakan lingkungan yang terpisah.
Setelah Anda secara akurat mendefinisikan model ancaman Anda, Anda dapat mengidentifikasi kontrol yang paling tepat untuk kasus penggunaan Anda. Tanpa pemahaman yang lebih bermakna tentang mengapa Anda ingin mencegah alias (mis., Masalah dunia nyata apa yang dipecahkannya?), Anda tidak dapat memilih kontrol yang paling tepat.
sumber
Ini adalah usaha yang sia-sia, seperti yang ditunjukkan oleh jawaban muru. Tetapi ada beberapa opsi, tetapi mereka tidak sempurna.
Menurut
bash
manual, fungsi selalu lebih diutamakan daripada alias, sehingga kami dapat melakukan hal berikut:Anda dapat menempatkan definisi fungsi ke seluruh sistem
.bashrc
, namun seperti yang ditunjukkan muru, pengguna cerdas akan menemukan cara untuk mendapatkan alias dengan sumberbashrc
file yang berbeda misalnya.Gagasan lain yang saya mainkan adalah
enable
bawaan.alias
adalah shell bawaan, danbash
memilikienable
perintah yang bagus yang memungkinkan mengaktifkan atau menonaktifkan bawaan. Misalnya, inilah saya menonaktifkanalias
.Sekali lagi, menggunakan systemwide
bashrc
adalah opsi di sini.sumber
rm
, ia memeriksa daftar. Mempertimbangkan bahwa daftar akan cukup besar, akan butuh waktu lama untuk memulai, pengguna Anda akan banyak mengeluh kepada Anda dan membenci Anda sebagai admin sistem :)Anda bisa mendefinisikan (dalam
/etc/profile
) fungsi yang disebutalias
yang melakukan validasi yang Anda inginkan (mungkin menggunakantype -p
) (setelah semua "perintah default Ubuntu" adalah "executable in$PATH
") sebelum memanggil builtinalias
, TETAPI, seperti yang ditunjukkan orang lain, pengguna Anda bisa mendapatkan sekitar itu. Mengapa tidak mendapatkan kelompok pengguna yang berbeda, atau mendidik mereka ("Mendefinisikan perintahalias
yang mengabaikan perintah adalah Cara Yang Sangat Baik untuk Menembak Diri Sendiri di Kaki, dan menyebabkan kebingungan (misalnya, Mengapals
meminta kata sandi saya?))?sumber