Linuxで特定のユーザーに対して特定のコマンドをブロックする


27

コマンドをブロックする方法mkdir、特定のユーザー向けに言ってみましょうか?

読み取り専用関数を作成し、ユーザープロファイルに保存したところ ~/.bashrc

/bin/mkdir() {
        echo "mkdir command not allow for you"

}

mkdir() {
        echo "mkdir command not allow for you"

}
./mkdir() {

        echo "mkdir command not allow for you"
}

readonly -f /bin/mkdir
readonly -f mkdir
readonly -f ./mkdir

テスト:

rahul@ubuntu:~$ cd /bin/
rahul@ubuntu:/bin$ ./mkdir /home/rahul/ggg
mkdir command not allow for you
rahul@ubuntu:/bin$ cd
rahul@ubuntu:~$ mkdir testing
mkdir command not allow for you
rahul@ubuntu:~$ /bin/mkdir testing
mkdir command not allow for you

だから私の質問はこれを達成する方法は何ですか?これのためのツールはありますか?

アップデート1#しかし、ユーザーが賢い場合、mkdirバイナリをコピーして名前を変更し、使用できます。それでこれを達成する方法は?


7
ユーザーが自分mkdirでコンパイルして名前を変更したり、既存のバイナリを単にコピーして名前を変更したりできるため、この例は失敗します。また、エイリアスと関数をオーバーライドするためのシェルビルトインがあります。
-strugee

うーん、それは正しいので、とにかくそこにありますか?
ラーフルパティル

