Tüm komutların takma ad olarak tanımlanmasını önleme


10

Tüm komutların takma ad olarak tanımlanmasını önlemenin bir yolu var mı?

Örneğin, bir kullanıcı, rmdiğer ad olarak başka bir komut (Ubuntu varsayılan komutları) tanımlayamamalı .


Tam olarak ne demek istiyorsun? Bunu yanlışlıkla yapmanıza engel olmak için "yumuşak blok" gibi bir şey mi arıyorsunuz?
kos

4
Mümkün olsa bile, bunu yapmanın ne anlama geldiğinden emin değilim.
muru

4
bunun mantığı ne olurdu? Bir kullanıcının gerçek komutu yazmasını engellemez ... bu yüzden kimsenin takma adları engellemesine gerek yok mu?
Rinzwind

2
Muru ve Rinzwind'in dediği gibi, ne anlamı var? Takma adlar, kullanıcının zaten yapmasına izin verilenlerden daha kötü şeyler yapamaz, takma adları engellemek yalnızca kullanıcının hayatını zorlaştırır. Ayrıca çözüm ne olursa olsun (örneğin yerleşik geçersiz kılmak için bir takma ad / işlev kullanarak) kilitlemek sürece, kullanıcıların kendileri tarafından atlanamaz hale getirmek için bir yol düşünemiyorum ~/.bashrc.
kos

Tüm takma adı engellememek, yalnızca varsayılan komut adını takma ad olarak kullanmasını önleyin. Gerçek komut çalıştırmak için aynı takma komutla \ kullanmak gibi birçok yolla takma adlardan kaçabileceğimizi biliyorum. Hepsi bu
αғsнιη

Yanıtlar:


24

Bir kullanıcının istediği takma adı tanımlamasını engelleyemezsiniz. Düşünmek:

  1. İçindeki takma adları devre dışı bıraktınız /etc/bash.bashrc. Nereye isterse seçsinler.
  2. Hepiniz de takma bahseder silmek /etc/bash.bashrcve tüm ~/.bashrcve ~/.bash_aliasesbir komut dosyası aracılığıyla. Takma adlarını başka bir dosyaya koyarlar ve kaynak yaparlar.
  3. PROMPT_COMMANDBelirli diğer adları devre dışı bırakan bir komut çalıştırırsınız . Yeniden tanımlıyorlar veya tanımsızlar PROMPT_COMMAND.
  4. DEBUGTakma adları yakalar ve tanımlarsınız. Tuzağı kaldırırlar.
  5. Kök çağrıldığında kaynaklı tüm dosyaları seçtiniz. Başka bir dosya kullanırlar ve çalıştırdıkları ilk komut olarak elle kaynak yaparlar.
  6. Sen yerleşiklerini devre dışı unset, builtinve enable; işlev yapmakalias ; declare -rf aliaskullanıcıların işlevi değiştirmesini önlemek; ve işlevi dışa aktarın. Onlar çalıştırmak /bin/bashile --rcfileve --init-fileyerleşikleri artık etkin sözü yeni bir kabuk, başlatın.
  7. ...

Diğer adları derleme zamanında devre dışı bırakabilirsiniz, o zaman bash'ı güncel tutmak ve bir sonraki Shellshock'tan etkilenmediğinizden emin olmak size kalmış. Tabii ki, kullanıcılar kendi bash inşa edebilirsiniz.


4
Yine de biraz komik bir fikrim vardı: takma ad takma: =)
Rinzwind

4
Ve onlar unalias alias.
muru

4
eminim ama aynı zamanda unalias takma: +
Rinzwind

8
@Rinzwind ve koşuyorlar \unalias unalias.
muru

10

TL; DR

Bir kullanıcının takma ad oluşturmasını engellemenin tek yolu, takma adı desteklemeyen bir kabuk sağlamaktır. Bu genellikle bir X / Y problemidir, burada X, kullanıcıya paylaşılan bir sistemde bir kabuk verildikten sonra fiili olarak sorunu çözmeye çalışmak yerine, uygun kontroller veya mimariler ile çözülmesi gereken bir tehdit modelidir .

Aşağıda, teknik olarak doğru bir cevap ve bunun hangi problemleri çözeceği ve çözmeyeceği konusunda bazı rehberlik sağlarım. Ayrıca alternatif kontroller hakkında bazı ek rehberlik sağlarım.

Bash Kısıtlı Kabuğu Kullanma

Kullanıcının giriş kabuğu olarak rbash atayarak Bash'ın kısıtlı kabuğunu kullanabilirsiniz . Örneğin:

foo:x:2001:2001:restricted user:/home/foo:/bin/rbash

Ardından , tercihen herkesin kabuğunu bozmadan, kullanıcı için yerleşik takma adı devre dışı bırakmanız gerekir . Örnek olarak, /etc/profile.d/rbash.sh gibi bir dosyaya aşağıdakileri ekleyebilirsiniz :

# 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

Uyarılar

Kullanıcıyı bir cezaevi hapishanesine yerleştirmediyseniz veya diğer kabuklara erişimi içermeyen değiştirilmiş bir PATH sağlamadıysanız, kullanıcının yalnızca bashkomut istemine yazmasını ve kısıtlanmamış bir kabuk almasını engelleyen hiçbir şey yoktur .

Buna ek olarak, kısıtlanmış kabuk, tasarımla dizinleri değiştirmek gibi birçok yaygın etkinliği engeller:

$ cd /tmp
rbash: cd: restricted

