すべてのコマンドがエイリアスとして定義されないようにする


10

すべてのコマンドがエイリアスとして定義されないようにする方法はありますか?

たとえば、ユーザーはrmエイリアス名として他のコマンド(Ubuntuのデフォルトコマンド)を定義できないようにする必要があります。


どういう意味?誤ってそれを防ぐための「ソフトブロック」のようなものを探していますか?
コス2016年

4
たとえそれが可能であったとしても、そうすることの意味が何なのかわかりません。
muru、2016年

4
これのロジックは何でしょうか?ユーザーが実際のコマンドを入力するのを妨げるものではないので、エイリアスをブロックする必要がある理由はわかりませんか?
Rinzwind 2016年

2
ムルとリンツウィンドが言ったように、何の意味があるのですか?エイリアスは、ユーザーが既に許可されていることよりも厄介なことを行うことはできません。エイリアスをブロックすると、ユーザーの生活が困難になります。また、解決策が何であろうと(たとえば、エイリアス/関数を使用して組み込みをオーバーライドするなど)、ユーザーをロックしない限り、ユーザー自身が回避できないようにする方法は考えられません~/.bashrc
kos

すべてのエイリアスをブロックするのではなく、デフォルトのコマンド名をエイリアス名として使用しないようにします。同じエイリアスコマンドで\を使用して実際のコマンドを実行するなど、さまざまな方法でエイリアスをエスケープできることはわかっています。それがすべてです
αғsнιη

回答:


24

ユーザーが好みのエイリアスを定義できないようにする方法はありません。検討してください:

  1. でエイリアスを無効にします /etc/bash.bashrc。彼らは、どこを選んでもそれを可能にします。
  2. あなたはすべての中でエイリアスの言及を削除/etc/bash.bashrcし、すべて~/.bashrc~/.bash_aliasesスクリプトによる。彼らはエイリアスを別のファイルに入れ、それを調達します。
  3. PROMPT_COMMAND特定のエイリアスを無効にするコマンドを実行します。彼らは再定義または未定義PROMPT_COMMANDです。
  4. あなたは罠 DEBUGエイリアスをして未定義にします。彼らは罠を取り除く。
  5. rootへの呼び出しで供給されたすべてのファイルをchownします。彼らは別のファイルを使用し、実行する最初のコマンドとして手動でソースを設定します。
  6. 組み込みを無効unsetbuiltinenableます。関数を作成aliasしますdeclare -rf aliasユーザーが機能を変更できないようにするため。関数をエクスポートします。それらはで実行さ/bin/bash--rcfile--init-fileビルトインが有効になっている新しいシェルを開始します。
  7. ...

コンパイル時にエイリアスを無効にすることができます。その場合、bashを最新の状態に保ち、次のShellshockの影響を受けないようにする必要があります。もちろん、ユーザーは自分のbashを作成することができます。


4
でもちょっとおかしいアイデアがありました。エイリアスをエイリアスにすることができます:=)
Rinzwind

4
そして、彼らはunalias alias
muru

4
@muru確かにunaliasにエイリアスを付けることもできます:+
Rinzwind

8
@Rinzwindと実行し\unalias unaliasます。
muru

10

TL; DR

ユーザーがエイリアスを作成できないようにする唯一の方法は、エイリアスをサポートしていないシェルをユーザーに提供することです。これは一般的にX / Yの問題であり、Xは実際に脅威モデルであり、事後的に問題を解決しようとするのではなく、適切な制御またはアーキテクチャで解決する必要があります。ユーザーが共有システム上のシェルが与えられた後。

以下に、技術的に正しい答えと、これで解決できる問題と解決されない問題に関するガイダンスを示します。また、代替コントロールに関する追加のガイダンスも提供します。

Bash制限付きシェルの使用

ユーザーのログインシェルとしてrbashを割り当てることにより、Bashの制限付きシェルを使用できます。例えば:

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

次に、ユーザーの組み込みのエイリアスを無効にする必要があります。できれば、他の全員のシェルも壊さないようにする必要があります。例として、/ 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

注意事項

ユーザーをchroot jailに配置したり、他のシェルへのアクセスを含まない変更されたPATHをユーザーに提供したりしない限り、ユーザーが単純に入力するのを妨げるものはありませんbashがプロンプトでして無制限のシェルを取得することを妨げるものはありません。

さらに、制限付きシェルは、設計により、ディレクトリの変更など、多くの一般的なアクティビティを防止します。

