Cegah semua perintah agar tidak didefinisikan sebagai alias

10

Apakah ada cara untuk mencegah agar semua perintah tidak didefinisikan sebagai alias?

Sebagai contoh, pengguna seharusnya tidak dapat mendefinisikan rmatau perintah lain (perintah default Ubuntu) sebagai nama alias.

αғsнιη
sumber
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:

  1. Anda menonaktifkan alias di /etc/bash.bashrc. Mereka mengaktifkannya di mana pun mereka mau.
  2. Anda menghapus semua menyebutkan alias di /etc/bash.bashrc, dan semua ~/.bashrcdan ~/.bash_aliasesmelalui skrip. Mereka memasukkan alias mereka ke file lain dan sumbernya.
  3. Anda menjalankan perintah PROMPT_COMMANDyang menonaktifkan alias tertentu. Mereka mendefinisikan ulang atau tidak mendefinisikan PROMPT_COMMAND.
  4. Anda menjebak DEBUGdan tidak mendefinisikan alias. Mereka menghilangkan jebakan.
  5. 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.
  6. 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.
  7. ...

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.

muru
sumber
4
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:

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

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:

    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.

CodeGnome
sumber
+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.

Sergiy Kolodyazhnyy
sumber
Tidak memblokir semua alias, hanya perintah
bawaan
@ 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?))?

waltinator
sumber