Apakah ada cara untuk mencegah agar semua perintah tidak didefinisikan sebagai alias?
Sebagai contoh, pengguna seharusnya tidak dapat mendefinisikan rm
atau perintah lain (perintah default Ubuntu) sebagai nama alias.
~/.bashrc
.
Apakah ada cara untuk mencegah agar semua perintah tidak didefinisikan sebagai alias?
Sebagai contoh, pengguna seharusnya tidak dapat mendefinisikan rm
atau perintah lain (perintah default Ubuntu) sebagai nama alias.
~/.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 mendefinisikan PROMPT_COMMAND
.DEBUG
dan tidak mendefinisikan alias. Mereka menghilangkan jebakan.unset
, builtin
dan enable
; membuat alias
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.
unalias alias
.
\unalias unalias
.
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.
Anda dapat menggunakan shell terbatas Bash dengan menetapkan rbash sebagai shell login pengguna. Sebagai contoh:
foo:x:2001:2001:restricted user:/home/foo:/bin/rbash
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
fi
fi
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:
$ 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.
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 -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:
foo:x:2001:2001:run foo.sh:/home/foo:/usr/local/bin/foo.sh
Gunakan perintah paksa SSH per kunci. Sebagai contoh:
# ~foo/.ssh/authorized_keys
command="/usr/local/bin/foo.sh" [remainder of line]
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.
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:
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 bashrc
file yang berbeda misalnya.
Gagasan lain yang saya mainkan adalah enable
bawaan.
alias
adalah shell bawaan, dan bash
memiliki enable
perintah 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 bashrc
adalah opsi di sini.
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 disebut alias
yang 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 alias
yang mengabaikan perintah adalah Cara Yang Sangat Baik untuk Menembak Diri Sendiri di Kaki, dan menyebabkan kebingungan (misalnya, Mengapa ls
meminta kata sandi saya?))?