$ cd /tmp
rbash: cd: restricted

ただし、PATH内の他のスクリプトまたはプログラムがそれを行うことを妨げません。これは、ユーザーの環境を慎重に作成する必要があることを意味します。具体的には、ユーザーがスタートアップファイルのPATHを変更できないようにする必要があります。これは、rbashがPATHを読み取り専用にしても初期化後に変更されるためです。

より良い選択

rbashを使用する場合でも、幅広いコントロールセットの一部として使用する必要があります。いくつかの例は次のとおりです。

  • できないように非技術的なユーザー偶然のようなデフォルトのエイリアス提供することで、危険なコマンドを呼び出すrm -imv -icp -i/etc/bash.bashrcのファイルを。

    • あなたの元の例を考えると、これはおそらく最も賢明な解決策です。
    • これはenable -n alias、必要に応じて組み合わせることができます。
    • これは、知識のあるユーザーがエイリアスを変更するのを防ぐことはできませんが、技術者以外のユーザーが心配していることを実行するのを防ぐには十分です。
  • ファイルとディレクトリを保護するための従来のUnix権限またはPOSIX ACL。

  • 単一の非インタラクティブコマンドを実行するログイン。例えば:

    foo:x:2001:2001:run foo.sh:/home/foo:/usr/local/bin/foo.sh
  • キーごとのSSH強制コマンドを使用します。例えば:

    # ~foo/.ssh/authorized_keys
    command="/usr/local/bin/foo.sh" [remainder of line]
  • 条件付きMatchブロックでOpenSSH ForceCommandオプションを使用します。

  • 特定の使用事例に合わせて設計されたgitoliteまたはscponlyなどの特別なツールを使用します。

  • chroot jailを使用してください。

  • Xen、OpenVZ、LXC、VMware、VirtualBox、またはその他のテクノロジーなどの仮想化を使用して、分離された環境を提供します。

脅威モデルを正確に定義したら、ユースケースに最も適切なコントロールを特定できます。エイリアシングを防止したい理由(たとえば、実際にどのような問題が解決されるのか)をより深く理解しないと、最も適切なコントロールを選択できません。


一般に+1ですが、特にこれをX / Y問題として分類するためにも使用します。
Joe

5

ムルの答えが示すように、これは全く無意味な努力です。しかし、いくつかのオプションがありますが、それらは完璧ではありません。

bashマニュアルによると、関数は常にエイリアスよりも優先されるため、次のようにすることができます。

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

関数定義をシステム全体に配置することもできますが.bashrc、muruが指摘したように、スマートユーザーは別のソースを使用してエイリアスを取得する方法を見つけますbashrc、たとえばファイルをます。

私が試したもう1つのアイデアはenable組み込みです。 alias組み込みシェルであり、組み込みコマンドを有効または無効にできるbash素晴らしいenableコマンドがあります。たとえば、私が無効にしてい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:~$ 

ここでも、システム全体を使用bashrcすることがここでのオプションです。


すべてのエイリアスをブロックするのではなく、組み込みコマンドのみをエイリアス自体ではなく:)
16

@ Afshin.Hamediさて、デフォルトのコマンドは何ですか?ubuntuに付属するもの?つまり、デフォルトのインストールに付属するすべてのコマンド(バイナリファイル)のリストが必要になります。次に、ユーザーがシェルをロードするか、にエイリアスを設定しようとするたびにrm、リストをチェックします。リストがかなり大きいことを考えると、開始するのに長い時間がかかり、ユーザーはあなたに多くの不満を
抱き

それはあなたが持っている楽しくて素晴らしい質問です、私はそれが好きです!選択的なエイリアシングはいいでしょう。しかし、シェル開発者がそれを実装する必要性を見つけない限り、それが達成可能であるとは思えません:)
Sergiy Kolodyazhnyy

関数のアイデアは良かったです。一番近くに来ました。
muru

0

あなたは可能性があり(で定義/etc/profile呼び出された関数)aliasあなたは(おそらく使用したいの検証を行いますtype -p(すべての「Ubuntuのデフォルトコマンドの」後「で実行可能です)$PATH組み込みを呼び出す前に」) alias、しかし、他の人が指摘したように、あなたのユーザーが得ることができますその周り。別のユーザーセットを取得したり、教育したりしないのはなぜですか(「aliasコマンドをオーバーライドするを定義することは、自分を足で撃つための非常に良い方法であり、混乱を引き起こしlsます(たとえば、なぜパスワードを要求するのですか?)」

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.