ancak PATH içindeki diğer komut dosyalarının veya programların bunu engellemez . Bu araçlar dikkatlice kullanıcının ortamı zanaat zorunda ve özellikle değiştirmek mümkün engellemek gerektiğini PATH rbash yapar çünkü rağmen kendi başlangıç dosyalarında PATH salt okunur bunu yapar sonra başlatma.

Daha İyi Seçenekler

Rbash kullansanız bile, bunu daha geniş bir kontrol setinin parçası olarak yapmanız gerekir. Bazı örnekler şunları içerebilir:

  • Önle teknik olmayan kullanıcılar yanlışlıkla gibi varsayılan takma adları sağlayarak çağırma tehlikeli komutları rm -i, mv -ive cp -ide /etc/bash.bashrc dosyası.

    • Orijinal örneğiniz göz önüne alındığında, bu muhtemelen en mantıklı çözümdür.
    • İsterseniz bunu ile birleştirebilirsiniz enable -n alias.
    • Bu, bilgili kullanıcıların takma adları değiştirmesini engellemez, ancak teknik olmayan kullanıcıların endişe duyduğunuz her şeyi yapmasını önlemek yeterli olabilir.
  • Dosyaları ve dizinleri korumak için geleneksel Unix izinleri veya POSIX ACL'leri.

  • Etkileşimli olmayan tek bir komut gerçekleştiren girişler. Örneğin:

    foo:x:2001:2001:run foo.sh:/home/foo:/usr/local/bin/foo.sh
  • Anahtar başına SSH zorunlu komutlarını kullanın. Örneğin:

    # ~foo/.ssh/authorized_keys
    command="/usr/local/bin/foo.sh" [remainder of line]
  • Koşullu Eşleşme bloğu ile OpenSSH ForceCommand seçeneğini kullanın .

  • Özel kullanım durumunuz için tasarlanmış gitolit veya scponly gibi özel aletler kullanın.

  • Chroot hapishanesi kullan .

  • Ayrılmış bir ortam sağlamak için Xen, OpenVZ, LXC, VMware, VirtualBox veya diğer teknolojiler gibi sanallaştırmayı kullanın.

Tehdit modelinizi doğru bir şekilde tanımladıktan sonra, kullanım durumunuz için en uygun kontrolleri tanımlayabilirsiniz. Takma adı neden engellemek istediğinizi (örn. Hangi gerçek dünya sorununu çözüyor?) Daha anlamlı bir anlayış olmadan en uygun kontrolleri seçemezsiniz.


Genel olarak +1, ancak özellikle bunu bir X / Y sorunu olarak sınıflandırmak için.
Joe

5

Muru'nun cevabının gösterdiği gibi, bu oldukça anlamsız bir çaba. Ancak bazı seçenekler var, ancak mükemmel değiller.

bashEl kitabına göre , işlevler her zaman takma adlardan önceliklidir, bu nedenle aşağıdakileri yapabiliriz:

xieerqi@eagle:~$ function alias { echo "Aliases are no-no" ; }
xieerqi@eagle:~$ alias TEST='rm'
Aliases are no-no

İşlev tanımını sistem çapında yerleştirebilirsiniz .bashrc, ancak muru'nun işaret ettiği gibi, akıllı kullanıcılar bashrcörneğin farklı bir dosya sağlayarak takma adlar almanın yolunu bulacaklardır .

Birlikte oynadığım başka bir fikir de enableyerleşik. aliasyerleşik bir kabuktur ve yerleşiklerin etkinleştirilmesine veya devre dışı bırakılmasına izin veren bashgüzel bir enablekomuta sahiptir. Mesela işte devre dışı bırakıyorum 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:~$ 

Yine, sistem çapında kullanmak bashrcburada bir seçenektir.


Tüm takma adı engellemiyor, yalnızca yerleşik komutlar takma adın kendisini değil :)
αғsнιη

@ Afshin.Hamedi Peki, varsayılan komut nedir? Ubuntu ile gelen mi? Bu, varsayılan yüklemeyle birlikte gelen tüm komutların (ikili dosyalar) bir listesine sahip olmanız gerektiği anlamına gelir. Daha sonra kullanıcı her kabuk yüklediğinde veya bir şeyi takma ad oluşturmaya çalıştığında rmlisteyi kontrol eder. Listelerin oldukça büyük olacağı düşünülürse, başlamak uzun zaman alacaktır, kullanıcılarınız size çok şikayet edecek ve sistem yöneticisi olarak sizden nefret edecektir :)
Sergiy Kolodyazhnyy

Eğlenceli, harika bir soru var, beğendim! Seçici takma ad hoş olurdu. Ancak, kabuk geliştiricilerinin uygulanması için bir ihtiyaç bulamadığı sürece başarılabilir olduğundan şüpheliyim :)
Sergiy Kolodyazhnyy

İşlev fikri güzeldi. En yakına geldi.
muru

0

Sen olabilir (tanımlamak /etc/profileadında bir işlevi) aliasdoğrulama size (muhtemelen kullanarak istiyor mu type -p(hepsi "Ubuntu varsayılan komutları" sonra "içinde çalıştırılabilir vardır) $PATHyerleşiğini çağırmadan önce") aliasdiğerleri sivri out olması koşuluyla, kullanıcılar alabilir, ANCAK etrafında. Neden farklı bir kullanıcı grubu almıyorsunuz veya onları eğitmiyorsunuz (" aliasBir komutu geçersiz kılan bir tanesinin tanımlanması Kendi Kendini Ayakta Çekmenin ve karışıklığa neden olmanın çok iyi bir yoludur (örn. Neden lsparolamı sormam gerekiyor?))?

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.