web-dev-qa-db-ja.com

ユーザーに1つのディレクトリのみへの読み取り/書き込みアクセス権を与える

サーバーを実行していて、特定のディレクトリへの読み取り/書き込みアクセス権を単一のユーザーに与える必要があります。私は以下を試しました:

Sudo adduser abcd
Sudo groupadd abcdefg
chown -R .abcdefg /var/www/allowfolder
chmod -R g+rw /var/www/allowfolder
usermod -a -G comments abcd

上記は機能しているように見えますが、サーバーの他の部分への読み取り専用アクセスをユーザーに与えます。

ユーザーが特定のフォルダのみを読み書きできるようにアクセス許可を設定するにはどうすればよいですか?また、ユーザーはmysqlのようなプログラムを実行できる必要があります。

19
Manishearth

否定ACL

アクセス制御リスト を設定することで、ユーザーがファイルシステムの特定の部分にアクセスできないようにすることができます。たとえば、ユーザーabcd/homeの下のファイルにアクセスできないようにするには:

setfacl -m user:abcd:0 /home

このアプローチは簡単ですが、abcdにアクセスさせたくないものすべてへのアクセスをブロックすることを忘れないでください。

Chroot

abcdが表示できるものを確実に制御するには、 chroot を設定します。つまり、ユーザーをファイルシステムのサブツリーに制限します。

ユーザーが必要とするすべてのファイル(たとえば、mysqlとそのすべての依存関係、ユーザーがmysqlを実行できるようにする場合)をchrootの下に作成する必要があります。 chrootへのパスが/home/restricted/abcdだとします。 mysqlプログラムは/home/restricted/abcdで使用できる必要があります。シンボリックリンクのルックアップはchroot jailの影響を受けるため、chrootの外部を指すシンボリックリンクは適切ではありません。 Linuxでは、バインドマウントをうまく利用できます。

mount --rbind /bin /home/restricted/abcd/bin
mount --rbind /dev /home/restricted/abcd/dev
mount --rbind /etc /home/restricted/abcd/dev
mount --rbind /lib /home/restricted/abcd/lib
mount --rbind /proc /home/restricted/abcd/proc
mount --rbind /sbin /home/restricted/abcd/sbin
mount --rbind /sys /home/restricted/abcd/sys
mount --rbind /usr /home/restricted/abcd/usr

ファイルをコピーすることもできます(ただし、ファイルが最新であることを確認する必要があります)。

ユーザーをchrootに制限するには、ChrootDirectoryディレクティブを /etc/sshd_config に追加します。

Match User abcd
    ChrootDirectory /home/restricted/abcd

次のコードでテストできます:chroot --userspec=abcd /home/restricted/abcd/ /bin/bash

セキュリティフレームワーク

SELinuxやAppArmorなどのセキュリティフレームワークを使用することもできます。どちらの場合も、穴を残さないようにするために、かなりデリケートな構成を作成する必要があります。

chrootを使用する必要があります。 chrootコマンドは、すべての子プロセスが見るルートディレクトリを変更します。それがどのように機能するかを示すために例を挙げます。

これはその場で書かれました。現在、私は実際にはUNIXマシンの前にはいません。この例では、dirという名前のディレクトリがあり、abclsの3つのファイルがあります。最初の3つは通常のファイルです。 lsは、実際のlsバイナリへのハードリンクであるため、chrootでファイルを一覧表示できます。

chrootdirに入れます。 (ルートディレクトリ内のいくつかのディレクトリを忘れていることに注意してください。)

シェルの出力形式での設定は次のとおりです。

$ pwd
/home/alex/test
$ l
dir
$ ls dir
a b c ls
$ ./ls dir # does the same thing
a b c ls
$ ls /
bin boot dev etc home mnt media proc sbin sys usr var

次に、chrootdirに入れます。 /bin/bash引数は、新しいルートディレクトリで実行するプロセスを選択します。デフォルトは/bin/sh

$ chroot /bin/bash dir
$ # this Prompt is now from a subprocess running in the new root directory
$ PATH=/ ls
a b c ls
$ pwd
/

ここで、chrootを終了します。

$ exit
$ # this Prompt is now from the original bash process, from before the chroot
$ pwd
/home/alex/test

これがchrootコマンドの動作を説明しているといいのですが。基本的に、問題を解決するために必要なことは、ログインするたびにそのユーザーとしてchrootコマンドを実行することです。たぶん、起動スクリプトに入れますか?

他の方法でファイルにアクセスできない場合でも、ファイルへのハードリンクはchroot内で機能し続けます(これは、ハードリンクがパスではなくiノードを指すため機能します)。したがって、ユーザーがアクセスできるようにするには、 mysqlコマンドでは、次のコマンドを実行します。

ln /usr/bin/mysql /path/to/chroot/target
5
strugee