また、ユーザーはコンパイルする必要がなく、簡単にコピーしてcp /bin/mkdir mkdir2使用できます:(
Rahul Patil

ディレクトリの作成は非常に一般的/基本的なタスクであるため、複数の方法があり、それらをすべてブロックすることはほとんど不可能です(ユーザーにファイルを作成させないこと、つまり、すべてのディレクトリを書き込み禁止にすることを除く)。たとえば、cp -r /usr/local/lib gggという名前のディレクトリを作成しますggg(のコンテンツのコピーが含まれている/usr/local/lib場合、ユーザーはそのコピーを削除できます)。を使用find / -type d -emptyして、コピーする空のディレクトリを見つけることができます。
G-Manは「Reinstate Monica」と言う

回答:


21

bashでそれを行う方法はわかりませんが、ユーザー環境を制限する別のシェルlshell(制限付きシェル)を知っています。

構成の簡単な概要

LshellはINIファイルを介して構成されます。デフォルトでは、許可されたコマンドのホワイトリストを保持しますが、ユーザーが特定のコマンドを使用できないように簡単に構成できます。

この設定(デフォルトのconf /etc/lshell.conf)は、ユーザーfooによる使用を禁止しますmkdir

[foo]
allowed = 'all' - ['mkdir', 'bash', 'sh', 'csh', 'dash', 'env']

デフォルトでlshellを使用するようにユーザーアカウントを構成するには、以下を行う必要があります。

 chsh -s /usr/bin/lshell foo

Lshellは次のようなことができます。

  • 粒度の3つのレベル:ユーザー、グループ、すべて。
  • システム内の特定のパスへのアクセスを制限できます。
  • 特定の文字(など|)の使用を制限できます。
  • SSHでのみ特定のコマンドの使用を制限できます。

もっと。

更新1#追加されたテスト結果:

rahul:~$ which bash
/bin/bash
rahul:~$ dd if=$(which bash) of=my_bash
*** forbidden syntax: dd if=$(which bash) of=my_bash
rahul:~$ bash
*** forbidden command: bash
rahul:~$ cp /bin/bash my_bash
*** forbidden path: /bin/bash
rahul:~$ /bin/bash
*** forbidden command: /bin/bash
rahul:~$ sh
*** forbidden command: sh
rahul:~$ dash
*** forbidden command: dash
rahul:~$ env bash
*** forbidden command: env
rahul:~$ cp /bin/mkdir mycreatedir
*** forbidden path: /bin/mkdir

3
allowed = 'all' - ['mkdir']、あなたはただ実行してbash、再び制限されないでしょうか?
-dawud

3
ただつまらない、申し訳ありませんが、そのリストによって課される制限を回避する方法はまだたくさんありますdd if=$(which bash) of=my_bash && chmod u+x my_bash && ./my_bash。問題は制限的なデフォルトポリシーがないことだと思います。つまり、このシナリオではデフォルトでパーミッションを付与し、次にリストに基づいてパーミッションを拒否します。 。
-dawud

1
@dawud:許可されたコマンドのホワイトリストを維持することは、ブラックリストを作成し、ユーザーが管理者を巧みに避けてそれを回避しないことを望んでいるよりも良いアプローチであることに同意します。
rahmu

2
@Marco、私の答えにある例を確認してください。許可されたコマンドのホワイトリストを提供します。このシナリオでは、ユーザーはcp自分のPATH(ユーザーのroot所有ディレクトリrx)にバイナリを追加することはできずrbash、実行を禁止し./executablesます。それはあなたの質問に答えますか?
-dawud

2
@dawud確かにそうです。読み取り専用のbinディレクトリが見つかりませんでした。
マルコ

15

通常、この種の制限を実装するには、いくつかの条件を満たしている必要があります。そうでない場合、制限を簡単に回避できます。

  • ユーザーはwheelグループに所属せず、使用が許可されている唯一のグループですsu(PAMを介して強制されます)。
  • ユーザーにはrbash、privateを指す読み取り専用PATHで適切に保護されています~/bin。この~/bin/ディレクトリには、単純なユーティリティへのリンクが含まれています。

    $ ll ~/bin
    total 0
    lrwxrwxrwx. 1 root dawud 14 Sep 17 08:58 clear -> /usr/bin/clear*
    lrwxrwxrwx. 1 root dawud  7 Sep 17 08:58 df -> /bin/df*
    lrwxrwxrwx. 1 root dawud 10 Sep 17 08:58 egrep -> /bin/egrep*
    lrwxrwxrwx. 1 root dawud  8 Sep 17 08:58 env -> /bin/env*
    lrwxrwxrwx. 1 root dawud 10 Sep 17 08:58 fgrep -> /bin/fgrep*
    lrwxrwxrwx. 1 root dawud  9 Sep 17 08:58 grep -> /bin/grep*
    lrwxrwxrwx. 1 root dawud 10 Sep 17 08:58 rview -> /bin/rview*
    lrwxrwxrwx. 1 root dawud 13 Sep 17 08:58 rvim -> /usr/bin/rvim*
    lrwxrwxrwx. 1 root dawud 13 Sep 17 08:58 sudo -> /usr/bin/sudo*
    lrwxrwxrwx. 1 root dawud 17 Sep 17 08:58 sudoedit -> /usr/bin/sudoedit*
    lrwxrwxrwx. 1 root dawud 13 Sep 17 08:58 tail -> /usr/bin/tail*
    lrwxrwxrwx. 1 root dawud 11 Sep 17 08:58 wc -> /usr/bin/wc*
    
  • ユーザーが制限され、読み取り専用の環境を与えられている(のようなものを考えるLESSSECURETMOUTHISTFILE変数)。

  • ユーザーはSELinuxユーザーにマップされ、staff_uを介して必要に応じて他のユーザーとしてコマンドを実行する権限が与えられますsudo
  • ユーザーの/home/tmpおよび場合によって/var/tmpはpolyinstantiated /etc/security/namespace.conf

    /tmp       /tmp/.inst/tmp.inst-$USER-     tmpdir:create   root
    /var/tmp   /tmp/.inst/var-tmp.inst-$USER- tmpdir:create   root
    $HOME      $HOME/$USER.inst/              tmpdir:create   root
    

    また、/etc/security/namespace.initユーザーのすべての骨格ファイルを読み取り専用にし、が所有しrootます。

この方法で、自分の代わりに(上記で説明したように、を介してプロビジョニングされたプライベートディレクトリのリンクを介して)、他のユーザーの代わりに(を介して)実行するか、まったく$USER実行mkdirしないかを選択できます。~/bin/etc/skelsudo


4

、ダミーのグループを追加し、そのグループにユーザーを追加しchown root:somegroup /bin/mkdirchmod g-x /bin/mkdir。これは、ユーザーがグループを変更できないことに依存していることに注意してください。IIRCこれは、GNU / Linuxには当てはまりますが、他のいくつかのUnicesには当てはまりません。


2
ほとんどのファイルシステムでは、拡張ACLを使用してきめ細かな制御を行うこともできます-必要なグループの数は、名前の問題は言うまでもなく、ユーザーの数に応じて指数関数的に増加します(可能な組み合わせのため)。
ペテルフ

2
さらにポイントを追加し、他のユーザーから読み取り許可を削除します710、ユーザーはそのバイナリをコピーして名前を変更できませんでしたか?
ラーフルパティル

1
@RahulPatilはい、もちろん、コンパイラの使用も制限する必要があります。
ペテルフ

1

私がテストした中で最高ののは、Profile.dを最高かつ安全な方法で使用することです

ステップ#1(エイリアスファイルを作成する)

[root@newrbe ~]# vim /etc/customalias.sh

以下の行を追加:

alias rm="echo remove contenet is restricted"
alias poweroff="echo Poweroff is restricted"
alias chmod="echo Change Permission is restristed"

保存して終了

ステップ#2(プロファイルローダーの作成)

/etc/profile.d/この場所には、bash完了のためのファイルが含まれています

[root@newrbe ~]# vim /etc/profile.d/customsource.sh

これらの行が以下のユーザーのために言及されたコマンドをブロックするファイルの下に以下の行を追加します

if [ `whoami` == "user1" ] && [ `whoami` == "user2" ]; then
    source /etc/customalias.sh
fi

保存して終了

終了して再ログイン

よろしく、-Mansur


/etc/profile.d/以下のためではありませんbash完了ところ、それは一般的ではありませんので、それは、どこの場所のログインセッションのカスタマイゼーションへのログインシェルのようなPOSIXを、使用しているユーザーのためだbash(というに行くだろう別名カスタマイゼーションは/etc/bash.bashrc、とても一般的に()行くだろうと、それはPOSIXシェルの構文を持つべきである.代わりに、のsource=代わりに==)。
ステファンシャゼラス

-1

sudoersをインストールし、そこでユーザーとコマンドを設定します。


4
SXへようこそ。回答に詳細を追加してください。OP、または将来この質問を読んでいる他の人は、気づかないかもしれませんsudo
ジョセフR.

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